@ai-ecoverse/slicc-spectrum 1.27.3 → 1.28.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/slicc-dummy.js +34 -5
- package/dist/slicc-dummy.js.map +2 -2
- package/dist/slicc-ui.js +80 -29
- package/dist/slicc-ui.js.map +3 -3
- package/dist/types/app/chat.d.ts +2 -1
- package/dist/types/app/memory.d.ts +6 -1
- package/dist/types/app/messages.d.ts +1 -0
- package/dist/types/dummy/memory.d.ts +3 -2
- package/dist/types/model/types.d.ts +8 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -134,7 +134,7 @@ Text is Adobe Clean Spectrum VF, falling back to Adobe Clean, and code is Spectr
|
|
|
134
134
|
| `<slicc-app>` | The shell: header with the agent picker, the View menu and the theme switch, rails, a `<slicc-dock>`, and a status bar. Saves the dock layout per screen class to `storage` (default `localStorage`) under `layoutKey`. |
|
|
135
135
|
| `<slicc-dock>` | Generic. [dockview-core](https://dockview.dev/) 8 with a theme mapped to Spectrum tokens, in its own shadow root. Panels come from `factories` (`name → (params) => HTMLElement`). `open`, `close`, `has`, `content`, `focusPanel`, `cycleGroup`, `cycleTab`, `toJSON`, `restore`, `clear`, and the full `api`. Tabs have a context menu (close, close others, float, maximize). Events: `layout-change`, `active-panel-change`, `panel-close`. |
|
|
136
136
|
| `<slicc-agents>` | Cones with their scoops, status, context fill and unread count. Selecting one makes it the active agent. |
|
|
137
|
-
| `<slicc-chat>` | One thread's conversation (its `agent`, or the active agent if unset), by day: user messages (with attachments, tagged as steered or follow-up by `delivered`, or delegated from another cone), assistant messages (Markdown with tables, task lists, quotes, code and images; thinking; tool calls, grouped into a collapsible cluster from three in a row, each with its input (a shell command after `$`), an optional `meta` such as a timeout, and an edit's `diff` shown as a diff view; media galleries with images, video and audio; action cards for tools, pull requests and status; plans and checklists; inline diffs; question prompts; delegations; link previews; errors with a fix-it action; a content-filter stop offers **Drop the last turn**, which rewinds that turn and puts its prompt back into the composer), standalone tool results, system messages (compaction markers, error cards, notices) and licks, SLICC's events into a cone, on every channel; a lick's `severity` (`warn` or `error`) turns its channel badge into a notice or negative one with an alert icon. Permission requests are allowed or denied in place. |
|
|
137
|
+
| `<slicc-chat>` | One thread's conversation (its `agent`, or the active agent if unset), by day: user messages (with attachments, tagged as steered or follow-up by `delivered`, or delegated from another cone), assistant messages (Markdown with tables, task lists, quotes, code and images; thinking; tool calls, grouped into a collapsible cluster from three in a row, each with its input (a shell command after `$`), an optional `meta` such as a timeout, and an edit's `diff` shown as a diff view; media galleries with images, video and audio; action cards for tools, pull requests and status; plans and checklists; inline diffs; question prompts; delegations; link previews; errors with a fix-it action; a content-filter stop offers **Drop the last turn**, which rewinds that turn and puts its prompt back into the composer; when the turns right before it failed too, the button reads **Drop N failed turns** and rewinds to before the first of them, putting the latest prompt back), standalone tool results, system messages (compaction markers, error cards, notices) and licks, SLICC's events into a cone, on every channel; a lick's `severity` (`warn` or `error`) turns its channel badge into a notice or negative one with an alert icon. Permission requests are allowed or denied in place. |
|
|
138
138
|
| `<slicc-composer>` | The message box. <kbd>Enter</kbd> sends, or steers a running reply: the message joins after the current tool round, without interrupting; <kbd>Ctrl</kbd>/<kbd>⌘</kbd>+<kbd>Enter</kbd> queues a follow-up that runs after the reply and can be withdrawn; <kbd>Shift</kbd>+<kbd>Enter</kbd> adds a line; <kbd>Tab</kbd> takes the suggested follow-up; <kbd>↑</kbd>/<kbd>↓</kbd> at the start or end walk this agent's history; <kbd>Esc</kbd> stops. `/` completes commands (`/clear`, `/compact`, `/model`, `/thinking`, `/scoop`, `/stop`, `/freeze` when the port can freeze, `/theme`) and their arguments, `@` mentions agents and files. Attach from the computer, from SLICC's files, a browser screenshot or a shared secret, or paste and drop files (25 MB each). Queued messages wait above it, to send now or drop. Model and thinking pickers, and dictation where the browser has speech recognition. Drafts are kept per agent. |
|
|
139
139
|
| `<slicc-files>` | The file system as a `<slicc-file-tree>`, with pending changes as git status. Opening a file opens it in a tab. With `files.mountFolder`, **Mount a folder…** (`data-action="mount-folder"`) mounts a local folder, then selects and expands it in the tree; with `files.mounts`, a **Mounted** strip lists the mount points, each with **Eject** (`data-action="eject"`, `data-path` the mount point) when the port has `eject`. A failed mount or eject shows its message under the bar. |
|
|
140
140
|
| `<slicc-file-view>` | One file (`path`), highlighted, with its pending change and a link to the diff. |
|
|
@@ -144,7 +144,7 @@ Text is Adobe Clean Spectrum VF, falling back to Adobe Clean, and code is Spectr
|
|
|
144
144
|
| `<slicc-browser>` | Browser tabs with the agent driving each, an address bar, reload, and the active tab's screenshot. |
|
|
145
145
|
| `<slicc-settings>` | Theme, the model and thinking level for new cones, composer and diff preferences, and accounts to connect, reconnect or disconnect. |
|
|
146
146
|
| `<slicc-updates>` | Install / Update: component states, version changes, last checks, download and link counts, action buttons, failures with Retry, and collapsible install logs. Opens at boot until the agent is ready without failures. Background updates stay in the status bar; new failures reopen the panel. Also available through View and the rails. |
|
|
147
|
-
| `<slicc-memory>` | What agents remember,
|
|
147
|
+
| `<slicc-memory>` | What agents remember, per scope (everyone, a cone or a role), grouped by section: search, filter by tag, expand, edit, add and forget. Free text outside an entry shows “From MEMORY.md”. |
|
|
148
148
|
| `<slicc-monitor>` | The live monitor: vitals with sparklines (active agents, spend, budget, fullest context), alerts, and the topology (cones and scoops, terminals, tabs, pending changes, sprinkles, tray followers). |
|
|
149
149
|
| `<slicc-freezer>` | Frozen cones, archived with their scoops: thaw to bring one back, delete, or freeze the active cone (also `/freeze`). |
|
|
150
150
|
| `<slicc-sprinkle>` | A SLICC sprinkle (`.shtml`), as a panel or, with `inline`, as a dip in the chat that grows to fit. A dip has a tab-like handle: drag it into the dock (or onto a rail, or use its open-as-panel button) and it lives on as a sprinkle panel, with a note in the chat where it was; which dips are out is saved in `slicc-ui.dips`. It runs in a sandboxed frame (`allow-scripts` only) with SLICC's sprinkle theme (the `--s2-*` tokens and `.sprinkle-*` classes), the app's fonts, and Lucide icons (`<i data-lucide>`, `LucideIcons.render()`). It talks back through `slicc.lick({ action, data })`, which reaches the owning cone as a `sprinkle` lick, and, when the port has `call`, reads files and keeps state (see [Sprinkle bridge](#sprinkle-bridge)). Panel sprinkles sit at the top of the right rail with their Lucide icon. |
|
|
@@ -194,12 +194,12 @@ Paths are the agent's: `/shared/…` and `/home/…`, nothing else. A refusal or
|
|
|
194
194
|
|
|
195
195
|
| Port | Later backed by | |
|
|
196
196
|
| :--- | :--- | :--- |
|
|
197
|
-
| `agent` | `@ai-ecoverse/slicc-agent` | Cones and scoops, the active agent, conversations, `send` (with attachments, as a send, a steer or a queued follow-up) and `stop`, the queue, suggestions, answers to questions, permission decisions, compaction, clearing, the model per agent and new scoops. The optional `rewind(agentId, messageId)` drops the user turn before that message and everything after it, and resolves with the turn's prompt (text and attachments) for the composer, or `null`. The optional `drop(agentId)` removes a scoop
|
|
197
|
+
| `agent` | `@ai-ecoverse/slicc-agent` | Cones and scoops, the active agent, conversations, `send` (with attachments, as a send, a steer or a queued follow-up) and `stop`, the queue, suggestions, answers to questions, permission decisions, compaction, clearing, the model per agent and new scoops. The optional `rewind(agentId, messageId)` drops the user turn before that message and everything after it, and resolves with the turn's prompt (text and attachments) for the composer, or `null`. The optional `drop(agentId)` removes a scoop: it stops and its working folder is deleted, while its conversation and reports are kept, and `createCone(name)` resolves with a new cone; the dummy rejects a cone name that is taken. `freeze(agentId)` is optional too: without it, `/freeze` and the Freezer's freeze button don't show. Assistant messages stream: the same message is re-emitted as its parts grow and its tool calls go from `running` to `done`. |
|
|
198
198
|
| `files` | slicc-kernel's OPFS | `list`, `read`, `write`, `remove`, and pending changes with their before and after text (`accept`, `revert`). The optional `mountFolder()` asks for a local folder and resolves with its mount point (for example `/mnt/photos`), or `null` when the user cancels; the panel calls it synchronously in the click, so the port can call `showDirectoryPicker()`. The optional `mounts()` lists the mount points, and `eject(path)` unmounts one (the folder stays on disk). The port emits `mounts` and then `files` after every mount and eject, including those made from the shell. |
|
|
199
199
|
| `terminals` | slicc-kernel's terminal API | Terminal sessions; `backend(id)` returns a `TerminalBackend` for `<slicc-terminal>`. |
|
|
200
200
|
| `browser` | `@ai-ecoverse/slicc-cdp` | Tabs, the active tab, `open`, `navigate`, `close`, `screenshot`. |
|
|
201
201
|
| `settings` | local storage | Theme, model, thinking level, composer and diff preferences, the models on offer, and accounts. |
|
|
202
|
-
| `memory` | `@ai-ecoverse/slicc-agent` | Memories with scope, section, tag and body; `save` and `remove`. |
|
|
202
|
+
| `memory` | `@ai-ecoverse/slicc-agent` | Memories with scope, section, tag and body; `save` and `remove`. `source: 'notes'` marks free text the panel shows as an entry titled after its section; saving it makes it an entry. The optional `scopes()` lists the scope picker's choices as `{ id, label, group }`, ungrouped first, then under “Cones” and “Roles”; without it the picker offers “Everyone” (`global`) and each cone. The panel re-reads `scopes()` on `memories` and `agents`, so emit `memories` when the list changes. A scope that disappears falls back to `global`. |
|
|
203
203
|
| `monitor` | all of them | A snapshot of vitals, alerts and sections, re-emitted as the system changes, and `resync`. |
|
|
204
204
|
| `sprinkles` | `@ai-ecoverse/slicc-agent` | Sprinkles (`inline` ones show as dips in the chat, not in the rail) and `send`, which turns a sprinkle's lick into a lick on its cone. The optional `call(id, method, args)` serves the [sprinkle bridge](#sprinkle-bridge) for sprinkle `id`: `readFile` and `exists` (`[path]`) resolve with a string and a boolean, `getState` (`[]`) with the saved value or `null`, and `setState` (`[value]`) once it is saved. The adapter owns path policy and keeps state per sprinkle; `<slicc-sprinkle>` awaits `getState` before it builds a frame, mirrors what the frame saves, and forwards only these four methods from its own frame. The dummy keeps state in memory and maps `/shared/x` to `/home/x` in its files, refusing anything outside `/home`. |
|
|
205
205
|
| `tray` | the tray protocol | Connection, role, float kind, followers, spend and budget; `reconnect` and `disconnect`. |
|
package/dist/slicc-dummy.js
CHANGED
|
@@ -517,13 +517,13 @@ var DummyAgent = class extends Emitter {
|
|
|
517
517
|
const turn = messages.slice(0, at3).findLastIndex((message) => message.role === "user");
|
|
518
518
|
if (turn < 0) return null;
|
|
519
519
|
const user = messages[turn];
|
|
520
|
-
messages.splice(turn);
|
|
520
|
+
const turns = messages.splice(turn).filter((message) => message.role === "user").length;
|
|
521
521
|
messages.push({
|
|
522
522
|
id: `rewound-${Date.now()}`,
|
|
523
523
|
role: "system",
|
|
524
524
|
kind: "notice",
|
|
525
|
-
title: "Rewound 1 turn"
|
|
526
|
-
text: "Its prompt is back in the composer.",
|
|
525
|
+
title: turns === 1 ? "Rewound 1 turn" : `Rewound ${turns} turns`,
|
|
526
|
+
text: turns === 1 ? "Its prompt is back in the composer." : "The latest prompt is back in the composer.",
|
|
527
527
|
createdAt: Date.now()
|
|
528
528
|
});
|
|
529
529
|
this.emit("messages", agentId);
|
|
@@ -1870,6 +1870,26 @@ var memories = [
|
|
|
1870
1870
|
body: "One sentence per change, in the past tense, without ticket numbers.",
|
|
1871
1871
|
tag: "feedback",
|
|
1872
1872
|
updatedAt: now - 7 * day
|
|
1873
|
+
},
|
|
1874
|
+
{
|
|
1875
|
+
id: "mem-9",
|
|
1876
|
+
scope: "role:reviewer",
|
|
1877
|
+
section: "Checks",
|
|
1878
|
+
title: "Read the tests first",
|
|
1879
|
+
body: "Start a review from the tests, then read the change they cover.",
|
|
1880
|
+
tag: "feedback",
|
|
1881
|
+
updatedAt: now - 3 * day,
|
|
1882
|
+
source: "entry"
|
|
1883
|
+
},
|
|
1884
|
+
{
|
|
1885
|
+
id: "mem-10",
|
|
1886
|
+
scope: "role:reviewer",
|
|
1887
|
+
section: "Checks",
|
|
1888
|
+
title: "Checks",
|
|
1889
|
+
body: "Flag any change to cache keys. Ask for a test when a retry count changes.",
|
|
1890
|
+
tag: null,
|
|
1891
|
+
updatedAt: now - 3 * day,
|
|
1892
|
+
source: "notes"
|
|
1873
1893
|
}
|
|
1874
1894
|
];
|
|
1875
1895
|
var sprinkles = [
|
|
@@ -3440,10 +3460,15 @@ var terminals = [
|
|
|
3440
3460
|
// src/dummy/memory.ts
|
|
3441
3461
|
var DummyMemory = class extends Emitter {
|
|
3442
3462
|
#memories;
|
|
3463
|
+
#scopes;
|
|
3443
3464
|
#next = 1;
|
|
3444
|
-
constructor(memories2) {
|
|
3465
|
+
constructor(memories2, scopes = () => [{ id: "global", label: "Everyone" }]) {
|
|
3445
3466
|
super();
|
|
3446
3467
|
this.#memories = memories2.map((memory2) => ({ ...memory2 }));
|
|
3468
|
+
this.#scopes = scopes;
|
|
3469
|
+
}
|
|
3470
|
+
scopes() {
|
|
3471
|
+
return this.#scopes();
|
|
3447
3472
|
}
|
|
3448
3473
|
list() {
|
|
3449
3474
|
return this.#memories.map((memory2) => ({ ...memory2 }));
|
|
@@ -4076,7 +4101,11 @@ function createDummyModel({
|
|
|
4076
4101
|
storage,
|
|
4077
4102
|
time
|
|
4078
4103
|
),
|
|
4079
|
-
memory: new DummyMemory(memories)
|
|
4104
|
+
memory: new DummyMemory(memories, () => [
|
|
4105
|
+
{ id: "global", label: "Everyone" },
|
|
4106
|
+
...agent.list().filter((cone) => cone.kind === "cone").map((cone) => ({ id: cone.id, label: cone.name, group: "cones" })),
|
|
4107
|
+
{ id: "role:reviewer", label: "reviewer", group: "roles" }
|
|
4108
|
+
]),
|
|
4080
4109
|
sprinkles: new DummySprinkles(sprinkles, agent, files3),
|
|
4081
4110
|
tray: new DummyTray(tray, time),
|
|
4082
4111
|
updates: new DummyUpdates(updates, time)
|