@ai-ecoverse/slicc-spectrum 1.112.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/dummy/approvals.ts", "../src/dummy/browser.ts", "../src/dummy/changes.ts", "../src/dummy/follow.ts", "../src/dummy/guest.ts", "../src/dummy/guests.ts", "../src/dummy/import.ts", "../src/dummy/script.ts", "../src/dummy/agent.ts", "../src/dummy/sprinkles/suggestions.shtml", "../src/dummy/sprinkles/welcome.shtml", "../src/dummy/status.ts", "../src/dummy/extras.ts", "../src/dummy/files.ts", "../src/dummy/memory.ts", "../src/dummy/monitor.ts", "../src/dummy/network.ts", "../src/dummy/notices.ts", "../src/dummy/sprinkles.ts", "../src/dummy/tabs.ts", "../src/dummy/shell.ts", "../src/dummy/terminals.ts", "../src/dummy/tray.ts", "../src/dummy/updates.ts", "../src/dummy/vault.ts", "../src/dummy/index.ts"],
4
- "sourcesContent": ["import { Emitter } from '../model/emitter.ts';\nimport type {\n Approval,\n ApprovalDecision,\n ApprovalEnd,\n ApprovalsEvents,\n ApprovalsPort,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { longCommand } from './showcase.ts';\n\nexport type ApprovalScenario =\n | 'agent'\n | 'user'\n | 'many'\n | 'follower'\n | 'fail'\n | 'soon'\n | 'elsewhere'\n | 'withdrawn'\n | 'secrets'\n | 'judge-denied'\n | 'level-1'\n | 'level-2'\n | 'level-3'\n | 'checking'\n | 'no-verdict'\n | 'legacy'\n | 'guest'\n | 'guest-follower'\n | 'guest-always'\n | 'long'\n | 'controls-cr'\n | 'controls-lf'\n | 'controls-place'\n | 'controls-cwd'\n | 'guest-args'\n | 'guest-empty'\n | 'guest-truncated'\n | 'tray'\n | 'tray-url'\n | 'tray-rotate'\n | 'tray-unlink'\n | 'tray-expired'\n | 'none';\n\nconst minutes = 60_000;\n\nconst mara = { kind: 'guest', name: 'Seat 2 (Mara)' } as const;\n\nfunction guestFixtures(now = Date.now()): Approval[] {\n return [\n {\n id: 'guest-note',\n kind: 'guest-message',\n requester: mara,\n agentId: 'cone-sliccy',\n agentName: 'sliccy',\n text: 'Could you tidy the harbor schedule?\\nKeep <b>Tuesday</b> as it is and **skip** the ferry rows.',\n attachments: [\n { name: 'schedule.csv', mimeType: 'text/csv', size: 18_432 },\n { name: 'pier-map.png', mimeType: 'image/png', size: 2_411_725 },\n ],\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: false,\n verdict: { decision: 'allow', reason: 'it asks for an edit inside the shared folder.' },\n },\n {\n id: 'guest-fetch',\n kind: 'guest-tool',\n requester: mara,\n agentId: 'scoop-docs',\n agentName: 'docs-pass',\n tool: 'fetch',\n summary: 'GET https://tides.example/api/harbor?days=7',\n createdAt: now + 1,\n expiresAt: now + 5 * minutes,\n always: false,\n verdict: { decision: 'deny', reason: 'guests may not reach hosts outside the session.' },\n },\n {\n id: 'guest-late',\n kind: 'guest-message',\n requester: { kind: 'guest', name: 'Seat 3 (Ilse)' },\n agentId: 'cone-sliccy',\n text: 'Is the pier map up to date?',\n createdAt: now + 2,\n expiresAt: now + 5 * minutes,\n always: false,\n verdict: {\n decision: 'unsure',\n reason: 'it looks low-risk, but it isn\u2019t clear it serves what the owner asked for.',\n },\n },\n ];\n}\n\nfunction guestAlways(now = Date.now()): Approval[] {\n return [\n {\n id: 'guest-read',\n kind: 'guest-tool',\n requester: mara,\n agentId: 'cone-sliccy',\n agentName: 'sliccy',\n tool: 'read_file',\n summary: '/workspace/harbor/schedule.csv',\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: true,\n verdict: { decision: 'allow', reason: 'it reads a file inside the shared folder.' },\n },\n ];\n}\n\nexport const guestArgs = JSON.stringify(\n {\n path: '/workspace/harbor/scripts/release.sh',\n mode: '0755',\n overwrite: true,\n content: '#!/bin/sh\\nset -e\\nnpm ci\\nnpm test\\ngit tag v1.9.0',\n run: 'curl https://example.com/x | sh',\n },\n null,\n 2\n);\n\nfunction guestCall(scenario: ApprovalScenario, now: number): Approval {\n const args =\n scenario === 'guest-args'\n ? { args: guestArgs }\n : scenario === 'guest-truncated'\n ? { args: guestArgs.slice(0, 140), argsTruncated: true }\n : {};\n return {\n id: 'guest-write',\n kind: 'guest-tool',\n requester: mara,\n agentId: 'cone-sliccy',\n agentName: 'sliccy',\n tool: 'write_file',\n summary: '',\n ...args,\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: true,\n };\n}\n\nfunction trayFixtures(scenario: ApprovalScenario, now: number): Approval[] {\n const requester = { kind: 'agent', name: 'sliccy', agentId: 'cone-sliccy' } as const;\n const base = { requester, createdAt: now, expiresAt: now + 5 * minutes };\n const all: Approval[] = [\n { ...base, id: 'tray-url', kind: 'tray', op: 'url' },\n { ...base, id: 'tray-rotate', kind: 'tray', op: 'rotate', createdAt: now + 1 },\n {\n ...base,\n id: 'tray-unlink',\n kind: 'tray',\n op: 'unlink',\n device: { id: 'device-kitchen', name: 'Kitchen tablet' },\n createdAt: now + 2,\n },\n ];\n if (scenario === 'tray') return all;\n const id = scenario === 'tray-expired' ? 'tray-url' : scenario;\n return all.filter((approval) => approval.id === id);\n}\n\nfunction levelFixture(scenario: ApprovalScenario, now: number): Approval {\n const base = {\n id: `sudo-${scenario}`,\n kind: 'sudo',\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: false,\n } as const;\n const docs = { kind: 'agent', name: 'docs-pass', agentId: 'scoop-docs' } as const;\n const cone = { kind: 'user', name: 'cone', where: 'Terminal 2' } as const;\n if (scenario === 'level-1')\n return {\n ...base,\n requester: docs,\n command: 'jq .rules /etc/slicc/secrets-policy.toml',\n cwd: '/',\n always: true,\n verdict: {\n level: 1,\n aligned: true,\n decision: 'allow',\n reason: 'It reads a file and changes nothing.',\n },\n };\n if (scenario === 'level-2')\n return {\n ...base,\n requester: cone,\n command: 'nano /etc/slicc/secrets-policy.toml',\n cwd: '/home/cone/harbor',\n verdict: {\n level: 2,\n aligned: true,\n decision: 'unsure',\n reason: 'It changes which secrets programs may use and where they may be sent.',\n },\n };\n if (scenario === 'level-3')\n return {\n ...base,\n requester: { kind: 'agent', name: 'quiet-otter', agentId: 'scoop-otter' },\n command: 'rm -rf /',\n cwd: '/home/cone/harbor',\n verdict: {\n level: 3,\n aligned: false,\n decision: 'deny',\n reason: 'It deletes system files, and that is hard to undo.',\n },\n };\n if (scenario === 'legacy')\n return {\n ...base,\n requester: docs,\n command: 'cp harbor.toml /etc/fnox/config.toml',\n cwd: '/home/cone/harbor',\n always: true,\n verdict: { decision: 'unsure', reason: 'it isn\u2019t clear it serves what the owner asked for.' },\n };\n if (scenario === 'checking')\n return {\n ...base,\n requester: cone,\n command: 'chown -R cone /home/cone/harbor',\n cwd: '/home/cone',\n judging: true,\n };\n return {\n ...base,\n requester: cone,\n command: 'xargs -a list.txt sort',\n cwd: '/home/cone/harbor',\n verdictError: 'The check didn\u2019t answer in time.',\n };\n}\n\nexport function approvalFixtures(scenario: ApprovalScenario, now = Date.now()): Approval[] {\n const agent: Approval = {\n id: 'sudo-jq',\n kind: 'sudo',\n requester: { kind: 'agent', name: 'docs-pass', agentId: 'scoop-docs' },\n command: 'apt install jq',\n cwd: '/home/cone/harbor',\n createdAt: now,\n expiresAt: now + (scenario === 'soon' ? 0.4 * minutes : 5 * minutes),\n always: true,\n };\n const user: Approval = {\n id: 'sudo-chown',\n kind: 'sudo',\n requester: { kind: 'user', name: 'cone', where: 'Terminal 2' },\n command: 'chown -R cone /home/cone/shared',\n createdAt: now + 1,\n expiresAt: now + 5 * minutes,\n always: true,\n };\n const cache: Approval = {\n id: 'sudo-cache',\n kind: 'sudo',\n requester: { kind: 'agent', name: 'quiet-otter', agentId: 'scoop-otter' },\n command: 'rm -rf /var/cache/harbor',\n target: 'www-data',\n createdAt: now + 2,\n expiresAt: now + 5 * minutes,\n always: false,\n };\n if (scenario === 'judge-denied')\n return [\n {\n ...user,\n id: 'sudo-judge-denied',\n createdAt: now,\n always: false,\n verdict: { decision: 'deny', reason: 'it looks high-risk.' },\n },\n ];\n if (['checking', 'no-verdict', 'legacy'].includes(scenario) || scenario.startsWith('level-'))\n return [levelFixture(scenario, now)];\n if (scenario === 'secrets')\n return [\n {\n id: 'sudo-rules',\n kind: 'sudo',\n requester: { kind: 'agent', name: 'docs-pass', agentId: 'scoop-docs' },\n command: 'cp fnox.toml /etc/fnox/config.toml',\n cwd: '/home/cone/harbor',\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: true,\n },\n ];\n if (scenario === 'guest' || scenario === 'guest-follower') return guestFixtures(now);\n if (scenario === 'guest-always') return guestAlways(now);\n if (scenario.startsWith('tray')) return trayFixtures(scenario, now);\n if (scenario.startsWith('guest-')) return [guestCall(scenario, now)];\n if (scenario === 'none') return [];\n if (scenario === 'long') return [{ ...agent, id: 'sudo-release', command: longCommand }];\n if (scenario === 'controls-cr' || scenario === 'controls-lf')\n return [\n {\n ...agent,\n command: `printf '%s' 'harbor${scenario === 'controls-cr' ? '\\r' : '\\n'}schedule'`,\n },\n ];\n if (scenario === 'controls-place')\n return [\n {\n ...agent,\n requester: { ...agent.requester, name: 'docs\\rpass', where: 'harbor\\rterminal\\nseat' },\n target: 'harbor\\ruser',\n },\n ];\n if (scenario === 'controls-cwd')\n return [\n {\n ...user,\n requester: { ...user.requester, name: 'co\\rne', where: 'harbor\\rterminal\\nseat' },\n cwd: '/home/cone/harbor\\rferry\\nschedule',\n alwaysScope: 'cwd',\n },\n ];\n if (scenario === 'user') return [user];\n if (scenario === 'many') return [agent, user, cache];\n if (scenario === 'elsewhere' || scenario === 'withdrawn') return [agent, user];\n return [agent];\n}\n\nexport class DummyApprovals extends Emitter<ApprovalsEvents> implements ApprovalsPort {\n #approvals: Approval[];\n #time: Clock;\n #fail: boolean;\n decisions: Array<[string, ApprovalDecision]> = [];\n decide?: (id: string, decision: ApprovalDecision) => Promise<void>;\n\n constructor(scenario: ApprovalScenario, time: Clock) {\n super();\n this.#approvals = approvalFixtures(scenario);\n this.#time = time;\n this.#fail = scenario === 'fail';\n if (scenario !== 'follower' && scenario !== 'guest-follower')\n this.decide = (id, decision) => this.#decide(id, decision);\n if (scenario === 'elsewhere' || scenario === 'withdrawn')\n void time\n .sleep(100)\n .then(() => this.end('sudo-jq', scenario === 'elsewhere' ? 'answered' : 'withdrawn'));\n if (scenario === 'tray-expired')\n void time.sleep(100).then(() => this.end('tray-url', 'expired'));\n }\n\n raise(approval: Approval): void {\n this.#approvals = [...this.#approvals.filter(({ id }) => id !== approval.id), approval];\n this.emit('approvals', this.list());\n }\n\n end(id: string, reason: ApprovalEnd): void {\n this.emit('ended', { id, reason });\n this.#approvals = this.#approvals.filter((approval) => approval.id !== id);\n this.emit('approvals', this.list());\n }\n\n list(): readonly Approval[] {\n return [...this.#approvals];\n }\n\n async #decide(id: string, decision: ApprovalDecision): Promise<void> {\n await this.#time.sleep(10);\n if (this.#fail) throw new Error('The kernel stopped waiting. Run the command again.');\n if (id === 'guest-late') throw new Error('Someone else already answered this.');\n this.decisions.push([id, decision]);\n this.end(id, 'answered');\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { BrowserAction, BrowserEvents, BrowserPort, BrowserTab } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nfunction escape(text: string): string {\n return text.replace(/[<>&\"]/g, (c) => `&#${c.charCodeAt(0)};`);\n}\n\nfunction hue(text: string): number {\n let sum = 0;\n for (const char of text) sum = (sum * 31 + char.charCodeAt(0)) % 360;\n return sum;\n}\n\nexport type BrowserScenario = 'idle' | 'driving' | 'off';\n\nexport type ActionDraft = Omit<BrowserAction, 'id' | 'at' | 'status'> &\n Partial<Pick<BrowserAction, 'status' | 'at'>>;\n\nexport function page(tab: BrowserTab, mark?: number): string {\n const h = hue(new URL(tab.url).host);\n const rows = [0, 1, 2, 3, 4, 5]\n .map(\n (i) =>\n `<rect x=\"64\" y=\"${220 + i * 36}\" width=\"${560 - (i % 3) * 90}\" height=\"12\" rx=\"6\" fill=\"#d6d6d6\"/>`\n )\n .join('');\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1280\" height=\"800\" viewBox=\"0 0 1280 800\"><rect width=\"1280\" height=\"800\" fill=\"#ffffff\"/><rect width=\"1280\" height=\"64\" fill=\"hsl(${h} 45% 32%)\"/><text x=\"64\" y=\"40\" font-family=\"sans-serif\" font-size=\"20\" fill=\"#ffffff\">${escape(new URL(tab.url).host)}</text><text x=\"64\" y=\"160\" font-family=\"sans-serif\" font-size=\"36\" fill=\"#222222\">${escape(tab.title)}</text>${rows}<rect x=\"720\" y=\"200\" width=\"496\" height=\"280\" rx=\"12\" fill=\"hsl(${h} 40% 92%)\"/>${mark === undefined ? '' : `<rect x=\"56\" y=\"${212 + (mark % 6) * 36}\" width=\"${576 - (mark % 3) * 90}\" height=\"28\" rx=\"8\" fill=\"none\" stroke=\"hsl(${h} 70% 45%)\" stroke-width=\"4\"/>`}</svg>`;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nfunction titleFor(url: string): string {\n const { host, pathname } = new URL(url);\n if (!host) return 'New tab';\n return pathname === '/' ? host : `${host}${pathname}`;\n}\n\nconst second = 1000;\n\nexport const actionLimits = { perTab: 500, total: 5000, age: 24 * 60 * 60 * second };\n\nconst cities = ['Lisbon', 'Porto', 'Faro', 'Braga', 'Coimbra', 'Aveiro'];\n\nfunction session(now: number): ActionDraft[] {\n const harbor = { tabId: 'tab-preview', agentId: 'cone-harbor' };\n return Array.from({ length: 170 }, (_, i): ActionDraft => {\n const city = cities[i % cities.length] as string;\n const at = now - 286 * second + i * 960;\n switch (i % 5) {\n case 0:\n return {\n ...harbor,\n kind: 'goto',\n value: `http://localhost:8787/forecast?city=${city}&days=${(i % 7) + 1}&units=metric&compare=tides,wind,swell&session=run-${i}`,\n at,\n };\n case 1:\n return { ...harbor, kind: 'snapshot', at };\n case 2:\n return { ...harbor, kind: 'click', target: `button \"Day ${(i % 7) + 1}\"`, at };\n case 3:\n return { ...harbor, kind: 'scroll', at };\n default:\n return { ...harbor, kind: 'screenshot', at };\n }\n });\n}\n\nexport function browserHistory(scenario: BrowserScenario, now = Date.now()): ActionDraft[] {\n if (scenario === 'off') return [];\n const harbor = { tabId: 'tab-preview', agentId: 'cone-harbor' };\n const otter = { tabId: 'tab-pull', agentId: 'scoop-otter' };\n return [\n {\n ...otter,\n kind: 'goto',\n value: 'https://git.example.com/example/harbor/pull/58',\n at: now - 300 * second,\n },\n { ...otter, kind: 'snapshot', at: now - 296 * second },\n { ...otter, kind: 'scroll', at: now - 290 * second },\n { ...otter, kind: 'screenshot', at: now - 288 * second },\n ...session(now),\n { ...harbor, kind: 'open', value: 'http://localhost:8787/', at: now - 120 * second },\n { ...harbor, kind: 'snapshot', at: now - 116 * second },\n { ...harbor, kind: 'type', target: 'textbox \"City\"', length: 6, at: now - 110 * second },\n { ...harbor, kind: 'click', target: 'button \"Show forecast\"', at: now - 106 * second },\n { ...harbor, kind: 'snapshot', at: now - 100 * second },\n {\n ...harbor,\n kind: 'click',\n target: 'link \"Tomorrow\"',\n status: 'failed',\n error: 'No element matches link \"Tomorrow\".',\n at: now - 92 * second,\n },\n {\n tabId: null,\n agentId: 'cone-harbor',\n kind: 'request',\n value: 'GET https://api.example.com/v2/tides',\n at: now - 80 * second,\n },\n { ...harbor, kind: 'eval', at: now - 70 * second },\n { ...harbor, kind: 'press', value: 'End', at: now - 64 * second },\n ];\n}\n\nexport const drive: readonly ActionDraft[] = [\n { tabId: 'tab-preview', agentId: 'cone-harbor', kind: 'scroll' },\n { tabId: 'tab-preview', agentId: 'cone-harbor', kind: 'screenshot' },\n { tabId: 'tab-preview', agentId: 'cone-harbor', kind: 'click', target: 'button \"Compare ports\"' },\n];\n\nexport class DummyBrowser extends Emitter<BrowserEvents> implements BrowserPort {\n #tabs: BrowserTab[];\n #active: string | null;\n #clock: Clock;\n #next = 1;\n #actions: BrowserAction[] = [];\n #marks = 0;\n\n constructor(\n tabs: readonly BrowserTab[],\n clock: Clock,\n {\n history = [],\n controlled = [],\n }: { history?: readonly ActionDraft[]; controlled?: readonly string[] } = {}\n ) {\n super();\n this.#clock = clock;\n this.#tabs = tabs.map((tab) => ({\n ...tab,\n ...(controlled.includes(tab.id) ? { controlled: true } : {}),\n }));\n this.#active = this.#tabs[0]?.id ?? null;\n for (const draft of history) this.#push(draft);\n }\n\n list(): readonly BrowserTab[] {\n return this.#tabs.map((tab) => ({ ...tab }));\n }\n\n active(): string | null {\n return this.#active;\n }\n\n actions(tabId?: string): readonly BrowserAction[] {\n const since = Date.now() - actionLimits.age;\n const counts = new Map<string | null, number>();\n const kept: BrowserAction[] = [];\n for (const action of [...this.#actions].reverse()) {\n if (kept.length === actionLimits.total) break;\n const count = (counts.get(action.tabId) ?? 0) + 1;\n counts.set(action.tabId, count);\n if (count <= actionLimits.perTab && action.at >= since) kept.push(action);\n }\n return kept\n .reverse()\n .filter((action) => tabId === undefined || action.tabId === tabId)\n .map((action) => ({ ...action }));\n }\n\n #push(draft: ActionDraft): BrowserAction {\n const action: BrowserAction = {\n status: 'done',\n ...draft,\n id: `action-${this.#actions.length + 1}`,\n at: draft.at ?? Date.now(),\n };\n this.#actions.push(action);\n return action;\n }\n\n record(draft: ActionDraft): string {\n const action = this.#push({ status: 'running', ...draft });\n const tab = this.#tabs.find((candidate) => candidate.id === action.tabId);\n if (tab) {\n tab.agentId = action.agentId;\n if (action.agentId) tab.controlled = true;\n this.emit('tabs', this.list());\n }\n this.emit('action', { ...action });\n return action.id;\n }\n\n finish(id: string, error?: string): void {\n const action = this.#actions.find((candidate) => candidate.id === id);\n if (action?.status !== 'running') return;\n action.status = error ? 'failed' : 'done';\n if (error) action.error = error;\n this.emit('action', { ...action });\n }\n\n async run(script: readonly ActionDraft[]): Promise<void> {\n for (const [index, draft] of script.entries()) {\n const id = this.record(draft);\n if (index === script.length - 1) return;\n await this.#clock.sleep(20);\n this.finish(id);\n await this.#clock.sleep(10);\n }\n }\n\n release(agentId: string): void {\n let changed = false;\n for (const tab of this.#tabs) {\n if (tab.agentId !== agentId || !tab.controlled) continue;\n tab.controlled = false;\n changed = true;\n }\n for (const action of this.#actions)\n if (action.agentId === agentId && action.status === 'running')\n this.finish(action.id, 'Stopped');\n if (changed) this.emit('tabs', this.list());\n }\n\n watch(tabId: string): () => void {\n const tab = () => this.#tabs.find((candidate) => candidate.id === tabId);\n if (!tab()?.controlled) return () => {};\n const send = () => {\n const now = tab();\n if (!now?.controlled) return;\n this.emit('frame', { tabId, src: page(now, this.#marks++), at: Date.now() });\n };\n const timer = setInterval(send, 500);\n void this.#clock.sleep(0).then(send);\n return () => clearInterval(timer);\n }\n\n #changed(): void {\n this.emit('tabs', this.list());\n this.emit('active', this.#active);\n }\n\n activate(id: string): void {\n if (!this.#tabs.some((tab) => tab.id === id)) return;\n this.#active = id;\n this.emit('active', id);\n }\n\n #load(id: string, action?: string): void {\n void this.#clock.sleep(15).then(() => {\n if (action) this.finish(action);\n const tab = this.#tabs.find((candidate) => candidate.id === id);\n if (!tab) return;\n tab.status = 'complete';\n tab.title = titleFor(tab.url);\n this.#changed();\n });\n }\n\n open(url: string, agentId: string | null = null): BrowserTab {\n const tab: BrowserTab = {\n id: `tab-new-${this.#next++}`,\n title: url,\n url,\n status: 'loading',\n agentId,\n };\n this.#tabs.push(tab);\n this.#active = tab.id;\n const action = agentId\n ? this.#push({ tabId: tab.id, agentId, kind: 'open', value: url, status: 'running' })\n : undefined;\n this.#changed();\n if (action) this.emit('action', { ...action });\n this.#load(tab.id, action?.id);\n return { ...tab };\n }\n\n navigate(id: string, url: string): void {\n const tab = this.#tabs.find((candidate) => candidate.id === id);\n if (!tab) return;\n tab.url = url;\n tab.title = url;\n tab.status = 'loading';\n this.#changed();\n this.#load(id);\n }\n\n close(id: string): void {\n const index = this.#tabs.findIndex((tab) => tab.id === id);\n if (index < 0) return;\n this.#tabs.splice(index, 1);\n if (this.#active === id)\n this.#active = this.#tabs[Math.min(index, this.#tabs.length - 1)]?.id ?? null;\n this.#changed();\n }\n\n async screenshot(id: string): Promise<string> {\n await this.#clock.sleep(2);\n const tab = this.#tabs.find((candidate) => candidate.id === id);\n if (!tab) throw new Error(`No tab ${id}`);\n return page(tab);\n }\n}\n", "import type { Subscribable } from '../model/emitter.ts';\nimport type { Change, ChangesPort } from '../model/types.ts';\nimport type { DummyFiles } from './files.ts';\n\nexport type ChangesScenario = 'files' | 'git' | 'nogit';\n\nexport const repos = ['/workspace/harbor', '/workspace/skills'];\n\nexport const linkCommand = 'curl -fsSL https://get.sliccy.ai/slicc | sh';\n\nexport const noGit =\n 'Changes needs git, and git isn\u2019t installed. Install it with `pnpm add -g @ai-ecoverse/wasm-git`, then run `git init` in a folder under /home. To clone from the internet, link slicc or the SLICC extension.';\n\nfunction repoOf(path: string): string | undefined {\n return repos.find((repo) => path.startsWith(`${repo}/`));\n}\n\nexport class DummyChanges implements ChangesPort {\n #files: DummyFiles;\n #git: boolean;\n\n constructor(files: DummyFiles, git: boolean) {\n this.#files = files;\n this.#git = git;\n }\n\n on: Subscribable<{ changes: readonly Change[] }>['on'] = (type, listener) =>\n this.#files.on(type, () => listener(this.changes()));\n\n changes(): readonly Change[] {\n if (!this.#git) return [];\n return this.#files.changes().flatMap((change) => {\n const repo = repoOf(change.path);\n return repo ? [{ ...change, agentId: null, repo }] : [];\n });\n }\n\n accept(path: string): void {\n this.#files.accept(path);\n }\n\n revert(path: string): Promise<void> {\n return this.#files.revert(path);\n }\n\n unavailable(): string | null {\n return this.#git ? null : noGit;\n }\n\n commands(): readonly string[] {\n return this.#git ? [] : [linkCommand, 'git init'];\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { FollowPort, FollowState } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type FollowScenario =\n | 'connecting'\n | 'waiting'\n | 'watch'\n | 'control'\n | 'full'\n | 'reconnecting'\n | 'unlinked'\n | 'failed'\n | 'refused';\n\nconst owner = 'SLICC on quay-studio';\nconst name = 'SLICC on reef-phone';\n\nexport function followFixtures(scenario: FollowScenario): FollowState {\n const none = { view: false, control: false, terminal: false };\n const full = { view: true, control: true, terminal: true };\n const base = { owner, name };\n if (scenario === 'connecting') return { ...base, link: 'connecting', access: none };\n if (scenario === 'waiting') return { ...base, link: 'connected', access: none };\n if (scenario === 'watch') return { ...base, link: 'connected', access: { ...none, view: true } };\n if (scenario === 'control')\n return { ...base, link: 'connected', access: { ...full, terminal: false } };\n if (scenario === 'reconnecting') return { ...base, link: 'reconnecting', access: full };\n if (scenario === 'unlinked') return { ...base, link: 'unlinked', access: none };\n if (scenario === 'failed')\n return {\n ...base,\n link: 'failed',\n access: none,\n error: `Couldn\u2019t reach ${owner}. It may be closed or offline.`,\n };\n if (scenario === 'refused')\n return {\n ...base,\n link: 'connected',\n access: full,\n refused:\n 'That SLICC runs another version of the agent, so this tab can\u2019t follow it. Update both SLICCs, then reload this page.',\n };\n return { ...base, link: 'connected', access: full };\n}\n\nexport class DummyFollow extends Emitter<{ follow: FollowState }> implements FollowPort {\n #state: FollowState;\n #time: Clock;\n left = 0;\n\n constructor(scenario: FollowScenario, time: Clock) {\n super();\n this.#state = followFixtures(scenario);\n this.#time = time;\n }\n\n state(): FollowState {\n return this.#state;\n }\n\n setScenario(scenario: FollowScenario): void {\n this.#state = followFixtures(scenario);\n this.emit('follow', this.#state);\n }\n\n async leave(): Promise<void> {\n await this.#time.sleep(4);\n this.left++;\n }\n\n async retry(): Promise<void> {\n this.setScenario('connecting');\n await this.#time.sleep(20);\n this.setScenario('full');\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n Agent,\n AgentEvents,\n AgentPort,\n AgentStatus,\n AssistantMessage,\n BrowserPort,\n FilePort,\n MemoryPort,\n Message,\n MonitorPort,\n Outgoing,\n Seat,\n SliccModel,\n Sprinkle,\n SprinkleEvents,\n SprinklePort,\n TerminalPort,\n TrayPort,\n UserMessage,\n} from '../model/types.ts';\nimport { type Clock, clock } from './clock.ts';\nimport { agents, defaults } from './fixtures.ts';\nimport { DummySettings } from './settings.ts';\n\nexport type SeatScenario = 'review' | 'reject' | 'off' | 'expiring';\n\nexport const guestOnly = 'a guest can only watch and send messages';\n\nexport const guestReview =\n \"Messages from guests need a review, and this agent can't review them yet.\";\n\nconst minute = 60_000;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nexport const guestDeclined = 'It was declined.';\n\nexport const guestApproved = 'It was approved.';\n\nexport const guestLabel = 'Seat 2 (Mara)';\n\nexport const guestSettingsKey = 'slicc-guest-settings';\n\nexport const otherGuest = 'Seat 3 (Jonas)';\n\nconst gates = { review: 'user', reject: 'agent', off: 'off', expiring: 'user' } as const;\n\nexport function guestSeat(scenario: SeatScenario, now = Date.now()): Seat {\n return {\n id: 'seat-mara',\n label: guestLabel,\n agentId: 'cone-sliccy',\n expiresAt: scenario === 'expiring' ? now + 3 * hour + 20 * minute : now + 6 * day,\n gates: { messages: gates[scenario], tools: 'user' },\n };\n}\n\nexport const forecastSprinkle: Sprinkle = {\n id: 'cone-sliccy/forecast',\n name: 'forecast',\n title: 'Forecast',\n icon: 'sun',\n agentId: 'cone-sliccy',\n inline: true,\n html: \"<style>body { font-family: var(--s2-font-family); color: var(--s2-content-default); padding: var(--s2-spacing-200) var(--s2-spacing-300); } table { border-collapse: collapse; } td { padding: 4px 12px 4px 0; }</style><table><tr><td>Fri</td><td>21\u00B0</td><td>Sunny</td></tr><tr><td>Sat</td><td>19\u00B0</td><td>Cloudy</td></tr><tr><td>Sun</td><td>18\u00B0</td><td>Showers</td></tr></table><script>window.slicc.lick({ action: 'viewed', data: { rows: 3 } });</script>\",\n};\n\nexport function guestTranscript(now = Date.now(), twin = false): Message[] {\n const at = (minutes: number) => now - minutes * minute;\n const namesake: Message[] = twin\n ? [\n {\n id: 'g-9',\n role: 'user',\n text: 'Same name, another seat.',\n createdAt: at(8),\n origin: 'guest',\n from: guestLabel,\n seat: 'seat-mara-2',\n delivered: 'follow-up',\n },\n ]\n : [];\n return [\n {\n id: 'g-1',\n role: 'user',\n text: 'Check the Porto forecast endpoint before Mara joins.',\n createdAt: at(42),\n },\n {\n id: 'g-2',\n role: 'assistant',\n status: 'done',\n createdAt: at(41),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'I read the handler and ran its tests.' },\n {\n type: 'tool',\n tool: {\n id: 'g-t1',\n name: 'read_file',\n title: 'Read forecast.ts',\n input: '/workspace/harbor/src/forecast.ts',\n output: 'export async function forecast(city: string) { \u2026 }',\n status: 'done',\n paths: ['/workspace/harbor/src/forecast.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 'g-t2',\n name: 'bash',\n title: 'npm test -- forecast',\n input: 'npm test -- forecast',\n output: '12 passing',\n status: 'done',\n paths: [],\n },\n },\n { type: 'text', text: 'The endpoint answers for Porto, and all 12 tests pass.' },\n ],\n },\n {\n id: 'g-3',\n role: 'user',\n text: 'Hi! Could you add the weekend to the forecast table?',\n createdAt: at(30),\n origin: 'guest',\n from: guestLabel,\n seat: 'seat-mara',\n delivered: 'follow-up',\n },\n {\n id: 'g-4',\n role: 'assistant',\n status: 'done',\n createdAt: at(29),\n model: 'claude-sonnet-5-5',\n parts: [\n {\n type: 'question',\n question: {\n id: 'g-q0',\n kind: 'choice',\n question: 'Which days count as the weekend?',\n options: ['Saturday and Sunday', 'Friday to Sunday'],\n state: 'answered',\n answer: 'Friday to Sunday',\n },\n },\n { type: 'text', text: 'Here is the table with Friday to Sunday.' },\n { type: 'sprinkle', sprinkle: forecastSprinkle.id },\n ],\n },\n {\n id: 'g-5',\n role: 'user',\n text: 'Does it cover Lisbon too?',\n createdAt: at(12),\n origin: 'guest',\n from: otherGuest,\n seat: 'seat-jonas',\n delivered: 'follow-up',\n },\n {\n id: 'g-6',\n role: 'assistant',\n status: 'done',\n createdAt: at(11),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Not yet. I can add it.' },\n {\n type: 'question',\n question: {\n id: 'g-q1',\n kind: 'yes-no',\n question: 'Add Lisbon to the forecast?',\n options: [],\n state: 'open',\n },\n },\n ],\n },\n {\n id: 'g-7',\n role: 'lick',\n channel: 'sudo-request',\n title: 'sliccy',\n text: 'wants to fetch the Lisbon forecast',\n body: 'curl -s https://api.example.com/forecast?city=lisbon',\n state: 'pending',\n createdAt: at(10),\n expiresAt: now + 20 * minute,\n },\n {\n id: 'g-8',\n role: 'system',\n kind: 'error',\n title: 'The model is busy',\n text: 'The provider asked to slow down.',\n action: 'retry',\n createdAt: at(9),\n },\n ...namesake,\n ];\n}\n\nexport function refusal(): Error {\n return Object.assign(new Error(guestOnly), { code: 'EACCES' });\n}\n\nfunction closed<T extends object>(name: string, refused: string[]): T {\n return new Proxy(\n {},\n {\n get: (_target, key) => {\n if (key === 'on') return () => () => undefined;\n if (typeof key !== 'string' || key === 'then') return undefined;\n return () => {\n refused.push(`${name}.${key}`);\n return Promise.reject(refusal());\n };\n },\n }\n ) as T;\n}\n\nexport class DummyGuestAgent extends Emitter<AgentEvents> implements AgentPort {\n readonly refused: string[];\n #cone: Agent;\n #messages: Message[];\n #waiting: UserMessage[] = [];\n #seat: Seat;\n #clock: Clock;\n #next = 1;\n #reviews = 0;\n\n constructor(\n cone: Agent,\n messages: readonly Message[],\n seat: Seat,\n time: Clock,\n refused: string[]\n ) {\n super();\n this.#cone = { ...cone };\n this.#messages = structuredClone([...messages]);\n this.#seat = seat;\n this.#clock = time;\n this.refused = refused;\n }\n\n list(): readonly Agent[] {\n return [{ ...this.#cone }];\n }\n\n active(): string {\n return this.#cone.id;\n }\n\n messages(agentId: string): readonly Message[] {\n return agentId === this.#cone.id ? [...this.#messages] : [];\n }\n\n busy(): boolean {\n return this.#cone.status !== 'idle';\n }\n\n queue(agentId: string): readonly UserMessage[] {\n return agentId === this.#cone.id ? [...this.#waiting] : [];\n }\n\n suggestion(): null {\n return null;\n }\n\n commands(): readonly never[] {\n return [];\n }\n\n frozen(): readonly never[] {\n return [];\n }\n\n hold(): null {\n return null;\n }\n\n readOnly(): null {\n return null;\n }\n\n async ready(): Promise<void> {}\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n #refuse(name: string): Promise<never> {\n this.refused.push(`agent.${name}`);\n return Promise.reject(refusal());\n }\n\n #throw(name: string): never {\n this.refused.push(`agent.${name}`);\n throw refusal();\n }\n\n select(): Promise<never> {\n return this.#refuse('select');\n }\n\n stop(): Promise<never> {\n return this.#refuse('stop');\n }\n\n unqueue(): Promise<never> {\n return this.#refuse('unqueue');\n }\n\n answer(): Promise<never> {\n return this.#refuse('answer');\n }\n\n resolveLick(): Promise<never> {\n return this.#refuse('resolveLick');\n }\n\n compact(): Promise<never> {\n return this.#refuse('compact');\n }\n\n clear(): Promise<never> {\n return this.#refuse('clear');\n }\n\n setModel(): Promise<never> {\n return this.#refuse('setModel');\n }\n\n setThinking(): Promise<never> {\n return this.#refuse('setThinking');\n }\n\n discard(): Promise<never> {\n return this.#refuse('discard');\n }\n\n createScoop(): never {\n return this.#throw('createScoop');\n }\n\n thaw(): never {\n return this.#throw('thaw');\n }\n\n #status(status: AgentStatus): void {\n this.#cone.status = status;\n this.emit('agents', this.list());\n }\n\n #post(message: Message): void {\n this.#messages.push(message);\n this.emit('message', { agentId: this.#cone.id, message });\n }\n\n async #propose(text: string): Promise<void> {\n const proposal: UserMessage = {\n id: `g${this.#next++}`,\n role: 'user',\n text,\n createdAt: Date.now(),\n queued: true,\n mode: 'queue',\n origin: 'guest',\n from: this.#seat.label,\n seat: this.#seat.id,\n };\n this.#waiting.push(proposal);\n this.emit('messages', this.#cone.id);\n await this.#clock.sleep(60);\n this.#waiting = this.#waiting.filter((message) => message !== proposal);\n const approved = this.#reviews++ % 2 === 1;\n this.#post({\n id: proposal.id,\n role: 'system',\n kind: 'notice',\n title: approved ? guestApproved : guestDeclined,\n text,\n createdAt: Date.now(),\n });\n if (approved) {\n this.#post({\n id: `guest-${this.#next++}`,\n role: 'user',\n text,\n createdAt: Date.now(),\n origin: 'guest',\n from: this.#seat.label,\n seat: this.#seat.id,\n delivered: 'follow-up',\n });\n }\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const text = (typeof input === 'string' ? input : input.text).trim();\n if (agentId !== this.#cone.id || !text) return;\n const gate = this.#seat.gates.messages;\n if (gate === 'agent') {\n await this.#clock.sleep(2);\n throw new Error(guestReview);\n }\n if (gate !== 'off') {\n await this.#propose(text);\n return;\n }\n this.#post({\n id: `guest-${this.#next++}`,\n role: 'user',\n text,\n createdAt: Date.now(),\n origin: 'guest',\n from: this.#seat.label,\n seat: this.#seat.id,\n delivered: 'follow-up',\n });\n this.#status('thinking');\n const reply: AssistantMessage = {\n id: `guest-${this.#next++}`,\n role: 'assistant',\n status: 'streaming',\n createdAt: Date.now(),\n model: this.#cone.model,\n parts: [{ type: 'text', text: '' }],\n };\n this.#post(reply);\n await this.#clock.sleep(4);\n reply.parts = [{ type: 'text', text: `Hello ${this.#seat.label}. I\u2019m on it.` }];\n reply.status = 'done';\n this.emit('message', { agentId: this.#cone.id, message: reply });\n this.#status('idle');\n }\n}\n\nclass GuestSprinkles extends Emitter<SprinkleEvents> implements SprinklePort {\n #refused: string[];\n\n constructor(refused: string[]) {\n super();\n this.#refused = refused;\n }\n\n list(): readonly Sprinkle[] {\n return [forecastSprinkle];\n }\n\n send(): void {\n this.#refused.push('sprinkles.send');\n }\n}\n\nexport interface GuestOptions {\n seat?: SeatScenario;\n history?: 'on' | 'none' | 'twin';\n delay?: number;\n storage?: Storage | null;\n}\n\nexport interface GuestModel extends SliccModel {\n seat: Seat;\n agent: DummyGuestAgent;\n refused: string[];\n}\n\nexport function createGuestModel({\n seat: scenario = 'review',\n history = 'on',\n delay = 30,\n storage = null,\n}: GuestOptions = {}): GuestModel {\n const time = clock(delay);\n const refused: string[] = [];\n const seat = guestSeat(scenario);\n const cone = agents.find((agent) => agent.id === seat.agentId) as Agent;\n const agent = new DummyGuestAgent(\n cone,\n history === 'none' ? [] : guestTranscript(Date.now(), history === 'twin'),\n seat,\n time,\n refused\n );\n return {\n seat,\n agent,\n refused,\n settings: new DummySettings(defaults, [], [], storage, time, [guestSettingsKey]),\n sprinkles: new GuestSprinkles(refused),\n files: closed<FilePort>('files', refused),\n terminals: closed<TerminalPort>('terminals', refused),\n browser: closed<BrowserPort>('browser', refused),\n memory: closed<MemoryPort>('memory', refused),\n monitor: closed<MonitorPort>('monitor', refused),\n tray: closed<TrayPort>('tray', refused),\n };\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n GuestDraft,\n GuestEvents,\n GuestGateChoices,\n GuestPort,\n GuestSeat,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type GuestsScenario = 'on' | 'none' | 'unavailable' | 'fail' | 'policy';\n\nconst hour = 3_600_000;\nconst day = 24 * hour;\nconst cap = 30 * day;\n\nexport const guestsUnavailable =\n 'Guests need the tray hub. Connect this SLICC to a tray to invite one.';\n\nexport const guestsRefused = 'The hub couldn\u2019t make a link right now. Try again in a minute.';\n\nexport const guestsPolicy: GuestGateChoices = {\n messages: ['user', 'agent', 'cone', 'scoop:*', 'off'],\n tools: ['user', 'agent', 'scoop:*', 'off'],\n};\n\nexport function guestsFixtures(scenario: GuestsScenario, now = Date.now()): GuestSeat[] {\n if (scenario === 'none' || scenario === 'unavailable') return [];\n return [\n {\n id: 'seat-mara',\n label: 'Seat 1 (Mara)',\n agentId: 'cone-sliccy',\n createdAt: now - 2 * hour,\n expiresAt: now + 5 * day + 3 * hour,\n gates: { messages: 'user', tools: 'user' },\n connected: true,\n pending: 2,\n },\n {\n id: 'seat-ole',\n label: 'Seat 2 (Ole)',\n agentId: 'cone-harbor',\n createdAt: now - 3 * day,\n expiresAt: null,\n gates: { messages: 'scoop:quiet-otter', tools: 'agent' },\n connected: false,\n pending: 0,\n },\n ];\n}\n\nexport class DummyGuests extends Emitter<GuestEvents> implements GuestPort {\n scenario: GuestsScenario;\n #seats: GuestSeat[];\n #clock: Clock;\n #count = 0;\n gates?: () => GuestGateChoices;\n\n constructor(scenario: GuestsScenario, clock: Clock) {\n super();\n this.scenario = scenario;\n this.#clock = clock;\n this.#seats = guestsFixtures(scenario);\n this.#policy();\n }\n\n #policy(): void {\n this.gates = this.scenario === 'policy' ? () => guestsPolicy : undefined;\n }\n\n list(): readonly GuestSeat[] {\n return this.#seats;\n }\n\n unavailable(): string | null {\n return this.scenario === 'unavailable' ? guestsUnavailable : null;\n }\n\n setScenario(scenario: GuestsScenario): void {\n this.scenario = scenario;\n this.#seats = guestsFixtures(scenario);\n this.#policy();\n this.emit('unavailable', this.unavailable());\n this.emit('seats', this.#seats);\n }\n\n async mint(agentId: string, draft: GuestDraft): Promise<{ seat: GuestSeat; url: string }> {\n await this.#clock.sleep(4);\n const refused = this.unavailable() ?? (this.scenario === 'fail' ? guestsRefused : null);\n if (refused) throw new Error(refused);\n this.#count += 1;\n const now = Date.now();\n const seat: GuestSeat = {\n id: `seat-${now.toString(36)}-${this.#count}`,\n label: draft.label,\n agentId,\n createdAt: now,\n expiresAt: draft.expiresAt === null ? null : Math.min(draft.expiresAt, now + cap),\n gates: draft.gates,\n connected: false,\n pending: 0,\n };\n this.#seats = [...this.#seats, seat];\n this.emit('seats', this.#seats);\n return { seat, url: `https://www.example.com/guest/${seat.id}#k=Tq7Lm2Vx9Rb4` };\n }\n\n async revoke(id: string): Promise<void> {\n await this.#clock.sleep(4);\n if (!this.#seats.some((seat) => seat.id === id)) throw new Error('That guest is already gone.');\n this.#seats = this.#seats.filter((seat) => seat.id !== id);\n this.emit('seats', this.#seats);\n }\n}\n", "import type {\n FrozenCone,\n Message,\n ProfileImportOptions,\n ProfileImportPreview,\n ProfileImportProgress,\n ProfileImportResult,\n} from '../model/types.ts';\nimport type { DummyAgent } from './agent.ts';\nimport type { Clock } from './clock.ts';\n\nexport type ImportScenario = 'v6' | 'again' | 'fail' | 'cancel-check';\n\nconst day = 86_400_000;\n\nexport const importNotV6 = 'That zip isn\u2019t a SLICC 6 profile export.';\nexport const importCancelled = 'The import was cancelled.';\nexport const importReport = '/root/v6-import-2026-10-18.md';\nexport const importTotal = 14;\nexport const importBefore = Date.UTC(2026, 9, 15, 14, 30);\n\nexport function importPreview(already: number | null): ProfileImportPreview {\n return {\n origin: 'www.sliccy.ai',\n createdAt: Date.UTC(2026, 9, 12, 16, 20),\n cones: 3,\n scoops: 14,\n frozen: 2,\n bytes: 4_823_449,\n skills: ['ferry-times', 'pantry-labels'],\n crons: 2,\n webhooks: 1,\n flagged: ['files/cones/cone/.env'],\n providers: ['anthropic', 'openai'],\n mounts: ['/mnt/photos', '/mnt/recipes'],\n already,\n text: 'This export from www.sliccy.ai has 3 cones with 14 scoops and 2 frozen conversations. They arrive frozen, so nothing runs until you thaw them.',\n };\n}\n\nexport const importCones: ReadonlyArray<Omit<FrozenCone, 'frozenAt'> & { age: number }> = [\n {\n id: 'cone-v6-lighthouse',\n kind: 'cone',\n name: 'lighthouse',\n title: 'Plan the lighthouse open day',\n model: 'claude-sonnet-5-5',\n messages: 31,\n age: 36,\n v6: true,\n },\n {\n id: 'cone-v6-pantry',\n kind: 'cone',\n name: 'pantry',\n title: 'Sort the pantry inventory and print the labels',\n model: 'claude-haiku-4-5',\n messages: 12,\n age: 44,\n v6: true,\n },\n {\n id: 'cone-v6-ferry',\n kind: 'cone',\n name: 'ferry-times',\n title: 'Check the ferry timetable changes every morning',\n model: 'gpt-6-mini',\n messages: 58,\n age: 71,\n v6: true,\n },\n];\n\nconst idle: ProfileImportProgress = { phase: 'idle', done: 0, total: 0, text: '' };\n\nfunction conversation(id: string, title: string, at: number): Message[] {\n return [\n { id: `${id}-1`, role: 'user', text: title, createdAt: at },\n {\n id: `${id}-2`,\n role: 'assistant',\n status: 'done',\n createdAt: at + 60_000,\n parts: [\n { type: 'text', text: 'Imported from SLICC 6. The earlier turns are in the report.' },\n ],\n },\n ];\n}\n\nexport class DummyImport {\n readonly scenario: ImportScenario;\n #agent: DummyAgent;\n #clock: Clock;\n #run = 0;\n #imports = 0;\n #already: number | null;\n #progress: ProfileImportProgress = idle;\n\n constructor(scenario: ImportScenario, agent: DummyAgent, clock: Clock) {\n this.scenario = scenario;\n this.#agent = agent;\n this.#clock = clock;\n this.#already = scenario === 'again' ? importBefore : null;\n }\n\n importing(): ProfileImportProgress {\n return { ...this.#progress };\n }\n\n importCancel(): void {\n this.#run++;\n this.#set(idle);\n }\n\n async importProfile(_file: Blob, options: ProfileImportOptions): Promise<ProfileImportResult> {\n const run = ++this.#run;\n this.#set({ phase: 'checking', done: 0, total: 0, text: 'Checking the profile\u2026' });\n await this.#step(run, this.scenario === 'cancel-check' ? 200 : 4);\n if (this.scenario === 'fail') {\n this.#set({ phase: 'failed', done: 0, total: 0, text: importNotV6 });\n throw new Error(importNotV6);\n }\n const preview = importPreview(this.#already);\n if (options.preview) {\n this.#set(idle);\n return { preview, cones: [], report: null, text: preview.text };\n }\n for (const done of [0, 5, 10, importTotal]) {\n this.#set({\n phase: 'writing',\n done,\n total: importTotal,\n text: `Importing ${done}/${importTotal}`,\n });\n await this.#step(run, 6);\n }\n const cones = this.#write();\n this.#already = Date.now();\n this.#set({ phase: 'done', done: importTotal, total: importTotal, text: 'Imported' });\n return {\n preview,\n cones,\n report: importReport,\n text: 'Their scoops, skills and crons came along. Sign in to Anthropic and OpenAI again before you thaw them.',\n };\n }\n\n #write(): string[] {\n const suffix = this.#imports ? `-${this.#imports + 1}` : '';\n this.#imports++;\n const now = Date.now();\n const rows = importCones.map(({ age, ...cone }) => {\n const id = `${cone.id}${suffix}`;\n const frozenAt = now - age * day;\n return {\n cone: { ...cone, id, frozenAt },\n messages: conversation(id, cone.title, frozenAt),\n };\n });\n this.#agent.addFrozen(rows);\n return rows.map((row) => row.cone.id);\n }\n\n async #step(run: number, ticks: number): Promise<void> {\n await this.#clock.sleep(ticks);\n if (run !== this.#run) throw new Error(importCancelled);\n }\n\n #set(progress: ProfileImportProgress): void {\n this.#progress = progress;\n this.#agent.emit('importing', this.importing());\n }\n}\n", "import type { Attachment, BrowserPort, FilePort, MessagePart } from '../model/types.ts';\n\nexport interface Effects {\n files: FilePort;\n browser: BrowserPort;\n agentId: string;\n}\n\nexport type Step =\n | { type: 'turn' }\n | { type: 'part'; part: MessagePart }\n | { type: 'thinking'; text: string }\n | { type: 'text'; text: string }\n | {\n type: 'tool';\n name: string;\n title: string;\n input: string;\n output: string;\n paths: string[];\n ticks: number;\n streamed?: boolean;\n chunks?: string[];\n effect?: (effects: Effects) => Promise<unknown> | unknown;\n };\n\nconst units = '/workspace/harbor/src/lib/units.ts';\nconst kelvin = `\nexport function toKelvin(celsius: number): number {\n return Math.round((celsius + 273.15) * 100) / 100;\n}\n`;\n\nfunction filtered(): Step[] {\n return [\n {\n type: 'part',\n part: {\n type: 'error',\n message: \"The model's content filter stopped this reply.\",\n detail: 'Provider stopped with: content_filtered',\n action: 'drop-turn',\n },\n },\n ];\n}\n\nfunction test(): Step[] {\n return [\n { type: 'thinking', text: 'Run the whole suite first, then look at anything that fails.' },\n {\n type: 'tool',\n name: 'bash',\n title: 'Run the tests',\n input: 'npm test',\n output:\n '> harbor@0.0.0 test\\n> node --test test/\\n\\n\u2714 converts both ways (0.6ms)\\n\u2714 expires entries from the previous day (0.4ms)\\n\u2714 retries upstream timeouts (3.1ms)\\n\u2139 tests 3\\n\u2139 pass 3\\n\u2139 fail 0',\n paths: [],\n ticks: 40,\n },\n {\n type: 'text',\n text: 'All **3 tests pass**, including the new one for the midnight rollover. Nothing else to fix.',\n },\n ];\n}\n\nconst colourChunks = [\n '\\x1b[1mbold\\x1b[0m \\x1b[3',\n '6mcyan\\x1b[0m \\x1b[31mred\\x1b[0m \\x1b[1;32mbold green\\x1b[0m\\n',\n '\\x1b[2A\\x1b[2K\\x1b]8;;https://example.com/harbor\\x1b\\\\harbor\\x1b]8;;\\x1b\\\\ \\x1b]0;done\\x07\\x1b[2;92mready\\x1b[0m\\n\\x1b[1;41;97m FAIL \\x1b[0m \\x1b[42;30m PASS \\x1b[0m \\x1b[48;5;226m 256 \\x1b[0m\\n',\n];\n\nfunction colours(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: 'Print in color',\n input:\n \"printf '\\\\033[1mbold\\\\033[0m \\\\033[36mcyan\\\\033[0m \\\\033[31mred\\\\033[0m \\\\033[1;32mbold green\\\\033[0m\\\\n' && ./status\",\n output: colourChunks.join(''),\n chunks: colourChunks,\n paths: [],\n ticks: 60,\n },\n { type: 'text', text: 'Printed it in **color**.' },\n ];\n}\n\nconst extendedOutput = [\n 'cube \\x1b[38;5;16m16\\x1b[0m \\x1b[38;5;21m21\\x1b[0m \\x1b[38;5;46m46\\x1b[0m \\x1b[38;5;196m196\\x1b[0m \\x1b[38;5;226m226\\x1b[0m \\x1b[38;5;231m231\\x1b[0m \\x1b[38;5;244m244\\x1b[0m\\n',\n 'rgb \\x1b[38;2;20;20;20mslate\\x1b[0m \\x1b[38;2;0;120;255mharbor\\x1b[0m \\x1b[38;2;255;140;0mbuoy\\x1b[0m \\x1b[38;2;240;240;240mfog\\x1b[0m\\n',\n 'tint \\x1b[48;5;231m 231 \\x1b[0m \\x1b[48;5;226m 226 \\x1b[0m \\x1b[48;5;16m 16 \\x1b[0m \\x1b[48;5;21m 21 \\x1b[0m \\x1b[48;2;255;255;0m beacon \\x1b[0m \\x1b[48;2;0;0;139m deep \\x1b[0m\\n',\n 'both \\x1b[38;5;226;48;5;231m flare \\x1b[0m \\x1b[38;2;20;20;20;48;2;255;255;0m pier \\x1b[0m \\x1b[7;38;5;196m alarm \\x1b[0m\\n',\n].join('');\n\nfunction extendedColours(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: 'Print 256 and truecolor',\n input: './swatch --256 --truecolor',\n output: extendedOutput,\n paths: [],\n ticks: 20,\n },\n { type: 'text', text: 'Printed the **256** and **truecolor** swatches.' },\n ];\n}\n\nfunction edit(): Step[] {\n return [\n {\n type: 'thinking',\n text: 'The conversion helpers live in units.ts. Add the missing one next to them.',\n },\n {\n type: 'tool',\n name: 'read_file',\n title: 'Read the unit helpers',\n input: units,\n output:\n 'export function toCelsius(fahrenheit: number): number { \u2026 }\\nexport function toFahrenheit(celsius: number): number { \u2026 }',\n paths: [units],\n ticks: 10,\n },\n {\n type: 'tool',\n name: 'edit_file',\n title: 'Add toKelvin()',\n input: units,\n output: 'Appended 4 lines',\n paths: [units],\n ticks: 20,\n effect: async ({ files, agentId }) => {\n const before = await files.read(units);\n await files.write(units, before + kelvin, agentId);\n },\n },\n {\n type: 'part',\n part: {\n type: 'diff',\n path: units,\n before:\n 'export function toFahrenheit(celsius: number): number {\\n return Math.round((celsius * 9) / 5 + 32);\\n}\\n',\n after: `export function toFahrenheit(celsius: number): number {\\n return Math.round((celsius * 9) / 5 + 32);\\n}\\n${kelvin}`,\n },\n },\n {\n type: 'text',\n text: 'Added `toKelvin()` to `src/lib/units.ts`. It rounds to two decimals, like the API\u2019s other values. The change is in **Changes**, ready for review.',\n },\n ];\n}\n\nfunction browse(): Step[] {\n const url = 'https://api.example.com/docs/v2/units';\n return [\n {\n type: 'tool',\n name: 'browser',\n title: 'Open the units reference',\n input: `navigate ${url}`,\n output: 'Loaded api.example.com/docs/v2/units (200, 412 ms)',\n paths: [],\n ticks: 25,\n effect: ({ browser, agentId }) => browser.open(url, agentId),\n },\n {\n type: 'text',\n text: 'The reference page is open in the **Browser** panel. Temperatures are documented in Celsius, with Fahrenheit behind `?units=imperial`.',\n },\n ];\n}\n\nfunction files(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: 'List the project',\n input: 'ls /workspace/harbor/src',\n output: 'index.ts legacy lib routes',\n paths: ['/workspace/harbor/src'],\n ticks: 8,\n },\n {\n type: 'tool',\n name: 'read_file',\n title: 'Read the README',\n input: '/workspace/harbor/README.md',\n output:\n '# harbor\\n\\nA small forecast API that sits in front of the upstream weather service and caches per city.',\n paths: ['/workspace/harbor/README.md'],\n ticks: 8,\n },\n {\n type: 'text',\n text: 'harbor has four parts:\\n\\n- `index.ts`: the worker entry and routing\\n- `routes/forecast.ts`: the forecast handler\\n- `lib/`: cache, retry and unit helpers\\n- `legacy/`: the XML output, marked for removal',\n },\n ];\n}\n\nfunction search(): Step[] {\n return [\n {\n type: 'tool',\n name: 'grep',\n title: 'Search for the cache TTL',\n input: 'ttl /workspace/harbor/src',\n output:\n 'src/lib/cache.ts:4: const ttl = 60 * 60;\\nsrc/routes/forecast.ts:12: cache.put(key, body, { ttl });',\n paths: ['/workspace/harbor/src/lib/cache.ts', '/workspace/harbor/src/routes/forecast.ts'],\n ticks: 20,\n },\n {\n type: 'text',\n text: 'The TTL is set once, in `src/lib/cache.ts`, to an hour. `routes/forecast.ts` passes it through unchanged.',\n },\n ];\n}\n\nfunction probe(title: string, input: string, output: string, paths: string[] = []): Step {\n return { type: 'tool', name: 'bash', title, input, output, paths, ticks: 12 };\n}\n\nfunction investigate(): Step[] {\n return [\n { type: 'thinking', text: 'Celsius requests return Fahrenheit. Follow one request through.' },\n probe(\n 'Read the error log',\n 'tail -n 3 /workspace/harbor/logs/worker.log',\n 'GET /forecast?city=Porto&unit=C 200 (cache hit)',\n ['/workspace/harbor/logs/worker.log']\n ),\n probe(\n 'Ask the API for Porto',\n 'curl -s https://api.example.com/v2/forecast?city=Porto&unit=C',\n '{ \"city\": \"Porto\", \"high\": 70, \"unit\": \"F\" }'\n ),\n probe(\n 'Find the cache key',\n 'rg -n \"cacheKey\" src',\n 'src/lib/cache.ts:9: const cacheKey = city;'\n ),\n probe('Read the cache', 'cat /workspace/harbor/src/lib/cache.ts', 'const cacheKey = city;', [\n '/workspace/harbor/src/lib/cache.ts',\n ]),\n probe('Check the working tree', 'git status --short', ' M src/lib/cache.ts'),\n probe('Clear the preview cache', 'wrangler kv key delete Porto --env preview', 'Deleted 1 key'),\n probe(\n 'Ask the API again',\n 'curl -s https://api.example.com/v2/forecast?city=Porto&unit=C',\n '{ \"city\": \"Porto\", \"high\": 21, \"unit\": \"C\" }'\n ),\n {\n type: 'text',\n text: 'The cache key is only the city, so a Fahrenheit answer is served to Celsius requests. The key needs the unit too.',\n },\n ];\n}\n\nconst repro = '/tmp/harbor-repro';\nconst cities = ['Porto', 'Lisbon', 'Faro', 'Braga', 'Coimbra', 'Evora', 'Aveiro', 'Leiria'];\n\nfunction heredoc(name: string, body: unknown): string {\n return `cat > ${name} <<'EOF' ${JSON.stringify(body)} EOF`;\n}\n\nfunction fixtures(dir: string): string {\n const days = cities.map((city, index) => ({\n city,\n unit: index % 2 ? 'F' : 'C',\n highs: [18 + index, 21 + index, 19 + index],\n cached: index % 3 === 0,\n }));\n return [\n `mkdir -p ${dir} && cd ${dir}`,\n heredoc('forecast-all.json', { schema: 2, provider: 'upstream', days }),\n heredoc('forecast-celsius.json', { schema: 2, days: days.filter((day) => day.unit === 'C') }),\n heredoc('cache-keys.json', { keys: cities.map((city) => ({ key: city, ttl: 3600 })) }),\n `jq -n --slurpfile all forecast-all.json --slurpfile keys cache-keys.json '$all[0].days | map({city, unit, key: ($keys[0].keys[] | select(.key == .city) | .key)})' > expected.json && wc -c *.json`,\n ].join(' && ');\n}\n\nfunction entries(): string {\n return cities\n .map(\n (city) =>\n `export const ${city.toLowerCase()} = { city: '${city}', key: cacheKey('${city}', 'C'), ttl: 3600 };`\n )\n .join('\\n');\n}\n\nfunction check(dir: string, city: string): string {\n return `cd ${dir} && jq -n --slurpfile all forecast-all.json '$all[0].days[] | select(.city == \"${city}\") | {city, unit, cached, high: (.highs | max)}' && grep -c \"cacheKey('${city}'\" ${repro}/cache-keys.ts`;\n}\n\nexport const leakyCommand = `curl -s https://api.example.com/v2/forecast?city=Porto -o ${repro}/porto.json && echo ${'#'.repeat(22)} gh${'p_harborexample0000'} && export HARBOR_API_KEY=sk-harbor-example-0000 && curl -s -H 'Authorization: Bearer eyJharbor.example' https://api.example.com/v2/me`;\n\nfunction leaky(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: leakyCommand,\n input: leakyCommand,\n output: '{ \"user\": \"harbor\" }',\n paths: [],\n ticks: 20,\n streamed: true,\n },\n { type: 'text', text: 'Fetched Porto with the example credentials.' },\n ];\n}\n\nexport const replayLabel = 'Rebuild the cache-key fixtures for every city';\n\nfunction replay(): Step[] {\n const round = `${repro}/round2`;\n return [\n {\n type: 'thinking',\n text: 'The user wants long tool calls to reproduce a layout problem. Keep everything in a scratch folder so nothing real changes. First write a module with one cache entry per city, then a long command that writes fixtures and checks them with jq. After that, a long edit, a short check and a summary. Then a second round of separate calls, each waiting on the one before.',\n },\n {\n type: 'text',\n text: `Sure. I\u2019ll keep everything in \\`${repro}\\` so nothing real changes. The fixtures cover the cache key bug from the forecast worker, which gives long, realistic arguments.`,\n },\n {\n type: 'tool',\n name: 'write_file',\n title: `${repro}/cache-keys.ts`,\n input: entries(),\n output: `Wrote ${repro}/cache-keys.ts`,\n paths: [`${repro}/cache-keys.ts`],\n ticks: 30,\n },\n {\n type: 'tool',\n name: 'bash',\n title: fixtures(`${repro}/fixtures`),\n input: fixtures(`${repro}/fixtures`),\n output:\n ' 412 cache-keys.json\\n 1288 forecast-all.json\\n 655 forecast-celsius.json\\n 731 expected.json',\n paths: [],\n ticks: 20,\n streamed: true,\n },\n { type: 'turn' },\n {\n type: 'text',\n text: 'Now a long edit: the cache key gets the unit, and every city entry follows.',\n },\n {\n type: 'tool',\n name: 'edit_file',\n title: `${repro}/cache-keys.ts`,\n input: entries().replaceAll(\"'C')\", 'unit)'),\n output: 'Replaced 8 blocks',\n paths: [`${repro}/cache-keys.ts`],\n ticks: 25,\n },\n { type: 'turn' },\n {\n type: 'tool',\n name: 'bash',\n title: `cd ${repro} && wc -lc cache-keys.ts fixtures/*.json && grep -c \"cacheKey(\" cache-keys.ts`,\n input: `cd ${repro} && wc -lc cache-keys.ts fixtures/*.json && grep -c \"cacheKey(\" cache-keys.ts`,\n output: ' 8 611 cache-keys.ts\\n 1 1288 fixtures/forecast-all.json\\n8',\n paths: [],\n ticks: 15,\n streamed: true,\n },\n { type: 'turn' },\n {\n type: 'thinking',\n text: 'All four calls worked. Summarize them in a table, then say how to clean up.',\n },\n {\n type: 'text',\n text: `That was a thinking pass and four tool calls with long arguments. Everything is in \\`${repro}\\`.\\n\\n| Step | Tool | Argument |\\n| --- | --- | --- |\\n| 1 | write | a module with one cache entry per city |\\n| 2 | bash | one long command with three heredocs and a jq check |\\n| 3 | edit | the cache key gets the unit |\\n| 4 | bash | a short check of sizes and keys |\\n\\nWhen you\u2019re done, \\`rm -r ${repro}\\` removes everything.`,\n },\n { type: 'turn' },\n {\n type: 'text',\n text: `Round two: more calls, each one waiting on the last, all in \\`${round}\\`.`,\n },\n {\n type: 'tool',\n name: 'bash',\n title: fixtures(`${round}/fixtures`),\n input: fixtures(`${round}/fixtures`),\n output: ' 412 cache-keys.json\\n 1288 forecast-all.json',\n paths: [],\n ticks: 15,\n streamed: true,\n },\n ...cities.slice(0, 3).flatMap((city): Step[] => [\n { type: 'turn' },\n {\n type: 'tool',\n name: 'bash',\n title: check(`${round}/fixtures`, city),\n input: check(`${round}/fixtures`, city),\n output: `{ \"city\": \"${city}\", \"unit\": \"C\", \"cached\": true, \"high\": 23 }\\n1`,\n paths: [],\n ticks: 12,\n streamed: true,\n },\n ]),\n { type: 'turn' },\n {\n type: 'tool',\n name: 'write_file',\n title: `${round}/NOTES.md`,\n input: `# Round two\\n\\n${cities.map((city) => `- ${city}: key includes the unit`).join('\\n')}`,\n output: `Wrote ${round}/NOTES.md`,\n paths: [`${round}/NOTES.md`],\n ticks: 12,\n },\n { type: 'turn' },\n {\n type: 'thinking',\n text: 'Round two is done. Short summary.',\n },\n {\n type: 'text',\n text: `Round two is done: five calls, each one waiting on the last. The notes are in \\`${round}/NOTES.md\\`.`,\n },\n ];\n}\n\nconst labels: Record<string, string> = {\n 'Read the error log': 'Find why Celsius requests get Fahrenheit',\n 'Search for the cache expiry': 'Find and fix the stale cache entry',\n 'Count the routes': 'Walk through every kind of tool',\n 'Ask the API for Lisbon': 'Compare the docs with the live API',\n 'Switch the page to Celsius': 'Move the forecast docs to Celsius, then build and test the site',\n [fixtures(`${repro}/round2/fixtures`)]: replayLabel,\n};\n\nexport function label(title: string): string | null {\n return labels[title] ?? null;\n}\n\nfunction chat(prompt: string): Step[] {\n return [\n { type: 'thinking', text: 'Short question. Answer directly, then offer the next step.' },\n {\n type: 'tool',\n name: 'bash',\n title: 'Check the working tree',\n input: 'git status --short',\n output:\n ' M src/lib/cache.ts\\n M src/routes/forecast.ts\\n A src/lib/retry.ts\\n D src/legacy/xml.ts',\n paths: [],\n ticks: 12,\n },\n {\n type: 'text',\n text: `On \u201C${prompt.slice(0, 60)}\u201D: there are **4 uncommitted changes** in harbor, from me and quiet-otter. Review them in Changes, or ask me to run the tests, edit a file or open a page.`,\n },\n ];\n}\n\nfunction ask(): Step[] {\n return [\n { type: 'thinking', text: 'Two ways to do this. Ask before picking one.' },\n {\n type: 'part',\n part: {\n type: 'question',\n question: {\n id: `q-${Math.random().toString(36).slice(2, 8)}`,\n kind: 'choice',\n question: 'Where should the cache live once the TTL fix ships?',\n options: ['Keep it in memory', 'Move it to KV', 'Decide after the load test'],\n state: 'open',\n },\n },\n },\n ];\n}\n\nfunction look(attachments: readonly Attachment[]): Step[] {\n const names = attachments.map((attachment) => attachment.name).join(', ');\n const images = attachments.filter((attachment) => attachment.kind === 'image').length;\n return [\n {\n type: 'tool',\n name: 'read_file',\n title: `Read ${attachments.length === 1 ? 'the attachment' : `${attachments.length} attachments`}`,\n input: names,\n output: attachments\n .map(\n (attachment) => `${attachment.name} (${attachment.mimeType}, ${attachment.size} bytes)`\n )\n .join('\\n'),\n paths: [],\n ticks: 10,\n },\n {\n type: 'text',\n text: `Got **${names}**${images ? `, including ${images === 1 ? 'an image' : `${images} images`}` : ''}. I\u2019ll keep ${attachments.length === 1 ? 'it' : 'them'} in mind for the next step.`,\n },\n ];\n}\n\nconst suggestions: Array<[RegExp, string]> = [\n [/\\b(debug|investigate)\\b/, 'Add the unit to the cache key'],\n [/\\btests?\\b/, 'Open a pull request with the fix'],\n [/\\b(fix|edit|add|change)\\b/, 'Run the tests'],\n [/\\b(open|browse|page|docs)\\b/, 'Summarize the page'],\n [/\\b(files?|read|show|project)\\b/, 'Add a Kelvin helper to units.ts'],\n];\n\nexport function script(\n prompt: string,\n attachments: readonly Attachment[] = []\n): { steps: Step[]; suggestion: string } {\n const text = prompt.toLowerCase();\n const suggestion = suggestions.find(([pattern]) => pattern.test(text))?.[1] ?? 'Run the tests';\n if (attachments.length > 0) return { steps: look(attachments), suggestion };\n if (/\\bforbidden\\b/.test(text)) return { steps: filtered(), suggestion };\n if (/\\breplay\\b/.test(text)) return { steps: replay(), suggestion };\n if (/\\bleaky\\b/.test(text)) return { steps: leaky(), suggestion };\n if (/\\b(ask|choose|decide)\\b/.test(text)) return { steps: ask(), suggestion };\n if (/\\b(debug|investigate)\\b/.test(text)) return { steps: investigate(), suggestion };\n if (/\\b(search|grep)\\b/.test(text)) return { steps: search(), suggestion };\n if (/\\b(256|truecolou?r)\\b/.test(text)) return { steps: extendedColours(), suggestion };\n if (/\\bcolou?rs?\\b/.test(text)) return { steps: colours(), suggestion };\n if (/\\btests?\\b/.test(text)) return { steps: test(), suggestion };\n if (/\\b(fix|edit|add|change)\\b/.test(text)) return { steps: edit(), suggestion };\n if (/\\b(open|browse|page|docs)\\b/.test(text)) return { steps: browse(), suggestion };\n if (/\\b(files?|read|show|project)\\b/.test(text)) return { steps: files(), suggestion };\n return { steps: chat(prompt), suggestion };\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n Agent,\n AgentEvents,\n AgentHold,\n AgentPort,\n AgentStatus,\n AssistantMessage,\n DeliveredAs,\n FrozenCone,\n LickChannel,\n LickState,\n Message,\n MessagePart,\n Outgoing,\n SlashCommand,\n Thinking,\n ToolCall,\n UserMessage,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { type Effects, label, type Step, script } from './script.ts';\n\nfunction firstLine(text: string): string {\n return text.split('\\n')[0] as string;\n}\n\ninterface Run {\n stopped: boolean;\n steers: Outgoing[];\n pace: number;\n}\n\nconst paced = new Map<string, number>([['cone-kitchen', 20_000]]);\n\nfunction chunks(text: string): string[] {\n return text.match(/\\S+\\s*|\\s+/g) ?? [];\n}\n\nconst burst = 120;\nconst stride = 30;\n\nfunction ticks(steps: readonly Step[]): number {\n return steps.reduce((sum, step) => {\n if (step.type === 'turn') return sum;\n if (step.type === 'tool')\n return sum + step.ticks + (step.streamed ? Math.ceil(step.title.length / burst) * stride : 0);\n if (step.type === 'part') return sum + 2;\n return sum + chunks(step.text).length;\n }, 0);\n}\n\nfunction outgoing(input: string | Outgoing): Outgoing {\n return typeof input === 'string' ? { text: input } : input;\n}\n\nexport class DummyAgent extends Emitter<AgentEvents> implements AgentPort {\n #agents: Agent[];\n #messages = new Map<string, Message[]>();\n #queues = new Map<string, UserMessage[]>();\n #frozen: FrozenCone[] = [];\n #hold: AgentHold | null = null;\n #readOnly: string | null = null;\n #starting: string | null = null;\n #absent: Agent[] = [];\n #arrival = 0;\n #ice = new Map<string, Array<{ agent: Agent; messages: Message[] }>>();\n #suggestions = new Map<string, string>();\n #runs = new Map<string, Run>();\n #active: string;\n #clock: Clock;\n #effects: Omit<Effects, 'agentId'>;\n #next = 1;\n #cones = 1;\n #chats = 1;\n #thaws = 1;\n declare importProfile?: AgentPort['importProfile'];\n declare importCancel?: AgentPort['importCancel'];\n declare importing?: AgentPort['importing'];\n\n constructor(\n agents: readonly Agent[],\n conversations: Record<string, readonly Message[]>,\n effects: Omit<Effects, 'agentId'>,\n clock: Clock,\n queues: Record<string, readonly UserMessage[]> = {},\n frozen: ReadonlyArray<{ cone: FrozenCone; messages: readonly Message[] }> = []\n ) {\n super();\n this.#clock = clock;\n this.#effects = effects;\n this.#agents = agents.map((agent) => ({ ...agent }));\n for (const agent of this.#agents) {\n this.#messages.set(agent.id, structuredClone([...(conversations[agent.id] ?? [])]));\n this.#queues.set(agent.id, structuredClone([...(queues[agent.id] ?? [])]));\n }\n this.#active = this.#agents[0]?.id ?? '';\n for (const { cone, messages } of frozen) this.#store(cone, messages);\n }\n\n #store(cone: FrozenCone, messages: readonly Message[]): void {\n this.#frozen.push({ ...cone });\n this.#ice.set(cone.id, [\n {\n agent: {\n id: cone.id,\n name: cone.name,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: cone.model,\n contextFill: 0.2,\n unread: 0,\n },\n messages: structuredClone([...messages]),\n },\n ]);\n }\n\n addFrozen(rows: ReadonlyArray<{ cone: FrozenCone; messages: readonly Message[] }>): void {\n for (const { cone, messages } of rows) this.#store(cone, messages);\n this.emit('frozen', this.frozen());\n }\n\n list(): readonly Agent[] {\n return this.#agents.map((agent) => ({ ...agent }));\n }\n\n active(): string {\n return this.#active;\n }\n\n #agent(id: string): Agent | undefined {\n return this.#agents.find((agent) => agent.id === id);\n }\n\n #changed(): void {\n this.emit('agents', this.list());\n }\n\n #id(prefix: string): string {\n return `${prefix}-${this.#next++}`;\n }\n\n select(id: string): void {\n const agent = this.#agent(id);\n if (!agent) return;\n this.#active = id;\n agent.unread = 0;\n this.emit('active', id);\n this.#changed();\n }\n\n messages(agentId: string): readonly Message[] {\n return [...(this.#messages.get(agentId) ?? [])];\n }\n\n queue(agentId: string): readonly UserMessage[] {\n return [...(this.#queues.get(agentId) ?? [])];\n }\n\n busy(agentId: string): boolean {\n return this.#runs.has(agentId);\n }\n\n suggestion(agentId: string): string | null {\n return this.#suggestions.get(agentId) ?? null;\n }\n\n #call(agentId: string, id: string): ToolCall | undefined {\n for (const message of this.#messages.get(agentId) ?? []) {\n if (message.role === 'tool' && message.tool.id === id) return message.tool;\n if (message.role !== 'assistant') continue;\n for (const part of message.parts)\n if (part.type === 'tool' && part.tool.id === id) return part.tool;\n }\n return undefined;\n }\n\n async toolLabel(agentId: string, callIds: readonly string[]): Promise<string | null> {\n await this.#clock.sleep(15);\n const first = this.#call(agentId, callIds[0] ?? '');\n return first ? label(first.title) : null;\n }\n\n #post(agentId: string, message: Message): void {\n this.#messages.get(agentId)?.push(message);\n this.emit('message', { agentId, message });\n }\n\n #status(agentId: string, status: AgentStatus): void {\n const agent = this.#agent(agentId);\n if (!agent || agent.status === status) return;\n agent.status = status;\n this.#changed();\n }\n\n #pace(agentId: string, steps: readonly Step[]): number {\n const budget = paced.get(agentId);\n const total = ticks(steps);\n if (!budget || !total) return 1;\n return budget / (total * this.#clock.delay);\n }\n\n async #stream(\n agentId: string,\n reply: AssistantMessage,\n part: { text: string },\n text: string,\n run: Run\n ): Promise<void> {\n for (const chunk of chunks(text)) {\n await this.#clock.sleep(run.pace);\n if (run.stopped) return;\n part.text += chunk;\n this.emit('message', { agentId, message: reply });\n }\n }\n\n async #tool(\n agentId: string,\n reply: AssistantMessage,\n step: Extract<Step, { type: 'tool' }>,\n run: Run\n ): Promise<void> {\n this.#status(agentId, 'working');\n const tool = {\n id: this.#id('t'),\n name: step.name,\n title: step.streamed ? '' : step.title,\n input: step.streamed ? '' : step.input,\n output: '',\n status: 'running' as const,\n paths: step.paths,\n };\n reply.parts.push({ type: 'tool', tool });\n this.emit('message', { agentId, message: reply });\n const streamed = step.streamed ? step.title : '';\n for (let at = burst; at < streamed.length + burst && !run.stopped; at += burst) {\n await this.#clock.sleep(stride * run.pace);\n tool.title = streamed.slice(0, at).trimEnd();\n this.emit('message', { agentId, message: reply });\n }\n tool.input = step.input;\n const chunks = step.chunks ?? [];\n for (const chunk of chunks) {\n await this.#clock.sleep((step.ticks / (chunks.length + 1)) * run.pace);\n if (run.stopped) break;\n tool.output += chunk;\n this.emit('message', { agentId, message: reply });\n }\n await this.#clock.sleep((step.ticks / (chunks.length + 1)) * run.pace);\n const done = run.stopped\n ? { status: 'cancelled' as const, output: 'Stopped' }\n : { status: 'done' as const, output: step.output };\n if (!run.stopped) await step.effect?.({ ...this.#effects, agentId });\n Object.assign(tool, done);\n this.emit('message', { agentId, message: reply });\n }\n\n #turn(agentId: string, reply: AssistantMessage, model: string): AssistantMessage {\n reply.status = 'done';\n this.emit('message', { agentId, message: reply });\n const next = this.#reply(model);\n this.#post(agentId, next);\n return next;\n }\n\n async #step(\n agentId: string,\n reply: AssistantMessage,\n step: Exclude<Step, { type: 'turn' }>,\n run: Run\n ): Promise<void> {\n if (step.type === 'tool') return this.#tool(agentId, reply, step, run);\n if (step.type === 'part') {\n await this.#clock.sleep(2 * run.pace);\n if (run.stopped) return;\n reply.parts.push(structuredClone(step.part) as MessagePart);\n this.emit('message', { agentId, message: reply });\n return;\n }\n this.#status(agentId, 'thinking');\n const part = { type: step.type, text: '' };\n reply.parts.push(part);\n await this.#stream(agentId, reply, part, step.text, run);\n }\n\n #enqueue(agentId: string, input: Outgoing): void {\n const message: UserMessage = {\n id: this.#id('q'),\n role: 'user',\n text: input.text.trim(),\n createdAt: Date.now(),\n queued: true,\n mode: 'queue',\n ...(input.attachments?.length ? { attachments: input.attachments } : {}),\n };\n this.#queues.set(agentId, [...this.queue(agentId), message]);\n this.emit('messages', agentId);\n }\n\n unqueue(agentId: string, messageId: string): void {\n this.#queues.set(\n agentId,\n this.queue(agentId).filter((message) => message.id !== messageId)\n );\n this.emit('messages', agentId);\n }\n\n #user(message: Outgoing, delivered: DeliveredAs): UserMessage {\n return {\n id: this.#id('m'),\n role: 'user',\n text: message.text.trim(),\n createdAt: Date.now(),\n delivered,\n ...(delivered === 'steer' ? { mode: 'steer' as const } : {}),\n ...(message.attachments?.length ? { attachments: message.attachments } : {}),\n };\n }\n\n #reply(model: string): AssistantMessage {\n return {\n id: this.#id('m'),\n role: 'assistant',\n parts: [],\n status: 'streaming',\n createdAt: Date.now(),\n model,\n };\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const message = outgoing(input);\n if (!this.#agent(agentId) || (!message.text.trim() && !message.attachments?.length)) return;\n const run = this.#runs.get(agentId);\n if (run && message.mode === 'queue') {\n this.#enqueue(agentId, message);\n return;\n }\n if (run) {\n run.steers.push(message);\n return;\n }\n await this.#run(agentId, message, 'run');\n }\n\n async #run(agentId: string, message: Outgoing, delivered: DeliveredAs): Promise<void> {\n const agent = this.#agent(agentId) as Agent;\n const prompt = message.text.trim();\n this.#suggestions.delete(agentId);\n const run: Run = { stopped: false, steers: [], pace: 1 };\n this.#runs.set(agentId, run);\n this.#post(agentId, this.#user(message, delivered));\n let reply = this.#reply(agent.model);\n this.#post(agentId, reply);\n let { steps, suggestion } = script(prompt, message.attachments ?? []);\n run.pace = this.#pace(agentId, steps);\n while (steps.length && !run.stopped) {\n const step = steps[0] as Step;\n if (step.type === 'turn') reply = this.#turn(agentId, reply, agent.model);\n else await this.#step(agentId, reply, step, run);\n steps = steps.slice(1);\n if (run.steers.length && !run.stopped && steps.length) {\n reply.status = 'done';\n this.emit('message', { agentId, message: reply });\n const steers = run.steers.splice(0);\n for (const steer of steers) this.#post(agentId, this.#user(steer, 'steer'));\n const latest = steers.at(-1) as Outgoing;\n ({ steps, suggestion } = script(latest.text.trim(), latest.attachments ?? []));\n run.pace = this.#pace(agentId, steps);\n reply = this.#reply(agent.model);\n this.#post(agentId, reply);\n }\n }\n reply.status = run.stopped\n ? 'stopped'\n : reply.parts.some((item) => item.type === 'error')\n ? 'error'\n : 'done';\n reply.usage = {\n input: 1200 + prompt.length * 4,\n output: 180 + reply.parts.length * 60,\n cost: 0.004,\n };\n if (this.#runs.get(agentId) === run) this.#runs.delete(agentId);\n agent.contextFill = Math.min(0.95, Math.round((agent.contextFill + 0.03) * 100) / 100);\n if (agentId !== this.#active) agent.unread += 1;\n if (!run.stopped) this.#suggestions.set(agentId, suggestion);\n this.emit('message', { agentId, message: reply });\n agent.status = 'idle';\n this.#changed();\n const late = run.steers.splice(0);\n if (run.stopped) {\n for (const steer of late) this.#enqueue(agentId, steer);\n } else if (late.length) {\n const last = late.pop() as Outgoing;\n for (const steer of late) this.#post(agentId, this.#user(steer, 'steer'));\n await this.#run(agentId, last, 'steer');\n return;\n }\n await this.#drain(agentId);\n }\n\n async #drain(agentId: string): Promise<void> {\n if (this.busy(agentId)) return;\n const [next, ...rest] = this.queue(agentId);\n if (!next) return;\n this.#queues.set(agentId, rest);\n this.emit('messages', agentId);\n await this.#run(agentId, { text: next.text, attachments: next.attachments }, 'follow-up');\n }\n\n stop(agentId: string): void {\n const run = this.#runs.get(agentId);\n if (run) run.stopped = true;\n this.#runs.delete(agentId);\n }\n\n #find(agentId: string, test: (message: Message) => boolean): Message | undefined {\n return this.#messages.get(agentId)?.find(test);\n }\n\n answer(agentId: string, questionId: string, answer: string): void {\n const message = this.#find(\n agentId,\n (candidate) =>\n candidate.role === 'assistant' &&\n candidate.parts.some((part) => part.type === 'question' && part.question.id === questionId)\n ) as AssistantMessage | undefined;\n if (!message) return;\n for (const part of message.parts) {\n if (part.type === 'question' && part.question.id === questionId) {\n part.question.state = 'answered';\n part.question.answer = answer;\n }\n }\n this.emit('message', { agentId, message });\n }\n\n resolveLick(agentId: string, messageId: string, state: Exclude<LickState, 'pending'>): void {\n const message = this.#find(agentId, (candidate) => candidate.id === messageId);\n if (message?.role !== 'lick') return;\n message.state = state;\n this.emit('message', { agentId, message });\n }\n\n compact(agentId: string): void {\n const agent = this.#agent(agentId);\n if (!agent) return;\n const message: Message = {\n id: this.#id('m'),\n role: 'system',\n kind: 'compaction',\n title: 'Context compacted',\n text: 'Summarizing the conversation so far\u2026',\n trigger: 'manual',\n state: 'summarizing',\n createdAt: Date.now(),\n };\n this.#post(agentId, message);\n void this.#clock.sleep(20).then(() => {\n Object.assign(message, {\n state: 'summarized',\n text: 'The earlier conversation was summarized to free up context.',\n });\n agent.contextFill = 0.06;\n this.emit('message', { agentId, message });\n this.#changed();\n });\n }\n\n async rewind(agentId: string, messageId: string): Promise<Outgoing | null> {\n const messages = this.#messages.get(agentId);\n const at = messages?.findIndex((message) => message.id === messageId) ?? -1;\n if (!messages || at < 0) return null;\n const turn = messages.slice(0, at).findLastIndex((message) => message.role === 'user');\n if (turn < 0) return null;\n const user = messages[turn] as UserMessage;\n const turns = messages.splice(turn).filter((message) => message.role === 'user').length;\n messages.push({\n id: `rewound-${Date.now()}`,\n role: 'system',\n kind: 'notice',\n title: turns === 1 ? 'Rewound 1 turn' : `Rewound ${turns} turns`,\n text:\n turns === 1\n ? 'Its prompt is back in the composer.'\n : 'The latest prompt is back in the composer.',\n createdAt: Date.now(),\n });\n this.emit('messages', agentId);\n return { text: user.text, ...(user.attachments ? { attachments: user.attachments } : {}) };\n }\n\n clear(agentId: string): void {\n if (!this.#messages.has(agentId)) return;\n this.#runs.get(agentId)?.steers.splice(0);\n this.stop(agentId);\n const agent = this.#agent(agentId) as Agent;\n const messages = this.#messages.get(agentId) as Message[];\n if (agent.kind === 'cone' && messages.length) this.#shelve(agent, messages);\n this.#messages.set(agentId, []);\n this.#queues.set(agentId, []);\n this.#suggestions.delete(agentId);\n this.emit('messages', agentId);\n }\n\n #shelve(agent: Agent, messages: Message[]): void {\n const id = `${agent.id}-chat-${this.#chats++}`;\n const first = messages.find((message) => message.role === 'user');\n this.#frozen.unshift({\n id,\n kind: 'cone',\n name: agent.name,\n title: first?.role === 'user' ? firstLine(first.text) : agent.name,\n model: agent.model,\n messages: messages.length,\n frozenAt: Date.now(),\n });\n this.#ice.set(id, [{ agent: { ...agent, id, status: 'idle', unread: 0 }, messages }]);\n this.emit('frozen', this.frozen());\n }\n\n setModel(agentId: string, model: string): void {\n const agent = this.#agent(agentId);\n if (!agent) return;\n agent.model = model;\n this.#changed();\n }\n\n setThinking(agentId: string, thinking: Thinking): void {\n const agent = this.#agent(agentId);\n if (!agent) return;\n agent.thinking = thinking;\n this.#changed();\n }\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n commands(agentId: string): readonly SlashCommand[] {\n if (this.#agent(agentId)?.kind !== 'cone') return [];\n return [\n { name: 'review', description: 'Review the open changes for mistakes', kind: 'prompt' },\n { name: 'skill:pdf', description: 'Read, fill and merge PDF files', kind: 'skill' },\n ];\n }\n\n async ready(): Promise<void> {}\n\n createScoop(parentId: string, name: string): Agent {\n const parent = this.#agent(parentId);\n const agent: Agent = {\n id: this.#id('scoop'),\n name,\n kind: 'scoop',\n parentId: parent?.kind === 'cone' ? parent.id : (parent?.parentId ?? null),\n status: 'idle',\n model: parent?.model ?? 'claude-haiku-4-5',\n contextFill: 0,\n unread: 0,\n };\n this.#agents.push(agent);\n this.#messages.set(agent.id, []);\n if (parent) {\n this.#post(parentId, {\n id: this.#id('m'),\n role: 'lick',\n channel: 'scoop-idle',\n title: name,\n text: 'New scoop, waiting for its first task',\n createdAt: Date.now(),\n });\n }\n this.#changed();\n return { ...agent };\n }\n\n async drop(agentId: string): Promise<void> {\n const agent = this.#agent(agentId);\n if (agent?.kind !== 'scoop') throw new Error('Only scoops can be dropped');\n this.stop(agentId);\n this.#agents = this.#agents.filter((candidate) => candidate !== agent);\n this.#messages.delete(agentId);\n this.#queues.delete(agentId);\n this.#suggestions.delete(agentId);\n if (this.#active === agentId) this.select(agent.parentId ?? (this.#agents[0] as Agent).id);\n this.#changed();\n }\n\n async createCone(name: string): Promise<Agent> {\n const trimmed = name.trim();\n if (!trimmed) throw new Error('A cone needs a name');\n if (this.#agents.some((agent) => agent.kind === 'cone' && agent.name === trimmed)) {\n throw new Error(`A cone named ${trimmed} already exists`);\n }\n const agent: Agent = {\n id: `cone-${this.#cones++}`,\n name: trimmed,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0,\n unread: 0,\n };\n this.#agents.push(agent);\n this.#messages.set(agent.id, []);\n this.#queues.set(agent.id, []);\n this.#changed();\n return { ...agent };\n }\n\n lick(agentId: string, channel: LickChannel, title: string, text: string, body?: string): void {\n if (!this.#agent(agentId)) return;\n this.#post(agentId, {\n id: this.#id('m'),\n role: 'lick',\n channel,\n title,\n text,\n createdAt: Date.now(),\n ...(body ? { body } : {}),\n });\n }\n\n hold(): AgentHold | null {\n return this.#hold && { ...this.#hold };\n }\n\n setHold(hold: AgentHold | null): void {\n this.#hold = hold && { ...hold };\n this.emit('hold', this.hold());\n }\n\n readOnly(): string | null {\n return this.#readOnly;\n }\n\n setReadOnly(text: string | null): void {\n this.#readOnly = text || null;\n this.emit('readOnly', this.#readOnly);\n }\n\n starting(): string | null {\n return this.#starting;\n }\n\n setStarting(line: string | null): void {\n this.#arrival++;\n this.#starting = line || null;\n this.emit('starting', this.#starting);\n }\n\n withhold(line: string, ticks?: number): void {\n this.#absent = [...this.#absent, ...this.#agents];\n this.#agents = [];\n this.#active = '';\n this.#changed();\n this.setStarting(line);\n if (ticks === undefined) return;\n const arrival = this.#arrival;\n void this.#clock.sleep(ticks).then(() => {\n if (arrival === this.#arrival) this.arrive();\n });\n }\n\n arrive(): void {\n this.#agents = [...this.#agents, ...this.#absent];\n this.#absent = [];\n this.#active = this.#agents[0]?.id ?? '';\n this.#changed();\n this.emit('active', this.#active);\n this.setStarting(null);\n }\n\n frozen(): readonly FrozenCone[] {\n const live = this.#agents\n .filter((agent) => !agent.frozen)\n .map((agent): FrozenCone => {\n const messages = this.#messages.get(agent.id) as Message[];\n const first = messages.find((message) => message.role === 'user');\n return {\n id: agent.id,\n kind: agent.kind,\n live: true,\n name: agent.name,\n title: first?.role === 'user' ? firstLine(first.text) : agent.name,\n model: agent.model,\n messages: messages.length,\n frozenAt: messages.at(-1)?.createdAt ?? 0,\n };\n });\n return [...live, ...this.#frozen.map((cone) => ({ ...cone }))];\n }\n\n freeze(agentId: string): void {\n const agent = this.#agent(agentId);\n if (agent?.kind !== 'cone' || agent.frozen) return;\n this.stop(agentId);\n const family = this.#agents.filter(\n (candidate) => candidate.id === agentId || candidate.parentId === agentId\n );\n const messages = this.#messages.get(agentId) ?? [];\n const first = messages.find((message) => message.role === 'user');\n this.#frozen.unshift({\n id: agentId,\n kind: 'cone',\n name: agent.name,\n title: first?.role === 'user' ? firstLine(first.text) : agent.name,\n model: agent.model,\n messages: messages.length,\n frozenAt: Date.now(),\n });\n this.#ice.set(\n agentId,\n family.map((member) => ({\n agent: { ...member, status: 'idle' as const },\n messages: this.#messages.get(member.id) as Message[],\n }))\n );\n for (const member of family) this.stop(member.id);\n this.#agents = this.#agents.filter((candidate) => !family.includes(candidate));\n for (const member of family) this.#messages.delete(member.id);\n if (this.#active === agentId) this.#active = this.#agents[0]?.id ?? '';\n this.emit('frozen', this.frozen());\n this.emit('active', this.#active);\n this.#changed();\n }\n\n thaw(id: string): Agent | null {\n const ice = this.#ice.get(id);\n if (!ice) {\n const agent = this.#agent(id);\n if (!agent?.frozen) return null;\n delete agent.frozen;\n this.#changed();\n return { ...agent };\n }\n const row = this.#frozen.find((cone) => cone.id === id) as FrozenCone;\n if (row.kind === 'scoop' || row.kind === 'agent') {\n const [{ agent, messages }] = ice as [{ agent: Agent; messages: Message[] }];\n const fork: Agent = {\n ...agent,\n id: `${id}-thaw-${this.#thaws++}`,\n kind: 'cone',\n parentId: null,\n };\n this.#agents.push(fork);\n this.#messages.set(fork.id, structuredClone(messages));\n this.#queues.set(fork.id, []);\n row.thawedAs = fork.id;\n this.emit('frozen', this.frozen());\n this.select(fork.id);\n return { ...fork };\n }\n this.#ice.delete(id);\n this.#frozen = this.#frozen.filter((cone) => cone.id !== id);\n for (const { agent, messages } of ice) {\n this.#agents.push(agent);\n this.#messages.set(agent.id, messages);\n this.#queues.set(agent.id, []);\n }\n this.emit('frozen', this.frozen());\n this.select(id);\n return { ...ice[0].agent };\n }\n\n discard(id: string): void {\n this.#ice.delete(id);\n this.#frozen = this.#frozen.filter((cone) => cone.id !== id);\n this.emit('frozen', this.frozen());\n }\n}\n", "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Suggestions</title>\n\n <link rel=\"icon\" href=\"ice-cream-cone\" />\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n body {\n font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif);\n background: transparent;\n color: var(--s2-content-default, #e8e8e8);\n padding: 14px 18px 20px;\n }\n\n #gelatiereStream[hidden] { display: none; }\n\n .gelatiere-entry { padding: 18px 0; }\n .gelatiere-entry:first-child { padding-top: 2px; }\n .gelatiere-entry + .gelatiere-entry,\n .gelatiere-done {\n border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));\n }\n\n .gelatiere-entry__head {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n line-height: 1.35;\n color: var(--s2-content-default, #e8e8e8);\n }\n\n .gelatiere-entry__head :is(i, svg) { width: 15px; height: 15px; flex-shrink: 0; }\n .gelatiere-entry__title { flex: 1; }\n .gelatiere-kind {\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--s2-content-tertiary, #8a8a8a);\n white-space: nowrap;\n }\n\n .gelatiere-why {\n margin-top: 6px;\n font-size: 12px;\n line-height: 1.55;\n color: var(--s2-content-secondary, #a1a1a1);\n }\n .gelatiere-cmd {\n margin-top: 8px;\n font-size: 11px;\n color: var(--s2-content-tertiary, #8a8a8a);\n overflow-wrap: anywhere;\n }\n .gelatiere-cmd code,\n .gelatiere-why code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n }\n\n .gelatiere-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 14px;\n margin-top: 12px;\n }\n .gelatiere-actions .gelatiere-taken-note { margin-right: auto; }\n\n .gelatiere-quiet-btn {\n background: none;\n border: none;\n font-family: inherit;\n font-size: 12px;\n color: var(--s2-content-tertiary, #8a8a8a);\n cursor: pointer;\n padding: 4px 0;\n }\n .gelatiere-quiet-btn:hover { color: var(--s2-content-secondary, #a1a1a1); }\n\n .gelatiere-empty { padding: 2px 0 4px; }\n .gelatiere-explore {\n margin-top: 18px;\n padding-top: 14px;\n border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));\n }\n .gelatiere-explore__link {\n display: block;\n padding: 10px 0;\n text-decoration: none;\n color: inherit;\n }\n .gelatiere-explore__link + .gelatiere-explore__link {\n border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));\n }\n .gelatiere-explore__link:hover .gelatiere-entry__title { text-decoration: underline; }\n\n .gelatiere-entry--taken .gelatiere-entry__head,\n .gelatiere-entry--taken .gelatiere-why,\n .gelatiere-entry--taken .gelatiere-cmd { opacity: 0.6; }\n .gelatiere-taken-note {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--s2-content-positive, #2d9d78);\n }\n .gelatiere-taken-note :is(i, svg) { width: 14px; height: 14px; flex-shrink: 0; }\n\n .gelatiere-done { margin-top: 6px; padding-top: 14px; }\n .gelatiere-done-title {\n padding-bottom: 6px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--s2-content-tertiary, #8a8a8a);\n }\n .gelatiere-done-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 12px;\n color: var(--s2-content-secondary, #a1a1a1);\n }\n .gelatiere-done-row :is(i, svg) {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n color: var(--s2-content-positive, #2d9d78);\n }\n .gelatiere-done-row .gelatiere-done-title-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .gelatiere-done-row .gelatiere-done-what {\n color: var(--s2-content-tertiary, #8a8a8a);\n white-space: nowrap;\n }\n </style>\n </head>\n <body>\n\n <div id=\"gelatiereStream\" hidden></div>\n\n <script>\n\n var GELATIERE_SUGGESTIONS_PATH = '/shared/.gelatiere/suggestions.json';\n\n var KIND_LABELS = {\n 'skill': { label: 'Skill', icon: 'package', action: 'Install', done: 'installed' },\n 'use-case': { label: 'Try this', icon: 'sparkles', action: 'Try it', done: 'tried' },\n 'tip': { label: 'Tip', icon: 'lightbulb', action: null, done: 'tried' },\n 'skill-idea': { label: 'New skill', icon: 'wand-sparkles', action: 'Draft it', done: 'drafted' },\n 'issue': { label: 'Report', icon: 'bug', action: 'Report it', done: 'reported' },\n };\n\n var USE_CASE_COMMAND = 'gelatiere use-cases --limit 3 --json';\n var USE_CASE_CACHE_MS = 12 * 60 * 60 * 1000;\n var EMPTY_HEADLINE = 'Nothing here yet';\n var EMPTY_BODY =\n 'The gelatiere reads how you actually work, nightly and after each chat ' +\n 'ends, and leaves what it finds here: a skill worth installing, a use ' +\n 'case worth trying, a habit worth changing. Check back after your next session.';\n\n function el(tag, className, text) {\n var node = document.createElement(tag);\n if (className) node.className = className;\n if (text != null) node.textContent = text;\n return node;\n }\n\n function lucide(name) {\n var ic = document.createElement('i');\n ic.setAttribute('data-lucide', name);\n return ic;\n }\n\n function gelatierePrimaryButton(label, onClick) {\n var btn = el('button', 'sprinkle-btn sprinkle-btn--primary', label);\n btn.type = 'button';\n btn.onclick = onClick;\n return btn;\n }\n\n function gelatiereQuietButton(label, onClick, title) {\n var btn = el('button', 'gelatiere-quiet-btn', label);\n btn.type = 'button';\n if (title) btn.title = title;\n btn.onclick = onClick;\n return btn;\n }\n\n function buildSuggestionCard(s) {\n var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;\n var card = el('div', 'gelatiere-entry');\n card.dataset.id = s.id;\n\n var head = el('div', 'gelatiere-entry__head');\n head.appendChild(lucide(meta.icon));\n head.appendChild(el('span', 'gelatiere-entry__title', s.title));\n head.appendChild(el('span', 'gelatiere-kind', meta.label));\n card.appendChild(head);\n\n card.appendChild(el('div', 'gelatiere-why', s.body));\n if (s.install) {\n var install = el('div', 'gelatiere-cmd');\n install.appendChild(document.createTextNode('Installs '));\n install.appendChild(el('code', null, s.install));\n card.appendChild(install);\n }\n\n var actions = el('div', 'gelatiere-actions');\n\n function markTaken(note) {\n card.classList.add('gelatiere-entry--taken');\n var done = el('div', 'gelatiere-taken-note');\n done.appendChild(lucide('check'));\n done.appendChild(document.createTextNode(note));\n actions.replaceChildren(done);\n if (window.LucideIcons) window.LucideIcons.render();\n }\n\n actions.appendChild(gelatiereQuietButton('Dismiss', function () {\n if (window.slicc) slicc.lick({ action: 'gelatiere-dismiss', data: { id: s.id } });\n card.remove();\n if (!document.querySelector('.gelatiere-entry')) renderGelatiereCaughtUp();\n }, \"that's not for me\"));\n if (s.kind === 'skill') {\n actions.appendChild(gelatierePrimaryButton(meta.action, function () {\n if (window.slicc) slicc.lick({ action: 'gelatiere-install',\n data: { id: s.id, skill: s.skill || null, install: s.install || null, title: s.title } });\n markTaken('Installing. The cone is on it.');\n }));\n } else if (meta.action && s.prompt) {\n actions.appendChild(gelatierePrimaryButton(meta.action, function () {\n if (window.slicc) slicc.lick({ action: 'gelatiere-try',\n data: { id: s.id, prompt: s.prompt, title: s.title } });\n markTaken('Sent to the cone. Watch the chat.');\n }));\n } else if (s.url && /^https?:\\/\\//i.test(s.url)) {\n\n var link = el('a', 'gelatiere-quiet-btn', 'Read more');\n link.href = s.url;\n link.target = '_blank';\n link.rel = 'noopener';\n actions.appendChild(link);\n }\n card.appendChild(actions);\n return card;\n }\n\n var DONE_LEDGER_LIMIT = 5;\n function buildDoneLedger(taken) {\n var wrap = el('div', 'gelatiere-done');\n wrap.appendChild(el('div', 'gelatiere-done-title', 'Done'));\n taken.slice(0, DONE_LEDGER_LIMIT).forEach(function (s) {\n var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;\n var row = el('div', 'gelatiere-done-row');\n row.appendChild(lucide('check'));\n row.appendChild(el('span', 'gelatiere-done-title-text', s.title));\n row.appendChild(el('span', 'gelatiere-done-what', meta.done));\n wrap.appendChild(row);\n });\n return wrap;\n }\n\n function readCachedUseCases() {\n try {\n var saved = window.slicc && slicc.getState && slicc.getState();\n if (!saved || !saved.useCases || !saved.fetchedAt) return null;\n if (Date.now() - saved.fetchedAt > USE_CASE_CACHE_MS) return null;\n return saved.useCases;\n } catch (e) { return null; }\n }\n\n function loadUseCases() {\n var cached = readCachedUseCases();\n if (cached) return Promise.resolve(cached);\n if (!window.slicc || typeof slicc.exec !== 'function') return Promise.resolve([]);\n return Promise.resolve(slicc.exec(USE_CASE_COMMAND)).then(function (result) {\n if (!result || result.exitCode !== 0) return [];\n var parsed = JSON.parse(result.stdout);\n if (!Array.isArray(parsed)) return [];\n var cases = parsed.filter(function (c) { return c && c.url && c.title; });\n try { slicc.setState({ fetchedAt: Date.now(), useCases: cases }); } catch (e) {}\n return cases;\n }, function () { return []; });\n }\n\n function appendUseCases(stream) {\n loadUseCases().then(function (cases) {\n if (!cases.length || !stream.isConnected) return;\n var wrap = el('div', 'gelatiere-explore');\n wrap.appendChild(el('div', 'gelatiere-done-title', 'Meanwhile, from sliccy.com'));\n cases.forEach(function (c) {\n var link = el('a', 'gelatiere-explore__link');\n link.href = c.url;\n link.target = '_blank';\n link.rel = 'noopener';\n var head = el('div', 'gelatiere-entry__head');\n head.appendChild(el('span', 'gelatiere-entry__title', c.title));\n head.appendChild(lucide('arrow-up-right'));\n link.appendChild(head);\n if (c.description) link.appendChild(el('div', 'gelatiere-why', c.description));\n wrap.appendChild(link);\n });\n stream.appendChild(wrap);\n if (window.LucideIcons) window.LucideIcons.render();\n });\n }\n\n function renderGelatiereEmpty(headline, body) {\n var stream = document.getElementById('gelatiereStream');\n stream.innerHTML = '';\n var empty = el('div', 'gelatiere-empty');\n var head = el('div', 'gelatiere-entry__head');\n head.appendChild(lucide('ice-cream-cone'));\n head.appendChild(el('span', 'gelatiere-entry__title', headline));\n empty.appendChild(head);\n empty.appendChild(el('div', 'gelatiere-why', body));\n stream.appendChild(empty);\n stream.hidden = false;\n if (window.LucideIcons) window.LucideIcons.render();\n appendUseCases(stream);\n }\n\n function renderGelatiereCaughtUp() {\n renderGelatiereEmpty(\n 'All caught up',\n 'You have answered everything the gelatiere left here. The next pass runs ' +\n 'tonight, and again after your next chat ends.'\n );\n }\n\n function renderGelatiereStream() {\n var stream = document.getElementById('gelatiereStream');\n if (!stream) return;\n\n if (!window.slicc || typeof slicc.readFile !== 'function') {\n renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);\n return;\n }\n\n Promise.resolve(slicc.exists(GELATIERE_SUGGESTIONS_PATH)).then(function (present) {\n return present ? slicc.readFile(GELATIERE_SUGGESTIONS_PATH) : '[]';\n }).then(function (raw) {\n var list = [];\n try { list = JSON.parse(raw); } catch (e) { list = []; }\n if (!Array.isArray(list)) list = [];\n var readable = list.filter(function (s) {\n return s && typeof s === 'object' && s.id && s.title && s.body;\n });\n\n var open = readable.filter(function (s) { return !s.dismissedAt && !s.takenAt; });\n var taken = readable.filter(function (s) { return s.takenAt; });\n if (open.length === 0 && taken.length === 0) {\n renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);\n return;\n }\n\n if (open.length === 0) {\n renderGelatiereCaughtUp();\n stream.appendChild(buildDoneLedger(taken));\n if (window.LucideIcons) window.LucideIcons.render();\n return;\n }\n stream.innerHTML = '';\n open.forEach(function (s) { stream.appendChild(buildSuggestionCard(s)); });\n if (taken.length > 0) stream.appendChild(buildDoneLedger(taken));\n stream.hidden = false;\n if (window.LucideIcons) window.LucideIcons.render();\n }, function () {\n renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);\n });\n }\n\n renderGelatiereStream();\n </script>\n </body>\n</html>\n", "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Welcome</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n body {\n font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif);\n background: transparent;\n color: var(--s2-content-default, #e8e8e8);\n }\n\n .step { display: none; animation: fadeUp 0.18s ease both; }\n .step.active { display: block; }\n @keyframes fadeUp {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 14px;\n }\n .pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 34px;\n padding: 0 14px;\n border-radius: var(--s2-radius-pill, 9999px);\n background: var(--s2-bg-elevated, #2c2c2c);\n border: 1px solid var(--s2-border-subtle, #3a3a3a);\n cursor: pointer;\n font-family: inherit;\n font-size: 13px;\n font-weight: 500;\n color: var(--s2-content-default, #e8e8e8);\n transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;\n user-select: none;\n white-space: nowrap;\n }\n .pill:hover {\n background: var(--s2-bg-layer-2, #252525);\n border-color: var(--s2-border-default, #4a4a4a);\n }\n .pill.selected {\n border-color: var(--s2-accent, #3562ff);\n box-shadow: 0 0 0 1px var(--s2-accent, #3562ff);\n background: var(--s2-bg-layer-2, #252525);\n }\n\n .step-heading {\n font-size: 15px;\n font-weight: 700;\n color: var(--s2-content-default, #e8e8e8);\n line-height: 1.3;\n }\n .step-sub {\n font-size: 12px;\n color: var(--s2-content-secondary, #a1a1a1);\n margin-top: 3px;\n }\n\n .input-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 14px;\n background: var(--s2-bg-elevated, #2c2c2c);\n border: 1px solid var(--s2-border-subtle, #3a3a3a);\n border-radius: var(--s2-radius-pill, 9999px);\n padding: 6px 6px 6px 14px;\n }\n\n .input-row input {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-family: inherit;\n font-size: 14px;\n color: var(--s2-content-default, #e8e8e8);\n }\n .input-row input::placeholder { color: var(--s2-content-tertiary, #8a8a8a); }\n .input-row button {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n border: none;\n background: var(--s2-accent, #3562ff);\n color: var(--s2-gray-25, #f5f5f5);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background 0.15s;\n }\n .input-row button:hover { background: var(--s2-accent-hover, #4a75ff); }\n\n .cta-row { margin-top: 14px; }\n .cta {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 8px 22px;\n border-radius: var(--s2-radius-pill, 9999px);\n background: var(--s2-accent, #3562ff);\n color: var(--s2-gray-25, #f5f5f5);\n border: none;\n font-family: inherit;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n }\n .cta:hover { background: var(--s2-accent-hover, #4a75ff); }\n\n .footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 16px;\n }\n .dots { display: flex; gap: 5px; }\n .dot {\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--s2-gray-300, #4a4a4a);\n transition: background 0.2s, transform 0.2s;\n }\n .dot.active { background: var(--s2-accent, #3562ff); transform: scale(1.3); }\n .dot.done { background: var(--s2-accent, #3562ff); }\n\n .skip-btn {\n background: none;\n border: none;\n font-family: inherit;\n font-size: 11px;\n color: var(--s2-content-tertiary, #8a8a8a);\n cursor: pointer;\n padding: 2px 4px;\n }\n .skip-btn:hover { color: var(--s2-content-secondary, #a1a1a1); }\n\n .back-btn {\n background: none;\n border: none;\n font-family: inherit;\n font-size: 11px;\n color: var(--s2-content-secondary, #a1a1a1);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 2px 0;\n margin-bottom: 10px;\n }\n .back-btn:hover { color: var(--s2-content-default, #e8e8e8); }\n .back-btn[hidden] { display: none; }\n\n .done-state {\n text-align: center;\n padding: 12px 0 4px;\n font-size: 14px;\n color: var(--s2-content-secondary, #a1a1a1);\n }\n </style>\n </head>\n <body>\n <div class=\"sprinkle-action-card\">\n\n <div class=\"sprinkle-action-card__body\" style=\"padding: 16px 24px 0\">\n <button class=\"back-btn\" id=\"backBtn\" hidden onclick=\"goBack()\">\n <i data-lucide=\"arrow-left\" style=\"width:12px;height:12px\"></i> Back\n </button>\n\n <div class=\"step active\" id=\"s1\">\n <div class=\"step-heading\">What brings you here?</div>\n <div class=\"pills\" id=\"purposePills\"></div>\n </div>\n\n <div class=\"step\" id=\"s2\">\n <div class=\"step-heading\" id=\"s2Heading\">What do you do?</div>\n <div class=\"pills\" id=\"rolePills\"></div>\n </div>\n\n <div class=\"step\" id=\"s3\">\n <div class=\"step-heading\" id=\"s3Heading\">What do you want to tackle?</div>\n <div class=\"step-sub\">Pick as many as you like</div>\n <div class=\"pills\" id=\"taskPills\"></div>\n <div class=\"cta-row\">\n <button class=\"cta\" onclick=\"goStep(4)\">Continue</button>\n </div>\n </div>\n\n <div class=\"step\" id=\"s4\">\n <div class=\"step-heading\">What should I call you?</div>\n <div class=\"input-row\">\n <input type=\"text\" id=\"nameIn\" placeholder=\"Your name\"\n onkeydown=\"if(event.key==='Enter') advanceFrom(4)\" />\n <button onclick=\"advanceFrom(4)\" aria-label=\"Continue\">\n <i data-lucide=\"arrow-right\" style=\"width:14px;height:14px\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"step\" id=\"s5\">\n <div class=\"step-heading\">Where do you work?</div>\n <div class=\"input-row\">\n <input type=\"text\" id=\"companyIn\" placeholder=\"Company or organization\"\n onkeydown=\"if(event.key==='Enter') advanceFrom(5)\" />\n <button onclick=\"advanceFrom(5)\" aria-label=\"Continue\">\n <i data-lucide=\"arrow-right\" style=\"width:14px;height:14px\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"step\" id=\"s6\">\n <div class=\"step-heading\" id=\"s6Heading\">What apps do you use most?</div>\n <div class=\"step-sub\">Pick any that apply</div>\n <div class=\"pills\" id=\"appPills\"></div>\n <div class=\"cta-row\">\n <button class=\"cta\" onclick=\"finish()\">Let's go</button>\n </div>\n </div>\n\n <div class=\"step\" id=\"sDone\">\n <div class=\"done-state\" id=\"sDoneText\">Setting things up&hellip;</div>\n </div>\n </div>\n\n <div class=\"sprinkle-action-card__body\" style=\"padding-top:0\" id=\"footerArea\">\n <div class=\"footer\">\n <div class=\"dots\" id=\"dots\">\n <div class=\"dot active\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n </div>\n <button class=\"skip-btn\" id=\"skipBtn\" onclick=\"skipStep()\">skip</button>\n </div>\n </div>\n\n </div>\n\n <script>\n var cur = 1;\n var profile = { purpose: '', role: '', tasks: [], name: '', company: '', apps: [] };\n\n var ROLE_FONTS = {\n 'developer': 'monospace',\n 'designer': 'Papyrus, fantasy',\n 'product-pm': '\"Comic Sans MS\", \"Comic Sans\", cursive',\n };\n\n var TASK_HEADINGS_BY_ROLE = {\n 'developer': 'What are you hacking?',\n 'designer': 'What do you dream of?',\n 'product-pm': \"What's your mission?\",\n 'content-creator': \"What's your story?\",\n 'marketer': \"What's your ambition?\",\n 'founder': 'What do you want to create?',\n 'student': 'What are you learning?',\n 'researcher': 'What are you researching?',\n };\n var TASK_HEADING_DEFAULT = 'What do you want to tackle?';\n\n var PURPOSES = [\n { id: 'work', label: 'Work', icon: 'briefcase' },\n { id: 'school', label: 'School', icon: 'graduation-cap' },\n { id: 'personal', label: 'Personal', icon: 'user' },\n { id: 'side-project',label: 'Side project', icon: 'lightbulb' },\n { id: 'exploring', label: 'Just exploring', icon: 'compass' },\n ];\n\n var ROLES_BY_PURPOSE = {\n work: {\n heading: \"What's your role?\",\n roles: [\n { id: 'developer', label: 'Developer', icon: 'code' },\n { id: 'designer', label: 'Designer', icon: 'palette' },\n { id: 'content-creator', label: 'Content creator', icon: 'pen-tool' },\n { id: 'marketer', label: 'Marketer', icon: 'megaphone' },\n { id: 'product-pm', label: 'Product / PM', icon: 'layout-dashboard' },\n { id: 'founder', label: 'Founder', icon: 'rocket' },\n { id: 'other', label: 'Something else', icon: 'help-circle' },\n ],\n },\n school: {\n heading: \"What are you studying?\",\n roles: [\n { id: 'student', label: 'Student', icon: 'book-open' },\n { id: 'researcher', label: 'Researcher', icon: 'microscope' },\n { id: 'developer', label: 'Developer', icon: 'code' },\n { id: 'designer', label: 'Designer', icon: 'palette' },\n { id: 'other', label: 'Something else', icon: 'help-circle' },\n ],\n },\n _default: {\n heading: \"What's your background?\",\n roles: [\n { id: 'developer', label: 'Developer', icon: 'code' },\n { id: 'designer', label: 'Designer', icon: 'palette' },\n { id: 'content-creator', label: 'Content creator', icon: 'pen-tool' },\n { id: 'marketer', label: 'Marketer', icon: 'megaphone' },\n { id: 'product-pm', label: 'Product / PM', icon: 'layout-dashboard' },\n { id: 'student', label: 'Student', icon: 'book-open' },\n { id: 'researcher', label: 'Researcher', icon: 'microscope' },\n { id: 'founder', label: 'Founder', icon: 'rocket' },\n { id: 'other', label: 'Something else', icon: 'help-circle' },\n ],\n },\n };\n\n var TASKS = [\n { id: 'build-websites', label: 'Build websites', icon: 'globe' },\n { id: 'migrate-page-aem', label: 'Migrate a page to AEM', icon: 'book-up' },\n { id: 'automate', label: 'Automate tasks', icon: 'zap' },\n { id: 'research', label: 'Research & analyze', icon: 'search' },\n { id: 'write-content', label: 'Write content', icon: 'file-text' },\n { id: 'extract-data', label: 'Extract data', icon: 'database' },\n { id: 'monitor', label: 'Monitor sites', icon: 'activity' },\n { id: 'seo', label: 'SEO & audits', icon: 'bar-chart' },\n { id: 'manage-files', label: 'Manage files', icon: 'folder' },\n { id: 'browser-automation', label: 'Browser automation', icon: 'mouse-pointer' },\n { id: 'not-sure', label: 'Not sure yet', icon: 'circle-help' },\n ];\n\n var APPS = [\n { id: 'aem', label: 'Adobe Experience Manager', icon: 'box',\n relevance: ['build-websites','migrate-page-aem','write-content','seo','content-creator','marketer','designer'] },\n { id: 'imessage', label: 'iMessage', icon: 'message-circle',\n relevance: ['personal','side-project','exploring'] },\n { id: 'teams', label: 'Microsoft Teams', icon: 'users',\n relevance: ['work','school','developer','designer','marketer','product-pm','founder','student'] },\n { id: 'slack', label: 'Slack', icon: 'hash',\n relevance: ['work','school','developer','designer','marketer','product-pm','founder','student'] },\n ];\n\n function applyFontJoke(stepEl) {\n var font = ROLE_FONTS[profile.role];\n if (font) stepEl.style.fontFamily = font;\n else stepEl.style.fontFamily = '';\n }\n\n function makePill(item, multiSelect, onSelect, preselected) {\n var btn = document.createElement('button');\n btn.className = 'pill';\n btn.dataset.id = item.id;\n if (preselected) btn.classList.add('selected');\n if (item.icon) {\n var ic = document.createElement('i');\n ic.setAttribute('data-lucide', item.icon);\n ic.style.width = '14px';\n ic.style.height = '14px';\n btn.appendChild(ic);\n }\n btn.appendChild(document.createTextNode(item.label));\n btn.onclick = function () {\n if (multiSelect) {\n btn.classList.toggle('selected');\n } else {\n btn.parentElement.querySelectorAll('.pill').forEach(function(p){ p.classList.remove('selected'); });\n btn.classList.add('selected');\n }\n onSelect(item, btn);\n };\n return btn;\n }\n\n function buildPills(containerId, items, multiSelect, onSelect, selectedIds) {\n var el = document.getElementById(containerId);\n el.innerHTML = '';\n var pre = selectedIds || [];\n items.forEach(function(item) {\n el.appendChild(makePill(item, multiSelect, onSelect, pre.indexOf(item.id) >= 0));\n });\n if (window.LucideIcons) window.LucideIcons.render();\n }\n\n function getRelevantApps() {\n var ctx = profile.tasks.concat([profile.role, profile.purpose]);\n return APPS.slice().sort(function(a, b) {\n var sa = a.relevance.filter(function(t){ return ctx.indexOf(t) >= 0; }).length;\n var sb = b.relevance.filter(function(t){ return ctx.indexOf(t) >= 0; }).length;\n return sb - sa;\n });\n }\n\n function updateDots(step) {\n\n var effective = step;\n if (profile.purpose !== 'work' && step >= 5) effective = step - 1;\n var dots = document.getElementById('dots').children;\n for (var i = 0; i < dots.length; i++) {\n dots[i].className = 'dot';\n if (i + 1 === effective) dots[i].className = 'dot active';\n else if (i + 1 < effective) dots[i].className = 'dot done';\n }\n\n dots[5].style.display = (profile.purpose !== 'work') ? 'none' : '';\n }\n\n function goBack() {\n var prev = cur - 1;\n if (prev === 5 && profile.purpose !== 'work') prev = 4;\n if (prev >= 1) goStep(prev);\n }\n\n function skipStep() {\n if (cur === 4) {\n profile.name = '';\n var nameIn = document.getElementById('nameIn');\n if (nameIn) nameIn.value = '';\n goStep(nextStep(cur));\n } else if (cur === 5) {\n profile.company = '';\n var companyIn = document.getElementById('companyIn');\n if (companyIn) companyIn.value = '';\n goStep(nextStep(cur));\n } else if (cur < 6) {\n goStep(nextStep(cur));\n } else {\n finish();\n }\n }\n\n function nextStep(n) {\n if (n === 4 && profile.purpose !== 'work') return 6;\n return n + 1;\n }\n\n function advanceFrom(n) {\n goStep(nextStep(n));\n }\n\n function goStep(n) {\n\n if (cur === 4) profile.name = (document.getElementById('nameIn').value || '').trim();\n if (cur === 5) profile.company = (document.getElementById('companyIn').value || '').trim();\n\n if (n === 1) {\n buildPills('purposePills', PURPOSES, false, function(item) {\n profile.purpose = item.id;\n setTimeout(function(){ goStep(2); }, 280);\n }, profile.purpose ? [profile.purpose] : []);\n }\n if (n === 2) {\n var cfg = ROLES_BY_PURPOSE[profile.purpose] || ROLES_BY_PURPOSE._default;\n document.getElementById('s2Heading').textContent = cfg.heading;\n buildPills('rolePills', cfg.roles, false, function(item) {\n profile.role = item.id;\n setTimeout(function(){ goStep(3); }, 280);\n }, profile.role ? [profile.role] : []);\n }\n if (n === 3) {\n var s3 = document.getElementById('s3');\n applyFontJoke(s3);\n var taskHeading = TASK_HEADINGS_BY_ROLE[profile.role] || TASK_HEADING_DEFAULT;\n document.getElementById('s3Heading').textContent = taskHeading;\n buildPills('taskPills', TASKS, true, function(item) {\n profile.tasks = [];\n document.querySelectorAll('#taskPills .pill.selected').forEach(function(p){\n profile.tasks.push(p.dataset.id);\n });\n }, profile.tasks);\n }\n if (n === 6) {\n var s6 = document.getElementById('s6');\n applyFontJoke(s6);\n buildPills('appPills', getRelevantApps(), true, function(item) {\n profile.apps = [];\n document.querySelectorAll('#appPills .pill.selected').forEach(function(p){\n profile.apps.push(p.dataset.id);\n });\n }, profile.apps);\n }\n\n document.getElementById('s' + cur).classList.remove('active');\n document.getElementById('s' + n).classList.add('active');\n cur = n;\n updateDots(n);\n\n document.getElementById('backBtn').hidden = (n <= 1 || n > 6);\n document.getElementById('footerArea').style.display = (n > 6) ? 'none' : '';\n\n if (n === 4) setTimeout(function(){ document.getElementById('nameIn').focus(); }, 80);\n if (n === 5) setTimeout(function(){ document.getElementById('companyIn').focus(); }, 80);\n }\n\n function finish() {\n if (!profile.name) profile.name = (document.getElementById('nameIn').value || '').trim();\n if (!profile.company) profile.company = (document.getElementById('companyIn').value || '').trim();\n\n document.getElementById('s' + cur).classList.remove('active');\n document.getElementById('sDone').classList.add('active');\n document.getElementById('footerArea').style.display = 'none';\n document.getElementById('backBtn').hidden = true;\n\n if (window.slicc) {\n slicc.lick({ action: 'onboarding-complete', data: profile });\n }\n }\n\n function startWizard() {\n document.getElementById('sDone').classList.remove('active');\n document.getElementById('s1').classList.add('active');\n document.getElementById('footerArea').style.display = '';\n\n buildPills('purposePills', PURPOSES, false, function(item) {\n profile.purpose = item.id;\n setTimeout(function(){ goStep(2); }, 280);\n }, profile.purpose ? [profile.purpose] : []);\n\n updateDots(1);\n document.getElementById('backBtn').hidden = true;\n document.getElementById('dots').children[5].style.display = 'none';\n }\n\n function showAlreadyComplete() {\n var wizard = document.querySelector('.sprinkle-action-card');\n if (wizard) wizard.remove();\n }\n\n ['s1','s2','s3','s4','s5','s6','sDone'].forEach(function(id){\n var el = document.getElementById(id);\n if (el) el.classList.remove('active');\n });\n\n function bootByMarker() {\n if (!window.slicc || typeof slicc.exists !== 'function') {\n startWizard();\n return;\n }\n Promise.resolve(slicc.exists('/shared/.welcomed')).then(\n function(welcomed) { welcomed ? showAlreadyComplete() : startWizard(); },\n function() { startWizard(); }\n );\n }\n bootByMarker();\n </script>\n </body>\n</html>\n", "export const status = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Status</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, system-ui, sans-serif);\n background: transparent;\n color: var(--s2-content-default, #e8e8e8);\n font-size: 14px;\n }\n .card {\n display: grid;\n gap: 12px;\n padding: 8px 20px 12px;\n }\n .row { display: flex; align-items: center; gap: 10px; }\n .dot {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dot);\n }\n .name { flex: 1; font-weight: 600; }\n .meta { font-size: 12px; color: var(--s2-content-subdued, #9a9a9a); }\n .steps { list-style: none; display: grid; gap: 6px; }\n .steps label { display: flex; align-items: center; gap: 8px; cursor: pointer; }\n .actions { display: flex; justify-content: flex-end; gap: 8px; }\n button {\n font: inherit;\n padding: 6px 12px;\n border-radius: 999px;\n border: 1px solid var(--s2-gray-400, rgba(128, 128, 128, 0.5));\n background: transparent;\n color: inherit;\n cursor: pointer;\n }\n button.primary {\n background: var(--s2-accent, #3b63fb);\n border-color: transparent;\n color: #fff;\n }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <div class=\"row\" style=\"--dot: #2d9d78\">\n <span class=\"dot\"></span>\n <span class=\"name\">PR #58 \u00B7 Add retries for upstream timeouts</span>\n <span class=\"meta\">4 of 4 checks</span>\n </div>\n <div class=\"row\" style=\"--dot: #e68619\">\n <span class=\"dot\"></span>\n <span class=\"name\">Visual regression suite</span>\n <span class=\"meta\">2 snapshots changed</span>\n </div>\n <div class=\"row\" style=\"--dot: #2d9d78\">\n <span class=\"dot\"></span>\n <span class=\"name\">Staging</span>\n <span class=\"meta\">/health answered in 2 ms</span>\n </div>\n <ul class=\"steps\">\n <li><label><input type=\"checkbox\" checked /> TTL fix merged</label></li>\n <li><label><input type=\"checkbox\" /> Merge the retry pull request</label></li>\n <li><label><input type=\"checkbox\" /> Update the forecast docs to Celsius</label></li>\n <li><label><input type=\"checkbox\" /> Tag 1.9.0</label></li>\n </ul>\n <div class=\"actions\">\n <button type=\"button\" data-action=\"review\">Review snapshots</button>\n <button type=\"button\" class=\"primary\" data-action=\"continue\">Continue</button>\n </div>\n </div>\n <script>\n document.querySelector('.actions').addEventListener('click', function (event) {\n var action = event.target.getAttribute('data-action');\n if (!action || !window.slicc) return;\n var done = document.querySelectorAll('.steps input:checked').length;\n slicc.lick({ action: action, data: { done: done } });\n });\n </script>\n </body>\n</html>\n`;\n", "import type {\n FrozenCone,\n Memory,\n Message,\n Sprinkle,\n TrayBudget,\n TrayStatus,\n} from '../model/types.ts';\nimport suggestions from './sprinkles/suggestions.shtml';\nimport welcome from './sprinkles/welcome.shtml';\nimport { status } from './status.ts';\n\nconst day = 86_400_000;\nconst now = Date.UTC(2026, 9, 5, 9, 0);\n\nfunction frozenConversation(topic: string, reply: string): Message[] {\n return [\n { id: `f-${topic}-1`, role: 'user', text: topic, createdAt: now - 3 * day },\n {\n id: `f-${topic}-2`,\n role: 'assistant',\n status: 'done',\n createdAt: now - 3 * day + 60_000,\n parts: [{ type: 'text', text: reply }],\n },\n ];\n}\n\nexport const frozen: Array<{ cone: FrozenCone; messages: Message[] }> = [\n {\n cone: {\n id: 'cone-onboarding',\n kind: 'cone',\n name: 'onboarding',\n title: 'Write the onboarding guide for new contributors',\n model: 'claude-sonnet-5-5',\n messages: 42,\n frozenAt: now - 2 * day,\n },\n messages: frozenConversation(\n 'Write the onboarding guide for new contributors',\n 'The guide is in `/workspace/harbor/docs/onboarding.md`, with setup, tests and the release checklist.'\n ),\n },\n {\n cone: {\n id: 'cone-kv-spike',\n kind: 'cone',\n name: 'kv-spike',\n title: 'Spike: can the cache move to KV without a cold start?',\n model: 'claude-opus-5-5',\n messages: 118,\n frozenAt: now - 6 * day,\n },\n messages: frozenConversation(\n 'Spike: can the cache move to KV without a cold start?',\n 'Yes, with a 5-minute in-memory layer in front. Reads from KV add 12 ms at the 95th percentile.'\n ),\n },\n {\n cone: {\n id: 'cone-q3-report',\n kind: 'cone',\n name: 'q3-report',\n title: 'Summarize Q3 uptime and incidents',\n model: 'claude-haiku-4-5',\n messages: 17,\n frozenAt: now - 21 * day,\n },\n messages: frozenConversation(\n 'Summarize Q3 uptime and incidents',\n 'Uptime 99.96%. Two incidents: an expired certificate and an upstream outage.'\n ),\n },\n {\n cone: {\n id: 'scoop-tide-check',\n kind: 'scoop',\n name: 'tide-check',\n title: 'Check the tide tables against the harbor feed',\n model: 'claude-haiku-4-5',\n messages: 9,\n frozenAt: now - 1 * day,\n },\n messages: frozenConversation(\n 'Check the tide tables against the harbor feed',\n 'They match, except the 3 October low tide, which the feed lists 4 minutes later.'\n ),\n },\n {\n cone: {\n id: 'run-nightly-digest',\n kind: 'agent',\n name: 'nightly-digest',\n title: 'Write the nightly digest of merged pull requests',\n model: 'claude-sonnet-5-5',\n messages: 6,\n frozenAt: now - 3 * day,\n },\n messages: frozenConversation(\n 'Write the nightly digest of merged pull requests',\n 'Four pull requests merged: two fixes, a docs change and a dependency bump.'\n ),\n },\n];\n\nexport const memories: Memory[] = [\n {\n id: 'mem-1',\n scope: 'global',\n section: 'Preferences',\n title: 'Lead with the result',\n body: 'Keep replies short. Lead with the result, then the evidence.',\n tag: 'feedback',\n updatedAt: now - 5 * day,\n },\n {\n id: 'mem-2',\n scope: 'global',\n section: 'Preferences',\n title: 'Tests before \u201Cfixed\u201D',\n body: 'Run the tests before saying something is fixed, and quote the summary line.',\n tag: 'feedback',\n updatedAt: now - 9 * day,\n },\n {\n id: 'mem-3',\n scope: 'global',\n section: 'About the user',\n title: 'Works in UTC',\n body: 'Schedules, timestamps and cron expressions are in UTC unless stated otherwise.',\n tag: 'user',\n updatedAt: now - 30 * day,\n },\n {\n id: 'mem-4',\n scope: 'global',\n section: 'Projects',\n title: 'harbor',\n body: 'Forecast API, deployed as a worker. Cache bugs show up around midnight UTC. Staging deploys are frozen on Fridays.',\n tag: 'project',\n updatedAt: now - day,\n },\n {\n id: 'mem-5',\n scope: 'global',\n section: 'Projects',\n title: 'release-notes',\n body: 'Drafted every Friday from merged pull requests, grouped as features, fixes and chores.',\n tag: 'project',\n updatedAt: now - 4 * day,\n },\n {\n id: 'mem-6',\n scope: 'cone-harbor',\n section: 'Conventions',\n title: 'Cache keys',\n body: 'Cache keys are `city:UTC-date`. Never key on local time.\\n\\nThe warmer fills the next day\u2019s keys at 23:00 UTC, so a key built from local time misses it and every request goes upstream until midnight. `npm run cache:check` lists the keys that don\u2019t match.',\n tag: 'project',\n updatedAt: now - 2 * day,\n },\n {\n id: 'mem-7',\n scope: 'cone-harbor',\n section: 'Conventions',\n title: 'Retries',\n body: 'Retry upstream calls three times with exponential backoff starting at 250 ms.',\n tag: null,\n updatedAt: now - 2 * day,\n },\n {\n id: 'mem-8',\n scope: 'cone-release',\n section: 'Style',\n title: 'Past tense, no ticket numbers',\n body: 'One sentence per change, in the past tense, without ticket numbers.',\n tag: 'feedback',\n updatedAt: now - 7 * day,\n },\n {\n id: 'mem-9',\n scope: 'role:reviewer',\n section: 'Checks',\n title: 'Read the tests first',\n body: 'Start a review from the tests, then read the change they cover.',\n tag: 'feedback',\n updatedAt: now - 3 * day,\n source: 'entry',\n },\n {\n id: 'mem-10',\n scope: 'role:reviewer',\n section: 'Checks',\n title: 'Checks',\n body: 'Flag any change to cache keys. Ask for a test when a retry count changes.',\n tag: null,\n updatedAt: now - 3 * day,\n source: 'notes',\n },\n];\n\nexport const sprinkles: Sprinkle[] = [\n {\n id: 'welcome',\n name: 'welcome',\n title: 'Welcome',\n icon: 'hand',\n agentId: 'cone-sliccy',\n html: welcome,\n inline: true,\n },\n {\n id: 'suggestions',\n name: 'suggestions',\n title: 'Suggestions',\n icon: 'ice-cream-cone',\n agentId: 'cone-sliccy',\n html: suggestions,\n },\n {\n id: 'status',\n name: 'status',\n title: 'Status',\n icon: 'list-checks',\n agentId: 'cone-kitchen',\n html: status,\n inline: true,\n },\n];\n\nconst coneSprinkle = (\n agentId: string,\n name: string,\n title: string,\n icon: string,\n body: string\n): Sprinkle => ({\n id: `${agentId}/${name}`,\n name,\n title,\n icon,\n agentId,\n html: `<style>body { font-family: var(--s2-font-family); color: var(--s2-content-default); padding: var(--s2-spacing-300) var(--s2-spacing-400); }</style><div class=\"sprinkle-stack\"><h2 class=\"sprinkle-heading\">${title}</h2><p class=\"sprinkle-body\">${body}</p></div>`,\n});\n\nexport const coneSprinkles: Sprinkle[] = [\n coneSprinkle('cone-harbor', 'board', 'Board', 'kanban', 'Forecast endpoints in review: 3.'),\n coneSprinkle('cone-tides', 'board', 'Board', 'kanban', 'Tide table tasks this week: 5.'),\n coneSprinkle('cone-release', 'changelog', 'Changelog', 'scroll-text', 'Draft notes for 2.4.0.'),\n];\n\nconst weekly: TrayBudget = { percent: 32, window: 'weekly', resets: 'resets in 4 days' };\n\nexport const tray: TrayStatus = {\n name: 'sliccstart',\n kind: 'sliccstart',\n connection: 'live',\n role: 'leader',\n followers: [\n { id: 'f-phone', name: 'Phone', device: 'phone', since: now - 3_600_000 },\n { id: 'f-laptop', name: 'Second browser', device: 'browser', since: now - 600_000 },\n ],\n spent: 23.67,\n rate: 0.59,\n budget: weekly,\n joinUrl: 'https://www.example.com/join/7Q4D-K9TX',\n};\n\nexport type BudgetScenario = 'plain' | 'adobe' | 'xai';\n\nexport function trayWith(budget: BudgetScenario): TrayStatus {\n return budget === 'plain' ? tray : { ...tray, budget: { ...weekly, provider: budget } };\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { Change, FileEntry, FileEvents, FilePort, MountInfo } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nfunction parents(path: string): string[] {\n const parts = path.split('/').slice(1, -1);\n return parts.map((_, i) => `/${parts.slice(0, i + 1).join('/')}`);\n}\n\nexport type MountScenario = 'mount' | 'cancel' | 'fail' | 'needs';\n\nexport interface DummyMount {\n scenario: MountScenario;\n point: string;\n files: Record<string, string>;\n}\n\nexport class DummyFiles extends Emitter<FileEvents> implements FilePort {\n mount: DummyMount | null;\n mountFolder?: (path?: string) => Promise<string | null>;\n mounts?: () => readonly string[];\n mountInfo?: () => readonly MountInfo[];\n eject?: (path: string) => Promise<void>;\n needsFolder?: () => readonly string[];\n #mounted = new Set<string>();\n #sources = new Map<string, string>();\n #needs = new Set<string>();\n #contents = new Map<string, string>();\n #directories = new Set<string>();\n #modified = new Map<string, number>();\n #changes = new Map<string, Change>();\n #clock: Clock;\n\n constructor(\n contents: Record<string, string>,\n directories: readonly string[],\n changes: readonly Change[],\n clock: Clock,\n mount: DummyMount | null = null\n ) {\n super();\n this.#clock = clock;\n this.mount = mount;\n if (mount) {\n this.mountFolder = (path) => this.#mountFolder(mount, path);\n this.#ejectable();\n this.needsFolder = () => [...this.#needs];\n if (mount.scenario === 'needs') this.#needs.add(mount.point);\n }\n for (const directory of directories) this.#mkdirs(`${directory}/`);\n for (const [path, text] of Object.entries(contents)) this.#put(path, text, 0);\n for (const change of changes) this.#changes.set(change.path, { ...change });\n for (const change of changes) {\n if (change.status === 'deleted') this.#contents.delete(change.path);\n else if (change.after !== null) this.#put(change.path, change.after, 0);\n }\n }\n\n #mkdirs(path: string): void {\n for (const directory of parents(path)) this.#directories.add(directory);\n }\n\n #put(path: string, text: string, now: number): void {\n this.#mkdirs(path);\n this.#contents.set(path, text);\n this.#modified.set(path, now);\n }\n\n #entries(): FileEntry[] {\n const directories = [...this.#directories].map(\n (path): FileEntry => ({ path, kind: 'directory', size: 0, modified: 0 })\n );\n const files = [...this.#contents].map(\n ([path, text]): FileEntry => ({\n path,\n kind: 'file',\n size: new TextEncoder().encode(text).length,\n modified: this.#modified.get(path) as number,\n })\n );\n return [...directories, ...files].sort((a, b) => a.path.localeCompare(b.path));\n }\n\n async list(): Promise<readonly FileEntry[]> {\n await this.#clock.sleep();\n return this.#entries();\n }\n\n async read(path: string): Promise<string> {\n await this.#clock.sleep();\n const text = this.#contents.get(path);\n if (text === undefined) throw new Error(`ENOENT: ${path}`);\n return text;\n }\n\n #record(path: string, after: string | null, agentId: string | null): void {\n const previous = this.#changes.get(path);\n const before = previous ? previous.before : (this.#contents.get(path) ?? null);\n if (before === after) {\n this.#changes.delete(path);\n return;\n }\n const status = before === null ? 'added' : after === null ? 'deleted' : 'modified';\n this.#changes.set(path, { path, status, before, after, agentId });\n }\n\n #announce(path: string): void {\n this.emit('files', this.#entries());\n this.emit('file', path);\n this.emit('changes', this.changes());\n }\n\n async write(path: string, text: string, agentId: string | null = null): Promise<void> {\n await this.#clock.sleep();\n this.#record(path, text, agentId);\n this.#put(path, text, Date.now());\n this.#announce(path);\n }\n\n async remove(path: string, agentId: string | null = null): Promise<void> {\n await this.#clock.sleep();\n if (!this.#contents.has(path)) throw new Error(`ENOENT: ${path}`);\n this.#record(path, null, agentId);\n this.#contents.delete(path);\n this.#announce(path);\n }\n\n changes(): readonly Change[] {\n return [...this.#changes.values()].sort((a, b) => a.path.localeCompare(b.path));\n }\n\n accept(path: string): void {\n this.#changes.delete(path);\n this.emit('changes', this.changes());\n }\n\n async revert(path: string): Promise<void> {\n const change = this.#changes.get(path);\n if (!change) return;\n await this.#clock.sleep();\n this.#changes.delete(path);\n if (change.before !== null) this.#put(path, change.before, Date.now());\n else if (change.status === 'added') this.#contents.delete(path);\n this.#announce(path);\n }\n\n #ejectable(): void {\n this.mounts = () => [...this.#mounted];\n this.mountInfo = () =>\n [...this.#mounted].map((target) => {\n const source = this.#sources.get(target);\n return source ? { target, source, type: 'hostfs' } : { target, type: 'local' };\n });\n this.eject = (path) => this.#eject(path);\n }\n\n async attach(target: string, source: string, contents: Record<string, string>): Promise<string> {\n await this.#clock.sleep();\n if (!this.eject) this.#ejectable();\n const files = Object.entries(contents).map(([path, text]) => {\n const file = `${target}/${path}`;\n this.#put(file, text, Date.now());\n return file;\n });\n this.#mounted.add(target);\n this.#sources.set(target, source);\n this.#remount(files);\n return target;\n }\n\n async #mountFolder(mount: DummyMount, point?: string): Promise<string | null> {\n await this.#clock.sleep();\n if (mount.scenario === 'cancel') return null;\n if (mount.scenario === 'fail') throw new Error('The folder couldn\u2019t be mounted.');\n if (point !== undefined && !this.#needs.has(point))\n throw new Error(`Nothing is waiting for a folder at ${point}.`);\n const at = point ?? mount.point;\n const files: string[] = [];\n for (const [path, text] of Object.entries(mount.files)) {\n const file = `${at}/${path}`;\n this.#put(file, text, Date.now());\n files.push(file);\n }\n this.#mounted.add(at);\n this.#needs.delete(at);\n this.#remount(files);\n return at;\n }\n\n async #eject(path: string): Promise<void> {\n await this.#clock.sleep();\n if (!this.#mounted.delete(path)) throw new Error(`Nothing is mounted at ${path}.`);\n this.#sources.delete(path);\n const inside = (candidate: string) => candidate === path || candidate.startsWith(`${path}/`);\n const files = [...this.#contents.keys()].filter(inside);\n for (const file of files) {\n this.#contents.delete(file);\n this.#modified.delete(file);\n }\n for (const directory of [...this.#directories].filter(inside))\n this.#directories.delete(directory);\n this.#remount(files);\n }\n\n #remount(files: readonly string[]): void {\n this.emit('mounts', [...this.#mounted]);\n this.emit('files', this.#entries());\n for (const file of files) this.emit('file', file);\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { Memory, MemoryDraft, MemoryEvents, MemoryPort, MemoryScope } from '../model/types.ts';\n\nexport class DummyMemory extends Emitter<MemoryEvents> implements MemoryPort {\n #memories: Memory[];\n #scopes: () => readonly MemoryScope[];\n #next = 1;\n\n constructor(\n memories: readonly Memory[],\n scopes: () => readonly MemoryScope[] = () => [{ id: 'global', label: 'Everyone' }]\n ) {\n super();\n this.#memories = memories.map((memory) => ({ ...memory }));\n this.#scopes = scopes;\n }\n\n scopes(): readonly MemoryScope[] {\n return this.#scopes();\n }\n\n list(): readonly Memory[] {\n return this.#memories.map((memory) => ({ ...memory }));\n }\n\n save(draft: MemoryDraft): Memory {\n const memory: Memory = {\n ...draft,\n id: draft.id ?? `mem-new-${this.#next++}`,\n updatedAt: Date.now(),\n };\n const index = this.#memories.findIndex((candidate) => candidate.id === memory.id);\n if (index < 0) this.#memories.push(memory);\n else this.#memories[index] = memory;\n this.emit('memories', this.list());\n return { ...memory };\n }\n\n remove(id: string): void {\n this.#memories = this.#memories.filter((memory) => memory.id !== id);\n this.emit('memories', this.list());\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n ChangesPort,\n MonitorEvents,\n MonitorPort,\n MonitorSection,\n MonitorSnapshot,\n SliccModel,\n} from '../model/types.ts';\n\nexport function wave(seed: number, length = 24): number[] {\n return Array.from({ length }, (_, i) =>\n Math.round(40 + 25 * Math.sin((i + seed) / 3) + 10 * Math.cos((i * seed) / 5))\n );\n}\n\nexport const agentSections: MonitorSection[] = [\n {\n id: 'tasks',\n label: 'Tasks',\n rows: [\n { id: 't1', name: 'generating', meta: 'sliccy \u00B7 running \u00B7 12s', status: 'active' },\n {\n id: 't2',\n name: 'tool bash',\n meta: 'sliccy \u00B7 running \u00B7 8s',\n status: 'active',\n depth: 1,\n badges: ['bash'],\n },\n {\n id: 't3',\n name: 'scoop quiet-otter',\n meta: 'quiet-otter \u00B7 waiting \u00B7 2m',\n status: 'idle',\n depth: 1,\n badges: ['waits on 2'],\n },\n {\n id: 't4',\n name: 'tool read_file',\n meta: 'quiet-otter \u00B7 completing \u00B7 1s',\n status: 'active',\n depth: 2,\n },\n {\n id: 't5',\n name: 'report for quiet-otter',\n meta: 'quiet-otter \u00B7 pending \u00B7 2m',\n status: 'idle',\n depth: 2,\n badges: ['background'],\n },\n {\n id: 't6',\n name: 'cron tide-check',\n meta: 'session \u00B7 aborting \u00B7 14s',\n status: 'warn',\n badges: ['aborting'],\n },\n ],\n },\n {\n id: 'processes',\n label: 'Processes',\n rows: [\n {\n id: 'p412',\n name: 'bash',\n meta: 'pid 412 \u00B7 slicc \u00B7 3m',\n status: 'idle',\n badges: ['terminal'],\n },\n {\n id: 'p418',\n name: 'node build.mjs --watch',\n meta: 'pid 418 \u00B7 slicc \u00B7 1m',\n status: 'active',\n badges: ['sliccy'],\n },\n {\n id: 'p433',\n name: 'grep -r harbor .',\n meta: 'pid 433 \u00B7 slicc \u00B7 40s',\n status: 'warn',\n badges: ['quiet-otter'],\n },\n ],\n },\n {\n id: 'problems',\n label: 'Recent problems',\n rows: [\n {\n id: 'e1',\n name: 'quiet-otter \u00B7 turn',\n meta: 'The model returned an error: overloaded. Retrying in 8 s.',\n status: 'error',\n },\n ],\n },\n];\n\nexport class DummyMonitor extends Emitter<MonitorEvents> implements MonitorPort {\n #model: Omit<SliccModel, 'monitor'>;\n #tick = 0;\n #extra: MonitorSection[];\n\n constructor(model: Omit<SliccModel, 'monitor'>, extra: MonitorSection[] = []) {\n super();\n this.#model = model;\n this.#extra = extra;\n const update = () => this.resync();\n model.agent.on('agents', update);\n model.terminals.on('terminals', update);\n model.browser.on('tabs', update);\n const changes: ChangesPort = model.changes ?? model.files;\n changes.on('changes', update);\n model.tray.on('status', update);\n }\n\n snapshot(): MonitorSnapshot {\n const { agent, terminals, browser, files, tray } = this.#model;\n const changes: ChangesPort = this.#model.changes ?? files;\n const listed = agent.list();\n const agents = listed\n .filter((candidate) => candidate.kind === 'cone')\n .flatMap((cone) => [cone, ...listed.filter((candidate) => candidate.parentId === cone.id)]);\n const active = agents.filter((candidate) => candidate.status !== 'idle').length;\n const status = tray.status();\n const fill = Math.max(...agents.map((candidate) => candidate.contextFill), 0);\n const rows = (id: string) => this.#extra.find((section) => section.id === id)?.rows;\n const tasks = rows('tasks');\n const running = rows('processes') ?? [];\n const processes = terminals.list().length + running.length + 1;\n const byAgents = running.filter((row) =>\n row.badges?.some((badge) => badge !== 'terminal')\n ).length;\n const tools = (tasks ?? []).filter(\n (row) => row.name.startsWith('tool ') && row.status === 'active'\n ).length;\n return {\n updatedAt: Date.now(),\n vitals: [\n ...(status.budget\n ? [\n {\n id: 'budget',\n label: `Budget (${status.budget.window})`,\n value: `${status.budget.percent}%`,\n unit: status.budget.resets,\n ratio: status.budget.percent / 100,\n ...(status.budget.provider\n ? { provider: status.budget.provider, window: status.budget.window }\n : {}),\n },\n ]\n : []),\n {\n id: 'spend',\n label: 'Spend',\n value: `$${(status.spent ?? 0).toFixed(2)}`,\n delta: `$${(status.rate ?? 0).toFixed(2)}/h`,\n series: wave(this.#tick + 7),\n },\n {\n id: 'agents',\n label: 'Active agents',\n value: String(active),\n unit: `of ${agents.length}`,\n series: wave(this.#tick + 1),\n },\n ...(tasks\n ? [\n {\n id: 'tasks',\n label: 'Running',\n value: String(tools),\n unit: `${tools === 1 ? 'tool' : 'tools'} \u00B7 ${tasks.length} ${tasks.length === 1 ? 'task' : 'tasks'}`,\n },\n ]\n : []),\n {\n id: 'processes',\n label: 'Processes',\n value: String(processes),\n unit: `${byAgents} by agents`,\n series: wave(this.#tick + 3),\n },\n {\n id: 'memory',\n label: 'Process memory',\n value: `${17 + 24 * (processes - 1)} MiB`,\n unit: `${24 * byAgents} MiB by agents`,\n series: wave(this.#tick + 5),\n },\n {\n id: 'context',\n label: 'Fullest context',\n value: `${Math.round(fill * 100)}%`,\n ratio: fill,\n },\n ],\n alerts: [\n ...(this.#extra.length\n ? [\n {\n id: 'runaway-cpu-433',\n title: 'quiet-otter is using a lot of CPU',\n detail: '97% of one core for 3 minutes.',\n severity: 'warn' as const,\n command: 'kill -- -433',\n commandLabel: 'To stop it, run',\n },\n ]\n : []),\n ...agents\n .filter((candidate) => candidate.contextFill >= 0.8)\n .map((candidate) => ({\n id: `fill-${candidate.id}`,\n title: `${candidate.name} is ${Math.round(candidate.contextFill * 100)}% full`,\n detail: 'Compact it soon to keep replies fast.',\n severity: 'warn' as const,\n })),\n ...(status.connection === 'live'\n ? []\n : [\n {\n id: 'tray',\n title: `Tray ${status.connection}`,\n detail: 'Followers can\u2019t see this session.',\n severity: 'error' as const,\n },\n ]),\n ],\n sections: [\n ...this.#extra,\n {\n id: 'terminals',\n label: 'Terminals',\n rows: terminals.list().map((terminal) => ({\n name: terminal.title,\n meta: terminal.cwd,\n status: 'active' as const,\n })),\n },\n {\n id: 'tabs',\n label: 'Browser tabs',\n rows: browser.list().map((tab) => ({\n name: tab.title,\n meta: new URL(tab.url).host || tab.url,\n status: tab.status === 'loading' ? ('active' as const) : ('idle' as const),\n badges: tab.agentId ? ['agent'] : [],\n })),\n },\n {\n id: 'changes',\n label: 'Pending changes',\n rows: (changes.unavailable?.() ? [] : changes.changes()).map((change) => ({\n name: change.path,\n meta: change.status,\n status: 'warn' as const,\n })),\n },\n {\n id: 'followers',\n label: 'Tray followers',\n rows: status.followers.map((follower) => ({\n name: follower.name,\n meta: follower.device,\n status: 'active' as const,\n })),\n },\n ],\n };\n }\n\n resync(): void {\n this.#tick += 1;\n this.emit('snapshot', this.snapshot());\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n AccessKey,\n Leader,\n LinkedDevice,\n LinkedFolder,\n LinkPairing,\n NetworkExit,\n NetworkLinks,\n NetworkPort,\n NetworkStatus,\n TailnetStatus,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport type { DummyFiles } from './files.ts';\n\nexport type NetworkScenario = 'ok' | 'limited' | 'failing';\nexport type TailnetScenario = 'off' | 'needs-login' | 'running' | 'failed';\nexport type LinksScenario =\n | 'none'\n | 'preparing'\n | 'linked'\n | 'reconnecting'\n | 'exit'\n | 'prompt'\n | 'denied'\n | 'remote'\n | 'followers'\n | 'pairing'\n | 'pairing-notray'\n | 'forgotten'\n | 'outdated';\n\nexport type LeadersScenario = 'connected' | 'failed' | 'unlinked' | 'disconnected' | 'two';\n\nconst minute = 60_000;\n\nconst cove: Leader = {\n id: 'https://hub.cove-studio.example',\n name: 'SLICC on cove-studio',\n hub: 'hub.cove-studio.example',\n state: 'connected',\n};\n\nconst marsh: Leader = {\n id: 'https://tray.marsh-desk.example',\n name: 'SLICC on marsh-desk',\n hub: 'tray.marsh-desk.example',\n state: 'failed',\n error: 'The hub didn\u2019t answer. Check the connection and try again.',\n};\n\nexport function leadersFixtures(scenario: LeadersScenario): Leader[] {\n if (scenario === 'failed') return [marsh];\n if (scenario === 'unlinked') return [{ ...cove, state: 'unlinked' }];\n if (scenario === 'disconnected') return [{ ...cove, state: 'disconnected' }];\n if (scenario === 'two') return [cove, marsh];\n return [cove];\n}\n\nexport function networkFixtures(scenario: NetworkScenario, now = Date.now()): NetworkStatus {\n const extensionUrl = 'https://extensions.example/slicc';\n if (scenario === 'ok') {\n return {\n route: 'link',\n health: 'ok',\n detail: 'Linked 2 min ago.',\n failures: [],\n extensionUrl,\n browser: { via: 'link' },\n links: { ...linksFixtures('none').links, devices: [linkedDevices[0]] },\n exit: { kind: 'link', id: 'link-quay' },\n };\n }\n if (scenario === 'limited') {\n return {\n route: 'page',\n health: 'limited',\n detail: 'The page fetch, limited by CORS.',\n failures: [\n {\n url: 'https://api.tidewatch.example/v2/forecast?port=harbor',\n error: 'Blocked by CORS',\n at: now - 2 * minute,\n },\n {\n url: 'https://feeds.lighthouse.example/notices.xml',\n error: 'Blocked by CORS',\n at: now - 14 * minute,\n },\n ],\n extensionUrl,\n browser: { via: null },\n };\n }\n return {\n route: null,\n health: 'failing',\n detail: 'No route answered. The last request timed out.',\n failures: [\n {\n url: 'https://registry.harbor.example/agent',\n error: 'Timed out after 30 s',\n at: now - 40_000,\n },\n {\n url: 'https://docs.tidewatch.example/',\n error: 'Network unreachable',\n at: now - 3 * minute,\n },\n {\n url: 'https://api.tidewatch.example/v2/tides',\n error: 'Network unreachable',\n at: now - 75 * minute,\n },\n ],\n extensionUrl,\n browser: { via: null },\n };\n}\n\nconst exitNodes = [\n { id: 'nKeel1CNTRL', name: 'keel-router', online: true },\n { id: 'nMast2CNTRL', name: 'mast-pi', online: true },\n { id: 'nBuoy3CNTRL', name: 'buoy-laptop', online: false },\n];\n\nexport function tailnetFixtures(scenario: TailnetScenario): TailnetStatus {\n const base = { exitNode: null, exitNodes: [], autoExitNode: false, shieldsUp: true };\n if (scenario === 'needs-login') {\n return { ...base, state: 'needs-login', loginUrl: 'https://login.tailnet.example/a/7f3c2e' };\n }\n if (scenario === 'running') {\n return {\n ...base,\n state: 'running',\n node: { name: 'slicc-harbor', addresses: ['fd7a:115c:a1e0::7', '100.64.12.7'] },\n exitNodes,\n peers: 4,\n };\n }\n if (scenario === 'failed') {\n return {\n ...base,\n state: 'failed',\n detail: 'The coordination server didn\u2019t answer. Check the connection and try again.',\n };\n }\n return { ...base, state: 'off' };\n}\n\nconst linkedDevices: readonly LinkedDevice[] = [\n {\n id: 'link-quay',\n name: 'slicc on quay-studio',\n host: 'quay-studio.slicc.internal',\n address: '198.18.57.11',\n mode: 'local',\n offers: ['net', 'http', 'ssh'],\n policy: 'every public address, this machine, and the local network',\n exit: true,\n state: 'connected',\n browsers: [{ runtime: 'quay-studio/chrome', name: 'Chrome' }],\n control: { allowed: true, fixed: true },\n folders: [{ name: 'sketches', source: 'quay-studio/sketches', readonly: false }],\n },\n {\n id: 'link-pier',\n name: 'slicc on pier-nuc',\n host: 'pier-nuc.slicc.internal',\n address: '198.18.57.12',\n mode: 'remote',\n offers: ['net', 'ssh'],\n policy: 'every public address and the local network',\n exit: true,\n state: 'connected',\n browsers: [{ runtime: 'pier-nuc/chrome', name: 'Chrome' }],\n control: { allowed: false },\n folders: [\n { name: 'proj', source: 'pier-nuc/proj', readonly: false },\n { name: 'archive', source: 'pier-nuc/archive', readonly: true },\n ],\n },\n {\n id: 'link-dock',\n name: 'slicc on dock-builder',\n host: 'dock-builder.slicc.internal',\n address: '198.18.57.13',\n mode: 'remote',\n offers: ['http'],\n policy: 'this machine',\n exit: false,\n state: 'connected',\n control: { allowed: false },\n },\n];\n\nexport function folderFiles(folder: LinkedFolder): Record<string, string> {\n return {\n 'README.md': `# ${folder.name}\\n\\nShared from ${folder.source}.\\n`,\n 'notes.txt': 'Tide tables, rope lengths, and a list of knots to learn.\\n',\n };\n}\n\nexport function joinUrl(rotation = 0): string {\n return `https://join.slicc.example/l/${rotation ? `r${rotation}-` : ''}7Hq2kd9FXw3m`;\n}\n\nexport function followUrl(rotation = 0): string {\n return `https://seven.slicc.example/#follow=${joinUrl(rotation)}`;\n}\n\nconst followers: readonly LinkedDevice[] = [\n {\n id: 'link-quay',\n name: 'slicc on quay-studio',\n host: 'quay-studio.slicc.internal',\n address: '198.18.57.11',\n mode: 'local',\n offers: ['net', 'http', 'ssh'],\n exit: true,\n state: 'connected',\n kind: 'cli',\n access: { control: true, fixed: true },\n },\n {\n id: 'link-pier',\n name: 'slicc on pier-nuc',\n host: 'pier-nuc.slicc.internal',\n address: '198.18.57.12',\n mode: 'remote',\n offers: ['net', 'ssh'],\n exit: true,\n state: 'connected',\n kind: 'cli',\n access: { control: true },\n controlling: 'prompt',\n },\n {\n id: 'link-bay',\n name: 'SLICC on bay-laptop',\n host: '',\n address: '',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'connected',\n kind: 'seven',\n access: { view: true, control: true, terminal: true },\n controlling: 'watch',\n terminals: 1,\n },\n {\n id: 'link-reef',\n name: 'SLICC on reef-phone',\n host: '',\n address: '',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'connected',\n kind: 'seven',\n access: { view: true, control: false, terminal: false },\n controlling: 'watch',\n },\n {\n id: 'link-tide',\n name: 'SLICC on tide-tablet',\n host: '',\n address: '',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'connected',\n kind: 'seven',\n asking: true,\n access: { view: false, control: false, terminal: false },\n },\n];\n\nexport const pairingCode = 'ab12\u2026ef';\n\nexport const pairingRefused = 'That isn\u2019t a pairing link from slicc pair.';\n\nexport const pairingStopped = 'slicc on this computer stopped answering. Run slicc pair again.';\n\nexport const pairedDevice: LinkedDevice = {\n id: 'link-quay',\n name: 'slicc on quay-studio',\n host: 'quay-studio.slicc.internal',\n address: '198.18.57.11',\n mode: 'local',\n kind: 'cli',\n offers: ['net', 'http', 'ssh'],\n exit: true,\n state: 'connected',\n folders: [{ name: 'sketches', source: 'quay-studio/sketches', readonly: false }],\n};\n\nexport const forgottenDevice: LinkedDevice = {\n ...pairedDevice,\n state: 'offline',\n note: 'SLICC on quay-studio no longer knows this seven. Pair it again.',\n};\n\nexport const outdatedDevice: LinkedDevice = {\n ...pairedDevice,\n note: 'Update slicc to 1.47.0 or later to share this computer\u2019s browsers.',\n};\n\nconst others = linkedDevices.filter((device) => device.id !== pairedDevice.id);\n\nexport function grant(device: LinkedDevice, key: AccessKey, allowed: boolean): LinkedDevice {\n const access = { ...device.access, [key]: allowed };\n if (key === 'view' && !allowed && 'control' in access) access.control = false;\n const next: LinkedDevice = { ...device, access, asking: device.asking && !access.view };\n if (!access.view && !access.control) next.controlling = undefined;\n else if (!access.control && next.controlling === 'prompt') next.controlling = 'watch';\n if (!access.terminal) next.terminals = undefined;\n return next;\n}\n\nexport function linksFixtures(\n scenario: LinksScenario,\n rotation = 0\n): { links: NetworkLinks; exit: NetworkExit } {\n const url = joinUrl(rotation);\n const base = {\n joinUrl: url,\n joinCommand: `npx sliccy@next ${url} follow`,\n followUrl: followUrl(rotation),\n permission: null,\n };\n if (scenario === 'preparing') {\n return {\n links: { ...base, joinUrl: null, joinCommand: null, followUrl: null, devices: [] },\n exit: null,\n };\n }\n if (scenario === 'pairing')\n return { links: { ...base, devices: others, pairing: { state: 'idle' } }, exit: null };\n if (scenario === 'pairing-notray')\n return { links: { devices: others, permission: null, pairing: { state: 'idle' } }, exit: null };\n if (scenario === 'forgotten' || scenario === 'outdated') {\n const device = scenario === 'forgotten' ? forgottenDevice : outdatedDevice;\n return {\n links: { ...base, devices: [device, ...others], pairing: { state: 'idle' } },\n exit: null,\n };\n }\n if (scenario === 'followers') return { links: { ...base, devices: followers }, exit: null };\n if (scenario === 'none') return { links: { ...base, devices: [] }, exit: null };\n if (scenario === 'prompt') {\n return { links: { ...base, devices: [], permission: 'prompt' }, exit: null };\n }\n if (scenario === 'denied') {\n return { links: { ...base, devices: [], permission: 'denied' }, exit: null };\n }\n if (scenario === 'reconnecting') {\n const devices = linkedDevices.map((device) =>\n device.id === 'link-pier' ? { ...device, state: 'reconnecting' as const } : device\n );\n return { links: { ...base, devices }, exit: { kind: 'link', id: 'link-pier' } };\n }\n if (scenario === 'remote') {\n const devices: LinkedDevice[] = linkedDevices.map((device) => {\n if (device.id === 'link-quay') return { ...device, controlling: 'watch' };\n if (device.id === 'link-pier')\n return { ...device, control: { allowed: true }, controlling: 'prompt' };\n return device;\n });\n devices.push({\n id: 'link-reef',\n name: 'slicc on reef-laptop',\n host: 'reef-laptop.slicc.internal',\n address: '198.18.57.14',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'offline',\n control: { allowed: false },\n });\n return { links: { ...base, devices }, exit: null };\n }\n return {\n links: { ...base, devices: linkedDevices },\n exit: scenario === 'exit' ? { kind: 'link', id: 'link-quay' } : null,\n };\n}\n\nexport class DummyNetwork extends Emitter<{ network: NetworkStatus }> implements NetworkPort {\n scenario: NetworkScenario;\n #base: NetworkStatus;\n #status: NetworkStatus;\n #clock: Clock;\n #tailnet: TailnetStatus | undefined;\n #links: NetworkLinks | undefined;\n #exit: NetworkExit = null;\n #rotation = 0;\n setExit?: (exit: NetworkExit) => Promise<void>;\n unlink?: (id: string) => Promise<void>;\n setRemoteControl?: (id: string, allowed: boolean) => Promise<void>;\n setAccess?: (id: string, key: AccessKey, allowed: boolean) => Promise<void>;\n rotateJoinUrl?: () => Promise<void>;\n retryLinks?: () => Promise<void>;\n mountFolder?: (source: string) => Promise<string>;\n ejectFolder?: (source: string) => Promise<void>;\n retryLeader?: (id: string) => Promise<void>;\n disconnectLeader?: (id: string) => Promise<void>;\n reconnectLeader?: (id: string) => Promise<void>;\n forgetLeader?: (id: string) => Promise<void>;\n pairComputer?: (url: string) => Promise<void>;\n confirmPairing?: () => Promise<void>;\n cancelPairing?: () => Promise<void>;\n #pairUrl = '';\n #leaders: Leader[] | undefined;\n #files: DummyFiles | undefined;\n\n constructor(\n scenario: NetworkScenario,\n clock: Clock,\n tailnet?: TailnetScenario,\n links?: LinksScenario,\n files?: DummyFiles,\n leaders?: LeadersScenario\n ) {\n super();\n this.scenario = scenario;\n this.#clock = clock;\n this.#tailnet = tailnet ? tailnetFixtures(tailnet) : undefined;\n if (links) {\n ({ links: this.#links, exit: this.#exit } = linksFixtures(links));\n this.setExit = (exit) => this.#setExit(exit);\n this.unlink = (id) => this.#unlink(id);\n this.setRemoteControl = (id, allowed) => this.#control(id, allowed);\n this.setAccess = (id, key, allowed) => this.#access(id, key, allowed);\n this.rotateJoinUrl = () => this.#rotate();\n this.retryLinks = () => this.#retry();\n this.mountFolder = (source) => this.#mountFolder(source);\n this.ejectFolder = (source) => this.#ejectFolder(source);\n this.pairComputer = (url) => this.#pair(url);\n this.confirmPairing = () => this.#confirmPairing();\n this.cancelPairing = () => this.#cancelPairing();\n this.#files = files;\n files?.on('mounts', (targets) => this.#mounted(targets));\n }\n if (leaders) {\n this.#leaders = leadersFixtures(leaders);\n this.retryLeader = (id) => this.#retryLeader(id);\n this.reconnectLeader = (id) => this.#retryLeader(id);\n this.disconnectLeader = (id) => this.#disconnectLeader(id);\n this.forgetLeader = (id) => this.#dropLeader(id);\n }\n this.#base = networkFixtures(scenario);\n this.#status = this.#with(this.#base);\n }\n\n #withLeaders(status: NetworkStatus): NetworkStatus {\n const leaders = this.#leaders;\n if (!leaders) return status;\n this.#leaders = leaders.filter((leader) => leader.state !== 'unlinked');\n return { ...status, leaders };\n }\n\n #leader(id: string, change: Partial<Leader>): void {\n this.#leaders = (this.#leaders as Leader[]).map((leader) => {\n if (leader.id !== id) return leader;\n const { error: _, ...rest } = leader;\n return { ...rest, ...change };\n });\n this.#emit();\n }\n\n async #retryLeader(id: string): Promise<void> {\n this.#leader(id, { state: 'connecting' });\n await this.#clock.sleep(8);\n this.#leader(id, { state: 'connected' });\n }\n\n async #disconnectLeader(id: string): Promise<void> {\n await this.#clock.sleep(4);\n this.#leader(id, { state: 'disconnected' });\n }\n\n async #dropLeader(id: string): Promise<void> {\n await this.#clock.sleep(4);\n this.#leaders = (this.#leaders as Leader[]).filter((leader) => leader.id !== id);\n this.#emit();\n }\n\n #with(status: NetworkStatus): NetworkStatus {\n return this.#withLeaders(this.#withLinks(status));\n }\n\n #withLinks(status: NetworkStatus): NetworkStatus {\n const links = this.#links;\n if (!links) return this.#withTailnet(status);\n const exit = this.#exit;\n const direct = status.route === 'link' && exit?.kind !== 'link';\n const base: NetworkStatus = direct\n ? { ...status, route: 'page', detail: null, browser: { via: null } }\n : status;\n const linked = { ...base, links, exit };\n const device =\n exit?.kind === 'link' ? links.devices.find((item) => item.id === exit.id) : undefined;\n const browsing = links.devices.some(\n (item) => item.state === 'connected' && item.browsers?.length\n );\n const routed = this.#withTailnet(\n browsing && linked.browser?.via === null ? { ...linked, browser: { via: 'link' } } : linked\n );\n if (!device) return routed;\n return { ...routed, health: device.state === 'connected' ? 'ok' : 'failing', detail: null };\n }\n\n #withTailnet(status: NetworkStatus): NetworkStatus {\n const tailnet = this.#tailnet;\n if (!tailnet) return status;\n const exit = tailnet.state === 'running' ? tailnet.exitNode : null;\n if (!exit) return { ...status, tailnet };\n return {\n ...status,\n route: 'tailnet',\n health: 'ok',\n detail: `${exit} carries everything except this computer\u2019s own services.`,\n tailnet,\n exit: this.#links ? status.exit : null,\n };\n }\n\n #set(tailnet: TailnetStatus): void {\n this.#tailnet = tailnet;\n this.#emit();\n }\n\n #emit(): void {\n this.#status = this.#with(this.#base);\n this.emit('network', this.#status);\n }\n\n setLinks(scenario: LinksScenario): void {\n ({ links: this.#links, exit: this.#exit } = linksFixtures(scenario, this.#rotation));\n this.#emit();\n }\n\n async #setExit(exit: NetworkExit): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n if (exit?.kind === 'link') {\n const device = links.devices.find((item) => item.id === exit.id);\n if (!device?.exit || device.state !== 'connected') {\n throw new Error('That device can\u2019t carry internet traffic right now.');\n }\n }\n if (this.#tailnet) {\n const node = exit?.kind === 'tailnet' ? exit.node : null;\n await this.setExitNode(node);\n }\n this.#exit = exit;\n this.#emit();\n }\n\n async #control(id: string, allowed: boolean): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n const devices = links.devices.map((device) => {\n if (device.id !== id) return device;\n const next = { ...device, control: { ...device.control, allowed } };\n return allowed ? next : { ...next, controlling: undefined };\n });\n this.#links = { ...links, devices };\n this.#emit();\n }\n\n async #access(id: string, key: AccessKey, allowed: boolean): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n const devices = links.devices.map((device) =>\n device.id === id ? grant(device, key, allowed) : device\n );\n this.#links = { ...links, devices };\n this.#emit();\n }\n\n async #unlink(id: string): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n this.#links = { ...links, devices: links.devices.filter((device) => device.id !== id) };\n if (this.#exit?.kind === 'link' && this.#exit.id === id) this.#exit = null;\n this.#emit();\n }\n\n #folder(source: string): LinkedFolder {\n const folder = this.#links?.devices\n .flatMap((device) => device.folders ?? [])\n .find((item) => item.source === source);\n if (!folder) throw new Error(`No linked device shares ${source}.`);\n return folder;\n }\n\n #mark(mounted: (folder: LinkedFolder) => string | undefined): void {\n const links = this.#links as NetworkLinks;\n const devices = links.devices.map((device) =>\n device.folders\n ? {\n ...device,\n folders: device.folders.map((folder) => {\n const { mounted: _, ...rest } = folder;\n const at = mounted(folder);\n return at ? { ...rest, mounted: at } : rest;\n }),\n }\n : device\n );\n this.#links = { ...links, devices };\n this.#emit();\n }\n\n #mounted(targets: readonly string[]): void {\n this.#mark((folder) => targets.find((target) => target === `/mnt/${folder.source}`));\n }\n\n async #mountFolder(source: string): Promise<string> {\n const folder = this.#folder(source);\n if (folder.mounted) return folder.mounted;\n const target = `/mnt/${source}`;\n if (this.#files) await this.#files.attach(target, source, folderFiles(folder));\n else await this.#clock.sleep();\n this.#mark((item) => (item.source === source ? target : item.mounted));\n return target;\n }\n\n async #ejectFolder(source: string): Promise<void> {\n const folder = this.#folder(source);\n if (!folder.mounted) throw new Error(`${source} isn\u2019t mounted.`);\n if (this.#files?.eject) await this.#files.eject(folder.mounted);\n else await this.#clock.sleep();\n this.#mark((item) => (item.source === source ? undefined : item.mounted));\n }\n\n async #rotate(): Promise<void> {\n await this.#clock.sleep(4);\n this.#rotation += 1;\n const url = joinUrl(this.#rotation);\n this.#links = {\n ...(this.#links as NetworkLinks),\n joinUrl: url,\n joinCommand: `npx sliccy@next ${url} follow`,\n followUrl: followUrl(this.#rotation),\n };\n this.#emit();\n }\n\n #pairing(pairing: LinkPairing, devices?: readonly LinkedDevice[]): void {\n const links = this.#links as NetworkLinks;\n this.#links = { ...links, pairing, devices: devices ?? links.devices };\n this.#emit();\n }\n\n async #pair(url: string): Promise<void> {\n await this.#clock.sleep(4);\n if (!/#slicc-pair=./.test(url)) throw new Error(pairingRefused);\n this.#pairUrl = url;\n this.#pairing({ state: 'confirm', code: pairingCode });\n }\n\n async #confirmPairing(): Promise<void> {\n this.#pairing({ state: 'linking', code: pairingCode });\n await this.#clock.sleep(8);\n if (this.#links?.pairing?.state !== 'linking') return;\n if (this.#pairUrl.includes('fail')) {\n this.#pairing({ state: 'failed', code: pairingCode, error: pairingStopped });\n return;\n }\n const devices = (this.#links as NetworkLinks).devices.filter(\n (device) => device.id !== pairedDevice.id\n );\n this.#pairing({ state: 'linked', code: pairingCode, name: 'SLICC on quay-studio' }, [\n pairedDevice,\n ...devices,\n ]);\n }\n\n async #cancelPairing(): Promise<void> {\n await this.#clock.sleep(2);\n this.#pairUrl = '';\n this.#pairing({ state: 'idle' });\n }\n\n async #retry(): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n const devices = links.devices.length ? links.devices : linkedDevices.slice(0, 1);\n this.#links = { ...links, permission: null, devices };\n this.#emit();\n }\n\n status(): NetworkStatus {\n return this.#status;\n }\n\n setScenario(scenario: NetworkScenario): void {\n this.scenario = scenario;\n this.#base = networkFixtures(scenario);\n this.#status = this.#with(this.#base);\n this.emit('network', this.#status);\n }\n\n async check(): Promise<void> {\n await this.#clock.sleep(4);\n if (this.#tailnet?.state === 'failed') this.#tailnet = tailnetFixtures('running');\n this.#base = networkFixtures(this.scenario);\n this.#status = this.#with(this.#base);\n this.emit('network', this.#status);\n }\n\n async setTailnet(on: boolean): Promise<void> {\n await this.#clock.sleep(4);\n this.#set(tailnetFixtures(on ? 'needs-login' : 'off'));\n }\n\n async submitAuthKey(key: string): Promise<void> {\n if (!key.startsWith('tskey-')) {\n throw new Error('That isn\u2019t a Tailscale auth key. Auth keys start with tskey-.');\n }\n this.#set({ ...tailnetFixtures('off'), state: 'starting', detail: 'Joining your tailnet\u2026' });\n await this.#clock.sleep(8);\n this.#set(tailnetFixtures('running'));\n }\n\n async setExitNode(id: string | null): Promise<void> {\n await this.#clock.sleep(4);\n const tailnet = this.#tailnet ?? tailnetFixtures('running');\n const nodes = tailnet.exitNodes ?? [];\n if (id === 'auto') {\n const node = nodes.find((item) => item.online);\n this.#set({ ...tailnet, autoExitNode: true, exitNode: node?.name ?? null });\n return;\n }\n const node = nodes.find((item) => item.id === id);\n if (id && !node?.online) throw new Error('That exit node is offline.');\n this.#set({ ...tailnet, autoExitNode: false, exitNode: node?.name ?? null });\n }\n\n async logoutTailnet(): Promise<void> {\n await this.#clock.sleep(4);\n this.#set(tailnetFixtures('needs-login'));\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { Notice, NoticesPort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type NoticeScenario = 'storage' | 'mixed' | 'fail' | 'readonly' | 'starting';\n\nexport const readOnlyText =\n 'Watch only. The SLICC you follow runs a newer version. Update this one to send prompts.';\n\nexport const startingText = 'Seven is installing its agent.';\n\nexport const noticeFixtures: Record<\n 'storage' | 'welcome' | 'backup' | 'readonly' | 'starting',\n Notice\n> = {\n storage: {\n id: 'storage',\n tone: 'warning',\n title: 'Your files may be cleared',\n body: 'This browser may clear seven\u2019s files and chats when the disk runs low on space. Bookmarking this page makes that less likely.',\n actions: [{ id: 'retry', label: 'Try again' }],\n },\n welcome: {\n id: 'welcome',\n tone: 'info',\n title: 'Everything stays in this browser',\n body: 'Seven keeps your files and chats on this computer. Nothing is uploaded unless you send it.',\n actions: [],\n },\n backup: {\n id: 'backup',\n tone: 'info',\n title: 'A backup of your chats is ready',\n body: 'Seven saved a copy of your files and chats. Download it to keep one outside this browser.',\n actions: [{ id: 'download', label: 'Download' }],\n },\n readonly: {\n id: 'readonly',\n tone: 'warning',\n title: 'Update SLICC to send prompts',\n body: 'The SLICC you follow moved to a newer version. Until you update SLICC on this device, it can only watch.',\n actions: [],\n dismissible: false,\n },\n starting: {\n id: 'starting',\n tone: 'info',\n title: 'Seven is installing its agent',\n body: 'The chat starts once the agent is installed. Messages you send now wait for it.',\n actions: [],\n dismissible: false,\n },\n};\n\nexport class DummyNotices extends Emitter<{ notices: readonly Notice[] }> implements NoticesPort {\n #scenario: NoticeScenario;\n #time: Clock;\n #notices: readonly Notice[];\n\n constructor(scenario: NoticeScenario, time: Clock) {\n super();\n this.#scenario = scenario;\n this.#time = time;\n this.#notices =\n scenario === 'mixed'\n ? [noticeFixtures.storage, noticeFixtures.welcome]\n : scenario === 'readonly' || scenario === 'starting'\n ? [noticeFixtures[scenario]]\n : scenario === 'fail'\n ? [noticeFixtures.storage, noticeFixtures.backup]\n : [noticeFixtures.storage];\n }\n\n list(): readonly Notice[] {\n return this.#notices;\n }\n\n async act(id: string, action: string): Promise<void> {\n await this.#time.sleep(10);\n if (this.#scenario === 'fail') {\n throw new Error(\n id === 'backup'\n ? 'The browser blocked the download. Allow downloads for this page, then try again.'\n : 'The browser declined again. Bookmark this page, then try again.'\n );\n }\n if (id === 'storage' && action === 'retry') this.#remove(id);\n }\n\n dismiss(id: string): void {\n this.#remove(id);\n }\n\n readOnly(on: boolean): void {\n this.#toggle('readonly', on);\n }\n\n starting(on: boolean): void {\n this.#toggle('starting', on);\n }\n\n #toggle(id: 'readonly' | 'starting', on: boolean): void {\n const shown = this.#notices.some((notice) => notice.id === id);\n if (on === shown) return;\n if (on) {\n this.#notices = [noticeFixtures[id], ...this.#notices];\n this.emit('notices', this.#notices);\n } else {\n this.#remove(id);\n }\n }\n\n #remove(id: string): void {\n this.#notices = this.#notices.filter((notice) => notice.id !== id);\n this.emit('notices', this.#notices);\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n FilePort,\n Sprinkle,\n SprinkleCgiChunk,\n SprinkleCgiReply,\n SprinkleEvents,\n SprinkleMethod,\n SprinklePort,\n} from '../model/types.ts';\nimport type { DummyAgent } from './agent.ts';\n\nexport function homePath(path: unknown): string {\n const text = String(path);\n const mapped = text.startsWith('/shared/') ? `/home/${text.slice('/shared/'.length)}` : text;\n const parts = mapped.split('/');\n if (!mapped.startsWith('/home/') || parts.some((part) => part === '.' || part === '..'))\n throw new Error(`EACCES: ${text} is outside /home`);\n return mapped;\n}\n\nconst base64 = (bytes: Uint8Array) => btoa(String.fromCharCode(...bytes));\n\nconst unbase64 = (text: string) =>\n new TextDecoder().decode(Uint8Array.from(atob(text), (char) => char.charCodeAt(0)));\n\nexport function cannedCgi(request: unknown): string {\n const given = (request ?? {}) as Record<string, unknown>;\n const headers = Array.isArray(given.headers) ? (given.headers as [string, string][]) : [];\n const type = headers.find(([name]) => String(name).toLowerCase() === 'content-type');\n return `${JSON.stringify({\n ok: true,\n method: given.method ?? 'GET',\n path: given.path ?? '',\n query: given.query ?? '',\n type: type?.[1] ?? null,\n body: typeof given.body === 'string' ? unbase64(given.body) : null,\n })}\\n`;\n}\n\nexport class DummySprinkles extends Emitter<SprinkleEvents> implements SprinklePort {\n #sprinkles: Sprinkle[];\n #agent: DummyAgent;\n #files: FilePort;\n #state = new Map<string, unknown>();\n #streams = new Map<string, Uint8Array>();\n #next = 0;\n\n constructor(sprinkles: readonly Sprinkle[], agent: DummyAgent, files: FilePort) {\n super();\n this.#sprinkles = sprinkles.map((sprinkle) => ({ ...sprinkle }));\n this.#agent = agent;\n this.#files = files;\n }\n\n list(): readonly Sprinkle[] {\n return this.#sprinkles.map((sprinkle) => ({ ...sprinkle }));\n }\n\n send(id: string, payload: unknown): void {\n const sprinkle = this.#sprinkles.find((candidate) => candidate.id === id);\n if (!sprinkle) return;\n const data = (payload ?? {}) as { action?: string; data?: unknown };\n this.#agent.lick(\n sprinkle.agentId,\n 'sprinkle',\n sprinkle.title,\n data.action || 'event',\n JSON.stringify(data.data ?? null, null, 2)\n );\n }\n\n async call(id: string, method: SprinkleMethod, args: readonly unknown[]): Promise<unknown> {\n if (method === 'getState') return structuredClone(this.#state.get(id) ?? null);\n if (method === 'setState') {\n this.#state.set(id, structuredClone(args[0] ?? null));\n return undefined;\n }\n if (method === 'cgi') return this.#cgi(args[0]);\n if (method === 'cgiRead') return this.#read(String(args[0]));\n if (method === 'cgiClose') {\n this.#streams.delete(String(args[0]));\n return null;\n }\n const path = homePath(args[0]);\n if (method === 'exists') return (await this.#files.list()).some((entry) => entry.path === path);\n return this.#files.read(path);\n }\n\n #cgi(request: unknown): SprinkleCgiReply {\n const bytes = new TextEncoder().encode(cannedCgi(request));\n const half = Math.ceil(bytes.length / 2);\n const stream = `dummy-cgi-${++this.#next}`;\n this.#streams.set(stream, bytes.subarray(half));\n return {\n status: 200,\n statusText: 'OK',\n headers: [\n ['Content-Type', 'application/json'],\n ['X-Slicc-Cgi', 'dummy'],\n ],\n body: base64(bytes.subarray(0, half)),\n done: false,\n stream,\n };\n }\n\n #read(stream: string): SprinkleCgiChunk {\n const rest = this.#streams.get(stream);\n if (rest === undefined) throw new Error(`there is no cgi-bin stream ${stream}`);\n this.#streams.delete(stream);\n return { body: base64(rest), done: true };\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { TabsPort, TabsState } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type TabsScenario =\n | 'owner'\n | 'follower'\n | 'connecting'\n | 'stalled'\n | 'newer'\n | 'older'\n | 'alone';\n\nexport function tabsFixtures(scenario: TabsScenario): TabsState {\n if (scenario === 'stalled') return { role: 'follower', stalled: true, skew: null };\n if (scenario === 'newer' || scenario === 'older')\n return { role: 'follower', stalled: false, skew: scenario };\n return { role: scenario, stalled: false, skew: null };\n}\n\nexport class DummyTabs extends Emitter<{ tabs: TabsState }> implements TabsPort {\n #state: TabsState;\n #time: Clock;\n reloads = 0;\n\n constructor(scenario: TabsScenario, time: Clock) {\n super();\n this.#state = tabsFixtures(scenario);\n this.#time = time;\n }\n\n state(): TabsState {\n return { ...this.#state };\n }\n\n setScenario(scenario: TabsScenario): void {\n this.#state = tabsFixtures(scenario);\n this.emit('tabs', this.state());\n }\n\n reload(): void {\n this.reloads++;\n this.setScenario('connecting');\n void this.#time.sleep(20).then(() => this.setScenario('follower'));\n }\n}\n", "import type { TerminalBackend, TerminalSession, TerminalSignal, TerminalSink } from '../backend.ts';\nimport type { FilePort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst home = '/home/user';\n\nexport function resolve(cwd: string, target: string): string {\n const path = target === '~' || target.startsWith('~/') ? home + target.slice(1) : target;\n const parts = (path.startsWith('/') ? path : `${cwd}/${path}`).split('/');\n const out: string[] = [];\n for (const part of parts) {\n if (part === '..') out.pop();\n else if (part && part !== '.') out.push(part);\n }\n return `/${out.join('/')}`;\n}\n\nfunction shorten(cwd: string): string {\n return cwd === home || cwd.startsWith(`${home}/`) ? `~${cwd.slice(home.length)}` : cwd;\n}\n\ntype Command = (args: string[]) => Promise<void> | void;\n\nexport class FakeShell implements TerminalSession {\n #sink: TerminalSink;\n #files: FilePort;\n #clock: Clock;\n #line = '';\n #escape = false;\n #busy = false;\n #interrupted = false;\n #history: string[] = [];\n #commands: Record<string, Command>;\n #onCwd: ((cwd: string) => void) | undefined;\n cwd: string;\n closed = false;\n\n constructor(\n sink: TerminalSink,\n files: FilePort,\n cwd: string,\n clock: Clock,\n onCwd?: (cwd: string) => void\n ) {\n this.#sink = sink;\n this.#files = files;\n this.#clock = clock;\n this.cwd = cwd;\n this.#onCwd = onCwd;\n this.#commands = {\n help: () => this.#print('Commands: cat cd clear date echo exit git help ls npm pwd whoami'),\n pwd: () => this.#print(this.cwd),\n whoami: () => this.#print('user'),\n date: () => this.#print(new Date().toUTCString()),\n echo: (args) => this.#print(args.join(' ')),\n clear: () => this.#out('\\x1b[2J\\x1b[H'),\n exit: () => this.#exit(),\n cd: (args) => this.#cd(args[0] ?? '~'),\n ls: (args) => this.#ls(args.filter((arg) => !arg.startsWith('-'))[0] ?? '.'),\n cat: (args) => this.#cat(args),\n git: (args) => this.#git(args[0]),\n npm: (args) => this.#npm(args[0]),\n };\n this.#prompt();\n }\n\n #out(text: string): void {\n this.#sink.output(encoder.encode(text));\n }\n\n #print(text: string): void {\n this.#out(`${text.replace(/\\n/g, '\\r\\n')}\\r\\n`);\n }\n\n #prompt(): void {\n this.#out(`\\x1b[1;32muser@slicc\\x1b[0m:\\x1b[1;34m${shorten(this.cwd)}\\x1b[0m$ `);\n }\n\n #exit(): void {\n this.closed = true;\n this.#sink.exit(0);\n }\n\n async #entries(): Promise<Map<string, 'file' | 'directory'>> {\n return new Map((await this.#files.list()).map((entry) => [entry.path, entry.kind]));\n }\n\n async #cd(target: string): Promise<void> {\n const path = resolve(this.cwd, target);\n if (path === '/' || (await this.#entries()).get(path) === 'directory') {\n this.cwd = path;\n this.#onCwd?.(path);\n } else this.#print(`bash: cd: ${target}: No such file or directory`);\n }\n\n async #ls(target: string): Promise<void> {\n const path = resolve(this.cwd, target);\n const entries = await this.#entries();\n const prefix = path === '/' ? '/' : `${path}/`;\n const names = [...entries]\n .filter(\n ([candidate]) =>\n candidate.startsWith(prefix) && !candidate.slice(prefix.length).includes('/')\n )\n .map(([candidate, kind]) => {\n const name = candidate.slice(prefix.length);\n return kind === 'directory' ? `\\x1b[1;34m${name}\\x1b[0m` : name;\n });\n if (path !== '/' && !entries.has(path))\n this.#print(`ls: cannot access '${target}': No such file or directory`);\n else if (names.length > 0) this.#print(names.join(' '));\n }\n\n async #cat(args: string[]): Promise<void> {\n for (const arg of args) {\n const text = await this.#files.read(resolve(this.cwd, arg)).catch(() => null);\n if (text === null) this.#print(`cat: ${arg}: No such file or directory`);\n else this.#out(text.replace(/\\n/g, '\\r\\n'));\n }\n }\n\n #git(sub: string | undefined): void {\n if (sub !== 'status') {\n this.#print('usage: git status');\n return;\n }\n const changes = this.#files.changes();\n this.#print('On branch main');\n if (changes.length === 0) {\n this.#print('nothing to commit, working tree clean');\n return;\n }\n this.#print('Changes not staged for commit:');\n const colors = { added: 32, modified: 33, deleted: 31 };\n for (const change of changes) {\n this.#print(`\\t\\x1b[${colors[change.status]}m${change.status}: ${change.path}\\x1b[0m`);\n }\n }\n\n async #npm(sub: string | undefined): Promise<void> {\n if (sub !== 'test') {\n this.#print('usage: npm test');\n return;\n }\n const lines = [\n '> harbor@0.0.0 test',\n '> node --test test/',\n '',\n '\\x1b[32m\u2714\\x1b[0m converts both ways \\x1b[90m(0.6ms)\\x1b[0m',\n '\\x1b[32m\u2714\\x1b[0m expires entries from the previous day \\x1b[90m(0.4ms)\\x1b[0m',\n '\\x1b[32m\u2714\\x1b[0m retries upstream timeouts \\x1b[90m(3.1ms)\\x1b[0m',\n '\u2139 tests 3',\n '\u2139 pass 3',\n '\u2139 fail 0',\n ];\n for (const line of lines) {\n await this.#clock.sleep(2);\n if (this.closed || this.#interrupted) return;\n this.#print(line);\n }\n }\n\n async #run(line: string): Promise<void> {\n const [name, ...args] = line.trim().split(/\\s+/);\n if (!name) return;\n this.#history.push(line);\n const command = this.#commands[name];\n if (command) await command(args);\n else this.#print(`bash: ${name}: command not found`);\n }\n\n #key(char: string): void {\n if (this.#escape) {\n this.#escape = !/[A-Za-z~]/.test(char) || char === '[';\n return;\n }\n if (char === '\\x1b') this.#escape = true;\n else if (char === '\\r') this.#enter();\n else if (char === '\\x7f') this.#backspace();\n else if (char === '\\x03') this.signal('SIGINT');\n else if (char === '\\x0c') {\n this.#out('\\x1b[2J\\x1b[H');\n this.#prompt();\n this.#out(this.#line);\n } else if (char >= ' ') {\n this.#line += char;\n this.#out(char);\n }\n }\n\n #backspace(): void {\n if (!this.#line) return;\n this.#line = [...this.#line].slice(0, -1).join('');\n this.#out('\\b \\b');\n }\n\n #enter(): void {\n const line = this.#line;\n this.#line = '';\n this.#out('\\r\\n');\n this.#busy = true;\n this.#interrupted = false;\n void this.#run(line).then(() => {\n this.#busy = false;\n if (!this.closed) this.#prompt();\n });\n }\n\n history(): readonly string[] {\n return this.#history;\n }\n\n write(data: Uint8Array): void {\n if (this.closed) return;\n const text = decoder.decode(data);\n if (!this.#busy) for (const char of text) this.#key(char);\n else if (text.includes('\\x03')) this.signal('SIGINT');\n }\n\n resize(): void {}\n\n signal(name: TerminalSignal): void {\n if (name === 'SIGHUP') {\n this.#exit();\n return;\n }\n this.#line = '';\n this.#interrupted = this.#busy;\n this.#out('^C\\r\\n');\n if (!this.#busy) this.#prompt();\n }\n\n close(): void {\n this.closed = true;\n }\n}\n\nexport function shellBackend(\n files: FilePort,\n cwd: string,\n clock: Clock,\n onCwd?: (cwd: string) => void\n): TerminalBackend {\n return { open: (sink) => new FakeShell(sink, files, cwd, clock, onCwd) };\n}\n", "import type { TerminalBackend } from '../backend.ts';\nimport { Emitter } from '../model/emitter.ts';\nimport type { FilePort, TerminalEvents, TerminalInfo, TerminalPort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { shellBackend } from './shell.ts';\n\nexport class DummyTerminals extends Emitter<TerminalEvents> implements TerminalPort {\n #terminals: TerminalInfo[];\n #backends = new Map<string, TerminalBackend>();\n #files: FilePort;\n #clock: Clock;\n #next: number;\n\n constructor(terminals: readonly TerminalInfo[], files: FilePort, clock: Clock) {\n super();\n this.#files = files;\n this.#clock = clock;\n this.#terminals = terminals.map((terminal) => ({ ...terminal }));\n this.#next = this.#terminals.length + 1;\n }\n\n list(): readonly TerminalInfo[] {\n return this.#terminals.map((terminal) => ({ ...terminal }));\n }\n\n open({\n cwd = '/workspace/harbor',\n agentId = null,\n }: {\n cwd?: string;\n agentId?: string | null;\n } = {}): TerminalInfo {\n const terminal: TerminalInfo = {\n id: `term-${this.#next}`,\n title: `bash ${this.#next}`,\n cwd,\n agentId,\n };\n this.#next += 1;\n this.#terminals.push(terminal);\n this.emit('terminals', this.list());\n return { ...terminal };\n }\n\n close(id: string): void {\n this.#terminals = this.#terminals.filter((terminal) => terminal.id !== id);\n this.#backends.delete(id);\n this.emit('terminals', this.list());\n }\n\n #move(id: string, cwd: string): void {\n const terminal = this.#terminals.find((candidate) => candidate.id === id);\n if (!terminal || terminal.cwd === cwd) return;\n terminal.cwd = cwd;\n this.emit('terminals', this.list());\n }\n\n backend(id: string): TerminalBackend {\n const terminal = this.#terminals.find((candidate) => candidate.id === id);\n if (!terminal) throw new Error(`No terminal ${id}`);\n let backend = this.#backends.get(id);\n if (!backend) {\n backend = shellBackend(this.#files, terminal.cwd, this.#clock, (cwd) => this.#move(id, cwd));\n this.#backends.set(id, backend);\n }\n return backend;\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { TrayEvents, TrayPort, TrayStatus } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport class DummyTray extends Emitter<TrayEvents> implements TrayPort {\n #status: TrayStatus;\n #followers: TrayStatus['followers'];\n #clock: Clock;\n\n constructor(status: TrayStatus, clock: Clock) {\n super();\n this.#status = structuredClone(status);\n this.#followers = structuredClone(status.followers);\n this.#clock = clock;\n }\n\n status(): TrayStatus {\n return structuredClone(this.#status);\n }\n\n #set(patch: Partial<TrayStatus>): void {\n this.#status = { ...this.#status, ...patch };\n this.emit('status', this.status());\n }\n\n reconnect(): void {\n this.#set({ connection: 'reconnecting' });\n void this.#clock\n .sleep(15)\n .then(() => this.#set({ connection: 'live', followers: structuredClone(this.#followers) }));\n }\n\n disconnect(): void {\n this.#set({ connection: 'offline', followers: [] });\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n PackageAction,\n PackageItem,\n UpdateAction,\n UpdateItem,\n UpdateKind,\n UpdateNpm,\n UpdateRelease,\n UpdatesEvents,\n UpdatesPort,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type UpdateScenario = 'current' | 'boot' | 'starting' | 'available' | 'restart' | 'failure';\nexport type PackageScenario =\n | 'mixed'\n | 'empty'\n | 'fail'\n | 'user'\n | 'elsewhere'\n | 'npm'\n | 'checking'\n | 'offline';\nexport type BetaScenario = 'offered' | 'installed' | 'blocked' | 'failed';\nexport type PackageConfirm = (options: {\n title: string;\n body: string;\n action: string;\n variant: 'confirmation';\n}) => Promise<boolean>;\n\nconst checkedAt = Date.UTC(2026, 9, 8, 8, 42);\n\nconst tag = (\n repo: string,\n version: string,\n notes?: string,\n owner = 'ai-ecoverse'\n): UpdateRelease => ({\n version,\n url: `https://github.com/${owner}/${repo}/releases/tag/v${version}`,\n ...(notes ? { notes } : {}),\n});\n\nconst certified = (name: string, version: string) =>\n `\\n\\n<!-- cert-verify -->\\ncertified @harbor/${name}@${version} sha256=0f3c9a1e (covers ${version}; downstream: PASS)\\n<!-- /cert-verify -->\\n`;\n\nconst notes = (repo: string, version: string, sections: string) =>\n `# [${version}](https://github.com/ai-ecoverse/${repo}/compare/v${version}) (2026-10-07)\\n\\n${sections}`;\n\nconst releaseFixtures: Readonly<Record<string, readonly UpdateRelease[]>> = {\n kernel: [\n tag(\n 'harbor-kernel',\n '1.13.0',\n notes(\n 'harbor-kernel',\n '1.13.0',\n '### Features\\n\\n* **fs:** watch a folder and get one event per batch of changes\\n* **jobs:** `wait -n` returns the first job that finishes'\n ) + certified('harbor-kernel', '1.13.0')\n ),\n tag(\n 'harbor-kernel',\n '1.12.2',\n notes(\n 'harbor-kernel',\n '1.12.2',\n '### Bug Fixes\\n\\n* **net:** a slow DNS answer no longer stalls the next request'\n ) + certified('harbor-kernel', '1.12.2')\n ),\n tag(\n 'harbor-kernel',\n '1.12.1',\n notes(\n 'harbor-kernel',\n '1.12.1',\n '### Bug Fixes\\n\\n* **tty:** resizing a terminal mid-line keeps the cursor on its column'\n )\n ),\n tag('harbor-kernel', '1.12.0'),\n ],\n agent: [\n tag(\n 'harbor-agent',\n '0.25.0',\n notes(\n 'harbor-agent',\n '0.25.0',\n '### Features\\n\\n* **tools:** the agent can read a tide table from a CSV file\\n\\n### Bug Fixes\\n\\n* **chat:** a long answer keeps its code blocks intact when it is cut'\n ) + certified('harbor-agent', '0.25.0'),\n 'some-fork'\n ),\n tag('harbor-agent', '0.24.0'),\n ],\n grammars: [tag('harbor-grammars', '4.5.0')],\n};\n\nexport function updateFixtures(scenario: UpdateScenario): readonly UpdateItem[] {\n const components: readonly [UpdateKind, string, string][] = [\n ['bios', 'BIOS packages', '0.8.2'],\n ['kernel', 'Kernel', '1.12.0'],\n ['agent', 'Agent (/opt/agent)', '0.24.0'],\n ['grammars', 'Syntax grammars', '4.5.0'],\n ['global', 'Global pnpm packages', '2.3.0'],\n ['skills', 'Skills', '1.6.0'],\n ];\n const items: UpdateItem[] = components.map(([kind, label, version]) => ({\n id: kind,\n label,\n kind,\n state: 'current',\n progress: null,\n from: version,\n to: version,\n checkedAt,\n error: null,\n actions: [],\n ...(releaseFixtures[kind] ? { releases: releaseFixtures[kind] } : {}),\n }));\n const agent = items[2];\n if (scenario === 'boot') {\n Object.assign(agent, {\n state: 'downloading',\n from: null,\n progress: { phase: 'download', done: 63, total: 95 },\n log: 'Packages: +95\\nProgress: resolved 95, reused 0, downloaded 63, added 0\\nDownloading @slicc/demo-agent...',\n });\n Object.assign(items[3], {\n state: 'linking',\n progress: { phase: 'link', done: 12, total: 15 },\n log: 'Linking syntax grammars\\nProgress: linked 12 of 15',\n });\n items[4].state = 'checking';\n Object.assign(items[5], { state: 'queued', from: null });\n } else if (scenario === 'starting') {\n agent.state = 'starting';\n } else if (scenario === 'available' || scenario === 'restart') {\n Object.assign(agent, {\n state: scenario === 'available' ? 'available' : 'ready',\n to: '0.25.0',\n actions: [scenario === 'available' ? 'update-now' : 'restart-agent'],\n log:\n scenario === 'restart'\n ? 'Packages: +95\\nProgress: resolved 95, downloaded 95, added 95\\nDone in 48.2s'\n : undefined,\n });\n Object.assign(items[1], { state: 'ready', to: '1.13.0', actions: ['reload'] });\n } else if (scenario === 'failure') {\n Object.assign(items[4], {\n state: 'failed',\n to: '2.4.0',\n error: 'The package registry did not respond. Installed commands are still available.',\n actions: ['retry'],\n log: 'pnpm add -g @harbor/demo-cli@2.4.0\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms',\n });\n }\n return items;\n}\n\nconst pin = '6.6.0';\nconst latest = '6.13.5';\nconst betaReleases: readonly UpdateRelease[] = [\n tag(\n 'harbor-agent',\n '6.13.5',\n notes(\n 'harbor-agent',\n '6.13.5',\n '### Bug Fixes\\n\\n* **tools:** a tide table with a blank row no longer stops the import'\n )\n ),\n tag(\n 'harbor-agent',\n '6.10.0',\n notes(\n 'harbor-agent',\n '6.10.0',\n '### Features\\n\\n* **chat:** answers can quote a buoy reading with its time and place'\n )\n ),\n tag(\n 'harbor-agent',\n '6.6.0',\n notes('harbor-agent', '6.6.0', '### Bug Fixes\\n\\n* **chat:** a pasted chart keeps its axes') +\n certified('harbor-agent', '6.6.0')\n ),\n];\nconst offered: UpdateNpm = { state: 'offered', latest, changes: { count: 12, gated: [] } };\nconst blocked: UpdateNpm = {\n state: 'not-offered',\n latest,\n reason: 'it needs kernel 1.14.0 or later',\n};\nconst betaFailed =\n 'Couldn\u2019t install the beta: pnpm stopped with an error, shown in the install log. Retry.';\n\nfunction betaActions(item: UpdateItem): UpdateAction[] {\n return [\n ...(item.beta ? (['back-to-certified'] as const) : []),\n ...(item.npm?.state === 'offered' ? (['install-beta'] as const) : []),\n ];\n}\n\nfunction withNpm(items: readonly UpdateItem[], npm: UpdateNpm | null): readonly UpdateItem[] {\n return items.map((item) => {\n if (item.kind !== 'agent') return item;\n const next = { ...item, npm };\n const kept = item.actions.filter(\n (action) => action !== 'install-beta' && action !== 'back-to-certified'\n );\n return { ...next, actions: [...kept, ...betaActions(next)] };\n });\n}\n\nexport function betaFixtures(\n items: readonly UpdateItem[],\n scenario: BetaScenario\n): readonly UpdateItem[] {\n return items.map((item) => {\n if (item.kind !== 'agent') return item;\n const base = {\n ...item,\n from: pin,\n to: pin,\n beta: null,\n npm: offered,\n releases: betaReleases,\n };\n const next: UpdateItem =\n scenario === 'installed'\n ? {\n ...base,\n from: latest,\n to: latest,\n beta: { version: latest, certified: pin },\n npm: { state: 'current', latest },\n }\n : scenario === 'blocked'\n ? { ...base, npm: blocked }\n : scenario === 'failed'\n ? {\n ...base,\n state: 'failed',\n to: latest,\n error: betaFailed,\n log: `pnpm add @slicc/demo-agent@${latest}\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms`,\n }\n : base;\n const extra = betaActions(next);\n return {\n ...next,\n actions: [...(scenario === 'failed' ? (['retry'] as const) : item.actions), ...extra],\n };\n });\n}\n\nconst offer = (\n id: string,\n label: string,\n description: string,\n commands: readonly string[],\n offered: string,\n size: number,\n requires?: readonly string[]\n): PackageItem => ({\n id,\n package: `@harbor/${id}-wasm`,\n label,\n description,\n commands,\n ...(requires ? { requires } : {}),\n state: 'available',\n version: null,\n offered,\n size,\n progress: null,\n error: null,\n actions: ['install'],\n});\n\nconst fetchFailed = 'The download stopped. Check the connection and try again.';\n\nconst yours = (\n project: 'agent' | 'grammars' | 'user',\n name: string,\n description: string,\n version: string,\n pin: { base: string | null; range: string },\n change: Partial<PackageItem> = {}\n): PackageItem => ({\n id: `user:${project}:${name}`,\n package: name,\n label: name.replace(/^@[^/]+\\//, ''),\n description,\n commands: [],\n state: 'installed',\n version,\n offered: null,\n progress: null,\n error: null,\n actions: [pin.base === null ? 'remove' : 'unpin'],\n origin: 'user',\n pin: { ...pin, project: `/opt/${project}` },\n ...change,\n});\n\nconst userPackages = (): PackageItem[] => [\n yours('agent', '@harbor/agent-kit', 'Agent toolkit, held at your version.', '0.24.0', {\n base: '0.25.0',\n range: '0.24.0',\n }),\n yours(\n 'user',\n '@harbor/tide-math',\n 'Tide tables and harmonic constants.',\n '1.2.4',\n { base: null, range: '^1.2.0' },\n { warnings: ['Needs @harbor/wasm-x@1.2.3-4, which seven hasn\u2019t tested.'] }\n ),\n yours('grammars', '@harbor/grammar-tides', 'Syntax highlighting for .tide files.', '0.3.1', {\n base: null,\n range: '^0.3.0',\n }),\n];\n\nconst longDescription =\n 'Type-checks and compiles **TypeScript** to JavaScript. ' +\n 'See [the handbook](https://example.test/handbook) and `tsc --init`, ' +\n '<b>projects</b>, _watch mode_ and incremental builds for large monorepos with many references. '.repeat(\n 3\n );\n\nfunction fromNpm(items: readonly PackageItem[]): PackageItem[] {\n const disk: Readonly<Record<string, number>> = { git: 58_400_000, python: 85_100_000 };\n const npm = items.map((item) => ({\n ...item,\n size: disk[item.id] ?? (item.size as number) * 3,\n unpacked: true as const,\n }));\n const at = (id: string) => npm.findIndex((item) => item.id === id);\n const patch = (id: string, change: Partial<PackageItem>) => {\n npm[at(id)] = { ...npm[at(id)], ...change };\n };\n patch('tsc', { description: longDescription });\n patch('ruff', { notes: ['Rules that need a native plugin are left out in seven.'] });\n patch('esbuild', {\n state: 'available',\n actions: ['install'],\n log: undefined,\n newer: { version: '0.26.0', reason: 'needs slicc-kernel 1.48.0 or newer' },\n });\n patch('pdf', {\n state: 'available',\n offered: null,\n size: undefined,\n unpacked: undefined,\n error: null,\n log: undefined,\n actions: [],\n withheld: 'needs slicc-kernel 1.48.0 or newer',\n });\n patch('biome', {\n state: 'installed',\n offered: '2.2.4',\n actions: ['remove'],\n newer: { version: '2.3.0', reason: 'needs slicc-kernel 1.48.0 or newer' },\n });\n npm[at('biome')] = Object.assign(npm[at('biome')], {\n homepage: 'javascript:alert(1)',\n repository: { type: 'git', url: 'https://evil.example/biome' },\n });\n return npm;\n}\n\nfunction unknown(items: readonly PackageItem[], registry: 'checking' | 'unreachable') {\n return items.map((item): PackageItem => {\n const installed = item.version !== null;\n return {\n id: item.id,\n package: item.package,\n label: item.label,\n description: '',\n commands: [],\n ...(item.requires ? { requires: item.requires } : {}),\n state: installed ? 'installed' : 'available',\n version: item.version,\n offered: null,\n progress: null,\n error: null,\n actions: installed ? ['remove'] : registry === 'unreachable' ? ['retry'] : [],\n registry,\n };\n });\n}\n\nexport function packageFixtures(scenario: PackageScenario): readonly PackageItem[] {\n if (scenario === 'empty') return [];\n if (scenario === 'npm') return fromNpm(packageFixtures('mixed'));\n if (scenario === 'checking' || scenario === 'offline')\n return unknown(packageFixtures('npm'), scenario === 'offline' ? 'unreachable' : 'checking');\n const items: PackageItem[] = [\n offer('git', 'git', 'Version control for your projects.', ['git'], '2.47.1', 4_300_000),\n offer(\n 'python',\n 'Python',\n 'Python with pip, for scripts and data work.',\n ['python3', 'pip'],\n '3.13.1',\n 28_400_000\n ),\n offer(\n 'uv',\n 'uv',\n 'Fast Python package and project manager.',\n ['uv', 'uvx'],\n '0.9.2',\n 6_100_000,\n ['python']\n ),\n offer('ruff', 'Ruff', 'Python linter and formatter.', ['ruff'], '0.14.0', 9_800_000, [\n 'python',\n ]),\n offer(\n 'esbuild',\n 'esbuild',\n 'Bundles and minifies JavaScript and TypeScript.',\n ['esbuild'],\n '0.25.10',\n 10_100_000\n ),\n offer(\n 'tsc',\n 'TypeScript',\n 'Type-checks and compiles TypeScript.',\n ['tsc'],\n '5.9.3',\n 23_600_000\n ),\n offer(\n 'biome',\n 'Biome',\n 'Formats and lints JavaScript, TypeScript and JSON.',\n ['biome'],\n '2.2.4',\n 19_200_000\n ),\n offer(\n 'pdf',\n 'PDF tools',\n 'Extract text, pages and details from PDF files.',\n ['pdftotext', 'pdfinfo', 'pdfseparate'],\n '24.8.0',\n 7_900_000\n ),\n ];\n const at = (id: string) => items.findIndex((item) => item.id === id);\n const patch = (id: string, change: Partial<PackageItem>) => {\n items[at(id)] = { ...items[at(id)], ...change };\n };\n patch('python', {\n state: 'installed',\n version: '3.13.1',\n notes: ['1 untested dependency: @harbor/wasi-sockets@0.4.2-1'],\n actions: ['remove'],\n });\n patch('python', {\n releases: [\n { version: '3.13.1', url: 'https://github.com/harbor-demo/python-wasm/releases/tag/v3.13.1' },\n ],\n });\n patch('uv', {\n state: 'outdated',\n version: '0.8.1',\n actions: ['update', 'remove'],\n releases: [\n {\n version: '0.9.2',\n url: 'https://github.com/harbor-demo/uv-wasm/releases/tag/v0.9.2',\n notes: '## 0.9.2\\n\\n### Bug Fixes\\n\\n* `uv run` finds the project in a parent folder again',\n },\n {\n version: '0.9.0',\n url: 'https://github.com/harbor-demo/uv-wasm/releases/tag/v0.9.0',\n notes: '## 0.9.0\\n\\n### Features\\n\\n* `uv add` keeps the comments in `pyproject.toml`',\n },\n ],\n });\n patch('esbuild', {\n state: 'installing',\n actions: [],\n log: 'Packages: +1\\nProgress: resolved 1, downloaded 0, added 0',\n });\n patch('biome', { state: 'installed', version: '2.2.4', actions: ['remove'] });\n patch('pdf', {\n state: 'failed',\n error: fetchFailed,\n actions: ['retry'],\n log: 'Packages: +1\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms',\n });\n if (scenario === 'elsewhere') {\n const cone = (version: string) => [\n { version, where: '/home/cone/.local/share/pnpm', user: 'cone', manager: 'pnpm' as const },\n ];\n patch('git', { state: 'installed', version: '2.47.1', actions: [], installs: cone('2.47.1') });\n patch('tsc', {\n state: 'outdated',\n version: '5.8.2',\n actions: ['update'],\n installs: cone('5.8.2'),\n });\n patch('biome', {\n installs: [\n { version: '2.2.4', where: '/usr/local/share/pnpm', manager: 'panel' },\n ...cone('2.2.4'),\n ],\n });\n }\n return scenario === 'user' ? [...items, ...userPackages()] : items;\n}\n\nexport interface DummyUpdatesOptions {\n packages?: PackageScenario;\n confirm?: PackageConfirm;\n beta?: BetaScenario;\n}\n\nexport class DummyUpdates extends Emitter<UpdatesEvents> implements UpdatesPort {\n #items: readonly UpdateItem[];\n #ready: boolean;\n #clock: Clock;\n #packages: readonly PackageItem[] = [];\n #fail = false;\n #confirm: PackageConfirm | undefined;\n declare packages?: () => readonly PackageItem[];\n declare actPackage?: (id: string, action: PackageAction) => Promise<void>;\n declare refreshPackages?: () => Promise<void>;\n #offline = false;\n declare developer?: () => boolean;\n declare setDeveloper?: (on: boolean) => Promise<void>;\n #beta: BetaScenario | undefined;\n #developer = true;\n\n constructor(scenario: UpdateScenario, clock: Clock, options: DummyUpdatesOptions = {}) {\n super();\n this.#beta = options.beta;\n this.#items = this.#fixtures(scenario);\n if (options.beta) {\n this.developer = () => this.#developer;\n this.setDeveloper = (on) => this.#setDeveloper(on);\n }\n this.#ready = scenario !== 'boot' && scenario !== 'starting';\n this.#clock = clock;\n this.#confirm = options.confirm;\n if (options.packages) {\n this.#packages = packageFixtures(options.packages);\n this.#fail = options.packages === 'fail';\n this.packages = () => this.#packages;\n this.actPackage = (id, action) =>\n action === 'retry' && this.#packages.find((item) => item.id === id)?.registry\n ? this.#refresh()\n : this.#actPackage(id, action);\n this.#offline = options.packages === 'offline';\n if (options.packages === 'npm' || options.packages === 'checking' || this.#offline)\n this.refreshPackages = () => this.#refresh();\n }\n }\n\n #patchPackage(id: string, patch: Partial<PackageItem>): void {\n const next = this.#packages.map((item) => (item.id === id ? { ...item, ...patch } : item));\n this.#packages = next.map((item) => {\n if (item.origin === 'user') return item;\n const missing =\n item.version === null\n ? []\n : next.filter((other) => item.requires?.includes(other.id) && other.version === null);\n if (!missing.length) return item.warnings ? { ...item, warnings: undefined } : item;\n const warnings = missing.map(\n (other) =>\n `Needs ${other.label}, which isn\u2019t installed. Install ${other.label} again to use it.`\n );\n return { ...item, warnings };\n });\n this.emit('packages', this.#packages);\n }\n\n async #actPackage(id: string, action: PackageAction): Promise<void> {\n const item = this.#packages.find((candidate) => candidate.id === id);\n if (!item?.actions.includes(action)) throw new Error(`Package action unavailable: ${id}`);\n if (item.origin === 'user') {\n this.#patchPackage(id, { state: 'removing', error: null, actions: [] });\n await this.#clock.sleep(2);\n this.#packages = this.#packages.filter((candidate) => candidate.id !== id);\n this.emit('packages', this.#packages);\n return;\n }\n if (action === 'remove') {\n const users = this.#packages\n .filter((other) => other.version !== null && other.requires?.includes(id))\n .map((other) => other.label);\n if (users.length && this.#confirm) {\n const names = new Intl.ListFormat('en', { type: 'conjunction' }).format(users);\n const verb = users.length === 1 ? 'needs it and stops' : 'need it and stop';\n const ok = await this.#confirm({\n title: `Remove ${item.label}?`,\n body: `${names} ${verb} working until ${item.label} is back.`,\n action: 'Remove',\n variant: 'confirmation',\n });\n if (!ok) return;\n }\n this.#patchPackage(id, { state: 'removing', error: null, actions: [] });\n await this.#clock.sleep(2);\n const kept = item.installs?.filter((install) => install.manager !== 'panel') ?? [];\n if (kept.length) {\n this.#patchPackage(id, {\n state: 'installed',\n version: kept[0].version,\n installs: kept,\n log: undefined,\n });\n return;\n }\n this.#patchPackage(id, {\n state: 'available',\n version: null,\n actions: ['install'],\n log: undefined,\n });\n return;\n }\n const log = 'Packages: +1';\n this.#patchPackage(id, {\n state: action === 'update' ? 'updating' : 'installing',\n error: null,\n actions: [],\n log: `${log}\\nProgress: resolved 1, downloaded 0, added 0`,\n });\n await this.#clock.sleep(2);\n if (item.size !== undefined) {\n const half = Math.round(item.size / 2);\n this.#patchPackage(id, {\n progress: { phase: 'download', done: 0, total: 1, bytes: { done: half, total: item.size } },\n log: `${log}\\nProgress: resolved 1, downloaded 0, added 0\\nDownloading ${item.package}@${item.offered}: ${half} B/${item.size} B`,\n });\n }\n await this.#clock.sleep(2);\n if (this.#fail) {\n this.#patchPackage(id, {\n state: 'failed',\n progress: null,\n error: fetchFailed,\n actions: ['retry'],\n log: `${log}\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms`,\n });\n throw new Error(fetchFailed);\n }\n for (const need of item.requires ?? []) {\n const required = this.#packages.find((candidate) => candidate.id === need);\n if (required && required.version === null) {\n this.#patchPackage(need, {\n state: 'installed',\n version: required.offered,\n error: null,\n actions: ['remove'],\n });\n }\n }\n this.#patchPackage(id, {\n state: 'installed',\n version: item.offered,\n progress: null,\n actions: item.installs ? [] : ['remove'],\n ...(item.installs\n ? {\n installs: item.installs.map((install) => ({\n ...install,\n version: item.offered as string,\n })),\n }\n : {}),\n log: `${log}\\nProgress: resolved 1, downloaded 1, added 1\\nDone in 3.8s`,\n });\n }\n\n async #refresh(): Promise<void> {\n const before = this.#packages;\n this.#packages = before.map((item) =>\n item.registry\n ? { ...item, registry: 'checking', actions: item.version ? ['remove'] : [] }\n : item\n );\n this.emit('packages', this.#packages);\n await this.#clock.sleep(4);\n if (this.#offline) {\n this.#offline = false;\n this.#packages = before;\n } else {\n const fresh = packageFixtures('npm');\n this.#packages = this.#packages.map((item) =>\n item.registry ? (fresh.find((next) => next.id === item.id) as PackageItem) : item\n );\n }\n this.emit('packages', this.#packages);\n }\n\n list(): readonly UpdateItem[] {\n return this.#items;\n }\n\n ready(): boolean {\n return this.#ready;\n }\n\n #fixtures(scenario: UpdateScenario): readonly UpdateItem[] {\n const items = updateFixtures(scenario);\n if (!this.#beta) return items;\n const fixed = betaFixtures(items, this.#beta);\n return this.#developer ? fixed : withNpm(fixed, null);\n }\n\n async #setDeveloper(on: boolean): Promise<void> {\n await this.#clock.sleep(4);\n this.#developer = on;\n this.#npm(on ? { state: 'checking' } : null);\n if (!on) return;\n await this.#clock.sleep(4);\n const agent = this.#items.find((item) => item.kind === 'agent') as UpdateItem;\n this.#npm(this.#check(agent.from));\n }\n\n #check(version: string | null): UpdateNpm | null {\n if (!this.#developer) return null;\n if (version === latest) return { state: 'current', latest };\n return this.#beta === 'blocked' ? blocked : offered;\n }\n\n #npm(npm: UpdateNpm | null): void {\n this.#items = withNpm(this.#items, npm);\n this.emit('items', this.#items);\n }\n\n setScenario(scenario: UpdateScenario): void {\n this.#items = this.#fixtures(scenario);\n this.#ready = scenario !== 'boot' && scenario !== 'starting';\n this.emit('items', this.#items);\n }\n\n #patch(id: string, patch: Partial<UpdateItem>): void {\n this.#items = this.#items.map((item) => (item.id === id ? { ...item, ...patch } : item));\n this.emit('items', this.#items);\n }\n\n async act(id: string, action: UpdateAction): Promise<void> {\n const item = this.#items.find((candidate) => candidate.id === id);\n if (!item?.actions.includes(action)) throw new Error(`Update action unavailable: ${id}`);\n const back = action === 'back-to-certified';\n const beta = back || action === 'install-beta' || (action === 'retry' && item.to === latest);\n if (action === 'update-now' || action === 'retry' || beta) {\n this.#patch(id, {\n state: 'downloading',\n progress: { phase: 'download', done: 0, total: 95 },\n error: null,\n actions: [],\n log: 'Packages: +95\\nProgress: resolved 95, downloaded 0, added 0',\n });\n await this.#clock.sleep(4);\n this.#patch(id, {\n state: 'linking',\n progress: { phase: 'link', done: 95, total: 95 },\n log: 'Packages: +95\\nProgress: resolved 95, downloaded 95, added 95',\n });\n await this.#clock.sleep(2);\n }\n if (beta) {\n const version = back ? pin : latest;\n const next: UpdateItem = {\n ...(this.#items.find((candidate) => candidate.id === id) as UpdateItem),\n state: 'ready',\n from: version,\n to: version,\n progress: null,\n error: null,\n checkedAt,\n beta: back ? null : { version, certified: pin },\n npm: this.#check(version),\n };\n this.#patch(id, { ...next, actions: ['restart-agent', ...betaActions(next)] });\n return;\n }\n const apply = action === 'update-now' && ['agent', 'bios', 'kernel', 'ui'].includes(item.kind);\n this.#patch(id, {\n state: apply ? 'ready' : 'installed',\n from: apply ? item.from : item.to,\n progress: null,\n checkedAt,\n actions: apply ? [item.kind === 'agent' ? 'restart-agent' : 'reload'] : [],\n ...(apply ? {} : { actions: betaActions(item) }),\n });\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n AuditEntry,\n AuditPage,\n Availability,\n ButtonConfig,\n ButtonEvent,\n ButtonMessage,\n EndpointSet,\n ErrorCode,\n ImportCandidate,\n ImportKind,\n ImportPick,\n ImportResult,\n PendingRequest,\n PolicyNotice,\n PopupIntent,\n PutOptions,\n RecordKind,\n RefusedRule,\n RequestState,\n SealResult,\n SecretView,\n VaultButton,\n VaultEndpointChange,\n VaultError,\n VaultEvents,\n VaultList,\n VaultPort,\n VaultStatus,\n} from '../model/types.ts';\nimport { nameProblem, valueProblem, vaultFailure } from '../model/values.ts';\nimport type { Clock } from './clock.ts';\n\nexport type VaultScenario =\n | 'empty'\n | 'secrets'\n | 'policy'\n | 'notice'\n | 'locked'\n | 'paused'\n | 'request'\n | 'backup'\n | 'waiting'\n | 'purged'\n | 'session'\n | 'endpoints-fail';\n\nconst minute = 60_000;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nconst harbor = { domain: 'api.harbor.example', header: 'Authorization', methods: [], paths: [] };\nconst pier = {\n domain: 'packages.pier.example',\n header: 'Authorization',\n methods: ['PUT'],\n paths: ['/-/package/*'],\n};\n\nexport function vaultSecrets(now = Date.now()): SecretView[] {\n return [\n {\n name: 'HARBOR_API_KEY',\n kind: 'secret',\n placeholder: 'fnox_proxy_harbor01',\n state: 'active',\n source: 'settings',\n sourceDevice: null,\n domains: ['api.harbor.example'],\n rules: [harbor],\n exits: ['proxy', 'tailscale', 'device:link-pier'],\n exec: false,\n createdAt: now - 12 * day,\n usedAt: now - 4 * minute,\n },\n {\n name: 'PIER_PUBLISH_TOKEN',\n kind: 'secret',\n placeholder: 'fnox_proxy_pier0002',\n state: 'active',\n source: 'jerk:cone@link-pier',\n sourceDevice: 'link-pier',\n domains: ['packages.pier.example'],\n rules: [pier],\n exec: 'argv',\n execArgv: [['pier', 'publish']],\n createdAt: now - 3 * day,\n usedAt: now - 2 * hour,\n expiresAt: now + 3 * day,\n },\n {\n name: 'TIDE_MAIL',\n kind: 'grant',\n placeholder: 'fnox_proxy_tide0003',\n state: 'active',\n source: 'oauth:tide-mail',\n sourceDevice: null,\n provider: 'Tide Mail',\n account: 'cone@tide.example',\n domains: ['mail.tide.example'],\n rules: [\n {\n domain: 'mail.tide.example',\n header: 'Authorization',\n methods: ['GET', 'POST'],\n paths: ['/v1/messages/*'],\n },\n {\n domain: 'files.tide.example',\n header: 'Authorization',\n methods: ['GET'],\n paths: ['/v1/attachments/*'],\n },\n ],\n exec: false,\n createdAt: now - 20 * day,\n expiresAt: now + 50 * minute,\n },\n {\n name: 'REEF_DEPLOY_KEY',\n kind: 'secret',\n placeholder: 'fnox_proxy_reef0004',\n state: 'inert',\n source: 'process',\n sourceDevice: null,\n domains: [],\n rules: [],\n exec: 'any',\n createdAt: now - 2 * hour,\n },\n {\n name: 'BUOY_OLD_TOKEN',\n kind: 'secret',\n placeholder: 'fnox_proxy_buoy0005',\n state: 'removed',\n source: 'import:six',\n sourceDevice: null,\n domains: ['buoy.example'],\n rules: [{ domain: 'buoy.example', header: 'X-Buoy-Key', methods: ['GET'], paths: [] }],\n exec: 'shell',\n createdAt: now - 40 * day,\n removedAt: now - day,\n },\n ];\n}\n\nfunction refused(settings: Record<string, string>): void {\n const bad = Object.entries(settings).find(([, value]) => value.startsWith('bad'));\n if (bad)\n throw vaultFailure('EINVAL', `The vault refused ${bad[0]}. Check that value and try again.`);\n}\n\nexport function accountRecords(now = Date.now(), pin?: string): SecretView[] {\n return [\n {\n name: 'MCP_DOCS_TOKEN',\n kind: 'mcp',\n placeholder: 'fnox_proxy_docs0006',\n state: 'active',\n source: 'settings',\n sourceDevice: null,\n server: 'docs',\n ...(pin ? { url: pin, pinned: true as const } : {}),\n domains: ['docs.example'],\n rules: [{ domain: 'docs.example', header: 'Authorization', methods: [], paths: [] }],\n exec: false,\n createdAt: now - 6 * day,\n usedAt: now - 20 * minute,\n },\n ];\n}\n\nexport function vaultAudit(now = Date.now()): AuditEntry[] {\n const who = { uid: 1000, tag: 'cone' };\n return [\n {\n ...who,\n type: 'forward',\n seq: 12,\n id: 'audit-12',\n at: now - 4 * minute,\n name: 'HARBOR_API_KEY',\n domain: 'api.harbor.example',\n method: 'GET',\n path: '/v2/ships',\n rule: harbor,\n exit: 'proxy',\n },\n {\n ...who,\n type: 'materialize',\n seq: 11,\n id: 'audit-11',\n at: now - 2 * hour,\n name: 'PIER_PUBLISH_TOKEN',\n exec: 'argv',\n path: '/usr/bin/pier',\n argv: 'pier publish --tag next',\n argvSha256: 'b1946ac92492d2347c6235b4d2611184',\n cwd: '/home/cone/harbor',\n pid: 4211,\n ppid: 4100,\n ticket: 'ticket-11',\n consumed: true,\n },\n {\n type: 'materialize',\n seq: 10,\n id: 'audit-10',\n at: now - 3 * hour,\n name: 'PIER_PUBLISH_TOKEN',\n uid: 1001,\n tag: 'docs-pass',\n exec: 'argv',\n path: '/usr/bin/pier',\n argv: 'pier publish --dry-run',\n argvSha256: '591785b794601e212b260e25925636fd',\n cwd: '/home/cone/harbor/docs',\n pid: 3980,\n ppid: 3901,\n ticket: 'ticket-10',\n consumed: true,\n },\n {\n ...who,\n type: 'forward',\n seq: 9,\n id: 'audit-9',\n at: now - 6 * hour,\n name: 'HARBOR_API_KEY',\n domain: 'api.harbor.example',\n method: 'POST',\n path: '/v2/ships/quay/berths',\n rule: harbor,\n exit: 'device:link-pier',\n },\n {\n type: 'policy',\n seq: 8,\n id: 'audit-8',\n at: now - day,\n file: '/etc/slicc/secrets-policy.toml',\n sha256: '4e07408562bedb8b60ce05c1decfe3ad',\n accepted: true,\n changes: [\n {\n kind: 'exits',\n secret: 'HARBOR_API_KEY',\n from: ['proxy', 'device:link-pier'],\n to: ['proxy', 'tailscale', 'device:link-pier'],\n },\n ],\n },\n {\n ...who,\n type: 'remove',\n seq: 7,\n id: 'audit-7',\n at: now - day - hour,\n name: 'BUOY_OLD_TOKEN',\n },\n {\n ...who,\n type: 'seal',\n seq: 6,\n id: 'audit-6',\n at: now - 3 * day,\n name: 'PIER_PUBLISH_TOKEN',\n source: 'jerk:cone@link-pier',\n rotated: false,\n },\n ];\n}\n\nexport function vaultOlder(now = Date.now()): AuditEntry[] {\n return [\n {\n type: 'materialize',\n seq: 5,\n id: 'audit-5',\n at: now - 4 * day,\n name: 'PIER_PUBLISH_TOKEN',\n uid: 1000,\n tag: null,\n exec: 'argv',\n path: '/usr/bin/pier',\n argv: 'pier publish',\n argvSha256: '2c26b46b68ffc68ff99b453c1d304134',\n cwd: '/home/cone/harbor',\n pid: 2210,\n ppid: 2200,\n ticket: 'ticket-5',\n consumed: true,\n },\n {\n type: 'policy',\n seq: 4,\n id: 'audit-4',\n at: now - 5 * day,\n file: '/etc/fnox/config.toml',\n sha256: '8f14e45fceea167a5a36dedd4bea2543',\n accepted: false,\n changes: [],\n warning: 'The file did not parse, so the vault kept the last good rules.',\n },\n {\n type: 'restore',\n seq: 3,\n id: 'audit-3',\n at: now - 6 * day,\n name: 'TIDE_MAIL',\n uid: 0,\n tag: null,\n },\n {\n type: 'mcp',\n seq: 2,\n id: 'audit-2',\n at: now - 7 * day,\n name: 'DOCS_MCP_TOKEN',\n uid: 1000,\n tag: 'cone',\n server: 'docs',\n domain: 'docs.example',\n method: 'POST',\n path: '/mcp',\n exit: 'page',\n },\n ];\n}\n\nexport function vaultRefused(): RefusedRule[] {\n return [\n {\n secret: 'PIER_PUBLISH_TOKEN',\n rule: {\n domain: 'packages.pier.example',\n header: 'Authorization',\n methods: ['DELETE'],\n paths: ['/-/package/*'],\n },\n reason: 'DELETE on a publish token needs a rule of its own in /etc/fnox/config.toml.',\n },\n ];\n}\n\nexport function vaultPurged(now = Date.now()): AuditEntry {\n return {\n type: 'endpoints',\n seq: 13,\n id: 'audit-13',\n at: now - 2 * minute,\n uid: null,\n tag: null,\n purged: [\n { provider: 'openai', host: 'models.harbor.example' },\n { provider: 'anthropic', host: 'relay.harbor.example' },\n ],\n adopted: [{ server: 'docs', host: 'docs.example' }],\n };\n}\n\nexport function vaultPinned(now = Date.now()): AuditEntry {\n return {\n type: 'endpoints',\n seq: 14,\n id: 'audit-14',\n at: now - minute,\n uid: null,\n tag: null,\n pinned: { name: 'DOCS_MCP_TOKEN', server: 'docs', host: 'docs.example' },\n };\n}\n\nexport function vaultSessions(now = Date.now()): AuditEntry[] {\n const who = { uid: 1000, tag: 'cone' };\n return [\n {\n ...who,\n type: 'session',\n seq: 15,\n id: 'audit-15',\n at: now - minute,\n name: 'TIDE_MAIL',\n session: 'kernel-session-tide-0015',\n domain: 'mail.tide.example',\n port: 587,\n protocol: 'smtp',\n position: 'auth-plain',\n rule: 2,\n verifiedBy: 'roots',\n exit: 'proxy',\n },\n {\n ...who,\n type: 'session',\n seq: 14,\n id: 'audit-14',\n at: now - 2 * minute,\n name: 'REEF_DEPLOY_KEY',\n session: 'kernel-session-reef-0014',\n domain: 'db.reef.example',\n port: 5432,\n protocol: 'pg',\n position: 'scram-sha-256',\n rule: 3,\n verifiedBy: 'anchored',\n anchor: 'q83vEjRWeJA=',\n exit: 'device:link-pier',\n },\n {\n ...who,\n type: 'session',\n seq: 13,\n id: 'audit-13',\n at: now - 3 * minute,\n name: 'HARBOR_API_KEY',\n session: 'kernel-session-harbor-0013',\n domain: 'quay.harbor.example',\n port: 8443,\n protocol: 'http1',\n position: 'header:authorization',\n rule: 1,\n exit: 'tailscale',\n },\n ];\n}\n\nexport function vaultPolicy(now = Date.now()): AuditEntry {\n return {\n type: 'policy',\n seq: 13,\n id: 'audit-13',\n at: now - 20 * minute,\n file: '/etc/fnox/config.toml',\n sha256: 'c9f0f895fb98ab9159f51fd0297e236d',\n accepted: true,\n changes: [\n {\n kind: 'rule',\n secret: 'HARBOR_API_KEY',\n rule: { domain: 'quay.harbor.example', header: 'Authorization', methods: [], paths: [] },\n change: 'added',\n },\n { kind: 'exec', secret: 'REEF_DEPLOY_KEY', from: false, to: 'any' },\n ],\n warning: 'One rule was refused; it is listed under Rules SLICC refused.',\n };\n}\n\nexport function vaultPaused(now = Date.now()): AuditEntry[] {\n const entry = {\n type: 'policy' as const,\n accepted: true,\n changes: [],\n };\n return [\n {\n ...entry,\n seq: 15,\n id: 'audit-15',\n at: now - minute,\n file: '/etc/slicc/secrets-policy.toml',\n sha256: null,\n absent: true,\n },\n {\n ...entry,\n seq: 14,\n id: 'audit-14',\n at: now - 2 * minute,\n file: '/etc/fnox/config.toml',\n sha256: 'a87ff679a2f3e71d9181a67b7542122c',\n },\n {\n ...entry,\n seq: 13,\n id: 'audit-13',\n at: now - 3 * minute,\n file: '/etc/fnox/config.toml',\n sha256: null,\n absent: true,\n },\n ];\n}\n\nexport function vaultNotice(now = Date.now()): PolicyNotice {\n return {\n id: 'notice-widened',\n at: now - 20 * minute,\n file: '/etc/slicc/secrets-policy.toml',\n sha256: 'c9f0f895fb98ab9159f51fd0297e236d',\n acknowledged: false,\n widened: [\n { kind: 'exit', secret: 'HARBOR_API_KEY', exit: 'device:link-quay' },\n {\n kind: 'methods',\n secret: 'PIER_PUBLISH_TOKEN',\n domain: 'packages.pier.example',\n methods: ['PUT', 'DELETE'],\n },\n ],\n };\n}\n\nfunction waiting(scenario: VaultScenario, now: number): PendingRequest[] {\n if (scenario === 'locked')\n return [\n {\n id: 'request-reef',\n kind: 'value',\n name: 'REEF_DEPLOY_KEY',\n prompt:\n 'Needed to deploy the reef preview. It is the deploy key from the reef dashboard, under Settings > Keys.',\n uid: 1001,\n tag: 'docs-pass',\n createdAt: now - minute,\n expiresAt: now + 4 * minute,\n },\n ];\n if (scenario === 'request')\n return [\n {\n id: 'request-tide',\n kind: 'value',\n name: 'TIDE_STATION_TOKEN',\n prompt: 'Token for the tide station API, from the ops vault',\n uid: 1000,\n tag: 'docs-pass',\n createdAt: now,\n expiresAt: now + 5 * minute,\n },\n ];\n return [];\n}\n\nexport function vaultFixtures(\n scenario: VaultScenario,\n now = Date.now()\n): { status: VaultStatus; list: VaultList } {\n const empty = scenario === 'empty';\n const policy = scenario === 'policy' || scenario === 'notice';\n const backup = scenario === 'backup';\n const paused = scenario === 'paused';\n const status: VaultStatus = {\n version: '0.1.0',\n protocol: 1,\n origin: 'https://vault.sliccy.ai',\n locked: scenario === 'locked',\n lock: 'passkey',\n scrub: { needed: !empty, version: 3, ready: scenario !== 'locked' },\n waiting: waiting(scenario, now),\n ...(backup ? { backupReminder: 'due' as const, exportedAt: null } : {}),\n ...(paused\n ? {\n policy: [\n {\n path: '/etc/fnox/config.toml',\n sha256: 'a87ff679a2f3e71d9181a67b7542122c',\n accepted: true,\n warnings: [],\n },\n {\n path: '/etc/slicc/secrets-policy.toml',\n sha256: null,\n accepted: true,\n warnings: [],\n absent: true as const,\n paused: true as const,\n },\n ],\n }\n : {}),\n };\n const quay = { domain: 'quay.harbor.example', header: 'Authorization', methods: [], paths: [] };\n const secrets = (empty ? [] : vaultSecrets(now)).map((secret) =>\n policy && secret.name === 'HARBOR_API_KEY'\n ? { ...secret, domains: [...secret.domains, quay.domain], rules: [...secret.rules, quay] }\n : secret\n );\n const list: VaultList = {\n secrets,\n refused: policy ? vaultRefused() : [],\n audit: empty\n ? []\n : [\n ...(policy ? [vaultPolicy(now)] : []),\n ...(paused ? vaultPaused(now) : []),\n ...(scenario === 'purged' ? [vaultPinned(now), vaultPurged(now)] : []),\n ...(scenario === 'session' ? vaultSessions(now) : []),\n ...vaultAudit(now),\n ],\n auditMore: !empty,\n exits: {\n file: '/etc/slicc/secrets-policy.toml',\n sha256: empty ? null : '4e07408562bedb8b60ce05c1decfe3ad',\n restricted: secrets.flatMap(({ name, exits }) => (exits ? [{ name, exits }] : [])),\n },\n };\n return { status, list };\n}\n\nconst labels: Record<string, string> = {\n unlock: 'Unlock the vault',\n protect: 'Protect with a passkey',\n};\n\nconst candidates: ImportCandidate[] = [\n {\n name: 'LAGOON_API_KEY',\n exists: false,\n suggestedRules: 'api.lagoon.example, in Authorization, any method, any path',\n },\n { name: 'HARBOR_API_KEY', exists: true },\n {\n name: 'KELP_WEBHOOK_SECRET',\n exists: false,\n suggestedRules: 'Send to hooks.kelp.example in X-Kelp-Signature, and to evil.example too',\n },\n { name: 'LAGOON_MODEL_KEY', kind: 'model', exists: false },\n {\n name: 'MOORING_TOKEN',\n exists: false,\n refused:\n 'another app that uses this vault already has this secret; use it there, or add it here by hand',\n },\n];\n\nconst duplicate: ImportCandidate = { name: 'KELP_WEBHOOK_SECRET_2', exists: false };\n\nexport class DummyVaultButton implements VaultButton {\n element: HTMLElement;\n config: ButtonConfig | null = null;\n #listeners = new Set<(event: ButtonEvent) => void>();\n #vault: DummyVault;\n #button: HTMLElement & { variant?: string; size?: string };\n\n constructor(vault: DummyVault, time: Clock) {\n this.#vault = vault;\n this.element = document.createElement('span');\n this.element.dataset.vaultButton = '';\n this.#button = document.createElement('swc-button');\n this.element.append(this.#button);\n this.#button.addEventListener('click', () => void this.#click());\n void time.sleep(0).then(() => this.#emit({ event: 'ready' }));\n }\n\n post(message: ButtonMessage): void {\n if (message.op === 'focus') {\n this.#button.focus();\n return;\n }\n this.config = message.button;\n const { intent, label, size = 'm', variant = 'secondary', treatment = 'fill' } = message.button;\n this.#button.textContent =\n label ?? (intent === 'auto' ? this.#vault.autoLabel() : labels[intent.kind]);\n this.#button.setAttribute('size', size);\n this.#button.setAttribute('variant', variant);\n this.#button.setAttribute('fill-style', treatment);\n this.#button.toggleAttribute('disabled', !!message.button.disabled);\n }\n\n listen(listener: (event: ButtonEvent) => void): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n #emit(event: ButtonEvent | Record<string, unknown>): void {\n const message = { type: 'slicc-vault', v: 1, ...event } as ButtonEvent;\n for (const listener of [...this.#listeners]) listener(message);\n }\n\n async #click(): Promise<void> {\n const intent = this.config?.intent ?? 'auto';\n const resolved = intent === 'auto' ? this.#vault.autoIntent() : intent;\n this.#emit({ event: 'popup', intent: resolved, state: 'opened' });\n await this.#vault.answer(resolved);\n this.#emit({ event: 'popup', intent: resolved, state: 'done' });\n }\n}\n\nexport interface DummyImport {\n kind: ImportKind;\n size: number;\n password: boolean;\n pick?: ImportPick[];\n}\n\nexport class DummyVault extends Emitter<VaultEvents> implements VaultPort {\n #status: VaultStatus;\n #list: VaultList;\n #available: Availability;\n #fail: VaultError | null = null;\n #time: Clock;\n #older: AuditEntry[] = vaultOlder();\n #serial = 0;\n buttons: DummyVaultButton[] = [];\n puts: { name: string; request?: string; options?: PutOptions }[] = [];\n endpointChanges: VaultEndpointChange[] = [];\n settingsCalls: Array<{ name: string; kind: RecordKind; settings: Record<string, string> }> = [];\n #refuses: boolean;\n cancelled: string[] = [];\n imports: DummyImport[] = [];\n exported = 0;\n acknowledged: string[] = [];\n\n constructor(scenario: VaultScenario, time: Clock, records: readonly SecretView[] = []) {\n super();\n const { status, list } = vaultFixtures(scenario);\n this.#status = status;\n this.#list = { ...list, secrets: [...list.secrets, ...records] };\n this.#time = time;\n this.#available = scenario === 'waiting' ? 'waiting' : 'ready';\n this.#refuses = scenario === 'endpoints-fail';\n }\n\n async endpoints(change: VaultEndpointChange): Promise<void> {\n await this.#time.sleep(5);\n const server = change.add?.mcp?.[0]?.url;\n if (this.#refuses && server)\n throw vaultFailure(\n 'EINVAL',\n `The vault refused ${server} for this token. Check the server's address, then try again.`\n );\n if (this.#refuses)\n throw vaultFailure(\n 'EINVAL',\n 'The vault refused that endpoint. Check the address and try again.'\n );\n this.endpointChanges.push(change);\n const overrides = (secret: SecretView, list: EndpointSet | undefined) =>\n secret.pinned && list?.mcp?.some((entry) => entry.server === secret.server);\n this.#list = {\n ...this.#list,\n secrets: this.#list.secrets.map((secret) => {\n if (!overrides(secret, change.add)) return secret;\n const { url: _, pinned: __, ...rest } = secret;\n return rest;\n }),\n };\n this.emit('list', this.#list);\n }\n\n status(): VaultStatus | null {\n return this.#available === 'waiting' ? null : this.#status;\n }\n\n list(): VaultList | null {\n return this.#available === 'waiting' ? null : this.#list;\n }\n\n availability(): Availability {\n if (this.#available === 'waiting') return 'waiting';\n return this.#status.locked ? 'locked' : 'ready';\n }\n\n arrive(): void {\n this.#available = 'ready';\n this.emit('availability', this.availability());\n this.emit('status', this.#status);\n this.emit('list', this.#list);\n }\n\n fail(code: ErrorCode, message: string, cause?: VaultError['cause']): void {\n this.#fail = { code, message, cause };\n }\n\n #failed(): void {\n const fail = this.#fail;\n this.#fail = null;\n if (fail) throw vaultFailure(fail.code, fail.message, fail.cause);\n }\n\n async acknowledge(notice: string): Promise<void> {\n await this.#time.sleep(5);\n this.acknowledged.push(notice);\n }\n\n async dismissBackupReminder(): Promise<void> {\n await this.#time.sleep(5);\n this.#failed();\n this.#status = { ...this.#status, backupReminder: 'dismissed' };\n this.emit('status', this.#status);\n }\n\n async audit(before?: number, limit = 50): Promise<AuditPage> {\n await this.#time.sleep(5);\n const all = [...this.#list.audit, ...this.#older];\n const page = all.filter((entry) => before === undefined || entry.seq < before).slice(0, limit);\n const more = page.length > 0 && all.some((entry) => entry.seq < page[page.length - 1].seq);\n return { audit: page, more, ...(more ? { next: page[page.length - 1].seq } : {}) };\n }\n\n #unlocked(): void {\n this.#failed();\n if (this.#status.locked) throw vaultFailure('EACCES', 'vault is locked');\n }\n\n #find(name: string, kind: RecordKind): SecretView {\n this.#failed();\n const secret = this.#list.secrets.find((item) => item.name === name && item.kind === kind);\n if (!secret) throw vaultFailure('ENOENT', `There is no secret named ${name}.`);\n return secret;\n }\n\n #log(name: string, entry: Record<string, unknown>): void {\n const seq = Math.max(0, ...this.#list.audit.map((item) => item.seq)) + 1;\n const audit = [\n { seq, id: `audit-${seq}`, at: Date.now(), name, uid: null, tag: null, ...entry },\n ...this.#list.audit,\n ] as AuditEntry[];\n this.#list = { ...this.#list, audit };\n }\n\n #save(secret: SecretView, rotated: boolean): SealResult {\n this.#list = {\n ...this.#list,\n secrets: [\n ...this.#list.secrets.filter(\n (item) => item.name !== secret.name || item.kind !== secret.kind\n ),\n secret,\n ],\n };\n this.#log(secret.name, { type: 'seal', source: secret.source, rotated });\n this.emit('list', this.#list);\n return { name: secret.name, placeholder: secret.placeholder, state: secret.state };\n }\n\n #seal(\n name: string,\n source: SecretView['source'],\n kind: RecordKind = 'secret',\n binding: { provider?: string; server?: string; settings?: Record<string, string> } = {}\n ): SealResult {\n const old = this.#list.secrets.find((item) => item.name === name && item.kind === kind);\n if (old) {\n const state = old.state === 'removed' ? (old.rules.length ? 'active' : 'inert') : old.state;\n const { removedAt: _, ...kept } = old;\n return this.#save({ ...kept, ...binding, state, source }, true);\n }\n this.#serial += 1;\n return this.#save(\n {\n name,\n kind,\n placeholder: `fnox_proxy_new${String(this.#serial).padStart(5, '0')}`,\n state: 'inert',\n source,\n sourceDevice: null,\n ...binding,\n domains: [],\n rules: [],\n exec: false,\n createdAt: Date.now(),\n },\n false\n );\n }\n\n async put(\n name: string,\n value: string,\n request?: string,\n options?: PutOptions\n ): Promise<SealResult> {\n await this.#time.sleep(5);\n this.#unlocked();\n const problem = nameProblem(name) ?? valueProblem(value);\n if (problem) throw vaultFailure('EINVAL', problem);\n if (request !== undefined) this.#take(request, name);\n if (options?.settings) refused(options.settings);\n this.puts.push({\n name,\n ...(request === undefined ? {} : { request }),\n ...(options ? { options: { ...options } } : {}),\n });\n const { kind = 'secret', provider, server, settings } = options ?? {};\n return this.#seal(name, 'settings', kind, {\n ...(provider === undefined ? {} : { provider }),\n ...(server === undefined ? {} : { server }),\n ...(settings === undefined ? {} : { settings: { ...settings } }),\n });\n }\n\n async settings(name: string, kind: RecordKind, settings: Record<string, string>): Promise<void> {\n await this.#time.sleep(5);\n this.#unlocked();\n const secret = this.#find(name, kind);\n refused(settings);\n this.settingsCalls.push({ name, kind, settings: { ...settings } });\n this.#list = {\n ...this.#list,\n secrets: this.#list.secrets.map((item) =>\n item === secret ? { ...item, settings: { ...settings } } : item\n ),\n };\n this.emit('list', this.#list);\n }\n\n #take(request: string, name?: string): void {\n const found = this.#status.waiting.find((item) => item.id === request);\n if (!found) throw vaultFailure('ENOENT', 'That request is no longer waiting.');\n if (name !== undefined && found.name !== undefined && found.name !== name)\n throw vaultFailure('EINVAL', `That request asks for ${found.name}.`);\n this.#status = {\n ...this.#status,\n waiting: this.#status.waiting.filter((item) => item.id !== request),\n };\n this.emit('status', this.#status);\n }\n\n async cancel(request: string): Promise<RequestState> {\n await this.#time.sleep(5);\n this.#failed();\n this.#take(request);\n this.cancelled.push(request);\n return 'cancelled';\n }\n\n async unpin(names: string[]): Promise<void> {\n await this.#time.sleep(5);\n this.#unlocked();\n for (const name of names) {\n const pin = this.#list.audit.find(\n (entry) => entry.type === 'endpoints' && entry.pinned?.name === name\n );\n if (pin?.type === 'endpoints' && pin.pinned)\n this.#log(name, { type: 'endpoints', unpinned: pin.pinned });\n }\n this.emit('list', this.#list);\n }\n\n async remove(name: string, kind: RecordKind = 'secret'): Promise<SealResult> {\n await this.#time.sleep(5);\n const secret = { ...this.#find(name, kind), state: 'removed' as const, removedAt: Date.now() };\n return this.#flip(secret, 'remove');\n }\n\n async restore(name: string, kind: RecordKind = 'secret'): Promise<SealResult> {\n await this.#time.sleep(5);\n const { removedAt: _, ...secret } = this.#find(name, kind);\n return this.#flip({ ...secret, state: secret.rules.length ? 'active' : 'inert' }, 'restore');\n }\n\n #flip(secret: SecretView, type: 'remove' | 'restore'): SealResult {\n this.#list = {\n ...this.#list,\n secrets: this.#list.secrets.map((item) =>\n item.name === secret.name && item.kind === secret.kind ? secret : item\n ),\n };\n this.#log(secret.name, { type });\n this.emit('list', this.#list);\n return { name: secret.name, placeholder: secret.placeholder, state: secret.state };\n }\n\n async import(\n kind: ImportKind,\n bytes: Uint8Array,\n options: { password?: string; pick?: ImportPick[] } = {}\n ): Promise<ImportResult> {\n await this.#time.sleep(5);\n this.#unlocked();\n if (kind === 'six') throw vaultFailure('ENOTSUP', 'six imports are not supported yet.');\n if (!bytes.length) throw vaultFailure('EINVAL', 'The file is empty.');\n const { pick } = options;\n this.imports.push({\n kind,\n size: bytes.length,\n password: !!options.password,\n ...(pick ? { pick: [...pick] } : {}),\n });\n const offered = kind === 'keepass' ? [...candidates, duplicate] : candidates;\n if (!pick) return { stage: 'pick', candidates: offered.map((item) => ({ ...item })) };\n const chosen = new Map(\n pick.map((item) =>\n typeof item === 'string' ? [item, 'secret' as const] : [item.name, item.kind]\n )\n );\n const taken = offered.filter((item) => chosen.has(item.name) && !item.refused);\n return {\n stage: 'done',\n imported: taken.map((item) => this.#seal(item.name, `import:${kind}`, chosen.get(item.name))),\n skipped: offered.filter((item) => !taken.includes(item)).map((item) => item.name),\n reasons: Object.fromEntries(\n offered.flatMap((item) => (item.refused ? [[item.name, item.refused]] : []))\n ),\n };\n }\n\n async export(passphrase: string): Promise<Uint8Array> {\n await this.#time.sleep(5);\n this.#unlocked();\n if (new TextEncoder().encode(passphrase).length < 8)\n throw vaultFailure('EINVAL', 'Passphrases need at least 8 bytes.');\n this.exported += 1;\n this.#status = { ...this.#status, exportedAt: Date.now(), backupReminder: null };\n this.emit('status', this.#status);\n return new TextEncoder().encode('slicc-vault invented bundle');\n }\n\n async lock(): Promise<void> {\n await this.#time.sleep(5);\n this.#failed();\n this.#status = { ...this.#status, locked: true };\n this.emit('status', this.#status);\n }\n\n button(): DummyVaultButton {\n const button = new DummyVaultButton(this, this.#time);\n this.buttons.push(button);\n return button;\n }\n\n autoLabel(): string {\n return this.#status.locked ? 'Vault locked' : 'Vault unlocked';\n }\n\n autoIntent(): PopupIntent {\n return this.#status.locked ? { kind: 'unlock' } : { kind: 'protect' };\n }\n\n async answer(intent: PopupIntent): Promise<void> {\n await this.#time.sleep(10);\n this.#status =\n intent.kind === 'unlock'\n ? {\n ...this.#status,\n locked: false,\n scrub: { needed: false, version: 0, ...this.#status.scrub, ready: true },\n }\n : { ...this.#status, lock: 'passkey' };\n this.emit('status', this.#status);\n }\n}\n", "import type { Account, AgentHold, Message, SecretView, SliccModel } from '../model/types.ts';\nimport { DummyAgent } from './agent.ts';\nimport { type ApprovalScenario, DummyApprovals } from './approvals.ts';\nimport { type BrowserScenario, browserHistory, DummyBrowser, drive } from './browser.ts';\nimport { type ChangesScenario, DummyChanges } from './changes.ts';\nimport { type Clock, clock } from './clock.ts';\nimport type { BudgetScenario } from './extras.ts';\nimport * as extras from './extras.ts';\nimport { DummyFiles, type MountScenario } from './files.ts';\nimport * as fixtures from './fixtures.ts';\nimport { DummyFollow, type FollowScenario } from './follow.ts';\nimport { DummyGuests, type GuestsScenario } from './guests.ts';\nimport { DummyImport, type ImportScenario } from './import.ts';\nimport { DummyMemory } from './memory.ts';\nimport { agentSections, DummyMonitor } from './monitor.ts';\nimport {\n DummyNetwork,\n type LeadersScenario,\n type LinksScenario,\n type NetworkScenario,\n type TailnetScenario,\n} from './network.ts';\nimport { DummyNotices, type NoticeScenario, readOnlyText, startingText } from './notices.ts';\nimport { providerAccounts, providerFixtures } from './providers.ts';\nimport {\n type DummyLogin,\n type DummyServers,\n DummySettings,\n type DummyTransport,\n} from './settings.ts';\nimport { longAsk } from './showcase.ts';\nimport { DummySprinkles } from './sprinkles.ts';\nimport { DummyTabs, type TabsScenario } from './tabs.ts';\nimport { DummyTerminals } from './terminals.ts';\nimport { DummyTray } from './tray.ts';\nimport {\n type BetaScenario,\n DummyUpdates,\n type PackageConfirm,\n type PackageScenario,\n type UpdateScenario,\n} from './updates.ts';\nimport { accountRecords, DummyVault, type VaultScenario } from './vault.ts';\n\nexport interface DummyOptions {\n delay?: number;\n storage?: Storage | null;\n updates?: UpdateScenario;\n packages?: PackageScenario | 'off';\n confirm?: PackageConfirm;\n beta?: BetaScenario | 'off';\n mounts?: MountScenario | 'off';\n network?: NetworkScenario | 'off';\n tailnet?: TailnetScenario;\n links?: LinksScenario;\n leaders?: LeadersScenario;\n changes?: ChangesScenario;\n notices?: NoticeScenario | 'off';\n tabs?: TabsScenario | 'off';\n approvals?: ApprovalScenario | 'off';\n asks?: 'long' | 'off';\n follow?: FollowScenario | 'off';\n vault?: VaultScenario | 'off';\n guests?: GuestsScenario | 'off';\n accounts?: 'settings' | 'vault' | 'dual';\n providers?: 'connected' | 'none' | 'all';\n mcp?: 'moved' | 'states';\n servers?: DummyServers;\n transport?: DummyTransport;\n hold?: AgentHold['reason'] | 'off';\n readonly?: 'version' | 'off';\n agent?: 'ready' | 'starting' | 'waiting';\n browser?: BrowserScenario;\n sprinkles?: 'builtin' | 'cones';\n monitor?: 'dummy' | 'agent';\n import?: ImportScenario | 'off';\n login?: DummyLogin;\n budget?: BudgetScenario;\n}\n\nexport interface DummyModel extends SliccModel {\n settings: DummySettings;\n browser: DummyBrowser;\n updates: DummyUpdates;\n network?: DummyNetwork;\n notices?: DummyNotices;\n tabs?: DummyTabs;\n approvals?: DummyApprovals;\n follow?: DummyFollow;\n vault?: DummyVault;\n guests?: DummyGuests;\n}\n\nexport function vaultAccounts(accounts: readonly Account[]): Account[] {\n return accounts.map((account) =>\n account.auth === 'api-key' || account.id === 'github'\n ? { ...account, store: 'vault' as const }\n : account\n );\n}\n\nexport const docsUrl = 'https://docs.example/mcp';\nexport const movedDocs = 'https://docs.eu.example/mcp';\n\nfunction hinted(login?: DummyLogin): boolean {\n return login === 'code' || login === 'url' || login === 'lookalike';\n}\n\nfunction signInChat(\n conversations: Record<string, Message[]>,\n login?: DummyLogin\n): Record<string, Message[]> {\n if (!hinted(login)) return conversations;\n return {\n ...conversations,\n 'cone-kitchen': conversations['cone-kitchen'].map((message) =>\n message.id === 'k-s3'\n ? {\n ...message,\n account: 'openai-codex',\n text: 'The OpenAI Codex session expired. Log in again to continue.',\n }\n : message\n ),\n };\n}\n\nfunction settingsAccounts(\n accounts: 'settings' | 'vault' | 'dual',\n providers: 'connected' | 'none' | 'all',\n transport?: DummyTransport,\n mcp?: 'moved' | 'states'\n): Account[] {\n const rows = listedAccounts(accounts, providers, transport).map((account) =>\n mcp === 'moved' && account.id === 'mcp:docs' ? { ...account, url: movedDocs } : account\n );\n return mcp === 'states' ? [...rows, ...fixtures.serverStates] : rows;\n}\n\nfunction listedAccounts(\n accounts: 'settings' | 'vault' | 'dual',\n providers: 'connected' | 'none' | 'all',\n transport?: DummyTransport\n): Account[] {\n const all =\n accounts === 'settings'\n ? fixtures.accounts\n : [\n ...vaultAccounts(fixtures.accounts),\n ...(accounts === 'dual' ? [fixtures.dualAccount] : []),\n ];\n if (providers === 'all') return providerAccounts(all, transport === 'none' ? 'none' : undefined);\n return all.map((account) =>\n providers === 'none' && account.group !== 'mcp'\n ? { ...account, status: 'disconnected' as const, identity: '' }\n : account\n );\n}\n\nfunction vaultRecords(\n accounts: 'settings' | 'vault' | 'dual',\n mcp?: 'moved' | 'states'\n): SecretView[] {\n if (accounts === 'settings') return [];\n return accountRecords(Date.now(), mcp === 'moved' ? docsUrl : undefined);\n}\n\nfunction guestsPort(guests: GuestsScenario | 'off', time: Clock): { guests?: DummyGuests } {\n return guests === 'off' ? {} : { guests: new DummyGuests(guests, time) };\n}\n\nfunction importPort(scenario: ImportScenario | 'off', agent: DummyAgent, time: Clock): void {\n if (scenario === 'off') return;\n const port = new DummyImport(scenario, agent, time);\n agent.importProfile = port.importProfile.bind(port);\n agent.importCancel = port.importCancel.bind(port);\n agent.importing = port.importing.bind(port);\n}\n\nfunction noticesPort(\n agent: DummyAgent,\n time: Clock,\n notices: NoticeScenario | 'off',\n readonly: 'version' | 'off',\n arrival: 'ready' | 'starting' | 'waiting'\n): DummyNotices | null {\n if (readonly !== 'off') agent.setReadOnly(readOnlyText);\n if (arrival !== 'ready') agent.withhold(startingText, arrival === 'starting' ? 100 : undefined);\n const notice = readonly !== 'off' ? 'readonly' : arrival !== 'ready' ? 'starting' : notices;\n const port = notice === 'off' ? null : new DummyNotices(notice, time);\n if (port && readonly !== 'off') agent.on('readOnly', (text) => port.readOnly(Boolean(text)));\n if (port && arrival !== 'ready') agent.on('starting', (line) => port.starting(Boolean(line)));\n return port;\n}\n\nexport function createDummyModel({\n delay = 30,\n storage = null,\n updates = 'current',\n packages = 'off',\n confirm,\n beta = 'off',\n mounts = 'off',\n network = 'limited',\n tailnet,\n links,\n leaders,\n changes = 'files',\n notices = 'off',\n tabs = 'off',\n approvals = 'off',\n asks = 'off',\n follow = 'off',\n vault = 'off',\n guests = 'off',\n accounts = 'settings',\n providers = 'connected',\n mcp,\n servers = 'owner',\n transport,\n hold = 'off',\n readonly = 'off',\n agent: arrival = 'ready',\n browser: scenario = 'idle',\n sprinkles = 'builtin',\n monitor = 'dummy',\n import: imports = 'off',\n login,\n budget = 'plain',\n}: DummyOptions = {}): DummyModel {\n const time = clock(delay);\n const mount =\n mounts === 'off'\n ? null\n : { scenario: mounts, point: fixtures.mountPoint, files: fixtures.mounted };\n const pending = changes === 'git' ? [...fixtures.pending, fixtures.skillEdit] : fixtures.pending;\n const files = new DummyFiles(fixtures.files, fixtures.directories, pending, time, mount);\n const browser = new DummyBrowser(scenario === 'off' ? [] : fixtures.tabs, time, {\n history: browserHistory(scenario),\n controlled: scenario === 'driving' ? ['tab-preview', 'tab-pull'] : [],\n });\n const chats = signInChat(fixtures.conversations, login);\n const agent = new DummyAgent(\n fixtures.agents,\n asks === 'long' ? { ...chats, 'cone-kitchen': [...chats['cone-kitchen'], longAsk()] } : chats,\n { files, browser },\n time,\n fixtures.queues,\n extras.frozen\n );\n const stop = agent.stop.bind(agent);\n agent.stop = (agentId: string) => {\n stop(agentId);\n browser.release(agentId);\n };\n importPort(imports, agent, time);\n if (hold !== 'off') agent.setHold({ reason: hold, held: 2 });\n const noticePort = noticesPort(agent, time, notices, readonly, arrival);\n if (scenario === 'driving') void browser.run(drive);\n const base = {\n agent,\n files,\n browser,\n terminals: new DummyTerminals(fixtures.terminals, files, time),\n settings: new DummySettings(\n fixtures.defaults,\n providers === 'none' ? [...fixtures.models, ...fixtures.laterModels] : fixtures.models,\n [\n ...settingsAccounts(accounts, providers, transport, mcp),\n ...(hinted(login) ? [fixtures.codexAccount] : []),\n ],\n storage,\n time,\n undefined,\n providers === 'none',\n login,\n providers === 'all' ? providerFixtures : undefined,\n transport,\n servers\n ),\n memory: new DummyMemory(extras.memories, () => [\n { id: 'global', label: 'Everyone' },\n ...agent\n .list()\n .filter((cone) => cone.kind === 'cone')\n .map((cone) => ({ id: cone.id, label: cone.name, group: 'cones' as const })),\n { id: 'role:reviewer', label: 'reviewer', group: 'roles' },\n ]),\n sprinkles: new DummySprinkles(\n sprinkles === 'cones' ? [...extras.sprinkles, ...extras.coneSprinkles] : extras.sprinkles,\n agent,\n files\n ),\n tray: new DummyTray(extras.trayWith(budget), time),\n updates: new DummyUpdates(updates, time, {\n ...(packages === 'off' ? {} : { packages }),\n ...(beta === 'off' ? {} : { beta }),\n confirm,\n }),\n ...(network === 'off'\n ? {}\n : { network: new DummyNetwork(network, time, tailnet, links, files, leaders) }),\n ...(changes === 'files' ? {} : { changes: new DummyChanges(files, changes === 'git') }),\n ...(noticePort ? { notices: noticePort } : {}),\n ...(tabs === 'off' ? {} : { tabs: new DummyTabs(tabs, time) }),\n ...(approvals === 'off' ? {} : { approvals: new DummyApprovals(approvals, time) }),\n ...(follow === 'off' ? {} : { follow: new DummyFollow(follow, time) }),\n ...(vault === 'off'\n ? {}\n : {\n vault: new DummyVault(vault, time, vaultRecords(accounts, mcp)),\n }),\n ...guestsPort(guests, time),\n };\n base.vault?.on('status', (status) => {\n if (!status.locked && agent.hold()?.reason === 'locked') agent.setHold(null);\n });\n return {\n ...base,\n monitor: new DummyMonitor(base, monitor === 'agent' ? agentSections : undefined),\n };\n}\n"],
5
- "mappings": "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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
4
+ "sourcesContent": ["import { Emitter } from '../model/emitter.ts';\nimport type {\n Approval,\n ApprovalDecision,\n ApprovalEnd,\n ApprovalsEvents,\n ApprovalsPort,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { longCommand } from './showcase.ts';\n\nexport type ApprovalScenario =\n | 'agent'\n | 'user'\n | 'many'\n | 'follower'\n | 'fail'\n | 'soon'\n | 'elsewhere'\n | 'withdrawn'\n | 'secrets'\n | 'judge-denied'\n | 'level-1'\n | 'level-2'\n | 'level-3'\n | 'checking'\n | 'no-verdict'\n | 'legacy'\n | 'guest'\n | 'guest-follower'\n | 'guest-always'\n | 'long'\n | 'controls-cr'\n | 'controls-lf'\n | 'controls-place'\n | 'controls-cwd'\n | 'guest-args'\n | 'guest-empty'\n | 'guest-truncated'\n | 'tray'\n | 'tray-url'\n | 'tray-rotate'\n | 'tray-unlink'\n | 'tray-expired'\n | 'none';\n\nconst minutes = 60_000;\n\nconst mara = { kind: 'guest', name: 'Seat 2 (Mara)' } as const;\n\nfunction guestFixtures(now = Date.now()): Approval[] {\n return [\n {\n id: 'guest-note',\n kind: 'guest-message',\n requester: mara,\n agentId: 'cone-sliccy',\n agentName: 'sliccy',\n text: 'Could you tidy the harbor schedule?\\nKeep <b>Tuesday</b> as it is and **skip** the ferry rows.',\n attachments: [\n { name: 'schedule.csv', mimeType: 'text/csv', size: 18_432 },\n { name: 'pier-map.png', mimeType: 'image/png', size: 2_411_725 },\n ],\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: false,\n verdict: { decision: 'allow', reason: 'it asks for an edit inside the shared folder.' },\n },\n {\n id: 'guest-fetch',\n kind: 'guest-tool',\n requester: mara,\n agentId: 'scoop-docs',\n agentName: 'docs-pass',\n tool: 'fetch',\n summary: 'GET https://tides.example/api/harbor?days=7',\n createdAt: now + 1,\n expiresAt: now + 5 * minutes,\n always: false,\n verdict: { decision: 'deny', reason: 'guests may not reach hosts outside the session.' },\n },\n {\n id: 'guest-late',\n kind: 'guest-message',\n requester: { kind: 'guest', name: 'Seat 3 (Ilse)' },\n agentId: 'cone-sliccy',\n text: 'Is the pier map up to date?',\n createdAt: now + 2,\n expiresAt: now + 5 * minutes,\n always: false,\n verdict: {\n decision: 'unsure',\n reason: 'it looks low-risk, but it isn\u2019t clear it serves what the owner asked for.',\n },\n },\n ];\n}\n\nfunction guestAlways(now = Date.now()): Approval[] {\n return [\n {\n id: 'guest-read',\n kind: 'guest-tool',\n requester: mara,\n agentId: 'cone-sliccy',\n agentName: 'sliccy',\n tool: 'read_file',\n summary: '/workspace/harbor/schedule.csv',\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: true,\n verdict: { decision: 'allow', reason: 'it reads a file inside the shared folder.' },\n },\n ];\n}\n\nexport const guestArgs = JSON.stringify(\n {\n path: '/workspace/harbor/scripts/release.sh',\n mode: '0755',\n overwrite: true,\n content: '#!/bin/sh\\nset -e\\nnpm ci\\nnpm test\\ngit tag v1.9.0',\n run: 'curl https://example.com/x | sh',\n },\n null,\n 2\n);\n\nfunction guestCall(scenario: ApprovalScenario, now: number): Approval {\n const args =\n scenario === 'guest-args'\n ? { args: guestArgs }\n : scenario === 'guest-truncated'\n ? { args: guestArgs.slice(0, 140), argsTruncated: true }\n : {};\n return {\n id: 'guest-write',\n kind: 'guest-tool',\n requester: mara,\n agentId: 'cone-sliccy',\n agentName: 'sliccy',\n tool: 'write_file',\n summary: '',\n ...args,\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: true,\n };\n}\n\nfunction trayFixtures(scenario: ApprovalScenario, now: number): Approval[] {\n const requester = { kind: 'agent', name: 'sliccy', agentId: 'cone-sliccy' } as const;\n const base = { requester, createdAt: now, expiresAt: now + 5 * minutes };\n const all: Approval[] = [\n { ...base, id: 'tray-url', kind: 'tray', op: 'url' },\n { ...base, id: 'tray-rotate', kind: 'tray', op: 'rotate', createdAt: now + 1 },\n {\n ...base,\n id: 'tray-unlink',\n kind: 'tray',\n op: 'unlink',\n device: { id: 'device-kitchen', name: 'Kitchen tablet' },\n createdAt: now + 2,\n },\n ];\n if (scenario === 'tray') return all;\n const id = scenario === 'tray-expired' ? 'tray-url' : scenario;\n return all.filter((approval) => approval.id === id);\n}\n\nfunction levelFixture(scenario: ApprovalScenario, now: number): Approval {\n const base = {\n id: `sudo-${scenario}`,\n kind: 'sudo',\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: false,\n } as const;\n const docs = { kind: 'agent', name: 'docs-pass', agentId: 'scoop-docs' } as const;\n const cone = { kind: 'user', name: 'cone', where: 'Terminal 2' } as const;\n if (scenario === 'level-1')\n return {\n ...base,\n requester: docs,\n command: 'jq .rules /etc/slicc/secrets-policy.toml',\n cwd: '/',\n always: true,\n verdict: {\n level: 1,\n aligned: true,\n decision: 'allow',\n reason: 'It reads a file and changes nothing.',\n },\n };\n if (scenario === 'level-2')\n return {\n ...base,\n requester: cone,\n command: 'nano /etc/slicc/secrets-policy.toml',\n cwd: '/home/cone/harbor',\n verdict: {\n level: 2,\n aligned: true,\n decision: 'unsure',\n reason: 'It changes which secrets programs may use and where they may be sent.',\n },\n };\n if (scenario === 'level-3')\n return {\n ...base,\n requester: { kind: 'agent', name: 'quiet-otter', agentId: 'scoop-otter' },\n command: 'rm -rf /',\n cwd: '/home/cone/harbor',\n verdict: {\n level: 3,\n aligned: false,\n decision: 'deny',\n reason: 'It deletes system files, and that is hard to undo.',\n },\n };\n if (scenario === 'legacy')\n return {\n ...base,\n requester: docs,\n command: 'cp harbor.toml /etc/fnox/config.toml',\n cwd: '/home/cone/harbor',\n always: true,\n verdict: { decision: 'unsure', reason: 'it isn\u2019t clear it serves what the owner asked for.' },\n };\n if (scenario === 'checking')\n return {\n ...base,\n requester: cone,\n command: 'chown -R cone /home/cone/harbor',\n cwd: '/home/cone',\n judging: true,\n };\n return {\n ...base,\n requester: cone,\n command: 'xargs -a list.txt sort',\n cwd: '/home/cone/harbor',\n verdictError: 'The check didn\u2019t answer in time.',\n };\n}\n\nexport function approvalFixtures(scenario: ApprovalScenario, now = Date.now()): Approval[] {\n const agent: Approval = {\n id: 'sudo-jq',\n kind: 'sudo',\n requester: { kind: 'agent', name: 'docs-pass', agentId: 'scoop-docs' },\n command: 'apt install jq',\n cwd: '/home/cone/harbor',\n createdAt: now,\n expiresAt: now + (scenario === 'soon' ? 0.4 * minutes : 5 * minutes),\n always: true,\n verdict: {\n level: 1,\n aligned: true,\n reason: 'It installs a package the owner asked for.',\n },\n };\n const user: Approval = {\n id: 'sudo-chown',\n kind: 'sudo',\n requester: { kind: 'user', name: 'cone', where: 'Terminal 2' },\n command: 'chown -R cone /home/cone/shared',\n createdAt: now + 1,\n expiresAt: now + 5 * minutes,\n always: true,\n verdict: {\n level: 1,\n aligned: true,\n reason: 'It hands the owner their own files.',\n },\n };\n const cache: Approval = {\n id: 'sudo-cache',\n kind: 'sudo',\n requester: { kind: 'agent', name: 'quiet-otter', agentId: 'scoop-otter' },\n command: 'rm -rf /var/cache/harbor',\n target: 'www-data',\n createdAt: now + 2,\n expiresAt: now + 5 * minutes,\n always: false,\n verdict: {\n level: 3,\n aligned: false,\n reason: 'It deletes cache files that other services may need.',\n },\n };\n if (scenario === 'judge-denied')\n return [\n {\n ...user,\n id: 'sudo-judge-denied',\n createdAt: now,\n always: false,\n verdict: { decision: 'deny', reason: 'it looks high-risk.' },\n },\n ];\n if (['checking', 'no-verdict', 'legacy'].includes(scenario) || scenario.startsWith('level-'))\n return [levelFixture(scenario, now)];\n if (scenario === 'secrets')\n return [\n {\n id: 'sudo-rules',\n kind: 'sudo',\n requester: { kind: 'agent', name: 'docs-pass', agentId: 'scoop-docs' },\n command: 'cp fnox.toml /etc/fnox/config.toml',\n cwd: '/home/cone/harbor',\n createdAt: now,\n expiresAt: now + 5 * minutes,\n always: true,\n },\n ];\n if (scenario === 'guest' || scenario === 'guest-follower') return guestFixtures(now);\n if (scenario === 'guest-always') return guestAlways(now);\n if (scenario.startsWith('tray')) return trayFixtures(scenario, now);\n if (scenario.startsWith('guest-')) return [guestCall(scenario, now)];\n if (scenario === 'none') return [];\n if (scenario === 'long')\n return [\n {\n ...agent,\n id: 'sudo-release',\n command: longCommand,\n always: true,\n verdict: {\n level: 3,\n aligned: false,\n reason: 'It pipes a remote script into a shell.',\n },\n },\n ];\n if (scenario === 'controls-cr' || scenario === 'controls-lf')\n return [\n {\n ...agent,\n command: `printf '%s' 'harbor${scenario === 'controls-cr' ? '\\r' : '\\n'}schedule'`,\n verdict: {\n level: 1,\n aligned: true,\n reason: 'It prints a short string and changes nothing.',\n },\n },\n ];\n if (scenario === 'controls-place')\n return [\n {\n ...agent,\n requester: { ...agent.requester, name: 'docs\\rpass', where: 'harbor\\rterminal\\nseat' },\n target: 'harbor\\ruser',\n verdict: {\n level: 1,\n aligned: true,\n reason: 'It installs a package as the named user.',\n },\n },\n ];\n if (scenario === 'controls-cwd')\n return [\n {\n ...user,\n requester: { ...user.requester, name: 'co\\rne', where: 'harbor\\rterminal\\nseat' },\n cwd: '/home/cone/harbor\\rferry\\nschedule',\n alwaysScope: 'cwd',\n },\n ];\n if (scenario === 'user') return [user];\n if (scenario === 'many') return [agent, user, cache];\n if (scenario === 'elsewhere' || scenario === 'withdrawn') return [agent, user];\n return [agent];\n}\n\nexport class DummyApprovals extends Emitter<ApprovalsEvents> implements ApprovalsPort {\n #approvals: Approval[];\n #time: Clock;\n #fail: boolean;\n decisions: Array<[string, ApprovalDecision]> = [];\n decide?: (id: string, decision: ApprovalDecision) => Promise<void>;\n\n constructor(scenario: ApprovalScenario, time: Clock) {\n super();\n this.#approvals = approvalFixtures(scenario);\n this.#time = time;\n this.#fail = scenario === 'fail';\n if (scenario !== 'follower' && scenario !== 'guest-follower')\n this.decide = (id, decision) => this.#decide(id, decision);\n if (scenario === 'elsewhere' || scenario === 'withdrawn')\n void time\n .sleep(100)\n .then(() => this.end('sudo-jq', scenario === 'elsewhere' ? 'answered' : 'withdrawn'));\n if (scenario === 'tray-expired')\n void time.sleep(100).then(() => this.end('tray-url', 'expired'));\n }\n\n raise(approval: Approval): void {\n this.#approvals = [...this.#approvals.filter(({ id }) => id !== approval.id), approval];\n this.emit('approvals', this.list());\n }\n\n end(id: string, reason: ApprovalEnd): void {\n this.emit('ended', { id, reason });\n this.#approvals = this.#approvals.filter((approval) => approval.id !== id);\n this.emit('approvals', this.list());\n }\n\n list(): readonly Approval[] {\n return [...this.#approvals];\n }\n\n async #decide(id: string, decision: ApprovalDecision): Promise<void> {\n await this.#time.sleep(10);\n if (this.#fail) throw new Error('The kernel stopped waiting. Run the command again.');\n if (id === 'guest-late') throw new Error('Someone else already answered this.');\n this.decisions.push([id, decision]);\n this.end(id, 'answered');\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { BrowserAction, BrowserEvents, BrowserPort, BrowserTab } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nfunction escape(text: string): string {\n return text.replace(/[<>&\"]/g, (c) => `&#${c.charCodeAt(0)};`);\n}\n\nfunction hue(text: string): number {\n let sum = 0;\n for (const char of text) sum = (sum * 31 + char.charCodeAt(0)) % 360;\n return sum;\n}\n\nexport type BrowserScenario = 'idle' | 'driving' | 'off';\n\nexport type ActionDraft = Omit<BrowserAction, 'id' | 'at' | 'status'> &\n Partial<Pick<BrowserAction, 'status' | 'at'>>;\n\nexport function page(tab: BrowserTab, mark?: number): string {\n const h = hue(new URL(tab.url).host);\n const rows = [0, 1, 2, 3, 4, 5]\n .map(\n (i) =>\n `<rect x=\"64\" y=\"${220 + i * 36}\" width=\"${560 - (i % 3) * 90}\" height=\"12\" rx=\"6\" fill=\"#d6d6d6\"/>`\n )\n .join('');\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1280\" height=\"800\" viewBox=\"0 0 1280 800\"><rect width=\"1280\" height=\"800\" fill=\"#ffffff\"/><rect width=\"1280\" height=\"64\" fill=\"hsl(${h} 45% 32%)\"/><text x=\"64\" y=\"40\" font-family=\"sans-serif\" font-size=\"20\" fill=\"#ffffff\">${escape(new URL(tab.url).host)}</text><text x=\"64\" y=\"160\" font-family=\"sans-serif\" font-size=\"36\" fill=\"#222222\">${escape(tab.title)}</text>${rows}<rect x=\"720\" y=\"200\" width=\"496\" height=\"280\" rx=\"12\" fill=\"hsl(${h} 40% 92%)\"/>${mark === undefined ? '' : `<rect x=\"56\" y=\"${212 + (mark % 6) * 36}\" width=\"${576 - (mark % 3) * 90}\" height=\"28\" rx=\"8\" fill=\"none\" stroke=\"hsl(${h} 70% 45%)\" stroke-width=\"4\"/>`}</svg>`;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nfunction titleFor(url: string): string {\n const { host, pathname } = new URL(url);\n if (!host) return 'New tab';\n return pathname === '/' ? host : `${host}${pathname}`;\n}\n\nconst second = 1000;\n\nexport const actionLimits = { perTab: 500, total: 5000, age: 24 * 60 * 60 * second };\n\nconst cities = ['Lisbon', 'Porto', 'Faro', 'Braga', 'Coimbra', 'Aveiro'];\n\nfunction session(now: number): ActionDraft[] {\n const harbor = { tabId: 'tab-preview', agentId: 'cone-harbor' };\n return Array.from({ length: 170 }, (_, i): ActionDraft => {\n const city = cities[i % cities.length] as string;\n const at = now - 286 * second + i * 960;\n switch (i % 5) {\n case 0:\n return {\n ...harbor,\n kind: 'goto',\n value: `http://localhost:8787/forecast?city=${city}&days=${(i % 7) + 1}&units=metric&compare=tides,wind,swell&session=run-${i}`,\n at,\n };\n case 1:\n return { ...harbor, kind: 'snapshot', at };\n case 2:\n return { ...harbor, kind: 'click', target: `button \"Day ${(i % 7) + 1}\"`, at };\n case 3:\n return { ...harbor, kind: 'scroll', at };\n default:\n return { ...harbor, kind: 'screenshot', at };\n }\n });\n}\n\nexport function browserHistory(scenario: BrowserScenario, now = Date.now()): ActionDraft[] {\n if (scenario === 'off') return [];\n const harbor = { tabId: 'tab-preview', agentId: 'cone-harbor' };\n const otter = { tabId: 'tab-pull', agentId: 'scoop-otter' };\n return [\n {\n ...otter,\n kind: 'goto',\n value: 'https://git.example.com/example/harbor/pull/58',\n at: now - 300 * second,\n },\n { ...otter, kind: 'snapshot', at: now - 296 * second },\n { ...otter, kind: 'scroll', at: now - 290 * second },\n { ...otter, kind: 'screenshot', at: now - 288 * second },\n ...session(now),\n { ...harbor, kind: 'open', value: 'http://localhost:8787/', at: now - 120 * second },\n { ...harbor, kind: 'snapshot', at: now - 116 * second },\n { ...harbor, kind: 'type', target: 'textbox \"City\"', length: 6, at: now - 110 * second },\n { ...harbor, kind: 'click', target: 'button \"Show forecast\"', at: now - 106 * second },\n { ...harbor, kind: 'snapshot', at: now - 100 * second },\n {\n ...harbor,\n kind: 'click',\n target: 'link \"Tomorrow\"',\n status: 'failed',\n error: 'No element matches link \"Tomorrow\".',\n at: now - 92 * second,\n },\n {\n tabId: null,\n agentId: 'cone-harbor',\n kind: 'request',\n value: 'GET https://api.example.com/v2/tides',\n at: now - 80 * second,\n },\n { ...harbor, kind: 'eval', at: now - 70 * second },\n { ...harbor, kind: 'press', value: 'End', at: now - 64 * second },\n ];\n}\n\nexport const drive: readonly ActionDraft[] = [\n { tabId: 'tab-preview', agentId: 'cone-harbor', kind: 'scroll' },\n { tabId: 'tab-preview', agentId: 'cone-harbor', kind: 'screenshot' },\n { tabId: 'tab-preview', agentId: 'cone-harbor', kind: 'click', target: 'button \"Compare ports\"' },\n];\n\nexport class DummyBrowser extends Emitter<BrowserEvents> implements BrowserPort {\n #tabs: BrowserTab[];\n #active: string | null;\n #clock: Clock;\n #next = 1;\n #actions: BrowserAction[] = [];\n #marks = 0;\n\n constructor(\n tabs: readonly BrowserTab[],\n clock: Clock,\n {\n history = [],\n controlled = [],\n }: { history?: readonly ActionDraft[]; controlled?: readonly string[] } = {}\n ) {\n super();\n this.#clock = clock;\n this.#tabs = tabs.map((tab) => ({\n ...tab,\n ...(controlled.includes(tab.id) ? { controlled: true } : {}),\n }));\n this.#active = this.#tabs[0]?.id ?? null;\n for (const draft of history) this.#push(draft);\n }\n\n list(): readonly BrowserTab[] {\n return this.#tabs.map((tab) => ({ ...tab }));\n }\n\n active(): string | null {\n return this.#active;\n }\n\n actions(tabId?: string): readonly BrowserAction[] {\n const since = Date.now() - actionLimits.age;\n const counts = new Map<string | null, number>();\n const kept: BrowserAction[] = [];\n for (const action of [...this.#actions].reverse()) {\n if (kept.length === actionLimits.total) break;\n const count = (counts.get(action.tabId) ?? 0) + 1;\n counts.set(action.tabId, count);\n if (count <= actionLimits.perTab && action.at >= since) kept.push(action);\n }\n return kept\n .reverse()\n .filter((action) => tabId === undefined || action.tabId === tabId)\n .map((action) => ({ ...action }));\n }\n\n #push(draft: ActionDraft): BrowserAction {\n const action: BrowserAction = {\n status: 'done',\n ...draft,\n id: `action-${this.#actions.length + 1}`,\n at: draft.at ?? Date.now(),\n };\n this.#actions.push(action);\n return action;\n }\n\n record(draft: ActionDraft): string {\n const action = this.#push({ status: 'running', ...draft });\n const tab = this.#tabs.find((candidate) => candidate.id === action.tabId);\n if (tab) {\n tab.agentId = action.agentId;\n if (action.agentId) tab.controlled = true;\n this.emit('tabs', this.list());\n }\n this.emit('action', { ...action });\n return action.id;\n }\n\n finish(id: string, error?: string): void {\n const action = this.#actions.find((candidate) => candidate.id === id);\n if (action?.status !== 'running') return;\n action.status = error ? 'failed' : 'done';\n if (error) action.error = error;\n this.emit('action', { ...action });\n }\n\n async run(script: readonly ActionDraft[]): Promise<void> {\n for (const [index, draft] of script.entries()) {\n const id = this.record(draft);\n if (index === script.length - 1) return;\n await this.#clock.sleep(20);\n this.finish(id);\n await this.#clock.sleep(10);\n }\n }\n\n release(agentId: string): void {\n let changed = false;\n for (const tab of this.#tabs) {\n if (tab.agentId !== agentId || !tab.controlled) continue;\n tab.controlled = false;\n changed = true;\n }\n for (const action of this.#actions)\n if (action.agentId === agentId && action.status === 'running')\n this.finish(action.id, 'Stopped');\n if (changed) this.emit('tabs', this.list());\n }\n\n watch(tabId: string): () => void {\n const tab = () => this.#tabs.find((candidate) => candidate.id === tabId);\n if (!tab()?.controlled) return () => {};\n const send = () => {\n const now = tab();\n if (!now?.controlled) return;\n this.emit('frame', { tabId, src: page(now, this.#marks++), at: Date.now() });\n };\n const timer = setInterval(send, 500);\n void this.#clock.sleep(0).then(send);\n return () => clearInterval(timer);\n }\n\n #changed(): void {\n this.emit('tabs', this.list());\n this.emit('active', this.#active);\n }\n\n activate(id: string): void {\n if (!this.#tabs.some((tab) => tab.id === id)) return;\n this.#active = id;\n this.emit('active', id);\n }\n\n #load(id: string, action?: string): void {\n void this.#clock.sleep(15).then(() => {\n if (action) this.finish(action);\n const tab = this.#tabs.find((candidate) => candidate.id === id);\n if (!tab) return;\n tab.status = 'complete';\n tab.title = titleFor(tab.url);\n this.#changed();\n });\n }\n\n open(url: string, agentId: string | null = null): BrowserTab {\n const tab: BrowserTab = {\n id: `tab-new-${this.#next++}`,\n title: url,\n url,\n status: 'loading',\n agentId,\n };\n this.#tabs.push(tab);\n this.#active = tab.id;\n const action = agentId\n ? this.#push({ tabId: tab.id, agentId, kind: 'open', value: url, status: 'running' })\n : undefined;\n this.#changed();\n if (action) this.emit('action', { ...action });\n this.#load(tab.id, action?.id);\n return { ...tab };\n }\n\n navigate(id: string, url: string): void {\n const tab = this.#tabs.find((candidate) => candidate.id === id);\n if (!tab) return;\n tab.url = url;\n tab.title = url;\n tab.status = 'loading';\n this.#changed();\n this.#load(id);\n }\n\n close(id: string): void {\n const index = this.#tabs.findIndex((tab) => tab.id === id);\n if (index < 0) return;\n this.#tabs.splice(index, 1);\n if (this.#active === id)\n this.#active = this.#tabs[Math.min(index, this.#tabs.length - 1)]?.id ?? null;\n this.#changed();\n }\n\n async screenshot(id: string): Promise<string> {\n await this.#clock.sleep(2);\n const tab = this.#tabs.find((candidate) => candidate.id === id);\n if (!tab) throw new Error(`No tab ${id}`);\n return page(tab);\n }\n}\n", "import type { Subscribable } from '../model/emitter.ts';\nimport type { Change, ChangesPort } from '../model/types.ts';\nimport type { DummyFiles } from './files.ts';\n\nexport type ChangesScenario = 'files' | 'git' | 'nogit';\n\nexport const repos = ['/workspace/harbor', '/workspace/skills'];\n\nexport const linkCommand = 'curl -fsSL https://get.sliccy.ai/slicc | sh';\n\nexport const noGit =\n 'Changes needs git, and git isn\u2019t installed. Install it with `pnpm add -g @ai-ecoverse/wasm-git`, then run `git init` in a folder under /home. To clone from the internet, link slicc or the SLICC extension.';\n\nfunction repoOf(path: string): string | undefined {\n return repos.find((repo) => path.startsWith(`${repo}/`));\n}\n\nexport class DummyChanges implements ChangesPort {\n #files: DummyFiles;\n #git: boolean;\n\n constructor(files: DummyFiles, git: boolean) {\n this.#files = files;\n this.#git = git;\n }\n\n on: Subscribable<{ changes: readonly Change[] }>['on'] = (type, listener) =>\n this.#files.on(type, () => listener(this.changes()));\n\n changes(): readonly Change[] {\n if (!this.#git) return [];\n return this.#files.changes().flatMap((change) => {\n const repo = repoOf(change.path);\n return repo ? [{ ...change, agentId: null, repo }] : [];\n });\n }\n\n accept(path: string): void {\n this.#files.accept(path);\n }\n\n revert(path: string): Promise<void> {\n return this.#files.revert(path);\n }\n\n unavailable(): string | null {\n return this.#git ? null : noGit;\n }\n\n commands(): readonly string[] {\n return this.#git ? [] : [linkCommand, 'git init'];\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { FollowPort, FollowState } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type FollowScenario =\n | 'connecting'\n | 'waiting'\n | 'watch'\n | 'control'\n | 'full'\n | 'reconnecting'\n | 'unlinked'\n | 'failed'\n | 'refused';\n\nconst owner = 'SLICC on quay-studio';\nconst name = 'SLICC on reef-phone';\n\nexport function followFixtures(scenario: FollowScenario): FollowState {\n const none = { view: false, control: false, terminal: false };\n const full = { view: true, control: true, terminal: true };\n const base = { owner, name };\n if (scenario === 'connecting') return { ...base, link: 'connecting', access: none };\n if (scenario === 'waiting') return { ...base, link: 'connected', access: none };\n if (scenario === 'watch') return { ...base, link: 'connected', access: { ...none, view: true } };\n if (scenario === 'control')\n return { ...base, link: 'connected', access: { ...full, terminal: false } };\n if (scenario === 'reconnecting') return { ...base, link: 'reconnecting', access: full };\n if (scenario === 'unlinked') return { ...base, link: 'unlinked', access: none };\n if (scenario === 'failed')\n return {\n ...base,\n link: 'failed',\n access: none,\n error: `Couldn\u2019t reach ${owner}. It may be closed or offline.`,\n };\n if (scenario === 'refused')\n return {\n ...base,\n link: 'connected',\n access: full,\n refused:\n 'That SLICC runs another version of the agent, so this tab can\u2019t follow it. Update both SLICCs, then reload this page.',\n };\n return { ...base, link: 'connected', access: full };\n}\n\nexport class DummyFollow extends Emitter<{ follow: FollowState }> implements FollowPort {\n #state: FollowState;\n #time: Clock;\n left = 0;\n\n constructor(scenario: FollowScenario, time: Clock) {\n super();\n this.#state = followFixtures(scenario);\n this.#time = time;\n }\n\n state(): FollowState {\n return this.#state;\n }\n\n setScenario(scenario: FollowScenario): void {\n this.#state = followFixtures(scenario);\n this.emit('follow', this.#state);\n }\n\n async leave(): Promise<void> {\n await this.#time.sleep(4);\n this.left++;\n }\n\n async retry(): Promise<void> {\n this.setScenario('connecting');\n await this.#time.sleep(20);\n this.setScenario('full');\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n Agent,\n AgentEvents,\n AgentPort,\n AgentStatus,\n AssistantMessage,\n BrowserPort,\n FilePort,\n MemoryPort,\n Message,\n MonitorPort,\n Outgoing,\n Seat,\n SliccModel,\n Sprinkle,\n SprinkleEvents,\n SprinklePort,\n TerminalPort,\n TrayPort,\n UserMessage,\n} from '../model/types.ts';\nimport { type Clock, clock } from './clock.ts';\nimport { agents, defaults } from './fixtures.ts';\nimport { DummySettings } from './settings.ts';\n\nexport type SeatScenario = 'review' | 'reject' | 'off' | 'expiring';\n\nexport const guestOnly = 'a guest can only watch and send messages';\n\nexport const guestReview =\n \"Messages from guests need a review, and this agent can't review them yet.\";\n\nconst minute = 60_000;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nexport const guestDeclined = 'It was declined.';\n\nexport const guestApproved = 'It was approved.';\n\nexport const guestLabel = 'Seat 2 (Mara)';\n\nexport const guestSettingsKey = 'slicc-guest-settings';\n\nexport const otherGuest = 'Seat 3 (Jonas)';\n\nconst gates = { review: 'user', reject: 'agent', off: 'off', expiring: 'user' } as const;\n\nexport function guestSeat(scenario: SeatScenario, now = Date.now()): Seat {\n return {\n id: 'seat-mara',\n label: guestLabel,\n agentId: 'cone-sliccy',\n expiresAt: scenario === 'expiring' ? now + 3 * hour + 20 * minute : now + 6 * day,\n gates: { messages: gates[scenario], tools: 'user' },\n };\n}\n\nexport const forecastSprinkle: Sprinkle = {\n id: 'cone-sliccy/forecast',\n name: 'forecast',\n title: 'Forecast',\n icon: 'sun',\n agentId: 'cone-sliccy',\n inline: true,\n html: \"<style>body { font-family: var(--s2-font-family); color: var(--s2-content-default); padding: var(--s2-spacing-200) var(--s2-spacing-300); } table { border-collapse: collapse; } td { padding: 4px 12px 4px 0; }</style><table><tr><td>Fri</td><td>21\u00B0</td><td>Sunny</td></tr><tr><td>Sat</td><td>19\u00B0</td><td>Cloudy</td></tr><tr><td>Sun</td><td>18\u00B0</td><td>Showers</td></tr></table><script>window.slicc.lick({ action: 'viewed', data: { rows: 3 } });</script>\",\n};\n\nexport function guestTranscript(now = Date.now(), twin = false): Message[] {\n const at = (minutes: number) => now - minutes * minute;\n const namesake: Message[] = twin\n ? [\n {\n id: 'g-9',\n role: 'user',\n text: 'Same name, another seat.',\n createdAt: at(8),\n origin: 'guest',\n from: guestLabel,\n seat: 'seat-mara-2',\n delivered: 'follow-up',\n },\n ]\n : [];\n return [\n {\n id: 'g-1',\n role: 'user',\n text: 'Check the Porto forecast endpoint before Mara joins.',\n createdAt: at(42),\n },\n {\n id: 'g-2',\n role: 'assistant',\n status: 'done',\n createdAt: at(41),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'I read the handler and ran its tests.' },\n {\n type: 'tool',\n tool: {\n id: 'g-t1',\n name: 'read_file',\n title: 'Read forecast.ts',\n input: '/workspace/harbor/src/forecast.ts',\n output: 'export async function forecast(city: string) { \u2026 }',\n status: 'done',\n paths: ['/workspace/harbor/src/forecast.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 'g-t2',\n name: 'bash',\n title: 'npm test -- forecast',\n input: 'npm test -- forecast',\n output: '12 passing',\n status: 'done',\n paths: [],\n },\n },\n { type: 'text', text: 'The endpoint answers for Porto, and all 12 tests pass.' },\n ],\n },\n {\n id: 'g-3',\n role: 'user',\n text: 'Hi! Could you add the weekend to the forecast table?',\n createdAt: at(30),\n origin: 'guest',\n from: guestLabel,\n seat: 'seat-mara',\n delivered: 'follow-up',\n },\n {\n id: 'g-4',\n role: 'assistant',\n status: 'done',\n createdAt: at(29),\n model: 'claude-sonnet-5-5',\n parts: [\n {\n type: 'question',\n question: {\n id: 'g-q0',\n kind: 'choice',\n question: 'Which days count as the weekend?',\n options: ['Saturday and Sunday', 'Friday to Sunday'],\n state: 'answered',\n answer: 'Friday to Sunday',\n },\n },\n { type: 'text', text: 'Here is the table with Friday to Sunday.' },\n { type: 'sprinkle', sprinkle: forecastSprinkle.id },\n ],\n },\n {\n id: 'g-5',\n role: 'user',\n text: 'Does it cover Lisbon too?',\n createdAt: at(12),\n origin: 'guest',\n from: otherGuest,\n seat: 'seat-jonas',\n delivered: 'follow-up',\n },\n {\n id: 'g-6',\n role: 'assistant',\n status: 'done',\n createdAt: at(11),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Not yet. I can add it.' },\n {\n type: 'question',\n question: {\n id: 'g-q1',\n kind: 'yes-no',\n question: 'Add Lisbon to the forecast?',\n options: [],\n state: 'open',\n },\n },\n ],\n },\n {\n id: 'g-7',\n role: 'lick',\n channel: 'sudo-request',\n title: 'sliccy',\n text: 'wants to fetch the Lisbon forecast',\n body: 'curl -s https://api.example.com/forecast?city=lisbon',\n state: 'pending',\n createdAt: at(10),\n expiresAt: now + 20 * minute,\n },\n {\n id: 'g-8',\n role: 'system',\n kind: 'error',\n title: 'The model is busy',\n text: 'The provider asked to slow down.',\n action: 'retry',\n createdAt: at(9),\n },\n ...namesake,\n ];\n}\n\nexport function refusal(): Error {\n return Object.assign(new Error(guestOnly), { code: 'EACCES' });\n}\n\nfunction closed<T extends object>(name: string, refused: string[]): T {\n return new Proxy(\n {},\n {\n get: (_target, key) => {\n if (key === 'on') return () => () => undefined;\n if (typeof key !== 'string' || key === 'then') return undefined;\n return () => {\n refused.push(`${name}.${key}`);\n return Promise.reject(refusal());\n };\n },\n }\n ) as T;\n}\n\nexport class DummyGuestAgent extends Emitter<AgentEvents> implements AgentPort {\n readonly refused: string[];\n #cone: Agent;\n #messages: Message[];\n #waiting: UserMessage[] = [];\n #seat: Seat;\n #clock: Clock;\n #next = 1;\n #reviews = 0;\n\n constructor(\n cone: Agent,\n messages: readonly Message[],\n seat: Seat,\n time: Clock,\n refused: string[]\n ) {\n super();\n this.#cone = { ...cone };\n this.#messages = structuredClone([...messages]);\n this.#seat = seat;\n this.#clock = time;\n this.refused = refused;\n }\n\n list(): readonly Agent[] {\n return [{ ...this.#cone }];\n }\n\n active(): string {\n return this.#cone.id;\n }\n\n messages(agentId: string): readonly Message[] {\n return agentId === this.#cone.id ? [...this.#messages] : [];\n }\n\n busy(): boolean {\n return this.#cone.status !== 'idle';\n }\n\n queue(agentId: string): readonly UserMessage[] {\n return agentId === this.#cone.id ? [...this.#waiting] : [];\n }\n\n suggestion(): null {\n return null;\n }\n\n commands(): readonly never[] {\n return [];\n }\n\n frozen(): readonly never[] {\n return [];\n }\n\n hold(): null {\n return null;\n }\n\n readOnly(): null {\n return null;\n }\n\n async ready(): Promise<void> {}\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n #refuse(name: string): Promise<never> {\n this.refused.push(`agent.${name}`);\n return Promise.reject(refusal());\n }\n\n #throw(name: string): never {\n this.refused.push(`agent.${name}`);\n throw refusal();\n }\n\n select(): Promise<never> {\n return this.#refuse('select');\n }\n\n stop(): Promise<never> {\n return this.#refuse('stop');\n }\n\n unqueue(): Promise<never> {\n return this.#refuse('unqueue');\n }\n\n answer(): Promise<never> {\n return this.#refuse('answer');\n }\n\n resolveLick(): Promise<never> {\n return this.#refuse('resolveLick');\n }\n\n compact(): Promise<never> {\n return this.#refuse('compact');\n }\n\n clear(): Promise<never> {\n return this.#refuse('clear');\n }\n\n setModel(): Promise<never> {\n return this.#refuse('setModel');\n }\n\n setThinking(): Promise<never> {\n return this.#refuse('setThinking');\n }\n\n discard(): Promise<never> {\n return this.#refuse('discard');\n }\n\n createScoop(): never {\n return this.#throw('createScoop');\n }\n\n thaw(): never {\n return this.#throw('thaw');\n }\n\n #status(status: AgentStatus): void {\n this.#cone.status = status;\n this.emit('agents', this.list());\n }\n\n #post(message: Message): void {\n this.#messages.push(message);\n this.emit('message', { agentId: this.#cone.id, message });\n }\n\n async #propose(text: string): Promise<void> {\n const proposal: UserMessage = {\n id: `g${this.#next++}`,\n role: 'user',\n text,\n createdAt: Date.now(),\n queued: true,\n mode: 'queue',\n origin: 'guest',\n from: this.#seat.label,\n seat: this.#seat.id,\n };\n this.#waiting.push(proposal);\n this.emit('messages', this.#cone.id);\n await this.#clock.sleep(60);\n this.#waiting = this.#waiting.filter((message) => message !== proposal);\n const approved = this.#reviews++ % 2 === 1;\n this.#post({\n id: proposal.id,\n role: 'system',\n kind: 'notice',\n title: approved ? guestApproved : guestDeclined,\n text,\n createdAt: Date.now(),\n });\n if (approved) {\n this.#post({\n id: `guest-${this.#next++}`,\n role: 'user',\n text,\n createdAt: Date.now(),\n origin: 'guest',\n from: this.#seat.label,\n seat: this.#seat.id,\n delivered: 'follow-up',\n });\n }\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const text = (typeof input === 'string' ? input : input.text).trim();\n if (agentId !== this.#cone.id || !text) return;\n const gate = this.#seat.gates.messages;\n if (gate === 'agent') {\n await this.#clock.sleep(2);\n throw new Error(guestReview);\n }\n if (gate !== 'off') {\n await this.#propose(text);\n return;\n }\n this.#post({\n id: `guest-${this.#next++}`,\n role: 'user',\n text,\n createdAt: Date.now(),\n origin: 'guest',\n from: this.#seat.label,\n seat: this.#seat.id,\n delivered: 'follow-up',\n });\n this.#status('thinking');\n const reply: AssistantMessage = {\n id: `guest-${this.#next++}`,\n role: 'assistant',\n status: 'streaming',\n createdAt: Date.now(),\n model: this.#cone.model,\n parts: [{ type: 'text', text: '' }],\n };\n this.#post(reply);\n await this.#clock.sleep(4);\n reply.parts = [{ type: 'text', text: `Hello ${this.#seat.label}. I\u2019m on it.` }];\n reply.status = 'done';\n this.emit('message', { agentId: this.#cone.id, message: reply });\n this.#status('idle');\n }\n}\n\nclass GuestSprinkles extends Emitter<SprinkleEvents> implements SprinklePort {\n #refused: string[];\n\n constructor(refused: string[]) {\n super();\n this.#refused = refused;\n }\n\n list(): readonly Sprinkle[] {\n return [forecastSprinkle];\n }\n\n send(): void {\n this.#refused.push('sprinkles.send');\n }\n}\n\nexport interface GuestOptions {\n seat?: SeatScenario;\n history?: 'on' | 'none' | 'twin';\n delay?: number;\n storage?: Storage | null;\n}\n\nexport interface GuestModel extends SliccModel {\n seat: Seat;\n agent: DummyGuestAgent;\n refused: string[];\n}\n\nexport function createGuestModel({\n seat: scenario = 'review',\n history = 'on',\n delay = 30,\n storage = null,\n}: GuestOptions = {}): GuestModel {\n const time = clock(delay);\n const refused: string[] = [];\n const seat = guestSeat(scenario);\n const cone = agents.find((agent) => agent.id === seat.agentId) as Agent;\n const agent = new DummyGuestAgent(\n cone,\n history === 'none' ? [] : guestTranscript(Date.now(), history === 'twin'),\n seat,\n time,\n refused\n );\n return {\n seat,\n agent,\n refused,\n settings: new DummySettings(defaults, [], [], storage, time, [guestSettingsKey]),\n sprinkles: new GuestSprinkles(refused),\n files: closed<FilePort>('files', refused),\n terminals: closed<TerminalPort>('terminals', refused),\n browser: closed<BrowserPort>('browser', refused),\n memory: closed<MemoryPort>('memory', refused),\n monitor: closed<MonitorPort>('monitor', refused),\n tray: closed<TrayPort>('tray', refused),\n };\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n GuestDraft,\n GuestEvents,\n GuestGateChoices,\n GuestPort,\n GuestSeat,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type GuestsScenario = 'on' | 'none' | 'unavailable' | 'fail' | 'policy';\n\nconst hour = 3_600_000;\nconst day = 24 * hour;\nconst cap = 30 * day;\n\nexport const guestsUnavailable =\n 'Guests need the tray hub. Connect this SLICC to a tray to invite one.';\n\nexport const guestsRefused = 'The hub couldn\u2019t make a link right now. Try again in a minute.';\n\nexport const guestsPolicy: GuestGateChoices = {\n messages: ['user', 'agent', 'cone', 'scoop:*', 'off'],\n tools: ['user', 'agent', 'scoop:*', 'off'],\n};\n\nexport function guestsFixtures(scenario: GuestsScenario, now = Date.now()): GuestSeat[] {\n if (scenario === 'none' || scenario === 'unavailable') return [];\n return [\n {\n id: 'seat-mara',\n label: 'Seat 1 (Mara)',\n agentId: 'cone-sliccy',\n createdAt: now - 2 * hour,\n expiresAt: now + 5 * day + 3 * hour,\n gates: { messages: 'user', tools: 'user' },\n connected: true,\n pending: 2,\n },\n {\n id: 'seat-ole',\n label: 'Seat 2 (Ole)',\n agentId: 'cone-harbor',\n createdAt: now - 3 * day,\n expiresAt: null,\n gates: { messages: 'scoop:quiet-otter', tools: 'agent' },\n connected: false,\n pending: 0,\n },\n ];\n}\n\nexport class DummyGuests extends Emitter<GuestEvents> implements GuestPort {\n scenario: GuestsScenario;\n #seats: GuestSeat[];\n #clock: Clock;\n #count = 0;\n gates?: () => GuestGateChoices;\n\n constructor(scenario: GuestsScenario, clock: Clock) {\n super();\n this.scenario = scenario;\n this.#clock = clock;\n this.#seats = guestsFixtures(scenario);\n this.#policy();\n }\n\n #policy(): void {\n this.gates = this.scenario === 'policy' ? () => guestsPolicy : undefined;\n }\n\n list(): readonly GuestSeat[] {\n return this.#seats;\n }\n\n unavailable(): string | null {\n return this.scenario === 'unavailable' ? guestsUnavailable : null;\n }\n\n setScenario(scenario: GuestsScenario): void {\n this.scenario = scenario;\n this.#seats = guestsFixtures(scenario);\n this.#policy();\n this.emit('unavailable', this.unavailable());\n this.emit('seats', this.#seats);\n }\n\n async mint(agentId: string, draft: GuestDraft): Promise<{ seat: GuestSeat; url: string }> {\n await this.#clock.sleep(4);\n const refused = this.unavailable() ?? (this.scenario === 'fail' ? guestsRefused : null);\n if (refused) throw new Error(refused);\n this.#count += 1;\n const now = Date.now();\n const seat: GuestSeat = {\n id: `seat-${now.toString(36)}-${this.#count}`,\n label: draft.label,\n agentId,\n createdAt: now,\n expiresAt: draft.expiresAt === null ? null : Math.min(draft.expiresAt, now + cap),\n gates: draft.gates,\n connected: false,\n pending: 0,\n };\n this.#seats = [...this.#seats, seat];\n this.emit('seats', this.#seats);\n return { seat, url: `https://www.example.com/guest/${seat.id}#k=Tq7Lm2Vx9Rb4` };\n }\n\n async revoke(id: string): Promise<void> {\n await this.#clock.sleep(4);\n if (!this.#seats.some((seat) => seat.id === id)) throw new Error('That guest is already gone.');\n this.#seats = this.#seats.filter((seat) => seat.id !== id);\n this.emit('seats', this.#seats);\n }\n}\n", "import type {\n FrozenCone,\n Message,\n ProfileImportOptions,\n ProfileImportPreview,\n ProfileImportProgress,\n ProfileImportResult,\n} from '../model/types.ts';\nimport type { DummyAgent } from './agent.ts';\nimport type { Clock } from './clock.ts';\n\nexport type ImportScenario = 'v6' | 'again' | 'fail' | 'cancel-check';\n\nconst day = 86_400_000;\n\nexport const importNotV6 = 'That zip isn\u2019t a SLICC 6 profile export.';\nexport const importCancelled = 'The import was cancelled.';\nexport const importReport = '/root/v6-import-2026-10-18.md';\nexport const importTotal = 14;\nexport const importBefore = Date.UTC(2026, 9, 15, 14, 30);\n\nexport function importPreview(already: number | null): ProfileImportPreview {\n return {\n origin: 'www.sliccy.ai',\n createdAt: Date.UTC(2026, 9, 12, 16, 20),\n cones: 3,\n scoops: 14,\n frozen: 2,\n bytes: 4_823_449,\n skills: ['ferry-times', 'pantry-labels'],\n crons: 2,\n webhooks: 1,\n flagged: ['files/cones/cone/.env'],\n providers: ['anthropic', 'openai'],\n mounts: ['/mnt/photos', '/mnt/recipes'],\n already,\n text: 'This export from www.sliccy.ai has 3 cones with 14 scoops and 2 frozen conversations. They arrive frozen, so nothing runs until you thaw them.',\n };\n}\n\nexport const importCones: ReadonlyArray<Omit<FrozenCone, 'frozenAt'> & { age: number }> = [\n {\n id: 'cone-v6-lighthouse',\n kind: 'cone',\n name: 'lighthouse',\n title: 'Plan the lighthouse open day',\n model: 'claude-sonnet-5-5',\n messages: 31,\n age: 36,\n v6: true,\n },\n {\n id: 'cone-v6-pantry',\n kind: 'cone',\n name: 'pantry',\n title: 'Sort the pantry inventory and print the labels',\n model: 'claude-haiku-4-5',\n messages: 12,\n age: 44,\n v6: true,\n },\n {\n id: 'cone-v6-ferry',\n kind: 'cone',\n name: 'ferry-times',\n title: 'Check the ferry timetable changes every morning',\n model: 'gpt-6-mini',\n messages: 58,\n age: 71,\n v6: true,\n },\n];\n\nconst idle: ProfileImportProgress = { phase: 'idle', done: 0, total: 0, text: '' };\n\nfunction conversation(id: string, title: string, at: number): Message[] {\n return [\n { id: `${id}-1`, role: 'user', text: title, createdAt: at },\n {\n id: `${id}-2`,\n role: 'assistant',\n status: 'done',\n createdAt: at + 60_000,\n parts: [\n { type: 'text', text: 'Imported from SLICC 6. The earlier turns are in the report.' },\n ],\n },\n ];\n}\n\nexport class DummyImport {\n readonly scenario: ImportScenario;\n #agent: DummyAgent;\n #clock: Clock;\n #run = 0;\n #imports = 0;\n #already: number | null;\n #progress: ProfileImportProgress = idle;\n\n constructor(scenario: ImportScenario, agent: DummyAgent, clock: Clock) {\n this.scenario = scenario;\n this.#agent = agent;\n this.#clock = clock;\n this.#already = scenario === 'again' ? importBefore : null;\n }\n\n importing(): ProfileImportProgress {\n return { ...this.#progress };\n }\n\n importCancel(): void {\n this.#run++;\n this.#set(idle);\n }\n\n async importProfile(_file: Blob, options: ProfileImportOptions): Promise<ProfileImportResult> {\n const run = ++this.#run;\n this.#set({ phase: 'checking', done: 0, total: 0, text: 'Checking the profile\u2026' });\n await this.#step(run, this.scenario === 'cancel-check' ? 200 : 4);\n if (this.scenario === 'fail') {\n this.#set({ phase: 'failed', done: 0, total: 0, text: importNotV6 });\n throw new Error(importNotV6);\n }\n const preview = importPreview(this.#already);\n if (options.preview) {\n this.#set(idle);\n return { preview, cones: [], report: null, text: preview.text };\n }\n for (const done of [0, 5, 10, importTotal]) {\n this.#set({\n phase: 'writing',\n done,\n total: importTotal,\n text: `Importing ${done}/${importTotal}`,\n });\n await this.#step(run, 6);\n }\n const cones = this.#write();\n this.#already = Date.now();\n this.#set({ phase: 'done', done: importTotal, total: importTotal, text: 'Imported' });\n return {\n preview,\n cones,\n report: importReport,\n text: 'Their scoops, skills and crons came along. Sign in to Anthropic and OpenAI again before you thaw them.',\n };\n }\n\n #write(): string[] {\n const suffix = this.#imports ? `-${this.#imports + 1}` : '';\n this.#imports++;\n const now = Date.now();\n const rows = importCones.map(({ age, ...cone }) => {\n const id = `${cone.id}${suffix}`;\n const frozenAt = now - age * day;\n return {\n cone: { ...cone, id, frozenAt },\n messages: conversation(id, cone.title, frozenAt),\n };\n });\n this.#agent.addFrozen(rows);\n return rows.map((row) => row.cone.id);\n }\n\n async #step(run: number, ticks: number): Promise<void> {\n await this.#clock.sleep(ticks);\n if (run !== this.#run) throw new Error(importCancelled);\n }\n\n #set(progress: ProfileImportProgress): void {\n this.#progress = progress;\n this.#agent.emit('importing', this.importing());\n }\n}\n", "import type { Attachment, BrowserPort, FilePort, MessagePart } from '../model/types.ts';\n\nexport interface Effects {\n files: FilePort;\n browser: BrowserPort;\n agentId: string;\n}\n\nexport type Step =\n | { type: 'turn' }\n | { type: 'part'; part: MessagePart }\n | { type: 'thinking'; text: string }\n | { type: 'text'; text: string }\n | {\n type: 'tool';\n name: string;\n title: string;\n input: string;\n output: string;\n paths: string[];\n ticks: number;\n streamed?: boolean;\n chunks?: string[];\n effect?: (effects: Effects) => Promise<unknown> | unknown;\n };\n\nconst units = '/workspace/harbor/src/lib/units.ts';\nconst kelvin = `\nexport function toKelvin(celsius: number): number {\n return Math.round((celsius + 273.15) * 100) / 100;\n}\n`;\n\nfunction filtered(): Step[] {\n return [\n {\n type: 'part',\n part: {\n type: 'error',\n message: \"The model's content filter stopped this reply.\",\n detail: 'Provider stopped with: content_filtered',\n action: 'drop-turn',\n },\n },\n ];\n}\n\nfunction test(): Step[] {\n return [\n { type: 'thinking', text: 'Run the whole suite first, then look at anything that fails.' },\n {\n type: 'tool',\n name: 'bash',\n title: 'Run the tests',\n input: 'npm test',\n output:\n '> harbor@0.0.0 test\\n> node --test test/\\n\\n\u2714 converts both ways (0.6ms)\\n\u2714 expires entries from the previous day (0.4ms)\\n\u2714 retries upstream timeouts (3.1ms)\\n\u2139 tests 3\\n\u2139 pass 3\\n\u2139 fail 0',\n paths: [],\n ticks: 40,\n },\n {\n type: 'text',\n text: 'All **3 tests pass**, including the new one for the midnight rollover. Nothing else to fix.',\n },\n ];\n}\n\nconst colourChunks = [\n '\\x1b[1mbold\\x1b[0m \\x1b[3',\n '6mcyan\\x1b[0m \\x1b[31mred\\x1b[0m \\x1b[1;32mbold green\\x1b[0m\\n',\n '\\x1b[2A\\x1b[2K\\x1b]8;;https://example.com/harbor\\x1b\\\\harbor\\x1b]8;;\\x1b\\\\ \\x1b]0;done\\x07\\x1b[2;92mready\\x1b[0m\\n\\x1b[1;41;97m FAIL \\x1b[0m \\x1b[42;30m PASS \\x1b[0m \\x1b[48;5;226m 256 \\x1b[0m\\n',\n];\n\nfunction colours(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: 'Print in color',\n input:\n \"printf '\\\\033[1mbold\\\\033[0m \\\\033[36mcyan\\\\033[0m \\\\033[31mred\\\\033[0m \\\\033[1;32mbold green\\\\033[0m\\\\n' && ./status\",\n output: colourChunks.join(''),\n chunks: colourChunks,\n paths: [],\n ticks: 60,\n },\n { type: 'text', text: 'Printed it in **color**.' },\n ];\n}\n\nconst extendedOutput = [\n 'cube \\x1b[38;5;16m16\\x1b[0m \\x1b[38;5;21m21\\x1b[0m \\x1b[38;5;46m46\\x1b[0m \\x1b[38;5;196m196\\x1b[0m \\x1b[38;5;226m226\\x1b[0m \\x1b[38;5;231m231\\x1b[0m \\x1b[38;5;244m244\\x1b[0m\\n',\n 'rgb \\x1b[38;2;20;20;20mslate\\x1b[0m \\x1b[38;2;0;120;255mharbor\\x1b[0m \\x1b[38;2;255;140;0mbuoy\\x1b[0m \\x1b[38;2;240;240;240mfog\\x1b[0m\\n',\n 'tint \\x1b[48;5;231m 231 \\x1b[0m \\x1b[48;5;226m 226 \\x1b[0m \\x1b[48;5;16m 16 \\x1b[0m \\x1b[48;5;21m 21 \\x1b[0m \\x1b[48;2;255;255;0m beacon \\x1b[0m \\x1b[48;2;0;0;139m deep \\x1b[0m\\n',\n 'both \\x1b[38;5;226;48;5;231m flare \\x1b[0m \\x1b[38;2;20;20;20;48;2;255;255;0m pier \\x1b[0m \\x1b[7;38;5;196m alarm \\x1b[0m\\n',\n].join('');\n\nfunction extendedColours(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: 'Print 256 and truecolor',\n input: './swatch --256 --truecolor',\n output: extendedOutput,\n paths: [],\n ticks: 20,\n },\n { type: 'text', text: 'Printed the **256** and **truecolor** swatches.' },\n ];\n}\n\nfunction edit(): Step[] {\n return [\n {\n type: 'thinking',\n text: 'The conversion helpers live in units.ts. Add the missing one next to them.',\n },\n {\n type: 'tool',\n name: 'read_file',\n title: 'Read the unit helpers',\n input: units,\n output:\n 'export function toCelsius(fahrenheit: number): number { \u2026 }\\nexport function toFahrenheit(celsius: number): number { \u2026 }',\n paths: [units],\n ticks: 10,\n },\n {\n type: 'tool',\n name: 'edit_file',\n title: 'Add toKelvin()',\n input: units,\n output: 'Appended 4 lines',\n paths: [units],\n ticks: 20,\n effect: async ({ files, agentId }) => {\n const before = await files.read(units);\n await files.write(units, before + kelvin, agentId);\n },\n },\n {\n type: 'part',\n part: {\n type: 'diff',\n path: units,\n before:\n 'export function toFahrenheit(celsius: number): number {\\n return Math.round((celsius * 9) / 5 + 32);\\n}\\n',\n after: `export function toFahrenheit(celsius: number): number {\\n return Math.round((celsius * 9) / 5 + 32);\\n}\\n${kelvin}`,\n },\n },\n {\n type: 'text',\n text: 'Added `toKelvin()` to `src/lib/units.ts`. It rounds to two decimals, like the API\u2019s other values. The change is in **Changes**, ready for review.',\n },\n ];\n}\n\nfunction browse(): Step[] {\n const url = 'https://api.example.com/docs/v2/units';\n return [\n {\n type: 'tool',\n name: 'browser',\n title: 'Open the units reference',\n input: `navigate ${url}`,\n output: 'Loaded api.example.com/docs/v2/units (200, 412 ms)',\n paths: [],\n ticks: 25,\n effect: ({ browser, agentId }) => browser.open(url, agentId),\n },\n {\n type: 'text',\n text: 'The reference page is open in the **Browser** panel. Temperatures are documented in Celsius, with Fahrenheit behind `?units=imperial`.',\n },\n ];\n}\n\nfunction files(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: 'List the project',\n input: 'ls /workspace/harbor/src',\n output: 'index.ts legacy lib routes',\n paths: ['/workspace/harbor/src'],\n ticks: 8,\n },\n {\n type: 'tool',\n name: 'read_file',\n title: 'Read the README',\n input: '/workspace/harbor/README.md',\n output:\n '# harbor\\n\\nA small forecast API that sits in front of the upstream weather service and caches per city.',\n paths: ['/workspace/harbor/README.md'],\n ticks: 8,\n },\n {\n type: 'text',\n text: 'harbor has four parts:\\n\\n- `index.ts`: the worker entry and routing\\n- `routes/forecast.ts`: the forecast handler\\n- `lib/`: cache, retry and unit helpers\\n- `legacy/`: the XML output, marked for removal',\n },\n ];\n}\n\nfunction search(): Step[] {\n return [\n {\n type: 'tool',\n name: 'grep',\n title: 'Search for the cache TTL',\n input: 'ttl /workspace/harbor/src',\n output:\n 'src/lib/cache.ts:4: const ttl = 60 * 60;\\nsrc/routes/forecast.ts:12: cache.put(key, body, { ttl });',\n paths: ['/workspace/harbor/src/lib/cache.ts', '/workspace/harbor/src/routes/forecast.ts'],\n ticks: 20,\n },\n {\n type: 'text',\n text: 'The TTL is set once, in `src/lib/cache.ts`, to an hour. `routes/forecast.ts` passes it through unchanged.',\n },\n ];\n}\n\nfunction probe(title: string, input: string, output: string, paths: string[] = []): Step {\n return { type: 'tool', name: 'bash', title, input, output, paths, ticks: 12 };\n}\n\nfunction investigate(): Step[] {\n return [\n { type: 'thinking', text: 'Celsius requests return Fahrenheit. Follow one request through.' },\n probe(\n 'Read the error log',\n 'tail -n 3 /workspace/harbor/logs/worker.log',\n 'GET /forecast?city=Porto&unit=C 200 (cache hit)',\n ['/workspace/harbor/logs/worker.log']\n ),\n probe(\n 'Ask the API for Porto',\n 'curl -s https://api.example.com/v2/forecast?city=Porto&unit=C',\n '{ \"city\": \"Porto\", \"high\": 70, \"unit\": \"F\" }'\n ),\n probe(\n 'Find the cache key',\n 'rg -n \"cacheKey\" src',\n 'src/lib/cache.ts:9: const cacheKey = city;'\n ),\n probe('Read the cache', 'cat /workspace/harbor/src/lib/cache.ts', 'const cacheKey = city;', [\n '/workspace/harbor/src/lib/cache.ts',\n ]),\n probe('Check the working tree', 'git status --short', ' M src/lib/cache.ts'),\n probe('Clear the preview cache', 'wrangler kv key delete Porto --env preview', 'Deleted 1 key'),\n probe(\n 'Ask the API again',\n 'curl -s https://api.example.com/v2/forecast?city=Porto&unit=C',\n '{ \"city\": \"Porto\", \"high\": 21, \"unit\": \"C\" }'\n ),\n {\n type: 'text',\n text: 'The cache key is only the city, so a Fahrenheit answer is served to Celsius requests. The key needs the unit too.',\n },\n ];\n}\n\nconst repro = '/tmp/harbor-repro';\nconst cities = ['Porto', 'Lisbon', 'Faro', 'Braga', 'Coimbra', 'Evora', 'Aveiro', 'Leiria'];\n\nfunction heredoc(name: string, body: unknown): string {\n return `cat > ${name} <<'EOF' ${JSON.stringify(body)} EOF`;\n}\n\nfunction fixtures(dir: string): string {\n const days = cities.map((city, index) => ({\n city,\n unit: index % 2 ? 'F' : 'C',\n highs: [18 + index, 21 + index, 19 + index],\n cached: index % 3 === 0,\n }));\n return [\n `mkdir -p ${dir} && cd ${dir}`,\n heredoc('forecast-all.json', { schema: 2, provider: 'upstream', days }),\n heredoc('forecast-celsius.json', { schema: 2, days: days.filter((day) => day.unit === 'C') }),\n heredoc('cache-keys.json', { keys: cities.map((city) => ({ key: city, ttl: 3600 })) }),\n `jq -n --slurpfile all forecast-all.json --slurpfile keys cache-keys.json '$all[0].days | map({city, unit, key: ($keys[0].keys[] | select(.key == .city) | .key)})' > expected.json && wc -c *.json`,\n ].join(' && ');\n}\n\nfunction entries(): string {\n return cities\n .map(\n (city) =>\n `export const ${city.toLowerCase()} = { city: '${city}', key: cacheKey('${city}', 'C'), ttl: 3600 };`\n )\n .join('\\n');\n}\n\nfunction check(dir: string, city: string): string {\n return `cd ${dir} && jq -n --slurpfile all forecast-all.json '$all[0].days[] | select(.city == \"${city}\") | {city, unit, cached, high: (.highs | max)}' && grep -c \"cacheKey('${city}'\" ${repro}/cache-keys.ts`;\n}\n\nexport const leakyCommand = `curl -s https://api.example.com/v2/forecast?city=Porto -o ${repro}/porto.json && echo ${'#'.repeat(22)} gh${'p_harborexample0000'} && export HARBOR_API_KEY=sk-harbor-example-0000 && curl -s -H 'Authorization: Bearer eyJharbor.example' https://api.example.com/v2/me`;\n\nfunction leaky(): Step[] {\n return [\n {\n type: 'tool',\n name: 'bash',\n title: leakyCommand,\n input: leakyCommand,\n output: '{ \"user\": \"harbor\" }',\n paths: [],\n ticks: 20,\n streamed: true,\n },\n { type: 'text', text: 'Fetched Porto with the example credentials.' },\n ];\n}\n\nexport const replayLabel = 'Rebuild the cache-key fixtures for every city';\n\nfunction replay(): Step[] {\n const round = `${repro}/round2`;\n return [\n {\n type: 'thinking',\n text: 'The user wants long tool calls to reproduce a layout problem. Keep everything in a scratch folder so nothing real changes. First write a module with one cache entry per city, then a long command that writes fixtures and checks them with jq. After that, a long edit, a short check and a summary. Then a second round of separate calls, each waiting on the one before.',\n },\n {\n type: 'text',\n text: `Sure. I\u2019ll keep everything in \\`${repro}\\` so nothing real changes. The fixtures cover the cache key bug from the forecast worker, which gives long, realistic arguments.`,\n },\n {\n type: 'tool',\n name: 'write_file',\n title: `${repro}/cache-keys.ts`,\n input: entries(),\n output: `Wrote ${repro}/cache-keys.ts`,\n paths: [`${repro}/cache-keys.ts`],\n ticks: 30,\n },\n {\n type: 'tool',\n name: 'bash',\n title: fixtures(`${repro}/fixtures`),\n input: fixtures(`${repro}/fixtures`),\n output:\n ' 412 cache-keys.json\\n 1288 forecast-all.json\\n 655 forecast-celsius.json\\n 731 expected.json',\n paths: [],\n ticks: 20,\n streamed: true,\n },\n { type: 'turn' },\n {\n type: 'text',\n text: 'Now a long edit: the cache key gets the unit, and every city entry follows.',\n },\n {\n type: 'tool',\n name: 'edit_file',\n title: `${repro}/cache-keys.ts`,\n input: entries().replaceAll(\"'C')\", 'unit)'),\n output: 'Replaced 8 blocks',\n paths: [`${repro}/cache-keys.ts`],\n ticks: 25,\n },\n { type: 'turn' },\n {\n type: 'tool',\n name: 'bash',\n title: `cd ${repro} && wc -lc cache-keys.ts fixtures/*.json && grep -c \"cacheKey(\" cache-keys.ts`,\n input: `cd ${repro} && wc -lc cache-keys.ts fixtures/*.json && grep -c \"cacheKey(\" cache-keys.ts`,\n output: ' 8 611 cache-keys.ts\\n 1 1288 fixtures/forecast-all.json\\n8',\n paths: [],\n ticks: 15,\n streamed: true,\n },\n { type: 'turn' },\n {\n type: 'thinking',\n text: 'All four calls worked. Summarize them in a table, then say how to clean up.',\n },\n {\n type: 'text',\n text: `That was a thinking pass and four tool calls with long arguments. Everything is in \\`${repro}\\`.\\n\\n| Step | Tool | Argument |\\n| --- | --- | --- |\\n| 1 | write | a module with one cache entry per city |\\n| 2 | bash | one long command with three heredocs and a jq check |\\n| 3 | edit | the cache key gets the unit |\\n| 4 | bash | a short check of sizes and keys |\\n\\nWhen you\u2019re done, \\`rm -r ${repro}\\` removes everything.`,\n },\n { type: 'turn' },\n {\n type: 'text',\n text: `Round two: more calls, each one waiting on the last, all in \\`${round}\\`.`,\n },\n {\n type: 'tool',\n name: 'bash',\n title: fixtures(`${round}/fixtures`),\n input: fixtures(`${round}/fixtures`),\n output: ' 412 cache-keys.json\\n 1288 forecast-all.json',\n paths: [],\n ticks: 15,\n streamed: true,\n },\n ...cities.slice(0, 3).flatMap((city): Step[] => [\n { type: 'turn' },\n {\n type: 'tool',\n name: 'bash',\n title: check(`${round}/fixtures`, city),\n input: check(`${round}/fixtures`, city),\n output: `{ \"city\": \"${city}\", \"unit\": \"C\", \"cached\": true, \"high\": 23 }\\n1`,\n paths: [],\n ticks: 12,\n streamed: true,\n },\n ]),\n { type: 'turn' },\n {\n type: 'tool',\n name: 'write_file',\n title: `${round}/NOTES.md`,\n input: `# Round two\\n\\n${cities.map((city) => `- ${city}: key includes the unit`).join('\\n')}`,\n output: `Wrote ${round}/NOTES.md`,\n paths: [`${round}/NOTES.md`],\n ticks: 12,\n },\n { type: 'turn' },\n {\n type: 'thinking',\n text: 'Round two is done. Short summary.',\n },\n {\n type: 'text',\n text: `Round two is done: five calls, each one waiting on the last. The notes are in \\`${round}/NOTES.md\\`.`,\n },\n ];\n}\n\nconst labels: Record<string, string> = {\n 'Read the error log': 'Find why Celsius requests get Fahrenheit',\n 'Search for the cache expiry': 'Find and fix the stale cache entry',\n 'Count the routes': 'Walk through every kind of tool',\n 'Ask the API for Lisbon': 'Compare the docs with the live API',\n 'Switch the page to Celsius': 'Move the forecast docs to Celsius, then build and test the site',\n [fixtures(`${repro}/round2/fixtures`)]: replayLabel,\n};\n\nexport function label(title: string): string | null {\n return labels[title] ?? null;\n}\n\nfunction chat(prompt: string): Step[] {\n return [\n { type: 'thinking', text: 'Short question. Answer directly, then offer the next step.' },\n {\n type: 'tool',\n name: 'bash',\n title: 'Check the working tree',\n input: 'git status --short',\n output:\n ' M src/lib/cache.ts\\n M src/routes/forecast.ts\\n A src/lib/retry.ts\\n D src/legacy/xml.ts',\n paths: [],\n ticks: 12,\n },\n {\n type: 'text',\n text: `On \u201C${prompt.slice(0, 60)}\u201D: there are **4 uncommitted changes** in harbor, from me and quiet-otter. Review them in Changes, or ask me to run the tests, edit a file or open a page.`,\n },\n ];\n}\n\nfunction ask(): Step[] {\n return [\n { type: 'thinking', text: 'Two ways to do this. Ask before picking one.' },\n {\n type: 'part',\n part: {\n type: 'question',\n question: {\n id: `q-${Math.random().toString(36).slice(2, 8)}`,\n kind: 'choice',\n question: 'Where should the cache live once the TTL fix ships?',\n options: ['Keep it in memory', 'Move it to KV', 'Decide after the load test'],\n state: 'open',\n },\n },\n },\n ];\n}\n\nfunction look(attachments: readonly Attachment[]): Step[] {\n const names = attachments.map((attachment) => attachment.name).join(', ');\n const images = attachments.filter((attachment) => attachment.kind === 'image').length;\n return [\n {\n type: 'tool',\n name: 'read_file',\n title: `Read ${attachments.length === 1 ? 'the attachment' : `${attachments.length} attachments`}`,\n input: names,\n output: attachments\n .map(\n (attachment) => `${attachment.name} (${attachment.mimeType}, ${attachment.size} bytes)`\n )\n .join('\\n'),\n paths: [],\n ticks: 10,\n },\n {\n type: 'text',\n text: `Got **${names}**${images ? `, including ${images === 1 ? 'an image' : `${images} images`}` : ''}. I\u2019ll keep ${attachments.length === 1 ? 'it' : 'them'} in mind for the next step.`,\n },\n ];\n}\n\nconst suggestions: Array<[RegExp, string]> = [\n [/\\b(debug|investigate)\\b/, 'Add the unit to the cache key'],\n [/\\btests?\\b/, 'Open a pull request with the fix'],\n [/\\b(fix|edit|add|change)\\b/, 'Run the tests'],\n [/\\b(open|browse|page|docs)\\b/, 'Summarize the page'],\n [/\\b(files?|read|show|project)\\b/, 'Add a Kelvin helper to units.ts'],\n];\n\nexport function script(\n prompt: string,\n attachments: readonly Attachment[] = []\n): { steps: Step[]; suggestion: string } {\n const text = prompt.toLowerCase();\n const suggestion = suggestions.find(([pattern]) => pattern.test(text))?.[1] ?? 'Run the tests';\n if (attachments.length > 0) return { steps: look(attachments), suggestion };\n if (/\\bforbidden\\b/.test(text)) return { steps: filtered(), suggestion };\n if (/\\breplay\\b/.test(text)) return { steps: replay(), suggestion };\n if (/\\bleaky\\b/.test(text)) return { steps: leaky(), suggestion };\n if (/\\b(ask|choose|decide)\\b/.test(text)) return { steps: ask(), suggestion };\n if (/\\b(debug|investigate)\\b/.test(text)) return { steps: investigate(), suggestion };\n if (/\\b(search|grep)\\b/.test(text)) return { steps: search(), suggestion };\n if (/\\b(256|truecolou?r)\\b/.test(text)) return { steps: extendedColours(), suggestion };\n if (/\\bcolou?rs?\\b/.test(text)) return { steps: colours(), suggestion };\n if (/\\btests?\\b/.test(text)) return { steps: test(), suggestion };\n if (/\\b(fix|edit|add|change)\\b/.test(text)) return { steps: edit(), suggestion };\n if (/\\b(open|browse|page|docs)\\b/.test(text)) return { steps: browse(), suggestion };\n if (/\\b(files?|read|show|project)\\b/.test(text)) return { steps: files(), suggestion };\n return { steps: chat(prompt), suggestion };\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n Agent,\n AgentEvents,\n AgentHold,\n AgentPort,\n AgentStatus,\n AssistantMessage,\n DeliveredAs,\n FrozenCone,\n LickChannel,\n LickState,\n Message,\n MessagePart,\n Outgoing,\n SlashCommand,\n Thinking,\n ToolCall,\n UserMessage,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { type Effects, label, type Step, script } from './script.ts';\n\nfunction firstLine(text: string): string {\n return text.split('\\n')[0] as string;\n}\n\ninterface Run {\n stopped: boolean;\n steers: Outgoing[];\n pace: number;\n}\n\nconst paced = new Map<string, number>([['cone-kitchen', 20_000]]);\n\nfunction chunks(text: string): string[] {\n return text.match(/\\S+\\s*|\\s+/g) ?? [];\n}\n\nconst burst = 120;\nconst stride = 30;\n\nfunction ticks(steps: readonly Step[]): number {\n return steps.reduce((sum, step) => {\n if (step.type === 'turn') return sum;\n if (step.type === 'tool')\n return sum + step.ticks + (step.streamed ? Math.ceil(step.title.length / burst) * stride : 0);\n if (step.type === 'part') return sum + 2;\n return sum + chunks(step.text).length;\n }, 0);\n}\n\nfunction outgoing(input: string | Outgoing): Outgoing {\n return typeof input === 'string' ? { text: input } : input;\n}\n\nexport class DummyAgent extends Emitter<AgentEvents> implements AgentPort {\n #agents: Agent[];\n #messages = new Map<string, Message[]>();\n #queues = new Map<string, UserMessage[]>();\n #frozen: FrozenCone[] = [];\n #hold: AgentHold | null = null;\n #readOnly: string | null = null;\n #starting: string | null = null;\n #absent: Agent[] = [];\n #arrival = 0;\n #ice = new Map<string, Array<{ agent: Agent; messages: Message[] }>>();\n #suggestions = new Map<string, string>();\n #runs = new Map<string, Run>();\n #active: string;\n #clock: Clock;\n #effects: Omit<Effects, 'agentId'>;\n #next = 1;\n #cones = 1;\n #chats = 1;\n #thaws = 1;\n declare importProfile?: AgentPort['importProfile'];\n declare importCancel?: AgentPort['importCancel'];\n declare importing?: AgentPort['importing'];\n\n constructor(\n agents: readonly Agent[],\n conversations: Record<string, readonly Message[]>,\n effects: Omit<Effects, 'agentId'>,\n clock: Clock,\n queues: Record<string, readonly UserMessage[]> = {},\n frozen: ReadonlyArray<{ cone: FrozenCone; messages: readonly Message[] }> = []\n ) {\n super();\n this.#clock = clock;\n this.#effects = effects;\n this.#agents = agents.map((agent) => ({ ...agent }));\n for (const agent of this.#agents) {\n this.#messages.set(agent.id, structuredClone([...(conversations[agent.id] ?? [])]));\n this.#queues.set(agent.id, structuredClone([...(queues[agent.id] ?? [])]));\n }\n this.#active = this.#agents[0]?.id ?? '';\n for (const { cone, messages } of frozen) this.#store(cone, messages);\n }\n\n #store(cone: FrozenCone, messages: readonly Message[]): void {\n this.#frozen.push({ ...cone });\n this.#ice.set(cone.id, [\n {\n agent: {\n id: cone.id,\n name: cone.name,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: cone.model,\n contextFill: 0.2,\n unread: 0,\n },\n messages: structuredClone([...messages]),\n },\n ]);\n }\n\n addFrozen(rows: ReadonlyArray<{ cone: FrozenCone; messages: readonly Message[] }>): void {\n for (const { cone, messages } of rows) this.#store(cone, messages);\n this.emit('frozen', this.frozen());\n }\n\n list(): readonly Agent[] {\n return this.#agents.map((agent) => ({ ...agent }));\n }\n\n active(): string {\n return this.#active;\n }\n\n #agent(id: string): Agent | undefined {\n return this.#agents.find((agent) => agent.id === id);\n }\n\n #changed(): void {\n this.emit('agents', this.list());\n }\n\n #id(prefix: string): string {\n return `${prefix}-${this.#next++}`;\n }\n\n select(id: string): void {\n const agent = this.#agent(id);\n if (!agent) return;\n this.#active = id;\n agent.unread = 0;\n this.emit('active', id);\n this.#changed();\n }\n\n messages(agentId: string): readonly Message[] {\n return [...(this.#messages.get(agentId) ?? [])];\n }\n\n queue(agentId: string): readonly UserMessage[] {\n return [...(this.#queues.get(agentId) ?? [])];\n }\n\n busy(agentId: string): boolean {\n return this.#runs.has(agentId);\n }\n\n suggestion(agentId: string): string | null {\n return this.#suggestions.get(agentId) ?? null;\n }\n\n #call(agentId: string, id: string): ToolCall | undefined {\n for (const message of this.#messages.get(agentId) ?? []) {\n if (message.role === 'tool' && message.tool.id === id) return message.tool;\n if (message.role !== 'assistant') continue;\n for (const part of message.parts)\n if (part.type === 'tool' && part.tool.id === id) return part.tool;\n }\n return undefined;\n }\n\n async toolLabel(agentId: string, callIds: readonly string[]): Promise<string | null> {\n await this.#clock.sleep(15);\n const first = this.#call(agentId, callIds[0] ?? '');\n return first ? label(first.title) : null;\n }\n\n #post(agentId: string, message: Message): void {\n this.#messages.get(agentId)?.push(message);\n this.emit('message', { agentId, message });\n }\n\n #status(agentId: string, status: AgentStatus): void {\n const agent = this.#agent(agentId);\n if (!agent || agent.status === status) return;\n agent.status = status;\n this.#changed();\n }\n\n #pace(agentId: string, steps: readonly Step[]): number {\n const budget = paced.get(agentId);\n const total = ticks(steps);\n if (!budget || !total) return 1;\n return budget / (total * this.#clock.delay);\n }\n\n async #stream(\n agentId: string,\n reply: AssistantMessage,\n part: { text: string },\n text: string,\n run: Run\n ): Promise<void> {\n for (const chunk of chunks(text)) {\n await this.#clock.sleep(run.pace);\n if (run.stopped) return;\n part.text += chunk;\n this.emit('message', { agentId, message: reply });\n }\n }\n\n async #tool(\n agentId: string,\n reply: AssistantMessage,\n step: Extract<Step, { type: 'tool' }>,\n run: Run\n ): Promise<void> {\n this.#status(agentId, 'working');\n const tool = {\n id: this.#id('t'),\n name: step.name,\n title: step.streamed ? '' : step.title,\n input: step.streamed ? '' : step.input,\n output: '',\n status: 'running' as const,\n paths: step.paths,\n };\n reply.parts.push({ type: 'tool', tool });\n this.emit('message', { agentId, message: reply });\n const streamed = step.streamed ? step.title : '';\n for (let at = burst; at < streamed.length + burst && !run.stopped; at += burst) {\n await this.#clock.sleep(stride * run.pace);\n tool.title = streamed.slice(0, at).trimEnd();\n this.emit('message', { agentId, message: reply });\n }\n tool.input = step.input;\n const chunks = step.chunks ?? [];\n for (const chunk of chunks) {\n await this.#clock.sleep((step.ticks / (chunks.length + 1)) * run.pace);\n if (run.stopped) break;\n tool.output += chunk;\n this.emit('message', { agentId, message: reply });\n }\n await this.#clock.sleep((step.ticks / (chunks.length + 1)) * run.pace);\n const done = run.stopped\n ? { status: 'cancelled' as const, output: 'Stopped' }\n : { status: 'done' as const, output: step.output };\n if (!run.stopped) await step.effect?.({ ...this.#effects, agentId });\n Object.assign(tool, done);\n this.emit('message', { agentId, message: reply });\n }\n\n #turn(agentId: string, reply: AssistantMessage, model: string): AssistantMessage {\n reply.status = 'done';\n this.emit('message', { agentId, message: reply });\n const next = this.#reply(model);\n this.#post(agentId, next);\n return next;\n }\n\n async #step(\n agentId: string,\n reply: AssistantMessage,\n step: Exclude<Step, { type: 'turn' }>,\n run: Run\n ): Promise<void> {\n if (step.type === 'tool') return this.#tool(agentId, reply, step, run);\n if (step.type === 'part') {\n await this.#clock.sleep(2 * run.pace);\n if (run.stopped) return;\n reply.parts.push(structuredClone(step.part) as MessagePart);\n this.emit('message', { agentId, message: reply });\n return;\n }\n this.#status(agentId, 'thinking');\n const part = { type: step.type, text: '' };\n reply.parts.push(part);\n await this.#stream(agentId, reply, part, step.text, run);\n }\n\n #enqueue(agentId: string, input: Outgoing): void {\n const message: UserMessage = {\n id: this.#id('q'),\n role: 'user',\n text: input.text.trim(),\n createdAt: Date.now(),\n queued: true,\n mode: 'queue',\n ...(input.attachments?.length ? { attachments: input.attachments } : {}),\n };\n this.#queues.set(agentId, [...this.queue(agentId), message]);\n this.emit('messages', agentId);\n }\n\n unqueue(agentId: string, messageId: string): void {\n this.#queues.set(\n agentId,\n this.queue(agentId).filter((message) => message.id !== messageId)\n );\n this.emit('messages', agentId);\n }\n\n #user(message: Outgoing, delivered: DeliveredAs): UserMessage {\n return {\n id: this.#id('m'),\n role: 'user',\n text: message.text.trim(),\n createdAt: Date.now(),\n delivered,\n ...(delivered === 'steer' ? { mode: 'steer' as const } : {}),\n ...(message.attachments?.length ? { attachments: message.attachments } : {}),\n };\n }\n\n #reply(model: string): AssistantMessage {\n return {\n id: this.#id('m'),\n role: 'assistant',\n parts: [],\n status: 'streaming',\n createdAt: Date.now(),\n model,\n };\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const message = outgoing(input);\n if (!this.#agent(agentId) || (!message.text.trim() && !message.attachments?.length)) return;\n const run = this.#runs.get(agentId);\n if (run && message.mode === 'queue') {\n this.#enqueue(agentId, message);\n return;\n }\n if (run) {\n run.steers.push(message);\n return;\n }\n await this.#run(agentId, message, 'run');\n }\n\n async #run(agentId: string, message: Outgoing, delivered: DeliveredAs): Promise<void> {\n const agent = this.#agent(agentId) as Agent;\n const prompt = message.text.trim();\n this.#suggestions.delete(agentId);\n const run: Run = { stopped: false, steers: [], pace: 1 };\n this.#runs.set(agentId, run);\n this.#post(agentId, this.#user(message, delivered));\n let reply = this.#reply(agent.model);\n this.#post(agentId, reply);\n let { steps, suggestion } = script(prompt, message.attachments ?? []);\n run.pace = this.#pace(agentId, steps);\n while (steps.length && !run.stopped) {\n const step = steps[0] as Step;\n if (step.type === 'turn') reply = this.#turn(agentId, reply, agent.model);\n else await this.#step(agentId, reply, step, run);\n steps = steps.slice(1);\n if (run.steers.length && !run.stopped && steps.length) {\n reply.status = 'done';\n this.emit('message', { agentId, message: reply });\n const steers = run.steers.splice(0);\n for (const steer of steers) this.#post(agentId, this.#user(steer, 'steer'));\n const latest = steers.at(-1) as Outgoing;\n ({ steps, suggestion } = script(latest.text.trim(), latest.attachments ?? []));\n run.pace = this.#pace(agentId, steps);\n reply = this.#reply(agent.model);\n this.#post(agentId, reply);\n }\n }\n reply.status = run.stopped\n ? 'stopped'\n : reply.parts.some((item) => item.type === 'error')\n ? 'error'\n : 'done';\n reply.usage = {\n input: 1200 + prompt.length * 4,\n output: 180 + reply.parts.length * 60,\n cost: 0.004,\n };\n if (this.#runs.get(agentId) === run) this.#runs.delete(agentId);\n agent.contextFill = Math.min(0.95, Math.round((agent.contextFill + 0.03) * 100) / 100);\n if (agentId !== this.#active) agent.unread += 1;\n if (!run.stopped) this.#suggestions.set(agentId, suggestion);\n this.emit('message', { agentId, message: reply });\n agent.status = 'idle';\n this.#changed();\n const late = run.steers.splice(0);\n if (run.stopped) {\n for (const steer of late) this.#enqueue(agentId, steer);\n } else if (late.length) {\n const last = late.pop() as Outgoing;\n for (const steer of late) this.#post(agentId, this.#user(steer, 'steer'));\n await this.#run(agentId, last, 'steer');\n return;\n }\n await this.#drain(agentId);\n }\n\n async #drain(agentId: string): Promise<void> {\n if (this.busy(agentId)) return;\n const [next, ...rest] = this.queue(agentId);\n if (!next) return;\n this.#queues.set(agentId, rest);\n this.emit('messages', agentId);\n await this.#run(agentId, { text: next.text, attachments: next.attachments }, 'follow-up');\n }\n\n stop(agentId: string): void {\n const run = this.#runs.get(agentId);\n if (run) run.stopped = true;\n this.#runs.delete(agentId);\n }\n\n #find(agentId: string, test: (message: Message) => boolean): Message | undefined {\n return this.#messages.get(agentId)?.find(test);\n }\n\n answer(agentId: string, questionId: string, answer: string): void {\n const message = this.#find(\n agentId,\n (candidate) =>\n candidate.role === 'assistant' &&\n candidate.parts.some((part) => part.type === 'question' && part.question.id === questionId)\n ) as AssistantMessage | undefined;\n if (!message) return;\n for (const part of message.parts) {\n if (part.type === 'question' && part.question.id === questionId) {\n part.question.state = 'answered';\n part.question.answer = answer;\n }\n }\n this.emit('message', { agentId, message });\n }\n\n resolveLick(agentId: string, messageId: string, state: Exclude<LickState, 'pending'>): void {\n const message = this.#find(agentId, (candidate) => candidate.id === messageId);\n if (message?.role !== 'lick') return;\n message.state = state;\n this.emit('message', { agentId, message });\n }\n\n compact(agentId: string): void {\n const agent = this.#agent(agentId);\n if (!agent) return;\n const message: Message = {\n id: this.#id('m'),\n role: 'system',\n kind: 'compaction',\n title: 'Context compacted',\n text: 'Summarizing the conversation so far\u2026',\n trigger: 'manual',\n state: 'summarizing',\n createdAt: Date.now(),\n };\n this.#post(agentId, message);\n void this.#clock.sleep(20).then(() => {\n Object.assign(message, {\n state: 'summarized',\n text: 'The earlier conversation was summarized to free up context.',\n });\n agent.contextFill = 0.06;\n this.emit('message', { agentId, message });\n this.#changed();\n });\n }\n\n async rewind(agentId: string, messageId: string): Promise<Outgoing | null> {\n const messages = this.#messages.get(agentId);\n const at = messages?.findIndex((message) => message.id === messageId) ?? -1;\n if (!messages || at < 0) return null;\n const turn = messages.slice(0, at).findLastIndex((message) => message.role === 'user');\n if (turn < 0) return null;\n const user = messages[turn] as UserMessage;\n const turns = messages.splice(turn).filter((message) => message.role === 'user').length;\n messages.push({\n id: `rewound-${Date.now()}`,\n role: 'system',\n kind: 'notice',\n title: turns === 1 ? 'Rewound 1 turn' : `Rewound ${turns} turns`,\n text:\n turns === 1\n ? 'Its prompt is back in the composer.'\n : 'The latest prompt is back in the composer.',\n createdAt: Date.now(),\n });\n this.emit('messages', agentId);\n return { text: user.text, ...(user.attachments ? { attachments: user.attachments } : {}) };\n }\n\n clear(agentId: string): void {\n if (!this.#messages.has(agentId)) return;\n this.#runs.get(agentId)?.steers.splice(0);\n this.stop(agentId);\n const agent = this.#agent(agentId) as Agent;\n const messages = this.#messages.get(agentId) as Message[];\n if (agent.kind === 'cone' && messages.length) this.#shelve(agent, messages);\n this.#messages.set(agentId, []);\n this.#queues.set(agentId, []);\n this.#suggestions.delete(agentId);\n this.emit('messages', agentId);\n }\n\n #shelve(agent: Agent, messages: Message[]): void {\n const id = `${agent.id}-chat-${this.#chats++}`;\n const first = messages.find((message) => message.role === 'user');\n this.#frozen.unshift({\n id,\n kind: 'cone',\n name: agent.name,\n title: first?.role === 'user' ? firstLine(first.text) : agent.name,\n model: agent.model,\n messages: messages.length,\n frozenAt: Date.now(),\n });\n this.#ice.set(id, [{ agent: { ...agent, id, status: 'idle', unread: 0 }, messages }]);\n this.emit('frozen', this.frozen());\n }\n\n setModel(agentId: string, model: string): void {\n const agent = this.#agent(agentId);\n if (!agent) return;\n agent.model = model;\n this.#changed();\n }\n\n setThinking(agentId: string, thinking: Thinking): void {\n const agent = this.#agent(agentId);\n if (!agent) return;\n agent.thinking = thinking;\n this.#changed();\n }\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n commands(agentId: string): readonly SlashCommand[] {\n if (this.#agent(agentId)?.kind !== 'cone') return [];\n return [\n { name: 'review', description: 'Review the open changes for mistakes', kind: 'prompt' },\n { name: 'skill:pdf', description: 'Read, fill and merge PDF files', kind: 'skill' },\n ];\n }\n\n async ready(): Promise<void> {}\n\n createScoop(parentId: string, name: string): Agent {\n const parent = this.#agent(parentId);\n const agent: Agent = {\n id: this.#id('scoop'),\n name,\n kind: 'scoop',\n parentId: parent?.kind === 'cone' ? parent.id : (parent?.parentId ?? null),\n status: 'idle',\n model: parent?.model ?? 'claude-haiku-4-5',\n contextFill: 0,\n unread: 0,\n };\n this.#agents.push(agent);\n this.#messages.set(agent.id, []);\n if (parent) {\n this.#post(parentId, {\n id: this.#id('m'),\n role: 'lick',\n channel: 'scoop-idle',\n title: name,\n text: 'New scoop, waiting for its first task',\n createdAt: Date.now(),\n });\n }\n this.#changed();\n return { ...agent };\n }\n\n async drop(agentId: string): Promise<void> {\n const agent = this.#agent(agentId);\n if (agent?.kind !== 'scoop') throw new Error('Only scoops can be dropped');\n this.stop(agentId);\n this.#agents = this.#agents.filter((candidate) => candidate !== agent);\n this.#messages.delete(agentId);\n this.#queues.delete(agentId);\n this.#suggestions.delete(agentId);\n if (this.#active === agentId) this.select(agent.parentId ?? (this.#agents[0] as Agent).id);\n this.#changed();\n }\n\n async createCone(name: string): Promise<Agent> {\n const trimmed = name.trim();\n if (!trimmed) throw new Error('A cone needs a name');\n if (this.#agents.some((agent) => agent.kind === 'cone' && agent.name === trimmed)) {\n throw new Error(`A cone named ${trimmed} already exists`);\n }\n const agent: Agent = {\n id: `cone-${this.#cones++}`,\n name: trimmed,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0,\n unread: 0,\n };\n this.#agents.push(agent);\n this.#messages.set(agent.id, []);\n this.#queues.set(agent.id, []);\n this.#changed();\n return { ...agent };\n }\n\n lick(agentId: string, channel: LickChannel, title: string, text: string, body?: string): void {\n if (!this.#agent(agentId)) return;\n this.#post(agentId, {\n id: this.#id('m'),\n role: 'lick',\n channel,\n title,\n text,\n createdAt: Date.now(),\n ...(body ? { body } : {}),\n });\n }\n\n hold(): AgentHold | null {\n return this.#hold && { ...this.#hold };\n }\n\n setHold(hold: AgentHold | null): void {\n this.#hold = hold && { ...hold };\n this.emit('hold', this.hold());\n }\n\n readOnly(): string | null {\n return this.#readOnly;\n }\n\n setReadOnly(text: string | null): void {\n this.#readOnly = text || null;\n this.emit('readOnly', this.#readOnly);\n }\n\n starting(): string | null {\n return this.#starting;\n }\n\n setStarting(line: string | null): void {\n this.#arrival++;\n this.#starting = line || null;\n this.emit('starting', this.#starting);\n }\n\n withhold(line: string, ticks?: number): void {\n this.#absent = [...this.#absent, ...this.#agents];\n this.#agents = [];\n this.#active = '';\n this.#changed();\n this.setStarting(line);\n if (ticks === undefined) return;\n const arrival = this.#arrival;\n void this.#clock.sleep(ticks).then(() => {\n if (arrival === this.#arrival) this.arrive();\n });\n }\n\n arrive(): void {\n this.#agents = [...this.#agents, ...this.#absent];\n this.#absent = [];\n this.#active = this.#agents[0]?.id ?? '';\n this.#changed();\n this.emit('active', this.#active);\n this.setStarting(null);\n }\n\n frozen(): readonly FrozenCone[] {\n const live = this.#agents\n .filter((agent) => !agent.frozen)\n .map((agent): FrozenCone => {\n const messages = this.#messages.get(agent.id) as Message[];\n const first = messages.find((message) => message.role === 'user');\n return {\n id: agent.id,\n kind: agent.kind,\n live: true,\n name: agent.name,\n title: first?.role === 'user' ? firstLine(first.text) : agent.name,\n model: agent.model,\n messages: messages.length,\n frozenAt: messages.at(-1)?.createdAt ?? 0,\n };\n });\n return [...live, ...this.#frozen.map((cone) => ({ ...cone }))];\n }\n\n freeze(agentId: string): void {\n const agent = this.#agent(agentId);\n if (agent?.kind !== 'cone' || agent.frozen) return;\n this.stop(agentId);\n const family = this.#agents.filter(\n (candidate) => candidate.id === agentId || candidate.parentId === agentId\n );\n const messages = this.#messages.get(agentId) ?? [];\n const first = messages.find((message) => message.role === 'user');\n this.#frozen.unshift({\n id: agentId,\n kind: 'cone',\n name: agent.name,\n title: first?.role === 'user' ? firstLine(first.text) : agent.name,\n model: agent.model,\n messages: messages.length,\n frozenAt: Date.now(),\n });\n this.#ice.set(\n agentId,\n family.map((member) => ({\n agent: { ...member, status: 'idle' as const },\n messages: this.#messages.get(member.id) as Message[],\n }))\n );\n for (const member of family) this.stop(member.id);\n this.#agents = this.#agents.filter((candidate) => !family.includes(candidate));\n for (const member of family) this.#messages.delete(member.id);\n if (this.#active === agentId) this.#active = this.#agents[0]?.id ?? '';\n this.emit('frozen', this.frozen());\n this.emit('active', this.#active);\n this.#changed();\n }\n\n thaw(id: string): Agent | null {\n const ice = this.#ice.get(id);\n if (!ice) {\n const agent = this.#agent(id);\n if (!agent?.frozen) return null;\n delete agent.frozen;\n this.#changed();\n return { ...agent };\n }\n const row = this.#frozen.find((cone) => cone.id === id) as FrozenCone;\n if (row.kind === 'scoop' || row.kind === 'agent') {\n const [{ agent, messages }] = ice as [{ agent: Agent; messages: Message[] }];\n const fork: Agent = {\n ...agent,\n id: `${id}-thaw-${this.#thaws++}`,\n kind: 'cone',\n parentId: null,\n };\n this.#agents.push(fork);\n this.#messages.set(fork.id, structuredClone(messages));\n this.#queues.set(fork.id, []);\n row.thawedAs = fork.id;\n this.emit('frozen', this.frozen());\n this.select(fork.id);\n return { ...fork };\n }\n this.#ice.delete(id);\n this.#frozen = this.#frozen.filter((cone) => cone.id !== id);\n for (const { agent, messages } of ice) {\n this.#agents.push(agent);\n this.#messages.set(agent.id, messages);\n this.#queues.set(agent.id, []);\n }\n this.emit('frozen', this.frozen());\n this.select(id);\n return { ...ice[0].agent };\n }\n\n discard(id: string): void {\n this.#ice.delete(id);\n this.#frozen = this.#frozen.filter((cone) => cone.id !== id);\n this.emit('frozen', this.frozen());\n }\n}\n", "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Suggestions</title>\n\n <link rel=\"icon\" href=\"ice-cream-cone\" />\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n body {\n font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif);\n background: transparent;\n color: var(--s2-content-default, #e8e8e8);\n padding: 14px 18px 20px;\n }\n\n #gelatiereStream[hidden] { display: none; }\n\n .gelatiere-entry { padding: 18px 0; }\n .gelatiere-entry:first-child { padding-top: 2px; }\n .gelatiere-entry + .gelatiere-entry,\n .gelatiere-done {\n border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));\n }\n\n .gelatiere-entry__head {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n line-height: 1.35;\n color: var(--s2-content-default, #e8e8e8);\n }\n\n .gelatiere-entry__head :is(i, svg) { width: 15px; height: 15px; flex-shrink: 0; }\n .gelatiere-entry__title { flex: 1; }\n .gelatiere-kind {\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--s2-content-tertiary, #8a8a8a);\n white-space: nowrap;\n }\n\n .gelatiere-why {\n margin-top: 6px;\n font-size: 12px;\n line-height: 1.55;\n color: var(--s2-content-secondary, #a1a1a1);\n }\n .gelatiere-cmd {\n margin-top: 8px;\n font-size: 11px;\n color: var(--s2-content-tertiary, #8a8a8a);\n overflow-wrap: anywhere;\n }\n .gelatiere-cmd code,\n .gelatiere-why code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n }\n\n .gelatiere-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 14px;\n margin-top: 12px;\n }\n .gelatiere-actions .gelatiere-taken-note { margin-right: auto; }\n\n .gelatiere-quiet-btn {\n background: none;\n border: none;\n font-family: inherit;\n font-size: 12px;\n color: var(--s2-content-tertiary, #8a8a8a);\n cursor: pointer;\n padding: 4px 0;\n }\n .gelatiere-quiet-btn:hover { color: var(--s2-content-secondary, #a1a1a1); }\n\n .gelatiere-empty { padding: 2px 0 4px; }\n .gelatiere-explore {\n margin-top: 18px;\n padding-top: 14px;\n border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));\n }\n .gelatiere-explore__link {\n display: block;\n padding: 10px 0;\n text-decoration: none;\n color: inherit;\n }\n .gelatiere-explore__link + .gelatiere-explore__link {\n border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));\n }\n .gelatiere-explore__link:hover .gelatiere-entry__title { text-decoration: underline; }\n\n .gelatiere-entry--taken .gelatiere-entry__head,\n .gelatiere-entry--taken .gelatiere-why,\n .gelatiere-entry--taken .gelatiere-cmd { opacity: 0.6; }\n .gelatiere-taken-note {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--s2-content-positive, #2d9d78);\n }\n .gelatiere-taken-note :is(i, svg) { width: 14px; height: 14px; flex-shrink: 0; }\n\n .gelatiere-done { margin-top: 6px; padding-top: 14px; }\n .gelatiere-done-title {\n padding-bottom: 6px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--s2-content-tertiary, #8a8a8a);\n }\n .gelatiere-done-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 12px;\n color: var(--s2-content-secondary, #a1a1a1);\n }\n .gelatiere-done-row :is(i, svg) {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n color: var(--s2-content-positive, #2d9d78);\n }\n .gelatiere-done-row .gelatiere-done-title-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .gelatiere-done-row .gelatiere-done-what {\n color: var(--s2-content-tertiary, #8a8a8a);\n white-space: nowrap;\n }\n </style>\n </head>\n <body>\n\n <div id=\"gelatiereStream\" hidden></div>\n\n <script>\n\n var GELATIERE_SUGGESTIONS_PATH = '/shared/.gelatiere/suggestions.json';\n\n var KIND_LABELS = {\n 'skill': { label: 'Skill', icon: 'package', action: 'Install', done: 'installed' },\n 'use-case': { label: 'Try this', icon: 'sparkles', action: 'Try it', done: 'tried' },\n 'tip': { label: 'Tip', icon: 'lightbulb', action: null, done: 'tried' },\n 'skill-idea': { label: 'New skill', icon: 'wand-sparkles', action: 'Draft it', done: 'drafted' },\n 'issue': { label: 'Report', icon: 'bug', action: 'Report it', done: 'reported' },\n };\n\n var USE_CASE_COMMAND = 'gelatiere use-cases --limit 3 --json';\n var USE_CASE_CACHE_MS = 12 * 60 * 60 * 1000;\n var EMPTY_HEADLINE = 'Nothing here yet';\n var EMPTY_BODY =\n 'The gelatiere reads how you actually work, nightly and after each chat ' +\n 'ends, and leaves what it finds here: a skill worth installing, a use ' +\n 'case worth trying, a habit worth changing. Check back after your next session.';\n\n function el(tag, className, text) {\n var node = document.createElement(tag);\n if (className) node.className = className;\n if (text != null) node.textContent = text;\n return node;\n }\n\n function lucide(name) {\n var ic = document.createElement('i');\n ic.setAttribute('data-lucide', name);\n return ic;\n }\n\n function gelatierePrimaryButton(label, onClick) {\n var btn = el('button', 'sprinkle-btn sprinkle-btn--primary', label);\n btn.type = 'button';\n btn.onclick = onClick;\n return btn;\n }\n\n function gelatiereQuietButton(label, onClick, title) {\n var btn = el('button', 'gelatiere-quiet-btn', label);\n btn.type = 'button';\n if (title) btn.title = title;\n btn.onclick = onClick;\n return btn;\n }\n\n function buildSuggestionCard(s) {\n var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;\n var card = el('div', 'gelatiere-entry');\n card.dataset.id = s.id;\n\n var head = el('div', 'gelatiere-entry__head');\n head.appendChild(lucide(meta.icon));\n head.appendChild(el('span', 'gelatiere-entry__title', s.title));\n head.appendChild(el('span', 'gelatiere-kind', meta.label));\n card.appendChild(head);\n\n card.appendChild(el('div', 'gelatiere-why', s.body));\n if (s.install) {\n var install = el('div', 'gelatiere-cmd');\n install.appendChild(document.createTextNode('Installs '));\n install.appendChild(el('code', null, s.install));\n card.appendChild(install);\n }\n\n var actions = el('div', 'gelatiere-actions');\n\n function markTaken(note) {\n card.classList.add('gelatiere-entry--taken');\n var done = el('div', 'gelatiere-taken-note');\n done.appendChild(lucide('check'));\n done.appendChild(document.createTextNode(note));\n actions.replaceChildren(done);\n if (window.LucideIcons) window.LucideIcons.render();\n }\n\n actions.appendChild(gelatiereQuietButton('Dismiss', function () {\n if (window.slicc) slicc.lick({ action: 'gelatiere-dismiss', data: { id: s.id } });\n card.remove();\n if (!document.querySelector('.gelatiere-entry')) renderGelatiereCaughtUp();\n }, \"that's not for me\"));\n if (s.kind === 'skill') {\n actions.appendChild(gelatierePrimaryButton(meta.action, function () {\n if (window.slicc) slicc.lick({ action: 'gelatiere-install',\n data: { id: s.id, skill: s.skill || null, install: s.install || null, title: s.title } });\n markTaken('Installing. The cone is on it.');\n }));\n } else if (meta.action && s.prompt) {\n actions.appendChild(gelatierePrimaryButton(meta.action, function () {\n if (window.slicc) slicc.lick({ action: 'gelatiere-try',\n data: { id: s.id, prompt: s.prompt, title: s.title } });\n markTaken('Sent to the cone. Watch the chat.');\n }));\n } else if (s.url && /^https?:\\/\\//i.test(s.url)) {\n\n var link = el('a', 'gelatiere-quiet-btn', 'Read more');\n link.href = s.url;\n link.target = '_blank';\n link.rel = 'noopener';\n actions.appendChild(link);\n }\n card.appendChild(actions);\n return card;\n }\n\n var DONE_LEDGER_LIMIT = 5;\n function buildDoneLedger(taken) {\n var wrap = el('div', 'gelatiere-done');\n wrap.appendChild(el('div', 'gelatiere-done-title', 'Done'));\n taken.slice(0, DONE_LEDGER_LIMIT).forEach(function (s) {\n var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;\n var row = el('div', 'gelatiere-done-row');\n row.appendChild(lucide('check'));\n row.appendChild(el('span', 'gelatiere-done-title-text', s.title));\n row.appendChild(el('span', 'gelatiere-done-what', meta.done));\n wrap.appendChild(row);\n });\n return wrap;\n }\n\n function readCachedUseCases() {\n try {\n var saved = window.slicc && slicc.getState && slicc.getState();\n if (!saved || !saved.useCases || !saved.fetchedAt) return null;\n if (Date.now() - saved.fetchedAt > USE_CASE_CACHE_MS) return null;\n return saved.useCases;\n } catch (e) { return null; }\n }\n\n function loadUseCases() {\n var cached = readCachedUseCases();\n if (cached) return Promise.resolve(cached);\n if (!window.slicc || typeof slicc.exec !== 'function') return Promise.resolve([]);\n return Promise.resolve(slicc.exec(USE_CASE_COMMAND)).then(function (result) {\n if (!result || result.exitCode !== 0) return [];\n var parsed = JSON.parse(result.stdout);\n if (!Array.isArray(parsed)) return [];\n var cases = parsed.filter(function (c) { return c && c.url && c.title; });\n try { slicc.setState({ fetchedAt: Date.now(), useCases: cases }); } catch (e) {}\n return cases;\n }, function () { return []; });\n }\n\n function appendUseCases(stream) {\n loadUseCases().then(function (cases) {\n if (!cases.length || !stream.isConnected) return;\n var wrap = el('div', 'gelatiere-explore');\n wrap.appendChild(el('div', 'gelatiere-done-title', 'Meanwhile, from sliccy.com'));\n cases.forEach(function (c) {\n var link = el('a', 'gelatiere-explore__link');\n link.href = c.url;\n link.target = '_blank';\n link.rel = 'noopener';\n var head = el('div', 'gelatiere-entry__head');\n head.appendChild(el('span', 'gelatiere-entry__title', c.title));\n head.appendChild(lucide('arrow-up-right'));\n link.appendChild(head);\n if (c.description) link.appendChild(el('div', 'gelatiere-why', c.description));\n wrap.appendChild(link);\n });\n stream.appendChild(wrap);\n if (window.LucideIcons) window.LucideIcons.render();\n });\n }\n\n function renderGelatiereEmpty(headline, body) {\n var stream = document.getElementById('gelatiereStream');\n stream.innerHTML = '';\n var empty = el('div', 'gelatiere-empty');\n var head = el('div', 'gelatiere-entry__head');\n head.appendChild(lucide('ice-cream-cone'));\n head.appendChild(el('span', 'gelatiere-entry__title', headline));\n empty.appendChild(head);\n empty.appendChild(el('div', 'gelatiere-why', body));\n stream.appendChild(empty);\n stream.hidden = false;\n if (window.LucideIcons) window.LucideIcons.render();\n appendUseCases(stream);\n }\n\n function renderGelatiereCaughtUp() {\n renderGelatiereEmpty(\n 'All caught up',\n 'You have answered everything the gelatiere left here. The next pass runs ' +\n 'tonight, and again after your next chat ends.'\n );\n }\n\n function renderGelatiereStream() {\n var stream = document.getElementById('gelatiereStream');\n if (!stream) return;\n\n if (!window.slicc || typeof slicc.readFile !== 'function') {\n renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);\n return;\n }\n\n Promise.resolve(slicc.exists(GELATIERE_SUGGESTIONS_PATH)).then(function (present) {\n return present ? slicc.readFile(GELATIERE_SUGGESTIONS_PATH) : '[]';\n }).then(function (raw) {\n var list = [];\n try { list = JSON.parse(raw); } catch (e) { list = []; }\n if (!Array.isArray(list)) list = [];\n var readable = list.filter(function (s) {\n return s && typeof s === 'object' && s.id && s.title && s.body;\n });\n\n var open = readable.filter(function (s) { return !s.dismissedAt && !s.takenAt; });\n var taken = readable.filter(function (s) { return s.takenAt; });\n if (open.length === 0 && taken.length === 0) {\n renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);\n return;\n }\n\n if (open.length === 0) {\n renderGelatiereCaughtUp();\n stream.appendChild(buildDoneLedger(taken));\n if (window.LucideIcons) window.LucideIcons.render();\n return;\n }\n stream.innerHTML = '';\n open.forEach(function (s) { stream.appendChild(buildSuggestionCard(s)); });\n if (taken.length > 0) stream.appendChild(buildDoneLedger(taken));\n stream.hidden = false;\n if (window.LucideIcons) window.LucideIcons.render();\n }, function () {\n renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);\n });\n }\n\n renderGelatiereStream();\n </script>\n </body>\n</html>\n", "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Welcome</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n body {\n font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif);\n background: transparent;\n color: var(--s2-content-default, #e8e8e8);\n }\n\n .step { display: none; animation: fadeUp 0.18s ease both; }\n .step.active { display: block; }\n @keyframes fadeUp {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 14px;\n }\n .pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 34px;\n padding: 0 14px;\n border-radius: var(--s2-radius-pill, 9999px);\n background: var(--s2-bg-elevated, #2c2c2c);\n border: 1px solid var(--s2-border-subtle, #3a3a3a);\n cursor: pointer;\n font-family: inherit;\n font-size: 13px;\n font-weight: 500;\n color: var(--s2-content-default, #e8e8e8);\n transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;\n user-select: none;\n white-space: nowrap;\n }\n .pill:hover {\n background: var(--s2-bg-layer-2, #252525);\n border-color: var(--s2-border-default, #4a4a4a);\n }\n .pill.selected {\n border-color: var(--s2-accent, #3562ff);\n box-shadow: 0 0 0 1px var(--s2-accent, #3562ff);\n background: var(--s2-bg-layer-2, #252525);\n }\n\n .step-heading {\n font-size: 15px;\n font-weight: 700;\n color: var(--s2-content-default, #e8e8e8);\n line-height: 1.3;\n }\n .step-sub {\n font-size: 12px;\n color: var(--s2-content-secondary, #a1a1a1);\n margin-top: 3px;\n }\n\n .input-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 14px;\n background: var(--s2-bg-elevated, #2c2c2c);\n border: 1px solid var(--s2-border-subtle, #3a3a3a);\n border-radius: var(--s2-radius-pill, 9999px);\n padding: 6px 6px 6px 14px;\n }\n\n .input-row input {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-family: inherit;\n font-size: 14px;\n color: var(--s2-content-default, #e8e8e8);\n }\n .input-row input::placeholder { color: var(--s2-content-tertiary, #8a8a8a); }\n .input-row button {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n border: none;\n background: var(--s2-accent, #3562ff);\n color: var(--s2-gray-25, #f5f5f5);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background 0.15s;\n }\n .input-row button:hover { background: var(--s2-accent-hover, #4a75ff); }\n\n .cta-row { margin-top: 14px; }\n .cta {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 8px 22px;\n border-radius: var(--s2-radius-pill, 9999px);\n background: var(--s2-accent, #3562ff);\n color: var(--s2-gray-25, #f5f5f5);\n border: none;\n font-family: inherit;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n }\n .cta:hover { background: var(--s2-accent-hover, #4a75ff); }\n\n .footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 16px;\n }\n .dots { display: flex; gap: 5px; }\n .dot {\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--s2-gray-300, #4a4a4a);\n transition: background 0.2s, transform 0.2s;\n }\n .dot.active { background: var(--s2-accent, #3562ff); transform: scale(1.3); }\n .dot.done { background: var(--s2-accent, #3562ff); }\n\n .skip-btn {\n background: none;\n border: none;\n font-family: inherit;\n font-size: 11px;\n color: var(--s2-content-tertiary, #8a8a8a);\n cursor: pointer;\n padding: 2px 4px;\n }\n .skip-btn:hover { color: var(--s2-content-secondary, #a1a1a1); }\n\n .back-btn {\n background: none;\n border: none;\n font-family: inherit;\n font-size: 11px;\n color: var(--s2-content-secondary, #a1a1a1);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 2px 0;\n margin-bottom: 10px;\n }\n .back-btn:hover { color: var(--s2-content-default, #e8e8e8); }\n .back-btn[hidden] { display: none; }\n\n .done-state {\n text-align: center;\n padding: 12px 0 4px;\n font-size: 14px;\n color: var(--s2-content-secondary, #a1a1a1);\n }\n </style>\n </head>\n <body>\n <div class=\"sprinkle-action-card\">\n\n <div class=\"sprinkle-action-card__body\" style=\"padding: 16px 24px 0\">\n <button class=\"back-btn\" id=\"backBtn\" hidden onclick=\"goBack()\">\n <i data-lucide=\"arrow-left\" style=\"width:12px;height:12px\"></i> Back\n </button>\n\n <div class=\"step active\" id=\"s1\">\n <div class=\"step-heading\">What brings you here?</div>\n <div class=\"pills\" id=\"purposePills\"></div>\n </div>\n\n <div class=\"step\" id=\"s2\">\n <div class=\"step-heading\" id=\"s2Heading\">What do you do?</div>\n <div class=\"pills\" id=\"rolePills\"></div>\n </div>\n\n <div class=\"step\" id=\"s3\">\n <div class=\"step-heading\" id=\"s3Heading\">What do you want to tackle?</div>\n <div class=\"step-sub\">Pick as many as you like</div>\n <div class=\"pills\" id=\"taskPills\"></div>\n <div class=\"cta-row\">\n <button class=\"cta\" onclick=\"goStep(4)\">Continue</button>\n </div>\n </div>\n\n <div class=\"step\" id=\"s4\">\n <div class=\"step-heading\">What should I call you?</div>\n <div class=\"input-row\">\n <input type=\"text\" id=\"nameIn\" placeholder=\"Your name\"\n onkeydown=\"if(event.key==='Enter') advanceFrom(4)\" />\n <button onclick=\"advanceFrom(4)\" aria-label=\"Continue\">\n <i data-lucide=\"arrow-right\" style=\"width:14px;height:14px\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"step\" id=\"s5\">\n <div class=\"step-heading\">Where do you work?</div>\n <div class=\"input-row\">\n <input type=\"text\" id=\"companyIn\" placeholder=\"Company or organization\"\n onkeydown=\"if(event.key==='Enter') advanceFrom(5)\" />\n <button onclick=\"advanceFrom(5)\" aria-label=\"Continue\">\n <i data-lucide=\"arrow-right\" style=\"width:14px;height:14px\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"step\" id=\"s6\">\n <div class=\"step-heading\" id=\"s6Heading\">What apps do you use most?</div>\n <div class=\"step-sub\">Pick any that apply</div>\n <div class=\"pills\" id=\"appPills\"></div>\n <div class=\"cta-row\">\n <button class=\"cta\" onclick=\"finish()\">Let's go</button>\n </div>\n </div>\n\n <div class=\"step\" id=\"sDone\">\n <div class=\"done-state\" id=\"sDoneText\">Setting things up&hellip;</div>\n </div>\n </div>\n\n <div class=\"sprinkle-action-card__body\" style=\"padding-top:0\" id=\"footerArea\">\n <div class=\"footer\">\n <div class=\"dots\" id=\"dots\">\n <div class=\"dot active\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n <div class=\"dot\"></div>\n </div>\n <button class=\"skip-btn\" id=\"skipBtn\" onclick=\"skipStep()\">skip</button>\n </div>\n </div>\n\n </div>\n\n <script>\n var cur = 1;\n var profile = { purpose: '', role: '', tasks: [], name: '', company: '', apps: [] };\n\n var ROLE_FONTS = {\n 'developer': 'monospace',\n 'designer': 'Papyrus, fantasy',\n 'product-pm': '\"Comic Sans MS\", \"Comic Sans\", cursive',\n };\n\n var TASK_HEADINGS_BY_ROLE = {\n 'developer': 'What are you hacking?',\n 'designer': 'What do you dream of?',\n 'product-pm': \"What's your mission?\",\n 'content-creator': \"What's your story?\",\n 'marketer': \"What's your ambition?\",\n 'founder': 'What do you want to create?',\n 'student': 'What are you learning?',\n 'researcher': 'What are you researching?',\n };\n var TASK_HEADING_DEFAULT = 'What do you want to tackle?';\n\n var PURPOSES = [\n { id: 'work', label: 'Work', icon: 'briefcase' },\n { id: 'school', label: 'School', icon: 'graduation-cap' },\n { id: 'personal', label: 'Personal', icon: 'user' },\n { id: 'side-project',label: 'Side project', icon: 'lightbulb' },\n { id: 'exploring', label: 'Just exploring', icon: 'compass' },\n ];\n\n var ROLES_BY_PURPOSE = {\n work: {\n heading: \"What's your role?\",\n roles: [\n { id: 'developer', label: 'Developer', icon: 'code' },\n { id: 'designer', label: 'Designer', icon: 'palette' },\n { id: 'content-creator', label: 'Content creator', icon: 'pen-tool' },\n { id: 'marketer', label: 'Marketer', icon: 'megaphone' },\n { id: 'product-pm', label: 'Product / PM', icon: 'layout-dashboard' },\n { id: 'founder', label: 'Founder', icon: 'rocket' },\n { id: 'other', label: 'Something else', icon: 'help-circle' },\n ],\n },\n school: {\n heading: \"What are you studying?\",\n roles: [\n { id: 'student', label: 'Student', icon: 'book-open' },\n { id: 'researcher', label: 'Researcher', icon: 'microscope' },\n { id: 'developer', label: 'Developer', icon: 'code' },\n { id: 'designer', label: 'Designer', icon: 'palette' },\n { id: 'other', label: 'Something else', icon: 'help-circle' },\n ],\n },\n _default: {\n heading: \"What's your background?\",\n roles: [\n { id: 'developer', label: 'Developer', icon: 'code' },\n { id: 'designer', label: 'Designer', icon: 'palette' },\n { id: 'content-creator', label: 'Content creator', icon: 'pen-tool' },\n { id: 'marketer', label: 'Marketer', icon: 'megaphone' },\n { id: 'product-pm', label: 'Product / PM', icon: 'layout-dashboard' },\n { id: 'student', label: 'Student', icon: 'book-open' },\n { id: 'researcher', label: 'Researcher', icon: 'microscope' },\n { id: 'founder', label: 'Founder', icon: 'rocket' },\n { id: 'other', label: 'Something else', icon: 'help-circle' },\n ],\n },\n };\n\n var TASKS = [\n { id: 'build-websites', label: 'Build websites', icon: 'globe' },\n { id: 'migrate-page-aem', label: 'Migrate a page to AEM', icon: 'book-up' },\n { id: 'automate', label: 'Automate tasks', icon: 'zap' },\n { id: 'research', label: 'Research & analyze', icon: 'search' },\n { id: 'write-content', label: 'Write content', icon: 'file-text' },\n { id: 'extract-data', label: 'Extract data', icon: 'database' },\n { id: 'monitor', label: 'Monitor sites', icon: 'activity' },\n { id: 'seo', label: 'SEO & audits', icon: 'bar-chart' },\n { id: 'manage-files', label: 'Manage files', icon: 'folder' },\n { id: 'browser-automation', label: 'Browser automation', icon: 'mouse-pointer' },\n { id: 'not-sure', label: 'Not sure yet', icon: 'circle-help' },\n ];\n\n var APPS = [\n { id: 'aem', label: 'Adobe Experience Manager', icon: 'box',\n relevance: ['build-websites','migrate-page-aem','write-content','seo','content-creator','marketer','designer'] },\n { id: 'imessage', label: 'iMessage', icon: 'message-circle',\n relevance: ['personal','side-project','exploring'] },\n { id: 'teams', label: 'Microsoft Teams', icon: 'users',\n relevance: ['work','school','developer','designer','marketer','product-pm','founder','student'] },\n { id: 'slack', label: 'Slack', icon: 'hash',\n relevance: ['work','school','developer','designer','marketer','product-pm','founder','student'] },\n ];\n\n function applyFontJoke(stepEl) {\n var font = ROLE_FONTS[profile.role];\n if (font) stepEl.style.fontFamily = font;\n else stepEl.style.fontFamily = '';\n }\n\n function makePill(item, multiSelect, onSelect, preselected) {\n var btn = document.createElement('button');\n btn.className = 'pill';\n btn.dataset.id = item.id;\n if (preselected) btn.classList.add('selected');\n if (item.icon) {\n var ic = document.createElement('i');\n ic.setAttribute('data-lucide', item.icon);\n ic.style.width = '14px';\n ic.style.height = '14px';\n btn.appendChild(ic);\n }\n btn.appendChild(document.createTextNode(item.label));\n btn.onclick = function () {\n if (multiSelect) {\n btn.classList.toggle('selected');\n } else {\n btn.parentElement.querySelectorAll('.pill').forEach(function(p){ p.classList.remove('selected'); });\n btn.classList.add('selected');\n }\n onSelect(item, btn);\n };\n return btn;\n }\n\n function buildPills(containerId, items, multiSelect, onSelect, selectedIds) {\n var el = document.getElementById(containerId);\n el.innerHTML = '';\n var pre = selectedIds || [];\n items.forEach(function(item) {\n el.appendChild(makePill(item, multiSelect, onSelect, pre.indexOf(item.id) >= 0));\n });\n if (window.LucideIcons) window.LucideIcons.render();\n }\n\n function getRelevantApps() {\n var ctx = profile.tasks.concat([profile.role, profile.purpose]);\n return APPS.slice().sort(function(a, b) {\n var sa = a.relevance.filter(function(t){ return ctx.indexOf(t) >= 0; }).length;\n var sb = b.relevance.filter(function(t){ return ctx.indexOf(t) >= 0; }).length;\n return sb - sa;\n });\n }\n\n function updateDots(step) {\n\n var effective = step;\n if (profile.purpose !== 'work' && step >= 5) effective = step - 1;\n var dots = document.getElementById('dots').children;\n for (var i = 0; i < dots.length; i++) {\n dots[i].className = 'dot';\n if (i + 1 === effective) dots[i].className = 'dot active';\n else if (i + 1 < effective) dots[i].className = 'dot done';\n }\n\n dots[5].style.display = (profile.purpose !== 'work') ? 'none' : '';\n }\n\n function goBack() {\n var prev = cur - 1;\n if (prev === 5 && profile.purpose !== 'work') prev = 4;\n if (prev >= 1) goStep(prev);\n }\n\n function skipStep() {\n if (cur === 4) {\n profile.name = '';\n var nameIn = document.getElementById('nameIn');\n if (nameIn) nameIn.value = '';\n goStep(nextStep(cur));\n } else if (cur === 5) {\n profile.company = '';\n var companyIn = document.getElementById('companyIn');\n if (companyIn) companyIn.value = '';\n goStep(nextStep(cur));\n } else if (cur < 6) {\n goStep(nextStep(cur));\n } else {\n finish();\n }\n }\n\n function nextStep(n) {\n if (n === 4 && profile.purpose !== 'work') return 6;\n return n + 1;\n }\n\n function advanceFrom(n) {\n goStep(nextStep(n));\n }\n\n function goStep(n) {\n\n if (cur === 4) profile.name = (document.getElementById('nameIn').value || '').trim();\n if (cur === 5) profile.company = (document.getElementById('companyIn').value || '').trim();\n\n if (n === 1) {\n buildPills('purposePills', PURPOSES, false, function(item) {\n profile.purpose = item.id;\n setTimeout(function(){ goStep(2); }, 280);\n }, profile.purpose ? [profile.purpose] : []);\n }\n if (n === 2) {\n var cfg = ROLES_BY_PURPOSE[profile.purpose] || ROLES_BY_PURPOSE._default;\n document.getElementById('s2Heading').textContent = cfg.heading;\n buildPills('rolePills', cfg.roles, false, function(item) {\n profile.role = item.id;\n setTimeout(function(){ goStep(3); }, 280);\n }, profile.role ? [profile.role] : []);\n }\n if (n === 3) {\n var s3 = document.getElementById('s3');\n applyFontJoke(s3);\n var taskHeading = TASK_HEADINGS_BY_ROLE[profile.role] || TASK_HEADING_DEFAULT;\n document.getElementById('s3Heading').textContent = taskHeading;\n buildPills('taskPills', TASKS, true, function(item) {\n profile.tasks = [];\n document.querySelectorAll('#taskPills .pill.selected').forEach(function(p){\n profile.tasks.push(p.dataset.id);\n });\n }, profile.tasks);\n }\n if (n === 6) {\n var s6 = document.getElementById('s6');\n applyFontJoke(s6);\n buildPills('appPills', getRelevantApps(), true, function(item) {\n profile.apps = [];\n document.querySelectorAll('#appPills .pill.selected').forEach(function(p){\n profile.apps.push(p.dataset.id);\n });\n }, profile.apps);\n }\n\n document.getElementById('s' + cur).classList.remove('active');\n document.getElementById('s' + n).classList.add('active');\n cur = n;\n updateDots(n);\n\n document.getElementById('backBtn').hidden = (n <= 1 || n > 6);\n document.getElementById('footerArea').style.display = (n > 6) ? 'none' : '';\n\n if (n === 4) setTimeout(function(){ document.getElementById('nameIn').focus(); }, 80);\n if (n === 5) setTimeout(function(){ document.getElementById('companyIn').focus(); }, 80);\n }\n\n function finish() {\n if (!profile.name) profile.name = (document.getElementById('nameIn').value || '').trim();\n if (!profile.company) profile.company = (document.getElementById('companyIn').value || '').trim();\n\n document.getElementById('s' + cur).classList.remove('active');\n document.getElementById('sDone').classList.add('active');\n document.getElementById('footerArea').style.display = 'none';\n document.getElementById('backBtn').hidden = true;\n\n if (window.slicc) {\n slicc.lick({ action: 'onboarding-complete', data: profile });\n }\n }\n\n function startWizard() {\n document.getElementById('sDone').classList.remove('active');\n document.getElementById('s1').classList.add('active');\n document.getElementById('footerArea').style.display = '';\n\n buildPills('purposePills', PURPOSES, false, function(item) {\n profile.purpose = item.id;\n setTimeout(function(){ goStep(2); }, 280);\n }, profile.purpose ? [profile.purpose] : []);\n\n updateDots(1);\n document.getElementById('backBtn').hidden = true;\n document.getElementById('dots').children[5].style.display = 'none';\n }\n\n function showAlreadyComplete() {\n var wizard = document.querySelector('.sprinkle-action-card');\n if (wizard) wizard.remove();\n }\n\n ['s1','s2','s3','s4','s5','s6','sDone'].forEach(function(id){\n var el = document.getElementById(id);\n if (el) el.classList.remove('active');\n });\n\n function bootByMarker() {\n if (!window.slicc || typeof slicc.exists !== 'function') {\n startWizard();\n return;\n }\n Promise.resolve(slicc.exists('/shared/.welcomed')).then(\n function(welcomed) { welcomed ? showAlreadyComplete() : startWizard(); },\n function() { startWizard(); }\n );\n }\n bootByMarker();\n </script>\n </body>\n</html>\n", "export const status = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Status</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, system-ui, sans-serif);\n background: transparent;\n color: var(--s2-content-default, #e8e8e8);\n font-size: 14px;\n }\n .card {\n display: grid;\n gap: 12px;\n padding: 8px 20px 12px;\n }\n .row { display: flex; align-items: center; gap: 10px; }\n .dot {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dot);\n }\n .name { flex: 1; font-weight: 600; }\n .meta { font-size: 12px; color: var(--s2-content-subdued, #9a9a9a); }\n .steps { list-style: none; display: grid; gap: 6px; }\n .steps label { display: flex; align-items: center; gap: 8px; cursor: pointer; }\n .actions { display: flex; justify-content: flex-end; gap: 8px; }\n button {\n font: inherit;\n padding: 6px 12px;\n border-radius: 999px;\n border: 1px solid var(--s2-gray-400, rgba(128, 128, 128, 0.5));\n background: transparent;\n color: inherit;\n cursor: pointer;\n }\n button.primary {\n background: var(--s2-accent, #3b63fb);\n border-color: transparent;\n color: #fff;\n }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <div class=\"row\" style=\"--dot: #2d9d78\">\n <span class=\"dot\"></span>\n <span class=\"name\">PR #58 \u00B7 Add retries for upstream timeouts</span>\n <span class=\"meta\">4 of 4 checks</span>\n </div>\n <div class=\"row\" style=\"--dot: #e68619\">\n <span class=\"dot\"></span>\n <span class=\"name\">Visual regression suite</span>\n <span class=\"meta\">2 snapshots changed</span>\n </div>\n <div class=\"row\" style=\"--dot: #2d9d78\">\n <span class=\"dot\"></span>\n <span class=\"name\">Staging</span>\n <span class=\"meta\">/health answered in 2 ms</span>\n </div>\n <ul class=\"steps\">\n <li><label><input type=\"checkbox\" checked /> TTL fix merged</label></li>\n <li><label><input type=\"checkbox\" /> Merge the retry pull request</label></li>\n <li><label><input type=\"checkbox\" /> Update the forecast docs to Celsius</label></li>\n <li><label><input type=\"checkbox\" /> Tag 1.9.0</label></li>\n </ul>\n <div class=\"actions\">\n <button type=\"button\" data-action=\"review\">Review snapshots</button>\n <button type=\"button\" class=\"primary\" data-action=\"continue\">Continue</button>\n </div>\n </div>\n <script>\n document.querySelector('.actions').addEventListener('click', function (event) {\n var action = event.target.getAttribute('data-action');\n if (!action || !window.slicc) return;\n var done = document.querySelectorAll('.steps input:checked').length;\n slicc.lick({ action: action, data: { done: done } });\n });\n </script>\n </body>\n</html>\n`;\n", "import type {\n FrozenCone,\n Memory,\n Message,\n Sprinkle,\n TrayBudget,\n TrayStatus,\n} from '../model/types.ts';\nimport suggestions from './sprinkles/suggestions.shtml';\nimport welcome from './sprinkles/welcome.shtml';\nimport { status } from './status.ts';\n\nconst day = 86_400_000;\nconst now = Date.UTC(2026, 9, 5, 9, 0);\n\nfunction frozenConversation(topic: string, reply: string): Message[] {\n return [\n { id: `f-${topic}-1`, role: 'user', text: topic, createdAt: now - 3 * day },\n {\n id: `f-${topic}-2`,\n role: 'assistant',\n status: 'done',\n createdAt: now - 3 * day + 60_000,\n parts: [{ type: 'text', text: reply }],\n },\n ];\n}\n\nexport const frozen: Array<{ cone: FrozenCone; messages: Message[] }> = [\n {\n cone: {\n id: 'cone-onboarding',\n kind: 'cone',\n name: 'onboarding',\n title: 'Write the onboarding guide for new contributors',\n model: 'claude-sonnet-5-5',\n messages: 42,\n frozenAt: now - 2 * day,\n },\n messages: frozenConversation(\n 'Write the onboarding guide for new contributors',\n 'The guide is in `/workspace/harbor/docs/onboarding.md`, with setup, tests and the release checklist.'\n ),\n },\n {\n cone: {\n id: 'cone-kv-spike',\n kind: 'cone',\n name: 'kv-spike',\n title: 'Spike: can the cache move to KV without a cold start?',\n model: 'claude-opus-5-5',\n messages: 118,\n frozenAt: now - 6 * day,\n },\n messages: frozenConversation(\n 'Spike: can the cache move to KV without a cold start?',\n 'Yes, with a 5-minute in-memory layer in front. Reads from KV add 12 ms at the 95th percentile.'\n ),\n },\n {\n cone: {\n id: 'cone-q3-report',\n kind: 'cone',\n name: 'q3-report',\n title: 'Summarize Q3 uptime and incidents',\n model: 'claude-haiku-4-5',\n messages: 17,\n frozenAt: now - 21 * day,\n },\n messages: frozenConversation(\n 'Summarize Q3 uptime and incidents',\n 'Uptime 99.96%. Two incidents: an expired certificate and an upstream outage.'\n ),\n },\n {\n cone: {\n id: 'scoop-tide-check',\n kind: 'scoop',\n name: 'tide-check',\n title: 'Check the tide tables against the harbor feed',\n model: 'claude-haiku-4-5',\n messages: 9,\n frozenAt: now - 1 * day,\n },\n messages: frozenConversation(\n 'Check the tide tables against the harbor feed',\n 'They match, except the 3 October low tide, which the feed lists 4 minutes later.'\n ),\n },\n {\n cone: {\n id: 'run-nightly-digest',\n kind: 'agent',\n name: 'nightly-digest',\n title: 'Write the nightly digest of merged pull requests',\n model: 'claude-sonnet-5-5',\n messages: 6,\n frozenAt: now - 3 * day,\n },\n messages: frozenConversation(\n 'Write the nightly digest of merged pull requests',\n 'Four pull requests merged: two fixes, a docs change and a dependency bump.'\n ),\n },\n];\n\nexport const memories: Memory[] = [\n {\n id: 'mem-1',\n scope: 'global',\n section: 'Preferences',\n title: 'Lead with the result',\n body: 'Keep replies short. Lead with the result, then the evidence.',\n tag: 'feedback',\n updatedAt: now - 5 * day,\n },\n {\n id: 'mem-2',\n scope: 'global',\n section: 'Preferences',\n title: 'Tests before \u201Cfixed\u201D',\n body: 'Run the tests before saying something is fixed, and quote the summary line.',\n tag: 'feedback',\n updatedAt: now - 9 * day,\n },\n {\n id: 'mem-3',\n scope: 'global',\n section: 'About the user',\n title: 'Works in UTC',\n body: 'Schedules, timestamps and cron expressions are in UTC unless stated otherwise.',\n tag: 'user',\n updatedAt: now - 30 * day,\n },\n {\n id: 'mem-4',\n scope: 'global',\n section: 'Projects',\n title: 'harbor',\n body: 'Forecast API, deployed as a worker. Cache bugs show up around midnight UTC. Staging deploys are frozen on Fridays.',\n tag: 'project',\n updatedAt: now - day,\n },\n {\n id: 'mem-5',\n scope: 'global',\n section: 'Projects',\n title: 'release-notes',\n body: 'Drafted every Friday from merged pull requests, grouped as features, fixes and chores.',\n tag: 'project',\n updatedAt: now - 4 * day,\n },\n {\n id: 'mem-6',\n scope: 'cone-harbor',\n section: 'Conventions',\n title: 'Cache keys',\n body: 'Cache keys are `city:UTC-date`. Never key on local time.\\n\\nThe warmer fills the next day\u2019s keys at 23:00 UTC, so a key built from local time misses it and every request goes upstream until midnight. `npm run cache:check` lists the keys that don\u2019t match.',\n tag: 'project',\n updatedAt: now - 2 * day,\n },\n {\n id: 'mem-7',\n scope: 'cone-harbor',\n section: 'Conventions',\n title: 'Retries',\n body: 'Retry upstream calls three times with exponential backoff starting at 250 ms.',\n tag: null,\n updatedAt: now - 2 * day,\n },\n {\n id: 'mem-8',\n scope: 'cone-release',\n section: 'Style',\n title: 'Past tense, no ticket numbers',\n body: 'One sentence per change, in the past tense, without ticket numbers.',\n tag: 'feedback',\n updatedAt: now - 7 * day,\n },\n {\n id: 'mem-9',\n scope: 'role:reviewer',\n section: 'Checks',\n title: 'Read the tests first',\n body: 'Start a review from the tests, then read the change they cover.',\n tag: 'feedback',\n updatedAt: now - 3 * day,\n source: 'entry',\n },\n {\n id: 'mem-10',\n scope: 'role:reviewer',\n section: 'Checks',\n title: 'Checks',\n body: 'Flag any change to cache keys. Ask for a test when a retry count changes.',\n tag: null,\n updatedAt: now - 3 * day,\n source: 'notes',\n },\n];\n\nexport const sprinkles: Sprinkle[] = [\n {\n id: 'welcome',\n name: 'welcome',\n title: 'Welcome',\n icon: 'hand',\n agentId: 'cone-sliccy',\n html: welcome,\n inline: true,\n },\n {\n id: 'suggestions',\n name: 'suggestions',\n title: 'Suggestions',\n icon: 'ice-cream-cone',\n agentId: 'cone-sliccy',\n html: suggestions,\n },\n {\n id: 'status',\n name: 'status',\n title: 'Status',\n icon: 'list-checks',\n agentId: 'cone-kitchen',\n html: status,\n inline: true,\n },\n];\n\nconst coneSprinkle = (\n agentId: string,\n name: string,\n title: string,\n icon: string,\n body: string\n): Sprinkle => ({\n id: `${agentId}/${name}`,\n name,\n title,\n icon,\n agentId,\n html: `<style>body { font-family: var(--s2-font-family); color: var(--s2-content-default); padding: var(--s2-spacing-300) var(--s2-spacing-400); }</style><div class=\"sprinkle-stack\"><h2 class=\"sprinkle-heading\">${title}</h2><p class=\"sprinkle-body\">${body}</p></div>`,\n});\n\nexport const coneSprinkles: Sprinkle[] = [\n coneSprinkle('cone-harbor', 'board', 'Board', 'kanban', 'Forecast endpoints in review: 3.'),\n coneSprinkle('cone-tides', 'board', 'Board', 'kanban', 'Tide table tasks this week: 5.'),\n coneSprinkle('cone-release', 'changelog', 'Changelog', 'scroll-text', 'Draft notes for 2.4.0.'),\n];\n\nconst weekly: TrayBudget = { percent: 32, window: 'weekly', resets: 'resets in 4 days' };\n\nexport const tray: TrayStatus = {\n name: 'sliccstart',\n kind: 'sliccstart',\n connection: 'live',\n role: 'leader',\n followers: [\n { id: 'f-phone', name: 'Phone', device: 'phone', since: now - 3_600_000 },\n { id: 'f-laptop', name: 'Second browser', device: 'browser', since: now - 600_000 },\n ],\n spent: 23.67,\n rate: 0.59,\n budget: weekly,\n joinUrl: 'https://www.example.com/join/7Q4D-K9TX',\n};\n\nexport type BudgetScenario = 'plain' | 'adobe' | 'xai';\n\nexport function trayWith(budget: BudgetScenario): TrayStatus {\n return budget === 'plain' ? tray : { ...tray, budget: { ...weekly, provider: budget } };\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { Change, FileEntry, FileEvents, FilePort, MountInfo } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nfunction parents(path: string): string[] {\n const parts = path.split('/').slice(1, -1);\n return parts.map((_, i) => `/${parts.slice(0, i + 1).join('/')}`);\n}\n\nexport type MountScenario = 'mount' | 'cancel' | 'fail' | 'needs';\n\nexport interface DummyMount {\n scenario: MountScenario;\n point: string;\n files: Record<string, string>;\n}\n\nexport class DummyFiles extends Emitter<FileEvents> implements FilePort {\n mount: DummyMount | null;\n mountFolder?: (path?: string) => Promise<string | null>;\n mounts?: () => readonly string[];\n mountInfo?: () => readonly MountInfo[];\n eject?: (path: string) => Promise<void>;\n needsFolder?: () => readonly string[];\n #mounted = new Set<string>();\n #sources = new Map<string, string>();\n #needs = new Set<string>();\n #contents = new Map<string, string>();\n #directories = new Set<string>();\n #modified = new Map<string, number>();\n #changes = new Map<string, Change>();\n #clock: Clock;\n\n constructor(\n contents: Record<string, string>,\n directories: readonly string[],\n changes: readonly Change[],\n clock: Clock,\n mount: DummyMount | null = null\n ) {\n super();\n this.#clock = clock;\n this.mount = mount;\n if (mount) {\n this.mountFolder = (path) => this.#mountFolder(mount, path);\n this.#ejectable();\n this.needsFolder = () => [...this.#needs];\n if (mount.scenario === 'needs') this.#needs.add(mount.point);\n }\n for (const directory of directories) this.#mkdirs(`${directory}/`);\n for (const [path, text] of Object.entries(contents)) this.#put(path, text, 0);\n for (const change of changes) this.#changes.set(change.path, { ...change });\n for (const change of changes) {\n if (change.status === 'deleted') this.#contents.delete(change.path);\n else if (change.after !== null) this.#put(change.path, change.after, 0);\n }\n }\n\n #mkdirs(path: string): void {\n for (const directory of parents(path)) this.#directories.add(directory);\n }\n\n #put(path: string, text: string, now: number): void {\n this.#mkdirs(path);\n this.#contents.set(path, text);\n this.#modified.set(path, now);\n }\n\n #entries(): FileEntry[] {\n const directories = [...this.#directories].map(\n (path): FileEntry => ({ path, kind: 'directory', size: 0, modified: 0 })\n );\n const files = [...this.#contents].map(\n ([path, text]): FileEntry => ({\n path,\n kind: 'file',\n size: new TextEncoder().encode(text).length,\n modified: this.#modified.get(path) as number,\n })\n );\n return [...directories, ...files].sort((a, b) => a.path.localeCompare(b.path));\n }\n\n async list(): Promise<readonly FileEntry[]> {\n await this.#clock.sleep();\n return this.#entries();\n }\n\n async read(path: string): Promise<string> {\n await this.#clock.sleep();\n const text = this.#contents.get(path);\n if (text === undefined) throw new Error(`ENOENT: ${path}`);\n return text;\n }\n\n #record(path: string, after: string | null, agentId: string | null): void {\n const previous = this.#changes.get(path);\n const before = previous ? previous.before : (this.#contents.get(path) ?? null);\n if (before === after) {\n this.#changes.delete(path);\n return;\n }\n const status = before === null ? 'added' : after === null ? 'deleted' : 'modified';\n this.#changes.set(path, { path, status, before, after, agentId });\n }\n\n #announce(path: string): void {\n this.emit('files', this.#entries());\n this.emit('file', path);\n this.emit('changes', this.changes());\n }\n\n async write(path: string, text: string, agentId: string | null = null): Promise<void> {\n await this.#clock.sleep();\n this.#record(path, text, agentId);\n this.#put(path, text, Date.now());\n this.#announce(path);\n }\n\n async remove(path: string, agentId: string | null = null): Promise<void> {\n await this.#clock.sleep();\n if (!this.#contents.has(path)) throw new Error(`ENOENT: ${path}`);\n this.#record(path, null, agentId);\n this.#contents.delete(path);\n this.#announce(path);\n }\n\n changes(): readonly Change[] {\n return [...this.#changes.values()].sort((a, b) => a.path.localeCompare(b.path));\n }\n\n accept(path: string): void {\n this.#changes.delete(path);\n this.emit('changes', this.changes());\n }\n\n async revert(path: string): Promise<void> {\n const change = this.#changes.get(path);\n if (!change) return;\n await this.#clock.sleep();\n this.#changes.delete(path);\n if (change.before !== null) this.#put(path, change.before, Date.now());\n else if (change.status === 'added') this.#contents.delete(path);\n this.#announce(path);\n }\n\n #ejectable(): void {\n this.mounts = () => [...this.#mounted];\n this.mountInfo = () =>\n [...this.#mounted].map((target) => {\n const source = this.#sources.get(target);\n return source ? { target, source, type: 'hostfs' } : { target, type: 'local' };\n });\n this.eject = (path) => this.#eject(path);\n }\n\n async attach(target: string, source: string, contents: Record<string, string>): Promise<string> {\n await this.#clock.sleep();\n if (!this.eject) this.#ejectable();\n const files = Object.entries(contents).map(([path, text]) => {\n const file = `${target}/${path}`;\n this.#put(file, text, Date.now());\n return file;\n });\n this.#mounted.add(target);\n this.#sources.set(target, source);\n this.#remount(files);\n return target;\n }\n\n async #mountFolder(mount: DummyMount, point?: string): Promise<string | null> {\n await this.#clock.sleep();\n if (mount.scenario === 'cancel') return null;\n if (mount.scenario === 'fail') throw new Error('The folder couldn\u2019t be mounted.');\n if (point !== undefined && !this.#needs.has(point))\n throw new Error(`Nothing is waiting for a folder at ${point}.`);\n const at = point ?? mount.point;\n const files: string[] = [];\n for (const [path, text] of Object.entries(mount.files)) {\n const file = `${at}/${path}`;\n this.#put(file, text, Date.now());\n files.push(file);\n }\n this.#mounted.add(at);\n this.#needs.delete(at);\n this.#remount(files);\n return at;\n }\n\n async #eject(path: string): Promise<void> {\n await this.#clock.sleep();\n if (!this.#mounted.delete(path)) throw new Error(`Nothing is mounted at ${path}.`);\n this.#sources.delete(path);\n const inside = (candidate: string) => candidate === path || candidate.startsWith(`${path}/`);\n const files = [...this.#contents.keys()].filter(inside);\n for (const file of files) {\n this.#contents.delete(file);\n this.#modified.delete(file);\n }\n for (const directory of [...this.#directories].filter(inside))\n this.#directories.delete(directory);\n this.#remount(files);\n }\n\n #remount(files: readonly string[]): void {\n this.emit('mounts', [...this.#mounted]);\n this.emit('files', this.#entries());\n for (const file of files) this.emit('file', file);\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { Memory, MemoryDraft, MemoryEvents, MemoryPort, MemoryScope } from '../model/types.ts';\n\nexport class DummyMemory extends Emitter<MemoryEvents> implements MemoryPort {\n #memories: Memory[];\n #scopes: () => readonly MemoryScope[];\n #next = 1;\n\n constructor(\n memories: readonly Memory[],\n scopes: () => readonly MemoryScope[] = () => [{ id: 'global', label: 'Everyone' }]\n ) {\n super();\n this.#memories = memories.map((memory) => ({ ...memory }));\n this.#scopes = scopes;\n }\n\n scopes(): readonly MemoryScope[] {\n return this.#scopes();\n }\n\n list(): readonly Memory[] {\n return this.#memories.map((memory) => ({ ...memory }));\n }\n\n save(draft: MemoryDraft): Memory {\n const memory: Memory = {\n ...draft,\n id: draft.id ?? `mem-new-${this.#next++}`,\n updatedAt: Date.now(),\n };\n const index = this.#memories.findIndex((candidate) => candidate.id === memory.id);\n if (index < 0) this.#memories.push(memory);\n else this.#memories[index] = memory;\n this.emit('memories', this.list());\n return { ...memory };\n }\n\n remove(id: string): void {\n this.#memories = this.#memories.filter((memory) => memory.id !== id);\n this.emit('memories', this.list());\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n ChangesPort,\n MonitorEvents,\n MonitorPort,\n MonitorSection,\n MonitorSnapshot,\n SliccModel,\n} from '../model/types.ts';\n\nexport function wave(seed: number, length = 24): number[] {\n return Array.from({ length }, (_, i) =>\n Math.round(40 + 25 * Math.sin((i + seed) / 3) + 10 * Math.cos((i * seed) / 5))\n );\n}\n\nexport const agentSections: MonitorSection[] = [\n {\n id: 'tasks',\n label: 'Tasks',\n rows: [\n { id: 't1', name: 'generating', meta: 'sliccy \u00B7 running \u00B7 12s', status: 'active' },\n {\n id: 't2',\n name: 'tool bash',\n meta: 'sliccy \u00B7 running \u00B7 8s',\n status: 'active',\n depth: 1,\n badges: ['bash'],\n },\n {\n id: 't3',\n name: 'scoop quiet-otter',\n meta: 'quiet-otter \u00B7 waiting \u00B7 2m',\n status: 'idle',\n depth: 1,\n badges: ['waits on 2'],\n },\n {\n id: 't4',\n name: 'tool read_file',\n meta: 'quiet-otter \u00B7 completing \u00B7 1s',\n status: 'active',\n depth: 2,\n },\n {\n id: 't5',\n name: 'report for quiet-otter',\n meta: 'quiet-otter \u00B7 pending \u00B7 2m',\n status: 'idle',\n depth: 2,\n badges: ['background'],\n },\n {\n id: 't6',\n name: 'cron tide-check',\n meta: 'session \u00B7 aborting \u00B7 14s',\n status: 'warn',\n badges: ['aborting'],\n },\n ],\n },\n {\n id: 'processes',\n label: 'Processes',\n rows: [\n {\n id: 'p412',\n name: 'bash',\n meta: 'pid 412 \u00B7 slicc \u00B7 3m',\n status: 'idle',\n badges: ['terminal'],\n },\n {\n id: 'p418',\n name: 'node build.mjs --watch',\n meta: 'pid 418 \u00B7 slicc \u00B7 1m',\n status: 'active',\n badges: ['sliccy'],\n },\n {\n id: 'p433',\n name: 'grep -r harbor .',\n meta: 'pid 433 \u00B7 slicc \u00B7 40s',\n status: 'warn',\n badges: ['quiet-otter'],\n },\n ],\n },\n {\n id: 'problems',\n label: 'Recent problems',\n rows: [\n {\n id: 'e1',\n name: 'quiet-otter \u00B7 turn',\n meta: 'The model returned an error: overloaded. Retrying in 8 s.',\n status: 'error',\n },\n ],\n },\n];\n\nexport class DummyMonitor extends Emitter<MonitorEvents> implements MonitorPort {\n #model: Omit<SliccModel, 'monitor'>;\n #tick = 0;\n #extra: MonitorSection[];\n\n constructor(model: Omit<SliccModel, 'monitor'>, extra: MonitorSection[] = []) {\n super();\n this.#model = model;\n this.#extra = extra;\n const update = () => this.resync();\n model.agent.on('agents', update);\n model.terminals.on('terminals', update);\n model.browser.on('tabs', update);\n const changes: ChangesPort = model.changes ?? model.files;\n changes.on('changes', update);\n model.tray.on('status', update);\n }\n\n snapshot(): MonitorSnapshot {\n const { agent, terminals, browser, files, tray } = this.#model;\n const changes: ChangesPort = this.#model.changes ?? files;\n const listed = agent.list();\n const agents = listed\n .filter((candidate) => candidate.kind === 'cone')\n .flatMap((cone) => [cone, ...listed.filter((candidate) => candidate.parentId === cone.id)]);\n const active = agents.filter((candidate) => candidate.status !== 'idle').length;\n const status = tray.status();\n const fill = Math.max(...agents.map((candidate) => candidate.contextFill), 0);\n const rows = (id: string) => this.#extra.find((section) => section.id === id)?.rows;\n const tasks = rows('tasks');\n const running = rows('processes') ?? [];\n const processes = terminals.list().length + running.length + 1;\n const byAgents = running.filter((row) =>\n row.badges?.some((badge) => badge !== 'terminal')\n ).length;\n const tools = (tasks ?? []).filter(\n (row) => row.name.startsWith('tool ') && row.status === 'active'\n ).length;\n return {\n updatedAt: Date.now(),\n vitals: [\n ...(status.budget\n ? [\n {\n id: 'budget',\n label: `Budget (${status.budget.window})`,\n value: `${status.budget.percent}%`,\n unit: status.budget.resets,\n ratio: status.budget.percent / 100,\n ...(status.budget.provider\n ? { provider: status.budget.provider, window: status.budget.window }\n : {}),\n },\n ]\n : []),\n {\n id: 'spend',\n label: 'Spend',\n value: `$${(status.spent ?? 0).toFixed(2)}`,\n delta: `$${(status.rate ?? 0).toFixed(2)}/h`,\n series: wave(this.#tick + 7),\n },\n {\n id: 'agents',\n label: 'Active agents',\n value: String(active),\n unit: `of ${agents.length}`,\n series: wave(this.#tick + 1),\n },\n ...(tasks\n ? [\n {\n id: 'tasks',\n label: 'Running',\n value: String(tools),\n unit: `${tools === 1 ? 'tool' : 'tools'} \u00B7 ${tasks.length} ${tasks.length === 1 ? 'task' : 'tasks'}`,\n },\n ]\n : []),\n {\n id: 'processes',\n label: 'Processes',\n value: String(processes),\n unit: `${byAgents} by agents`,\n series: wave(this.#tick + 3),\n },\n {\n id: 'memory',\n label: 'Process memory',\n value: `${17 + 24 * (processes - 1)} MiB`,\n unit: `${24 * byAgents} MiB by agents`,\n series: wave(this.#tick + 5),\n },\n {\n id: 'context',\n label: 'Fullest context',\n value: `${Math.round(fill * 100)}%`,\n ratio: fill,\n },\n ],\n alerts: [\n ...(this.#extra.length\n ? [\n {\n id: 'runaway-cpu-433',\n title: 'quiet-otter is using a lot of CPU',\n detail: '97% of one core for 3 minutes.',\n severity: 'warn' as const,\n command: 'kill -- -433',\n commandLabel: 'To stop it, run',\n },\n ]\n : []),\n ...agents\n .filter((candidate) => candidate.contextFill >= 0.8)\n .map((candidate) => ({\n id: `fill-${candidate.id}`,\n title: `${candidate.name} is ${Math.round(candidate.contextFill * 100)}% full`,\n detail: 'Compact it soon to keep replies fast.',\n severity: 'warn' as const,\n })),\n ...(status.connection === 'live'\n ? []\n : [\n {\n id: 'tray',\n title: `Tray ${status.connection}`,\n detail: 'Followers can\u2019t see this session.',\n severity: 'error' as const,\n },\n ]),\n ],\n sections: [\n ...this.#extra,\n {\n id: 'terminals',\n label: 'Terminals',\n rows: terminals.list().map((terminal) => ({\n name: terminal.title,\n meta: terminal.cwd,\n status: 'active' as const,\n })),\n },\n {\n id: 'tabs',\n label: 'Browser tabs',\n rows: browser.list().map((tab) => ({\n name: tab.title,\n meta: new URL(tab.url).host || tab.url,\n status: tab.status === 'loading' ? ('active' as const) : ('idle' as const),\n badges: tab.agentId ? ['agent'] : [],\n })),\n },\n {\n id: 'changes',\n label: 'Pending changes',\n rows: (changes.unavailable?.() ? [] : changes.changes()).map((change) => ({\n name: change.path,\n meta: change.status,\n status: 'warn' as const,\n })),\n },\n {\n id: 'followers',\n label: 'Tray followers',\n rows: status.followers.map((follower) => ({\n name: follower.name,\n meta: follower.device,\n status: 'active' as const,\n })),\n },\n ],\n };\n }\n\n resync(): void {\n this.#tick += 1;\n this.emit('snapshot', this.snapshot());\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n AccessKey,\n Leader,\n LinkedDevice,\n LinkedFolder,\n LinkPairing,\n NetworkExit,\n NetworkLinks,\n NetworkPort,\n NetworkStatus,\n TailnetStatus,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport type { DummyFiles } from './files.ts';\n\nexport type NetworkScenario = 'ok' | 'limited' | 'failing';\nexport type TailnetScenario = 'off' | 'needs-login' | 'running' | 'failed';\nexport type LinksScenario =\n | 'none'\n | 'preparing'\n | 'linked'\n | 'reconnecting'\n | 'exit'\n | 'prompt'\n | 'denied'\n | 'remote'\n | 'followers'\n | 'pairing'\n | 'pairing-notray'\n | 'forgotten'\n | 'outdated';\n\nexport type LeadersScenario = 'connected' | 'failed' | 'unlinked' | 'disconnected' | 'two';\n\nconst minute = 60_000;\n\nconst cove: Leader = {\n id: 'https://hub.cove-studio.example',\n name: 'SLICC on cove-studio',\n hub: 'hub.cove-studio.example',\n state: 'connected',\n};\n\nconst marsh: Leader = {\n id: 'https://tray.marsh-desk.example',\n name: 'SLICC on marsh-desk',\n hub: 'tray.marsh-desk.example',\n state: 'failed',\n error: 'The hub didn\u2019t answer. Check the connection and try again.',\n};\n\nexport function leadersFixtures(scenario: LeadersScenario): Leader[] {\n if (scenario === 'failed') return [marsh];\n if (scenario === 'unlinked') return [{ ...cove, state: 'unlinked' }];\n if (scenario === 'disconnected') return [{ ...cove, state: 'disconnected' }];\n if (scenario === 'two') return [cove, marsh];\n return [cove];\n}\n\nexport function networkFixtures(scenario: NetworkScenario, now = Date.now()): NetworkStatus {\n const extensionUrl = 'https://extensions.example/slicc';\n if (scenario === 'ok') {\n return {\n route: 'link',\n health: 'ok',\n detail: 'Linked 2 min ago.',\n failures: [],\n extensionUrl,\n browser: { via: 'link' },\n links: { ...linksFixtures('none').links, devices: [linkedDevices[0]] },\n exit: { kind: 'link', id: 'link-quay' },\n };\n }\n if (scenario === 'limited') {\n return {\n route: 'page',\n health: 'limited',\n detail: 'The page fetch, limited by CORS.',\n failures: [\n {\n url: 'https://api.tidewatch.example/v2/forecast?port=harbor',\n error: 'Blocked by CORS',\n at: now - 2 * minute,\n },\n {\n url: 'https://feeds.lighthouse.example/notices.xml',\n error: 'Blocked by CORS',\n at: now - 14 * minute,\n },\n ],\n extensionUrl,\n browser: { via: null },\n };\n }\n return {\n route: null,\n health: 'failing',\n detail: 'No route answered. The last request timed out.',\n failures: [\n {\n url: 'https://registry.harbor.example/agent',\n error: 'Timed out after 30 s',\n at: now - 40_000,\n },\n {\n url: 'https://docs.tidewatch.example/',\n error: 'Network unreachable',\n at: now - 3 * minute,\n },\n {\n url: 'https://api.tidewatch.example/v2/tides',\n error: 'Network unreachable',\n at: now - 75 * minute,\n },\n ],\n extensionUrl,\n browser: { via: null },\n };\n}\n\nconst exitNodes = [\n { id: 'nKeel1CNTRL', name: 'keel-router', online: true },\n { id: 'nMast2CNTRL', name: 'mast-pi', online: true },\n { id: 'nBuoy3CNTRL', name: 'buoy-laptop', online: false },\n];\n\nexport function tailnetFixtures(scenario: TailnetScenario): TailnetStatus {\n const base = { exitNode: null, exitNodes: [], autoExitNode: false, shieldsUp: true };\n if (scenario === 'needs-login') {\n return { ...base, state: 'needs-login', loginUrl: 'https://login.tailnet.example/a/7f3c2e' };\n }\n if (scenario === 'running') {\n return {\n ...base,\n state: 'running',\n node: { name: 'slicc-harbor', addresses: ['fd7a:115c:a1e0::7', '100.64.12.7'] },\n exitNodes,\n peers: 4,\n };\n }\n if (scenario === 'failed') {\n return {\n ...base,\n state: 'failed',\n detail: 'The coordination server didn\u2019t answer. Check the connection and try again.',\n };\n }\n return { ...base, state: 'off' };\n}\n\nconst linkedDevices: readonly LinkedDevice[] = [\n {\n id: 'link-quay',\n name: 'slicc on quay-studio',\n host: 'quay-studio.slicc.internal',\n address: '198.18.57.11',\n mode: 'local',\n offers: ['net', 'http', 'ssh'],\n policy: 'every public address, this machine, and the local network',\n exit: true,\n state: 'connected',\n browsers: [{ runtime: 'quay-studio/chrome', name: 'Chrome' }],\n control: { allowed: true, fixed: true },\n folders: [{ name: 'sketches', source: 'quay-studio/sketches', readonly: false }],\n },\n {\n id: 'link-pier',\n name: 'slicc on pier-nuc',\n host: 'pier-nuc.slicc.internal',\n address: '198.18.57.12',\n mode: 'remote',\n offers: ['net', 'ssh'],\n policy: 'every public address and the local network',\n exit: true,\n state: 'connected',\n browsers: [{ runtime: 'pier-nuc/chrome', name: 'Chrome' }],\n control: { allowed: false },\n folders: [\n { name: 'proj', source: 'pier-nuc/proj', readonly: false },\n { name: 'archive', source: 'pier-nuc/archive', readonly: true },\n ],\n },\n {\n id: 'link-dock',\n name: 'slicc on dock-builder',\n host: 'dock-builder.slicc.internal',\n address: '198.18.57.13',\n mode: 'remote',\n offers: ['http'],\n policy: 'this machine',\n exit: false,\n state: 'connected',\n control: { allowed: false },\n },\n];\n\nexport function folderFiles(folder: LinkedFolder): Record<string, string> {\n return {\n 'README.md': `# ${folder.name}\\n\\nShared from ${folder.source}.\\n`,\n 'notes.txt': 'Tide tables, rope lengths, and a list of knots to learn.\\n',\n };\n}\n\nexport function joinUrl(rotation = 0): string {\n return `https://join.slicc.example/l/${rotation ? `r${rotation}-` : ''}7Hq2kd9FXw3m`;\n}\n\nexport function followUrl(rotation = 0): string {\n return `https://seven.slicc.example/#follow=${joinUrl(rotation)}`;\n}\n\nconst followers: readonly LinkedDevice[] = [\n {\n id: 'link-quay',\n name: 'slicc on quay-studio',\n host: 'quay-studio.slicc.internal',\n address: '198.18.57.11',\n mode: 'local',\n offers: ['net', 'http', 'ssh'],\n exit: true,\n state: 'connected',\n kind: 'cli',\n access: { control: true, fixed: true },\n },\n {\n id: 'link-pier',\n name: 'slicc on pier-nuc',\n host: 'pier-nuc.slicc.internal',\n address: '198.18.57.12',\n mode: 'remote',\n offers: ['net', 'ssh'],\n exit: true,\n state: 'connected',\n kind: 'cli',\n access: { control: true },\n controlling: 'prompt',\n },\n {\n id: 'link-bay',\n name: 'SLICC on bay-laptop',\n host: '',\n address: '',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'connected',\n kind: 'seven',\n access: { view: true, control: true, terminal: true },\n controlling: 'watch',\n terminals: 1,\n },\n {\n id: 'link-reef',\n name: 'SLICC on reef-phone',\n host: '',\n address: '',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'connected',\n kind: 'seven',\n access: { view: true, control: false, terminal: false },\n controlling: 'watch',\n },\n {\n id: 'link-tide',\n name: 'SLICC on tide-tablet',\n host: '',\n address: '',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'connected',\n kind: 'seven',\n asking: true,\n access: { view: false, control: false, terminal: false },\n },\n];\n\nexport const pairingCode = 'ab12\u2026ef';\n\nexport const pairingRefused = 'That isn\u2019t a pairing link from slicc pair.';\n\nexport const pairingStopped = 'slicc on this computer stopped answering. Run slicc pair again.';\n\nexport const pairedDevice: LinkedDevice = {\n id: 'link-quay',\n name: 'slicc on quay-studio',\n host: 'quay-studio.slicc.internal',\n address: '198.18.57.11',\n mode: 'local',\n kind: 'cli',\n offers: ['net', 'http', 'ssh'],\n exit: true,\n state: 'connected',\n folders: [{ name: 'sketches', source: 'quay-studio/sketches', readonly: false }],\n};\n\nexport const forgottenDevice: LinkedDevice = {\n ...pairedDevice,\n state: 'offline',\n note: 'SLICC on quay-studio no longer knows this seven. Pair it again.',\n};\n\nexport const outdatedDevice: LinkedDevice = {\n ...pairedDevice,\n note: 'Update slicc to 1.47.0 or later to share this computer\u2019s browsers.',\n};\n\nconst others = linkedDevices.filter((device) => device.id !== pairedDevice.id);\n\nexport function grant(device: LinkedDevice, key: AccessKey, allowed: boolean): LinkedDevice {\n const access = { ...device.access, [key]: allowed };\n if (key === 'view' && !allowed && 'control' in access) access.control = false;\n const next: LinkedDevice = { ...device, access, asking: device.asking && !access.view };\n if (!access.view && !access.control) next.controlling = undefined;\n else if (!access.control && next.controlling === 'prompt') next.controlling = 'watch';\n if (!access.terminal) next.terminals = undefined;\n return next;\n}\n\nexport function linksFixtures(\n scenario: LinksScenario,\n rotation = 0\n): { links: NetworkLinks; exit: NetworkExit } {\n const url = joinUrl(rotation);\n const base = {\n joinUrl: url,\n joinCommand: `npx sliccy@next ${url} follow`,\n followUrl: followUrl(rotation),\n permission: null,\n };\n if (scenario === 'preparing') {\n return {\n links: { ...base, joinUrl: null, joinCommand: null, followUrl: null, devices: [] },\n exit: null,\n };\n }\n if (scenario === 'pairing')\n return { links: { ...base, devices: others, pairing: { state: 'idle' } }, exit: null };\n if (scenario === 'pairing-notray')\n return { links: { devices: others, permission: null, pairing: { state: 'idle' } }, exit: null };\n if (scenario === 'forgotten' || scenario === 'outdated') {\n const device = scenario === 'forgotten' ? forgottenDevice : outdatedDevice;\n return {\n links: { ...base, devices: [device, ...others], pairing: { state: 'idle' } },\n exit: null,\n };\n }\n if (scenario === 'followers') return { links: { ...base, devices: followers }, exit: null };\n if (scenario === 'none') return { links: { ...base, devices: [] }, exit: null };\n if (scenario === 'prompt') {\n return { links: { ...base, devices: [], permission: 'prompt' }, exit: null };\n }\n if (scenario === 'denied') {\n return { links: { ...base, devices: [], permission: 'denied' }, exit: null };\n }\n if (scenario === 'reconnecting') {\n const devices = linkedDevices.map((device) =>\n device.id === 'link-pier' ? { ...device, state: 'reconnecting' as const } : device\n );\n return { links: { ...base, devices }, exit: { kind: 'link', id: 'link-pier' } };\n }\n if (scenario === 'remote') {\n const devices: LinkedDevice[] = linkedDevices.map((device) => {\n if (device.id === 'link-quay') return { ...device, controlling: 'watch' };\n if (device.id === 'link-pier')\n return { ...device, control: { allowed: true }, controlling: 'prompt' };\n return device;\n });\n devices.push({\n id: 'link-reef',\n name: 'slicc on reef-laptop',\n host: 'reef-laptop.slicc.internal',\n address: '198.18.57.14',\n mode: 'remote',\n offers: [],\n exit: false,\n state: 'offline',\n control: { allowed: false },\n });\n return { links: { ...base, devices }, exit: null };\n }\n return {\n links: { ...base, devices: linkedDevices },\n exit: scenario === 'exit' ? { kind: 'link', id: 'link-quay' } : null,\n };\n}\n\nexport class DummyNetwork extends Emitter<{ network: NetworkStatus }> implements NetworkPort {\n scenario: NetworkScenario;\n #base: NetworkStatus;\n #status: NetworkStatus;\n #clock: Clock;\n #tailnet: TailnetStatus | undefined;\n #links: NetworkLinks | undefined;\n #exit: NetworkExit = null;\n #rotation = 0;\n setExit?: (exit: NetworkExit) => Promise<void>;\n unlink?: (id: string) => Promise<void>;\n setRemoteControl?: (id: string, allowed: boolean) => Promise<void>;\n setAccess?: (id: string, key: AccessKey, allowed: boolean) => Promise<void>;\n rotateJoinUrl?: () => Promise<void>;\n retryLinks?: () => Promise<void>;\n mountFolder?: (source: string) => Promise<string>;\n ejectFolder?: (source: string) => Promise<void>;\n retryLeader?: (id: string) => Promise<void>;\n disconnectLeader?: (id: string) => Promise<void>;\n reconnectLeader?: (id: string) => Promise<void>;\n forgetLeader?: (id: string) => Promise<void>;\n pairComputer?: (url: string) => Promise<void>;\n confirmPairing?: () => Promise<void>;\n cancelPairing?: () => Promise<void>;\n #pairUrl = '';\n #leaders: Leader[] | undefined;\n #files: DummyFiles | undefined;\n\n constructor(\n scenario: NetworkScenario,\n clock: Clock,\n tailnet?: TailnetScenario,\n links?: LinksScenario,\n files?: DummyFiles,\n leaders?: LeadersScenario\n ) {\n super();\n this.scenario = scenario;\n this.#clock = clock;\n this.#tailnet = tailnet ? tailnetFixtures(tailnet) : undefined;\n if (links) {\n ({ links: this.#links, exit: this.#exit } = linksFixtures(links));\n this.setExit = (exit) => this.#setExit(exit);\n this.unlink = (id) => this.#unlink(id);\n this.setRemoteControl = (id, allowed) => this.#control(id, allowed);\n this.setAccess = (id, key, allowed) => this.#access(id, key, allowed);\n this.rotateJoinUrl = () => this.#rotate();\n this.retryLinks = () => this.#retry();\n this.mountFolder = (source) => this.#mountFolder(source);\n this.ejectFolder = (source) => this.#ejectFolder(source);\n this.pairComputer = (url) => this.#pair(url);\n this.confirmPairing = () => this.#confirmPairing();\n this.cancelPairing = () => this.#cancelPairing();\n this.#files = files;\n files?.on('mounts', (targets) => this.#mounted(targets));\n }\n if (leaders) {\n this.#leaders = leadersFixtures(leaders);\n this.retryLeader = (id) => this.#retryLeader(id);\n this.reconnectLeader = (id) => this.#retryLeader(id);\n this.disconnectLeader = (id) => this.#disconnectLeader(id);\n this.forgetLeader = (id) => this.#dropLeader(id);\n }\n this.#base = networkFixtures(scenario);\n this.#status = this.#with(this.#base);\n }\n\n #withLeaders(status: NetworkStatus): NetworkStatus {\n const leaders = this.#leaders;\n if (!leaders) return status;\n this.#leaders = leaders.filter((leader) => leader.state !== 'unlinked');\n return { ...status, leaders };\n }\n\n #leader(id: string, change: Partial<Leader>): void {\n this.#leaders = (this.#leaders as Leader[]).map((leader) => {\n if (leader.id !== id) return leader;\n const { error: _, ...rest } = leader;\n return { ...rest, ...change };\n });\n this.#emit();\n }\n\n async #retryLeader(id: string): Promise<void> {\n this.#leader(id, { state: 'connecting' });\n await this.#clock.sleep(8);\n this.#leader(id, { state: 'connected' });\n }\n\n async #disconnectLeader(id: string): Promise<void> {\n await this.#clock.sleep(4);\n this.#leader(id, { state: 'disconnected' });\n }\n\n async #dropLeader(id: string): Promise<void> {\n await this.#clock.sleep(4);\n this.#leaders = (this.#leaders as Leader[]).filter((leader) => leader.id !== id);\n this.#emit();\n }\n\n #with(status: NetworkStatus): NetworkStatus {\n return this.#withLeaders(this.#withLinks(status));\n }\n\n #withLinks(status: NetworkStatus): NetworkStatus {\n const links = this.#links;\n if (!links) return this.#withTailnet(status);\n const exit = this.#exit;\n const direct = status.route === 'link' && exit?.kind !== 'link';\n const base: NetworkStatus = direct\n ? { ...status, route: 'page', detail: null, browser: { via: null } }\n : status;\n const linked = { ...base, links, exit };\n const device =\n exit?.kind === 'link' ? links.devices.find((item) => item.id === exit.id) : undefined;\n const browsing = links.devices.some(\n (item) => item.state === 'connected' && item.browsers?.length\n );\n const routed = this.#withTailnet(\n browsing && linked.browser?.via === null ? { ...linked, browser: { via: 'link' } } : linked\n );\n if (!device) return routed;\n return { ...routed, health: device.state === 'connected' ? 'ok' : 'failing', detail: null };\n }\n\n #withTailnet(status: NetworkStatus): NetworkStatus {\n const tailnet = this.#tailnet;\n if (!tailnet) return status;\n const exit = tailnet.state === 'running' ? tailnet.exitNode : null;\n if (!exit) return { ...status, tailnet };\n return {\n ...status,\n route: 'tailnet',\n health: 'ok',\n detail: `${exit} carries everything except this computer\u2019s own services.`,\n tailnet,\n exit: this.#links ? status.exit : null,\n };\n }\n\n #set(tailnet: TailnetStatus): void {\n this.#tailnet = tailnet;\n this.#emit();\n }\n\n #emit(): void {\n this.#status = this.#with(this.#base);\n this.emit('network', this.#status);\n }\n\n setLinks(scenario: LinksScenario): void {\n ({ links: this.#links, exit: this.#exit } = linksFixtures(scenario, this.#rotation));\n this.#emit();\n }\n\n async #setExit(exit: NetworkExit): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n if (exit?.kind === 'link') {\n const device = links.devices.find((item) => item.id === exit.id);\n if (!device?.exit || device.state !== 'connected') {\n throw new Error('That device can\u2019t carry internet traffic right now.');\n }\n }\n if (this.#tailnet) {\n const node = exit?.kind === 'tailnet' ? exit.node : null;\n await this.setExitNode(node);\n }\n this.#exit = exit;\n this.#emit();\n }\n\n async #control(id: string, allowed: boolean): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n const devices = links.devices.map((device) => {\n if (device.id !== id) return device;\n const next = { ...device, control: { ...device.control, allowed } };\n return allowed ? next : { ...next, controlling: undefined };\n });\n this.#links = { ...links, devices };\n this.#emit();\n }\n\n async #access(id: string, key: AccessKey, allowed: boolean): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n const devices = links.devices.map((device) =>\n device.id === id ? grant(device, key, allowed) : device\n );\n this.#links = { ...links, devices };\n this.#emit();\n }\n\n async #unlink(id: string): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n this.#links = { ...links, devices: links.devices.filter((device) => device.id !== id) };\n if (this.#exit?.kind === 'link' && this.#exit.id === id) this.#exit = null;\n this.#emit();\n }\n\n #folder(source: string): LinkedFolder {\n const folder = this.#links?.devices\n .flatMap((device) => device.folders ?? [])\n .find((item) => item.source === source);\n if (!folder) throw new Error(`No linked device shares ${source}.`);\n return folder;\n }\n\n #mark(mounted: (folder: LinkedFolder) => string | undefined): void {\n const links = this.#links as NetworkLinks;\n const devices = links.devices.map((device) =>\n device.folders\n ? {\n ...device,\n folders: device.folders.map((folder) => {\n const { mounted: _, ...rest } = folder;\n const at = mounted(folder);\n return at ? { ...rest, mounted: at } : rest;\n }),\n }\n : device\n );\n this.#links = { ...links, devices };\n this.#emit();\n }\n\n #mounted(targets: readonly string[]): void {\n this.#mark((folder) => targets.find((target) => target === `/mnt/${folder.source}`));\n }\n\n async #mountFolder(source: string): Promise<string> {\n const folder = this.#folder(source);\n if (folder.mounted) return folder.mounted;\n const target = `/mnt/${source}`;\n if (this.#files) await this.#files.attach(target, source, folderFiles(folder));\n else await this.#clock.sleep();\n this.#mark((item) => (item.source === source ? target : item.mounted));\n return target;\n }\n\n async #ejectFolder(source: string): Promise<void> {\n const folder = this.#folder(source);\n if (!folder.mounted) throw new Error(`${source} isn\u2019t mounted.`);\n if (this.#files?.eject) await this.#files.eject(folder.mounted);\n else await this.#clock.sleep();\n this.#mark((item) => (item.source === source ? undefined : item.mounted));\n }\n\n async #rotate(): Promise<void> {\n await this.#clock.sleep(4);\n this.#rotation += 1;\n const url = joinUrl(this.#rotation);\n this.#links = {\n ...(this.#links as NetworkLinks),\n joinUrl: url,\n joinCommand: `npx sliccy@next ${url} follow`,\n followUrl: followUrl(this.#rotation),\n };\n this.#emit();\n }\n\n #pairing(pairing: LinkPairing, devices?: readonly LinkedDevice[]): void {\n const links = this.#links as NetworkLinks;\n this.#links = { ...links, pairing, devices: devices ?? links.devices };\n this.#emit();\n }\n\n async #pair(url: string): Promise<void> {\n await this.#clock.sleep(4);\n if (!/#slicc-pair=./.test(url)) throw new Error(pairingRefused);\n this.#pairUrl = url;\n this.#pairing({ state: 'confirm', code: pairingCode });\n }\n\n async #confirmPairing(): Promise<void> {\n this.#pairing({ state: 'linking', code: pairingCode });\n await this.#clock.sleep(8);\n if (this.#links?.pairing?.state !== 'linking') return;\n if (this.#pairUrl.includes('fail')) {\n this.#pairing({ state: 'failed', code: pairingCode, error: pairingStopped });\n return;\n }\n const devices = (this.#links as NetworkLinks).devices.filter(\n (device) => device.id !== pairedDevice.id\n );\n this.#pairing({ state: 'linked', code: pairingCode, name: 'SLICC on quay-studio' }, [\n pairedDevice,\n ...devices,\n ]);\n }\n\n async #cancelPairing(): Promise<void> {\n await this.#clock.sleep(2);\n this.#pairUrl = '';\n this.#pairing({ state: 'idle' });\n }\n\n async #retry(): Promise<void> {\n await this.#clock.sleep(4);\n const links = this.#links as NetworkLinks;\n const devices = links.devices.length ? links.devices : linkedDevices.slice(0, 1);\n this.#links = { ...links, permission: null, devices };\n this.#emit();\n }\n\n status(): NetworkStatus {\n return this.#status;\n }\n\n setScenario(scenario: NetworkScenario): void {\n this.scenario = scenario;\n this.#base = networkFixtures(scenario);\n this.#status = this.#with(this.#base);\n this.emit('network', this.#status);\n }\n\n async check(): Promise<void> {\n await this.#clock.sleep(4);\n if (this.#tailnet?.state === 'failed') this.#tailnet = tailnetFixtures('running');\n this.#base = networkFixtures(this.scenario);\n this.#status = this.#with(this.#base);\n this.emit('network', this.#status);\n }\n\n async setTailnet(on: boolean): Promise<void> {\n await this.#clock.sleep(4);\n this.#set(tailnetFixtures(on ? 'needs-login' : 'off'));\n }\n\n async submitAuthKey(key: string): Promise<void> {\n if (!key.startsWith('tskey-')) {\n throw new Error('That isn\u2019t a Tailscale auth key. Auth keys start with tskey-.');\n }\n this.#set({ ...tailnetFixtures('off'), state: 'starting', detail: 'Joining your tailnet\u2026' });\n await this.#clock.sleep(8);\n this.#set(tailnetFixtures('running'));\n }\n\n async setExitNode(id: string | null): Promise<void> {\n await this.#clock.sleep(4);\n const tailnet = this.#tailnet ?? tailnetFixtures('running');\n const nodes = tailnet.exitNodes ?? [];\n if (id === 'auto') {\n const node = nodes.find((item) => item.online);\n this.#set({ ...tailnet, autoExitNode: true, exitNode: node?.name ?? null });\n return;\n }\n const node = nodes.find((item) => item.id === id);\n if (id && !node?.online) throw new Error('That exit node is offline.');\n this.#set({ ...tailnet, autoExitNode: false, exitNode: node?.name ?? null });\n }\n\n async logoutTailnet(): Promise<void> {\n await this.#clock.sleep(4);\n this.#set(tailnetFixtures('needs-login'));\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { Notice, NoticesPort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type NoticeScenario = 'storage' | 'mixed' | 'fail' | 'readonly' | 'starting';\n\nexport const readOnlyText =\n 'Watch only. The SLICC you follow runs a newer version. Update this one to send prompts.';\n\nexport const startingText = 'Seven is installing its agent.';\n\nexport const noticeFixtures: Record<\n 'storage' | 'welcome' | 'backup' | 'readonly' | 'starting',\n Notice\n> = {\n storage: {\n id: 'storage',\n tone: 'warning',\n title: 'Your files may be cleared',\n body: 'This browser may clear seven\u2019s files and chats when the disk runs low on space. Bookmarking this page makes that less likely.',\n actions: [{ id: 'retry', label: 'Try again' }],\n },\n welcome: {\n id: 'welcome',\n tone: 'info',\n title: 'Everything stays in this browser',\n body: 'Seven keeps your files and chats on this computer. Nothing is uploaded unless you send it.',\n actions: [],\n },\n backup: {\n id: 'backup',\n tone: 'info',\n title: 'A backup of your chats is ready',\n body: 'Seven saved a copy of your files and chats. Download it to keep one outside this browser.',\n actions: [{ id: 'download', label: 'Download' }],\n },\n readonly: {\n id: 'readonly',\n tone: 'warning',\n title: 'Update SLICC to send prompts',\n body: 'The SLICC you follow moved to a newer version. Until you update SLICC on this device, it can only watch.',\n actions: [],\n dismissible: false,\n },\n starting: {\n id: 'starting',\n tone: 'info',\n title: 'Seven is installing its agent',\n body: 'The chat starts once the agent is installed. Messages you send now wait for it.',\n actions: [],\n dismissible: false,\n },\n};\n\nexport class DummyNotices extends Emitter<{ notices: readonly Notice[] }> implements NoticesPort {\n #scenario: NoticeScenario;\n #time: Clock;\n #notices: readonly Notice[];\n\n constructor(scenario: NoticeScenario, time: Clock) {\n super();\n this.#scenario = scenario;\n this.#time = time;\n this.#notices =\n scenario === 'mixed'\n ? [noticeFixtures.storage, noticeFixtures.welcome]\n : scenario === 'readonly' || scenario === 'starting'\n ? [noticeFixtures[scenario]]\n : scenario === 'fail'\n ? [noticeFixtures.storage, noticeFixtures.backup]\n : [noticeFixtures.storage];\n }\n\n list(): readonly Notice[] {\n return this.#notices;\n }\n\n async act(id: string, action: string): Promise<void> {\n await this.#time.sleep(10);\n if (this.#scenario === 'fail') {\n throw new Error(\n id === 'backup'\n ? 'The browser blocked the download. Allow downloads for this page, then try again.'\n : 'The browser declined again. Bookmark this page, then try again.'\n );\n }\n if (id === 'storage' && action === 'retry') this.#remove(id);\n }\n\n dismiss(id: string): void {\n this.#remove(id);\n }\n\n readOnly(on: boolean): void {\n this.#toggle('readonly', on);\n }\n\n starting(on: boolean): void {\n this.#toggle('starting', on);\n }\n\n #toggle(id: 'readonly' | 'starting', on: boolean): void {\n const shown = this.#notices.some((notice) => notice.id === id);\n if (on === shown) return;\n if (on) {\n this.#notices = [noticeFixtures[id], ...this.#notices];\n this.emit('notices', this.#notices);\n } else {\n this.#remove(id);\n }\n }\n\n #remove(id: string): void {\n this.#notices = this.#notices.filter((notice) => notice.id !== id);\n this.emit('notices', this.#notices);\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n FilePort,\n Sprinkle,\n SprinkleCgiChunk,\n SprinkleCgiReply,\n SprinkleEvents,\n SprinkleMethod,\n SprinklePort,\n} from '../model/types.ts';\nimport type { DummyAgent } from './agent.ts';\n\nexport function homePath(path: unknown): string {\n const text = String(path);\n const mapped = text.startsWith('/shared/') ? `/home/${text.slice('/shared/'.length)}` : text;\n const parts = mapped.split('/');\n if (!mapped.startsWith('/home/') || parts.some((part) => part === '.' || part === '..'))\n throw new Error(`EACCES: ${text} is outside /home`);\n return mapped;\n}\n\nconst base64 = (bytes: Uint8Array) => btoa(String.fromCharCode(...bytes));\n\nconst unbase64 = (text: string) =>\n new TextDecoder().decode(Uint8Array.from(atob(text), (char) => char.charCodeAt(0)));\n\nexport function cannedCgi(request: unknown): string {\n const given = (request ?? {}) as Record<string, unknown>;\n const headers = Array.isArray(given.headers) ? (given.headers as [string, string][]) : [];\n const type = headers.find(([name]) => String(name).toLowerCase() === 'content-type');\n return `${JSON.stringify({\n ok: true,\n method: given.method ?? 'GET',\n path: given.path ?? '',\n query: given.query ?? '',\n type: type?.[1] ?? null,\n body: typeof given.body === 'string' ? unbase64(given.body) : null,\n })}\\n`;\n}\n\nexport class DummySprinkles extends Emitter<SprinkleEvents> implements SprinklePort {\n #sprinkles: Sprinkle[];\n #agent: DummyAgent;\n #files: FilePort;\n #state = new Map<string, unknown>();\n #streams = new Map<string, Uint8Array>();\n #next = 0;\n\n constructor(sprinkles: readonly Sprinkle[], agent: DummyAgent, files: FilePort) {\n super();\n this.#sprinkles = sprinkles.map((sprinkle) => ({ ...sprinkle }));\n this.#agent = agent;\n this.#files = files;\n }\n\n list(): readonly Sprinkle[] {\n return this.#sprinkles.map((sprinkle) => ({ ...sprinkle }));\n }\n\n send(id: string, payload: unknown): void {\n const sprinkle = this.#sprinkles.find((candidate) => candidate.id === id);\n if (!sprinkle) return;\n const data = (payload ?? {}) as { action?: string; data?: unknown };\n this.#agent.lick(\n sprinkle.agentId,\n 'sprinkle',\n sprinkle.title,\n data.action || 'event',\n JSON.stringify(data.data ?? null, null, 2)\n );\n }\n\n async call(id: string, method: SprinkleMethod, args: readonly unknown[]): Promise<unknown> {\n if (method === 'getState') return structuredClone(this.#state.get(id) ?? null);\n if (method === 'setState') {\n this.#state.set(id, structuredClone(args[0] ?? null));\n return undefined;\n }\n if (method === 'cgi') return this.#cgi(args[0]);\n if (method === 'cgiRead') return this.#read(String(args[0]));\n if (method === 'cgiClose') {\n this.#streams.delete(String(args[0]));\n return null;\n }\n const path = homePath(args[0]);\n if (method === 'exists') return (await this.#files.list()).some((entry) => entry.path === path);\n return this.#files.read(path);\n }\n\n #cgi(request: unknown): SprinkleCgiReply {\n const bytes = new TextEncoder().encode(cannedCgi(request));\n const half = Math.ceil(bytes.length / 2);\n const stream = `dummy-cgi-${++this.#next}`;\n this.#streams.set(stream, bytes.subarray(half));\n return {\n status: 200,\n statusText: 'OK',\n headers: [\n ['Content-Type', 'application/json'],\n ['X-Slicc-Cgi', 'dummy'],\n ],\n body: base64(bytes.subarray(0, half)),\n done: false,\n stream,\n };\n }\n\n #read(stream: string): SprinkleCgiChunk {\n const rest = this.#streams.get(stream);\n if (rest === undefined) throw new Error(`there is no cgi-bin stream ${stream}`);\n this.#streams.delete(stream);\n return { body: base64(rest), done: true };\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { TabsPort, TabsState } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type TabsScenario =\n | 'owner'\n | 'follower'\n | 'connecting'\n | 'stalled'\n | 'newer'\n | 'older'\n | 'alone';\n\nexport function tabsFixtures(scenario: TabsScenario): TabsState {\n if (scenario === 'stalled') return { role: 'follower', stalled: true, skew: null };\n if (scenario === 'newer' || scenario === 'older')\n return { role: 'follower', stalled: false, skew: scenario };\n return { role: scenario, stalled: false, skew: null };\n}\n\nexport class DummyTabs extends Emitter<{ tabs: TabsState }> implements TabsPort {\n #state: TabsState;\n #time: Clock;\n reloads = 0;\n\n constructor(scenario: TabsScenario, time: Clock) {\n super();\n this.#state = tabsFixtures(scenario);\n this.#time = time;\n }\n\n state(): TabsState {\n return { ...this.#state };\n }\n\n setScenario(scenario: TabsScenario): void {\n this.#state = tabsFixtures(scenario);\n this.emit('tabs', this.state());\n }\n\n reload(): void {\n this.reloads++;\n this.setScenario('connecting');\n void this.#time.sleep(20).then(() => this.setScenario('follower'));\n }\n}\n", "import type { TerminalBackend, TerminalSession, TerminalSignal, TerminalSink } from '../backend.ts';\nimport type { FilePort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst home = '/home/user';\n\nexport function resolve(cwd: string, target: string): string {\n const path = target === '~' || target.startsWith('~/') ? home + target.slice(1) : target;\n const parts = (path.startsWith('/') ? path : `${cwd}/${path}`).split('/');\n const out: string[] = [];\n for (const part of parts) {\n if (part === '..') out.pop();\n else if (part && part !== '.') out.push(part);\n }\n return `/${out.join('/')}`;\n}\n\nfunction shorten(cwd: string): string {\n return cwd === home || cwd.startsWith(`${home}/`) ? `~${cwd.slice(home.length)}` : cwd;\n}\n\ntype Command = (args: string[]) => Promise<void> | void;\n\nexport class FakeShell implements TerminalSession {\n #sink: TerminalSink;\n #files: FilePort;\n #clock: Clock;\n #line = '';\n #escape = false;\n #busy = false;\n #interrupted = false;\n #history: string[] = [];\n #commands: Record<string, Command>;\n #onCwd: ((cwd: string) => void) | undefined;\n cwd: string;\n closed = false;\n\n constructor(\n sink: TerminalSink,\n files: FilePort,\n cwd: string,\n clock: Clock,\n onCwd?: (cwd: string) => void\n ) {\n this.#sink = sink;\n this.#files = files;\n this.#clock = clock;\n this.cwd = cwd;\n this.#onCwd = onCwd;\n this.#commands = {\n help: () => this.#print('Commands: cat cd clear date echo exit git help ls npm pwd whoami'),\n pwd: () => this.#print(this.cwd),\n whoami: () => this.#print('user'),\n date: () => this.#print(new Date().toUTCString()),\n echo: (args) => this.#print(args.join(' ')),\n clear: () => this.#out('\\x1b[2J\\x1b[H'),\n exit: () => this.#exit(),\n cd: (args) => this.#cd(args[0] ?? '~'),\n ls: (args) => this.#ls(args.filter((arg) => !arg.startsWith('-'))[0] ?? '.'),\n cat: (args) => this.#cat(args),\n git: (args) => this.#git(args[0]),\n npm: (args) => this.#npm(args[0]),\n };\n this.#prompt();\n }\n\n #out(text: string): void {\n this.#sink.output(encoder.encode(text));\n }\n\n #print(text: string): void {\n this.#out(`${text.replace(/\\n/g, '\\r\\n')}\\r\\n`);\n }\n\n #prompt(): void {\n this.#out(`\\x1b[1;32muser@slicc\\x1b[0m:\\x1b[1;34m${shorten(this.cwd)}\\x1b[0m$ `);\n }\n\n #exit(): void {\n this.closed = true;\n this.#sink.exit(0);\n }\n\n async #entries(): Promise<Map<string, 'file' | 'directory'>> {\n return new Map((await this.#files.list()).map((entry) => [entry.path, entry.kind]));\n }\n\n async #cd(target: string): Promise<void> {\n const path = resolve(this.cwd, target);\n if (path === '/' || (await this.#entries()).get(path) === 'directory') {\n this.cwd = path;\n this.#onCwd?.(path);\n } else this.#print(`bash: cd: ${target}: No such file or directory`);\n }\n\n async #ls(target: string): Promise<void> {\n const path = resolve(this.cwd, target);\n const entries = await this.#entries();\n const prefix = path === '/' ? '/' : `${path}/`;\n const names = [...entries]\n .filter(\n ([candidate]) =>\n candidate.startsWith(prefix) && !candidate.slice(prefix.length).includes('/')\n )\n .map(([candidate, kind]) => {\n const name = candidate.slice(prefix.length);\n return kind === 'directory' ? `\\x1b[1;34m${name}\\x1b[0m` : name;\n });\n if (path !== '/' && !entries.has(path))\n this.#print(`ls: cannot access '${target}': No such file or directory`);\n else if (names.length > 0) this.#print(names.join(' '));\n }\n\n async #cat(args: string[]): Promise<void> {\n for (const arg of args) {\n const text = await this.#files.read(resolve(this.cwd, arg)).catch(() => null);\n if (text === null) this.#print(`cat: ${arg}: No such file or directory`);\n else this.#out(text.replace(/\\n/g, '\\r\\n'));\n }\n }\n\n #git(sub: string | undefined): void {\n if (sub !== 'status') {\n this.#print('usage: git status');\n return;\n }\n const changes = this.#files.changes();\n this.#print('On branch main');\n if (changes.length === 0) {\n this.#print('nothing to commit, working tree clean');\n return;\n }\n this.#print('Changes not staged for commit:');\n const colors = { added: 32, modified: 33, deleted: 31 };\n for (const change of changes) {\n this.#print(`\\t\\x1b[${colors[change.status]}m${change.status}: ${change.path}\\x1b[0m`);\n }\n }\n\n async #npm(sub: string | undefined): Promise<void> {\n if (sub !== 'test') {\n this.#print('usage: npm test');\n return;\n }\n const lines = [\n '> harbor@0.0.0 test',\n '> node --test test/',\n '',\n '\\x1b[32m\u2714\\x1b[0m converts both ways \\x1b[90m(0.6ms)\\x1b[0m',\n '\\x1b[32m\u2714\\x1b[0m expires entries from the previous day \\x1b[90m(0.4ms)\\x1b[0m',\n '\\x1b[32m\u2714\\x1b[0m retries upstream timeouts \\x1b[90m(3.1ms)\\x1b[0m',\n '\u2139 tests 3',\n '\u2139 pass 3',\n '\u2139 fail 0',\n ];\n for (const line of lines) {\n await this.#clock.sleep(2);\n if (this.closed || this.#interrupted) return;\n this.#print(line);\n }\n }\n\n async #run(line: string): Promise<void> {\n const [name, ...args] = line.trim().split(/\\s+/);\n if (!name) return;\n this.#history.push(line);\n const command = this.#commands[name];\n if (command) await command(args);\n else this.#print(`bash: ${name}: command not found`);\n }\n\n #key(char: string): void {\n if (this.#escape) {\n this.#escape = !/[A-Za-z~]/.test(char) || char === '[';\n return;\n }\n if (char === '\\x1b') this.#escape = true;\n else if (char === '\\r') this.#enter();\n else if (char === '\\x7f') this.#backspace();\n else if (char === '\\x03') this.signal('SIGINT');\n else if (char === '\\x0c') {\n this.#out('\\x1b[2J\\x1b[H');\n this.#prompt();\n this.#out(this.#line);\n } else if (char >= ' ') {\n this.#line += char;\n this.#out(char);\n }\n }\n\n #backspace(): void {\n if (!this.#line) return;\n this.#line = [...this.#line].slice(0, -1).join('');\n this.#out('\\b \\b');\n }\n\n #enter(): void {\n const line = this.#line;\n this.#line = '';\n this.#out('\\r\\n');\n this.#busy = true;\n this.#interrupted = false;\n void this.#run(line).then(() => {\n this.#busy = false;\n if (!this.closed) this.#prompt();\n });\n }\n\n history(): readonly string[] {\n return this.#history;\n }\n\n write(data: Uint8Array): void {\n if (this.closed) return;\n const text = decoder.decode(data);\n if (!this.#busy) for (const char of text) this.#key(char);\n else if (text.includes('\\x03')) this.signal('SIGINT');\n }\n\n resize(): void {}\n\n signal(name: TerminalSignal): void {\n if (name === 'SIGHUP') {\n this.#exit();\n return;\n }\n this.#line = '';\n this.#interrupted = this.#busy;\n this.#out('^C\\r\\n');\n if (!this.#busy) this.#prompt();\n }\n\n close(): void {\n this.closed = true;\n }\n}\n\nexport function shellBackend(\n files: FilePort,\n cwd: string,\n clock: Clock,\n onCwd?: (cwd: string) => void\n): TerminalBackend {\n return { open: (sink) => new FakeShell(sink, files, cwd, clock, onCwd) };\n}\n", "import type { TerminalBackend } from '../backend.ts';\nimport { Emitter } from '../model/emitter.ts';\nimport type { FilePort, TerminalEvents, TerminalInfo, TerminalPort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { shellBackend } from './shell.ts';\n\nexport class DummyTerminals extends Emitter<TerminalEvents> implements TerminalPort {\n #terminals: TerminalInfo[];\n #backends = new Map<string, TerminalBackend>();\n #files: FilePort;\n #clock: Clock;\n #next: number;\n\n constructor(terminals: readonly TerminalInfo[], files: FilePort, clock: Clock) {\n super();\n this.#files = files;\n this.#clock = clock;\n this.#terminals = terminals.map((terminal) => ({ ...terminal }));\n this.#next = this.#terminals.length + 1;\n }\n\n list(): readonly TerminalInfo[] {\n return this.#terminals.map((terminal) => ({ ...terminal }));\n }\n\n open({\n cwd = '/workspace/harbor',\n agentId = null,\n }: {\n cwd?: string;\n agentId?: string | null;\n } = {}): TerminalInfo {\n const terminal: TerminalInfo = {\n id: `term-${this.#next}`,\n title: `bash ${this.#next}`,\n cwd,\n agentId,\n };\n this.#next += 1;\n this.#terminals.push(terminal);\n this.emit('terminals', this.list());\n return { ...terminal };\n }\n\n close(id: string): void {\n this.#terminals = this.#terminals.filter((terminal) => terminal.id !== id);\n this.#backends.delete(id);\n this.emit('terminals', this.list());\n }\n\n #move(id: string, cwd: string): void {\n const terminal = this.#terminals.find((candidate) => candidate.id === id);\n if (!terminal || terminal.cwd === cwd) return;\n terminal.cwd = cwd;\n this.emit('terminals', this.list());\n }\n\n backend(id: string): TerminalBackend {\n const terminal = this.#terminals.find((candidate) => candidate.id === id);\n if (!terminal) throw new Error(`No terminal ${id}`);\n let backend = this.#backends.get(id);\n if (!backend) {\n backend = shellBackend(this.#files, terminal.cwd, this.#clock, (cwd) => this.#move(id, cwd));\n this.#backends.set(id, backend);\n }\n return backend;\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type { TrayEvents, TrayPort, TrayStatus } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport class DummyTray extends Emitter<TrayEvents> implements TrayPort {\n #status: TrayStatus;\n #followers: TrayStatus['followers'];\n #clock: Clock;\n\n constructor(status: TrayStatus, clock: Clock) {\n super();\n this.#status = structuredClone(status);\n this.#followers = structuredClone(status.followers);\n this.#clock = clock;\n }\n\n status(): TrayStatus {\n return structuredClone(this.#status);\n }\n\n #set(patch: Partial<TrayStatus>): void {\n this.#status = { ...this.#status, ...patch };\n this.emit('status', this.status());\n }\n\n reconnect(): void {\n this.#set({ connection: 'reconnecting' });\n void this.#clock\n .sleep(15)\n .then(() => this.#set({ connection: 'live', followers: structuredClone(this.#followers) }));\n }\n\n disconnect(): void {\n this.#set({ connection: 'offline', followers: [] });\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n PackageAction,\n PackageItem,\n UpdateAction,\n UpdateItem,\n UpdateKind,\n UpdateNpm,\n UpdateRelease,\n UpdatesEvents,\n UpdatesPort,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type UpdateScenario = 'current' | 'boot' | 'starting' | 'available' | 'restart' | 'failure';\nexport type PackageScenario =\n | 'mixed'\n | 'empty'\n | 'fail'\n | 'user'\n | 'elsewhere'\n | 'npm'\n | 'checking'\n | 'offline';\nexport type BetaScenario = 'offered' | 'installed' | 'blocked' | 'failed';\nexport type PackageConfirm = (options: {\n title: string;\n body: string;\n action: string;\n variant: 'confirmation';\n}) => Promise<boolean>;\n\nconst checkedAt = Date.UTC(2026, 9, 8, 8, 42);\n\nconst tag = (\n repo: string,\n version: string,\n notes?: string,\n owner = 'ai-ecoverse'\n): UpdateRelease => ({\n version,\n url: `https://github.com/${owner}/${repo}/releases/tag/v${version}`,\n ...(notes ? { notes } : {}),\n});\n\nconst certified = (name: string, version: string) =>\n `\\n\\n<!-- cert-verify -->\\ncertified @harbor/${name}@${version} sha256=0f3c9a1e (covers ${version}; downstream: PASS)\\n<!-- /cert-verify -->\\n`;\n\nconst notes = (repo: string, version: string, sections: string) =>\n `# [${version}](https://github.com/ai-ecoverse/${repo}/compare/v${version}) (2026-10-07)\\n\\n${sections}`;\n\nconst releaseFixtures: Readonly<Record<string, readonly UpdateRelease[]>> = {\n kernel: [\n tag(\n 'harbor-kernel',\n '1.13.0',\n notes(\n 'harbor-kernel',\n '1.13.0',\n '### Features\\n\\n* **fs:** watch a folder and get one event per batch of changes\\n* **jobs:** `wait -n` returns the first job that finishes'\n ) + certified('harbor-kernel', '1.13.0')\n ),\n tag(\n 'harbor-kernel',\n '1.12.2',\n notes(\n 'harbor-kernel',\n '1.12.2',\n '### Bug Fixes\\n\\n* **net:** a slow DNS answer no longer stalls the next request'\n ) + certified('harbor-kernel', '1.12.2')\n ),\n tag(\n 'harbor-kernel',\n '1.12.1',\n notes(\n 'harbor-kernel',\n '1.12.1',\n '### Bug Fixes\\n\\n* **tty:** resizing a terminal mid-line keeps the cursor on its column'\n )\n ),\n tag('harbor-kernel', '1.12.0'),\n ],\n agent: [\n tag(\n 'harbor-agent',\n '0.25.0',\n notes(\n 'harbor-agent',\n '0.25.0',\n '### Features\\n\\n* **tools:** the agent can read a tide table from a CSV file\\n\\n### Bug Fixes\\n\\n* **chat:** a long answer keeps its code blocks intact when it is cut'\n ) + certified('harbor-agent', '0.25.0'),\n 'some-fork'\n ),\n tag('harbor-agent', '0.24.0'),\n ],\n grammars: [tag('harbor-grammars', '4.5.0')],\n};\n\nexport function updateFixtures(scenario: UpdateScenario): readonly UpdateItem[] {\n const components: readonly [UpdateKind, string, string][] = [\n ['bios', 'BIOS packages', '0.8.2'],\n ['kernel', 'Kernel', '1.12.0'],\n ['agent', 'Agent (/opt/agent)', '0.24.0'],\n ['grammars', 'Syntax grammars', '4.5.0'],\n ['global', 'Global pnpm packages', '2.3.0'],\n ['skills', 'Skills', '1.6.0'],\n ];\n const items: UpdateItem[] = components.map(([kind, label, version]) => ({\n id: kind,\n label,\n kind,\n state: 'current',\n progress: null,\n from: version,\n to: version,\n checkedAt,\n error: null,\n actions: [],\n ...(releaseFixtures[kind] ? { releases: releaseFixtures[kind] } : {}),\n }));\n const agent = items[2];\n if (scenario === 'boot') {\n Object.assign(agent, {\n state: 'downloading',\n from: null,\n progress: { phase: 'download', done: 63, total: 95 },\n log: 'Packages: +95\\nProgress: resolved 95, reused 0, downloaded 63, added 0\\nDownloading @slicc/demo-agent...',\n });\n Object.assign(items[3], {\n state: 'linking',\n progress: { phase: 'link', done: 12, total: 15 },\n log: 'Linking syntax grammars\\nProgress: linked 12 of 15',\n });\n items[4].state = 'checking';\n Object.assign(items[5], { state: 'queued', from: null });\n } else if (scenario === 'starting') {\n agent.state = 'starting';\n } else if (scenario === 'available' || scenario === 'restart') {\n Object.assign(agent, {\n state: scenario === 'available' ? 'available' : 'ready',\n to: '0.25.0',\n actions: [scenario === 'available' ? 'update-now' : 'restart-agent'],\n log:\n scenario === 'restart'\n ? 'Packages: +95\\nProgress: resolved 95, downloaded 95, added 95\\nDone in 48.2s'\n : undefined,\n });\n Object.assign(items[1], { state: 'ready', to: '1.13.0', actions: ['reload'] });\n } else if (scenario === 'failure') {\n Object.assign(items[4], {\n state: 'failed',\n to: '2.4.0',\n error: 'The package registry did not respond. Installed commands are still available.',\n actions: ['retry'],\n log: 'pnpm add -g @harbor/demo-cli@2.4.0\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms',\n });\n }\n return items;\n}\n\nconst pin = '6.6.0';\nconst latest = '6.13.5';\nconst betaReleases: readonly UpdateRelease[] = [\n tag(\n 'harbor-agent',\n '6.13.5',\n notes(\n 'harbor-agent',\n '6.13.5',\n '### Bug Fixes\\n\\n* **tools:** a tide table with a blank row no longer stops the import'\n )\n ),\n tag(\n 'harbor-agent',\n '6.10.0',\n notes(\n 'harbor-agent',\n '6.10.0',\n '### Features\\n\\n* **chat:** answers can quote a buoy reading with its time and place'\n )\n ),\n tag(\n 'harbor-agent',\n '6.6.0',\n notes('harbor-agent', '6.6.0', '### Bug Fixes\\n\\n* **chat:** a pasted chart keeps its axes') +\n certified('harbor-agent', '6.6.0')\n ),\n];\nconst offered: UpdateNpm = { state: 'offered', latest, changes: { count: 12, gated: [] } };\nconst blocked: UpdateNpm = {\n state: 'not-offered',\n latest,\n reason: 'it needs kernel 1.14.0 or later',\n};\nconst betaFailed =\n 'Couldn\u2019t install the beta: pnpm stopped with an error, shown in the install log. Retry.';\n\nfunction betaActions(item: UpdateItem): UpdateAction[] {\n return [\n ...(item.beta ? (['back-to-certified'] as const) : []),\n ...(item.npm?.state === 'offered' ? (['install-beta'] as const) : []),\n ];\n}\n\nfunction withNpm(items: readonly UpdateItem[], npm: UpdateNpm | null): readonly UpdateItem[] {\n return items.map((item) => {\n if (item.kind !== 'agent') return item;\n const next = { ...item, npm };\n const kept = item.actions.filter(\n (action) => action !== 'install-beta' && action !== 'back-to-certified'\n );\n return { ...next, actions: [...kept, ...betaActions(next)] };\n });\n}\n\nexport function betaFixtures(\n items: readonly UpdateItem[],\n scenario: BetaScenario\n): readonly UpdateItem[] {\n return items.map((item) => {\n if (item.kind !== 'agent') return item;\n const base = {\n ...item,\n from: pin,\n to: pin,\n beta: null,\n npm: offered,\n releases: betaReleases,\n };\n const next: UpdateItem =\n scenario === 'installed'\n ? {\n ...base,\n from: latest,\n to: latest,\n beta: { version: latest, certified: pin },\n npm: { state: 'current', latest },\n }\n : scenario === 'blocked'\n ? { ...base, npm: blocked }\n : scenario === 'failed'\n ? {\n ...base,\n state: 'failed',\n to: latest,\n error: betaFailed,\n log: `pnpm add @slicc/demo-agent@${latest}\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms`,\n }\n : base;\n const extra = betaActions(next);\n return {\n ...next,\n actions: [...(scenario === 'failed' ? (['retry'] as const) : item.actions), ...extra],\n };\n });\n}\n\nconst offer = (\n id: string,\n label: string,\n description: string,\n commands: readonly string[],\n offered: string,\n size: number,\n requires?: readonly string[]\n): PackageItem => ({\n id,\n package: `@harbor/${id}-wasm`,\n label,\n description,\n commands,\n ...(requires ? { requires } : {}),\n state: 'available',\n version: null,\n offered,\n size,\n progress: null,\n error: null,\n actions: ['install'],\n});\n\nconst fetchFailed = 'The download stopped. Check the connection and try again.';\n\nconst yours = (\n project: 'agent' | 'grammars' | 'user',\n name: string,\n description: string,\n version: string,\n pin: { base: string | null; range: string },\n change: Partial<PackageItem> = {}\n): PackageItem => ({\n id: `user:${project}:${name}`,\n package: name,\n label: name.replace(/^@[^/]+\\//, ''),\n description,\n commands: [],\n state: 'installed',\n version,\n offered: null,\n progress: null,\n error: null,\n actions: [pin.base === null ? 'remove' : 'unpin'],\n origin: 'user',\n pin: { ...pin, project: `/opt/${project}` },\n ...change,\n});\n\nconst userPackages = (): PackageItem[] => [\n yours('agent', '@harbor/agent-kit', 'Agent toolkit, held at your version.', '0.24.0', {\n base: '0.25.0',\n range: '0.24.0',\n }),\n yours(\n 'user',\n '@harbor/tide-math',\n 'Tide tables and harmonic constants.',\n '1.2.4',\n { base: null, range: '^1.2.0' },\n { warnings: ['Needs @harbor/wasm-x@1.2.3-4, which seven hasn\u2019t tested.'] }\n ),\n yours('grammars', '@harbor/grammar-tides', 'Syntax highlighting for .tide files.', '0.3.1', {\n base: null,\n range: '^0.3.0',\n }),\n];\n\nconst longDescription =\n 'Type-checks and compiles **TypeScript** to JavaScript. ' +\n 'See [the handbook](https://example.test/handbook) and `tsc --init`, ' +\n '<b>projects</b>, _watch mode_ and incremental builds for large monorepos with many references. '.repeat(\n 3\n );\n\nfunction fromNpm(items: readonly PackageItem[]): PackageItem[] {\n const disk: Readonly<Record<string, number>> = { git: 58_400_000, python: 85_100_000 };\n const npm = items.map((item) => ({\n ...item,\n size: disk[item.id] ?? (item.size as number) * 3,\n unpacked: true as const,\n }));\n const at = (id: string) => npm.findIndex((item) => item.id === id);\n const patch = (id: string, change: Partial<PackageItem>) => {\n npm[at(id)] = { ...npm[at(id)], ...change };\n };\n patch('tsc', { description: longDescription });\n patch('ruff', { notes: ['Rules that need a native plugin are left out in seven.'] });\n patch('esbuild', {\n state: 'available',\n actions: ['install'],\n log: undefined,\n newer: { version: '0.26.0', reason: 'needs slicc-kernel 1.48.0 or newer' },\n });\n patch('pdf', {\n state: 'available',\n offered: null,\n size: undefined,\n unpacked: undefined,\n error: null,\n log: undefined,\n actions: [],\n withheld: 'needs slicc-kernel 1.48.0 or newer',\n });\n patch('biome', {\n state: 'installed',\n offered: '2.2.4',\n actions: ['remove'],\n newer: { version: '2.3.0', reason: 'needs slicc-kernel 1.48.0 or newer' },\n });\n npm[at('biome')] = Object.assign(npm[at('biome')], {\n homepage: 'javascript:alert(1)',\n repository: { type: 'git', url: 'https://evil.example/biome' },\n });\n return npm;\n}\n\nfunction unknown(items: readonly PackageItem[], registry: 'checking' | 'unreachable') {\n return items.map((item): PackageItem => {\n const installed = item.version !== null;\n return {\n id: item.id,\n package: item.package,\n label: item.label,\n description: '',\n commands: [],\n ...(item.requires ? { requires: item.requires } : {}),\n state: installed ? 'installed' : 'available',\n version: item.version,\n offered: null,\n progress: null,\n error: null,\n actions: installed ? ['remove'] : registry === 'unreachable' ? ['retry'] : [],\n registry,\n };\n });\n}\n\nexport function packageFixtures(scenario: PackageScenario): readonly PackageItem[] {\n if (scenario === 'empty') return [];\n if (scenario === 'npm') return fromNpm(packageFixtures('mixed'));\n if (scenario === 'checking' || scenario === 'offline')\n return unknown(packageFixtures('npm'), scenario === 'offline' ? 'unreachable' : 'checking');\n const items: PackageItem[] = [\n offer('git', 'git', 'Version control for your projects.', ['git'], '2.47.1', 4_300_000),\n offer(\n 'python',\n 'Python',\n 'Python with pip, for scripts and data work.',\n ['python3', 'pip'],\n '3.13.1',\n 28_400_000\n ),\n offer(\n 'uv',\n 'uv',\n 'Fast Python package and project manager.',\n ['uv', 'uvx'],\n '0.9.2',\n 6_100_000,\n ['python']\n ),\n offer('ruff', 'Ruff', 'Python linter and formatter.', ['ruff'], '0.14.0', 9_800_000, [\n 'python',\n ]),\n offer(\n 'esbuild',\n 'esbuild',\n 'Bundles and minifies JavaScript and TypeScript.',\n ['esbuild'],\n '0.25.10',\n 10_100_000\n ),\n offer(\n 'tsc',\n 'TypeScript',\n 'Type-checks and compiles TypeScript.',\n ['tsc'],\n '5.9.3',\n 23_600_000\n ),\n offer(\n 'biome',\n 'Biome',\n 'Formats and lints JavaScript, TypeScript and JSON.',\n ['biome'],\n '2.2.4',\n 19_200_000\n ),\n offer(\n 'pdf',\n 'PDF tools',\n 'Extract text, pages and details from PDF files.',\n ['pdftotext', 'pdfinfo', 'pdfseparate'],\n '24.8.0',\n 7_900_000\n ),\n ];\n const at = (id: string) => items.findIndex((item) => item.id === id);\n const patch = (id: string, change: Partial<PackageItem>) => {\n items[at(id)] = { ...items[at(id)], ...change };\n };\n patch('python', {\n state: 'installed',\n version: '3.13.1',\n notes: ['1 untested dependency: @harbor/wasi-sockets@0.4.2-1'],\n actions: ['remove'],\n });\n patch('python', {\n releases: [\n { version: '3.13.1', url: 'https://github.com/harbor-demo/python-wasm/releases/tag/v3.13.1' },\n ],\n });\n patch('uv', {\n state: 'outdated',\n version: '0.8.1',\n actions: ['update', 'remove'],\n releases: [\n {\n version: '0.9.2',\n url: 'https://github.com/harbor-demo/uv-wasm/releases/tag/v0.9.2',\n notes: '## 0.9.2\\n\\n### Bug Fixes\\n\\n* `uv run` finds the project in a parent folder again',\n },\n {\n version: '0.9.0',\n url: 'https://github.com/harbor-demo/uv-wasm/releases/tag/v0.9.0',\n notes: '## 0.9.0\\n\\n### Features\\n\\n* `uv add` keeps the comments in `pyproject.toml`',\n },\n ],\n });\n patch('esbuild', {\n state: 'installing',\n actions: [],\n log: 'Packages: +1\\nProgress: resolved 1, downloaded 0, added 0',\n });\n patch('biome', { state: 'installed', version: '2.2.4', actions: ['remove'] });\n patch('pdf', {\n state: 'failed',\n error: fetchFailed,\n actions: ['retry'],\n log: 'Packages: +1\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms',\n });\n if (scenario === 'elsewhere') {\n const cone = (version: string) => [\n { version, where: '/home/cone/.local/share/pnpm', user: 'cone', manager: 'pnpm' as const },\n ];\n patch('git', { state: 'installed', version: '2.47.1', actions: [], installs: cone('2.47.1') });\n patch('tsc', {\n state: 'outdated',\n version: '5.8.2',\n actions: ['update'],\n installs: cone('5.8.2'),\n });\n patch('biome', {\n installs: [\n { version: '2.2.4', where: '/usr/local/share/pnpm', manager: 'panel' },\n ...cone('2.2.4'),\n ],\n });\n }\n return scenario === 'user' ? [...items, ...userPackages()] : items;\n}\n\nexport interface DummyUpdatesOptions {\n packages?: PackageScenario;\n confirm?: PackageConfirm;\n beta?: BetaScenario;\n}\n\nexport class DummyUpdates extends Emitter<UpdatesEvents> implements UpdatesPort {\n #items: readonly UpdateItem[];\n #ready: boolean;\n #clock: Clock;\n #packages: readonly PackageItem[] = [];\n #fail = false;\n #confirm: PackageConfirm | undefined;\n declare packages?: () => readonly PackageItem[];\n declare actPackage?: (id: string, action: PackageAction) => Promise<void>;\n declare refreshPackages?: () => Promise<void>;\n #offline = false;\n declare developer?: () => boolean;\n declare setDeveloper?: (on: boolean) => Promise<void>;\n #beta: BetaScenario | undefined;\n #developer = true;\n\n constructor(scenario: UpdateScenario, clock: Clock, options: DummyUpdatesOptions = {}) {\n super();\n this.#beta = options.beta;\n this.#items = this.#fixtures(scenario);\n if (options.beta) {\n this.developer = () => this.#developer;\n this.setDeveloper = (on) => this.#setDeveloper(on);\n }\n this.#ready = scenario !== 'boot' && scenario !== 'starting';\n this.#clock = clock;\n this.#confirm = options.confirm;\n if (options.packages) {\n this.#packages = packageFixtures(options.packages);\n this.#fail = options.packages === 'fail';\n this.packages = () => this.#packages;\n this.actPackage = (id, action) =>\n action === 'retry' && this.#packages.find((item) => item.id === id)?.registry\n ? this.#refresh()\n : this.#actPackage(id, action);\n this.#offline = options.packages === 'offline';\n if (options.packages === 'npm' || options.packages === 'checking' || this.#offline)\n this.refreshPackages = () => this.#refresh();\n }\n }\n\n #patchPackage(id: string, patch: Partial<PackageItem>): void {\n const next = this.#packages.map((item) => (item.id === id ? { ...item, ...patch } : item));\n this.#packages = next.map((item) => {\n if (item.origin === 'user') return item;\n const missing =\n item.version === null\n ? []\n : next.filter((other) => item.requires?.includes(other.id) && other.version === null);\n if (!missing.length) return item.warnings ? { ...item, warnings: undefined } : item;\n const warnings = missing.map(\n (other) =>\n `Needs ${other.label}, which isn\u2019t installed. Install ${other.label} again to use it.`\n );\n return { ...item, warnings };\n });\n this.emit('packages', this.#packages);\n }\n\n async #actPackage(id: string, action: PackageAction): Promise<void> {\n const item = this.#packages.find((candidate) => candidate.id === id);\n if (!item?.actions.includes(action)) throw new Error(`Package action unavailable: ${id}`);\n if (item.origin === 'user') {\n this.#patchPackage(id, { state: 'removing', error: null, actions: [] });\n await this.#clock.sleep(2);\n this.#packages = this.#packages.filter((candidate) => candidate.id !== id);\n this.emit('packages', this.#packages);\n return;\n }\n if (action === 'remove') {\n const users = this.#packages\n .filter((other) => other.version !== null && other.requires?.includes(id))\n .map((other) => other.label);\n if (users.length && this.#confirm) {\n const names = new Intl.ListFormat('en', { type: 'conjunction' }).format(users);\n const verb = users.length === 1 ? 'needs it and stops' : 'need it and stop';\n const ok = await this.#confirm({\n title: `Remove ${item.label}?`,\n body: `${names} ${verb} working until ${item.label} is back.`,\n action: 'Remove',\n variant: 'confirmation',\n });\n if (!ok) return;\n }\n this.#patchPackage(id, { state: 'removing', error: null, actions: [] });\n await this.#clock.sleep(2);\n const kept = item.installs?.filter((install) => install.manager !== 'panel') ?? [];\n if (kept.length) {\n this.#patchPackage(id, {\n state: 'installed',\n version: kept[0].version,\n installs: kept,\n log: undefined,\n });\n return;\n }\n this.#patchPackage(id, {\n state: 'available',\n version: null,\n actions: ['install'],\n log: undefined,\n });\n return;\n }\n const log = 'Packages: +1';\n this.#patchPackage(id, {\n state: action === 'update' ? 'updating' : 'installing',\n error: null,\n actions: [],\n log: `${log}\\nProgress: resolved 1, downloaded 0, added 0`,\n });\n await this.#clock.sleep(2);\n if (item.size !== undefined) {\n const half = Math.round(item.size / 2);\n this.#patchPackage(id, {\n progress: { phase: 'download', done: 0, total: 1, bytes: { done: half, total: item.size } },\n log: `${log}\\nProgress: resolved 1, downloaded 0, added 0\\nDownloading ${item.package}@${item.offered}: ${half} B/${item.size} B`,\n });\n }\n await this.#clock.sleep(2);\n if (this.#fail) {\n this.#patchPackage(id, {\n state: 'failed',\n progress: null,\n error: fetchFailed,\n actions: ['retry'],\n log: `${log}\\nERR_PNPM_FETCH_TIMEOUT Request timed out after 30000ms`,\n });\n throw new Error(fetchFailed);\n }\n for (const need of item.requires ?? []) {\n const required = this.#packages.find((candidate) => candidate.id === need);\n if (required && required.version === null) {\n this.#patchPackage(need, {\n state: 'installed',\n version: required.offered,\n error: null,\n actions: ['remove'],\n });\n }\n }\n this.#patchPackage(id, {\n state: 'installed',\n version: item.offered,\n progress: null,\n actions: item.installs ? [] : ['remove'],\n ...(item.installs\n ? {\n installs: item.installs.map((install) => ({\n ...install,\n version: item.offered as string,\n })),\n }\n : {}),\n log: `${log}\\nProgress: resolved 1, downloaded 1, added 1\\nDone in 3.8s`,\n });\n }\n\n async #refresh(): Promise<void> {\n const before = this.#packages;\n this.#packages = before.map((item) =>\n item.registry\n ? { ...item, registry: 'checking', actions: item.version ? ['remove'] : [] }\n : item\n );\n this.emit('packages', this.#packages);\n await this.#clock.sleep(4);\n if (this.#offline) {\n this.#offline = false;\n this.#packages = before;\n } else {\n const fresh = packageFixtures('npm');\n this.#packages = this.#packages.map((item) =>\n item.registry ? (fresh.find((next) => next.id === item.id) as PackageItem) : item\n );\n }\n this.emit('packages', this.#packages);\n }\n\n list(): readonly UpdateItem[] {\n return this.#items;\n }\n\n ready(): boolean {\n return this.#ready;\n }\n\n #fixtures(scenario: UpdateScenario): readonly UpdateItem[] {\n const items = updateFixtures(scenario);\n if (!this.#beta) return items;\n const fixed = betaFixtures(items, this.#beta);\n return this.#developer ? fixed : withNpm(fixed, null);\n }\n\n async #setDeveloper(on: boolean): Promise<void> {\n await this.#clock.sleep(4);\n this.#developer = on;\n this.#npm(on ? { state: 'checking' } : null);\n if (!on) return;\n await this.#clock.sleep(4);\n const agent = this.#items.find((item) => item.kind === 'agent') as UpdateItem;\n this.#npm(this.#check(agent.from));\n }\n\n #check(version: string | null): UpdateNpm | null {\n if (!this.#developer) return null;\n if (version === latest) return { state: 'current', latest };\n return this.#beta === 'blocked' ? blocked : offered;\n }\n\n #npm(npm: UpdateNpm | null): void {\n this.#items = withNpm(this.#items, npm);\n this.emit('items', this.#items);\n }\n\n setScenario(scenario: UpdateScenario): void {\n this.#items = this.#fixtures(scenario);\n this.#ready = scenario !== 'boot' && scenario !== 'starting';\n this.emit('items', this.#items);\n }\n\n #patch(id: string, patch: Partial<UpdateItem>): void {\n this.#items = this.#items.map((item) => (item.id === id ? { ...item, ...patch } : item));\n this.emit('items', this.#items);\n }\n\n async act(id: string, action: UpdateAction): Promise<void> {\n const item = this.#items.find((candidate) => candidate.id === id);\n if (!item?.actions.includes(action)) throw new Error(`Update action unavailable: ${id}`);\n const back = action === 'back-to-certified';\n const beta = back || action === 'install-beta' || (action === 'retry' && item.to === latest);\n if (action === 'update-now' || action === 'retry' || beta) {\n this.#patch(id, {\n state: 'downloading',\n progress: { phase: 'download', done: 0, total: 95 },\n error: null,\n actions: [],\n log: 'Packages: +95\\nProgress: resolved 95, downloaded 0, added 0',\n });\n await this.#clock.sleep(4);\n this.#patch(id, {\n state: 'linking',\n progress: { phase: 'link', done: 95, total: 95 },\n log: 'Packages: +95\\nProgress: resolved 95, downloaded 95, added 95',\n });\n await this.#clock.sleep(2);\n }\n if (beta) {\n const version = back ? pin : latest;\n const next: UpdateItem = {\n ...(this.#items.find((candidate) => candidate.id === id) as UpdateItem),\n state: 'ready',\n from: version,\n to: version,\n progress: null,\n error: null,\n checkedAt,\n beta: back ? null : { version, certified: pin },\n npm: this.#check(version),\n };\n this.#patch(id, { ...next, actions: ['restart-agent', ...betaActions(next)] });\n return;\n }\n const apply = action === 'update-now' && ['agent', 'bios', 'kernel', 'ui'].includes(item.kind);\n this.#patch(id, {\n state: apply ? 'ready' : 'installed',\n from: apply ? item.from : item.to,\n progress: null,\n checkedAt,\n actions: apply ? [item.kind === 'agent' ? 'restart-agent' : 'reload'] : [],\n ...(apply ? {} : { actions: betaActions(item) }),\n });\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n AuditEntry,\n AuditPage,\n Availability,\n ButtonConfig,\n ButtonEvent,\n ButtonMessage,\n EndpointSet,\n ErrorCode,\n ImportCandidate,\n ImportKind,\n ImportPick,\n ImportResult,\n PendingRequest,\n PolicyNotice,\n PopupIntent,\n PutOptions,\n RecordKind,\n RefusedRule,\n RequestState,\n SealResult,\n SecretView,\n VaultButton,\n VaultEndpointChange,\n VaultError,\n VaultEvents,\n VaultList,\n VaultPort,\n VaultStatus,\n} from '../model/types.ts';\nimport { nameProblem, valueProblem, vaultFailure } from '../model/values.ts';\nimport type { Clock } from './clock.ts';\n\nexport type VaultScenario =\n | 'empty'\n | 'secrets'\n | 'policy'\n | 'notice'\n | 'locked'\n | 'paused'\n | 'request'\n | 'backup'\n | 'waiting'\n | 'purged'\n | 'session'\n | 'endpoints-fail';\n\nconst minute = 60_000;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nconst harbor = { domain: 'api.harbor.example', header: 'Authorization', methods: [], paths: [] };\nconst pier = {\n domain: 'packages.pier.example',\n header: 'Authorization',\n methods: ['PUT'],\n paths: ['/-/package/*'],\n};\n\nexport function vaultSecrets(now = Date.now()): SecretView[] {\n return [\n {\n name: 'HARBOR_API_KEY',\n kind: 'secret',\n placeholder: 'fnox_proxy_harbor01',\n state: 'active',\n source: 'settings',\n sourceDevice: null,\n domains: ['api.harbor.example'],\n rules: [harbor],\n exits: ['proxy', 'tailscale', 'device:link-pier'],\n exec: false,\n createdAt: now - 12 * day,\n usedAt: now - 4 * minute,\n },\n {\n name: 'PIER_PUBLISH_TOKEN',\n kind: 'secret',\n placeholder: 'fnox_proxy_pier0002',\n state: 'active',\n source: 'jerk:cone@link-pier',\n sourceDevice: 'link-pier',\n domains: ['packages.pier.example'],\n rules: [pier],\n exec: 'argv',\n execArgv: [['pier', 'publish']],\n createdAt: now - 3 * day,\n usedAt: now - 2 * hour,\n expiresAt: now + 3 * day,\n },\n {\n name: 'TIDE_MAIL',\n kind: 'grant',\n placeholder: 'fnox_proxy_tide0003',\n state: 'active',\n source: 'oauth:tide-mail',\n sourceDevice: null,\n provider: 'Tide Mail',\n account: 'cone@tide.example',\n domains: ['mail.tide.example'],\n rules: [\n {\n domain: 'mail.tide.example',\n header: 'Authorization',\n methods: ['GET', 'POST'],\n paths: ['/v1/messages/*'],\n },\n {\n domain: 'files.tide.example',\n header: 'Authorization',\n methods: ['GET'],\n paths: ['/v1/attachments/*'],\n },\n ],\n exec: false,\n createdAt: now - 20 * day,\n expiresAt: now + 50 * minute,\n },\n {\n name: 'REEF_DEPLOY_KEY',\n kind: 'secret',\n placeholder: 'fnox_proxy_reef0004',\n state: 'inert',\n source: 'process',\n sourceDevice: null,\n domains: [],\n rules: [],\n exec: 'any',\n createdAt: now - 2 * hour,\n },\n {\n name: 'BUOY_OLD_TOKEN',\n kind: 'secret',\n placeholder: 'fnox_proxy_buoy0005',\n state: 'removed',\n source: 'import:six',\n sourceDevice: null,\n domains: ['buoy.example'],\n rules: [{ domain: 'buoy.example', header: 'X-Buoy-Key', methods: ['GET'], paths: [] }],\n exec: 'shell',\n createdAt: now - 40 * day,\n removedAt: now - day,\n },\n ];\n}\n\nfunction refused(settings: Record<string, string>): void {\n const bad = Object.entries(settings).find(([, value]) => value.startsWith('bad'));\n if (bad)\n throw vaultFailure('EINVAL', `The vault refused ${bad[0]}. Check that value and try again.`);\n}\n\nexport function accountRecords(now = Date.now(), pin?: string): SecretView[] {\n return [\n {\n name: 'MCP_DOCS_TOKEN',\n kind: 'mcp',\n placeholder: 'fnox_proxy_docs0006',\n state: 'active',\n source: 'settings',\n sourceDevice: null,\n server: 'docs',\n ...(pin ? { url: pin, pinned: true as const } : {}),\n domains: ['docs.example'],\n rules: [{ domain: 'docs.example', header: 'Authorization', methods: [], paths: [] }],\n exec: false,\n createdAt: now - 6 * day,\n usedAt: now - 20 * minute,\n },\n ];\n}\n\nexport function vaultAudit(now = Date.now()): AuditEntry[] {\n const who = { uid: 1000, tag: 'cone' };\n return [\n {\n ...who,\n type: 'forward',\n seq: 12,\n id: 'audit-12',\n at: now - 4 * minute,\n name: 'HARBOR_API_KEY',\n domain: 'api.harbor.example',\n method: 'GET',\n path: '/v2/ships',\n rule: harbor,\n exit: 'proxy',\n },\n {\n ...who,\n type: 'materialize',\n seq: 11,\n id: 'audit-11',\n at: now - 2 * hour,\n name: 'PIER_PUBLISH_TOKEN',\n exec: 'argv',\n path: '/usr/bin/pier',\n argv: 'pier publish --tag next',\n argvSha256: 'b1946ac92492d2347c6235b4d2611184',\n cwd: '/home/cone/harbor',\n pid: 4211,\n ppid: 4100,\n ticket: 'ticket-11',\n consumed: true,\n },\n {\n type: 'materialize',\n seq: 10,\n id: 'audit-10',\n at: now - 3 * hour,\n name: 'PIER_PUBLISH_TOKEN',\n uid: 1001,\n tag: 'docs-pass',\n exec: 'argv',\n path: '/usr/bin/pier',\n argv: 'pier publish --dry-run',\n argvSha256: '591785b794601e212b260e25925636fd',\n cwd: '/home/cone/harbor/docs',\n pid: 3980,\n ppid: 3901,\n ticket: 'ticket-10',\n consumed: true,\n },\n {\n ...who,\n type: 'forward',\n seq: 9,\n id: 'audit-9',\n at: now - 6 * hour,\n name: 'HARBOR_API_KEY',\n domain: 'api.harbor.example',\n method: 'POST',\n path: '/v2/ships/quay/berths',\n rule: harbor,\n exit: 'device:link-pier',\n },\n {\n type: 'policy',\n seq: 8,\n id: 'audit-8',\n at: now - day,\n file: '/etc/slicc/secrets-policy.toml',\n sha256: '4e07408562bedb8b60ce05c1decfe3ad',\n accepted: true,\n changes: [\n {\n kind: 'exits',\n secret: 'HARBOR_API_KEY',\n from: ['proxy', 'device:link-pier'],\n to: ['proxy', 'tailscale', 'device:link-pier'],\n },\n ],\n },\n {\n ...who,\n type: 'remove',\n seq: 7,\n id: 'audit-7',\n at: now - day - hour,\n name: 'BUOY_OLD_TOKEN',\n },\n {\n ...who,\n type: 'seal',\n seq: 6,\n id: 'audit-6',\n at: now - 3 * day,\n name: 'PIER_PUBLISH_TOKEN',\n source: 'jerk:cone@link-pier',\n rotated: false,\n },\n ];\n}\n\nexport function vaultOlder(now = Date.now()): AuditEntry[] {\n return [\n {\n type: 'materialize',\n seq: 5,\n id: 'audit-5',\n at: now - 4 * day,\n name: 'PIER_PUBLISH_TOKEN',\n uid: 1000,\n tag: null,\n exec: 'argv',\n path: '/usr/bin/pier',\n argv: 'pier publish',\n argvSha256: '2c26b46b68ffc68ff99b453c1d304134',\n cwd: '/home/cone/harbor',\n pid: 2210,\n ppid: 2200,\n ticket: 'ticket-5',\n consumed: true,\n },\n {\n type: 'policy',\n seq: 4,\n id: 'audit-4',\n at: now - 5 * day,\n file: '/etc/fnox/config.toml',\n sha256: '8f14e45fceea167a5a36dedd4bea2543',\n accepted: false,\n changes: [],\n warning: 'The file did not parse, so the vault kept the last good rules.',\n },\n {\n type: 'restore',\n seq: 3,\n id: 'audit-3',\n at: now - 6 * day,\n name: 'TIDE_MAIL',\n uid: 0,\n tag: null,\n },\n {\n type: 'mcp',\n seq: 2,\n id: 'audit-2',\n at: now - 7 * day,\n name: 'DOCS_MCP_TOKEN',\n uid: 1000,\n tag: 'cone',\n server: 'docs',\n domain: 'docs.example',\n method: 'POST',\n path: '/mcp',\n exit: 'page',\n },\n ];\n}\n\nexport function vaultRefused(): RefusedRule[] {\n return [\n {\n secret: 'PIER_PUBLISH_TOKEN',\n rule: {\n domain: 'packages.pier.example',\n header: 'Authorization',\n methods: ['DELETE'],\n paths: ['/-/package/*'],\n },\n reason: 'DELETE on a publish token needs a rule of its own in /etc/fnox/config.toml.',\n },\n ];\n}\n\nexport function vaultPurged(now = Date.now()): AuditEntry {\n return {\n type: 'endpoints',\n seq: 13,\n id: 'audit-13',\n at: now - 2 * minute,\n uid: null,\n tag: null,\n purged: [\n { provider: 'openai', host: 'models.harbor.example' },\n { provider: 'anthropic', host: 'relay.harbor.example' },\n ],\n adopted: [{ server: 'docs', host: 'docs.example' }],\n };\n}\n\nexport function vaultPinned(now = Date.now()): AuditEntry {\n return {\n type: 'endpoints',\n seq: 14,\n id: 'audit-14',\n at: now - minute,\n uid: null,\n tag: null,\n pinned: { name: 'DOCS_MCP_TOKEN', server: 'docs', host: 'docs.example' },\n };\n}\n\nexport function vaultSessions(now = Date.now()): AuditEntry[] {\n const who = { uid: 1000, tag: 'cone' };\n return [\n {\n ...who,\n type: 'session',\n seq: 15,\n id: 'audit-15',\n at: now - minute,\n name: 'TIDE_MAIL',\n session: 'kernel-session-tide-0015',\n domain: 'mail.tide.example',\n port: 587,\n protocol: 'smtp',\n position: 'auth-plain',\n rule: 2,\n verifiedBy: 'roots',\n exit: 'proxy',\n },\n {\n ...who,\n type: 'session',\n seq: 14,\n id: 'audit-14',\n at: now - 2 * minute,\n name: 'REEF_DEPLOY_KEY',\n session: 'kernel-session-reef-0014',\n domain: 'db.reef.example',\n port: 5432,\n protocol: 'pg',\n position: 'scram-sha-256',\n rule: 3,\n verifiedBy: 'anchored',\n anchor: 'q83vEjRWeJA=',\n exit: 'device:link-pier',\n },\n {\n ...who,\n type: 'session',\n seq: 13,\n id: 'audit-13',\n at: now - 3 * minute,\n name: 'HARBOR_API_KEY',\n session: 'kernel-session-harbor-0013',\n domain: 'quay.harbor.example',\n port: 8443,\n protocol: 'http1',\n position: 'header:authorization',\n rule: 1,\n exit: 'tailscale',\n },\n ];\n}\n\nexport function vaultPolicy(now = Date.now()): AuditEntry {\n return {\n type: 'policy',\n seq: 13,\n id: 'audit-13',\n at: now - 20 * minute,\n file: '/etc/fnox/config.toml',\n sha256: 'c9f0f895fb98ab9159f51fd0297e236d',\n accepted: true,\n changes: [\n {\n kind: 'rule',\n secret: 'HARBOR_API_KEY',\n rule: { domain: 'quay.harbor.example', header: 'Authorization', methods: [], paths: [] },\n change: 'added',\n },\n { kind: 'exec', secret: 'REEF_DEPLOY_KEY', from: false, to: 'any' },\n ],\n warning: 'One rule was refused; it is listed under Rules SLICC refused.',\n };\n}\n\nexport function vaultPaused(now = Date.now()): AuditEntry[] {\n const entry = {\n type: 'policy' as const,\n accepted: true,\n changes: [],\n };\n return [\n {\n ...entry,\n seq: 15,\n id: 'audit-15',\n at: now - minute,\n file: '/etc/slicc/secrets-policy.toml',\n sha256: null,\n absent: true,\n },\n {\n ...entry,\n seq: 14,\n id: 'audit-14',\n at: now - 2 * minute,\n file: '/etc/fnox/config.toml',\n sha256: 'a87ff679a2f3e71d9181a67b7542122c',\n },\n {\n ...entry,\n seq: 13,\n id: 'audit-13',\n at: now - 3 * minute,\n file: '/etc/fnox/config.toml',\n sha256: null,\n absent: true,\n },\n ];\n}\n\nexport function vaultNotice(now = Date.now()): PolicyNotice {\n return {\n id: 'notice-widened',\n at: now - 20 * minute,\n file: '/etc/slicc/secrets-policy.toml',\n sha256: 'c9f0f895fb98ab9159f51fd0297e236d',\n acknowledged: false,\n widened: [\n { kind: 'exit', secret: 'HARBOR_API_KEY', exit: 'device:link-quay' },\n {\n kind: 'methods',\n secret: 'PIER_PUBLISH_TOKEN',\n domain: 'packages.pier.example',\n methods: ['PUT', 'DELETE'],\n },\n ],\n };\n}\n\nfunction waiting(scenario: VaultScenario, now: number): PendingRequest[] {\n if (scenario === 'locked')\n return [\n {\n id: 'request-reef',\n kind: 'value',\n name: 'REEF_DEPLOY_KEY',\n prompt:\n 'Needed to deploy the reef preview. It is the deploy key from the reef dashboard, under Settings > Keys.',\n uid: 1001,\n tag: 'docs-pass',\n createdAt: now - minute,\n expiresAt: now + 4 * minute,\n },\n ];\n if (scenario === 'request')\n return [\n {\n id: 'request-tide',\n kind: 'value',\n name: 'TIDE_STATION_TOKEN',\n prompt: 'Token for the tide station API, from the ops vault',\n uid: 1000,\n tag: 'docs-pass',\n createdAt: now,\n expiresAt: now + 5 * minute,\n },\n ];\n return [];\n}\n\nexport function vaultFixtures(\n scenario: VaultScenario,\n now = Date.now()\n): { status: VaultStatus; list: VaultList } {\n const empty = scenario === 'empty';\n const policy = scenario === 'policy' || scenario === 'notice';\n const backup = scenario === 'backup';\n const paused = scenario === 'paused';\n const status: VaultStatus = {\n version: '0.1.0',\n protocol: 1,\n origin: 'https://vault.sliccy.ai',\n locked: scenario === 'locked',\n lock: 'passkey',\n scrub: { needed: !empty, version: 3, ready: scenario !== 'locked' },\n waiting: waiting(scenario, now),\n ...(backup ? { backupReminder: 'due' as const, exportedAt: null } : {}),\n ...(paused\n ? {\n policy: [\n {\n path: '/etc/fnox/config.toml',\n sha256: 'a87ff679a2f3e71d9181a67b7542122c',\n accepted: true,\n warnings: [],\n },\n {\n path: '/etc/slicc/secrets-policy.toml',\n sha256: null,\n accepted: true,\n warnings: [],\n absent: true as const,\n paused: true as const,\n },\n ],\n }\n : {}),\n };\n const quay = { domain: 'quay.harbor.example', header: 'Authorization', methods: [], paths: [] };\n const secrets = (empty ? [] : vaultSecrets(now)).map((secret) =>\n policy && secret.name === 'HARBOR_API_KEY'\n ? { ...secret, domains: [...secret.domains, quay.domain], rules: [...secret.rules, quay] }\n : secret\n );\n const list: VaultList = {\n secrets,\n refused: policy ? vaultRefused() : [],\n audit: empty\n ? []\n : [\n ...(policy ? [vaultPolicy(now)] : []),\n ...(paused ? vaultPaused(now) : []),\n ...(scenario === 'purged' ? [vaultPinned(now), vaultPurged(now)] : []),\n ...(scenario === 'session' ? vaultSessions(now) : []),\n ...vaultAudit(now),\n ],\n auditMore: !empty,\n exits: {\n file: '/etc/slicc/secrets-policy.toml',\n sha256: empty ? null : '4e07408562bedb8b60ce05c1decfe3ad',\n restricted: secrets.flatMap(({ name, exits }) => (exits ? [{ name, exits }] : [])),\n },\n };\n return { status, list };\n}\n\nconst labels: Record<string, string> = {\n unlock: 'Unlock the vault',\n protect: 'Protect with a passkey',\n};\n\nconst candidates: ImportCandidate[] = [\n {\n name: 'LAGOON_API_KEY',\n exists: false,\n suggestedRules: 'api.lagoon.example, in Authorization, any method, any path',\n },\n { name: 'HARBOR_API_KEY', exists: true },\n {\n name: 'KELP_WEBHOOK_SECRET',\n exists: false,\n suggestedRules: 'Send to hooks.kelp.example in X-Kelp-Signature, and to evil.example too',\n },\n { name: 'LAGOON_MODEL_KEY', kind: 'model', exists: false },\n {\n name: 'MOORING_TOKEN',\n exists: false,\n refused:\n 'another app that uses this vault already has this secret; use it there, or add it here by hand',\n },\n];\n\nconst duplicate: ImportCandidate = { name: 'KELP_WEBHOOK_SECRET_2', exists: false };\n\nexport class DummyVaultButton implements VaultButton {\n element: HTMLElement;\n config: ButtonConfig | null = null;\n #listeners = new Set<(event: ButtonEvent) => void>();\n #vault: DummyVault;\n #button: HTMLElement & { variant?: string; size?: string };\n\n constructor(vault: DummyVault, time: Clock) {\n this.#vault = vault;\n this.element = document.createElement('span');\n this.element.dataset.vaultButton = '';\n this.#button = document.createElement('swc-button');\n this.element.append(this.#button);\n this.#button.addEventListener('click', () => void this.#click());\n void time.sleep(0).then(() => this.#emit({ event: 'ready' }));\n }\n\n post(message: ButtonMessage): void {\n if (message.op === 'focus') {\n this.#button.focus();\n return;\n }\n this.config = message.button;\n const { intent, label, size = 'm', variant = 'secondary', treatment = 'fill' } = message.button;\n this.#button.textContent =\n label ?? (intent === 'auto' ? this.#vault.autoLabel() : labels[intent.kind]);\n this.#button.setAttribute('size', size);\n this.#button.setAttribute('variant', variant);\n this.#button.setAttribute('fill-style', treatment);\n this.#button.toggleAttribute('disabled', !!message.button.disabled);\n }\n\n listen(listener: (event: ButtonEvent) => void): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n #emit(event: ButtonEvent | Record<string, unknown>): void {\n const message = { type: 'slicc-vault', v: 1, ...event } as ButtonEvent;\n for (const listener of [...this.#listeners]) listener(message);\n }\n\n async #click(): Promise<void> {\n const intent = this.config?.intent ?? 'auto';\n const resolved = intent === 'auto' ? this.#vault.autoIntent() : intent;\n this.#emit({ event: 'popup', intent: resolved, state: 'opened' });\n await this.#vault.answer(resolved);\n this.#emit({ event: 'popup', intent: resolved, state: 'done' });\n }\n}\n\nexport interface DummyImport {\n kind: ImportKind;\n size: number;\n password: boolean;\n pick?: ImportPick[];\n}\n\nexport class DummyVault extends Emitter<VaultEvents> implements VaultPort {\n #status: VaultStatus;\n #list: VaultList;\n #available: Availability;\n #fail: VaultError | null = null;\n #time: Clock;\n #older: AuditEntry[] = vaultOlder();\n #serial = 0;\n buttons: DummyVaultButton[] = [];\n puts: { name: string; request?: string; options?: PutOptions }[] = [];\n endpointChanges: VaultEndpointChange[] = [];\n settingsCalls: Array<{ name: string; kind: RecordKind; settings: Record<string, string> }> = [];\n #refuses: boolean;\n cancelled: string[] = [];\n imports: DummyImport[] = [];\n exported = 0;\n acknowledged: string[] = [];\n\n constructor(scenario: VaultScenario, time: Clock, records: readonly SecretView[] = []) {\n super();\n const { status, list } = vaultFixtures(scenario);\n this.#status = status;\n this.#list = { ...list, secrets: [...list.secrets, ...records] };\n this.#time = time;\n this.#available = scenario === 'waiting' ? 'waiting' : 'ready';\n this.#refuses = scenario === 'endpoints-fail';\n }\n\n async endpoints(change: VaultEndpointChange): Promise<void> {\n await this.#time.sleep(5);\n const server = change.add?.mcp?.[0]?.url;\n if (this.#refuses && server)\n throw vaultFailure(\n 'EINVAL',\n `The vault refused ${server} for this token. Check the server's address, then try again.`\n );\n if (this.#refuses)\n throw vaultFailure(\n 'EINVAL',\n 'The vault refused that endpoint. Check the address and try again.'\n );\n this.endpointChanges.push(change);\n const overrides = (secret: SecretView, list: EndpointSet | undefined) =>\n secret.pinned && list?.mcp?.some((entry) => entry.server === secret.server);\n this.#list = {\n ...this.#list,\n secrets: this.#list.secrets.map((secret) => {\n if (!overrides(secret, change.add)) return secret;\n const { url: _, pinned: __, ...rest } = secret;\n return rest;\n }),\n };\n this.emit('list', this.#list);\n }\n\n status(): VaultStatus | null {\n return this.#available === 'waiting' ? null : this.#status;\n }\n\n list(): VaultList | null {\n return this.#available === 'waiting' ? null : this.#list;\n }\n\n availability(): Availability {\n if (this.#available === 'waiting') return 'waiting';\n return this.#status.locked ? 'locked' : 'ready';\n }\n\n arrive(): void {\n this.#available = 'ready';\n this.emit('availability', this.availability());\n this.emit('status', this.#status);\n this.emit('list', this.#list);\n }\n\n fail(code: ErrorCode, message: string, cause?: VaultError['cause']): void {\n this.#fail = { code, message, cause };\n }\n\n #failed(): void {\n const fail = this.#fail;\n this.#fail = null;\n if (fail) throw vaultFailure(fail.code, fail.message, fail.cause);\n }\n\n async acknowledge(notice: string): Promise<void> {\n await this.#time.sleep(5);\n this.acknowledged.push(notice);\n }\n\n async dismissBackupReminder(): Promise<void> {\n await this.#time.sleep(5);\n this.#failed();\n this.#status = { ...this.#status, backupReminder: 'dismissed' };\n this.emit('status', this.#status);\n }\n\n async audit(before?: number, limit = 50): Promise<AuditPage> {\n await this.#time.sleep(5);\n const all = [...this.#list.audit, ...this.#older];\n const page = all.filter((entry) => before === undefined || entry.seq < before).slice(0, limit);\n const more = page.length > 0 && all.some((entry) => entry.seq < page[page.length - 1].seq);\n return { audit: page, more, ...(more ? { next: page[page.length - 1].seq } : {}) };\n }\n\n #unlocked(): void {\n this.#failed();\n if (this.#status.locked) throw vaultFailure('EACCES', 'vault is locked');\n }\n\n #find(name: string, kind: RecordKind): SecretView {\n this.#failed();\n const secret = this.#list.secrets.find((item) => item.name === name && item.kind === kind);\n if (!secret) throw vaultFailure('ENOENT', `There is no secret named ${name}.`);\n return secret;\n }\n\n #log(name: string, entry: Record<string, unknown>): void {\n const seq = Math.max(0, ...this.#list.audit.map((item) => item.seq)) + 1;\n const audit = [\n { seq, id: `audit-${seq}`, at: Date.now(), name, uid: null, tag: null, ...entry },\n ...this.#list.audit,\n ] as AuditEntry[];\n this.#list = { ...this.#list, audit };\n }\n\n #save(secret: SecretView, rotated: boolean): SealResult {\n this.#list = {\n ...this.#list,\n secrets: [\n ...this.#list.secrets.filter(\n (item) => item.name !== secret.name || item.kind !== secret.kind\n ),\n secret,\n ],\n };\n this.#log(secret.name, { type: 'seal', source: secret.source, rotated });\n this.emit('list', this.#list);\n return { name: secret.name, placeholder: secret.placeholder, state: secret.state };\n }\n\n #seal(\n name: string,\n source: SecretView['source'],\n kind: RecordKind = 'secret',\n binding: { provider?: string; server?: string; settings?: Record<string, string> } = {}\n ): SealResult {\n const old = this.#list.secrets.find((item) => item.name === name && item.kind === kind);\n if (old) {\n const state = old.state === 'removed' ? (old.rules.length ? 'active' : 'inert') : old.state;\n const { removedAt: _, ...kept } = old;\n return this.#save({ ...kept, ...binding, state, source }, true);\n }\n this.#serial += 1;\n return this.#save(\n {\n name,\n kind,\n placeholder: `fnox_proxy_new${String(this.#serial).padStart(5, '0')}`,\n state: 'inert',\n source,\n sourceDevice: null,\n ...binding,\n domains: [],\n rules: [],\n exec: false,\n createdAt: Date.now(),\n },\n false\n );\n }\n\n async put(\n name: string,\n value: string,\n request?: string,\n options?: PutOptions\n ): Promise<SealResult> {\n await this.#time.sleep(5);\n this.#unlocked();\n const problem = nameProblem(name) ?? valueProblem(value);\n if (problem) throw vaultFailure('EINVAL', problem);\n if (request !== undefined) this.#take(request, name);\n if (options?.settings) refused(options.settings);\n this.puts.push({\n name,\n ...(request === undefined ? {} : { request }),\n ...(options ? { options: { ...options } } : {}),\n });\n const { kind = 'secret', provider, server, settings } = options ?? {};\n return this.#seal(name, 'settings', kind, {\n ...(provider === undefined ? {} : { provider }),\n ...(server === undefined ? {} : { server }),\n ...(settings === undefined ? {} : { settings: { ...settings } }),\n });\n }\n\n async settings(name: string, kind: RecordKind, settings: Record<string, string>): Promise<void> {\n await this.#time.sleep(5);\n this.#unlocked();\n const secret = this.#find(name, kind);\n refused(settings);\n this.settingsCalls.push({ name, kind, settings: { ...settings } });\n this.#list = {\n ...this.#list,\n secrets: this.#list.secrets.map((item) =>\n item === secret ? { ...item, settings: { ...settings } } : item\n ),\n };\n this.emit('list', this.#list);\n }\n\n #take(request: string, name?: string): void {\n const found = this.#status.waiting.find((item) => item.id === request);\n if (!found) throw vaultFailure('ENOENT', 'That request is no longer waiting.');\n if (name !== undefined && found.name !== undefined && found.name !== name)\n throw vaultFailure('EINVAL', `That request asks for ${found.name}.`);\n this.#status = {\n ...this.#status,\n waiting: this.#status.waiting.filter((item) => item.id !== request),\n };\n this.emit('status', this.#status);\n }\n\n async cancel(request: string): Promise<RequestState> {\n await this.#time.sleep(5);\n this.#failed();\n this.#take(request);\n this.cancelled.push(request);\n return 'cancelled';\n }\n\n async unpin(names: string[]): Promise<void> {\n await this.#time.sleep(5);\n this.#unlocked();\n for (const name of names) {\n const pin = this.#list.audit.find(\n (entry) => entry.type === 'endpoints' && entry.pinned?.name === name\n );\n if (pin?.type === 'endpoints' && pin.pinned)\n this.#log(name, { type: 'endpoints', unpinned: pin.pinned });\n }\n this.emit('list', this.#list);\n }\n\n async remove(name: string, kind: RecordKind = 'secret'): Promise<SealResult> {\n await this.#time.sleep(5);\n const secret = { ...this.#find(name, kind), state: 'removed' as const, removedAt: Date.now() };\n return this.#flip(secret, 'remove');\n }\n\n async restore(name: string, kind: RecordKind = 'secret'): Promise<SealResult> {\n await this.#time.sleep(5);\n const { removedAt: _, ...secret } = this.#find(name, kind);\n return this.#flip({ ...secret, state: secret.rules.length ? 'active' : 'inert' }, 'restore');\n }\n\n #flip(secret: SecretView, type: 'remove' | 'restore'): SealResult {\n this.#list = {\n ...this.#list,\n secrets: this.#list.secrets.map((item) =>\n item.name === secret.name && item.kind === secret.kind ? secret : item\n ),\n };\n this.#log(secret.name, { type });\n this.emit('list', this.#list);\n return { name: secret.name, placeholder: secret.placeholder, state: secret.state };\n }\n\n async import(\n kind: ImportKind,\n bytes: Uint8Array,\n options: { password?: string; pick?: ImportPick[] } = {}\n ): Promise<ImportResult> {\n await this.#time.sleep(5);\n this.#unlocked();\n if (kind === 'six') throw vaultFailure('ENOTSUP', 'six imports are not supported yet.');\n if (!bytes.length) throw vaultFailure('EINVAL', 'The file is empty.');\n const { pick } = options;\n this.imports.push({\n kind,\n size: bytes.length,\n password: !!options.password,\n ...(pick ? { pick: [...pick] } : {}),\n });\n const offered = kind === 'keepass' ? [...candidates, duplicate] : candidates;\n if (!pick) return { stage: 'pick', candidates: offered.map((item) => ({ ...item })) };\n const chosen = new Map(\n pick.map((item) =>\n typeof item === 'string' ? [item, 'secret' as const] : [item.name, item.kind]\n )\n );\n const taken = offered.filter((item) => chosen.has(item.name) && !item.refused);\n return {\n stage: 'done',\n imported: taken.map((item) => this.#seal(item.name, `import:${kind}`, chosen.get(item.name))),\n skipped: offered.filter((item) => !taken.includes(item)).map((item) => item.name),\n reasons: Object.fromEntries(\n offered.flatMap((item) => (item.refused ? [[item.name, item.refused]] : []))\n ),\n };\n }\n\n async export(passphrase: string): Promise<Uint8Array> {\n await this.#time.sleep(5);\n this.#unlocked();\n if (new TextEncoder().encode(passphrase).length < 8)\n throw vaultFailure('EINVAL', 'Passphrases need at least 8 bytes.');\n this.exported += 1;\n this.#status = { ...this.#status, exportedAt: Date.now(), backupReminder: null };\n this.emit('status', this.#status);\n return new TextEncoder().encode('slicc-vault invented bundle');\n }\n\n async lock(): Promise<void> {\n await this.#time.sleep(5);\n this.#failed();\n this.#status = { ...this.#status, locked: true };\n this.emit('status', this.#status);\n }\n\n button(): DummyVaultButton {\n const button = new DummyVaultButton(this, this.#time);\n this.buttons.push(button);\n return button;\n }\n\n autoLabel(): string {\n return this.#status.locked ? 'Vault locked' : 'Vault unlocked';\n }\n\n autoIntent(): PopupIntent {\n return this.#status.locked ? { kind: 'unlock' } : { kind: 'protect' };\n }\n\n async answer(intent: PopupIntent): Promise<void> {\n await this.#time.sleep(10);\n this.#status =\n intent.kind === 'unlock'\n ? {\n ...this.#status,\n locked: false,\n scrub: { needed: false, version: 0, ...this.#status.scrub, ready: true },\n }\n : { ...this.#status, lock: 'passkey' };\n this.emit('status', this.#status);\n }\n}\n", "import type { Account, AgentHold, Message, SecretView, SliccModel } from '../model/types.ts';\nimport { DummyAgent } from './agent.ts';\nimport { type ApprovalScenario, DummyApprovals } from './approvals.ts';\nimport { type BrowserScenario, browserHistory, DummyBrowser, drive } from './browser.ts';\nimport { type ChangesScenario, DummyChanges } from './changes.ts';\nimport { type Clock, clock } from './clock.ts';\nimport type { BudgetScenario } from './extras.ts';\nimport * as extras from './extras.ts';\nimport { DummyFiles, type MountScenario } from './files.ts';\nimport * as fixtures from './fixtures.ts';\nimport { DummyFollow, type FollowScenario } from './follow.ts';\nimport { DummyGuests, type GuestsScenario } from './guests.ts';\nimport { DummyImport, type ImportScenario } from './import.ts';\nimport { DummyMemory } from './memory.ts';\nimport { agentSections, DummyMonitor } from './monitor.ts';\nimport {\n DummyNetwork,\n type LeadersScenario,\n type LinksScenario,\n type NetworkScenario,\n type TailnetScenario,\n} from './network.ts';\nimport { DummyNotices, type NoticeScenario, readOnlyText, startingText } from './notices.ts';\nimport { providerAccounts, providerFixtures } from './providers.ts';\nimport {\n type DummyLogin,\n type DummyServers,\n DummySettings,\n type DummyTransport,\n} from './settings.ts';\nimport { longAsk } from './showcase.ts';\nimport { DummySprinkles } from './sprinkles.ts';\nimport { DummyTabs, type TabsScenario } from './tabs.ts';\nimport { DummyTerminals } from './terminals.ts';\nimport { DummyTray } from './tray.ts';\nimport {\n type BetaScenario,\n DummyUpdates,\n type PackageConfirm,\n type PackageScenario,\n type UpdateScenario,\n} from './updates.ts';\nimport { accountRecords, DummyVault, type VaultScenario } from './vault.ts';\n\nexport interface DummyOptions {\n delay?: number;\n storage?: Storage | null;\n updates?: UpdateScenario;\n packages?: PackageScenario | 'off';\n confirm?: PackageConfirm;\n beta?: BetaScenario | 'off';\n mounts?: MountScenario | 'off';\n network?: NetworkScenario | 'off';\n tailnet?: TailnetScenario;\n links?: LinksScenario;\n leaders?: LeadersScenario;\n changes?: ChangesScenario;\n notices?: NoticeScenario | 'off';\n tabs?: TabsScenario | 'off';\n approvals?: ApprovalScenario | 'off';\n asks?: 'long' | 'off';\n follow?: FollowScenario | 'off';\n vault?: VaultScenario | 'off';\n guests?: GuestsScenario | 'off';\n accounts?: 'settings' | 'vault' | 'dual';\n providers?: 'connected' | 'none' | 'all';\n mcp?: 'moved' | 'states';\n servers?: DummyServers;\n transport?: DummyTransport;\n hold?: AgentHold['reason'] | 'off';\n readonly?: 'version' | 'off';\n agent?: 'ready' | 'starting' | 'waiting';\n browser?: BrowserScenario;\n sprinkles?: 'builtin' | 'cones';\n monitor?: 'dummy' | 'agent';\n import?: ImportScenario | 'off';\n login?: DummyLogin;\n budget?: BudgetScenario;\n}\n\nexport interface DummyModel extends SliccModel {\n settings: DummySettings;\n browser: DummyBrowser;\n updates: DummyUpdates;\n network?: DummyNetwork;\n notices?: DummyNotices;\n tabs?: DummyTabs;\n approvals?: DummyApprovals;\n follow?: DummyFollow;\n vault?: DummyVault;\n guests?: DummyGuests;\n}\n\nexport function vaultAccounts(accounts: readonly Account[]): Account[] {\n return accounts.map((account) =>\n account.auth === 'api-key' || account.id === 'github'\n ? { ...account, store: 'vault' as const }\n : account\n );\n}\n\nexport const docsUrl = 'https://docs.example/mcp';\nexport const movedDocs = 'https://docs.eu.example/mcp';\n\nfunction hinted(login?: DummyLogin): boolean {\n return login === 'code' || login === 'url' || login === 'lookalike';\n}\n\nfunction signInChat(\n conversations: Record<string, Message[]>,\n login?: DummyLogin\n): Record<string, Message[]> {\n if (!hinted(login)) return conversations;\n return {\n ...conversations,\n 'cone-kitchen': conversations['cone-kitchen'].map((message) =>\n message.id === 'k-s3'\n ? {\n ...message,\n account: 'openai-codex',\n text: 'The OpenAI Codex session expired. Log in again to continue.',\n }\n : message\n ),\n };\n}\n\nfunction settingsAccounts(\n accounts: 'settings' | 'vault' | 'dual',\n providers: 'connected' | 'none' | 'all',\n transport?: DummyTransport,\n mcp?: 'moved' | 'states'\n): Account[] {\n const rows = listedAccounts(accounts, providers, transport).map((account) =>\n mcp === 'moved' && account.id === 'mcp:docs' ? { ...account, url: movedDocs } : account\n );\n return mcp === 'states' ? [...rows, ...fixtures.serverStates] : rows;\n}\n\nfunction listedAccounts(\n accounts: 'settings' | 'vault' | 'dual',\n providers: 'connected' | 'none' | 'all',\n transport?: DummyTransport\n): Account[] {\n const all =\n accounts === 'settings'\n ? fixtures.accounts\n : [\n ...vaultAccounts(fixtures.accounts),\n ...(accounts === 'dual' ? [fixtures.dualAccount] : []),\n ];\n if (providers === 'all') return providerAccounts(all, transport === 'none' ? 'none' : undefined);\n return all.map((account) =>\n providers === 'none' && account.group !== 'mcp'\n ? { ...account, status: 'disconnected' as const, identity: '' }\n : account\n );\n}\n\nfunction vaultRecords(\n accounts: 'settings' | 'vault' | 'dual',\n mcp?: 'moved' | 'states'\n): SecretView[] {\n if (accounts === 'settings') return [];\n return accountRecords(Date.now(), mcp === 'moved' ? docsUrl : undefined);\n}\n\nfunction guestsPort(guests: GuestsScenario | 'off', time: Clock): { guests?: DummyGuests } {\n return guests === 'off' ? {} : { guests: new DummyGuests(guests, time) };\n}\n\nfunction importPort(scenario: ImportScenario | 'off', agent: DummyAgent, time: Clock): void {\n if (scenario === 'off') return;\n const port = new DummyImport(scenario, agent, time);\n agent.importProfile = port.importProfile.bind(port);\n agent.importCancel = port.importCancel.bind(port);\n agent.importing = port.importing.bind(port);\n}\n\nfunction noticesPort(\n agent: DummyAgent,\n time: Clock,\n notices: NoticeScenario | 'off',\n readonly: 'version' | 'off',\n arrival: 'ready' | 'starting' | 'waiting'\n): DummyNotices | null {\n if (readonly !== 'off') agent.setReadOnly(readOnlyText);\n if (arrival !== 'ready') agent.withhold(startingText, arrival === 'starting' ? 100 : undefined);\n const notice = readonly !== 'off' ? 'readonly' : arrival !== 'ready' ? 'starting' : notices;\n const port = notice === 'off' ? null : new DummyNotices(notice, time);\n if (port && readonly !== 'off') agent.on('readOnly', (text) => port.readOnly(Boolean(text)));\n if (port && arrival !== 'ready') agent.on('starting', (line) => port.starting(Boolean(line)));\n return port;\n}\n\nexport function createDummyModel({\n delay = 30,\n storage = null,\n updates = 'current',\n packages = 'off',\n confirm,\n beta = 'off',\n mounts = 'off',\n network = 'limited',\n tailnet,\n links,\n leaders,\n changes = 'files',\n notices = 'off',\n tabs = 'off',\n approvals = 'off',\n asks = 'off',\n follow = 'off',\n vault = 'off',\n guests = 'off',\n accounts = 'settings',\n providers = 'connected',\n mcp,\n servers = 'owner',\n transport,\n hold = 'off',\n readonly = 'off',\n agent: arrival = 'ready',\n browser: scenario = 'idle',\n sprinkles = 'builtin',\n monitor = 'dummy',\n import: imports = 'off',\n login,\n budget = 'plain',\n}: DummyOptions = {}): DummyModel {\n const time = clock(delay);\n const mount =\n mounts === 'off'\n ? null\n : { scenario: mounts, point: fixtures.mountPoint, files: fixtures.mounted };\n const pending = changes === 'git' ? [...fixtures.pending, fixtures.skillEdit] : fixtures.pending;\n const files = new DummyFiles(fixtures.files, fixtures.directories, pending, time, mount);\n const browser = new DummyBrowser(scenario === 'off' ? [] : fixtures.tabs, time, {\n history: browserHistory(scenario),\n controlled: scenario === 'driving' ? ['tab-preview', 'tab-pull'] : [],\n });\n const chats = signInChat(fixtures.conversations, login);\n const agent = new DummyAgent(\n fixtures.agents,\n asks === 'long' ? { ...chats, 'cone-kitchen': [...chats['cone-kitchen'], longAsk()] } : chats,\n { files, browser },\n time,\n fixtures.queues,\n extras.frozen\n );\n const stop = agent.stop.bind(agent);\n agent.stop = (agentId: string) => {\n stop(agentId);\n browser.release(agentId);\n };\n importPort(imports, agent, time);\n if (hold !== 'off') agent.setHold({ reason: hold, held: 2 });\n const noticePort = noticesPort(agent, time, notices, readonly, arrival);\n if (scenario === 'driving') void browser.run(drive);\n const base = {\n agent,\n files,\n browser,\n terminals: new DummyTerminals(fixtures.terminals, files, time),\n settings: new DummySettings(\n fixtures.defaults,\n providers === 'none' ? [...fixtures.models, ...fixtures.laterModels] : fixtures.models,\n [\n ...settingsAccounts(accounts, providers, transport, mcp),\n ...(hinted(login) ? [fixtures.codexAccount] : []),\n ],\n storage,\n time,\n undefined,\n providers === 'none',\n login,\n providers === 'all' ? providerFixtures : undefined,\n transport,\n servers\n ),\n memory: new DummyMemory(extras.memories, () => [\n { id: 'global', label: 'Everyone' },\n ...agent\n .list()\n .filter((cone) => cone.kind === 'cone')\n .map((cone) => ({ id: cone.id, label: cone.name, group: 'cones' as const })),\n { id: 'role:reviewer', label: 'reviewer', group: 'roles' },\n ]),\n sprinkles: new DummySprinkles(\n sprinkles === 'cones' ? [...extras.sprinkles, ...extras.coneSprinkles] : extras.sprinkles,\n agent,\n files\n ),\n tray: new DummyTray(extras.trayWith(budget), time),\n updates: new DummyUpdates(updates, time, {\n ...(packages === 'off' ? {} : { packages }),\n ...(beta === 'off' ? {} : { beta }),\n confirm,\n }),\n ...(network === 'off'\n ? {}\n : { network: new DummyNetwork(network, time, tailnet, links, files, leaders) }),\n ...(changes === 'files' ? {} : { changes: new DummyChanges(files, changes === 'git') }),\n ...(noticePort ? { notices: noticePort } : {}),\n ...(tabs === 'off' ? {} : { tabs: new DummyTabs(tabs, time) }),\n ...(approvals === 'off' ? {} : { approvals: new DummyApprovals(approvals, time) }),\n ...(follow === 'off' ? {} : { follow: new DummyFollow(follow, time) }),\n ...(vault === 'off'\n ? {}\n : {\n vault: new DummyVault(vault, time, vaultRecords(accounts, mcp)),\n }),\n ...guestsPort(guests, time),\n };\n base.vault?.on('status', (status) => {\n if (!status.locked && agent.hold()?.reason === 'locked') agent.setHold(null);\n });\n return {\n ...base,\n monitor: new DummyMonitor(base, monitor === 'agent' ? agentSections : undefined),\n };\n}\n"],
5
+ "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
6
6
  "names": ["now", "now", "harbor", "tabs", "clock", "script", "files", "now", "minutes", "name", "refused", "status", "agent", "hour", "day", "now", "clock", "refused", "day", "clock", "now", "ticks", "files", "cities", "name", "day", "agents", "conversations", "clock", "queues", "frozen", "status", "chunks", "latest", "test", "name", "agent", "ticks", "day", "name", "directories", "clock", "now", "files", "status", "memories", "terminals", "files", "tray", "agents", "status", "minute", "now", "clock", "files", "status", "mounted", "node", "name", "sprinkles", "files", "files", "clock", "entries", "name", "terminals", "files", "clock", "status", "clock", "notes", "owner", "name", "label", "offered", "pin", "clock", "minute", "hour", "day", "now", "pin", "status", "name", "labels", "label", "page", "offered", "accounts", "conversations", "tabs", "sprinkles", "pending", "files", "status"]
7
7
  }