@ai-ecoverse/slicc-spectrum 1.68.3 → 1.69.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/dist/slicc-ui.js CHANGED
@@ -9444,6 +9444,7 @@ var SliccPrompt = class extends i2 {
9444
9444
  trigger = null;
9445
9445
  submit = null;
9446
9446
  #result = Promise.withResolvers();
9447
+ #submitted = null;
9447
9448
  constructor() {
9448
9449
  super();
9449
9450
  this.heading = "";
@@ -9495,14 +9496,14 @@ var SliccPrompt = class extends i2 {
9495
9496
  this.#field.focus();
9496
9497
  return;
9497
9498
  }
9498
- this.#result.resolve(value);
9499
+ this.#submitted = value;
9499
9500
  this.#dialog.close();
9500
9501
  }
9501
9502
  #cancel(event2) {
9502
9503
  if (this.pending) event2.preventDefault();
9503
9504
  }
9504
9505
  #closed() {
9505
- this.#result.resolve(null);
9506
+ this.#result.resolve(this.#submitted);
9506
9507
  this.remove();
9507
9508
  if (this.trigger?.isConnected) this.trigger.focus();
9508
9509
  }
@@ -10736,11 +10737,514 @@ var SliccFreezer = class extends ModelElement {
10736
10737
  }
10737
10738
  };
10738
10739
 
10740
+ // node_modules/@adobe/spectrum-wc-icons/dist/ChevronRight.js
10741
+ function e80() {
10742
+ return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M7.75 16.465a.748.748 0 0 1-.54-1.27l4.999-5.197-4.986-5.184a.75.75 0 0 1 .02-1.06.75.75 0 0 1 1.06.021L13.79 9.48c.28.29.28.749 0 1.039l-5.5 5.716a.75.75 0 0 1-.54.23"/></svg>';
10743
+ }
10744
+
10745
+ // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-chevron-right.js
10746
+ var o51 = class extends a10 {
10747
+ static get styles() {
10748
+ return [t40];
10749
+ }
10750
+ render() {
10751
+ return b`
10752
+ <span class="swc-Icon">${o16(e80())}</span>
10753
+ `;
10754
+ }
10755
+ };
10756
+ e25("swc-icon-chevron-right", o51);
10757
+
10758
+ // node_modules/@adobe/spectrum-wc-icons/dist/Copy.js
10759
+ function e81() {
10760
+ return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M11.75 18h-7.5C3.01 18 2 16.99 2 15.75v-7.5C2 7.01 3.01 6 4.25 6a.75.75 0 0 1 0 1.5.75.75 0 0 0-.75.75v7.5c0 .413.337.75.75.75h7.5c.413 0 .75-.337.75-.75a.75.75 0 0 1 1.5 0c0 1.24-1.01 2.25-2.25 2.25m-5-13A.75.75 0 0 1 6 4.25C6 3.01 7.01 2 8.25 2a.75.75 0 0 1 0 1.5.75.75 0 0 0-.75.75.75.75 0 0 1-.75.75M13 3.5h-2A.75.75 0 0 1 11 2h2a.75.75 0 0 1 0 1.5"/><path fill="var(--swc-icon-color, currentColor)" d="M13 14h-2a.75.75 0 0 1 0-1.5h2a.75.75 0 0 1 0 1.5m2.75 0a.75.75 0 0 1 0-1.5c.413 0 .75-.337.75-.75a.75.75 0 0 1 1.5 0c0 1.24-1.01 2.25-2.25 2.25m1.5-9a.75.75 0 0 1-.75-.75.75.75 0 0 0-.75-.75.75.75 0 0 1 0-1.5C16.99 2 18 3.01 18 4.25a.75.75 0 0 1-.75.75m0 4.75A.75.75 0 0 1 16.5 9V7A.75.75 0 0 1 18 7v2a.75.75 0 0 1-.75.75m-10.5 0A.75.75 0 0 1 6 9V7a.75.75 0 0 1 1.5 0v2a.75.75 0 0 1-.75.75M8.25 14C7.01 14 6 12.99 6 11.75a.75.75 0 0 1 1.5 0c0 .413.337.75.75.75a.75.75 0 0 1 0 1.5"/></svg>';
10761
+ }
10762
+
10763
+ // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-copy.js
10764
+ var o52 = class extends a10 {
10765
+ static get styles() {
10766
+ return [t40];
10767
+ }
10768
+ render() {
10769
+ return b`
10770
+ <span class="swc-Icon">${o16(e81())}</span>
10771
+ `;
10772
+ }
10773
+ };
10774
+ e25("swc-icon-copy", o52);
10775
+
10776
+ // src/app/reach.ts
10777
+ var command = "curl -fsSL https://get.sliccy.ai/slicc | sh";
10778
+ var startCommand = "slicc";
10779
+ var nodeCommand = "npx sliccy@next";
10780
+ var reachStyles = i`
10781
+ .command {
10782
+ display: flex;
10783
+ align-items: center;
10784
+ gap: var(--swc-spacing-100);
10785
+ padding: var(--swc-spacing-75) var(--swc-spacing-75) var(--swc-spacing-75) var(--swc-spacing-200);
10786
+ border-radius: var(--swc-corner-radius-medium-default);
10787
+ background: var(--swc-background-layer-1-color);
10788
+ }
10789
+ code {
10790
+ flex: 1;
10791
+ min-width: 0;
10792
+ overflow-wrap: break-word;
10793
+ word-break: normal;
10794
+ font-family: var(--swc-code-font-family-stack);
10795
+ font-size: var(--swc-font-size-75);
10796
+ color: var(--swc-code-color);
10797
+ user-select: all;
10798
+ }
10799
+ .commands {
10800
+ display: grid;
10801
+ gap: var(--swc-spacing-100);
10802
+ }
10803
+ .commands p {
10804
+ margin: 0;
10805
+ font-size: var(--swc-font-size-75);
10806
+ color: var(--swc-neutral-subdued-content-color-default);
10807
+ }
10808
+ `;
10809
+ function block(text2, copied, copy, first2 = false) {
10810
+ const done2 = copied === text2;
10811
+ return b`<div class="command" data-command=${text2}>
10812
+ <code>${breakable(text2)}</code>
10813
+ <swc-action-button size="s" quiet data-action=${first2 ? "copy-command" : A} accessible-label=${done2 ? "Copied" : `Copy ${text2}`} @click=${() => copy(text2)}>
10814
+ <swc-icon-copy slot="icon"></swc-icon-copy>${done2 ? "Copied" : "Copy"}
10815
+ </swc-action-button>
10816
+ </div>`;
10817
+ }
10818
+ function breakable(text2) {
10819
+ return text2.split("/").map(
10820
+ (part2, index, parts2) => b`${part2}${index < parts2.length - 1 ? b`/<wbr />` : A}`
10821
+ );
10822
+ }
10823
+ function reach({ intro, extensionUrl, copied, uncopied, copy }) {
10824
+ return b`<p>${intro}</p>
10825
+ ${extensionUrl ? b`<p><a class="swc-Link" href=${extensionUrl} target="_blank" rel="noopener noreferrer" data-action="install-extension">Install the Chrome extension</a></p>` : A}
10826
+ <p>To run slicc, enter this in a terminal:</p>
10827
+ <div class="commands">
10828
+ ${block(command, copied, copy, true)}
10829
+ ${block(startCommand, copied, copy)}
10830
+ </div>
10831
+ <div class="commands" data-commands="node">
10832
+ <p>With Node:</p>
10833
+ ${block(nodeCommand, copied, copy)}
10834
+ </div>
10835
+ ${uncopied ? b`<div class="error" role="alert" data-error="copy"><swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle><span>Couldn’t copy. Select the command and copy it.</span></div>` : A}`;
10836
+ }
10837
+ async function copyText(text2) {
10838
+ try {
10839
+ await globalThis.navigator.clipboard.writeText(text2);
10840
+ return true;
10841
+ } catch {
10842
+ return false;
10843
+ }
10844
+ }
10845
+
10846
+ // src/app/monitor.ts
10847
+ function sparkline(points, width = 120, height = 28) {
10848
+ if (points.length < 2) return "";
10849
+ const max2 = Math.max(...points);
10850
+ const min2 = Math.min(...points);
10851
+ const span = max2 - min2 || 1;
10852
+ return points.map(
10853
+ (value, i26) => `${(i26 / (points.length - 1) * width).toFixed(1)},${(height - (value - min2) / span * (height - 2) - 1).toFixed(1)}`
10854
+ ).join(" ");
10855
+ }
10856
+ function meterVariant2(ratio) {
10857
+ if (ratio >= 0.9) return "negative";
10858
+ if (ratio >= 0.6) return "notice";
10859
+ return "informative";
10860
+ }
10861
+ var surfaces = {
10862
+ agents: "agents",
10863
+ terminals: "terminal",
10864
+ tabs: "browser",
10865
+ changes: "changes",
10866
+ processes: "terminal"
10867
+ };
10868
+ var rowLights = {
10869
+ active: "info",
10870
+ idle: "neutral",
10871
+ warn: "notice",
10872
+ error: "negative"
10873
+ };
10874
+ var rowSpoken = {
10875
+ active: "Active",
10876
+ idle: "Idle",
10877
+ warn: "Needs attention",
10878
+ error: "Error"
10879
+ };
10880
+ function indent(depth) {
10881
+ return Math.min(Math.max(Math.floor(depth ?? 0), 0), 6);
10882
+ }
10883
+ function attention(section) {
10884
+ const errors = section.rows.filter((row) => row.status === "error").length;
10885
+ if (errors)
10886
+ return { variant: "negative", text: `${errors} ${errors === 1 ? "error" : "errors"}` };
10887
+ const warnings = section.rows.filter((row) => row.status === "warn").length;
10888
+ if (warnings)
10889
+ return {
10890
+ variant: "notice",
10891
+ text: `${warnings} ${warnings === 1 ? "needs" : "need"} attention`
10892
+ };
10893
+ return null;
10894
+ }
10895
+ var SliccMonitor = class extends ModelElement {
10896
+ static properties = {
10897
+ ...ModelElement.properties,
10898
+ expanded: { state: true },
10899
+ copied: { state: true }
10900
+ };
10901
+ constructor() {
10902
+ super();
10903
+ this.expanded = {};
10904
+ this.copied = null;
10905
+ }
10906
+ static styles = [
10907
+ shared,
10908
+ panelCss,
10909
+ i`
10910
+ .bar {
10911
+ padding-block: var(--swc-spacing-50);
10912
+ }
10913
+ .heading {
10914
+ flex: 1;
10915
+ min-width: 0;
10916
+ display: flex;
10917
+ flex-wrap: wrap;
10918
+ align-items: baseline;
10919
+ column-gap: var(--swc-spacing-100);
10920
+ white-space: normal;
10921
+ }
10922
+ .bar swc-action-button {
10923
+ flex: none;
10924
+ }
10925
+ .body {
10926
+ flex: 1;
10927
+ min-height: 0;
10928
+ overflow-y: auto;
10929
+ padding: var(--swc-spacing-100);
10930
+ display: grid;
10931
+ grid-template-columns: minmax(0, 1fr);
10932
+ align-content: start;
10933
+ gap: var(--swc-spacing-200);
10934
+ }
10935
+ .vitals {
10936
+ display: grid;
10937
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--swc-card-default-width-extra-small)), 1fr));
10938
+ gap: var(--swc-spacing-100);
10939
+ }
10940
+ .vital {
10941
+ display: grid;
10942
+ align-content: start;
10943
+ gap: var(--swc-spacing-50);
10944
+ border-radius: var(--swc-corner-radius-medium-default);
10945
+ padding: var(--swc-spacing-200);
10946
+ background: var(--swc-background-layer-1-color);
10947
+ }
10948
+ .label {
10949
+ color: var(--swc-neutral-subdued-content-color-default);
10950
+ font-size: var(--swc-font-size-75);
10951
+ }
10952
+ .value {
10953
+ font-size: var(--swc-font-size-300);
10954
+ font-weight: var(--swc-bold-font-weight);
10955
+ font-variant-numeric: tabular-nums;
10956
+ }
10957
+ .unit,
10958
+ .delta {
10959
+ color: var(--swc-neutral-subdued-content-color-default);
10960
+ margin-inline-start: var(--swc-spacing-75);
10961
+ }
10962
+ svg {
10963
+ display: block;
10964
+ width: 100%;
10965
+ height: var(--swc-component-height-100);
10966
+ }
10967
+ polyline {
10968
+ fill: none;
10969
+ stroke: var(--swc-accent-visual-color);
10970
+ stroke-width: 1.5;
10971
+ }
10972
+ swc-meter {
10973
+ width: 100%;
10974
+ }
10975
+ .alerts {
10976
+ display: grid;
10977
+ gap: var(--swc-spacing-75);
10978
+ margin: 0;
10979
+ padding: 0;
10980
+ list-style: none;
10981
+ }
10982
+ .alert {
10983
+ display: grid;
10984
+ grid-template-columns: auto minmax(0, 1fr);
10985
+ gap: var(--swc-spacing-100);
10986
+ align-items: start;
10987
+ border-radius: var(--swc-corner-radius-medium-default);
10988
+ padding: var(--swc-spacing-100) var(--swc-spacing-200);
10989
+ background: var(--swc-notice-subtle-background-color-default);
10990
+ }
10991
+ .alert[data-severity='error'] {
10992
+ background: var(--swc-negative-subtle-background-color-default);
10993
+ }
10994
+ .alert swc-icon-alert-triangle {
10995
+ color: var(--swc-icon-color-notice);
10996
+ }
10997
+ .alert swc-icon-alert-diamond {
10998
+ color: var(--swc-icon-color-negative);
10999
+ }
11000
+ .alert .detail {
11001
+ display: block;
11002
+ color: var(--swc-neutral-subdued-content-color-default);
11003
+ }
11004
+ .alert > div {
11005
+ min-width: 0;
11006
+ }
11007
+ .alert .command {
11008
+ display: flex;
11009
+ align-items: center;
11010
+ gap: var(--swc-spacing-100);
11011
+ margin-block-start: var(--swc-spacing-75);
11012
+ padding-inline-start: var(--swc-spacing-100);
11013
+ border-radius: var(--swc-corner-radius-medium-default);
11014
+ background: var(--swc-background-layer-1-color);
11015
+ }
11016
+ .alert code {
11017
+ flex: 1;
11018
+ min-width: 0;
11019
+ overflow-x: auto;
11020
+ white-space: nowrap;
11021
+ font-family: var(--swc-code-font-family-stack);
11022
+ font-size: var(--swc-font-size-75);
11023
+ color: var(--swc-code-color);
11024
+ }
11025
+ .alert .lead {
11026
+ display: block;
11027
+ margin-block-start: var(--swc-spacing-75);
11028
+ color: var(--swc-neutral-subdued-content-color-default);
11029
+ }
11030
+ .alert .uncopied {
11031
+ display: block;
11032
+ color: var(--swc-negative-content-color-default);
11033
+ }
11034
+ .sections {
11035
+ display: grid;
11036
+ margin: 0;
11037
+ padding: 0;
11038
+ list-style: none;
11039
+ }
11040
+ .section {
11041
+ display: grid;
11042
+ }
11043
+ .line {
11044
+ display: flex;
11045
+ flex-wrap: wrap;
11046
+ align-items: center;
11047
+ gap: var(--swc-spacing-100);
11048
+ min-height: var(--swc-component-height-100);
11049
+ padding: var(--swc-spacing-50) 0;
11050
+ }
11051
+ .toggle {
11052
+ all: unset;
11053
+ box-sizing: border-box;
11054
+ flex: 1 1 auto;
11055
+ min-width: 0;
11056
+ display: flex;
11057
+ align-items: center;
11058
+ gap: var(--swc-spacing-75);
11059
+ cursor: pointer;
11060
+ border-radius: var(--swc-corner-radius-small-default);
11061
+ }
11062
+ .toggle:focus-visible {
11063
+ outline: var(--swc-focus-indicator-thickness) solid var(--swc-focus-indicator-color);
11064
+ outline-offset: var(--swc-focus-ring-gap);
11065
+ }
11066
+ .chevron {
11067
+ flex: none;
11068
+ width: var(--swc-component-height-50);
11069
+ display: inline-flex;
11070
+ justify-content: center;
11071
+ color: var(--swc-neutral-subdued-content-color-default);
11072
+ }
11073
+ .toggle[aria-expanded='true'] swc-icon-chevron-right {
11074
+ transform: rotate(90deg);
11075
+ }
11076
+ :host(:dir(rtl)) .toggle[aria-expanded='false'] swc-icon-chevron-right {
11077
+ transform: scaleX(-1);
11078
+ }
11079
+ .line .name {
11080
+ flex: 1 1 auto;
11081
+ min-width: 0;
11082
+ }
11083
+ .line .num {
11084
+ font-weight: var(--swc-bold-font-weight);
11085
+ font-variant-numeric: tabular-nums;
11086
+ }
11087
+ .rows {
11088
+ display: grid;
11089
+ gap: var(--swc-spacing-50);
11090
+ margin: 0 0 var(--swc-spacing-100);
11091
+ padding: 0;
11092
+ padding-inline-start: calc(var(--swc-component-height-50) + var(--swc-spacing-75));
11093
+ list-style: none;
11094
+ }
11095
+ .row {
11096
+ display: grid;
11097
+ grid-template-columns: minmax(0, 1fr) auto;
11098
+ align-items: center;
11099
+ column-gap: var(--swc-spacing-100);
11100
+ padding-inline-start: calc(var(--depth, 0) * var(--swc-spacing-300));
11101
+ }
11102
+ .row swc-status-light {
11103
+ min-width: 0;
11104
+ overflow-wrap: break-word;
11105
+ }
11106
+ .row .badges {
11107
+ grid-column: 2;
11108
+ grid-row: 1 / span 2;
11109
+ align-self: start;
11110
+ display: flex;
11111
+ flex-wrap: wrap;
11112
+ justify-content: end;
11113
+ gap: var(--swc-spacing-50);
11114
+ }
11115
+ .row swc-status-light {
11116
+ grid-column: 1;
11117
+ grid-row: 1;
11118
+ }
11119
+ .row .meta {
11120
+ grid-column: 1;
11121
+ grid-row: 2;
11122
+ padding-inline-start: var(--swc-spacing-300);
11123
+ color: var(--swc-neutral-subdued-content-color-default);
11124
+ font-size: var(--swc-font-size-75);
11125
+ overflow-wrap: break-word;
11126
+ }
11127
+ `
11128
+ ];
11129
+ subscribe(model) {
11130
+ return [model.monitor.on("snapshot", () => this.requestUpdate())];
11131
+ }
11132
+ focus() {
11133
+ this.focusOn(".bar swc-action-button");
11134
+ }
11135
+ #vital(vital) {
11136
+ if (vital.ratio !== void 0) {
11137
+ return b`<div class="vital" data-id=${vital.id}>
11138
+ <swc-meter
11139
+ size="s"
11140
+ variant=${meterVariant2(vital.ratio)}
11141
+ value=${Math.round(vital.ratio * 100)}
11142
+ value-label=${vital.value}
11143
+ ><span slot="label">${vital.label}</span>${vital.unit ? b`<span slot="description">${vital.unit}</span>` : A}</swc-meter
11144
+ >
11145
+ </div>`;
11146
+ }
11147
+ const line = vital.series ? sparkline(vital.series) : "";
11148
+ return b`<div class="vital" data-id=${vital.id}>
11149
+ <div class="label">${vital.label}</div>
11150
+ <div><span class="value">${vital.value}</span>${vital.unit ? b`<span class="unit">${vital.unit}</span>` : A}${vital.delta ? b`<span class="delta">${vital.delta}</span>` : A}</div>
11151
+ ${line ? b`<svg viewBox="0 0 120 28" preserveAspectRatio="none" aria-hidden="true">${w`<polyline points=${line}></polyline>`}</svg>` : A}
11152
+ </div>`;
11153
+ }
11154
+ #alert(alert) {
11155
+ const error = alert.severity === "error";
11156
+ return b`<li class="alert" data-severity=${alert.severity}>
11157
+ ${error ? b`<swc-icon-alert-diamond size="s" aria-hidden="true"></swc-icon-alert-diamond>` : b`<swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle>`}
11158
+ <div><span class="sr">${error ? "Error: " : "Warning: "}</span><strong>${alert.title}</strong><span class="detail">${alert.detail}</span>${alert.command ? this.#command(alert.id, alert.command, alert.commandLabel ?? "Run") : A}</div>
11159
+ </li>`;
11160
+ }
11161
+ #command(id, text2, label) {
11162
+ const copied = this.copied?.id === id && this.copied.text === text2 ? this.copied : null;
11163
+ return b`<span class="lead">${label}:</span><div class="command" data-command><code>${text2}</code><swc-action-button size="s" quiet data-action="copy-command" accessible-label=${copied?.done ? "Copied" : "Copy command"} @click=${() => this.#copy(id, text2)}><swc-icon-copy slot="icon"></swc-icon-copy>${copied?.done ? "Copied" : "Copy"}</swc-action-button></div>${copied && !copied.done ? b`<span class="uncopied" role="alert" data-error="copy">Couldn’t copy. Select the command and copy it.</span>` : A}`;
11164
+ }
11165
+ async #copy(id, text2) {
11166
+ this.copied = { id, text: text2, done: await copyText(text2) };
11167
+ }
11168
+ #open(id) {
11169
+ this.dispatchEvent(
11170
+ new CustomEvent("show-surface", { detail: { id }, bubbles: true, composed: true })
11171
+ );
11172
+ }
11173
+ #row(row) {
11174
+ const depth = indent(row.depth);
11175
+ return b`<li class="row" data-id=${row.id ?? A} data-status=${row.status} data-depth=${depth || A} style=${depth ? `--depth: ${depth}` : A}>
11176
+ <swc-status-light size="s" variant=${rowLights[row.status]}><span class="sr">${rowSpoken[row.status]}: </span>${row.name.split(/(?<=\/)/).map((part2, i26) => i26 ? b`<wbr>${part2}` : part2)}</swc-status-light>
11177
+ <span class="badges">${(row.badges ?? []).map((badge) => b`<swc-badge size="s" variant="neutral" subtle>${badge}</swc-badge>`)}</span>
11178
+ ${row.meta ? b`<span class="meta">${row.meta}</span>` : A}
11179
+ </li>`;
11180
+ }
11181
+ #section(section) {
11182
+ const flag = attention(section);
11183
+ const surface2 = surfaces[section.id];
11184
+ const rows = section.rows.length > 0;
11185
+ const open = rows && (this.expanded[section.id] ?? flag !== null);
11186
+ const list5 = `rows-${section.id}`;
11187
+ return b`<li class="section" data-id=${section.id} data-open=${open ? "" : A}>
11188
+ <div class="line">
11189
+ ${rows ? b`<button class="toggle" aria-expanded=${open ? "true" : "false"} aria-controls=${open ? list5 : A} @click=${() => {
11190
+ this.expanded = { ...this.expanded, [section.id]: !open };
11191
+ }}><span class="chevron"><swc-icon-chevron-right size="s" aria-hidden="true"></swc-icon-chevron-right></span><span class="name">${section.label}</span></button>` : b`<span class="chevron"></span><span class="name">${section.label}</span>`}
11192
+ ${flag ? b`<swc-badge size="s" variant=${flag.variant} subtle>${flag.text}</swc-badge>` : A}
11193
+ <span class="num">${section.rows.length}</span>
11194
+ ${surface2 ? b`<swc-action-button size="s" quiet accessible-label=${`Open ${section.label}`} @click=${() => this.#open(surface2)}
11195
+ >Open</swc-action-button
11196
+ >` : A}
11197
+ </div>
11198
+ ${open ? b`<ul class="rows" id=${list5} aria-label=${section.label}>${c(
11199
+ section.rows,
11200
+ (row, i26) => row.id ?? i26,
11201
+ (row) => this.#row(row)
11202
+ )}</ul>` : A}
11203
+ </li>`;
11204
+ }
11205
+ render() {
11206
+ const snapshot2 = this.model?.monitor.snapshot();
11207
+ return b`<div class="bar">
11208
+ <span class="heading"><strong>Live monitor</strong><span>${snapshot2 ? `Updated ${new Date(snapshot2.updatedAt).toISOString().slice(11, 19)} UTC` : "No data"}</span></span>
11209
+ <swc-action-button size="s" quiet @click=${() => this.model?.monitor.resync()}><swc-icon-refresh slot="icon"></swc-icon-refresh>Re-sync</swc-action-button>
11210
+ </div>
11211
+ <div class="body">
11212
+ ${snapshot2 ? b`<div class="vitals">${snapshot2.vitals.map((vital) => this.#vital(vital))}</div>
11213
+ ${snapshot2.alerts.length ? b`<ul class="alerts" aria-label="Alerts">${snapshot2.alerts.map((alert) => this.#alert(alert))}</ul>` : A}
11214
+ <ul class="sections" aria-label="Activity">${snapshot2.sections.map((section) => this.#section(section))}</ul>` : A}
11215
+ </div>`;
11216
+ }
11217
+ };
11218
+
10739
11219
  // src/app/agents.ts
10740
11220
  function ordered(agents) {
10741
11221
  const cones = agents.filter((agent) => agent.kind === "cone");
10742
11222
  return cones.flatMap((cone) => [cone, ...agents.filter((agent) => agent.parentId === cone.id)]);
10743
11223
  }
11224
+ function creatable(model) {
11225
+ return Boolean(model?.agent.createCone) && !watchOnly(model);
11226
+ }
11227
+ async function createCone(model, trigger2) {
11228
+ const port = model.agent;
11229
+ const create3 = port.createCone?.bind(port);
11230
+ if (!create3) return void 0;
11231
+ let created;
11232
+ await prompt({
11233
+ title: "New cone",
11234
+ label: "Name",
11235
+ action: "Create",
11236
+ trigger: trigger2,
11237
+ submit: async (name) => {
11238
+ if (watchOnly(model)) return;
11239
+ created = await create3(name);
11240
+ }
11241
+ });
11242
+ if (created) port.select(created.id);
11243
+ return created;
11244
+ }
11245
+ function fillShown(fill2) {
11246
+ return fill2 >= 0.5;
11247
+ }
10744
11248
  var SliccAgents = class extends ModelElement {
10745
11249
  static properties = { ...ModelElement.properties, errors: { state: true } };
10746
11250
  constructor() {
@@ -10758,6 +11262,10 @@ var SliccAgents = class extends ModelElement {
10758
11262
  color: var(--swc-neutral-content-color-default);
10759
11263
  font-size: var(--swc-font-size-100);
10760
11264
  }
11265
+ .actions {
11266
+ display: flex;
11267
+ padding: var(--swc-spacing-75) var(--swc-spacing-100) 0;
11268
+ }
10761
11269
  ul {
10762
11270
  list-style: none;
10763
11271
  margin: 0;
@@ -10773,6 +11281,7 @@ var SliccAgents = class extends ModelElement {
10773
11281
  cursor: pointer;
10774
11282
  }
10775
11283
  li.scoop {
11284
+ grid-template-areas: 'name unread fill drop' 'status unread fill drop' 'error error error error';
10776
11285
  padding-inline-start: calc(var(--swc-spacing-200) + var(--swc-spacing-300));
10777
11286
  }
10778
11287
  li:hover {
@@ -10820,12 +11329,21 @@ var SliccAgents = class extends ModelElement {
10820
11329
  min-width: 4ch;
10821
11330
  text-align: end;
10822
11331
  }
11332
+ .fill[data-variant='notice'] {
11333
+ color: var(--swc-notice-color-1000);
11334
+ font-weight: var(--swc-bold-font-weight);
11335
+ }
11336
+ .fill[data-variant='negative'] {
11337
+ color: var(--swc-negative-color-1000);
11338
+ font-weight: var(--swc-bold-font-weight);
11339
+ }
10823
11340
  swc-status-light {
10824
11341
  grid-area: status;
10825
11342
  justify-self: start;
10826
11343
  }
10827
11344
  .drop {
10828
11345
  grid-area: drop;
11346
+ margin-block: calc(-1 * var(--swc-spacing-100));
10829
11347
  visibility: hidden;
10830
11348
  }
10831
11349
  li:hover .drop,
@@ -10929,8 +11447,8 @@ var SliccAgents = class extends ModelElement {
10929
11447
  return;
10930
11448
  }
10931
11449
  const current = port.active();
10932
- const stale = current === agent.id || !port.list().some((candidate) => candidate.id === current);
10933
- if (stale && agent.parentId) port.select(agent.parentId);
11450
+ const stale2 = current === agent.id || !port.list().some((candidate) => candidate.id === current);
11451
+ if (stale2 && agent.parentId) port.select(agent.parentId);
10934
11452
  await this.updateComplete;
10935
11453
  this.focus();
10936
11454
  }
@@ -10977,7 +11495,8 @@ var SliccAgents = class extends ModelElement {
10977
11495
  const error = this.errors[agent.id];
10978
11496
  const model = this.model;
10979
11497
  const title = agent.kind === "cone" ? agentTitle(model, agent) : null;
10980
- const label = `${coneLabel(model, agent)}: ${statusLabel[agent.status]}, ${percent(agent.contextFill)} context${agent.unread ? `, ${agent.unread} unread` : ""}${error ? `. ${error}` : ""}`;
11498
+ const unread = selected ? 0 : agent.unread;
11499
+ const label = `${coneLabel(model, agent)}: ${statusLabel[agent.status]}, ${percent(agent.contextFill)} context${unread ? `, ${unread} unread` : ""}${error ? `. ${error}` : ""}`;
10981
11500
  return b`<li
10982
11501
  role="option"
10983
11502
  class=${agent.kind}
@@ -10991,19 +11510,32 @@ var SliccAgents = class extends ModelElement {
10991
11510
  >
10992
11511
  <span class="name">${agent.name}</span>
10993
11512
  ${title === null ? A : b`<span class="title">${title || untitled}</span>`}
10994
- ${agent.unread ? b`<swc-badge class="unread" size="s" variant="accent">${agent.unread}</swc-badge>` : A}
10995
- <span class="fill">${percent(agent.contextFill)}</span>
11513
+ ${unread ? b`<swc-badge class="unread" size="s" variant="accent">${unread}</swc-badge>` : A}
11514
+ ${fillShown(agent.contextFill) ? b`<span class="fill" data-variant=${meterVariant2(agent.contextFill)}>${percent(agent.contextFill)}</span>` : A}
10996
11515
  ${statusLight(agent.status)}
10997
11516
  ${this.#dropButton(agent)}
10998
11517
  ${this.#deleteButton(agent)}
10999
11518
  ${error ? b`<span class="error">${error}</span>` : A}
11000
11519
  </li>`;
11001
11520
  }
11521
+ async #newCone(trigger2) {
11522
+ if (!await createCone(this.model, trigger2)) return;
11523
+ await this.updateComplete;
11524
+ this.focus();
11525
+ }
11526
+ #actions() {
11527
+ if (!creatable(this.model)) return A;
11528
+ return b`<div class="actions">
11529
+ <swc-action-button size="s" quiet data-action="new-cone" @click=${(event2) => void this.#newCone(event2.currentTarget)}>
11530
+ <swc-icon-add slot="icon"></swc-icon-add>New cone
11531
+ </swc-action-button>
11532
+ </div>`;
11533
+ }
11002
11534
  render() {
11003
11535
  const agents = ordered(this.model?.agent.list() ?? []);
11004
11536
  const active = this.model?.agent.active() ?? "";
11005
11537
  const errors = Object.values(this.errors);
11006
- return b`<ul role="listbox" aria-label="Cones and scoops" @keydown=${this.#keydown}>
11538
+ return b`${this.#actions()}<ul role="listbox" aria-label="Cones and scoops" @keydown=${this.#keydown}>
11007
11539
  ${agents.map((agent) => this.#row(agent, active))}
11008
11540
  </ul>
11009
11541
  <div class="sr" role="status">${errors.at(-1) ?? ""}</div>`;
@@ -11025,7 +11557,7 @@ var i17 = e2(class extends i3 {
11025
11557
 
11026
11558
  // node_modules/lit-html/static.js
11027
11559
  var a12 = /* @__PURE__ */ Symbol.for("");
11028
- var o51 = (t90) => {
11560
+ var o53 = (t90) => {
11029
11561
  if (t90?.r === a12) return t90?._$litStatic$;
11030
11562
  };
11031
11563
  var s9 = (t90) => ({ _$litStatic$: t90, r: a12 });
@@ -11036,7 +11568,7 @@ var n28 = (t90) => (r40, ...e120) => {
11036
11568
  const n37 = [], u27 = [];
11037
11569
  let c28, $6 = 0, f11 = false;
11038
11570
  for (; $6 < a23; ) {
11039
- for (c28 = r40[$6]; $6 < a23 && void 0 !== (i26 = e120[$6], s19 = o51(i26)); ) c28 += s19 + r40[++$6], f11 = true;
11571
+ for (c28 = r40[$6]; $6 < a23 && void 0 !== (i26 = e120[$6], s19 = o53(i26)); ) c28 += s19 + r40[++$6], f11 = true;
11040
11572
  $6 !== a23 && u27.push(i26), n37.push(c28), $6++;
11041
11573
  }
11042
11574
  if ($6 === a23 && n37.push(r40[a23]), f11) {
@@ -11169,151 +11701,189 @@ async function grammar(kind, name, version2, remote = grammarCdn, importer = (ur
11169
11701
  throw failure2;
11170
11702
  }
11171
11703
 
11704
+ // src/app/models.ts
11705
+ var asked = /* @__PURE__ */ new WeakMap();
11706
+ var switched = /* @__PURE__ */ new WeakMap();
11707
+ var settling = /* @__PURE__ */ new WeakSet();
11708
+ function stale(model, id, offered) {
11709
+ if (offered.some((option2) => option2.id === id)) return false;
11710
+ const provider = id.split("/")[0];
11711
+ return !model.settings.accounts().some((account) => account.id === provider && account.status === "connected");
11712
+ }
11713
+ function fallbackModel(options) {
11714
+ const offered = chatModels(options);
11715
+ return offered.find((option2) => option2.default) ?? offered[0];
11716
+ }
11717
+ function controls(model) {
11718
+ const state3 = model.follow?.state();
11719
+ return !state3 || !!state3.access.control && state3.link === "connected";
11720
+ }
11721
+ function settleModels(model) {
11722
+ if (settling.has(model) || !controls(model)) return;
11723
+ settling.add(model);
11724
+ try {
11725
+ settle(model);
11726
+ } finally {
11727
+ settling.delete(model);
11728
+ }
11729
+ }
11730
+ function settle(model) {
11731
+ const offered = chatModels(model.settings.models());
11732
+ const pick = fallbackModel(offered);
11733
+ if (!pick) return;
11734
+ const requests = asked.get(model) ?? /* @__PURE__ */ new Map();
11735
+ asked.set(model, requests);
11736
+ const ask = (key2, from, apply2) => {
11737
+ if (!stale(model, from, offered)) {
11738
+ requests.delete(key2);
11739
+ return;
11740
+ }
11741
+ if (requests.get(key2) === pick.id) return;
11742
+ requests.set(key2, pick.id);
11743
+ apply2();
11744
+ };
11745
+ for (const agent of model.agent.list())
11746
+ if (!agent.frozen)
11747
+ ask(`agent:${agent.id}`, agent.model, () => model.agent.setModel(agent.id, pick.id));
11748
+ ask("settings", model.settings.get().model, () => {
11749
+ switched.set(model, { to: pick });
11750
+ model.settings.update({ model: pick.id });
11751
+ });
11752
+ }
11753
+ function modelSwitch(model) {
11754
+ return switched.get(model);
11755
+ }
11756
+ function forgetSwitch(model) {
11757
+ switched.delete(model);
11758
+ }
11759
+
11172
11760
  // node_modules/@adobe/spectrum-wc-icons/dist/Cloud.js
11173
- function e80() {
11761
+ function e82() {
11174
11762
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M15.407 17H3.717a3.456 3.456 0 0 1-3.45-3.452 3.45 3.45 0 0 1 2.323-3.25 4 4 0 0 1-.065-.702c0-2.18 1.81-3.953 4.034-3.953q.42 0 .831.087c.637-1.958 2.476-3.346 4.589-3.346a4.85 4.85 0 0 1 4.844 4.844q0 .659-.187 1.298a4.32 4.32 0 0 1 3.103 4.142A4.337 4.337 0 0 1 15.407 17M6.559 7.143c-1.397 0-2.534 1.1-2.534 2.453q.001.5.206.965a.75.75 0 0 1-.637 1.051 1.95 1.95 0 0 0-1.828 1.936c0 1.076.876 1.952 1.952 1.952h11.689a2.835 2.835 0 0 0 2.832-2.832 2.826 2.826 0 0 0-2.682-2.814.75.75 0 0 1-.625-1.095c.26-.5.39-1.015.39-1.531 0-1.844-1.5-3.344-3.344-3.344-1.662 0-3.08 1.252-3.297 2.912a.75.75 0 0 1-1.054.585 2.6 2.6 0 0 0-1.068-.238"/></svg>';
11175
11763
  }
11176
11764
 
11177
11765
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-cloud.js
11178
- var o52 = class extends a10 {
11766
+ var o54 = class extends a10 {
11179
11767
  static get styles() {
11180
11768
  return [t40];
11181
11769
  }
11182
11770
  render() {
11183
11771
  return b`
11184
- <span class="swc-Icon">${o16(e80())}</span>
11772
+ <span class="swc-Icon">${o16(e82())}</span>
11185
11773
  `;
11186
11774
  }
11187
11775
  };
11188
- e25("swc-icon-cloud", o52);
11776
+ e25("swc-icon-cloud", o54);
11189
11777
 
11190
11778
  // node_modules/@adobe/spectrum-wc-icons/dist/CloudStateError.js
11191
- function e81() {
11779
+ function e83() {
11192
11780
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M15.5 9.021a4.5 4.5 0 1 0 0 9c2.485 0 4.48-2.015 4.48-4.5s-1.995-4.5-4.48-4.5m.95 6.895c0 .472-.425.855-.95.855s-.95-.383-.95-.855v-.289c0-.472.425-.856.95-.856s.95.384.95.856zm-.075-2.495c0 .414-.392.75-.875.75s-.875-.336-.875-.75v-2.65c0-.414.392-.75.875-.75s.875.336.875.75z"/><path fill="var(--swc-icon-color, currentColor)" d="M9.25 16.998H3.718a3.455 3.455 0 0 1-3.452-3.451 3.45 3.45 0 0 1 2.324-3.25 4 4 0 0 1-.065-.703c0-2.18 1.81-3.952 4.034-3.952q.42 0 .83.087c.638-1.958 2.477-3.347 4.59-3.347a4.826 4.826 0 0 1 4.818 4.35.75.75 0 1 1-1.492.15 3.33 3.33 0 0 0-3.326-3c-1.664 0-3.08 1.252-3.297 2.912a.752.752 0 0 1-1.054.586 2.6 2.6 0 0 0-1.07-.238c-1.396 0-2.533 1.1-2.533 2.452q.001.5.206.965a.75.75 0 0 1-.637 1.051 1.95 1.95 0 0 0-1.828 1.937c0 1.076.876 1.951 1.952 1.951H9.25a.75.75 0 0 1 0 1.5"/></svg>';
11193
11781
  }
11194
11782
 
11195
11783
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-cloud-state-error.js
11196
- var o53 = class extends a10 {
11784
+ var o55 = class extends a10 {
11197
11785
  static get styles() {
11198
11786
  return [t40];
11199
11787
  }
11200
11788
  render() {
11201
11789
  return b`
11202
- <span class="swc-Icon">${o16(e81())}</span>
11790
+ <span class="swc-Icon">${o16(e83())}</span>
11203
11791
  `;
11204
11792
  }
11205
11793
  };
11206
- e25("swc-icon-cloud-state-error", o53);
11794
+ e25("swc-icon-cloud-state-error", o55);
11207
11795
 
11208
11796
  // node_modules/@adobe/spectrum-wc-icons/dist/CloudStateOnline.js
11209
- function e82() {
11797
+ function e84() {
11210
11798
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M9.25 17.002H3.718A3.455 3.455 0 0 1 .266 13.55 3.45 3.45 0 0 1 2.59 10.3a4 4 0 0 1-.065-.703c0-2.18 1.81-3.952 4.034-3.952q.42 0 .83.087c.638-1.959 2.477-3.347 4.59-3.347a4.85 4.85 0 0 1 4.843 4.844q0 .464-.093.92a.745.745 0 0 1-.885.583.75.75 0 0 1-.584-.884q.061-.307.062-.619c0-1.844-1.5-3.344-3.343-3.344-1.664 0-3.08 1.252-3.297 2.912a.752.752 0 0 1-1.054.586 2.6 2.6 0 0 0-1.07-.238c-1.396 0-2.533 1.1-2.533 2.452q.001.5.206.965a.75.75 0 0 1-.637 1.051 1.95 1.95 0 0 0-1.828 1.937c0 1.076.876 1.951 1.952 1.951H9.25a.75.75 0 0 1 0 1.5"/><path fill="var(--swc-icon-color, currentColor)" d="M18.503 13.434a.75.75 0 0 1-.53-.22 4.88 4.88 0 0 0-3.472-1.442h-.006a4.87 4.87 0 0 0-3.462 1.433.75.75 0 1 1-1.06-1.06 6.35 6.35 0 0 1 4.522-1.873h.007c1.712.002 3.32.67 4.531 1.881a.75.75 0 0 1-.53 1.28"/><path fill="var(--swc-icon-color, currentColor)" d="M16.384 15.544a.75.75 0 0 1-.53-.22 1.916 1.916 0 0 0-2.706-.004.75.75 0 1 1-1.06-1.06 3.4 3.4 0 0 1 2.41-.998h.003a3.4 3.4 0 0 1 2.413 1.002.75.75 0 0 1-.53 1.28"/><path fill="var(--swc-icon-color, currentColor)" d="M15.136 17.64a.897.897 0 0 1-1.27.001.9.9 0 1 1 1.27-.001" data-name="Path 1027855"/></svg>';
11211
11799
  }
11212
11800
 
11213
11801
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-cloud-state-online.js
11214
- var o54 = class extends a10 {
11802
+ var o56 = class extends a10 {
11215
11803
  static get styles() {
11216
11804
  return [t40];
11217
11805
  }
11218
11806
  render() {
11219
11807
  return b`
11220
- <span class="swc-Icon">${o16(e82())}</span>
11808
+ <span class="swc-Icon">${o16(e84())}</span>
11221
11809
  `;
11222
11810
  }
11223
11811
  };
11224
- e25("swc-icon-cloud-state-online", o54);
11812
+ e25("swc-icon-cloud-state-online", o56);
11225
11813
 
11226
11814
  // node_modules/@adobe/spectrum-wc-icons/dist/CloudStateSlowConnection.js
11227
- function e83() {
11815
+ function e85() {
11228
11816
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M8.946 16.998H3.718a3.455 3.455 0 0 1-3.452-3.451 3.45 3.45 0 0 1 2.324-3.25 4 4 0 0 1-.065-.703c0-2.18 1.81-3.952 4.034-3.952q.42 0 .83.087c.638-1.958 2.477-3.347 4.59-3.347a4.826 4.826 0 0 1 4.818 4.35.75.75 0 1 1-1.492.15 3.33 3.33 0 0 0-3.326-3c-1.664 0-3.08 1.252-3.297 2.912a.752.752 0 0 1-1.054.586 2.6 2.6 0 0 0-1.07-.238c-1.396 0-2.533 1.1-2.533 2.452q.001.5.206.965a.75.75 0 0 1-.637 1.051 1.95 1.95 0 0 0-1.828 1.937c0 1.076.876 1.951 1.952 1.951h5.228a.75.75 0 0 1 0 1.5M19 16.271v-7a.75.75 0 0 0-1.5 0v7a.75.75 0 0 0 1.5 0m-3 0v-5a.75.75 0 0 0-1.5 0v5a.75.75 0 0 0 1.5 0"/><path fill="var(--swc-icon-color, currentColor)" d="M13 16.271v-3a.75.75 0 0 0-1.5 0v3a.75.75 0 0 0 1.5 0"/></svg>';
11229
11817
  }
11230
11818
 
11231
11819
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-cloud-state-slow-connection.js
11232
- var o55 = class extends a10 {
11820
+ var o57 = class extends a10 {
11233
11821
  static get styles() {
11234
11822
  return [t40];
11235
11823
  }
11236
11824
  render() {
11237
11825
  return b`
11238
11826
  <span class="swc-Icon">
11239
- ${o16(e83())}
11827
+ ${o16(e85())}
11240
11828
  </span>
11241
11829
  `;
11242
11830
  }
11243
11831
  };
11244
- e25("swc-icon-cloud-state-slow-connection", o55);
11245
-
11246
- // node_modules/@adobe/spectrum-wc-icons/dist/Copy.js
11247
- function e84() {
11248
- return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M11.75 18h-7.5C3.01 18 2 16.99 2 15.75v-7.5C2 7.01 3.01 6 4.25 6a.75.75 0 0 1 0 1.5.75.75 0 0 0-.75.75v7.5c0 .413.337.75.75.75h7.5c.413 0 .75-.337.75-.75a.75.75 0 0 1 1.5 0c0 1.24-1.01 2.25-2.25 2.25m-5-13A.75.75 0 0 1 6 4.25C6 3.01 7.01 2 8.25 2a.75.75 0 0 1 0 1.5.75.75 0 0 0-.75.75.75.75 0 0 1-.75.75M13 3.5h-2A.75.75 0 0 1 11 2h2a.75.75 0 0 1 0 1.5"/><path fill="var(--swc-icon-color, currentColor)" d="M13 14h-2a.75.75 0 0 1 0-1.5h2a.75.75 0 0 1 0 1.5m2.75 0a.75.75 0 0 1 0-1.5c.413 0 .75-.337.75-.75a.75.75 0 0 1 1.5 0c0 1.24-1.01 2.25-2.25 2.25m1.5-9a.75.75 0 0 1-.75-.75.75.75 0 0 0-.75-.75.75.75 0 0 1 0-1.5C16.99 2 18 3.01 18 4.25a.75.75 0 0 1-.75.75m0 4.75A.75.75 0 0 1 16.5 9V7A.75.75 0 0 1 18 7v2a.75.75 0 0 1-.75.75m-10.5 0A.75.75 0 0 1 6 9V7a.75.75 0 0 1 1.5 0v2a.75.75 0 0 1-.75.75M8.25 14C7.01 14 6 12.99 6 11.75a.75.75 0 0 1 1.5 0c0 .413.337.75.75.75a.75.75 0 0 1 0 1.5"/></svg>';
11249
- }
11250
-
11251
- // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-copy.js
11252
- var o56 = class extends a10 {
11253
- static get styles() {
11254
- return [t40];
11255
- }
11256
- render() {
11257
- return b`
11258
- <span class="swc-Icon">${o16(e84())}</span>
11259
- `;
11260
- }
11261
- };
11262
- e25("swc-icon-copy", o56);
11832
+ e25("swc-icon-cloud-state-slow-connection", o57);
11263
11833
 
11264
11834
  // node_modules/@adobe/spectrum-wc-icons/dist/InfoCircle.js
11265
- function e85() {
11835
+ function e86() {
11266
11836
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M10 18.75c-4.825 0-8.75-3.925-8.75-8.75S5.175 1.25 10 1.25s8.75 3.925 8.75 8.75-3.925 8.75-8.75 8.75m0-16c-3.998 0-7.25 3.252-7.25 7.25s3.252 7.25 7.25 7.25 7.25-3.252 7.25-7.25S13.998 2.75 10 2.75"/><path fill="var(--swc-icon-color, currentColor)" d="M10 5.26a.9.9 0 0 1 .627.229c.33.365.33.921 0 1.286a.87.87 0 0 1-.626.235.85.85 0 0 1-.633-.248.86.86 0 0 1-.242-.627.88.88 0 0 1 .228-.64A.86.86 0 0 1 10 5.26m0 9.803a.75.75 0 0 1-.75-.75V9.478a.75.75 0 0 1 1.5 0v4.835a.75.75 0 0 1-.75.75"/></svg>';
11267
11837
  }
11268
11838
 
11269
11839
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-info-circle.js
11270
- var o57 = class extends a10 {
11840
+ var o58 = class extends a10 {
11271
11841
  static get styles() {
11272
11842
  return [t40];
11273
11843
  }
11274
11844
  render() {
11275
11845
  return b`
11276
- <span class="swc-Icon">${o16(e85())}</span>
11846
+ <span class="swc-Icon">${o16(e86())}</span>
11277
11847
  `;
11278
11848
  }
11279
11849
  };
11280
- e25("swc-icon-info-circle", o57);
11850
+ e25("swc-icon-info-circle", o58);
11281
11851
 
11282
11852
  // node_modules/@adobe/spectrum-wc-icons/dist/Visibility.js
11283
- function e86() {
11853
+ function e87() {
11284
11854
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M10.034 16.662C5.143 16.662.75 12.273.75 10.2c0-1.685 2.598-4.55 5.347-5.898A8.95 8.95 0 0 1 9.99 3.35c5.158 0 9.26 4.919 9.26 6.85 0 2.072-4.36 6.46-9.216 6.46M10 4.85a7.44 7.44 0 0 0-3.24.797C4.155 6.923 2.25 9.397 2.25 10.2c0 1.144 3.68 4.96 7.784 4.96 4.069 0 7.716-3.816 7.716-4.96 0-1.05-3.481-5.35-7.75-5.35m-3.569.124h.01z"/><path fill="var(--swc-icon-color, currentColor)" d="M9.83 7.644c.222-.637-.474-1.26-1.1-1.01a3.5 3.5 0 0 0-1.283.88 3.565 3.565 0 0 0 4.697 5.315 3.54 3.54 0 0 0 1.317-1.833c.209-.684-.458-1.25-1.119-.976A1.904 1.904 0 0 1 9.85 8.943a1.88 1.88 0 0 1-.02-1.3"/></svg>';
11285
11855
  }
11286
11856
 
11287
11857
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-visibility.js
11288
- var o58 = class extends a10 {
11858
+ var o59 = class extends a10 {
11289
11859
  static get styles() {
11290
11860
  return [t40];
11291
11861
  }
11292
11862
  render() {
11293
11863
  return b`
11294
- <span class="swc-Icon">${o16(e86())}</span>
11864
+ <span class="swc-Icon">${o16(e87())}</span>
11295
11865
  `;
11296
11866
  }
11297
11867
  };
11298
- e25("swc-icon-visibility", o58);
11868
+ e25("swc-icon-visibility", o59);
11299
11869
 
11300
11870
  // node_modules/@adobe/spectrum-wc-icons/dist/VisibilityOff.js
11301
- function e87() {
11871
+ function e88() {
11302
11872
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M9.966 16.683C5.11 16.683.75 12.294.75 10.222c0-.92.864-2.36 2.201-3.668A.75.75 0 1 1 4 7.626c-1.31 1.281-1.75 2.32-1.75 2.596 0 1.144 3.647 4.96 7.716 4.96a7.3 7.3 0 0 0 1.863-.251.756.756 0 0 1 .917.534c.106.4-.134.81-.534.917-.756.2-1.512.3-2.246.3m6.638-2.839a.75.75 0 0 1-.506-1.304c1.14-1.042 1.652-1.982 1.652-2.317 0-.802-1.904-3.277-4.51-4.552a7.4 7.4 0 0 0-3.25-.798 7 7 0 0 0-1.905.28.75.75 0 1 1-.416-1.441A8.4 8.4 0 0 1 10 3.371a8.95 8.95 0 0 1 3.907.954c2.742 1.343 5.343 4.21 5.343 5.896 0 .919-.8 2.199-2.14 3.424a.75.75 0 0 1-.506.197"/><path fill="var(--swc-icon-color, currentColor)" d="m18.78 17.741-5.778-5.778c.204-.296.358-.615.46-.946.208-.684-.46-1.25-1.12-.976-.495.206-.946.14-1.18.081L9.788 8.75a1.9 1.9 0 0 1 .04-1.085c.223-.637-.473-1.26-1.1-1.01a3.5 3.5 0 0 0-.677.358L2.28 1.241a.75.75 0 1 0-1.06 1.06l16.5 16.5a.747.747 0 0 0 1.06 0 .75.75 0 0 0 0-1.06M8.205 12.998a3.53 3.53 0 0 0 2.319.484L6.542 9.501a3.56 3.56 0 0 0 1.663 3.497"/></svg>';
11303
11873
  }
11304
11874
 
11305
11875
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-visibility-off.js
11306
- var o59 = class extends a10 {
11876
+ var o60 = class extends a10 {
11307
11877
  static get styles() {
11308
11878
  return [t40];
11309
11879
  }
11310
11880
  render() {
11311
11881
  return b`
11312
- <span class="swc-Icon">${o16(e87())}</span>
11882
+ <span class="swc-Icon">${o16(e88())}</span>
11313
11883
  `;
11314
11884
  }
11315
11885
  };
11316
- e25("swc-icon-visibility-off", o59);
11886
+ e25("swc-icon-visibility-off", o60);
11317
11887
 
11318
11888
  // node_modules/@adobe/spectrum-wc/dist/link.css
11319
11889
  var link_default = '/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n * Standalone link presentation for native `<a href>` elements.\n *\n * Default anchor appearance inside `.swc-Typography--prose` and\n * `.swc-Typography--links` ships with `typography.css` (generated). Import this\n * stylesheet when authors need explicit BEM modifiers on anchors.\n *\n */\n\n.swc-Link {\n inline-size: -moz-fit-content;\n inline-size: fit-content;\n font-family: var(--swc-sans-font-family-stack);\n font-size: var(--swc-font-size-100);\n font-style: normal;\n font-weight: 400;\n line-height: 1.30;\n color: var(--swc-link-text-color-default, var(--swc-accent-color-900));\n -webkit-text-decoration: underline;\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 1px;\n transition: color 130ms ease-in-out;\n\n &:hover {\n color: var(--swc-link-text-color-hover, var(--swc-accent-color-1000));\n }\n\n &:active {\n color: var(--swc-link-text-color-down, var(--swc-accent-color-1000));\n }\n\n &:focus-visible {\n color: var(--swc-link-text-color-focus, var(--swc-accent-color-1000));\n border-radius: 4px;\n outline: 2px solid var(--swc-link-focus-indicator-color, var(--swc-blue-800));\n outline-offset: 2px;\n }\n\n &:lang(ja),\n &:lang(zh),\n &:lang(ko) {\n line-height: 1.50;\n }\n}\n\n.swc-Link--standalone {\n font-weight: 500;\n}\n\n.swc-Link--secondary {\n --swc-link-text-color-default: var(--swc-gray-800);\n --swc-link-text-color-hover: var(--swc-gray-900);\n --swc-link-text-color-down: var(--swc-gray-900);\n --swc-link-text-color-focus: var(--swc-gray-900);\n}\n\n.swc-Link--staticWhite {\n --swc-link-text-color-default: var(--swc-white);\n --swc-link-text-color-hover: var(--swc-white);\n --swc-link-text-color-down: var(--swc-white);\n --swc-link-text-color-focus: var(--swc-white);\n --swc-link-focus-indicator-color: var(--swc-white);\n}\n\n.swc-Link--staticBlack {\n --swc-link-text-color-default: var(--swc-black);\n --swc-link-text-color-hover: var(--swc-black);\n --swc-link-text-color-down: var(--swc-black);\n --swc-link-text-color-focus: var(--swc-black);\n --swc-link-focus-indicator-color: var(--swc-black);\n}\n\n.swc-Link--quiet.swc-Link--standalone {\n -webkit-text-decoration: none;\n text-decoration: none;\n}\n\n.swc-Link--quiet.swc-Link--standalone:hover {\n -webkit-text-decoration: underline;\n text-decoration: underline;\n}\n';
@@ -11986,76 +12556,6 @@ function qrCode(text2, label) {
11986
12556
  return b`<svg class="qr" viewBox="0 0 ${size4} ${size4}" role="img" aria-label=${label} shape-rendering="crispEdges" data-qr><rect width=${size4} height=${size4} fill="#fff"></rect><path d=${path} fill="#000"></path></svg>`;
11987
12557
  }
11988
12558
 
11989
- // src/app/reach.ts
11990
- var command = "curl -fsSL https://get.sliccy.ai/slicc | sh";
11991
- var startCommand = "slicc";
11992
- var nodeCommand = "npx sliccy@next";
11993
- var reachStyles = i`
11994
- .command {
11995
- display: flex;
11996
- align-items: center;
11997
- gap: var(--swc-spacing-100);
11998
- padding: var(--swc-spacing-75) var(--swc-spacing-75) var(--swc-spacing-75) var(--swc-spacing-200);
11999
- border-radius: var(--swc-corner-radius-medium-default);
12000
- background: var(--swc-background-layer-1-color);
12001
- }
12002
- code {
12003
- flex: 1;
12004
- min-width: 0;
12005
- overflow-wrap: break-word;
12006
- word-break: normal;
12007
- font-family: var(--swc-code-font-family-stack);
12008
- font-size: var(--swc-font-size-75);
12009
- color: var(--swc-code-color);
12010
- user-select: all;
12011
- }
12012
- .commands {
12013
- display: grid;
12014
- gap: var(--swc-spacing-100);
12015
- }
12016
- .commands p {
12017
- margin: 0;
12018
- font-size: var(--swc-font-size-75);
12019
- color: var(--swc-neutral-subdued-content-color-default);
12020
- }
12021
- `;
12022
- function block(text2, copied, copy, first2 = false) {
12023
- const done2 = copied === text2;
12024
- return b`<div class="command" data-command=${text2}>
12025
- <code>${breakable(text2)}</code>
12026
- <swc-action-button size="s" quiet data-action=${first2 ? "copy-command" : A} accessible-label=${done2 ? "Copied" : `Copy ${text2}`} @click=${() => copy(text2)}>
12027
- <swc-icon-copy slot="icon"></swc-icon-copy>${done2 ? "Copied" : "Copy"}
12028
- </swc-action-button>
12029
- </div>`;
12030
- }
12031
- function breakable(text2) {
12032
- return text2.split("/").map(
12033
- (part2, index, parts2) => b`${part2}${index < parts2.length - 1 ? b`/<wbr />` : A}`
12034
- );
12035
- }
12036
- function reach({ intro, extensionUrl, copied, uncopied, copy }) {
12037
- return b`<p>${intro}</p>
12038
- ${extensionUrl ? b`<p><a class="swc-Link" href=${extensionUrl} target="_blank" rel="noopener noreferrer" data-action="install-extension">Install the Chrome extension</a></p>` : A}
12039
- <p>To run slicc, enter this in a terminal:</p>
12040
- <div class="commands">
12041
- ${block(command, copied, copy, true)}
12042
- ${block(startCommand, copied, copy)}
12043
- </div>
12044
- <div class="commands" data-commands="node">
12045
- <p>With Node:</p>
12046
- ${block(nodeCommand, copied, copy)}
12047
- </div>
12048
- ${uncopied ? b`<div class="error" role="alert" data-error="copy"><swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle><span>Couldn’t copy. Select the command and copy it.</span></div>` : A}`;
12049
- }
12050
- async function copyText(text2) {
12051
- try {
12052
- await globalThis.navigator.clipboard.writeText(text2);
12053
- return true;
12054
- } catch {
12055
- return false;
12056
- }
12057
- }
12058
-
12059
12559
  // src/app/tray.ts
12060
12560
  var connectionVariant = {
12061
12561
  live: "positive",
@@ -13296,7 +13796,7 @@ var SliccNetwork = class extends ModelElement {
13296
13796
  };
13297
13797
 
13298
13798
  // src/app/panels.ts
13299
- var surfaces = [
13799
+ var surfaces2 = [
13300
13800
  {
13301
13801
  id: "agents",
13302
13802
  title: "Agents",
@@ -13410,7 +13910,7 @@ function screenClass(width) {
13410
13910
  if (width < 1200) return "tablet";
13411
13911
  return "desktop";
13412
13912
  }
13413
- function surface(id, items = surfaces) {
13913
+ function surface(id, items = surfaces2) {
13414
13914
  return items.find((candidate) => candidate.id === id);
13415
13915
  }
13416
13916
  function create(tag3, model, params = {}) {
@@ -13557,7 +14057,7 @@ function openTerminal(dock, info, screen) {
13557
14057
  }
13558
14058
  return id;
13559
14059
  }
13560
- function defaultLayout(dock, screen, agent, items = surfaces, terminals = []) {
14060
+ function defaultLayout(dock, screen, agent, items = surfaces2, terminals = []) {
13561
14061
  dock.clear();
13562
14062
  const order = ["center", "left", "right"];
13563
14063
  for (const side of order) {
@@ -14488,11 +14988,11 @@ var TerminalPanels = class {
14488
14988
  }
14489
14989
  #ask(info, trigger2) {
14490
14990
  const body4 = "The shell and anything running in it stop. You can\u2019t undo this.";
14491
- const asked = this.#asking.then(
14991
+ const asked2 = this.#asking.then(
14492
14992
  () => confirm({ title: `Close ${info.title}?`, body: body4, action: "Close", trigger: trigger2 })
14493
14993
  );
14494
- this.#asking = asked;
14495
- return asked;
14994
+ this.#asking = asked2;
14995
+ return asked2;
14496
14996
  }
14497
14997
  activated(id) {
14498
14998
  if (terminalOf(id) !== null) this.#recent = id;
@@ -17206,7 +17706,7 @@ ${swc_default}`));
17206
17706
  var t47 = i`:host{display:block}*{box-sizing:border-box}.swc-Divider{--_swc-divider-thickness: var(--swc-divider-thickness, 2px);inline-size:100%;block-size:var(--_swc-divider-thickness);background-color:var(--swc-divider-background-color, var(--swc-gray-200));border-radius:var(--_swc-divider-thickness)}:host([size=\"s\"]){--swc-divider-thickness: 1px}:host([size=\"l\"]){--swc-divider-thickness: 4px;--swc-divider-background-color: var(--swc-gray-800)}.swc-Divider:not(.swc-Divider--vertical){min-inline-size:min(100%,200px)}:host([vertical]){align-self:stretch}.swc-Divider--vertical{inline-size:var(--_swc-divider-thickness);block-size:100%;min-block-size:min(100%,200px)}.swc-Divider--staticWhite{--swc-divider-background-color: rgba(255, 255, 255, .14)}.swc-Divider--staticWhite:where(.swc-Divider--sizeL){--swc-divider-background-color: rgba(255, 255, 255, .85)}.swc-Divider--staticBlack{--swc-divider-background-color: rgba(0, 0, 0, .12)}.swc-Divider--staticBlack:where(.swc-Divider--sizeL){--swc-divider-background-color: rgba(0, 0, 0, .84)}@media(forced-colors:active){.swc-Divider{--swc-divider-background-color: CanvasText}}`;
17207
17707
 
17208
17708
  // node_modules/@adobe/spectrum-wc-core/dist/components/divider/Divider.types.js
17209
- var e88 = [
17709
+ var e89 = [
17210
17710
  "s",
17211
17711
  "m",
17212
17712
  "l"
@@ -17215,7 +17715,7 @@ var t48 = ["white", "black"];
17215
17715
 
17216
17716
  // node_modules/@adobe/spectrum-wc-core/dist/components/divider/Divider.base.js
17217
17717
  var s10;
17218
- var c18 = class extends i12(i9, { validSizes: e88 }) {
17718
+ var c18 = class extends i12(i9, { validSizes: e89 }) {
17219
17719
  constructor(...e120) {
17220
17720
  super(...e120), this.vertical = false;
17221
17721
  }
@@ -17274,7 +17774,7 @@ e25("swc-divider", a13);
17274
17774
  var t49 = i`:host([indeterminate]) .swc-LinearProgress-fill{inline-size:100%;min-inline-size:0;transform-origin:left;transition:none;animation:indeterminate-loop-ltr 1s cubic-bezier(.45,0,.4,1) infinite;will-change:transform;&:dir(rtl){animation-name:indeterminate-loop-rtl}}@keyframes indeterminate-loop-ltr{0%{transform:translate(-70%) scaleX(.7)}to{transform:translate(100%) scaleX(.7)}}@keyframes indeterminate-loop-rtl{0%{transform:translate(100%) scaleX(.7)}to{transform:translate(-70%) scaleX(.7)}}@media(prefers-reduced-motion:reduce){:host([indeterminate]) .swc-LinearProgress-fill{animation-duration:15s;animation-timing-function:linear}}`;
17275
17775
 
17276
17776
  // node_modules/@adobe/spectrum-wc-core/dist/components/progress-bar/ProgressBar.base.js
17277
- var o60 = class extends m3(i12(i9, {
17777
+ var o61 = class extends m3(i12(i9, {
17278
17778
  validSizes: s6,
17279
17779
  defaultSize: "m"
17280
17780
  })) {
@@ -17285,10 +17785,10 @@ var o60 = class extends m3(i12(i9, {
17285
17785
  e24([n({
17286
17786
  type: Boolean,
17287
17787
  reflect: true
17288
- })], o60.prototype, "indeterminate", void 0);
17788
+ })], o61.prototype, "indeterminate", void 0);
17289
17789
 
17290
17790
  // node_modules/@adobe/spectrum-wc/dist/components/progress-bar/ProgressBar.js
17291
- var o61 = class extends o60 {
17791
+ var o62 = class extends o61 {
17292
17792
  static get styles() {
17293
17793
  return [t26, t49];
17294
17794
  }
@@ -17337,7 +17837,7 @@ var o61 = class extends o60 {
17337
17837
  };
17338
17838
 
17339
17839
  // node_modules/@adobe/spectrum-wc/dist/components/progress-bar/swc-progress-bar.js
17340
- e25("swc-progress-bar", o61);
17840
+ e25("swc-progress-bar", o62);
17341
17841
 
17342
17842
  // node_modules/@adobe/spectrum-wc/dist/patterns/ai-toolkit/conversation-turn/conversation-turn.js
17343
17843
  var t50 = i`:host{display:block;inline-size:100%}:host(:focus-visible){outline:none}*,*:before,*:after{box-sizing:border-box}.swc-ConversationTurn{display:flex;inline-size:100%;min-inline-size:0}.swc-ConversationTurn>slot{display:flex;flex-direction:column;gap:8px;inline-size:100%;min-inline-size:0}:host([type=\"user\"]) .swc-ConversationTurn{justify-content:flex-end}:host([type=\"user\"]) .swc-ConversationTurn>slot{align-items:flex-end}:host([type=\"system\"]) .swc-ConversationTurn{justify-content:flex-start}:host([type=\"system\"]) .swc-ConversationTurn>slot{align-items:stretch}:host([type=\"system\"]) ::slotted(*){flex:1 1 100%;min-inline-size:0;max-inline-size:100%}:host(:focus-visible) ::slotted(*){outline:2px solid var(--swc-blue-800);outline-offset:2px}`;
@@ -17380,7 +17880,7 @@ e12([n({
17380
17880
  e25("swc-conversation-turn", a14);
17381
17881
 
17382
17882
  // node_modules/@adobe/spectrum-wc/dist/components/ui-icons/ui-icons.types.js
17383
- var e89 = [
17883
+ var e90 = [
17384
17884
  50,
17385
17885
  75,
17386
17886
  100,
@@ -17400,7 +17900,7 @@ function n29(e120) {
17400
17900
  }
17401
17901
  function r26(t90, r40) {
17402
17902
  if (!t90) return;
17403
- let i26 = n29(r40), a23 = e89.filter((e120) => t90[e120] !== void 0);
17903
+ let i26 = n29(r40), a23 = e90.filter((e120) => t90[e120] !== void 0);
17404
17904
  if (a23.length !== 0) return t90[a23.reduce((e120, t91) => Math.abs(t91 - i26) < Math.abs(e120 - i26) ? t91 : e120)];
17405
17905
  }
17406
17906
 
@@ -18024,7 +18524,7 @@ e12([n({
18024
18524
  e25("swc-ui-icon", l16);
18025
18525
 
18026
18526
  // node_modules/@adobe/spectrum-wc/dist/utils/id.js
18027
- function e90(e120) {
18527
+ function e91(e120) {
18028
18528
  return `${e120}-${Array.from(crypto.getRandomValues(new Uint8Array(4)), (e121) => `0${(e121 & 255).toString(16)}`.slice(-2)).join("")}`;
18029
18529
  }
18030
18530
 
@@ -18034,7 +18534,7 @@ var t65 = i`:host{display:block}*,*:before,*:after{box-sizing:border-box}.swc-Me
18034
18534
  // node_modules/@adobe/spectrum-wc/dist/patterns/ai-toolkit/message-sources/MessageSources.js
18035
18535
  var c19 = class extends i9 {
18036
18536
  constructor(...e120) {
18037
- super(...e120), this.panelId = e90("swc-sources-panel"), this.toggleId = e90("swc-message-sources-toggle"), this.sourceLinks = [], this.open = false, this.label = "Sources", this.accessibleLabel = "";
18537
+ super(...e120), this.panelId = e91("swc-sources-panel"), this.toggleId = e91("swc-message-sources-toggle"), this.sourceLinks = [], this.open = false, this.label = "Sources", this.accessibleLabel = "";
18038
18538
  }
18039
18539
  static get styles() {
18040
18540
  return [t65];
@@ -18169,7 +18669,7 @@ var a15 = () => b`
18169
18669
  <circle cx="4" cy="4" r="4" fill="currentColor" />
18170
18670
  </svg>
18171
18671
  `;
18172
- var o62 = () => b`
18672
+ var o63 = () => b`
18173
18673
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 8">
18174
18674
  <circle cx="4" cy="4" r="3.5" fill="none" stroke="currentColor" />
18175
18675
  </svg>
@@ -18229,7 +18729,7 @@ var h6 = class extends i9 {
18229
18729
  return this._readLabel();
18230
18730
  }
18231
18731
  constructor() {
18232
- super(), this._toggleId = e90("swc-response-status-step-toggle"), this._detailId = e90("swc-response-status-step-detail"), this.status = "active", this.open = false, this._hasDescription = false, this._labelText = "", this._overflows = false, this._lastActiveLabel = "", new t2(this, {
18732
+ super(), this._toggleId = e91("swc-response-status-step-toggle"), this._detailId = e91("swc-response-status-step-detail"), this.status = "active", this.open = false, this._hasDescription = false, this._labelText = "", this._overflows = false, this._lastActiveLabel = "", new t2(this, {
18233
18733
  config: {
18234
18734
  attributes: true,
18235
18735
  attributeFilter: ["slot"],
@@ -18312,7 +18812,7 @@ var h6 = class extends i9 {
18312
18812
  class="swc-ResponseStatusStep-icon swc-ResponseStatusStep-icon--active"
18313
18813
  aria-hidden="true"
18314
18814
  >
18315
- ${o62()}
18815
+ ${o63()}
18316
18816
  </swc-icon>
18317
18817
  `);
18318
18818
  }
@@ -18386,7 +18886,7 @@ e12([n({
18386
18886
  e25("swc-response-status-step", h6);
18387
18887
 
18388
18888
  // node_modules/@adobe/spectrum-wc/dist/patterns/ai-toolkit/pixel-loader/data.js
18389
- function e91(e120, t90) {
18889
+ function e92(e120, t90) {
18390
18890
  let n37 = Array.from(new Set(e120.map(([, e121]) => e121))).sort((e121, t91) => t91 - e121), r40 = Array(e120.length).fill(0), i26 = 0;
18391
18891
  return n37.forEach((n38) => {
18392
18892
  let a23 = e120.reduce((e121, t91, r41) => (t91[1] === n38 && e121.push(r41), e121), []);
@@ -18396,7 +18896,7 @@ function e91(e120, t90) {
18396
18896
  }), r40;
18397
18897
  }
18398
18898
  function t68(t90, n37 = {}) {
18399
- let { staggerInterval: r40 = 2, rowOffset: i26 = 0 } = n37, a23 = e91(t90, r40);
18899
+ let { staggerInterval: r40 = 2, rowOffset: i26 = 0 } = n37, a23 = e92(t90, r40);
18400
18900
  return t90.map(([e120, t91], n38) => ({
18401
18901
  col: e120,
18402
18902
  row: t91 + i26,
@@ -18539,7 +19039,7 @@ var a16 = t68([
18539
19039
  [5, 0],
18540
19040
  [6, 0]
18541
19041
  ], { staggerInterval: 1 });
18542
- var o63 = t68([
19042
+ var o64 = t68([
18543
19043
  [6, 6],
18544
19044
  [5, 5],
18545
19045
  [1, 4],
@@ -19094,7 +19594,7 @@ var N = {
19094
19594
  brush: r30,
19095
19595
  eye: i19,
19096
19596
  hourglass: a16,
19097
- mag: o63,
19597
+ mag: o64,
19098
19598
  crop: s12,
19099
19599
  flower: c21,
19100
19600
  image: l17,
@@ -19185,13 +19685,13 @@ var F = {
19185
19685
  };
19186
19686
 
19187
19687
  // node_modules/@adobe/spectrum-wc/dist/patterns/ai-toolkit/pixel-loader/animation.js
19188
- var e92 = 30;
19189
- var t69 = (t90) => t90 * e92 / 1e3;
19688
+ var e93 = 30;
19689
+ var t69 = (t90) => t90 * e93 / 1e3;
19190
19690
  var n32 = 13;
19191
19691
  var r31 = 12;
19192
19692
  var i20 = t69(1400);
19193
19693
  var a17 = t69(150);
19194
- var o64 = t69(150);
19694
+ var o65 = t69(150);
19195
19695
  var s13 = 0.1;
19196
19696
  var c22 = t69(230);
19197
19697
  var l18 = 0.3;
@@ -19218,7 +19718,7 @@ function v8(e120) {
19218
19718
  return t90 + n32 + i20 + r31;
19219
19719
  }
19220
19720
  function y4(t90) {
19221
- return v8(t90) / e92 * 1e3;
19721
+ return v8(t90) / e93 * 1e3;
19222
19722
  }
19223
19723
  function b8(e120, t90) {
19224
19724
  return Math.min(1, Math.max(0, e120 / t90));
@@ -19263,7 +19763,7 @@ function S2(e120, t90) {
19263
19763
  }), x3(o91);
19264
19764
  }
19265
19765
  function C3(e120, t90) {
19266
- let i26 = e120.stagger + n32 - o64, u27 = i26 - a17, d22 = _4(e120), f11 = d22 + c22;
19766
+ let i26 = e120.stagger + n32 - o65, u27 = i26 - a17, d22 = _4(e120), f11 = d22 + c22;
19267
19767
  return x3([
19268
19768
  {
19269
19769
  offset: 0,
@@ -19335,7 +19835,7 @@ function k2(e120) {
19335
19835
  return t90 + E2 + D3 + t90 + E2;
19336
19836
  }
19337
19837
  function A4(t90) {
19338
- return k2(t90) / e92 * 1e3;
19838
+ return k2(t90) / e93 * 1e3;
19339
19839
  }
19340
19840
  function j2(e120, t90, n37) {
19341
19841
  let r40 = O2(t90), i26 = r40.indexOf(e120.row), a23 = (r40.length - 1) * T4 + E2, o91 = i26 * T4, s19 = a23 + D3 + i26 * T4;
@@ -19374,9 +19874,9 @@ function j2(e120, t90, n37) {
19374
19874
  var M2 = "0 0px";
19375
19875
 
19376
19876
  // node_modules/@adobe/spectrum-wc/dist/patterns/ai-toolkit/pixel-loader/geometry.js
19377
- var e93 = /* @__PURE__ */ new WeakMap();
19877
+ var e94 = /* @__PURE__ */ new WeakMap();
19378
19878
  function t70(t90) {
19379
- let n37 = e93.get(t90);
19879
+ let n37 = e94.get(t90);
19380
19880
  if (n37) return n37;
19381
19881
  let r40 = new Set(t90.map((e120) => `${e120.col},${e120.row}`)), i26 = (e120, t91) => r40.has(`${e120},${t91}`), a23 = t90.map(({ col: e120, row: t91 }) => {
19382
19882
  let n38 = i26(e120 - 1, t91), r41 = i26(e120 + 1, t91), a24 = i26(e120, t91 - 1), o91 = i26(e120, t91 + 1), s19 = i26(e120 - 1, t91 - 1), c28 = i26(e120 + 1, t91 - 1), l24 = i26(e120 + 1, t91 + 1), u27 = i26(e120 - 1, t91 + 1);
@@ -19387,7 +19887,7 @@ function t70(t90) {
19387
19887
  bottomLeft: !n38 && !o91 && !u27
19388
19888
  };
19389
19889
  });
19390
- return e93.set(t90, a23), a23;
19890
+ return e94.set(t90, a23), a23;
19391
19891
  }
19392
19892
  function n33(e120, t90) {
19393
19893
  return `${e120.topLeft ? t90 : "0"} ${e120.topRight ? t90 : "0"} ${e120.bottomRight ? t90 : "0"} ${e120.bottomLeft ? t90 : "0"}`;
@@ -19399,7 +19899,7 @@ var t71 = i`:host{display:inline-block}*,*:before,*:after{box-sizing:border-box}
19399
19899
  // node_modules/@adobe/spectrum-wc/dist/patterns/ai-toolkit/pixel-loader/PixelLoader.js
19400
19900
  var w4;
19401
19901
  var T5 = "https://spectrum-web-components.adobe.com/?path=/docs/patterns-ai-toolkit-pixel-loader--docs";
19402
- var E3 = class e94 extends i9 {
19902
+ var E3 = class e95 extends i9 {
19403
19903
  constructor(...e120) {
19404
19904
  super(...e120), this.icon = "aiLogo", this.paused = false, this.label = "Loading", this._presetIndex = 0, this._animations = [], this._containerCache = null, this._cellElsCache = null, this._ticker = null, this._reducedMotionQuery = null, this._displayedIcon = "aiLogo", this._finishToken = 0, this._handleReducedMotionChange = () => {
19405
19905
  this._syncTicker(), this._playCells();
@@ -19502,8 +20002,8 @@ var E3 = class e94 extends i9 {
19502
20002
  }
19503
20003
  }), this._cancelAnimations();
19504
20004
  let i26 = {
19505
- duration: e94.FINISH_MS,
19506
- easing: e94.EASE_FINISH,
20005
+ duration: e95.FINISH_MS,
20006
+ easing: e95.EASE_FINISH,
19507
20007
  fill: "forwards"
19508
20008
  }, a23 = n37.map((e120) => e120.animate([{
19509
20009
  translate: M2,
@@ -19553,7 +20053,7 @@ var E3 = class e94 extends i9 {
19553
20053
  style=${o3({
19554
20054
  "grid-column": String(t90.col + 1),
19555
20055
  "grid-row": String(t90.row + 1),
19556
- "border-radius": n33(n37, e94.CORNER_RADIUS)
20056
+ "border-radius": n33(n37, e95.CORNER_RADIUS)
19557
20057
  })}
19558
20058
  ></div>
19559
20059
  `;
@@ -19594,12 +20094,12 @@ var y5 = [
19594
20094
  "complete",
19595
20095
  "stopped"
19596
20096
  ];
19597
- var b9 = class e95 extends i9 {
20097
+ var b9 = class e96 extends i9 {
19598
20098
  static get styles() {
19599
20099
  return [t72];
19600
20100
  }
19601
20101
  constructor() {
19602
- super(), this.panelId = e90("swc-response-status-panel"), this._hasSteps = false, this._hasActiveStep = false, this._activeStepLabel = "", this._activeStepEl = null, this._labelSlotText = "", this._displayedLabel = "", this._rollFromLabel = "", this._rollToLabel = "", this._rollActive = false, this._rollEngaged = false, this.status = "active", this.open = false, this.accessibleLabel = "", this.loader = "mega", this._labelRollTimer = null, this._labelRollRaf = null, new t2(this, {
20102
+ super(), this.panelId = e91("swc-response-status-panel"), this._hasSteps = false, this._hasActiveStep = false, this._activeStepLabel = "", this._activeStepEl = null, this._labelSlotText = "", this._displayedLabel = "", this._rollFromLabel = "", this._rollToLabel = "", this._rollActive = false, this._rollEngaged = false, this.status = "active", this.open = false, this.accessibleLabel = "", this.loader = "mega", this._labelRollTimer = null, this._labelRollRaf = null, new t2(this, {
19603
20103
  config: {
19604
20104
  attributes: true,
19605
20105
  attributeFilter: ["status"],
@@ -19717,10 +20217,10 @@ var b9 = class e95 extends i9 {
19717
20217
  if (this._labelSlotText) return this._labelSlotText;
19718
20218
  let t90 = this._resolvedStatus;
19719
20219
  if (t90 === "active") {
19720
- if (this._showsGenericProcessingLabel) return e95.ACTIVE_STEP_OPEN_LABEL;
20220
+ if (this._showsGenericProcessingLabel) return e96.ACTIVE_STEP_OPEN_LABEL;
19721
20221
  if (this._activeStepLabel) return this._activeStepLabel;
19722
20222
  }
19723
- return e95.DEFAULT_LABELS[t90];
20223
+ return e96.DEFAULT_LABELS[t90];
19724
20224
  }
19725
20225
  _clearLabelRollTimers() {
19726
20226
  this._labelRollTimer !== null && (window.clearTimeout(this._labelRollTimer), this._labelRollTimer = null), this._labelRollRaf !== null && (window.cancelAnimationFrame(this._labelRollRaf), this._labelRollRaf = null);
@@ -19749,7 +20249,7 @@ var b9 = class e95 extends i9 {
19749
20249
  this._labelRollRaf = window.requestAnimationFrame(() => {
19750
20250
  this._labelRollRaf = null, this._rollEngaged = true, this._labelRollTimer = window.setTimeout(() => {
19751
20251
  this._labelRollTimer = null, this._displayedLabel = this._rollToLabel, this._rollActive = false, this._rollEngaged = false, this._applyLabelRoll();
19752
- }, e95.LABEL_ROLL_DURATION_MS);
20252
+ }, e96.LABEL_ROLL_DURATION_MS);
19753
20253
  });
19754
20254
  });
19755
20255
  }
@@ -19757,7 +20257,7 @@ var b9 = class e95 extends i9 {
19757
20257
  return this._rollActive ? this._rollToLabel : this._displayedLabel || this._getHeaderLabel();
19758
20258
  }
19759
20259
  _renderLabel() {
19760
- let t90 = e95.STATUS_LABEL_CLASS;
20260
+ let t90 = e96.STATUS_LABEL_CLASS;
19761
20261
  return this._rollActive ? b`
19762
20262
  <span class="swc-ResponseStatus-headerTrailViewport">
19763
20263
  <span class=${this._rollEngaged ? "swc-ResponseStatus-headerTrailCrossfade swc-ResponseStatus-headerTrailCrossfade--engaged" : "swc-ResponseStatus-headerTrailCrossfade"}>
@@ -19873,7 +20373,7 @@ var b9 = class e95 extends i9 {
19873
20373
  `;
19874
20374
  }
19875
20375
  _renderPanel(t90) {
19876
- let n37 = t90 && this.open, r40 = this.accessibleLabel || e95.DEFAULT_ACCESSIBLE_LABEL;
20376
+ let n37 = t90 && this.open, r40 = this.accessibleLabel || e96.DEFAULT_ACCESSIBLE_LABEL;
19877
20377
  return b`
19878
20378
  <div
19879
20379
  id=${this.panelId}
@@ -19938,7 +20438,7 @@ var t73 = i`:host{display:block}*,*:before,*:after{box-sizing:border-box}.swc-Su
19938
20438
  // node_modules/@adobe/spectrum-wc/dist/patterns/ai-toolkit/suggestion/SuggestionGroup.js
19939
20439
  var s14 = class extends i9 {
19940
20440
  constructor(...e120) {
19941
- super(...e120), this.accessibleLabel = "", this._headingId = e90("swc-suggestion-group-heading");
20441
+ super(...e120), this.accessibleLabel = "", this._headingId = e91("swc-suggestion-group-heading");
19942
20442
  }
19943
20443
  static get styles() {
19944
20444
  return [t73];
@@ -20101,29 +20601,11 @@ e12([n({
20101
20601
  e25("swc-user-message", a18);
20102
20602
 
20103
20603
  // node_modules/@adobe/spectrum-wc-icons/dist/Cancel.js
20104
- function e96() {
20604
+ function e97() {
20105
20605
  return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M16.201 16.166A8.72 8.72 0 0 0 18.75 10c0-4.825-3.925-8.75-8.75-8.75a8.72 8.72 0 0 0-6.166 2.549l-.021.014c-.011.007-.008.015-.014.021A8.72 8.72 0 0 0 1.25 10c0 4.825 3.925 8.75 8.75 8.75a8.72 8.72 0 0 0 6.166-2.549c.006-.006.015-.008.021-.014s.008-.015.014-.021M17.25 10c0 1.73-.61 3.317-1.625 4.565L5.435 4.375A7.2 7.2 0 0 1 10 2.75c3.998 0 7.25 3.252 7.25 7.25m-14.5 0c0-1.73.61-3.317 1.625-4.565l10.19 10.19A7.2 7.2 0 0 1 10 17.25c-3.998 0-7.25-3.252-7.25-7.25"/></svg>';
20106
20606
  }
20107
20607
 
20108
20608
  // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-cancel.js
20109
- var o65 = class extends a10 {
20110
- static get styles() {
20111
- return [t40];
20112
- }
20113
- render() {
20114
- return b`
20115
- <span class="swc-Icon">${o16(e96())}</span>
20116
- `;
20117
- }
20118
- };
20119
- e25("swc-icon-cancel", o65);
20120
-
20121
- // node_modules/@adobe/spectrum-wc-icons/dist/ChevronRight.js
20122
- function e97() {
20123
- return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="var(--swc-icon-color, currentColor)" d="M7.75 16.465a.748.748 0 0 1-.54-1.27l4.999-5.197-4.986-5.184a.75.75 0 0 1 .02-1.06.75.75 0 0 1 1.06.021L13.79 9.48c.28.29.28.749 0 1.039l-5.5 5.716a.75.75 0 0 1-.54.23"/></svg>';
20124
- }
20125
-
20126
- // node_modules/@adobe/spectrum-wc-icons/dist/swc-icon-chevron-right.js
20127
20609
  var o66 = class extends a10 {
20128
20610
  static get styles() {
20129
20611
  return [t40];
@@ -20134,7 +20616,7 @@ var o66 = class extends a10 {
20134
20616
  `;
20135
20617
  }
20136
20618
  };
20137
- e25("swc-icon-chevron-right", o66);
20619
+ e25("swc-icon-cancel", o66);
20138
20620
 
20139
20621
  // node_modules/@adobe/spectrum-wc-icons/dist/File.js
20140
20622
  function e98() {
@@ -20305,11 +20787,11 @@ function run(lines, start, test) {
20305
20787
  return end;
20306
20788
  }
20307
20789
  var itemPattern = /^(\s*)([-*]|\d+\.)\s+(.*)$/;
20308
- function indent(line) {
20790
+ function indent2(line) {
20309
20791
  return line.match(/^\s*/)?.[0].length ?? 0;
20310
20792
  }
20311
20793
  function list2(lines) {
20312
- const base = indent(lines[0]);
20794
+ const base = indent2(lines[0]);
20313
20795
  const ordered2 = /^\s*\d+\./.test(lines[0]);
20314
20796
  const items = [];
20315
20797
  let i26 = 0;
@@ -20321,7 +20803,7 @@ function list2(lines) {
20321
20803
  i26++;
20322
20804
  continue;
20323
20805
  }
20324
- const end = run(lines, i26 + 1, (line) => indent(line) > base);
20806
+ const end = run(lines, i26 + 1, (line) => indent2(line) > base);
20325
20807
  let child = i26 + 1;
20326
20808
  let text2 = match[3];
20327
20809
  while (child < end && !itemPattern.test(lines[child])) text2 += ` ${lines[child++].trim()}`;
@@ -20361,7 +20843,7 @@ function block2(lines, i26) {
20361
20843
  const end2 = run(
20362
20844
  lines,
20363
20845
  i26,
20364
- (l24) => itemPattern.test(l24) || l24.trim() !== "" && indent(l24) > indent(line)
20846
+ (l24) => itemPattern.test(l24) || l24.trim() !== "" && indent2(l24) > indent2(line)
20365
20847
  );
20366
20848
  return [list2(lines.slice(i26, end2)), end2];
20367
20849
  }
@@ -20787,20 +21269,20 @@ function attachment(item2) {
20787
21269
  <span slot="subtitle" class="size">${detail}</span>
20788
21270
  </swc-user-message>`;
20789
21271
  }
20790
- var deliveries = { steer: "Steered", "follow-up": "Follow-up" };
21272
+ function when(at, title = "") {
21273
+ return b`<time class="when" datetime=${new Date(at).toISOString()} title=${title || A}>${time(at)}</time>`;
21274
+ }
20791
21275
  function user(message) {
20792
21276
  const delivered = message.delivered ?? (message.mode === "steer" ? "steer" : void 0);
20793
- const tag3 = delivered === "steer" || delivered === "follow-up" ? deliveries[delivered] : null;
20794
21277
  const agent = message.origin === "agent";
20795
21278
  const name = message.from ?? "an agent";
20796
- const who2 = agent ? name : message.from ? `From ${message.from}` : "You";
21279
+ const who2 = agent ? name : message.from ? `From ${message.from}` : "";
20797
21280
  const label = agent ? `Request from ${name}` : message.from ? `Message from ${message.from}` : "Your message";
20798
21281
  return b`<swc-conversation-turn type="user" class="message user" accessible-label=${label} data-id=${message.id} data-mode=${message.mode ?? "send"} data-delivered=${delivered ?? "run"} data-origin=${message.origin ?? "user"}>
20799
21282
  <div class="bubble">
20800
21283
  <div class="meta">
20801
- <span class="who">${who2}</span><span>${time(message.createdAt)}</span>
21284
+ ${who2 ? b`<span class="who">${who2}</span>` : A}${when(message.createdAt)}
20802
21285
  ${agent ? b`<swc-badge class="origin" size="s" variant="indigo">Agent</swc-badge>` : A}
20803
- ${tag3 ? b`<swc-badge class="tag" size="s" variant=${delivered === "steer" ? "notice" : "informative"} subtle>${tag3}</swc-badge>` : A}
20804
21286
  </div>
20805
21287
  ${message.text ? b`<swc-user-message class="body"><span class="text">${message.text}</span></swc-user-message>` : A}
20806
21288
  ${message.attachments?.length ? b`<div class="attachments">${message.attachments.map(attachment)}</div>` : A}
@@ -20839,8 +21321,8 @@ function assistant(message, name, model, handlers, showThinking, suggestion = nu
20839
21321
  return b`<swc-conversation-turn type="system" class="message assistant" accessible-label=${`Reply from ${name}`} data-id=${message.id} data-status=${message.status}>
20840
21322
  <div class="reply">
20841
21323
  <div class="meta">
20842
- <span class="who">${name}</span><span>${time(message.createdAt)}</span>
20843
- ${model ? b`<span title=${usage}>${model}</span>` : A}
21324
+ ${when(message.createdAt, model ? "" : usage)}
21325
+ ${model ? b`<span class="model" title=${usage}>${model}</span>` : A}
20844
21326
  ${message.status === "error" ? b`<swc-badge class="tag" size="s" variant="negative" subtle><swc-icon-alert-diamond slot="icon" size="s" aria-hidden="true"></swc-icon-alert-diamond>Failed</swc-badge>` : A}
20845
21327
  </div>
20846
21328
  <swc-system-message>
@@ -22321,7 +22803,7 @@ var SliccApp = class extends ThemedElement {
22321
22803
  constructor() {
22322
22804
  super();
22323
22805
  this.screen = screenClass(globalThis.innerWidth ?? 1280);
22324
- this.surfaces = surfaces;
22806
+ this.surfaces = surfaces2;
22325
22807
  }
22326
22808
  static styles = [
22327
22809
  theme,
@@ -22550,9 +23032,14 @@ var SliccApp = class extends ThemedElement {
22550
23032
  }
22551
23033
  subscribe(model) {
22552
23034
  const update = () => this.requestUpdate();
23035
+ const settle2 = () => settleModels(model);
23036
+ queueMicrotask(settle2);
22553
23037
  return [
22554
23038
  ...super.subscribe(model),
23039
+ model.settings.on("settings", settle2),
23040
+ model.settings.on("accounts", settle2),
22555
23041
  model.agent.on("agents", () => {
23042
+ settle2();
22556
23043
  this.#prune();
22557
23044
  update();
22558
23045
  }),
@@ -22577,6 +23064,7 @@ var SliccApp = class extends ThemedElement {
22577
23064
  ...model.tabs ? [model.tabs.on("tabs", update)] : [],
22578
23065
  ...model.follow ? [
22579
23066
  model.follow.on("follow", () => {
23067
+ settle2();
22580
23068
  this.#followed(model);
22581
23069
  update();
22582
23070
  })
@@ -22972,7 +23460,7 @@ var SliccApp = class extends ThemedElement {
22972
23460
  return Boolean(cone && !cone.frozen && this.model?.agent.freeze && !watchOnly(this.model));
22973
23461
  }
22974
23462
  #creatable() {
22975
- return Boolean(this.model?.agent.createCone) && !watchOnly(this.model);
23463
+ return creatable(this.model);
22976
23464
  }
22977
23465
  #cone() {
22978
23466
  const agent = this.#active();
@@ -23005,22 +23493,7 @@ var SliccApp = class extends ThemedElement {
23005
23493
  this.renderRoot.querySelector("header sp-picker")?.focus();
23006
23494
  }
23007
23495
  async #newCone(trigger2) {
23008
- const port = this.model?.agent;
23009
- const create3 = port?.createCone?.bind(port);
23010
- if (!port || !create3) return;
23011
- let created;
23012
- await prompt({
23013
- title: "New cone",
23014
- label: "Name",
23015
- action: "Create",
23016
- trigger: trigger2,
23017
- submit: async (name) => {
23018
- if (watchOnly(this.model)) return;
23019
- created = await create3(name);
23020
- }
23021
- });
23022
- if (!created) return;
23023
- port.select(created.id);
23496
+ if (!await createCone(this.model, trigger2)) return;
23024
23497
  await this.updateComplete;
23025
23498
  this.renderRoot.querySelector("header sp-picker")?.focus();
23026
23499
  }
@@ -23343,12 +23816,12 @@ function scan2(words, cwds, whole) {
23343
23816
  }
23344
23817
  return null;
23345
23818
  }
23346
- function secretRules(approval) {
23347
- if (approval.command.length > 4096) return `${approval.command.slice(0, 40)}\u2026`;
23348
- const start = absolute("/", approval.cwd ?? "/");
23819
+ function reach2(command3, cwd) {
23820
+ if (command3.length > 4096) return `${command3.slice(0, 40)}\u2026`;
23821
+ const start = absolute("/", cwd ?? "/");
23349
23822
  if (protects(start, false)) return start;
23350
23823
  const cwds = /* @__PURE__ */ new Set([start]);
23351
- const text2 = unglob(ansi(approval.command.replace(/\\\n/g, "")));
23824
+ const text2 = unglob(ansi(command3.replace(/\\\n/g, "")));
23352
23825
  const plain = text2.split(separators).map((segment2) => commas(segment2.split(/[\s<>=]+/).map((word) => word.replace(/['"\\]/g, ""))));
23353
23826
  const aware = shield(text2).split(separators).map((segment2) => commas(quoted(unshield(segment2))));
23354
23827
  const segments = JSON.stringify(aware) === JSON.stringify(plain) ? plain : [...plain, ...aware];
@@ -23363,6 +23836,14 @@ function secretRules(approval) {
23363
23836
  if (home2) return home2;
23364
23837
  return segments.flat().some((word) => word.includes("$")) || text2.includes("`") ? text2.match(expansion)[0] : null;
23365
23838
  }
23839
+ function secretRules(command3, cwd) {
23840
+ const hit = reach2(command3, cwd);
23841
+ return hit && certain(hit) ? { certain: hit, maybe: null } : { certain: null, maybe: hit };
23842
+ }
23843
+ function origin() {
23844
+ const active = focused();
23845
+ return active?.closest("slicc-terminal") ?? active;
23846
+ }
23366
23847
  function waiting(model, now) {
23367
23848
  return [...model?.approvals?.list() ?? []].filter((approval) => approval.expiresAt > now).sort((a23, b13) => a23.createdAt - b13.createdAt);
23368
23849
  }
@@ -23503,7 +23984,8 @@ var SliccApprovals = class extends ModelElement {
23503
23984
  async decide(approval, decision) {
23504
23985
  const port = this.model?.approvals;
23505
23986
  if (!port?.decide || this.busy || decision !== "deny" && !this.#armed) return;
23506
- if (decision === "always" && secretRules(approval)) return;
23987
+ const verdict = secretRules(approval.command, approval.cwd);
23988
+ if (decision === "always" && (verdict.certain ?? verdict.maybe)) return;
23507
23989
  this.busy = decision;
23508
23990
  this.failure = null;
23509
23991
  this.#pending.add(approval.id);
@@ -23547,7 +24029,7 @@ var SliccApprovals = class extends ModelElement {
23547
24029
  const dialog = this.renderRoot.querySelector("dialog");
23548
24030
  const key2 = dialog ? `${dialog.dataset.approval}:${dialog.dataset.gone ?? ""}` : "";
23549
24031
  if (key2 === this.#shown) return;
23550
- if (dialog && !this.#shown) this.#trigger = focused();
24032
+ if (dialog && !this.#shown) this.#trigger = origin();
23551
24033
  this.#shown = key2;
23552
24034
  if (!dialog) {
23553
24035
  if (this.#trigger?.isConnected) this.#trigger.focus();
@@ -23608,7 +24090,8 @@ var SliccApprovals = class extends ModelElement {
23608
24090
  const [approval, ...rest] = held ? [held, ...list5.filter(({ id }) => id !== held.id)] : list5;
23609
24091
  if (!approval) return A;
23610
24092
  const failure2 = this.failure?.id === approval.id ? this.failure.message : "";
23611
- const rules = secretRules(approval);
24093
+ const verdict = secretRules(approval.command, approval.cwd);
24094
+ const rules = verdict.certain ?? verdict.maybe;
23612
24095
  const always = approval.always && !rules;
23613
24096
  return this.#dialog(
23614
24097
  approval,
@@ -23617,7 +24100,7 @@ var SliccApprovals = class extends ModelElement {
23617
24100
  <h2 id="title" slot="heading">Allow sudo?</h2>
23618
24101
  ${this.#request(approval)}
23619
24102
  ${approval.cwd ? b`<p class="cwd">In ${approval.cwd}</p>` : A}
23620
- ${rules ? b`<div class="rules" data-secret-rules=${rules}><swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle><p>${certain(rules) ? b`<strong>This changes secret rules.</strong> It names <code>${rules}</code>, where SLICC keeps which secrets programs may use and where they may be sent.` : b`<strong>This may change secret rules.</strong> SLICC can't tell where <code>${rules}</code> leads, and it could reach the files where SLICC keeps which secrets programs may use and where they may be sent.`} Allow it only if you asked for this change.</p></div>` : A}
24103
+ ${rules ? b`<div class="rules" data-secret-rules=${rules}><swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle><p>${verdict.certain ? b`<strong>This changes secret rules.</strong> It names <code>${rules}</code>, where SLICC keeps which secrets programs may use and where they may be sent.` : b`<strong>This may change secret rules.</strong> SLICC can't tell where <code>${rules}</code> leads, and it could reach the files where SLICC keeps which secrets programs may use and where they may be sent.`} Allow it only if you asked for this change.</p></div>` : A}
23621
24104
  ${always ? b`<p class="hint">Always allow lets ${approval.requester.name} run exactly this command with sudo without asking again.</p>` : A}
23622
24105
  ${failure2 ? b`<p class="problem" role="alert" data-error><swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle><span>${failure2}</span></p>` : A}
23623
24106
  <p class="timer" data-timer>Denied automatically in ${countdown(approval.expiresAt - this.now)}.</p>
@@ -23951,8 +24434,8 @@ function since2(at, now = Date.now()) {
23951
24434
  function called(value = "") {
23952
24435
  const url = value.split(" ").at(-1);
23953
24436
  try {
23954
- const { origin, pathname } = new URL(url);
23955
- return `Called ${origin}${pathname}`;
24437
+ const { origin: origin2, pathname } = new URL(url);
24438
+ return `Called ${origin2}${pathname}`;
23956
24439
  } catch {
23957
24440
  return `Called ${url}`.trim();
23958
24441
  }
@@ -24000,7 +24483,9 @@ var icons = {
24000
24483
  };
24001
24484
  var refresh = 1e4;
24002
24485
  var fresh = 3e3;
24486
+ var actionPage = 50;
24003
24487
  var narrowWidth = 480;
24488
+ var linked = /* @__PURE__ */ new Set(["open", "goto", "request"]);
24004
24489
  var wideWidth = 720;
24005
24490
  var offline = b`<svg viewBox="0 0 96 72" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="6" y="8" width="84" height="56" rx="6"/><path d="M6 22h84"/><circle cx="16" cy="15" r="1.5"/><circle cx="24" cy="15" r="1.5"/><path d="M38 34l20 20M58 34L38 54"/></svg>`;
24006
24491
  var SliccBrowser = class extends ModelElement {
@@ -24020,7 +24505,10 @@ var SliccBrowser = class extends ModelElement {
24020
24505
  #width = 0;
24021
24506
  #copied = null;
24022
24507
  #command = null;
24023
- #count = 0;
24508
+ #last = null;
24509
+ #shown = actionPage;
24510
+ #anchor = null;
24511
+ #expanded = /* @__PURE__ */ new Set();
24024
24512
  constructor() {
24025
24513
  super();
24026
24514
  this.address = "";
@@ -24224,8 +24712,15 @@ var SliccBrowser = class extends ModelElement {
24224
24712
  font-family: var(--swc-code-font-family-stack);
24225
24713
  color: var(--swc-neutral-subdued-content-color-default);
24226
24714
  }
24227
- .narrow .driving swc-button {
24228
- flex: 1 0 100%;
24715
+ .detail .driving {
24716
+ flex-wrap: nowrap;
24717
+ min-block-size: var(--swc-component-height-75);
24718
+ }
24719
+ .detail .driving swc-status-light {
24720
+ min-width: 0;
24721
+ }
24722
+ .detail .driving swc-button {
24723
+ flex: none;
24229
24724
  }
24230
24725
  .swc-Link {
24231
24726
  font-size: inherit;
@@ -24298,6 +24793,7 @@ var SliccBrowser = class extends ModelElement {
24298
24793
  user-select: none;
24299
24794
  }
24300
24795
  figcaption {
24796
+ min-block-size: var(--swc-component-height-50);
24301
24797
  display: flex;
24302
24798
  align-items: center;
24303
24799
  justify-content: space-between;
@@ -24311,8 +24807,84 @@ var SliccBrowser = class extends ModelElement {
24311
24807
  color: var(--swc-heading-color);
24312
24808
  }
24313
24809
  summary {
24810
+ display: flex;
24811
+ align-items: center;
24812
+ gap: var(--swc-spacing-100);
24813
+ min-block-size: var(--swc-component-height-75);
24814
+ padding-inline: var(--swc-spacing-75);
24815
+ margin-inline: calc(-1 * var(--swc-spacing-75));
24816
+ border-radius: var(--swc-corner-radius-medium-default);
24817
+ list-style: none;
24818
+ cursor: pointer;
24819
+ }
24820
+ summary::-webkit-details-marker {
24821
+ display: none;
24822
+ }
24823
+ summary:hover {
24824
+ background: var(--swc-gray-100);
24825
+ }
24826
+ summary:focus-visible,
24827
+ .url-toggle:focus-visible,
24828
+ .actions:focus-visible {
24829
+ outline: var(--swc-focus-indicator-thickness) solid var(--swc-focus-indicator-color);
24830
+ outline-offset: var(--swc-focus-ring-gap);
24831
+ }
24832
+ .chevron {
24833
+ flex: none;
24834
+ color: var(--swc-neutral-subdued-content-color-default);
24835
+ transition: transform var(--swc-animation-duration-100);
24836
+ }
24837
+ details[open] > summary .chevron {
24838
+ transform: rotate(90deg);
24839
+ }
24840
+ .url-toggle[aria-expanded='true'] .chevron {
24841
+ transform: rotate(180deg);
24842
+ }
24843
+ :host(:dir(rtl)) details:not([open]) > summary .chevron {
24844
+ transform: scaleX(-1);
24845
+ }
24846
+ @media (prefers-reduced-motion: reduce) {
24847
+ .chevron {
24848
+ transition: none;
24849
+ }
24850
+ }
24851
+ .more {
24852
+ display: flex;
24853
+ align-items: center;
24854
+ justify-content: space-between;
24855
+ gap: var(--swc-spacing-200);
24856
+ padding-block-end: var(--swc-spacing-75);
24857
+ color: var(--swc-neutral-subdued-content-color-default);
24858
+ }
24859
+ .url-toggle {
24860
+ display: inline-flex;
24861
+ align-self: flex-start;
24862
+ align-items: center;
24863
+ gap: var(--swc-spacing-50);
24864
+ max-width: 100%;
24865
+ margin: 0;
24866
+ padding: 0;
24867
+ border: 0;
24868
+ border-radius: var(--swc-corner-radius-small-default);
24869
+ background: none;
24870
+ color: inherit;
24871
+ font: inherit;
24872
+ text-align: start;
24314
24873
  cursor: pointer;
24315
24874
  }
24875
+ .url-toggle > span {
24876
+ min-width: 0;
24877
+ }
24878
+ .url-toggle:hover > span {
24879
+ text-decoration: underline;
24880
+ }
24881
+ .full {
24882
+ font-family: var(--swc-code-font-family-stack);
24883
+ color: var(--swc-neutral-subdued-content-color-default);
24884
+ overflow-wrap: anywhere;
24885
+ white-space: normal;
24886
+ user-select: text;
24887
+ }
24316
24888
  .actions {
24317
24889
  display: flex;
24318
24890
  flex-direction: column;
@@ -24340,7 +24912,8 @@ var SliccBrowser = class extends ModelElement {
24340
24912
  min-width: 0;
24341
24913
  overflow-wrap: anywhere;
24342
24914
  }
24343
- .last .what {
24915
+ .last .what > :not(.full),
24916
+ .last .url-toggle > span {
24344
24917
  overflow: hidden;
24345
24918
  text-overflow: ellipsis;
24346
24919
  white-space: nowrap;
@@ -24406,6 +24979,8 @@ var SliccBrowser = class extends ModelElement {
24406
24979
  this.#shots.clear();
24407
24980
  this.#frames.clear();
24408
24981
  this.#pulse.clear();
24982
+ this.#expanded.clear();
24983
+ this.#shown = actionPage;
24409
24984
  const tabs = model.browser.list();
24410
24985
  this.#driven = new Set(tabs.filter((tab) => tab.controlled).map((tab) => tab.id));
24411
24986
  this.#focus = this.#latest(model, tabs);
@@ -24505,7 +25080,7 @@ var SliccBrowser = class extends ModelElement {
24505
25080
  try {
24506
25081
  const src = await model.browser.screenshot(id);
24507
25082
  const now = model.browser.list().find((candidate) => candidate.id === id);
24508
- if (this.model === model && now && this.#key(now) === key2) {
25083
+ if (this.model === model && now && this.#key(now) === key2 && this.#watching?.tabId !== id) {
24509
25084
  this.#shots.set(id, { key: key2, src, at: Date.now() });
24510
25085
  this.requestUpdate();
24511
25086
  }
@@ -24523,6 +25098,7 @@ var SliccBrowser = class extends ModelElement {
24523
25098
  #show(id) {
24524
25099
  this.#focus = id;
24525
25100
  this.#copied = null;
25101
+ this.#shown = actionPage;
24526
25102
  if (id) this.#pulse.delete(id);
24527
25103
  this.requestUpdate();
24528
25104
  }
@@ -24537,9 +25113,11 @@ var SliccBrowser = class extends ModelElement {
24537
25113
  this.#ticker = setInterval(() => this.requestUpdate(), 1e3);
24538
25114
  if (!(visible2 && tab)) this.#still();
24539
25115
  const list5 = this.renderRoot.querySelector(".actions:not(.last)");
24540
- const count = list5?.childElementCount ?? 0;
24541
- if (list5 && count !== this.#count) list5.scrollTop = list5.scrollHeight;
24542
- this.#count = count;
25116
+ const last = list5?.lastElementChild?.getAttribute("data-action-id") ?? null;
25117
+ if (list5 && this.#anchor !== null) list5.scrollTop = list5.scrollHeight - this.#anchor;
25118
+ else if (list5 && last !== this.#last) list5.scrollTop = list5.scrollHeight;
25119
+ this.#anchor = null;
25120
+ this.#last = last;
24543
25121
  }
24544
25122
  #still() {
24545
25123
  if (this.#ticker) clearInterval(this.#ticker);
@@ -24587,10 +25165,10 @@ var SliccBrowser = class extends ModelElement {
24587
25165
  #who(tab) {
24588
25166
  return tab.agentId ? `${agentName(this.model, tab.agentId)} is using this tab` : "In use";
24589
25167
  }
24590
- #stopButton(tab, refocus, justified = false) {
25168
+ #stopButton(tab, refocus) {
24591
25169
  if (!tab.agentId || watchOnly(this.model)) return A;
24592
25170
  const agentId = tab.agentId;
24593
- return b`<swc-button size="s" variant="secondary" ?justified=${justified} data-action="stop-agent" @click=${() => this.#stop(agentId, refocus)}>Stop ${agentName(this.model, agentId)}</swc-button>`;
25171
+ return b`<swc-button size="s" variant="secondary" data-action="stop-agent" @click=${() => this.#stop(agentId, refocus)}>Stop ${agentName(this.model, agentId)}</swc-button>`;
24594
25172
  }
24595
25173
  #card(tab, active) {
24596
25174
  const model = this.model;
@@ -24669,28 +25247,52 @@ var SliccBrowser = class extends ModelElement {
24669
25247
  </figcaption>
24670
25248
  </figure>`;
24671
25249
  }
25250
+ #more(total) {
25251
+ const list5 = this.renderRoot.querySelector(".actions:not(.last)");
25252
+ this.#anchor = list5.scrollHeight - list5.scrollTop;
25253
+ this.#shown += actionPage;
25254
+ const done2 = this.#shown >= total;
25255
+ void this.updateComplete.then(() => {
25256
+ if (done2) this.focusOn(".actions:not(.last)");
25257
+ });
25258
+ this.requestUpdate();
25259
+ }
25260
+ #toggle(id) {
25261
+ if (!this.#expanded.delete(id)) this.#expanded.add(id);
25262
+ this.requestUpdate();
25263
+ }
25264
+ #what(action) {
25265
+ const url = linked.has(action.kind) ? action.value : void 0;
25266
+ if (!url) return b`<span>${describe(action)}</span>`;
25267
+ const open = this.#expanded.has(action.id);
25268
+ return b`<button class="url-toggle" data-action="action-url" aria-expanded=${open ? "true" : "false"} aria-controls=${`url-${action.id}`} @click=${() => this.#toggle(action.id)}><span>${describe(action)}</span><swc-icon-chevron-down class="chevron" size="s" aria-hidden="true"></swc-icon-chevron-down></button>${open ? b`<span class="full" id=${`url-${action.id}`}>${url}</span>` : A}`;
25269
+ }
24672
25270
  #row(action) {
24673
25271
  const failed2 = action.status === "failed";
24674
- return b`<li data-action-id=${action.id} data-kind=${action.kind} data-status=${action.status} title=${action.kind === "request" ? action.value ?? "" : A}>
25272
+ const url = linked.has(action.kind) ? action.value : void 0;
25273
+ return b`<li data-action-id=${action.id} data-kind=${action.kind} data-status=${action.status} title=${url ?? A}>
24675
25274
  <span>${action.status === "running" ? b`<swc-progress-circle size="s" indeterminate label="Running"></swc-progress-circle>` : failed2 ? b`<swc-icon-alert-triangle size="s" aria-label="Failed"></swc-icon-alert-triangle>` : icons[action.kind]}</span>
24676
- <span class="what"><span>${describe(action)}</span>${failed2 && action.error ? b`<span class="failure">${action.error}</span>` : A}</span>
25275
+ <span class="what">${this.#what(action)}${failed2 && action.error ? b`<span class="failure">${action.error}</span>` : A}</span>
24677
25276
  <span class="who">${agentName(this.model, action.agentId)} ${time(action.at)}</span>
24678
25277
  </li>`;
24679
25278
  }
24680
25279
  #actions(tab) {
24681
25280
  const port = this.model.browser;
24682
25281
  if (!port.actions) return A;
24683
- const actions2 = port.actions().filter(
25282
+ const all2 = port.actions().filter(
24684
25283
  (action) => action.tabId === tab.id || action.tabId === null && action.agentId !== null && action.agentId === tab.agentId
24685
- ).slice(-50);
24686
- if (!actions2.length)
25284
+ );
25285
+ if (!all2.length)
24687
25286
  return b`<h3>Recent actions</h3><p class="muted" data-actions="none">No actions yet.</p>`;
25287
+ const actions2 = all2.slice(-this.#shown);
25288
+ const more = all2.length > actions2.length ? b`<div class="more"><span>Showing the latest ${actions2.length} of ${all2.length}</span><swc-button size="s" variant="secondary" fill-style="outline" data-action="more-actions" @click=${() => this.#more(all2.length)}>Show more</swc-button></div>` : A;
24688
25289
  if (this.#width >= narrowWidth)
24689
- return b`<h3>Recent actions</h3><ol class="actions" aria-label="Recent actions">${actions2.map((action) => this.#row(action))}</ol>`;
25290
+ return b`<h3>Recent actions</h3>${more}<ol class="actions" aria-label="Recent actions" tabindex="0">${actions2.map((action) => this.#row(action))}</ol>`;
24690
25291
  const last = actions2.at(-1);
24691
25292
  return b`<details>
24692
- <summary>Recent actions (${actions2.length})</summary>
24693
- <ol class="actions" aria-label="Earlier actions">${actions2.slice(0, -1).map((action) => this.#row(action))}</ol>
25293
+ <summary><swc-icon-chevron-right class="chevron" size="s" aria-hidden="true"></swc-icon-chevron-right>Recent actions (${all2.length})</summary>
25294
+ ${more}
25295
+ <ol class="actions" aria-label="Earlier actions" tabindex="0">${actions2.slice(0, -1).map((action) => this.#row(action))}</ol>
24694
25296
  </details>
24695
25297
  <ol class="actions last" aria-label="Last action">${this.#row(last)}</ol>`;
24696
25298
  }
@@ -24717,7 +25319,7 @@ var SliccBrowser = class extends ModelElement {
24717
25319
  </div>
24718
25320
  <div class="driving" data-driving=${tab.controlled ? tab.agentId ? "agent" : "user" : "none"}>
24719
25321
  <swc-status-light size="m" variant=${tab.controlled ? "info" : "neutral"}>${tab.controlled ? this.#who(tab) : "No agent is using this tab"}</swc-status-light>
24720
- ${tab.controlled ? this.#stopButton(tab, '[data-action="all-tabs"]', narrow) : A}
25322
+ ${tab.controlled ? this.#stopButton(tab, '[data-action="all-tabs"]') : A}
24721
25323
  </div>
24722
25324
  ${this.#view(tab)}
24723
25325
  ${this.#actions(tab)}
@@ -25602,6 +26204,7 @@ var navigation = /* @__PURE__ */ new Set([
25602
26204
  "PageUp",
25603
26205
  "PageDown"
25604
26206
  ]);
26207
+ var compactWidth = 560;
25605
26208
  var failed = (message) => message.role === "assistant" ? message.status === "error" : message.role === "system" && message.kind === "error";
25606
26209
  function carriesFiles(event2) {
25607
26210
  const types = [...event2.dataTransfer?.types ?? []];
@@ -25636,11 +26239,17 @@ document.addEventListener(
25636
26239
  true
25637
26240
  );
25638
26241
  var SliccChat = class extends ThemedElement {
25639
- static properties = { ...ThemedElement.properties, agent: {}, dropping: { state: true } };
26242
+ static properties = {
26243
+ ...ThemedElement.properties,
26244
+ agent: {},
26245
+ dropping: { state: true },
26246
+ compact: { state: true }
26247
+ };
25640
26248
  constructor() {
25641
26249
  super();
25642
26250
  this.agent = "";
25643
26251
  this.dropping = false;
26252
+ this.compact = false;
25644
26253
  this.addEventListener("dragenter", this.#over);
25645
26254
  this.addEventListener("dragover", this.#over);
25646
26255
  this.addEventListener("dragleave", this.#leave);
@@ -25694,7 +26303,7 @@ var SliccChat = class extends ThemedElement {
25694
26303
  }
25695
26304
  header {
25696
26305
  display: flex;
25697
- flex-wrap: wrap;
26306
+ flex-wrap: nowrap;
25698
26307
  align-items: center;
25699
26308
  gap: var(--swc-spacing-50) var(--swc-spacing-100);
25700
26309
  padding: var(--swc-spacing-75) var(--swc-spacing-200);
@@ -25706,15 +26315,23 @@ var SliccChat = class extends ThemedElement {
25706
26315
  }
25707
26316
  header sp-picker {
25708
26317
  --mod-picker-spacing-label-to-picker-quiet: calc(-1 * var(--swc-border-width-100));
26318
+ flex: none;
25709
26319
  min-width: 0;
25710
26320
  width: auto;
25711
26321
  }
26322
+ header sp-picker[label='Model'] {
26323
+ flex: 0 1 auto;
26324
+ }
26325
+ header swc-status-light,
26326
+ header swc-action-button {
26327
+ flex: none;
26328
+ }
25712
26329
  header swc-status-light {
25713
26330
  align-self: center;
25714
26331
  }
25715
26332
  header swc-meter {
25716
26333
  flex: 0 1 calc(var(--swc-spacing-400) * 6);
25717
- min-width: calc(var(--swc-spacing-400) * 4);
26334
+ min-width: calc(var(--swc-spacing-400) * 4.5);
25718
26335
  margin-inline-start: auto;
25719
26336
  }
25720
26337
  header .frozen,
@@ -25803,14 +26420,27 @@ var SliccChat = class extends ThemedElement {
25803
26420
  }
25804
26421
  };
25805
26422
  subscribe(model) {
26423
+ const settle2 = () => {
26424
+ settleModels(model);
26425
+ this.requestUpdate();
26426
+ };
26427
+ queueMicrotask(() => settleModels(model));
26428
+ const width = new ResizeObserver(([entry]) => {
26429
+ const size4 = entry.contentRect.width;
26430
+ this.compact = size4 > 0 && size4 < compactWidth;
26431
+ });
26432
+ width.observe(this);
25806
26433
  return [
25807
26434
  ...super.subscribe(model),
26435
+ () => width.disconnect(),
26436
+ model.settings.on("settings", settle2),
26437
+ model.settings.on("accounts", settle2),
25808
26438
  model.agent.on("active", () => {
25809
26439
  if (!this.agent) this.#refresh(true);
25810
26440
  }),
25811
- model.agent.on("agents", () => this.requestUpdate()),
26441
+ model.agent.on("agents", settle2),
25812
26442
  ...model.tabs ? [model.tabs.on("tabs", () => this.requestUpdate())] : [],
25813
- ...model.follow ? [model.follow.on("follow", () => this.requestUpdate())] : [],
26443
+ ...model.follow ? [model.follow.on("follow", settle2)] : [],
25814
26444
  model.agent.on("messages", (agentId) => {
25815
26445
  if (agentId === this.#id()) this.#refresh(this.#sent(agentId));
25816
26446
  }),
@@ -25912,11 +26542,11 @@ var SliccChat = class extends ThemedElement {
25912
26542
  new CustomEvent("show-surface", { detail: { id: "settings" }, bubbles: true, composed: true })
25913
26543
  );
25914
26544
  }
25915
- #message(message, agent, suggestion) {
26545
+ #message(message, agent, suggestion, changed) {
25916
26546
  const model = this.model;
25917
26547
  switch (message.role) {
25918
26548
  case "assistant": {
25919
- const label = model.settings.models().find((option2) => option2.id === (message.model ?? ""))?.label ?? message.model ?? "";
26549
+ const label = changed ? model.settings.models().find((option2) => option2.id === message.model)?.label ?? message.model : "";
25920
26550
  return assistant(
25921
26551
  message,
25922
26552
  agent.name,
@@ -25939,6 +26569,7 @@ var SliccChat = class extends ThemedElement {
25939
26569
  #items(messages, agent) {
25940
26570
  const out = [];
25941
26571
  let previous = "";
26572
+ let shown4;
25942
26573
  const model = this.model;
25943
26574
  const last = messages.at(-1);
25944
26575
  const suggestion = last?.role === "assistant" && !agent.frozen && !watchOnly(model) && !model.agent.busy(agent.id) ? model.agent.suggestion(agent.id) : null;
@@ -25953,7 +26584,13 @@ var SliccChat = class extends ThemedElement {
25953
26584
  ]);
25954
26585
  previous = label;
25955
26586
  }
25956
- out.push([message.id, this.#message(message, agent, message === last ? suggestion : null)]);
26587
+ const next = message.role === "assistant" ? message.model : void 0;
26588
+ const changed = !!next && next !== shown4;
26589
+ if (changed) shown4 = next;
26590
+ out.push([
26591
+ message.id,
26592
+ this.#message(message, agent, message === last ? suggestion : null, changed)
26593
+ ]);
25957
26594
  }
25958
26595
  return out;
25959
26596
  }
@@ -25977,10 +26614,11 @@ var SliccChat = class extends ThemedElement {
25977
26614
  <span class="model" data-model>${label ?? agent.model}</span>
25978
26615
  ${meter}`;
25979
26616
  }
26617
+ const offered = chatModels(model.settings.models());
25980
26618
  return b`${statusLight(agent.status)}
25981
- <sp-picker size="s" quiet label="Model" value=${agent.model} @change=${(event2) => model.agent.setModel(agent.id, event2.target.value)}>
25982
- ${chatModels(model.settings.models()).map((option2) => b`<sp-menu-item value=${option2.id}>${option2.label}<span slot="description">${option2.provider}</span></sp-menu-item>`)}
25983
- </sp-picker>
26619
+ ${offered.length ? b`<sp-picker size="s" quiet label="Model" value=${agent.model} @change=${(event2) => model.agent.setModel(agent.id, event2.target.value)}>
26620
+ ${offered.map((option2) => b`<sp-menu-item value=${option2.id}>${option2.label}<span slot="description">${option2.provider}</span></sp-menu-item>`)}
26621
+ </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>`}
25984
26622
  <sp-picker size="s" quiet label="Thinking" value=${model.settings.get().thinking} @change=${(event2) => model.settings.update({ thinking: event2.target.value })}>
25985
26623
  <sp-menu-item value="off">No thinking</sp-menu-item>
25986
26624
  <sp-menu-item value="low">Think a little</sp-menu-item>
@@ -25988,7 +26626,7 @@ var SliccChat = class extends ThemedElement {
25988
26626
  <sp-menu-item value="high">Think hard</sp-menu-item>
25989
26627
  </sp-picker>
25990
26628
  ${meter}
25991
- <swc-action-button id="new-chat" size="s" quiet data-action="new-chat" ?disabled=${empty2} @click=${() => this.#newChat(agent)}><swc-icon-new slot="icon"></swc-icon-new>New conversation</swc-action-button>
26629
+ <swc-action-button id="new-chat" size="s" quiet data-action="new-chat" accessible-label=${this.compact ? "New conversation" : A} ?disabled=${empty2} @click=${() => this.#newChat(agent)}><swc-icon-new slot="icon"></swc-icon-new>${this.compact ? A : "New conversation"}</swc-action-button>
25992
26630
  <swc-tooltip for="new-chat" placement="bottom">${agent.kind === "cone" && model.agent.freeze ? "Start a new conversation. This one stays in the Freezer." : "Start a new conversation"}</swc-tooltip>`;
25993
26631
  }
25994
26632
  render() {
@@ -26000,7 +26638,7 @@ var SliccChat = class extends ThemedElement {
26000
26638
  const messages = agent ? this.model?.agent.messages(agent.id) ?? [] : [];
26001
26639
  this.#tail = messages.at(-1)?.id ?? "";
26002
26640
  return b`
26003
- <header>
26641
+ <header ?data-compact=${this.compact}>
26004
26642
  ${agent ? this.#meta(agent, !messages.length) : b`<span>No agent</span>`}
26005
26643
  </header>
26006
26644
  <slicc-notices .model=${this.model}></slicc-notices>
@@ -26038,7 +26676,7 @@ var D4 = (e120) => {
26038
26676
  var O3 = typeof CSS < "u" && typeof CSS.supports == "function" && CSS.supports("field-sizing", "content");
26039
26677
  var k3 = class extends i9 {
26040
26678
  constructor() {
26041
- super(), this.labelId = e90("swc-prompt-field-label"), this.disabled = false, this.generating = false, this.collapsed = false, this.variant = "balanced", this.size = "m", this.loader = "aiLogo", this.animateLoader = false, this.label = "Prompt", this.accessibleLabel = "", this.sendLabel = "Send", this.stopLabel = "Stop generating", this.uploadLabel = "Add attachment", this.attachmentScrollPrevLabel = "Show previous attachments", this.attachmentScrollNextLabel = "Show more attachments", this.attachmentStripLabel = "Uploaded assets strip", this.placeholder = "Ready to get started? Ask a question, share an idea, or add a task.", this.value = "", this._attachmentScrollOverflow = false, this._attachmentCanScrollPrev = false, this._attachmentCanScrollNext = false, this._attachmentScrollFallbackGeneration = 0, this._attachmentScrollObserver = new s8(this, {
26679
+ super(), this.labelId = e91("swc-prompt-field-label"), this.disabled = false, this.generating = false, this.collapsed = false, this.variant = "balanced", this.size = "m", this.loader = "aiLogo", this.animateLoader = false, this.label = "Prompt", this.accessibleLabel = "", this.sendLabel = "Send", this.stopLabel = "Stop generating", this.uploadLabel = "Add attachment", this.attachmentScrollPrevLabel = "Show previous attachments", this.attachmentScrollNextLabel = "Show more attachments", this.attachmentStripLabel = "Uploaded assets strip", this.placeholder = "Ready to get started? Ask a question, share an idea, or add a task.", this.value = "", this._attachmentScrollOverflow = false, this._attachmentCanScrollPrev = false, this._attachmentCanScrollNext = false, this._attachmentScrollFallbackGeneration = 0, this._attachmentScrollObserver = new s8(this, {
26042
26680
  target: null,
26043
26681
  callback: () => {
26044
26682
  this._updateAttachmentScrollState();
@@ -27363,6 +28001,11 @@ var SliccComposer = class extends ThemedElement {
27363
28001
  flex: none;
27364
28002
  color: var(--swc-neutral-subdued-content-color-default);
27365
28003
  }
28004
+ .queued .next {
28005
+ flex: none;
28006
+ font-size: var(--swc-font-size-75);
28007
+ color: var(--swc-neutral-subdued-content-color-default);
28008
+ }
27366
28009
  .queued .text {
27367
28010
  flex: 1;
27368
28011
  min-width: 0;
@@ -28086,17 +28729,17 @@ var SliccComposer = class extends ThemedElement {
28086
28729
  const model = this.model;
28087
28730
  return b`<ul class="queue" aria-label="Queued messages">
28088
28731
  ${queued.map(
28089
- (message) => b`<li class="queued" data-id=${message.id}>
28732
+ (message) => b`<li class="queued" data-id=${message.id} data-mode=${message.mode ?? "queue"}>
28090
28733
  <swc-icon-clock size="s" aria-hidden="true"></swc-icon-clock>
28091
- <span class="text"><span class="sr">Queued: </span>${message.text}</span>
28092
- <swc-action-button size="s" quiet data-action="send-now" @click=${() => {
28734
+ <span class="text"><span class="sr">${message.mode === "steer" ? "Steering: " : "Queued: "}</span>${message.text}</span>
28735
+ ${message.mode === "steer" ? b`<span class="next">Sends at the next step</span>` : b`<swc-action-button size="s" quiet data-action="send-now" @click=${() => {
28093
28736
  model.agent.unqueue(this.#agent, message.id);
28094
28737
  void model.agent.send(this.#agent, {
28095
28738
  text: message.text,
28096
28739
  attachments: message.attachments,
28097
28740
  mode: "steer"
28098
28741
  });
28099
- }}>Send now</swc-action-button>
28742
+ }}>Send now</swc-action-button>`}
28100
28743
  <swc-close-button size="s" data-action="unqueue" accessible-label="Remove from queue" @click=${() => model.agent.unqueue(this.#agent, message.id)}></swc-close-button>
28101
28744
  </li>`
28102
28745
  )}
@@ -28494,379 +29137,6 @@ var SliccMemory = class extends ModelElement {
28494
29137
  }
28495
29138
  };
28496
29139
 
28497
- // src/app/monitor.ts
28498
- function sparkline(points, width = 120, height = 28) {
28499
- if (points.length < 2) return "";
28500
- const max2 = Math.max(...points);
28501
- const min2 = Math.min(...points);
28502
- const span = max2 - min2 || 1;
28503
- return points.map(
28504
- (value, i26) => `${(i26 / (points.length - 1) * width).toFixed(1)},${(height - (value - min2) / span * (height - 2) - 1).toFixed(1)}`
28505
- ).join(" ");
28506
- }
28507
- function meterVariant2(ratio) {
28508
- if (ratio >= 0.9) return "negative";
28509
- if (ratio >= 0.6) return "notice";
28510
- return "informative";
28511
- }
28512
- var surfaces2 = {
28513
- agents: "agents",
28514
- terminals: "terminal",
28515
- tabs: "browser",
28516
- changes: "changes",
28517
- processes: "terminal"
28518
- };
28519
- var rowLights = {
28520
- active: "info",
28521
- idle: "neutral",
28522
- warn: "notice",
28523
- error: "negative"
28524
- };
28525
- var rowSpoken = {
28526
- active: "Active",
28527
- idle: "Idle",
28528
- warn: "Needs attention",
28529
- error: "Error"
28530
- };
28531
- function indent2(depth) {
28532
- return Math.min(Math.max(Math.floor(depth ?? 0), 0), 6);
28533
- }
28534
- function attention(section) {
28535
- const errors = section.rows.filter((row) => row.status === "error").length;
28536
- if (errors)
28537
- return { variant: "negative", text: `${errors} ${errors === 1 ? "error" : "errors"}` };
28538
- const warnings = section.rows.filter((row) => row.status === "warn").length;
28539
- if (warnings)
28540
- return {
28541
- variant: "notice",
28542
- text: `${warnings} ${warnings === 1 ? "needs" : "need"} attention`
28543
- };
28544
- return null;
28545
- }
28546
- var SliccMonitor = class extends ModelElement {
28547
- static properties = {
28548
- ...ModelElement.properties,
28549
- expanded: { state: true },
28550
- copied: { state: true }
28551
- };
28552
- constructor() {
28553
- super();
28554
- this.expanded = {};
28555
- this.copied = null;
28556
- }
28557
- static styles = [
28558
- shared,
28559
- panelCss,
28560
- i`
28561
- .bar {
28562
- padding-block: var(--swc-spacing-50);
28563
- }
28564
- .heading {
28565
- flex: 1;
28566
- min-width: 0;
28567
- display: flex;
28568
- flex-wrap: wrap;
28569
- align-items: baseline;
28570
- column-gap: var(--swc-spacing-100);
28571
- white-space: normal;
28572
- }
28573
- .bar swc-action-button {
28574
- flex: none;
28575
- }
28576
- .body {
28577
- flex: 1;
28578
- min-height: 0;
28579
- overflow-y: auto;
28580
- padding: var(--swc-spacing-100);
28581
- display: grid;
28582
- grid-template-columns: minmax(0, 1fr);
28583
- align-content: start;
28584
- gap: var(--swc-spacing-200);
28585
- }
28586
- .vitals {
28587
- display: grid;
28588
- grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--swc-card-default-width-extra-small)), 1fr));
28589
- gap: var(--swc-spacing-100);
28590
- }
28591
- .vital {
28592
- display: grid;
28593
- align-content: start;
28594
- gap: var(--swc-spacing-50);
28595
- border-radius: var(--swc-corner-radius-medium-default);
28596
- padding: var(--swc-spacing-200);
28597
- background: var(--swc-background-layer-1-color);
28598
- }
28599
- .label {
28600
- color: var(--swc-neutral-subdued-content-color-default);
28601
- font-size: var(--swc-font-size-75);
28602
- }
28603
- .value {
28604
- font-size: var(--swc-font-size-300);
28605
- font-weight: var(--swc-bold-font-weight);
28606
- font-variant-numeric: tabular-nums;
28607
- }
28608
- .unit,
28609
- .delta {
28610
- color: var(--swc-neutral-subdued-content-color-default);
28611
- margin-inline-start: var(--swc-spacing-75);
28612
- }
28613
- svg {
28614
- display: block;
28615
- width: 100%;
28616
- height: var(--swc-component-height-100);
28617
- }
28618
- polyline {
28619
- fill: none;
28620
- stroke: var(--swc-accent-visual-color);
28621
- stroke-width: 1.5;
28622
- }
28623
- swc-meter {
28624
- width: 100%;
28625
- }
28626
- .alerts {
28627
- display: grid;
28628
- gap: var(--swc-spacing-75);
28629
- margin: 0;
28630
- padding: 0;
28631
- list-style: none;
28632
- }
28633
- .alert {
28634
- display: grid;
28635
- grid-template-columns: auto minmax(0, 1fr);
28636
- gap: var(--swc-spacing-100);
28637
- align-items: start;
28638
- border-radius: var(--swc-corner-radius-medium-default);
28639
- padding: var(--swc-spacing-100) var(--swc-spacing-200);
28640
- background: var(--swc-notice-subtle-background-color-default);
28641
- }
28642
- .alert[data-severity='error'] {
28643
- background: var(--swc-negative-subtle-background-color-default);
28644
- }
28645
- .alert swc-icon-alert-triangle {
28646
- color: var(--swc-icon-color-notice);
28647
- }
28648
- .alert swc-icon-alert-diamond {
28649
- color: var(--swc-icon-color-negative);
28650
- }
28651
- .alert .detail {
28652
- display: block;
28653
- color: var(--swc-neutral-subdued-content-color-default);
28654
- }
28655
- .alert > div {
28656
- min-width: 0;
28657
- }
28658
- .alert .command {
28659
- display: flex;
28660
- align-items: center;
28661
- gap: var(--swc-spacing-100);
28662
- margin-block-start: var(--swc-spacing-75);
28663
- padding-inline-start: var(--swc-spacing-100);
28664
- border-radius: var(--swc-corner-radius-medium-default);
28665
- background: var(--swc-background-layer-1-color);
28666
- }
28667
- .alert code {
28668
- flex: 1;
28669
- min-width: 0;
28670
- overflow-x: auto;
28671
- white-space: nowrap;
28672
- font-family: var(--swc-code-font-family-stack);
28673
- font-size: var(--swc-font-size-75);
28674
- color: var(--swc-code-color);
28675
- }
28676
- .alert .lead {
28677
- display: block;
28678
- margin-block-start: var(--swc-spacing-75);
28679
- color: var(--swc-neutral-subdued-content-color-default);
28680
- }
28681
- .alert .uncopied {
28682
- display: block;
28683
- color: var(--swc-negative-content-color-default);
28684
- }
28685
- .sections {
28686
- display: grid;
28687
- margin: 0;
28688
- padding: 0;
28689
- list-style: none;
28690
- }
28691
- .section {
28692
- display: grid;
28693
- }
28694
- .line {
28695
- display: flex;
28696
- flex-wrap: wrap;
28697
- align-items: center;
28698
- gap: var(--swc-spacing-100);
28699
- min-height: var(--swc-component-height-100);
28700
- padding: var(--swc-spacing-50) 0;
28701
- }
28702
- .toggle {
28703
- all: unset;
28704
- box-sizing: border-box;
28705
- flex: 1 1 auto;
28706
- min-width: 0;
28707
- display: flex;
28708
- align-items: center;
28709
- gap: var(--swc-spacing-75);
28710
- cursor: pointer;
28711
- border-radius: var(--swc-corner-radius-small-default);
28712
- }
28713
- .toggle:focus-visible {
28714
- outline: var(--swc-focus-indicator-thickness) solid var(--swc-focus-indicator-color);
28715
- outline-offset: var(--swc-focus-ring-gap);
28716
- }
28717
- .chevron {
28718
- flex: none;
28719
- width: var(--swc-component-height-50);
28720
- display: inline-flex;
28721
- justify-content: center;
28722
- color: var(--swc-neutral-subdued-content-color-default);
28723
- }
28724
- .toggle[aria-expanded='true'] swc-icon-chevron-right {
28725
- transform: rotate(90deg);
28726
- }
28727
- :host(:dir(rtl)) .toggle[aria-expanded='false'] swc-icon-chevron-right {
28728
- transform: scaleX(-1);
28729
- }
28730
- .line .name {
28731
- flex: 1 1 auto;
28732
- min-width: 0;
28733
- }
28734
- .line .num {
28735
- font-weight: var(--swc-bold-font-weight);
28736
- font-variant-numeric: tabular-nums;
28737
- }
28738
- .rows {
28739
- display: grid;
28740
- gap: var(--swc-spacing-50);
28741
- margin: 0 0 var(--swc-spacing-100);
28742
- padding: 0;
28743
- padding-inline-start: calc(var(--swc-component-height-50) + var(--swc-spacing-75));
28744
- list-style: none;
28745
- }
28746
- .row {
28747
- display: grid;
28748
- grid-template-columns: minmax(0, 1fr) auto;
28749
- align-items: center;
28750
- column-gap: var(--swc-spacing-100);
28751
- padding-inline-start: calc(var(--depth, 0) * var(--swc-spacing-300));
28752
- }
28753
- .row swc-status-light {
28754
- min-width: 0;
28755
- overflow-wrap: break-word;
28756
- }
28757
- .row .badges {
28758
- grid-column: 2;
28759
- grid-row: 1 / span 2;
28760
- align-self: start;
28761
- display: flex;
28762
- flex-wrap: wrap;
28763
- justify-content: end;
28764
- gap: var(--swc-spacing-50);
28765
- }
28766
- .row swc-status-light {
28767
- grid-column: 1;
28768
- grid-row: 1;
28769
- }
28770
- .row .meta {
28771
- grid-column: 1;
28772
- grid-row: 2;
28773
- padding-inline-start: var(--swc-spacing-300);
28774
- color: var(--swc-neutral-subdued-content-color-default);
28775
- font-size: var(--swc-font-size-75);
28776
- overflow-wrap: break-word;
28777
- }
28778
- `
28779
- ];
28780
- subscribe(model) {
28781
- return [model.monitor.on("snapshot", () => this.requestUpdate())];
28782
- }
28783
- focus() {
28784
- this.focusOn(".bar swc-action-button");
28785
- }
28786
- #vital(vital) {
28787
- if (vital.ratio !== void 0) {
28788
- return b`<div class="vital" data-id=${vital.id}>
28789
- <swc-meter
28790
- size="s"
28791
- variant=${meterVariant2(vital.ratio)}
28792
- value=${Math.round(vital.ratio * 100)}
28793
- value-label=${vital.value}
28794
- ><span slot="label">${vital.label}</span>${vital.unit ? b`<span slot="description">${vital.unit}</span>` : A}</swc-meter
28795
- >
28796
- </div>`;
28797
- }
28798
- const line = vital.series ? sparkline(vital.series) : "";
28799
- return b`<div class="vital" data-id=${vital.id}>
28800
- <div class="label">${vital.label}</div>
28801
- <div><span class="value">${vital.value}</span>${vital.unit ? b`<span class="unit">${vital.unit}</span>` : A}${vital.delta ? b`<span class="delta">${vital.delta}</span>` : A}</div>
28802
- ${line ? b`<svg viewBox="0 0 120 28" preserveAspectRatio="none" aria-hidden="true">${w`<polyline points=${line}></polyline>`}</svg>` : A}
28803
- </div>`;
28804
- }
28805
- #alert(alert) {
28806
- const error = alert.severity === "error";
28807
- return b`<li class="alert" data-severity=${alert.severity}>
28808
- ${error ? b`<swc-icon-alert-diamond size="s" aria-hidden="true"></swc-icon-alert-diamond>` : b`<swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle>`}
28809
- <div><span class="sr">${error ? "Error: " : "Warning: "}</span><strong>${alert.title}</strong><span class="detail">${alert.detail}</span>${alert.command ? this.#command(alert.id, alert.command, alert.commandLabel ?? "Run") : A}</div>
28810
- </li>`;
28811
- }
28812
- #command(id, text2, label) {
28813
- const copied = this.copied?.id === id && this.copied.text === text2 ? this.copied : null;
28814
- return b`<span class="lead">${label}:</span><div class="command" data-command><code>${text2}</code><swc-action-button size="s" quiet data-action="copy-command" accessible-label=${copied?.done ? "Copied" : "Copy command"} @click=${() => this.#copy(id, text2)}><swc-icon-copy slot="icon"></swc-icon-copy>${copied?.done ? "Copied" : "Copy"}</swc-action-button></div>${copied && !copied.done ? b`<span class="uncopied" role="alert" data-error="copy">Couldn’t copy. Select the command and copy it.</span>` : A}`;
28815
- }
28816
- async #copy(id, text2) {
28817
- this.copied = { id, text: text2, done: await copyText(text2) };
28818
- }
28819
- #open(id) {
28820
- this.dispatchEvent(
28821
- new CustomEvent("show-surface", { detail: { id }, bubbles: true, composed: true })
28822
- );
28823
- }
28824
- #row(row) {
28825
- const depth = indent2(row.depth);
28826
- return b`<li class="row" data-id=${row.id ?? A} data-status=${row.status} data-depth=${depth || A} style=${depth ? `--depth: ${depth}` : A}>
28827
- <swc-status-light size="s" variant=${rowLights[row.status]}><span class="sr">${rowSpoken[row.status]}: </span>${row.name.split(/(?<=\/)/).map((part2, i26) => i26 ? b`<wbr>${part2}` : part2)}</swc-status-light>
28828
- <span class="badges">${(row.badges ?? []).map((badge) => b`<swc-badge size="s" variant="neutral" subtle>${badge}</swc-badge>`)}</span>
28829
- ${row.meta ? b`<span class="meta">${row.meta}</span>` : A}
28830
- </li>`;
28831
- }
28832
- #section(section) {
28833
- const flag = attention(section);
28834
- const surface2 = surfaces2[section.id];
28835
- const rows = section.rows.length > 0;
28836
- const open = rows && (this.expanded[section.id] ?? flag !== null);
28837
- const list5 = `rows-${section.id}`;
28838
- return b`<li class="section" data-id=${section.id} data-open=${open ? "" : A}>
28839
- <div class="line">
28840
- ${rows ? b`<button class="toggle" aria-expanded=${open ? "true" : "false"} aria-controls=${open ? list5 : A} @click=${() => {
28841
- this.expanded = { ...this.expanded, [section.id]: !open };
28842
- }}><span class="chevron"><swc-icon-chevron-right size="s" aria-hidden="true"></swc-icon-chevron-right></span><span class="name">${section.label}</span></button>` : b`<span class="chevron"></span><span class="name">${section.label}</span>`}
28843
- ${flag ? b`<swc-badge size="s" variant=${flag.variant} subtle>${flag.text}</swc-badge>` : A}
28844
- <span class="num">${section.rows.length}</span>
28845
- ${surface2 ? b`<swc-action-button size="s" quiet accessible-label=${`Open ${section.label}`} @click=${() => this.#open(surface2)}
28846
- >Open</swc-action-button
28847
- >` : A}
28848
- </div>
28849
- ${open ? b`<ul class="rows" id=${list5} aria-label=${section.label}>${c(
28850
- section.rows,
28851
- (row, i26) => row.id ?? i26,
28852
- (row) => this.#row(row)
28853
- )}</ul>` : A}
28854
- </li>`;
28855
- }
28856
- render() {
28857
- const snapshot2 = this.model?.monitor.snapshot();
28858
- return b`<div class="bar">
28859
- <span class="heading"><strong>Live monitor</strong><span>${snapshot2 ? `Updated ${new Date(snapshot2.updatedAt).toISOString().slice(11, 19)} UTC` : "No data"}</span></span>
28860
- <swc-action-button size="s" quiet @click=${() => this.model?.monitor.resync()}><swc-icon-refresh slot="icon"></swc-icon-refresh>Re-sync</swc-action-button>
28861
- </div>
28862
- <div class="body">
28863
- ${snapshot2 ? b`<div class="vitals">${snapshot2.vitals.map((vital) => this.#vital(vital))}</div>
28864
- ${snapshot2.alerts.length ? b`<ul class="alerts" aria-label="Alerts">${snapshot2.alerts.map((alert) => this.#alert(alert))}</ul>` : A}
28865
- <ul class="sections" aria-label="Activity">${snapshot2.sections.map((section) => this.#section(section))}</ul>` : A}
28866
- </div>`;
28867
- }
28868
- };
28869
-
28870
29140
  // src/app/notices.ts
28871
29141
  var SliccNotices = class extends ModelElement {
28872
29142
  static properties = {
@@ -29131,8 +29401,8 @@ function revealed(name, entries, now = Date.now(), more = false) {
29131
29401
  const start = startOfDay(now);
29132
29402
  const today = reveals.filter((entry) => entry.at >= start).length;
29133
29403
  const partial = more && (entries[entries.length - 1]?.at ?? 0) >= start;
29134
- const when = today ? `${partial ? "at least " : ""}${today} ${today === 1 ? "time" : "times"} today` : since(last.at, now);
29135
- return b`Revealed to programs ${when}, last by ${who(last)} with <code>${last.argv}</code>`;
29404
+ const when2 = today ? `${partial ? "at least " : ""}${today} ${today === 1 ? "time" : "times"} today` : since(last.at, now);
29405
+ return b`Revealed to programs ${when2}, last by ${who(last)} with <code>${last.argv}</code>`;
29136
29406
  }
29137
29407
  function changes(entry, devices) {
29138
29408
  if (entry.changes)
@@ -29193,8 +29463,8 @@ var importKinds = {
29193
29463
  };
29194
29464
  function exported(at) {
29195
29465
  if (at === void 0) return A;
29196
- const when = at === null ? "Never exported" : `Last exported ${new Intl.DateTimeFormat(void 0, { dateStyle: "medium" }).format(at)}`;
29197
- return b`<span class="muted" data-exported>${when}</span>`;
29466
+ const when2 = at === null ? "Never exported" : `Last exported ${new Intl.DateTimeFormat(void 0, { dateStyle: "medium" }).format(at)}`;
29467
+ return b`<span class="muted" data-exported>${when2}</span>`;
29198
29468
  }
29199
29469
  function prompt2(text2) {
29200
29470
  return text2.length > 200 ? `${text2.slice(0, 199)}\u2026` : text2;
@@ -30313,6 +30583,9 @@ var SliccSettings = class extends ThemedElement {
30313
30583
  color: var(--swc-neutral-subdued-content-color-default);
30314
30584
  font-size: var(--swc-font-size-75);
30315
30585
  }
30586
+ .switched {
30587
+ grid-column: 2;
30588
+ }
30316
30589
  .failure,
30317
30590
  .problem {
30318
30591
  display: flex;
@@ -30331,6 +30604,9 @@ var SliccSettings = class extends ThemedElement {
30331
30604
  grid-template-columns: minmax(0, 1fr);
30332
30605
  gap: var(--swc-spacing-75);
30333
30606
  }
30607
+ .switched {
30608
+ grid-column: 1;
30609
+ }
30334
30610
  .accounts {
30335
30611
  grid-template-columns: minmax(0, 1fr) max-content;
30336
30612
  row-gap: var(--swc-spacing-400);
@@ -30361,10 +30637,15 @@ var SliccSettings = class extends ThemedElement {
30361
30637
  ];
30362
30638
  subscribe(model) {
30363
30639
  const update = () => this.requestUpdate();
30640
+ const settle2 = () => {
30641
+ settleModels(model);
30642
+ update();
30643
+ };
30644
+ queueMicrotask(() => settleModels(model));
30364
30645
  return [
30365
30646
  ...super.subscribe(model),
30366
- model.settings.on("settings", update),
30367
- model.settings.on("accounts", update),
30647
+ model.settings.on("settings", settle2),
30648
+ model.settings.on("accounts", settle2),
30368
30649
  ...model.vault ? [model.vault.on("status", update)] : []
30369
30650
  ];
30370
30651
  }
@@ -30374,6 +30655,15 @@ var SliccSettings = class extends ThemedElement {
30374
30655
  #update(patch) {
30375
30656
  this.model?.settings.update(patch);
30376
30657
  }
30658
+ #pickModel(event2) {
30659
+ forgetSwitch(this.model);
30660
+ this.#update({ model: this.#value(event2) });
30661
+ }
30662
+ #switched(current) {
30663
+ const note = modelSwitch(this.model);
30664
+ if (note?.to.id !== current) return A;
30665
+ return b`<p class="hint switched" role="status" data-switched>Switched to ${note.to.label} because the previous model's provider isn't set up.</p>`;
30666
+ }
30377
30667
  #value(event2) {
30378
30668
  return event2.target.value;
30379
30669
  }
@@ -30721,9 +31011,10 @@ var SliccSettings = class extends ThemedElement {
30721
31011
  <div class="rows">
30722
31012
  <div class="row">
30723
31013
  <span class="label" id="model">Model for new cones</span>
30724
- <sp-picker size="m" label="Model" aria-labelledby="model" value=${value.model} @change=${(e120) => this.#update({ model: this.#value(e120) })}>
31014
+ <sp-picker size="m" label="Model" aria-labelledby="model" value=${value.model} @change=${(e120) => this.#pickModel(e120)}>
30725
31015
  ${chatModels(settings.models()).map((option2) => b`<sp-menu-item value=${option2.id}>${option2.label}<span slot="description">${option2.provider}</span></sp-menu-item>`)}
30726
31016
  </sp-picker>
31017
+ ${this.#switched(value.model)}
30727
31018
  </div>
30728
31019
  <div class="row">
30729
31020
  <span class="label" id="thinking">Thinking</span>
@@ -31140,12 +31431,12 @@ var SliccSprinkle = class extends ThemedElement {
31140
31431
  const held = { port, id, ready: false, value: null };
31141
31432
  this.#held = held;
31142
31433
  this.#frame = { key: "", doc: "" };
31143
- const settle = (value) => {
31434
+ const settle2 = (value) => {
31144
31435
  held.value = value ?? null;
31145
31436
  held.ready = true;
31146
31437
  if (this.#held === held) this.requestUpdate();
31147
31438
  };
31148
- ask.call(port, id, "getState", []).then(settle, () => settle(null));
31439
+ ask.call(port, id, "getState", []).then(settle2, () => settle2(null));
31149
31440
  }
31150
31441
  willUpdate(changed) {
31151
31442
  super.willUpdate(changed);
@@ -43113,8 +43404,8 @@ var SecondPassVisitor = {
43113
43404
  openRefs,
43114
43405
  reffedNodesByReferencer
43115
43406
  }) {
43116
- const origin = groupOriginByCopy.get(node);
43117
- if (origin && openRefs.has(node.number)) {
43407
+ const origin2 = groupOriginByCopy.get(node);
43408
+ if (origin2 && openRefs.has(node.number)) {
43118
43409
  const recursion2 = setParent(createRecursion(node.number), parent);
43119
43410
  reffedNodesByReferencer.set(recursion2, openRefs.get(node.number));
43120
43411
  replaceWith(recursion2);
@@ -43131,7 +43422,7 @@ var SecondPassVisitor = {
43131
43422
  if (
43132
43423
  // This group is from subroutine expansion, and there's a multiplex value from either the
43133
43424
  // origin node or a prior subroutine expansion group with the same origin
43134
- origin === multiplex.node || origin && origin === multiplex.origin || // This group is not from subroutine expansion, and it comes after a subroutine expansion
43425
+ origin2 === multiplex.node || origin2 && origin2 === multiplex.origin || // This group is not from subroutine expansion, and it comes after a subroutine expansion
43135
43426
  // group that refers to this group
43136
43427
  node === multiplex.origin
43137
43428
  ) {
@@ -43139,14 +43430,14 @@ var SecondPassVisitor = {
43139
43430
  break;
43140
43431
  }
43141
43432
  }
43142
- multiplexCapturesToLeftByRef.get(node.number).push({ node, origin });
43433
+ multiplexCapturesToLeftByRef.get(node.number).push({ node, origin: origin2 });
43143
43434
  if (node.name) {
43144
- multiplexCapturesToLeftByRef.get(node.name).push({ node, origin });
43435
+ multiplexCapturesToLeftByRef.get(node.name).push({ node, origin: origin2 });
43145
43436
  }
43146
43437
  if (node.name) {
43147
43438
  const groupsWithSameName = getOrInsert(groupsByName, node.name, /* @__PURE__ */ new Map());
43148
43439
  let hasDuplicateNameToRemove = false;
43149
- if (origin) {
43440
+ if (origin2) {
43150
43441
  hasDuplicateNameToRemove = true;
43151
43442
  } else {
43152
43443
  for (const groupInfo of groupsWithSameName.values()) {
@@ -43618,11 +43909,11 @@ var generator = {
43618
43909
  CapturingGroup(node, state3, gen) {
43619
43910
  const { body: body4, name, number: number2 } = node;
43620
43911
  const data = { ignoreCase: state3.currentFlags.ignoreCase };
43621
- const origin = state3.originMap.get(node);
43622
- if (origin) {
43912
+ const origin2 = state3.originMap.get(node);
43913
+ if (origin2) {
43623
43914
  data.hidden = true;
43624
- if (number2 > origin.number) {
43625
- data.transferTo = origin.number;
43915
+ if (number2 > origin2.number) {
43916
+ data.transferTo = origin2.number;
43626
43917
  }
43627
43918
  }
43628
43919
  state3.captureMap.set(number2, data);
@@ -70542,13 +70833,13 @@ var DockviewComponent = class extends BaseGrid {
70542
70833
  /** ISmartGuidesHost: the main grid's splitter (sash) rectangles, in the
70543
70834
  * floating container's coordinate space, for the optional splitter target. */
70544
70835
  getGridSplitterRects() {
70545
- const origin = this.getFloatingContainer().getBoundingClientRect();
70836
+ const origin2 = this.getFloatingContainer().getBoundingClientRect();
70546
70837
  const result = [];
70547
70838
  this.gridview.element.querySelectorAll(".dv-sash").forEach((sash) => {
70548
70839
  const r40 = sash.getBoundingClientRect();
70549
70840
  result.push({
70550
- left: r40.left - origin.left,
70551
- top: r40.top - origin.top,
70841
+ left: r40.left - origin2.left,
70842
+ top: r40.top - origin2.top,
70552
70843
  width: r40.width,
70553
70844
  height: r40.height
70554
70845
  });
@@ -72775,10 +73066,10 @@ var DockviewComponent = class extends BaseGrid {
72775
73066
  * therefore report as one, tagged with the kind of the last to finish.
72776
73067
  */
72777
73068
  openMutation(kind) {
72778
- const origin = this._origin;
73069
+ const origin2 = this._origin;
72779
73070
  if (this._mutationDepth === 0) this._onWillMutateLayout.fire({
72780
73071
  kind,
72781
- origin
73072
+ origin: origin2
72782
73073
  });
72783
73074
  this._mutationDepth++;
72784
73075
  return () => {
@@ -72788,7 +73079,7 @@ var DockviewComponent = class extends BaseGrid {
72788
73079
  this.flushLocationChanges();
72789
73080
  this._onDidMutateLayout.fire({
72790
73081
  kind,
72791
- origin
73082
+ origin: origin2
72792
73083
  });
72793
73084
  }
72794
73085
  };
@@ -72852,10 +73143,10 @@ var DockviewComponent = class extends BaseGrid {
72852
73143
  * call made while a mutation is already in flight) keeps whatever the
72853
73144
  * enclosing operation established, so the trigger always wins.
72854
73145
  */
72855
- withOrigin(origin, func) {
73146
+ withOrigin(origin2, func) {
72856
73147
  if (this._originDepth > 0 || this._mutationDepth > 0) return func();
72857
73148
  const previous = this._origin;
72858
- this._origin = origin;
73149
+ this._origin = origin2;
72859
73150
  this._originDepth++;
72860
73151
  try {
72861
73152
  return func();
@@ -83018,8 +83309,9 @@ export {
83018
83309
  panelCommand,
83019
83310
  prompt,
83020
83311
  resolveColor,
83312
+ secretRules,
83021
83313
  setGrammarBase,
83022
- surfaces
83314
+ surfaces2 as surfaces
83023
83315
  };
83024
83316
  /*! Bundled license information:
83025
83317