@ai-ecoverse/slicc-spectrum 1.111.0 → 1.111.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-ui.js +16 -8
- package/dist/slicc-ui.js.map +2 -2
- package/dist/types/app/base.d.ts +1 -0
- package/dist/types/model/types.d.ts +2 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -255,9 +255,9 @@ The chevron only expands and collapses; a click on the row, <kbd>Enter</kbd> or
|
|
|
255
255
|
<kbd>→</kbd> expands a cone and then moves to its first scoop, <kbd>←</kbd> moves from a scoop to its cone and then collapses it, and neither changes the active agent.
|
|
256
256
|
Several cones can be open at once, and they stay open for every view of the panel on the same model, so a layout switch keeps them; when the active agent has changed since the panel last showed it, its cone opens again as the panel mounts, so on a phone a cone you tapped still shows its scoops when you come back to Agents, and a cone you closed stays closed.
|
|
257
257
|
When the active scoop's cone is collapsed, the cone row takes the Tab stop.
|
|
258
|
-
A row's first line starts with
|
|
258
|
+
A row's first line starts with a dot coloured by status, always in the same place, and, when there are unread messages, the unread count beside it (`99+` from a hundred up, at `--swc-font-size-50`, white on the accent fill, or on the negative fill when the cone is in error).
|
|
259
259
|
Then comes the name; the context fill, when it's high, sits in the top right corner.
|
|
260
|
-
Every row has up to two lines, aligned to the top under the name,
|
|
260
|
+
Every row has up to two lines of conversation title, aligned to the top under the name, with no status word, so nothing moves when the status changes; the accessible name and the tooltip say the status and the exact unread count.
|
|
261
261
|
A cone with scoops has a ribbon line below: one segment per scoop, coloured by status at 3:1 or more on every row background, then its scoops in words, naming only the busy ones, as in "2 scoops · 1 waiting" ("2 scoops" when all are idle).
|
|
262
262
|
Its `aria-description` sums up every status, as in "2 scoops: 1 working, 1 idle".
|
|
263
263
|
Rows without scoops or errors have no empty ribbon or error line.
|
|
@@ -298,7 +298,7 @@ While pending, cards leave the log for their own region between the header and t
|
|
|
298
298
|
Clicking a waiting card (not its controls), or <kbd>Enter</kbd> on it, scrolls the log to where it was asked, at the bottom of the view above the composer.
|
|
299
299
|
When a card leaves the region (answered, timed out or decided elsewhere) while it has focus, focus moves to the newest card still waiting, else the composer; a timed-out card goes back to its place in the log.
|
|
300
300
|
Under `prefers-reduced-motion`, nothing animates and the scroll is instant.
|
|
301
|
-
The header is one row: the status, a model picker that names each model's provider and leaves out classifiers and models with `tools: false` (with no model on offer, **Set up a model**, `data-action="set-up-model"`, opens Settings), the thinking picker, the context meter and **New conversation**, which calls `clear` and puts focus back in the composer; on a cone, when the port can freeze, its tooltip says the old conversation stays in the Freezer.
|
|
301
|
+
The header is one row: a dot coloured by status (`data-agent-status`, with the status in its `aria-label` and tooltip, and no word, so the pickers never move; in forced colours it paints `CanvasText`, like the Agents markers), a model picker that names each model's provider and leaves out classifiers and models with `tools: false` (with no model on offer, **Set up a model**, `data-action="set-up-model"`, opens Settings), the thinking picker, the context meter and **New conversation**, which calls `clear` and puts focus back in the composer; on a cone, when the port can freeze, its tooltip says the old conversation stays in the Freezer.
|
|
302
302
|
It never wraps: when it's short of room, the model picker's label is cut with an ellipsis, and under 560px wide (`header[data-compact]`) New conversation is icon-only, with `accessible-label` and its tooltip.
|
|
303
303
|
The pickers re-read `models()` on `settings`, `accounts` and `agents`.
|
|
304
304
|
When a live agent's model, or `Settings.model`, is no longer offered and its provider (the id before `/`) isn't a connected account, it moves to the offered chat model with `default: true`, else the first one; frozen agents are left alone, and so is everything on a follower unless it has Control and is connected.
|
|
@@ -1001,7 +1001,7 @@ The vault's view for SLICC, typed after `@ai-ecoverse/slicc-vault` (spectrum re-
|
|
|
1001
1001
|
Emit `status` and `list` when they change (bios re-lists after the vault's `changed` events), and `availability` when the optional `availability()` (`connecting`, `waiting`, `locked` or `ready`) changes.
|
|
1002
1002
|
`audit(before?, limit?)` resolves with an older `AuditPage` (`before` is a `seq`).
|
|
1003
1003
|
The optional page ops, each hiding its control when missing: `put(name, value, request?)` (a value request's `put` must use its `name`), `cancel(request)`, `remove(name, kind?)`, `restore(name, kind?)`, `import(kind, bytes, { password?, pick? })` (a `pick` stage, then `done`), `export(passphrase)` (the bundle's bytes), `lock()`, `dismissBackupReminder()` and `endpoints({ add?, remove? })`, which registers or takes back the URLs a page-sealed credential may be filled on (each an `EndpointSet`, `{ model?: [{ name, url }], mcp?: [{ server, url }] }`, a model URL bound to one record by name), checks the whole change first (`EINVAL` changes nothing) and rejects with a sentence. Settings registers them itself, never through the agent. `settings(name, kind, settings)` replaces a record's tenant settings as a whole without touching its key (the vault's `put` without a value); `put`'s options take the same `settings` on a first save.
|
|
1004
|
-
They reject with a `VaultFailure`, an `Error` with an `ErrorCode` `code` (`isVaultFailure` from `/ui`).
|
|
1004
|
+
They reject with a `VaultFailure`, an `Error` with an `ErrorCode` `code` (`isVaultFailure` from `/ui`) and an optional `ErrorCause` `cause`, matching slicc-vault 1.22.0’s stable refusal causes; `isPolicyPaused` still identifies only `policy-paused`.
|
|
1005
1005
|
Values go to the vault only through `put`, and never through another port.
|
|
1006
1006
|
`button()` returns a new `VaultButton`, `{ element, post(message), listen(fn) }` returning an unsubscribe: bios wraps the vault's `button.html` frame and its postMessage protocol, and spectrum only sends `ButtonMessage`s and receives `ButtonEvent`s.
|
|
1007
1007
|
The passkey lock (unlock and protect) happens in the vault's own popup, which only a click in that frame can open.
|
package/dist/slicc-ui.js
CHANGED
|
@@ -8605,6 +8605,9 @@ function chatModels(options2) {
|
|
|
8605
8605
|
function statusLight(status2) {
|
|
8606
8606
|
return b`<swc-status-light size="s" variant=${statusVariant[status2]}>${statusLabel[status2]}</swc-status-light>`;
|
|
8607
8607
|
}
|
|
8608
|
+
function statusDot(status2) {
|
|
8609
|
+
return b`<span class="dot" data-agent-status=${status2} data-variant=${statusVariant[status2]} role="img" aria-label=${statusLabel[status2]} title=${statusLabel[status2]}></span>`;
|
|
8610
|
+
}
|
|
8608
8611
|
var shared = i`
|
|
8609
8612
|
.dot {
|
|
8610
8613
|
display: inline-block;
|
|
@@ -37241,9 +37244,16 @@ var SliccChat = class _SliccChat extends ThemedElement {
|
|
|
37241
37244
|
header swc-action-button {
|
|
37242
37245
|
flex: none;
|
|
37243
37246
|
}
|
|
37244
|
-
header swc-status-light
|
|
37247
|
+
header swc-status-light,
|
|
37248
|
+
header .dot {
|
|
37245
37249
|
align-self: center;
|
|
37246
37250
|
}
|
|
37251
|
+
@media (forced-colors: active) {
|
|
37252
|
+
header .dot[data-agent-status] {
|
|
37253
|
+
forced-color-adjust: none;
|
|
37254
|
+
background: CanvasText;
|
|
37255
|
+
}
|
|
37256
|
+
}
|
|
37247
37257
|
header swc-meter {
|
|
37248
37258
|
flex: 0 1 calc(var(--swc-spacing-400) * 6);
|
|
37249
37259
|
min-width: calc(var(--swc-spacing-400) * 4.5);
|
|
@@ -37968,12 +37978,12 @@ var SliccChat = class _SliccChat extends ThemedElement {
|
|
|
37968
37978
|
}
|
|
37969
37979
|
if (watchOnly(model)) {
|
|
37970
37980
|
const label = model.settings.models().find((option) => option.id === agent.model)?.label;
|
|
37971
|
-
return b`${
|
|
37981
|
+
return b`${statusDot(agent.status)}
|
|
37972
37982
|
<span class="model" data-model>${label ?? agent.model}</span>
|
|
37973
37983
|
${meter}`;
|
|
37974
37984
|
}
|
|
37975
37985
|
const offered = chatModels(model.settings.models());
|
|
37976
|
-
return b`${
|
|
37986
|
+
return b`${statusDot(agent.status)}
|
|
37977
37987
|
${offered.length ? b`<sp-picker size="s" quiet label="Model" value=${agent.model} @change=${(event2) => model.agent.setModel(agent.id, event2.target.value)} @sp-opened=${this.#modelFilter.opened} @sp-closed=${this.#modelFilter.closed} @keydown=${this.#modelFilter.keys}>
|
|
37978
37988
|
${this.#modelFilter.items(offered)}
|
|
37979
37989
|
</sp-picker>` : b`<swc-action-button size="s" quiet data-action="set-up-model" @click=${() => this.#action("settings")}>Set up a model</swc-action-button>`}
|
|
@@ -40512,9 +40522,6 @@ var SliccAgents = class extends ModelElement {
|
|
|
40512
40522
|
font-size: var(--swc-font-size-75);
|
|
40513
40523
|
color: var(--swc-neutral-subdued-content-color-default);
|
|
40514
40524
|
}
|
|
40515
|
-
.state {
|
|
40516
|
-
color: var(--swc-neutral-content-color-default);
|
|
40517
|
-
}
|
|
40518
40525
|
.ribbon {
|
|
40519
40526
|
grid-area: ribbon;
|
|
40520
40527
|
display: flex;
|
|
@@ -40840,11 +40847,12 @@ var SliccAgents = class extends ModelElement {
|
|
|
40840
40847
|
>
|
|
40841
40848
|
${this.#disclosure(agent, scoops, open)}
|
|
40842
40849
|
<div class="head">
|
|
40843
|
-
|
|
40850
|
+
<span class="marker status" data-status=${agent.status} aria-hidden="true"></span>
|
|
40851
|
+
${unread ? b`<span class="marker unread" data-status=${agent.status} aria-hidden="true">${unreadCount(unread)}</span>` : A}
|
|
40844
40852
|
<span class="name">${agent.name}</span>
|
|
40845
40853
|
</div>
|
|
40846
40854
|
${fillShown(agent.contextFill) ? b`<span class="fill" data-variant=${meterVariant2(agent.contextFill)}>${percent(agent.contextFill)}</span>` : A}
|
|
40847
|
-
<span class="title"
|
|
40855
|
+
<span class="title">${title2 || untitled}</span>
|
|
40848
40856
|
${this.#ribbon(scoops)}
|
|
40849
40857
|
${this.#dropButton(agent, selected)}
|
|
40850
40858
|
${this.#deleteButton(agent, selected)}
|