@ai-ecoverse/slicc-spectrum 1.86.5 → 1.86.7

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 CHANGED
@@ -228,6 +228,7 @@ The sans stack (`--swc-sans-font-family-stack`, also used by the 1.12 components
228
228
  The shell: header with the agent picker, status items, the update status, the network indicator, the tray, the View menu and the theme switch, rails, and a `<slicc-dock>`.
229
229
  Saves the dock layout per screen class to `storage` (default `localStorage`) under `layoutKey`.
230
230
  The dock builds new panel content whenever it lays panels out again (a switch between phone, tablet and desktop, or a layout reset), so what the user opens in a panel (sections, cones, rows, folders, disclosures) lives outside the element, per model and panel (`view-state.ts`, in memory only): a rebuilt panel shows it again, and a click on the outgoing panel while the new one mounts reaches the new one too.
231
+ Files keeps its selected row, its keyboard focus target (without taking focus) and its scroll the same way, and Agents, Memory, Changes, Monitor, the Browser tab cards, Freezer and Settings keep their scroll; the chat log keeps its own. The scroll comes back once the list has laid out, anchored on the selected row when it was in view and otherwise on the first row in view, at the same distance from the top, so a narrower phone layout keeps those rows in view. A list scrolled to its end, Files included, comes back at its end. Files puts its scroll back even when the tree scrolls its focused row into view on its own. After that, a resize or new content keeps the anchored row where it was. These lists set `overflow-anchor: none` on their scroller, since they anchor it themselves. When the app switches models in place, each panel shows the state it keeps for the new model.
231
232
  While connected it sets `overscroll-behavior` to `none !important` on the page's `html` and `body`, so only scroll areas inside panels rubber-band.
232
233
  It sets the page's `color-scheme` to its resolved theme, and when the page has a `theme-color` meta per `prefers-color-scheme`, gives every one of them the content of the meta for that theme, so the page and the installed app's title bar follow the app's setting instead of the OS.
233
234
  When the last app on the page is removed, the page's own inline values and `theme-color` contents come back.
@@ -481,6 +482,7 @@ A live row offers **Open**, which selects that agent; a stopped one offers **Tha
481
482
  A thawed scoop or agent run keeps its row, which says what it was thawed as.
482
483
  **Delete cone**, in the agents list (or <kbd>Delete</kbd> on a cone's row) and the header's cone picker, stops a cone after a confirmation; `/freeze` does it at once.
483
484
  Either way its conversation stays here, and a row without a `kind` counts as a cone.
485
+ A title longer than two lines ends in an ellipsis and carries its full text as a `title`; the dummy's titles are the whole first line of the first message, so only the card cuts them.
484
486
 
485
487
  #### `<slicc-sprinkle>`
486
488
 
@@ -543,10 +545,13 @@ Not for direct use.
543
545
  #### `<slicc-file-tree>`
544
546
 
545
547
  Generic.
546
- [`@pierre/trees`](https://www.npmjs.com/package/@pierre/trees) through its `web-components` entry: `paths` (folders end in `/`), `gitStatus`, `expanded`, `query` (shows only the paths that match it; empty shows all), `reveal(path, focus)`.
548
+ [`@pierre/trees`](https://www.npmjs.com/package/@pierre/trees) through its `web-components` entry: `paths` (folders end in `/`), `gitStatus`, `expanded`, `query` (shows only the paths that match it; empty shows all), `reveal(path, focus, options)`.
547
549
  `expanded` also opens and closes the folders of a mounted tree, a `tree-expand` event (`detail.expanded`) reports the open folders when the user changes them, and the tree keeps them when it's moved, such as into a floating group.
548
550
  It has no search field of its own.
549
551
  A folder name or flattened folder chain too long for the row ends in an ellipsis instead of losing its middle, and every row carries its full name as a `title`, with its indent and chevron kept.
552
+ A file name too long for the row ends its name in an ellipsis and keeps its extension, as in "tide-summary… md": the library splits the name after the dot, and the browser's ellipsis drops whole letters, so the dot goes with the name and a sliver of space can stay before the extension.
553
+ `@pierre/trees` middle-truncates names by laying an "…" marker over the text, painted with `--trees-bg`; with the transparent background the tree uses here, the letters showed through it, so the tree hides that marker and lets the browser's own `text-overflow: ellipsis` cut the name before the extension.
554
+ A row's focus ring shows only with keyboard focus: the library draws it on the row that holds focus (`data-item-focused`), mouse click or not, so the tree hides it when the row isn't `:focus-visible`, and `focus(options)` passes `focusVisible` down to the row. Under forced colors, where the selection fill drops out, a selected row keeps a `Highlight` outline.
550
555
  Fires `file-open` on click and on <kbd>Enter</kbd>, and `tree-search` (`detail.key`) when a letter or digit is typed in it, for the panel's search field.
551
556
 
552
557
  #### `<slicc-code-view>`
@@ -2807,6 +2807,9 @@ function script(prompt, attachments = []) {
2807
2807
  }
2808
2808
 
2809
2809
  // src/dummy/agent.ts
2810
+ function firstLine(text) {
2811
+ return text.split("\n")[0];
2812
+ }
2810
2813
  var paced = /* @__PURE__ */ new Map([["cone-kitchen", 2e4]]);
2811
2814
  function chunks(text) {
2812
2815
  return text.match(/\S+\s*|\s+/g) ?? [];
@@ -3176,7 +3179,7 @@ var DummyAgent = class extends Emitter {
3176
3179
  id,
3177
3180
  kind: "cone",
3178
3181
  name: agent.name,
3179
- title: first?.role === "user" ? first.text.slice(0, 80) : agent.name,
3182
+ title: first?.role === "user" ? firstLine(first.text) : agent.name,
3180
3183
  model: agent.model,
3181
3184
  messages: messages.length,
3182
3185
  frozenAt: Date.now()
@@ -3303,7 +3306,7 @@ var DummyAgent = class extends Emitter {
3303
3306
  kind: agent.kind,
3304
3307
  live: true,
3305
3308
  name: agent.name,
3306
- title: first?.role === "user" ? first.text.slice(0, 80) : agent.name,
3309
+ title: first?.role === "user" ? firstLine(first.text) : agent.name,
3307
3310
  model: agent.model,
3308
3311
  messages: messages.length,
3309
3312
  frozenAt: messages.at(-1)?.createdAt ?? 0
@@ -3324,7 +3327,7 @@ var DummyAgent = class extends Emitter {
3324
3327
  id: agentId,
3325
3328
  kind: "cone",
3326
3329
  name: agent.name,
3327
- title: first?.role === "user" ? first.text.slice(0, 80) : agent.name,
3330
+ title: first?.role === "user" ? firstLine(first.text) : agent.name,
3328
3331
  model: agent.model,
3329
3332
  messages: messages.length,
3330
3333
  frozenAt: Date.now()