@ai-ecoverse/slicc-spectrum 1.54.0 → 1.56.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/dist/slicc-ui.js CHANGED
@@ -13261,7 +13261,8 @@ function sprinkleSurface(sprinkle) {
13261
13261
  tag: "slicc-sprinkle",
13262
13262
  icon: sprinkle.icon,
13263
13263
  side: "right",
13264
- open: []
13264
+ open: [],
13265
+ cone: sprinkle.agentId
13265
13266
  };
13266
13267
  }
13267
13268
  var directions = {
@@ -20884,8 +20885,20 @@ var packageActions = {
20884
20885
  install: "Install",
20885
20886
  update: "Update",
20886
20887
  remove: "Remove",
20887
- retry: "Retry"
20888
+ retry: "Retry",
20889
+ unpin: "Unpin"
20888
20890
  };
20891
+ function packageLight(item2) {
20892
+ if (item2.pin && item2.state === "installed")
20893
+ return ["positive", item2.pin.base === null ? "Added" : "Pinned"];
20894
+ if (item2.pin?.base && item2.state === "removing") return ["info", "Unpinning"];
20895
+ return packageStates[item2.state];
20896
+ }
20897
+ function pinVersion(item2, pin) {
20898
+ const version2 = item2.version ?? pin.range;
20899
+ if (pin.base === null) return [pin.range === version2 ? version2 : `${pin.range} \u2192 ${version2}`];
20900
+ return [version2, pin.base === version2 ? "the version seven ships" : `seven ships ${pin.base}`];
20901
+ }
20889
20902
  var packageRunning = /* @__PURE__ */ new Set(["installing", "updating", "removing"]);
20890
20903
  var list3 = (names) => new Intl.ListFormat("en", { type: "conjunction" }).format(names);
20891
20904
  function requiresText(item2, all2) {
@@ -21335,6 +21348,14 @@ var SliccUpdates = class extends ModelElement {
21335
21348
  </article>`;
21336
21349
  }
21337
21350
  #packageMeta(item2, all2) {
21351
+ if (item2.pin) {
21352
+ const [version3, ...rest] = pinVersion(item2, item2.pin);
21353
+ return b`<p class="meta" data-pin=${item2.pin.base === null ? "added" : "pinned"}>
21354
+ <span class="version">${version3}</span>
21355
+ ${rest.map((part2) => b`<span>${part2}</span>`)}
21356
+ <span>in ${item2.pin.project}</span>
21357
+ </p>`;
21358
+ }
21338
21359
  const version2 = item2.version === null ? item2.offered : item2.offered && item2.offered !== item2.version ? `${item2.version} \u2192 ${item2.offered}` : item2.version;
21339
21360
  const download = item2.size !== void 0 && (item2.version === null || item2.offered !== item2.version);
21340
21361
  const requires = requiresText(item2, all2);
@@ -21360,11 +21381,11 @@ var SliccUpdates = class extends ModelElement {
21360
21381
  return b`<swc-progress-bar
21361
21382
  size="s"
21362
21383
  indeterminate
21363
- accessible-label=${`${item2.label}: ${packageStates[item2.state]?.[1].toLowerCase()}`}
21384
+ accessible-label=${`${item2.label}: ${packageLight(item2)?.[1].toLowerCase()}`}
21364
21385
  ></swc-progress-bar>`;
21365
21386
  }
21366
21387
  #package(item2, all2, act) {
21367
- const light = packageStates[item2.state];
21388
+ const light = packageLight(item2);
21368
21389
  const busy = this.busy.get(item2.id);
21369
21390
  const shown2 = busy ? [busy] : act ? item2.actions : [];
21370
21391
  const error = this.problems.get(item2.id) ?? item2.error;
@@ -21400,21 +21421,32 @@ var SliccUpdates = class extends ModelElement {
21400
21421
  ${item2.log ? b`<details><summary>Install log</summary><pre><span class="package">${item2.package}</span>\n${item2.log}</pre></details>` : A}
21401
21422
  </li>`;
21402
21423
  }
21424
+ #list(items, all2, port) {
21425
+ return b`<ul>${c(
21426
+ items,
21427
+ (item2) => item2.id,
21428
+ (item2) => this.#package(item2, all2, Boolean(port.actPackage))
21429
+ )}</ul>`;
21430
+ }
21403
21431
  #packages(port) {
21404
21432
  if (!port?.packages) return A;
21405
21433
  const all2 = port.packages();
21434
+ const offered = all2.filter((item2) => item2.origin !== "user");
21435
+ const yours = all2.filter((item2) => item2.origin === "user");
21406
21436
  return b`<section data-section="packages" aria-labelledby="packages">
21407
21437
  <swc-divider size="m"></swc-divider>
21408
21438
  <h2 id="packages">Optional packages</h2>
21409
21439
  <p class="hint">
21410
- ${all2.length ? "Tools for the agent and the terminal. Install the ones you need; you can remove them later." : "No optional packages are offered right now."}
21440
+ ${offered.length ? "Tools for the agent and the terminal. Install the ones you need; you can remove them later." : "No optional packages are offered right now."}
21411
21441
  </p>
21412
- ${all2.length ? b`<ul>${c(
21413
- all2,
21414
- (item2) => item2.id,
21415
- (item2) => this.#package(item2, all2, Boolean(port.actPackage))
21416
- )}</ul>` : A}
21417
- </section>`;
21442
+ ${offered.length ? this.#list(offered, all2, port) : A}
21443
+ </section>
21444
+ ${yours.length ? b`<section data-section="user-packages" aria-labelledby="user-packages">
21445
+ <swc-divider size="m"></swc-divider>
21446
+ <h2 id="user-packages">Your packages</h2>
21447
+ <p class="hint">Packages you added or pinned with pnpm in /opt/agent or /opt/grammars. Seven’s updates keep them until you unpin or remove them.</p>
21448
+ ${this.#list(yours, all2, port)}
21449
+ </section>` : A}`;
21418
21450
  }
21419
21451
  render() {
21420
21452
  const port = this.model?.updates;
@@ -21619,6 +21651,11 @@ var SliccApp = class extends ThemedElement {
21619
21651
  .rail:empty {
21620
21652
  display: none;
21621
21653
  }
21654
+ .rail .cones {
21655
+ flex: none;
21656
+ inline-size: var(--swc-component-height-75);
21657
+ border-block-start: var(--swc-border-width-100) solid var(--swc-gray-300);
21658
+ }
21622
21659
  .rail swc-action-button.selected {
21623
21660
  --swc-action-button-background-color-default: var(--swc-neutral-background-color-selected-default);
21624
21661
  --swc-action-button-background-color-hover: var(--swc-neutral-background-color-selected-hover);
@@ -21832,6 +21869,13 @@ var SliccApp = class extends ThemedElement {
21832
21869
  if (layout) this.#start(this.model);
21833
21870
  else if (changed.has("model")) this.#rebind(this.model);
21834
21871
  this.#updates(layout);
21872
+ this.#retitle();
21873
+ }
21874
+ #retitle() {
21875
+ for (const sprinkle of this.#sprinkles()) {
21876
+ const panel = this.dock.api.getPanel(`sprinkle:${sprinkle.id}`);
21877
+ if (panel && panel.title !== sprinkle.title) panel.api.setTitle(sprinkle.title);
21878
+ }
21835
21879
  }
21836
21880
  #updates(layout) {
21837
21881
  const port = this.model?.updates;
@@ -21967,7 +22011,7 @@ var SliccApp = class extends ThemedElement {
21967
22011
  openChat(this.dock, agent, this.screen);
21968
22012
  return;
21969
22013
  }
21970
- const sprinkle = this.model?.sprinkles.list().find((candidate) => `sprinkle:${candidate.id}` === id);
22014
+ const sprinkle = this.#sprinkles().find((candidate) => `sprinkle:${candidate.id}` === id);
21971
22015
  if (sprinkle) {
21972
22016
  openSprinkle(this.dock, sprinkle, this.screen);
21973
22017
  return;
@@ -21985,7 +22029,19 @@ var SliccApp = class extends ThemedElement {
21985
22029
  this.dock.content(id)?.reveal?.(section);
21986
22030
  }
21987
22031
  #sprinkle(id) {
21988
- return this.model?.sprinkles.list().find((candidate) => candidate.id === id);
22032
+ return this.#sprinkles().find((candidate) => candidate.id === id);
22033
+ }
22034
+ #sprinkles() {
22035
+ const model = this.model;
22036
+ if (!model) return [];
22037
+ const selected = this.#cone();
22038
+ const cones = model.agent.list().filter((agent) => agent.kind === "cone");
22039
+ const list4 = model.sprinkles.list();
22040
+ const order = [selected, ...cones.map((cone) => cone.id), ...list4.map((item2) => item2.agentId)];
22041
+ return list4.map((sprinkle) => {
22042
+ const cone = cones.find((agent) => agent.id === sprinkle.agentId && agent.id !== selected);
22043
+ return cone ? { ...sprinkle, title: `${cone.name} / ${sprinkle.title}` } : sprinkle;
22044
+ }).sort((a22, b13) => order.indexOf(a22.agentId) - order.indexOf(b13.agentId));
21989
22045
  }
21990
22046
  #detach(id, place2, open) {
21991
22047
  const sprinkle = this.#sprinkle(id);
@@ -22017,7 +22073,7 @@ var SliccApp = class extends ThemedElement {
22017
22073
  const driven = item2.id === "browser" && !!this.model?.browser.list().some((tab) => tab.controlled);
22018
22074
  const visible2 = shown(this.dock, item2.id);
22019
22075
  const label = `${visible2 ? `${item2.title}, shown` : `Open ${item2.title}`}${changes ? `, ${changeCount(changes)}` : driven ? ", a tab is in use" : ""}`;
22020
- const button = u16`<swc-action-button id=${`rail-${item2.id}`} class=${visible2 ? "selected" : ""} quiet size="m" accessible-label=${label} data-surface=${item2.id} ?data-visible=${visible2} @click=${() => this.show(item2.id)}>${railIcon(item2.icon)}</swc-action-button>`;
22076
+ const button = u16`<swc-action-button id=${`rail-${item2.id}`} class=${visible2 ? "selected" : ""} quiet size="m" accessible-label=${label} data-surface=${item2.id} data-cone=${o2(item2.cone)} ?data-visible=${visible2} @click=${() => this.show(item2.id)}>${railIcon(item2.icon)}</swc-action-button>`;
22021
22077
  const tooltip = b`<swc-tooltip for=${`rail-${item2.id}`} placement=${{ left: "end", right: "start", bottom: "top" }[side]}>${item2.title}</swc-tooltip>`;
22022
22078
  return changes ? b`<span class="badged">${button}<swc-badge size="s" variant="neutral" aria-hidden="true">${changes}</swc-badge></span>${tooltip}` : driven ? b`<span class="badged">${button}<span class="dot" data-driven aria-hidden="true"></span></span>${tooltip}` : b`${button}${tooltip}`;
22023
22079
  }
@@ -22039,13 +22095,14 @@ var SliccApp = class extends ThemedElement {
22039
22095
  const primary = side === "bottom" ? items.filter((item2) => phoneRail.includes(item2.id)) : items;
22040
22096
  const fit = primary.length < items.length ? Math.min(primary.length, railCapacity(this.#width, Infinity)) : railCapacity(this.#width, items.length);
22041
22097
  const shown2 = side === "bottom" ? primary.slice(0, fit) : items;
22098
+ const grouped = new Set(shown2.map((item2) => item2.cone).filter(Boolean)).size > 1;
22042
22099
  return b`<nav class=${`rail ${side}`} aria-label=${`Panels, ${side}`} @dragover=${this.#railOver} @dragleave=${this.#railLeave} @drop=${this.#railDrop}>${shown2.map(
22043
- (item2) => this.#railButton(item2, side)
22100
+ (item2, index) => b`${grouped && index && shown2[index - 1].cone !== item2.cone ? b`<span class="cones" aria-hidden="true"></span>` : A}${this.#railButton(item2, side)}`
22044
22101
  )}${this.#more(items.filter((item2) => !shown2.includes(item2)))}</nav>`;
22045
22102
  }
22046
22103
  #rails() {
22047
22104
  const dock = this.renderRoot.querySelector("slicc-dock");
22048
- const sprinkles = (this.model?.sprinkles.list() ?? []).filter((sprinkle) => !sprinkle.inline || this.dips.has(sprinkle.id)).map(sprinkleSurface);
22105
+ const sprinkles = this.#sprinkles().filter((sprinkle) => !sprinkle.inline || this.dips.has(sprinkle.id)).map(sprinkleSurface);
22049
22106
  const all2 = dock && this.#started ? [...sprinkles, ...this.#available()] : [];
22050
22107
  const phone = this.screen === "phone";
22051
22108
  return {