Compare commits
No commits in common. "main" and "v1.0.3" have entirely different histories.
5 changed files with 8 additions and 42 deletions
|
|
@ -9,8 +9,7 @@ AI assistant plugin for [DankMaterialShell](https://github.com/AvengeMedia/DankM
|
||||||
|-|-|-|
|
|-|-|-|
|
||||||
| |  | 
|
| |  | 
|
||||||
|
|
||||||
## Usage
|
|
||||||
- Toggle the plugin: `dms ipc call plugins toggle nexusAi`
|
|
||||||
## Features
|
## Features
|
||||||
- **Multi-Provider Ready:** Connect to standard cloud APIs or local providers.
|
- **Multi-Provider Ready:** Connect to standard cloud APIs or local providers.
|
||||||
- **Vision Support:** Models with vision can be used with image attachments, even from clipboard
|
- **Vision Support:** Models with vision can be used with image attachments, even from clipboard
|
||||||
|
|
@ -20,6 +19,7 @@ AI assistant plugin for [DankMaterialShell](https://github.com/AvengeMedia/DankM
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
- `curl`
|
- `curl`
|
||||||
|
- `wl-copy`
|
||||||
- That's it, you probably already have them
|
- That's it, you probably already have them
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
{
|
{
|
||||||
"id": "nexusAi",
|
"id": "nexusAI",
|
||||||
"name": "Nexus AI",
|
"name": "Nexus AI",
|
||||||
"description": "AI assistant, made to be useful",
|
"description": "AI assistant, made to be useful",
|
||||||
"version": "1.0.7",
|
"version": "1.0.0",
|
||||||
"author": "myNicole98",
|
"author": "myNicole98",
|
||||||
"type": "daemon",
|
"type": "daemon",
|
||||||
"capabilities": ["slideout"],
|
"capabilities": ["slideout"],
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,10 @@ Item {
|
||||||
+ (dark ? "dark" : "light") + "/" + stem + ".svg").toString()
|
+ (dark ? "dark" : "light") + "/" + stem + ".svg").toString()
|
||||||
: ""
|
: ""
|
||||||
readonly property string _alt: stem.length > 0
|
readonly property string _alt: stem.length > 0
|
||||||
&& primaryImg.status === Image.Error
|
|
||||||
? Qt.resolvedUrl("../../resources/icons/"
|
? Qt.resolvedUrl("../../resources/icons/"
|
||||||
+ (dark ? "light" : "dark") + "/" + stem + ".svg").toString()
|
+ (dark ? "light" : "dark") + "/" + stem + ".svg").toString()
|
||||||
: ""
|
: ""
|
||||||
readonly property string _model: stem.length > 0
|
readonly property string _model: stem.length > 0
|
||||||
&& primaryImg.status === Image.Error
|
|
||||||
&& altImg.status === Image.Error
|
|
||||||
? Qt.resolvedUrl("../../resources/icons/models/" + stem + ".svg").toString()
|
? Qt.resolvedUrl("../../resources/icons/models/" + stem + ".svg").toString()
|
||||||
: ""
|
: ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -714,7 +714,7 @@ Rectangle {
|
||||||
visible: isUser && bubble.content.length > 0
|
visible: isUser && bubble.content.length > 0
|
||||||
iconName: "content_copy"
|
iconName: "content_copy"
|
||||||
onClicked: Quickshell.execDetached(
|
onClicked: Quickshell.execDetached(
|
||||||
["dms", "cl", "copy", bubble.content])
|
["wl-copy", "--", bubble.content])
|
||||||
}
|
}
|
||||||
HoverIcon {
|
HoverIcon {
|
||||||
visible: isUser
|
visible: isUser
|
||||||
|
|
@ -735,7 +735,7 @@ Rectangle {
|
||||||
visible: !isUser && bubble.content.length > 0
|
visible: !isUser && bubble.content.length > 0
|
||||||
iconName: "content_copy"
|
iconName: "content_copy"
|
||||||
onClicked: Quickshell.execDetached(
|
onClicked: Quickshell.execDetached(
|
||||||
["dms", "cl", "copy", bubble.content])
|
["wl-copy", "--", bubble.content])
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -869,7 +869,7 @@ Rectangle {
|
||||||
iconName: "content_copy"
|
iconName: "content_copy"
|
||||||
iconColor: Theme.surfaceVariantText
|
iconColor: Theme.surfaceVariantText
|
||||||
onClicked: Quickshell.execDetached(
|
onClicked: Quickshell.execDetached(
|
||||||
["dms", "cl", "copy", codeRect.rawCode])
|
["wl-copy", "--", codeRect.rawCode])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -107,34 +107,6 @@ Rectangle {
|
||||||
return pruned;
|
return pruned;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate a dynamic cache during model search that returns
|
|
||||||
// the same array instead of rebuild the list at every keystroke
|
|
||||||
property var _rowsCache: []
|
|
||||||
function rowsFor(filter) {
|
|
||||||
var rows = buildRows(filter);
|
|
||||||
var old = _rowsCache;
|
|
||||||
if (old.length === rows.length) {
|
|
||||||
var same = true;
|
|
||||||
for (var i = 0; i < rows.length; i++) {
|
|
||||||
var a = old[i], b = rows[i];
|
|
||||||
if (!a || !b
|
|
||||||
|| a.kind !== b.kind
|
|
||||||
|| a.model !== b.model
|
|
||||||
|| a.providerId !== b.providerId
|
|
||||||
|| a.type !== b.type
|
|
||||||
|| a.name !== b.name
|
|
||||||
|| a.pid !== b.pid
|
|
||||||
|| a.collapsed !== b.collapsed) {
|
|
||||||
same = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (same) return old;
|
|
||||||
}
|
|
||||||
_rowsCache = rows;
|
|
||||||
return rows;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Model zone (left): label + chevron. Hover highlights the zone
|
// Model zone (left): label + chevron. Hover highlights the zone
|
||||||
// (not the tune section) and shows the pointing cursor.
|
// (not the tune section) and shows the pointing cursor.
|
||||||
Item {
|
Item {
|
||||||
|
|
@ -280,10 +252,7 @@ Rectangle {
|
||||||
clip: true
|
clip: true
|
||||||
spacing: 2
|
spacing: 2
|
||||||
model: selector.service
|
model: selector.service
|
||||||
? selector.rowsFor(manualEntry.text) : []
|
? selector.buildRows(manualEntry.text) : []
|
||||||
// Recycle delegates on scroll instead of destroying
|
|
||||||
// and recreating them (each row is ~30 objects).
|
|
||||||
reuseItems: true
|
|
||||||
|
|
||||||
delegate: Item {
|
delegate: Item {
|
||||||
id: rowDelegate
|
id: rowDelegate
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue