@volter-ai-dev/supercode-ui 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -91,6 +91,14 @@ drafts, and artifact materialization remain explicit callbacks. A
91
91
  browser should receive projected state from a trusted host rather than instantiate a local
92
92
  controller or gain filesystem authority.
93
93
 
94
+ The default controller projection is display-bounded: 120 visible transcript rows, at most 480
95
+ native entries inspected to fill that tail, 16,000 characters per independent entry field, 100
96
+ session rows, 20 fidelity-residue details, and 50 subagents. It filters harness-injected context
97
+ before counting visible rows, retains native timestamps and typed tool/request lifecycles, and keeps
98
+ the uncapped residue count truthful. Hosts can narrow those limits with `ClientProjectionOptions`
99
+ and can overlay a machine-wide session inventory, pagination state, attention, drafts, attachment
100
+ errors, and owned/attached identities without reimplementing transcript or capability semantics.
101
+
94
102
  ## Modularity contract
95
103
 
96
104
  - Every component accepts data and callbacks. No component reaches into a global controller.
package/components.mjs CHANGED
@@ -6,6 +6,7 @@ var HARNESS_NAMES = Object.freeze({
6
6
  "claude-code": "Claude Code",
7
7
  codex: "Codex",
8
8
  gemini: "Gemini CLI",
9
+ goose: "Goose",
9
10
  opencode: "OpenCode",
10
11
  pi: "Pi",
11
12
  grok: "Grok"
@@ -735,6 +736,11 @@ var LOGOS = {
735
736
  viewBox: "-1 -1 26 26",
736
737
  paths: [["path", { d: "M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815" }]]
737
738
  },
739
+ // Canonical mark from block/goose's documentation/static/img/goose.svg.
740
+ goose: {
741
+ viewBox: "0 0 45 45",
742
+ paths: [["path", { d: "M43.2098 39.2492L39.8118 36.4522C37.9646 34.9318 36.3923 33.1051 35.1631 31.0529C33.4647 28.2172 31.1178 25.8243 28.3164 24.071L26.9482 23.2744C26.4794 22.9485 26.1525 22.4405 26.106 21.8675C26.0762 21.4981 26.1647 21.1678 26.3712 20.8771C27.0837 19.873 30.9617 15.6995 31.6365 15.1411C32.5056 14.4228 33.4739 13.8253 34.3724 13.1412C34.5001 13.0438 34.6283 12.9469 34.7545 12.8481C35.0574 12.6088 35.3295 12.3671 35.5458 12.0803C36.5993 10.8604 36.5783 9.82938 36.5783 9.82938C36.4677 9.5534 36.0645 8.69902 35.2449 8.29825C35.9696 8.28406 36.7872 8.55564 37.1582 8.91873C37.6039 8.21947 37.8922 7.76585 38.3404 7.00347C38.4471 6.82241 38.5038 6.48771 38.2998 6.30029C38.1114 6.11287 37.6416 6.01697 37.4606 6.12364C36.4692 6.70693 35.5047 7.33475 34.6351 7.88525C34.6351 7.88525 33.6046 7.86372 32.3842 8.91775C32.097 9.13452 31.8552 9.4066 31.6282 9.69433C31.5171 9.83476 31.4202 9.96297 31.3233 10.0912C30.6387 10.9901 30.0417 11.958 29.3234 12.8271C28.7656 13.5023 24.5915 17.3798 23.5874 18.0923C23.2967 18.2988 22.9669 18.3879 22.597 18.3575C22.0245 18.3115 21.5161 17.9842 21.1902 17.5154L20.3935 16.1472C18.6402 13.3448 16.2474 10.9989 13.4117 9.30041C11.3594 8.0712 9.5332 6.49847 8.01234 4.65172L5.2153 1.25377C5.0773 1.08642 4.81306 1.11382 4.71422 1.30662C4.39615 1.92612 3.78888 3.23411 3.32353 4.99327C3.92786 5.81095 5.26717 7.35089 6.8624 8.65351C6.97348 8.74403 6.88246 8.92313 6.74447 8.88496C5.36846 8.51013 4.03062 7.90825 3.02944 7.39542C2.94772 7.35383 2.84887 7.4057 2.83713 7.49672C2.68152 8.74354 2.64139 10.1127 2.80581 11.5562C4.02572 12.1596 5.85143 12.8804 7.76816 13.3389C7.90713 13.3722 7.90273 13.5723 7.76229 13.5992C6.26982 13.8801 4.70688 13.9427 3.43656 13.9261C3.3475 13.9251 3.28193 14.0093 3.30591 14.0949C3.56085 14.9958 3.90632 15.9118 4.3619 16.8342C4.55029 17.2487 4.75532 17.6553 4.97504 18.0532C6.21207 18.107 7.47946 17.9964 8.75369 17.7713C8.97095 17.7331 9.08741 18.0189 8.90391 18.1417C8.03877 18.7201 7.11588 19.2183 6.25758 19.6283C6.14259 19.6836 6.1054 19.8304 6.18125 19.9327C6.69114 20.6236 7.25191 21.2774 7.86114 21.8866C7.86114 21.8866 10.8608 24.9763 10.9425 25.2185C12.6928 23.4261 15.5701 21.4394 18.7474 19.7047C14.4921 23.1672 12.1198 25.7235 10.9258 27.1758L10.0935 28.3439C9.66091 28.9507 9.2856 29.5951 8.97193 30.2709C7.92231 32.5292 6.19201 37.0966 6.19201 37.0966C6.0594 37.4543 6.16755 37.8072 6.39753 38.0371C6.66031 38.2999 7.01263 38.4076 7.37033 38.275C7.37033 38.275 11.9368 36.5447 14.1961 35.495C14.8719 35.1814 15.5168 34.8056 16.1231 34.3735L17.4095 33.457C18.0907 32.9715 19.0234 33.0489 19.615 33.6405L22.5804 36.6058C23.1896 37.2151 23.8433 37.7758 24.5343 38.2857C24.637 38.3611 24.7833 38.3244 24.8386 38.2094C25.2492 37.3516 25.7473 36.4277 26.3252 35.5631C26.4481 35.3796 26.7343 35.4965 26.6957 35.7133C26.4701 36.988 26.3605 38.2554 26.3086 39.3035C27.2178 39.9172 28.5551 40.5606 30.3721 41.1611C30.4577 41.185 30.5419 41.1195 30.5409 41.0304C30.5237 39.7596 30.5864 38.1967 30.8677 36.7047C30.8942 36.5638 31.0943 36.5593 31.1281 36.6988C31.5861 38.616 32.3069 40.4417 32.8041 41.5829C34.3543 41.8256 35.7234 41.7855 36.9703 41.6298C37.0618 41.6186 37.1136 41.5197 37.0715 41.4375C36.5587 40.4364 35.9568 39.0975 35.582 37.7225C35.5443 37.584 35.7229 37.4935 35.8135 37.6046C37.1161 39.1998 38.656 40.5391 39.3548 41.1175C41.2333 40.6786 42.5413 40.0713 43.1604 39.7528C43.3532 39.6539 43.3806 39.3897 43.2132 39.2517Z" }]]
743
+ },
738
744
  opencode: { viewBox: "2.5 0 19 24", paths: [["path", { d: "M16 6H8v12h8V6zm4 16H4V2h16v20z" }]] },
739
745
  pi: {
740
746
  viewBox: "0 0 24 24",
package/composer.mjs CHANGED
@@ -6,6 +6,7 @@ var HARNESS_NAMES = Object.freeze({
6
6
  "claude-code": "Claude Code",
7
7
  codex: "Codex",
8
8
  gemini: "Gemini CLI",
9
+ goose: "Goose",
9
10
  opencode: "OpenCode",
10
11
  pi: "Pi",
11
12
  grok: "Grok"
package/controller.d.ts CHANGED
@@ -7,7 +7,10 @@ import type {
7
7
  SupercodeController,
8
8
  } from '@volter-ai-dev/supercode-client';
9
9
  import type {
10
+ AttachedSessionModel,
10
11
  SessionAttention,
12
+ SessionRowModel,
13
+ StartupPhase,
11
14
  SupercodeUiIntent,
12
15
  SupercodeUiState,
13
16
  UiAdapter,
@@ -15,12 +18,33 @@ import type {
15
18
 
16
19
  export interface ClientProjectionOptions {
17
20
  now?: number;
21
+ /** Maximum rendered conversation rows after hidden context is removed. Default 120. */
22
+ maxEntries?: number;
23
+ /** Maximum native entries inspected to fill the rendered tail. Default four times `maxEntries`. */
24
+ maxScanEntries?: number;
25
+ /** Maximum characters retained independently in each rendered entry field. Default 16,000. */
26
+ maxEntryChars?: number;
27
+ /** Maximum controller-inventory rows projected when the host does not supply `sessions`. Default 100. */
28
+ maxSessions?: number;
29
+ /** Age in milliseconds for treating an inventory row as recently live. Default five minutes. */
30
+ liveWindowMs?: number;
31
+ /** Bounded native fidelity details; total counts remain truthful when arrays are shortened. */
32
+ maxResidueItems?: number;
33
+ maxResidueChars?: number;
34
+ maxSubagents?: number;
35
+ /** Host bootstrap phase before the controller itself is ready. */
36
+ startup?: StartupPhase;
18
37
  attention?: SessionAttention[];
19
38
  savedDraft?: string;
20
39
  history?: Partial<SupercodeUiState['history']>;
21
40
  exportBackTarget?: SessionFormat | null;
22
41
  exportReceipt?: SupercodeUiState['exportReceipt'];
23
42
  reductionReceipt?: SupercodeUiState['reductionReceipt'];
43
+ /** Trusted-host inventory and lifecycle overlays (for example a machine-wide session catalog). */
44
+ sessions?: SessionRowModel[];
45
+ attached?: AttachedSessionModel | null;
46
+ owned?: AttachedSessionModel | null;
47
+ attachError?: SupercodeUiState['attachError'];
24
48
  }
25
49
 
26
50
  export function projectClientSnapshot(
package/controller.mjs CHANGED
@@ -3,11 +3,22 @@ import { normalizeUiState } from './core.mjs';
3
3
  const HARNESS_LABELS = {
4
4
  'claude-code': 'Claude Code',
5
5
  codex: 'Codex',
6
+ gemini: 'Gemini CLI',
7
+ goose: 'Goose',
6
8
  opencode: 'OpenCode',
7
9
  pi: 'Pi',
8
10
  grok: 'Grok',
9
11
  };
10
12
 
13
+ const DEFAULT_MAX_ENTRIES = 120;
14
+ const DEFAULT_MAX_ENTRY_CHARS = 16_000;
15
+ const DEFAULT_MAX_SESSIONS = 100;
16
+ const DEFAULT_LIVE_WINDOW_MS = 300_000;
17
+ const MAX_PILL_LABEL_CHARS = 72;
18
+ const DEFAULT_MAX_RESIDUE_ITEMS = 20;
19
+ const DEFAULT_MAX_RESIDUE_CHARS = 300;
20
+ const DEFAULT_MAX_SUBAGENTS = 50;
21
+
11
22
  function label(id, supplied) {
12
23
  return supplied || HARNESS_LABELS[id] || id;
13
24
  }
@@ -36,56 +47,145 @@ function payloadText(payload) {
36
47
  }
37
48
  }
38
49
 
39
- function projectConversation(conversation) {
40
- return conversation.flatMap((entry) => {
41
- if (!entry || typeof entry !== 'object' || typeof entry.id !== 'string') return [];
42
- if (entry.kind === 'message') {
43
- return [{
44
- id: entry.id,
45
- role: entry.role,
46
- text: entry.text ?? '',
47
- ts: null,
48
- truncated: false,
49
- ...(Array.isArray(entry.context) ? { context: entry.context } : {}),
50
- }];
50
+ function cloneJsonValue(value) {
51
+ if (Array.isArray(value)) return value.map(cloneJsonValue);
52
+ if (value !== null && typeof value === 'object') {
53
+ return Object.fromEntries(Object.entries(value).map(([key, nested]) => [key, cloneJsonValue(nested)]));
54
+ }
55
+ return value;
56
+ }
57
+
58
+ function positiveInteger(value, fallback) {
59
+ return Number.isInteger(value) && value > 0 ? value : fallback;
60
+ }
61
+
62
+ function truncate(value, max) {
63
+ const text = typeof value === 'string' ? value : '';
64
+ if (text.length <= max) return { text, truncated: false };
65
+ let end = max;
66
+ const last = text.charCodeAt(end - 1);
67
+ const next = text.charCodeAt(end);
68
+ if (last >= 0xd800 && last <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) end -= 1;
69
+ return { text: `${text.slice(0, end)}…`, truncated: true };
70
+ }
71
+
72
+ function timestampFromMetadata(metadata) {
73
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) return null;
74
+ for (const key of ['timestamp', 'ts', 'time', 'created_at', 'createdAt', 'date']) {
75
+ const raw = metadata[key];
76
+ if (typeof raw !== 'string' || raw === '') continue;
77
+ if (/^\d+$/.test(raw)) {
78
+ const value = Number(raw);
79
+ if (Number.isFinite(value) && value > 0) return value < 1e11 ? value * 1000 : value;
80
+ continue;
51
81
  }
52
- if (entry.kind === 'tool') {
53
- return [{
54
- id: entry.id,
55
- role: 'tool',
56
- text: entry.resultText ?? '',
57
- ts: null,
58
- truncated: false,
59
- ...(entry.name ? { label: entry.name } : {}),
60
- ...(entry.arguments ? { arguments: entry.arguments } : {}),
61
- resultText: entry.resultText ?? '',
82
+ const value = Date.parse(raw);
83
+ if (Number.isFinite(value)) return value;
84
+ }
85
+ return null;
86
+ }
87
+
88
+ function projectContext(context) {
89
+ if (!Array.isArray(context)) return undefined;
90
+ const projected = context.flatMap((item) => item && typeof item === 'object'
91
+ && typeof item.label === 'string' && typeof item.detail === 'string'
92
+ ? [{
93
+ ...(typeof item.id === 'string' ? { id: item.id } : {}),
94
+ ...(typeof item.kind === 'string' ? { kind: item.kind } : {}),
95
+ label: item.label,
96
+ detail: item.detail,
97
+ }]
98
+ : []);
99
+ return projected.length ? projected : undefined;
100
+ }
101
+
102
+ function requestSummary(entry) {
103
+ const options = Array.isArray(entry.options)
104
+ ? entry.options.map((option) => option?.name).filter(Boolean).join(' / ')
105
+ : '';
106
+ const resolution = entry.resolution?.name ? ` → ${entry.resolution.name}` : '';
107
+ return options ? `${entry.requestKind}: ${options}${resolution}` : `${entry.requestKind ?? 'request'}${resolution}`;
108
+ }
109
+
110
+ function projectConversationEntry(entry, maxEntryChars) {
111
+ if (!entry || typeof entry !== 'object' || typeof entry.id !== 'string') return null;
112
+ if (entry.kind === 'message') {
113
+ if (entry.visibility === 'context') return null;
114
+ const body = truncate(entry.text, maxEntryChars);
115
+ const context = projectContext(entry.context);
116
+ return {
117
+ id: entry.id,
118
+ role: entry.role,
119
+ text: body.text,
120
+ ts: timestampFromMetadata(entry.metadata),
121
+ truncated: body.truncated,
122
+ ...(context ? { context } : {}),
123
+ };
124
+ }
125
+ if (entry.kind === 'tool') {
126
+ const argumentsText = truncate((entry.arguments ?? '').trim(), maxEntryChars);
127
+ const result = truncate((entry.resultText ?? '').trim(), maxEntryChars);
128
+ const primary = entry.status === 'pending' ? argumentsText : result;
129
+ return {
130
+ id: entry.id,
131
+ role: 'tool',
132
+ text: primary.text,
133
+ ts: timestampFromMetadata(entry.metadata),
134
+ truncated: argumentsText.truncated || result.truncated,
135
+ label: entry.name ?? 'tool',
136
+ arguments: argumentsText.text,
137
+ resultText: result.text,
138
+ status: entry.status,
139
+ };
140
+ }
141
+ if (entry.kind === 'reasoning') {
142
+ const body = truncate(entry.text, maxEntryChars);
143
+ return { id: entry.id, role: 'reasoning', text: body.text, ts: null, truncated: body.truncated, streaming: entry.streaming === true };
144
+ }
145
+ if (entry.kind === 'request') {
146
+ const summary = truncate(requestSummary(entry), maxEntryChars);
147
+ const payload = truncate(payloadText(entry.payload), maxEntryChars);
148
+ return {
149
+ id: entry.id,
150
+ role: 'request',
151
+ text: summary.text,
152
+ ts: null,
153
+ truncated: summary.truncated || payload.truncated,
154
+ request: {
155
+ requestId: cloneJsonValue(entry.requestId),
156
+ requestKind: entry.requestKind,
157
+ payloadText: payload.text,
158
+ options: Array.isArray(entry.options) ? entry.options.map((option) => ({ ...option })) : [],
159
+ cancellable: entry.cancellable === true,
62
160
  status: entry.status,
63
- }];
64
- }
65
- if (entry.kind === 'reasoning') {
66
- return [{ id: entry.id, role: 'reasoning', text: entry.text ?? '', ts: null, truncated: false, streaming: entry.streaming === true }];
67
- }
68
- if (entry.kind === 'request') {
69
- return [{
70
- id: entry.id,
71
- role: 'request',
72
- text: payloadText(entry.payload),
73
- ts: null,
74
- truncated: false,
75
- request: {
76
- requestId: entry.requestId,
77
- requestKind: entry.requestKind,
78
- payloadText: payloadText(entry.payload),
79
- options: entry.options ?? [],
80
- cancellable: entry.cancellable === true,
81
- status: entry.status,
82
- resolution: entry.resolution ?? null,
83
- },
84
- }];
85
- }
86
- if (entry.kind === 'notice') return [{ id: entry.id, role: 'notice', text: entry.text ?? '', ts: null, truncated: false, code: entry.code }];
87
- return [];
88
- });
161
+ resolution: entry.resolution ? { ...entry.resolution } : null,
162
+ },
163
+ };
164
+ }
165
+ if (entry.kind === 'notice') {
166
+ const body = truncate(entry.text || entry.code, maxEntryChars);
167
+ return { id: entry.id, role: 'notice', text: body.text, ts: null, truncated: body.truncated, code: entry.code };
168
+ }
169
+ return null;
170
+ }
171
+
172
+ function projectConversation(conversation, options) {
173
+ if (!Array.isArray(conversation)) return [];
174
+ const maxEntries = positiveInteger(options.maxEntries, DEFAULT_MAX_ENTRIES);
175
+ const maxEntryChars = positiveInteger(options.maxEntryChars, DEFAULT_MAX_ENTRY_CHARS);
176
+ const maxScanEntries = positiveInteger(options.maxScanEntries, maxEntries * 4);
177
+ const rows = [];
178
+ // Start at the tail and stop as soon as the bounded render window is full. Hidden harness
179
+ // context never consumes a slot. The independent scan cap prevents a corrupt/all-context
180
+ // transcript from turning this display projection back into an unbounded whole-history walk.
181
+ for (let index = conversation.length - 1, scanned = 0;
182
+ index >= 0 && rows.length < maxEntries && scanned < maxScanEntries;
183
+ index -= 1, scanned += 1) {
184
+ const row = projectConversationEntry(conversation[index], maxEntryChars);
185
+ if (row) rows.push(row);
186
+ }
187
+ rows.reverse();
188
+ return rows;
89
189
  }
90
190
 
91
191
  function attached(snapshot) {
@@ -106,16 +206,20 @@ function attached(snapshot) {
106
206
  };
107
207
  }
108
208
 
109
- function semantics(session) {
209
+ function semantics(session, options) {
110
210
  if (!session) return { fidelity: null, residue: [], residueCount: 0, parseErrors: 0, rawRecords: 0, subagents: [] };
211
+ const residue = Array.isArray(session.residue) ? session.residue : [];
212
+ const maxResidueItems = positiveInteger(options.maxResidueItems, DEFAULT_MAX_RESIDUE_ITEMS);
213
+ const maxResidueChars = positiveInteger(options.maxResidueChars, DEFAULT_MAX_RESIDUE_CHARS);
214
+ const maxSubagents = positiveInteger(options.maxSubagents, DEFAULT_MAX_SUBAGENTS);
111
215
  return {
112
216
  fidelity: session.fidelity ?? null,
113
- residue: Array.isArray(session.residue) ? session.residue : [],
114
- residueCount: Array.isArray(session.residue) ? session.residue.length : 0,
217
+ residue: residue.slice(0, maxResidueItems).map((item) => truncate(String(item), maxResidueChars).text),
218
+ residueCount: residue.length,
115
219
  parseErrors: Number.isFinite(session.parse_error_lines) ? session.parse_error_lines : 0,
116
220
  rawRecords: Number.isFinite(session.raw_record_count) ? session.raw_record_count : 0,
117
- subagents: Array.isArray(session.subagents) ? session.subagents.map((child, index) => ({
118
- id: child.session_id ?? `${child.source}:${index}`,
221
+ subagents: Array.isArray(session.subagents) ? session.subagents.slice(0, maxSubagents).map((child, index) => ({
222
+ id: child.session_id ?? child.agent_id ?? `${child.source}:${index}`,
119
223
  source: child.source,
120
224
  model: child.model ?? null,
121
225
  messages: Array.isArray(child.messages) ? child.messages.length : 0,
@@ -124,12 +228,33 @@ function semantics(session) {
124
228
  };
125
229
  }
126
230
 
231
+ function projectPill(snapshot) {
232
+ const text = (value) => truncate(value, MAX_PILL_LABEL_CHARS).text;
233
+ const harness = snapshot.activeHarness ?? 'agent';
234
+ if (snapshot.availability === 'loading') return { tone: 'off', label: text('connecting…') };
235
+ if (snapshot.availability === 'unavailable' || snapshot.availability === 'error') {
236
+ return { tone: 'dead', label: text(snapshot.error?.message ?? 'supercode unavailable') };
237
+ }
238
+ if (snapshot.error) return { tone: 'warn', label: text(snapshot.error.message) };
239
+ if (snapshot.turn?.state === 'running') return { tone: 'live', label: text(`${label(harness)} working…`) };
240
+ if (snapshot.turn?.state === 'interrupting') return { tone: 'warn', label: text('interrupting…') };
241
+ if (snapshot.turn?.state === 'reconciling') return { tone: 'live', label: text('syncing…') };
242
+ if (snapshot.connection?.mode === 'none') return { tone: 'off', label: text('no session') };
243
+ if (snapshot.connection?.mode === 'mirror') {
244
+ return snapshot.connection.messaging === 'live_peer'
245
+ ? { tone: 'live', label: text(`${label(harness)} live`) }
246
+ : { tone: 'warn', label: text(`${label(harness)} (read-only)`) };
247
+ }
248
+ return { tone: 'live', label: text(`${label(harness)} ready`) };
249
+ }
250
+
127
251
  export function projectClientSnapshot(snapshot, options = {}) {
128
252
  const now = Number.isFinite(options.now) ? options.now : Date.now();
129
- const busy = snapshot.turn?.state && snapshot.turn.state !== 'idle';
253
+ const busy = ['running', 'interrupting', 'reconciling'].includes(snapshot.turn?.state);
130
254
  const actions = snapshot.availableActions ?? {};
131
- const active = attached(snapshot);
132
- const sessions = (snapshot.sessions ?? []).map((session) => ({
255
+ const maxSessions = positiveInteger(options.maxSessions, DEFAULT_MAX_SESSIONS);
256
+ const liveWindowMs = positiveInteger(options.liveWindowMs, DEFAULT_LIVE_WINDOW_MS);
257
+ const snapshotSessions = (snapshot.sessions ?? []).slice(0, maxSessions).map((session) => ({
133
258
  key: session.key,
134
259
  harness: session.harness,
135
260
  name: workspaceName(session.cwd),
@@ -139,20 +264,23 @@ export function projectClientSnapshot(snapshot, options = {}) {
139
264
  updatedAt: session.updatedAt ?? null,
140
265
  messages: session.messageCount ?? null,
141
266
  active: session.key === snapshot.activeSessionKey,
142
- live: typeof session.updatedAt === 'number' && now - session.updatedAt <= 300_000,
267
+ live: typeof session.updatedAt === 'number' && now - session.updatedAt <= liveWindowMs,
143
268
  runtimeStatus: session.liveStatus ?? null,
144
269
  }));
270
+ const sessions = options.sessions ?? snapshotSessions;
271
+ const active = options.attached === undefined ? attached(snapshot) : options.attached;
272
+ const owned = options.owned === undefined
273
+ ? snapshot.connection?.ownsRuntime ? active : null
274
+ : options.owned;
275
+ const maxEntries = positiveInteger(options.maxEntries, DEFAULT_MAX_ENTRIES);
276
+ const transcript = projectConversation(snapshot.conversation ?? [], options);
145
277
  const startup = snapshot.availability === 'loading'
146
278
  ? snapshot.operation === 'start' ? 'starting' : snapshot.operation === 'refresh' ? 'discovering' : 'connecting'
147
279
  : 'ready';
148
280
  return normalizeUiState({
149
- pill: snapshot.error
150
- ? { tone: 'dead', label: snapshot.error.message }
151
- : busy ? { tone: 'live', label: `${label(snapshot.activeHarness)} working` }
152
- : snapshot.availability === 'ready' ? { tone: 'live', label: `${label(snapshot.activeHarness) || 'Supercode'} ready` }
153
- : { tone: 'off', label: 'connecting…' },
154
- startup,
155
- transcript: projectConversation(snapshot.conversation ?? []),
281
+ pill: projectPill(snapshot),
282
+ startup: options.startup ?? startup,
283
+ transcript,
156
284
  busy,
157
285
  operation: snapshot.operation,
158
286
  needsInput: Array.isArray(snapshot.requests) && snapshot.requests.some((request) => request.status === 'pending'),
@@ -177,7 +305,7 @@ export function projectClientSnapshot(snapshot, options = {}) {
177
305
  residueCount: snapshot.taskPlan?.residue?.length ?? 0,
178
306
  observedAt: snapshot.taskPlan?.observedAt ?? null,
179
307
  },
180
- semantics: semantics(snapshot.activeSession),
308
+ semantics: semantics(snapshot.activeSession, options),
181
309
  terminalHandoff: snapshot.terminalLaunch ? {
182
310
  program: snapshot.terminalLaunch.program,
183
311
  arguments: snapshot.terminalLaunch.arguments,
@@ -198,15 +326,15 @@ export function projectClientSnapshot(snapshot, options = {}) {
198
326
  history: {
199
327
  sessionLimit: options.history?.sessionLimit ?? sessions.length,
200
328
  hasMoreSessions: options.history?.hasMoreSessions ?? false,
201
- transcriptLimit: options.history?.transcriptLimit ?? Math.max(120, snapshot.conversation?.length ?? 0),
202
- hasEarlier: options.history?.hasEarlier ?? false,
329
+ transcriptLimit: options.history?.transcriptLimit ?? maxEntries,
330
+ hasEarlier: options.history?.hasEarlier ?? (snapshot.conversation?.length ?? 0) > maxEntries,
203
331
  },
204
332
  savedDraft: options.savedDraft ?? '',
205
333
  attention: options.attention ?? [],
206
334
  sessions,
207
335
  attached: active,
208
- owned: snapshot.connection?.ownsRuntime ? active : null,
209
- attachError: null,
336
+ owned,
337
+ attachError: options.attachError ?? null,
210
338
  });
211
339
  }
212
340
 
package/conversation.mjs CHANGED
@@ -6,6 +6,7 @@ var HARNESS_NAMES = Object.freeze({
6
6
  "claude-code": "Claude Code",
7
7
  codex: "Codex",
8
8
  gemini: "Gemini CLI",
9
+ goose: "Goose",
9
10
  opencode: "OpenCode",
10
11
  pi: "Pi",
11
12
  grok: "Grok"
package/core.mjs CHANGED
@@ -2,6 +2,7 @@ const HARNESS_NAMES = Object.freeze({
2
2
  'claude-code': 'Claude Code',
3
3
  codex: 'Codex',
4
4
  gemini: 'Gemini CLI',
5
+ goose: 'Goose',
5
6
  opencode: 'OpenCode',
6
7
  pi: 'Pi',
7
8
  grok: 'Grok',
package/embed.mjs CHANGED
@@ -9,6 +9,7 @@ var HARNESS_NAMES = Object.freeze({
9
9
  "claude-code": "Claude Code",
10
10
  codex: "Codex",
11
11
  gemini: "Gemini CLI",
12
+ goose: "Goose",
12
13
  opencode: "OpenCode",
13
14
  pi: "Pi",
14
15
  grok: "Grok"
@@ -741,6 +742,11 @@ var LOGOS = {
741
742
  viewBox: "-1 -1 26 26",
742
743
  paths: [["path", { d: "M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815" }]]
743
744
  },
745
+ // Canonical mark from block/goose's documentation/static/img/goose.svg.
746
+ goose: {
747
+ viewBox: "0 0 45 45",
748
+ paths: [["path", { d: "M43.2098 39.2492L39.8118 36.4522C37.9646 34.9318 36.3923 33.1051 35.1631 31.0529C33.4647 28.2172 31.1178 25.8243 28.3164 24.071L26.9482 23.2744C26.4794 22.9485 26.1525 22.4405 26.106 21.8675C26.0762 21.4981 26.1647 21.1678 26.3712 20.8771C27.0837 19.873 30.9617 15.6995 31.6365 15.1411C32.5056 14.4228 33.4739 13.8253 34.3724 13.1412C34.5001 13.0438 34.6283 12.9469 34.7545 12.8481C35.0574 12.6088 35.3295 12.3671 35.5458 12.0803C36.5993 10.8604 36.5783 9.82938 36.5783 9.82938C36.4677 9.5534 36.0645 8.69902 35.2449 8.29825C35.9696 8.28406 36.7872 8.55564 37.1582 8.91873C37.6039 8.21947 37.8922 7.76585 38.3404 7.00347C38.4471 6.82241 38.5038 6.48771 38.2998 6.30029C38.1114 6.11287 37.6416 6.01697 37.4606 6.12364C36.4692 6.70693 35.5047 7.33475 34.6351 7.88525C34.6351 7.88525 33.6046 7.86372 32.3842 8.91775C32.097 9.13452 31.8552 9.4066 31.6282 9.69433C31.5171 9.83476 31.4202 9.96297 31.3233 10.0912C30.6387 10.9901 30.0417 11.958 29.3234 12.8271C28.7656 13.5023 24.5915 17.3798 23.5874 18.0923C23.2967 18.2988 22.9669 18.3879 22.597 18.3575C22.0245 18.3115 21.5161 17.9842 21.1902 17.5154L20.3935 16.1472C18.6402 13.3448 16.2474 10.9989 13.4117 9.30041C11.3594 8.0712 9.5332 6.49847 8.01234 4.65172L5.2153 1.25377C5.0773 1.08642 4.81306 1.11382 4.71422 1.30662C4.39615 1.92612 3.78888 3.23411 3.32353 4.99327C3.92786 5.81095 5.26717 7.35089 6.8624 8.65351C6.97348 8.74403 6.88246 8.92313 6.74447 8.88496C5.36846 8.51013 4.03062 7.90825 3.02944 7.39542C2.94772 7.35383 2.84887 7.4057 2.83713 7.49672C2.68152 8.74354 2.64139 10.1127 2.80581 11.5562C4.02572 12.1596 5.85143 12.8804 7.76816 13.3389C7.90713 13.3722 7.90273 13.5723 7.76229 13.5992C6.26982 13.8801 4.70688 13.9427 3.43656 13.9261C3.3475 13.9251 3.28193 14.0093 3.30591 14.0949C3.56085 14.9958 3.90632 15.9118 4.3619 16.8342C4.55029 17.2487 4.75532 17.6553 4.97504 18.0532C6.21207 18.107 7.47946 17.9964 8.75369 17.7713C8.97095 17.7331 9.08741 18.0189 8.90391 18.1417C8.03877 18.7201 7.11588 19.2183 6.25758 19.6283C6.14259 19.6836 6.1054 19.8304 6.18125 19.9327C6.69114 20.6236 7.25191 21.2774 7.86114 21.8866C7.86114 21.8866 10.8608 24.9763 10.9425 25.2185C12.6928 23.4261 15.5701 21.4394 18.7474 19.7047C14.4921 23.1672 12.1198 25.7235 10.9258 27.1758L10.0935 28.3439C9.66091 28.9507 9.2856 29.5951 8.97193 30.2709C7.92231 32.5292 6.19201 37.0966 6.19201 37.0966C6.0594 37.4543 6.16755 37.8072 6.39753 38.0371C6.66031 38.2999 7.01263 38.4076 7.37033 38.275C7.37033 38.275 11.9368 36.5447 14.1961 35.495C14.8719 35.1814 15.5168 34.8056 16.1231 34.3735L17.4095 33.457C18.0907 32.9715 19.0234 33.0489 19.615 33.6405L22.5804 36.6058C23.1896 37.2151 23.8433 37.7758 24.5343 38.2857C24.637 38.3611 24.7833 38.3244 24.8386 38.2094C25.2492 37.3516 25.7473 36.4277 26.3252 35.5631C26.4481 35.3796 26.7343 35.4965 26.6957 35.7133C26.4701 36.988 26.3605 38.2554 26.3086 39.3035C27.2178 39.9172 28.5551 40.5606 30.3721 41.1611C30.4577 41.185 30.5419 41.1195 30.5409 41.0304C30.5237 39.7596 30.5864 38.1967 30.8677 36.7047C30.8942 36.5638 31.0943 36.5593 31.1281 36.6988C31.5861 38.616 32.3069 40.4417 32.8041 41.5829C34.3543 41.8256 35.7234 41.7855 36.9703 41.6298C37.0618 41.6186 37.1136 41.5197 37.0715 41.4375C36.5587 40.4364 35.9568 39.0975 35.582 37.7225C35.5443 37.584 35.7229 37.4935 35.8135 37.6046C37.1161 39.1998 38.656 40.5391 39.3548 41.1175C41.2333 40.6786 42.5413 40.0713 43.1604 39.7528C43.3532 39.6539 43.3806 39.3897 43.2132 39.2517Z" }]]
749
+ },
744
750
  opencode: { viewBox: "2.5 0 19 24", paths: [["path", { d: "M16 6H8v12h8V6zm4 16H4V2h16v20z" }]] },
745
751
  pi: {
746
752
  viewBox: "0 0 24 24",
package/logo.mjs CHANGED
@@ -22,6 +22,11 @@ var LOGOS = {
22
22
  viewBox: "-1 -1 26 26",
23
23
  paths: [["path", { d: "M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815" }]]
24
24
  },
25
+ // Canonical mark from block/goose's documentation/static/img/goose.svg.
26
+ goose: {
27
+ viewBox: "0 0 45 45",
28
+ paths: [["path", { d: "M43.2098 39.2492L39.8118 36.4522C37.9646 34.9318 36.3923 33.1051 35.1631 31.0529C33.4647 28.2172 31.1178 25.8243 28.3164 24.071L26.9482 23.2744C26.4794 22.9485 26.1525 22.4405 26.106 21.8675C26.0762 21.4981 26.1647 21.1678 26.3712 20.8771C27.0837 19.873 30.9617 15.6995 31.6365 15.1411C32.5056 14.4228 33.4739 13.8253 34.3724 13.1412C34.5001 13.0438 34.6283 12.9469 34.7545 12.8481C35.0574 12.6088 35.3295 12.3671 35.5458 12.0803C36.5993 10.8604 36.5783 9.82938 36.5783 9.82938C36.4677 9.5534 36.0645 8.69902 35.2449 8.29825C35.9696 8.28406 36.7872 8.55564 37.1582 8.91873C37.6039 8.21947 37.8922 7.76585 38.3404 7.00347C38.4471 6.82241 38.5038 6.48771 38.2998 6.30029C38.1114 6.11287 37.6416 6.01697 37.4606 6.12364C36.4692 6.70693 35.5047 7.33475 34.6351 7.88525C34.6351 7.88525 33.6046 7.86372 32.3842 8.91775C32.097 9.13452 31.8552 9.4066 31.6282 9.69433C31.5171 9.83476 31.4202 9.96297 31.3233 10.0912C30.6387 10.9901 30.0417 11.958 29.3234 12.8271C28.7656 13.5023 24.5915 17.3798 23.5874 18.0923C23.2967 18.2988 22.9669 18.3879 22.597 18.3575C22.0245 18.3115 21.5161 17.9842 21.1902 17.5154L20.3935 16.1472C18.6402 13.3448 16.2474 10.9989 13.4117 9.30041C11.3594 8.0712 9.5332 6.49847 8.01234 4.65172L5.2153 1.25377C5.0773 1.08642 4.81306 1.11382 4.71422 1.30662C4.39615 1.92612 3.78888 3.23411 3.32353 4.99327C3.92786 5.81095 5.26717 7.35089 6.8624 8.65351C6.97348 8.74403 6.88246 8.92313 6.74447 8.88496C5.36846 8.51013 4.03062 7.90825 3.02944 7.39542C2.94772 7.35383 2.84887 7.4057 2.83713 7.49672C2.68152 8.74354 2.64139 10.1127 2.80581 11.5562C4.02572 12.1596 5.85143 12.8804 7.76816 13.3389C7.90713 13.3722 7.90273 13.5723 7.76229 13.5992C6.26982 13.8801 4.70688 13.9427 3.43656 13.9261C3.3475 13.9251 3.28193 14.0093 3.30591 14.0949C3.56085 14.9958 3.90632 15.9118 4.3619 16.8342C4.55029 17.2487 4.75532 17.6553 4.97504 18.0532C6.21207 18.107 7.47946 17.9964 8.75369 17.7713C8.97095 17.7331 9.08741 18.0189 8.90391 18.1417C8.03877 18.7201 7.11588 19.2183 6.25758 19.6283C6.14259 19.6836 6.1054 19.8304 6.18125 19.9327C6.69114 20.6236 7.25191 21.2774 7.86114 21.8866C7.86114 21.8866 10.8608 24.9763 10.9425 25.2185C12.6928 23.4261 15.5701 21.4394 18.7474 19.7047C14.4921 23.1672 12.1198 25.7235 10.9258 27.1758L10.0935 28.3439C9.66091 28.9507 9.2856 29.5951 8.97193 30.2709C7.92231 32.5292 6.19201 37.0966 6.19201 37.0966C6.0594 37.4543 6.16755 37.8072 6.39753 38.0371C6.66031 38.2999 7.01263 38.4076 7.37033 38.275C7.37033 38.275 11.9368 36.5447 14.1961 35.495C14.8719 35.1814 15.5168 34.8056 16.1231 34.3735L17.4095 33.457C18.0907 32.9715 19.0234 33.0489 19.615 33.6405L22.5804 36.6058C23.1896 37.2151 23.8433 37.7758 24.5343 38.2857C24.637 38.3611 24.7833 38.3244 24.8386 38.2094C25.2492 37.3516 25.7473 36.4277 26.3252 35.5631C26.4481 35.3796 26.7343 35.4965 26.6957 35.7133C26.4701 36.988 26.3605 38.2554 26.3086 39.3035C27.2178 39.9172 28.5551 40.5606 30.3721 41.1611C30.4577 41.185 30.5419 41.1195 30.5409 41.0304C30.5237 39.7596 30.5864 38.1967 30.8677 36.7047C30.8942 36.5638 31.0943 36.5593 31.1281 36.6988C31.5861 38.616 32.3069 40.4417 32.8041 41.5829C34.3543 41.8256 35.7234 41.7855 36.9703 41.6298C37.0618 41.6186 37.1136 41.5197 37.0715 41.4375C36.5587 40.4364 35.9568 39.0975 35.582 37.7225C35.5443 37.584 35.7229 37.4935 35.8135 37.6046C37.1161 39.1998 38.656 40.5391 39.3548 41.1175C41.2333 40.6786 42.5413 40.0713 43.1604 39.7528C43.3532 39.6539 43.3806 39.3897 43.2132 39.2517Z" }]]
29
+ },
25
30
  opencode: { viewBox: "2.5 0 19 24", paths: [["path", { d: "M16 6H8v12h8V6zm4 16H4V2h16v20z" }]] },
26
31
  pi: {
27
32
  viewBox: "0 0 24 24",
package/messenger.mjs CHANGED
@@ -6,6 +6,7 @@ var HARNESS_NAMES = Object.freeze({
6
6
  "claude-code": "Claude Code",
7
7
  codex: "Codex",
8
8
  gemini: "Gemini CLI",
9
+ goose: "Goose",
9
10
  opencode: "OpenCode",
10
11
  pi: "Pi",
11
12
  grok: "Grok"
@@ -738,6 +739,11 @@ var LOGOS = {
738
739
  viewBox: "-1 -1 26 26",
739
740
  paths: [["path", { d: "M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815" }]]
740
741
  },
742
+ // Canonical mark from block/goose's documentation/static/img/goose.svg.
743
+ goose: {
744
+ viewBox: "0 0 45 45",
745
+ paths: [["path", { d: "M43.2098 39.2492L39.8118 36.4522C37.9646 34.9318 36.3923 33.1051 35.1631 31.0529C33.4647 28.2172 31.1178 25.8243 28.3164 24.071L26.9482 23.2744C26.4794 22.9485 26.1525 22.4405 26.106 21.8675C26.0762 21.4981 26.1647 21.1678 26.3712 20.8771C27.0837 19.873 30.9617 15.6995 31.6365 15.1411C32.5056 14.4228 33.4739 13.8253 34.3724 13.1412C34.5001 13.0438 34.6283 12.9469 34.7545 12.8481C35.0574 12.6088 35.3295 12.3671 35.5458 12.0803C36.5993 10.8604 36.5783 9.82938 36.5783 9.82938C36.4677 9.5534 36.0645 8.69902 35.2449 8.29825C35.9696 8.28406 36.7872 8.55564 37.1582 8.91873C37.6039 8.21947 37.8922 7.76585 38.3404 7.00347C38.4471 6.82241 38.5038 6.48771 38.2998 6.30029C38.1114 6.11287 37.6416 6.01697 37.4606 6.12364C36.4692 6.70693 35.5047 7.33475 34.6351 7.88525C34.6351 7.88525 33.6046 7.86372 32.3842 8.91775C32.097 9.13452 31.8552 9.4066 31.6282 9.69433C31.5171 9.83476 31.4202 9.96297 31.3233 10.0912C30.6387 10.9901 30.0417 11.958 29.3234 12.8271C28.7656 13.5023 24.5915 17.3798 23.5874 18.0923C23.2967 18.2988 22.9669 18.3879 22.597 18.3575C22.0245 18.3115 21.5161 17.9842 21.1902 17.5154L20.3935 16.1472C18.6402 13.3448 16.2474 10.9989 13.4117 9.30041C11.3594 8.0712 9.5332 6.49847 8.01234 4.65172L5.2153 1.25377C5.0773 1.08642 4.81306 1.11382 4.71422 1.30662C4.39615 1.92612 3.78888 3.23411 3.32353 4.99327C3.92786 5.81095 5.26717 7.35089 6.8624 8.65351C6.97348 8.74403 6.88246 8.92313 6.74447 8.88496C5.36846 8.51013 4.03062 7.90825 3.02944 7.39542C2.94772 7.35383 2.84887 7.4057 2.83713 7.49672C2.68152 8.74354 2.64139 10.1127 2.80581 11.5562C4.02572 12.1596 5.85143 12.8804 7.76816 13.3389C7.90713 13.3722 7.90273 13.5723 7.76229 13.5992C6.26982 13.8801 4.70688 13.9427 3.43656 13.9261C3.3475 13.9251 3.28193 14.0093 3.30591 14.0949C3.56085 14.9958 3.90632 15.9118 4.3619 16.8342C4.55029 17.2487 4.75532 17.6553 4.97504 18.0532C6.21207 18.107 7.47946 17.9964 8.75369 17.7713C8.97095 17.7331 9.08741 18.0189 8.90391 18.1417C8.03877 18.7201 7.11588 19.2183 6.25758 19.6283C6.14259 19.6836 6.1054 19.8304 6.18125 19.9327C6.69114 20.6236 7.25191 21.2774 7.86114 21.8866C7.86114 21.8866 10.8608 24.9763 10.9425 25.2185C12.6928 23.4261 15.5701 21.4394 18.7474 19.7047C14.4921 23.1672 12.1198 25.7235 10.9258 27.1758L10.0935 28.3439C9.66091 28.9507 9.2856 29.5951 8.97193 30.2709C7.92231 32.5292 6.19201 37.0966 6.19201 37.0966C6.0594 37.4543 6.16755 37.8072 6.39753 38.0371C6.66031 38.2999 7.01263 38.4076 7.37033 38.275C7.37033 38.275 11.9368 36.5447 14.1961 35.495C14.8719 35.1814 15.5168 34.8056 16.1231 34.3735L17.4095 33.457C18.0907 32.9715 19.0234 33.0489 19.615 33.6405L22.5804 36.6058C23.1896 37.2151 23.8433 37.7758 24.5343 38.2857C24.637 38.3611 24.7833 38.3244 24.8386 38.2094C25.2492 37.3516 25.7473 36.4277 26.3252 35.5631C26.4481 35.3796 26.7343 35.4965 26.6957 35.7133C26.4701 36.988 26.3605 38.2554 26.3086 39.3035C27.2178 39.9172 28.5551 40.5606 30.3721 41.1611C30.4577 41.185 30.5419 41.1195 30.5409 41.0304C30.5237 39.7596 30.5864 38.1967 30.8677 36.7047C30.8942 36.5638 31.0943 36.5593 31.1281 36.6988C31.5861 38.616 32.3069 40.4417 32.8041 41.5829C34.3543 41.8256 35.7234 41.7855 36.9703 41.6298C37.0618 41.6186 37.1136 41.5197 37.0715 41.4375C36.5587 40.4364 35.9568 39.0975 35.582 37.7225C35.5443 37.584 35.7229 37.4935 35.8135 37.6046C37.1161 39.1998 38.656 40.5391 39.3548 41.1175C41.2333 40.6786 42.5413 40.0713 43.1604 39.7528C43.3532 39.6539 43.3806 39.3897 43.2132 39.2517Z" }]]
746
+ },
741
747
  opencode: { viewBox: "2.5 0 19 24", paths: [["path", { d: "M16 6H8v12h8V6zm4 16H4V2h16v20z" }]] },
742
748
  pi: {
743
749
  viewBox: "0 0 24 24",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter-ai-dev/supercode-ui",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "description": "Composable default UI kit for Supercode-powered coding-agent experiences",
6
6
  "exports": {
package/sessions.mjs CHANGED
@@ -6,6 +6,7 @@ var HARNESS_NAMES = Object.freeze({
6
6
  "claude-code": "Claude Code",
7
7
  codex: "Codex",
8
8
  gemini: "Gemini CLI",
9
+ goose: "Goose",
9
10
  opencode: "OpenCode",
10
11
  pi: "Pi",
11
12
  grok: "Grok"
@@ -138,6 +139,11 @@ var LOGOS = {
138
139
  viewBox: "-1 -1 26 26",
139
140
  paths: [["path", { d: "M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815" }]]
140
141
  },
142
+ // Canonical mark from block/goose's documentation/static/img/goose.svg.
143
+ goose: {
144
+ viewBox: "0 0 45 45",
145
+ paths: [["path", { d: "M43.2098 39.2492L39.8118 36.4522C37.9646 34.9318 36.3923 33.1051 35.1631 31.0529C33.4647 28.2172 31.1178 25.8243 28.3164 24.071L26.9482 23.2744C26.4794 22.9485 26.1525 22.4405 26.106 21.8675C26.0762 21.4981 26.1647 21.1678 26.3712 20.8771C27.0837 19.873 30.9617 15.6995 31.6365 15.1411C32.5056 14.4228 33.4739 13.8253 34.3724 13.1412C34.5001 13.0438 34.6283 12.9469 34.7545 12.8481C35.0574 12.6088 35.3295 12.3671 35.5458 12.0803C36.5993 10.8604 36.5783 9.82938 36.5783 9.82938C36.4677 9.5534 36.0645 8.69902 35.2449 8.29825C35.9696 8.28406 36.7872 8.55564 37.1582 8.91873C37.6039 8.21947 37.8922 7.76585 38.3404 7.00347C38.4471 6.82241 38.5038 6.48771 38.2998 6.30029C38.1114 6.11287 37.6416 6.01697 37.4606 6.12364C36.4692 6.70693 35.5047 7.33475 34.6351 7.88525C34.6351 7.88525 33.6046 7.86372 32.3842 8.91775C32.097 9.13452 31.8552 9.4066 31.6282 9.69433C31.5171 9.83476 31.4202 9.96297 31.3233 10.0912C30.6387 10.9901 30.0417 11.958 29.3234 12.8271C28.7656 13.5023 24.5915 17.3798 23.5874 18.0923C23.2967 18.2988 22.9669 18.3879 22.597 18.3575C22.0245 18.3115 21.5161 17.9842 21.1902 17.5154L20.3935 16.1472C18.6402 13.3448 16.2474 10.9989 13.4117 9.30041C11.3594 8.0712 9.5332 6.49847 8.01234 4.65172L5.2153 1.25377C5.0773 1.08642 4.81306 1.11382 4.71422 1.30662C4.39615 1.92612 3.78888 3.23411 3.32353 4.99327C3.92786 5.81095 5.26717 7.35089 6.8624 8.65351C6.97348 8.74403 6.88246 8.92313 6.74447 8.88496C5.36846 8.51013 4.03062 7.90825 3.02944 7.39542C2.94772 7.35383 2.84887 7.4057 2.83713 7.49672C2.68152 8.74354 2.64139 10.1127 2.80581 11.5562C4.02572 12.1596 5.85143 12.8804 7.76816 13.3389C7.90713 13.3722 7.90273 13.5723 7.76229 13.5992C6.26982 13.8801 4.70688 13.9427 3.43656 13.9261C3.3475 13.9251 3.28193 14.0093 3.30591 14.0949C3.56085 14.9958 3.90632 15.9118 4.3619 16.8342C4.55029 17.2487 4.75532 17.6553 4.97504 18.0532C6.21207 18.107 7.47946 17.9964 8.75369 17.7713C8.97095 17.7331 9.08741 18.0189 8.90391 18.1417C8.03877 18.7201 7.11588 19.2183 6.25758 19.6283C6.14259 19.6836 6.1054 19.8304 6.18125 19.9327C6.69114 20.6236 7.25191 21.2774 7.86114 21.8866C7.86114 21.8866 10.8608 24.9763 10.9425 25.2185C12.6928 23.4261 15.5701 21.4394 18.7474 19.7047C14.4921 23.1672 12.1198 25.7235 10.9258 27.1758L10.0935 28.3439C9.66091 28.9507 9.2856 29.5951 8.97193 30.2709C7.92231 32.5292 6.19201 37.0966 6.19201 37.0966C6.0594 37.4543 6.16755 37.8072 6.39753 38.0371C6.66031 38.2999 7.01263 38.4076 7.37033 38.275C7.37033 38.275 11.9368 36.5447 14.1961 35.495C14.8719 35.1814 15.5168 34.8056 16.1231 34.3735L17.4095 33.457C18.0907 32.9715 19.0234 33.0489 19.615 33.6405L22.5804 36.6058C23.1896 37.2151 23.8433 37.7758 24.5343 38.2857C24.637 38.3611 24.7833 38.3244 24.8386 38.2094C25.2492 37.3516 25.7473 36.4277 26.3252 35.5631C26.4481 35.3796 26.7343 35.4965 26.6957 35.7133C26.4701 36.988 26.3605 38.2554 26.3086 39.3035C27.2178 39.9172 28.5551 40.5606 30.3721 41.1611C30.4577 41.185 30.5419 41.1195 30.5409 41.0304C30.5237 39.7596 30.5864 38.1967 30.8677 36.7047C30.8942 36.5638 31.0943 36.5593 31.1281 36.6988C31.5861 38.616 32.3069 40.4417 32.8041 41.5829C34.3543 41.8256 35.7234 41.7855 36.9703 41.6298C37.0618 41.6186 37.1136 41.5197 37.0715 41.4375C36.5587 40.4364 35.9568 39.0975 35.582 37.7225C35.5443 37.584 35.7229 37.4935 35.8135 37.6046C37.1161 39.1998 38.656 40.5391 39.3548 41.1175C41.2333 40.6786 42.5413 40.0713 43.1604 39.7528C43.3532 39.6539 43.3806 39.3897 43.2132 39.2517Z" }]]
146
+ },
141
147
  opencode: { viewBox: "2.5 0 19 24", paths: [["path", { d: "M16 6H8v12h8V6zm4 16H4V2h16v20z" }]] },
142
148
  pi: {
143
149
  viewBox: "0 0 24 24",
package/styles.css CHANGED
@@ -68,6 +68,7 @@
68
68
  .scui-logo[data-harness="claude-code"] { color:#d97757 }
69
69
  .scui-logo[data-harness="codex"] { color:#111; background:#f7f7f5 }
70
70
  .scui-logo[data-harness="gemini"] { color:#6e79dc; background:#f7f7f5 }
71
+ .scui-logo[data-harness="goose"] { color:#101010; background:#f7f7f5 }
71
72
  .scui-logo[data-harness="pi"] { color:#111; background:#efefeb }
72
73
  .scui-logo > i { position:absolute; right:-5%; bottom:-5%; width:32%; height:32%; border:2px solid var(--scui-bg); border-radius:50%; background:var(--scui-muted) }
73
74
  .scui-logo[data-activity="working"] > i { background:var(--scui-accent); animation:scui-breathe 1.4s ease-in-out infinite }