@ai-ecoverse/slicc-spectrum 1.12.0 → 1.14.0
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 +7 -1
- package/dist/slicc-dummy.js +124 -4
- package/dist/slicc-dummy.js.map +4 -4
- package/dist/slicc-ui.js +364 -55
- package/dist/slicc-ui.js.map +4 -4
- package/dist/types/app/messages.d.ts +2 -2
- package/dist/types/app/updates.d.ts +31 -0
- package/dist/types/dummy/index.d.ts +6 -1
- package/dist/types/dummy/updates.d.ts +15 -0
- package/dist/types/dummy.d.ts +3 -1
- package/dist/types/model/types.d.ts +33 -0
- package/dist/types/ui.d.ts +2 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -134,7 +134,7 @@ Text is Adobe Clean and code Spectrum's Source Code Pro. Source Code Pro (OFL) i
|
|
|
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; 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. 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), standalone tool results, system messages (compaction markers, error cards, notices) and licks, SLICC's events into a cone, on every channel. 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`, `/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. |
|
|
140
140
|
| `<slicc-file-view>` | One file (`path`), highlighted, with its pending change and a link to the diff. |
|
|
@@ -143,6 +143,7 @@ Text is Adobe Clean and code Spectrum's Source Code Pro. Source Code Pro (OFL) i
|
|
|
143
143
|
| `<slicc-terminals>` | Terminal sessions in tabs, each a `<slicc-terminal>` on the session's `TerminalBackend`. Sessions stay alive while hidden; `exit` closes the tab. |
|
|
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
|
+
| `<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. |
|
|
146
147
|
| `<slicc-memory>` | What agents remember, globally or per cone, grouped by section: search, filter by tag, expand, edit, add and forget. |
|
|
147
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). |
|
|
148
149
|
| `<slicc-freezer>` | Frozen cones, archived with their scoops: thaw to bring one back, delete, or freeze the active cone (also `/freeze`). |
|
|
@@ -171,6 +172,11 @@ Keys: <kbd>Alt</kbd>+<kbd>1</kbd>… opens and focuses a panel, <kbd>F6</kbd> an
|
|
|
171
172
|
| `monitor` | all of them | A snapshot of vitals, alerts and sections, re-emitted as the system changes, and `resync`. |
|
|
172
173
|
| `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. |
|
|
173
174
|
| `tray` | the tray protocol | Connection, role, float kind, followers, spend and budget; `reconnect` and `disconnect`. |
|
|
175
|
+
| `updates` (optional) | BIOS installers | `list()` returns `UpdateItem` rows for BIOS, kernel, agent, grammars, global pnpm packages, skills and UI. `ready()` explicitly reports agent readiness, independently of agent activity. Emit `items` whenever rows or readiness change. `act(id, action)` resolves when dispatched or rejects with a displayed error; actions are `retry`, `update-now`, `restart-agent` and `reload`. Missing ports preserve existing adapters and report disconnected information in the panel. Real installer wiring belongs to ai-ecoverse/slicc-bios#70. |
|
|
176
|
+
|
|
177
|
+
The dummy supports `createDummyModel({ updates: 'boot' | 'current' | 'available' | 'restart' | 'failure' })`, also selectable with `?updates=` on `/ui/`. Fixtures stay stable for inspection; `model.updates.setScenario('current')` completes boot. Dummy Update now and Retry simulate download and link progress; Restart agent and Reload only change fixture state, never restart a real process or reload the browser. `updateFixtures` and `DummyUpdates` are exported from `/dummy`.
|
|
178
|
+
|
|
179
|
+
On phones the tray uses a compact indicator (its full status remains available on activation), the agent picker shrinks to fit, and the bottom rail scrolls when needed. The update status comes first so progress and failures remain reachable on narrow screens.
|
|
174
180
|
|
|
175
181
|
### Kernel model
|
|
176
182
|
|
package/dist/slicc-dummy.js
CHANGED
|
@@ -3077,7 +3077,8 @@ var conversations = {
|
|
|
3077
3077
|
input: "/workspace/harbor/src/lib/cache.ts",
|
|
3078
3078
|
output: "Replaced 1 block (4 lines \u2192 7 lines), added dayOf()",
|
|
3079
3079
|
status: "done",
|
|
3080
|
-
paths: ["/workspace/harbor/src/lib/cache.ts"]
|
|
3080
|
+
paths: ["/workspace/harbor/src/lib/cache.ts"],
|
|
3081
|
+
diff: { before: cacheBefore, after: cacheAfter }
|
|
3081
3082
|
}
|
|
3082
3083
|
},
|
|
3083
3084
|
{
|
|
@@ -3087,6 +3088,7 @@ var conversations = {
|
|
|
3087
3088
|
name: "bash",
|
|
3088
3089
|
title: "Run the tests",
|
|
3089
3090
|
input: "npm test",
|
|
3091
|
+
meta: "timeout 120s",
|
|
3090
3092
|
output: "> harbor@0.0.0 test\n> node --test test/\n\n\u2714 converts both ways (0.6ms)\n\u2714 expires entries from the previous day (0.4ms)\n\u2139 tests 2\n\u2139 pass 2\n\u2139 fail 0",
|
|
3091
3093
|
status: "done",
|
|
3092
3094
|
paths: []
|
|
@@ -3721,8 +3723,123 @@ var DummyTray = class extends Emitter {
|
|
|
3721
3723
|
}
|
|
3722
3724
|
};
|
|
3723
3725
|
|
|
3726
|
+
// src/dummy/updates.ts
|
|
3727
|
+
var checkedAt = Date.UTC(2026, 9, 8, 8, 42);
|
|
3728
|
+
function updateFixtures(scenario) {
|
|
3729
|
+
const components = [
|
|
3730
|
+
["bios", "BIOS packages", "0.8.2"],
|
|
3731
|
+
["kernel", "Kernel", "1.12.0"],
|
|
3732
|
+
["agent", "Agent (/opt/agent)", "0.24.0"],
|
|
3733
|
+
["grammars", "Syntax grammars", "4.5.0"],
|
|
3734
|
+
["global", "Global pnpm packages", "2.3.0"],
|
|
3735
|
+
["skills", "Skills", "1.6.0"]
|
|
3736
|
+
];
|
|
3737
|
+
const items = components.map(([kind, label, version]) => ({
|
|
3738
|
+
id: kind,
|
|
3739
|
+
label,
|
|
3740
|
+
kind,
|
|
3741
|
+
state: "current",
|
|
3742
|
+
progress: null,
|
|
3743
|
+
from: version,
|
|
3744
|
+
to: version,
|
|
3745
|
+
checkedAt,
|
|
3746
|
+
error: null,
|
|
3747
|
+
actions: []
|
|
3748
|
+
}));
|
|
3749
|
+
const agent = items[2];
|
|
3750
|
+
if (scenario === "boot") {
|
|
3751
|
+
Object.assign(agent, {
|
|
3752
|
+
state: "downloading",
|
|
3753
|
+
from: null,
|
|
3754
|
+
progress: { phase: "download", done: 63, total: 95 },
|
|
3755
|
+
log: "Packages: +95\nProgress: resolved 95, reused 0, downloaded 63, added 0\nDownloading @slicc/demo-agent..."
|
|
3756
|
+
});
|
|
3757
|
+
Object.assign(items[3], {
|
|
3758
|
+
state: "linking",
|
|
3759
|
+
progress: { phase: "link", done: 12, total: 15 },
|
|
3760
|
+
log: "Linking syntax grammars\nProgress: linked 12 of 15"
|
|
3761
|
+
});
|
|
3762
|
+
items[4].state = "checking";
|
|
3763
|
+
} else if (scenario === "available" || scenario === "restart") {
|
|
3764
|
+
Object.assign(agent, {
|
|
3765
|
+
state: scenario === "available" ? "available" : "ready",
|
|
3766
|
+
to: "0.25.0",
|
|
3767
|
+
actions: [scenario === "available" ? "update-now" : "restart-agent"],
|
|
3768
|
+
log: scenario === "restart" ? "Packages: +95\nProgress: resolved 95, downloaded 95, added 95\nDone in 48.2s" : void 0
|
|
3769
|
+
});
|
|
3770
|
+
Object.assign(items[1], { state: "ready", to: "1.13.0", actions: ["reload"] });
|
|
3771
|
+
} else if (scenario === "failure") {
|
|
3772
|
+
Object.assign(items[4], {
|
|
3773
|
+
state: "failed",
|
|
3774
|
+
to: "2.4.0",
|
|
3775
|
+
error: "The package registry did not respond. Installed commands are still available.",
|
|
3776
|
+
actions: ["retry"],
|
|
3777
|
+
log: "pnpm add -g @harbor/demo-cli@2.4.0\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms"
|
|
3778
|
+
});
|
|
3779
|
+
}
|
|
3780
|
+
return items;
|
|
3781
|
+
}
|
|
3782
|
+
var DummyUpdates = class extends Emitter {
|
|
3783
|
+
#items;
|
|
3784
|
+
#ready;
|
|
3785
|
+
#clock;
|
|
3786
|
+
constructor(scenario, clock2) {
|
|
3787
|
+
super();
|
|
3788
|
+
this.#items = updateFixtures(scenario);
|
|
3789
|
+
this.#ready = scenario !== "boot";
|
|
3790
|
+
this.#clock = clock2;
|
|
3791
|
+
}
|
|
3792
|
+
list() {
|
|
3793
|
+
return this.#items;
|
|
3794
|
+
}
|
|
3795
|
+
ready() {
|
|
3796
|
+
return this.#ready;
|
|
3797
|
+
}
|
|
3798
|
+
setScenario(scenario) {
|
|
3799
|
+
this.#items = updateFixtures(scenario);
|
|
3800
|
+
this.#ready = scenario !== "boot";
|
|
3801
|
+
this.emit("items", this.#items);
|
|
3802
|
+
}
|
|
3803
|
+
#patch(id, patch) {
|
|
3804
|
+
this.#items = this.#items.map((item) => item.id === id ? { ...item, ...patch } : item);
|
|
3805
|
+
this.emit("items", this.#items);
|
|
3806
|
+
}
|
|
3807
|
+
async act(id, action) {
|
|
3808
|
+
const item = this.#items.find((candidate) => candidate.id === id);
|
|
3809
|
+
if (!item?.actions.includes(action)) throw new Error(`Update action unavailable: ${id}`);
|
|
3810
|
+
if (action === "update-now" || action === "retry") {
|
|
3811
|
+
this.#patch(id, {
|
|
3812
|
+
state: "downloading",
|
|
3813
|
+
progress: { phase: "download", done: 0, total: 95 },
|
|
3814
|
+
error: null,
|
|
3815
|
+
actions: [],
|
|
3816
|
+
log: "Packages: +95\nProgress: resolved 95, downloaded 0, added 0"
|
|
3817
|
+
});
|
|
3818
|
+
await this.#clock.sleep(4);
|
|
3819
|
+
this.#patch(id, {
|
|
3820
|
+
state: "linking",
|
|
3821
|
+
progress: { phase: "link", done: 95, total: 95 },
|
|
3822
|
+
log: "Packages: +95\nProgress: resolved 95, downloaded 95, added 95"
|
|
3823
|
+
});
|
|
3824
|
+
await this.#clock.sleep(2);
|
|
3825
|
+
}
|
|
3826
|
+
const apply = action === "update-now" && ["agent", "bios", "kernel", "ui"].includes(item.kind);
|
|
3827
|
+
this.#patch(id, {
|
|
3828
|
+
state: apply ? "ready" : "installed",
|
|
3829
|
+
from: apply ? item.from : item.to,
|
|
3830
|
+
progress: null,
|
|
3831
|
+
checkedAt,
|
|
3832
|
+
actions: apply ? [item.kind === "agent" ? "restart-agent" : "reload"] : []
|
|
3833
|
+
});
|
|
3834
|
+
}
|
|
3835
|
+
};
|
|
3836
|
+
|
|
3724
3837
|
// src/dummy/index.ts
|
|
3725
|
-
function createDummyModel({
|
|
3838
|
+
function createDummyModel({
|
|
3839
|
+
delay = 30,
|
|
3840
|
+
storage = null,
|
|
3841
|
+
updates = "current"
|
|
3842
|
+
} = {}) {
|
|
3726
3843
|
const time = clock(delay);
|
|
3727
3844
|
const files3 = new DummyFiles(files2, directories, pending, time);
|
|
3728
3845
|
const browser = new DummyBrowser(tabs, time);
|
|
@@ -3748,11 +3865,14 @@ function createDummyModel({ delay = 30, storage = null } = {}) {
|
|
|
3748
3865
|
),
|
|
3749
3866
|
memory: new DummyMemory(memories),
|
|
3750
3867
|
sprinkles: new DummySprinkles(sprinkles, agent),
|
|
3751
|
-
tray: new DummyTray(tray, time)
|
|
3868
|
+
tray: new DummyTray(tray, time),
|
|
3869
|
+
updates: new DummyUpdates(updates, time)
|
|
3752
3870
|
};
|
|
3753
3871
|
return { ...base, monitor: new DummyMonitor(base) };
|
|
3754
3872
|
}
|
|
3755
3873
|
export {
|
|
3756
|
-
|
|
3874
|
+
DummyUpdates,
|
|
3875
|
+
createDummyModel,
|
|
3876
|
+
updateFixtures
|
|
3757
3877
|
};
|
|
3758
3878
|
//# sourceMappingURL=slicc-dummy.js.map
|