@ai-ecoverse/slicc-spectrum 1.77.1 → 1.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -7
- package/dist/slicc-dummy.js +179 -41
- package/dist/slicc-dummy.js.map +4 -4
- package/dist/slicc-ui.js +735 -161
- package/dist/slicc-ui.js.map +4 -4
- package/dist/types/app/agents.d.ts +3 -0
- package/dist/types/app/approvals.d.ts +6 -4
- package/dist/types/app/confirm.d.ts +1 -0
- package/dist/types/app/guests.d.ts +98 -0
- package/dist/types/app/network.d.ts +10 -1
- package/dist/types/dummy/approvals.d.ts +1 -1
- package/dist/types/dummy/guests.d.ts +20 -0
- package/dist/types/dummy/index.d.ts +4 -1
- package/dist/types/dummy.d.ts +2 -0
- package/dist/types/model/types.d.ts +71 -3
- package/dist/types/ui.d.ts +2 -1
- package/package.json +4 -4
package/dist/slicc-dummy.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/dummy/approvals.ts", "../src/dummy/browser.ts", "../src/dummy/changes.ts", "../src/dummy/follow.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/showcase.ts", "../src/dummy/fixtures.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';\n\nexport type ApprovalScenario =\n | 'agent'\n | 'user'\n | 'many'\n | 'follower'\n | 'fail'\n | 'soon'\n | 'elsewhere'\n | 'withdrawn'\n | 'secrets'\n | 'none';\n\nconst minutes = 60_000;\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 === '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 === 'none') return [];\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') 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 }\n\n raise(approval: Approval): void {\n this.#approvals = [...this.#approvals, 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 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\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 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 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: '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 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\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 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};\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 (/\\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 (/\\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\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\nfunction ticks(steps: readonly Step[]): number {\n return steps.reduce((sum, step) => {\n if (step.type === 'tool') return sum + step.ticks;\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 #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\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) {\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\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.title,\n input: 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 await this.#clock.sleep(step.ticks * 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 async #step(agentId: string, reply: AssistantMessage, step: Step, run: Run): 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 await this.#step(agentId, reply, steps[0] as 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' ? first.text.slice(0, 80) : 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 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' ? first.text.slice(0, 80) : 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' ? first.text.slice(0, 80) : 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…</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 { FrozenCone, Memory, Message, Sprinkle, TrayStatus } 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 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\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: { percent: 32, window: 'weekly', resets: 'resets in 4 days' },\n joinUrl: 'https://www.example.com/join/7Q4D-K9TX',\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 type { Agent, LickChannel, Message, ToolCall, UserMessage } from '../model/types.ts';\n\nconst start = Date.UTC(2026, 9, 4, 16, 0);\nconst at = (minutes: number) => start + minutes * 60_000;\n\nexport function picture(\n label: string,\n from: string,\n to: string,\n width = 640,\n height = 400\n): string {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\"><defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"${from}\"/><stop offset=\"1\" stop-color=\"${to}\"/></linearGradient></defs><rect width=\"${width}\" height=\"${height}\" fill=\"url(#g)\"/><text x=\"50%\" y=\"50%\" font-family=\"sans-serif\" font-size=\"${Math.round(height / 9)}\" fill=\"#ffffff\" text-anchor=\"middle\" dominant-baseline=\"middle\">${label}</text></svg>`;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function tone(seconds = 0.6, frequency = 440, rate = 8000): string {\n const samples = Math.round(seconds * rate);\n const bytes = new Uint8Array(44 + samples);\n const view = new DataView(bytes.buffer);\n const text = (offset: number, value: string) => {\n for (let i = 0; i < value.length; i++) bytes[offset + i] = value.charCodeAt(i);\n };\n text(0, 'RIFF');\n view.setUint32(4, 36 + samples, true);\n text(8, 'WAVEfmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, rate, true);\n view.setUint32(28, rate, true);\n view.setUint16(32, 1, true);\n view.setUint16(34, 8, true);\n text(36, 'data');\n view.setUint32(40, samples, true);\n for (let i = 0; i < samples; i++) {\n const fade = Math.min(1, (samples - i) / (rate / 10));\n bytes[44 + i] = 128 + Math.round(60 * fade * Math.sin((2 * Math.PI * frequency * i) / rate));\n }\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return `data:audio/wav;base64,${btoa(binary)}`;\n}\n\nfunction tool(\n id: string,\n name: string,\n title: string,\n input: string,\n output: string,\n extra: Partial<ToolCall> = {}\n): ToolCall {\n return { id, name, title, input, output, status: 'done', paths: [], ...extra };\n}\n\nconst markdown = [\n '## The forecast API in one page',\n '',\n 'harbor answers `GET /forecast?city=\u2026` with the day\u2019s **high**, **low** and a *short summary*, and caches per city for an hour. ~~XML output~~ is gone.',\n '',\n '### How a request flows',\n '',\n '1. The worker parses the city.',\n '2. The cache answers if it has a fresh entry:',\n ' - same UTC day',\n ' - younger than one hour',\n '3. Otherwise the upstream call runs, with three retries.',\n '',\n '> Upstream is slow at the top of the hour. Retries back off at 250, 500 and 1000 ms.',\n '',\n '```ts',\n 'export async function forecast(city: string): Promise<Forecast> {',\n ' const cached = cache.get(city);',\n ' if (cached) return cached;',\n ' return cache.set(city, await retry(() => upstream(city)));',\n '}',\n '```',\n '',\n '| Route | Cache | Typical latency |',\n '| --- | --- | ---: |',\n '| `/forecast` | 1 hour, per city | 38 ms |',\n '| `/health` | none | 2 ms |',\n '| `/forecast` (miss) | \u2014 | 410 ms |',\n '',\n '- [x] TTL fix merged',\n '- [ ] Move the cache to KV',\n '',\n 'Details are in the [API reference](https://api.example.com/docs/v2/forecast). A long path that must wrap: `/workspace/harbor/node_modules/.cache/wrangler/state/v3/cache/miniflare-CacheObject/7c1f0e3b9a5d4e2f8b6a1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f.sqlite`.',\n].join('\\n');\n\nconst toolShapes: ToolCall[] = [\n tool('k-t1', 'bash', 'Count the routes', \"rg -c 'pathname ===' src\", 'src/index.ts:2'),\n tool(\n 'k-t2',\n 'read_file',\n 'Read the router',\n '/workspace/harbor/src/index.ts',\n \"import { forecast } from './routes/forecast.ts';\\n\u2026\",\n {\n paths: ['/workspace/harbor/src/index.ts'],\n }\n ),\n tool(\n 'k-t3',\n 'write_file',\n 'Create the KV binding notes',\n '/workspace/harbor/docs/kv.md',\n 'Wrote 18 lines',\n {\n paths: ['/workspace/harbor/docs/kv.md'],\n }\n ),\n tool(\n 'k-t4',\n 'edit_file',\n 'Rename the cache key',\n '/workspace/harbor/src/lib/cache.ts',\n 'No match for \"cityKey(\" in src/lib/cache.ts',\n {\n status: 'error',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n }\n ),\n tool(\n 'k-t5',\n 'grep',\n 'Find TODOs',\n 'TODO --glob \"src/**\"',\n 'src/routes/forecast.ts:14: TODO: cache negative results\\nsrc/lib/units.ts:3: TODO: round half to even'\n ),\n tool(\n 'k-t6',\n 'web_fetch',\n 'Fetch the API changelog',\n 'https://api.example.com/changelog.json',\n '{ \"latest\": \"2.4.1\", \"breaking\": false }'\n ),\n tool(\n 'k-t7',\n 'browser',\n 'Screenshot the preview',\n 'screenshot http://localhost:8787/',\n 'Captured 1280\u00D7800',\n {\n image: picture('localhost:8787', '#3b63fb', '#0a7a43', 640, 400),\n }\n ),\n tool(\n 'k-t8',\n 'scoop_scoop',\n 'Start a scoop for the docs',\n 'name: docs-pass\\ntask: Update the forecast page to Celsius',\n 'Scoop docs-pass is running'\n ),\n tool(\n 'k-t9',\n 'feed_scoop',\n 'Hand the screenshots to docs-pass',\n 'scoop_name: docs-pass\\nmessage: Use the new screenshots in /tmp/shots',\n 'Delivered'\n ),\n tool(\n 'k-t10',\n 'send_message',\n 'Tell quiet-otter the tests pass',\n 'to: quiet-otter\\nmessage: CI is green, merge when ready',\n 'Delivered'\n ),\n tool(\n 'k-t11',\n 'drop_scoop',\n 'Wrap up amber-heron',\n 'scoop_name: amber-heron',\n 'Dropped amber-heron; its notes are in /shared/notes'\n ),\n tool(\n 'k-t12',\n 'update_global_memory',\n 'Remember the cache rule',\n 'Cache keys are per city and per UTC day.',\n 'Memory updated (3 sections, 412 characters)'\n ),\n tool(\n 'k-mcp',\n 'mcp__docs__search',\n 'docs \u00B7 search',\n '{\\n \"query\": \"forecast units\"\\n}',\n '2 pages: /forecast, /units'\n ),\n tool('k-t13', 'bash', 'Deploy to staging', 'wrangler deploy --env staging', 'Stopped', {\n status: 'cancelled',\n }),\n tool('k-t14', 'bash', 'Watch the logs', 'wrangler tail --env staging', '', { status: 'running' }),\n tool(\n 'k-t16',\n 'bash',\n 'Check the staging routes',\n 'wrangler routes list --env staging',\n 'ROUTE ZONE WORKER ENV\\nforecast.harbor.example/v2/forecast/* harbor.example harbor-forecast-v2 staging\\nerror: the route forecast.harbor.example/v2/units/* belongs to another account; ask its owner to release it first',\n {\n status: 'error',\n notes: [\n { severity: 'error', text: 'Exited with code 5' },\n {\n severity: 'warn',\n text: 'Output truncated: 12 lines and 1,840 bytes dropped from the start',\n },\n { severity: 'info', text: 'Full output in /tmp/pi-bash-7f3a.log' },\n ],\n }\n ),\n];\n\nconst licks: Array<[LickChannel, string, string, string | undefined, Partial<Message>]> = [\n [\n 'webhook',\n 'GitHub \u00B7 pull_request.opened',\n 'example/harbor#58 Add retries for upstream timeouts',\n '{\\n \"action\": \"opened\",\\n \"number\": 58,\\n \"repository\": { \"full_name\": \"example/harbor\" }\\n}',\n {},\n ],\n [\n 'cron',\n 'Every weekday 09:00',\n 'Morning summary for the harbor cone',\n undefined,\n { count: 3 } as Partial<Message>,\n ],\n [\n 'sprinkle',\n 'Release board',\n 'Button \u201CShip 1.9.0\u201D clicked',\n '{ \"button\": \"ship\", \"version\": \"1.9.0\" }',\n {},\n ],\n [\n 'fswatch',\n '/workspace/harbor/src',\n '2 files changed',\n 'modified /workspace/harbor/src/lib/cache.ts\\ncreated /workspace/harbor/src/lib/retry.ts',\n {},\n ],\n [\n 'session-reload',\n 'Session restored',\n 'The page reloaded; 4 cones resumed from storage',\n undefined,\n {},\n ],\n [\n 'navigate',\n 'api.example.com',\n 'A page offered a SLICC handoff: open the forecast docs',\n '{ \"verb\": \"open\", \"target\": \"https://api.example.com/docs/v2/forecast\" }',\n {},\n ],\n [\n 'discovery',\n 'api.example.com',\n 'Found an ai-catalog.json with 3 tools',\n 'https://api.example.com/.well-known/ai-catalog.json',\n {},\n ],\n ['upgrade', 'SLICC updated', '6.4.0 \u2192 6.5.0', undefined, {}],\n [\n 'workflow',\n 'release-notes',\n 'Step 2 of 4 finished: collect merged pull requests',\n undefined,\n {},\n ],\n ['bash', 'Job 3', 'npm run build exited with status 0 after 41 s', undefined, {}],\n ['jshd', 'collect.jsh', 'Script finished: 12 pull requests since v1.8.0', undefined, {}],\n ['preview', 'Preview bridge', 'Connected from localhost:8787', undefined, {}],\n [\n 'cherry',\n 'Host page',\n 'Event \u201Ccart-updated\u201D from shop.example.com',\n '{ \"items\": 3, \"total\": 42.5 }',\n {},\n ],\n ['scoop-notify', 'docs-pass', 'Finished: the forecast page now shows Celsius', undefined, {}],\n ['scoop-idle', 'amber-heron', 'Idle for 30 minutes', undefined, {}],\n ['scoop-wait', 'quiet-otter', 'The wait for CI resolved: all checks passed', undefined, {}],\n [\n 'sudo-request',\n 'docs-pass',\n 'Wants to push to example/harbor (branch docs/celsius)',\n 'git push origin docs/celsius',\n { state: 'pending', expiresAt: Date.now() + 10 * 60_000 } as Partial<Message>,\n ],\n [\n 'sudo-request',\n 'quiet-otter',\n 'Wants to read secrets: UPSTREAM_TOKEN',\n undefined,\n { state: 'confirmed' } as Partial<Message>,\n ],\n [\n 'sudo-request',\n 'amber-heron',\n 'Wants to run: rm -rf /workspace/harbor/node_modules',\n undefined,\n { state: 'dismissed' } as Partial<Message>,\n ],\n];\n\nconst attachmentsMessage: UserMessage = {\n id: 'k-u2',\n role: 'user',\n text: 'Here is the mockup, my notes and the old spec.',\n createdAt: at(4),\n attachments: [\n {\n id: 'k-a1',\n name: 'forecast-card.png',\n kind: 'image',\n mimeType: 'image/png',\n size: 48211,\n url: picture('Mockup', '#f5a623', '#d0021b', 480, 320),\n },\n {\n id: 'k-a2',\n name: 'notes.txt',\n kind: 'text',\n mimeType: 'text/plain',\n size: 214,\n text: 'Show \u00B0C first.\\nRound to whole degrees.\\nKeep the summary under 60 characters.',\n },\n {\n id: 'k-a3',\n name: 'spec-v1.pdf',\n kind: 'file',\n mimeType: 'application/pdf',\n size: 1_204_331,\n path: '/home/user/downloads/spec-v1.pdf',\n },\n {\n id: 'k-a4',\n name: 'UPSTREAM_TOKEN',\n kind: 'secret',\n mimeType: 'application/octet-stream',\n size: 0,\n },\n {\n id: 'k-a5',\n name: 'recording.mov',\n kind: 'file',\n mimeType: 'video/quicktime',\n size: 98_304_000,\n error: 'Too large: attachments are limited to 25 MB',\n },\n ],\n};\n\nexport const showcaseAgent: Agent = {\n id: 'cone-kitchen',\n name: 'kitchen-sink',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-opus-5-5',\n contextFill: 0.47,\n unread: 0,\n};\n\nfunction opening(): Message[] {\n return [\n {\n id: 'k-u1',\n role: 'user',\n text: 'Give me the full tour of harbor, everything you can show.',\n createdAt: at(0),\n },\n {\n id: 'k-m1',\n role: 'assistant',\n status: 'done',\n createdAt: at(1),\n model: 'claude-sonnet-5-5',\n usage: { input: 18_204, output: 912, cost: 0.31 },\n parts: [\n {\n type: 'thinking',\n text: 'Start with the shape of the API, then show the pieces one kind at a time.',\n },\n { type: 'text', text: markdown },\n ],\n },\n attachmentsMessage,\n {\n id: 'k-m2',\n role: 'assistant',\n status: 'done',\n createdAt: at(5),\n model: 'claude-sonnet-5-5',\n parts: [\n {\n type: 'text',\n text: 'Mockup, notes and spec received. The recording was too large to attach. Here are the current screens and the alert sound:',\n },\n {\n type: 'media',\n items: [\n {\n kind: 'image',\n src: picture('Forecast card', '#3b63fb', '#7a5af8'),\n alt: 'The forecast card in light mode',\n },\n {\n kind: 'image',\n src: picture('Dark card', '#1d1d1d', '#3b63fb'),\n alt: 'The forecast card in dark mode',\n },\n {\n kind: 'image',\n src: picture('Phone', '#0a7a43', '#12b886', 360, 640),\n alt: 'The forecast card on a phone',\n },\n {\n kind: 'video',\n src: '',\n poster: picture('\u25B6 Walkthrough', '#292929', '#717171'),\n alt: 'A walkthrough of the forecast page',\n },\n { kind: 'audio', src: tone(), alt: 'The storm alert sound' },\n ],\n },\n ],\n },\n { id: 'k-u3', role: 'user', text: 'Show me every tool you used.', createdAt: at(8) },\n {\n id: 'k-m3',\n role: 'assistant',\n status: 'done',\n createdAt: at(9),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Every tool from today\u2019s run, in order:' },\n ...toolShapes.map((call) => ({ type: 'tool' as const, tool: call })),\n ],\n },\n {\n id: 'k-tool1',\n role: 'tool',\n createdAt: at(12),\n tool: tool(\n 'k-t15',\n 'bash',\n 'You ran a command',\n 'git log --oneline -3',\n 'a1b2c3d fix: expire entries from the previous day\\ne4f5a6b feat: retry upstream timeouts\\n0c9d8e7 chore: update wrangler'\n ),\n },\n ];\n}\n\nfunction runs(): Message[] {\n return [\n {\n id: 'k-u6',\n role: 'user',\n text: 'Get the forecast docs ready for the Celsius release.',\n createdAt: at(13),\n },\n {\n id: 'k-m8',\n role: 'assistant',\n status: 'done',\n createdAt: at(13.1),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Checking what the docs and the API say today.' },\n ...[\n tool(\n 'k-r1',\n 'bash',\n 'Ask the API for Lisbon',\n 'curl -s https://api.example.com/v2/forecast?city=Lisbon',\n '{ \"city\": \"Lisbon\", \"high\": 71, \"low\": 58, \"unit\": \"F\" }'\n ),\n tool(\n 'k-r2',\n 'bash',\n 'Read the forecast page',\n 'cat /workspace/harbor/docs/forecast.md',\n '# Forecast\\n\\nTemperatures are in Fahrenheit.'\n ),\n tool('k-r3', 'bash', 'See what changed', 'git status --short', ' M src/lib/units.ts'),\n tool(\n 'k-r4',\n 'read_file',\n 'Read the units helper',\n '/workspace/harbor/src/lib/units.ts',\n 'export function toCelsius(f: number): number {\u2026}',\n { paths: ['/workspace/harbor/src/lib/units.ts'] }\n ),\n ].map((call) => ({ type: 'tool' as const, tool: call })),\n {\n type: 'text',\n text: 'The page still says Fahrenheit. Updating it, then building and testing.',\n },\n ...[\n tool(\n 'k-r5',\n 'edit_file',\n 'Switch the page to Celsius',\n '/workspace/harbor/docs/forecast.md',\n 'Edited 1 line',\n {\n paths: ['/workspace/harbor/docs/forecast.md'],\n diff: {\n before: '# Forecast\\n\\nTemperatures are in Fahrenheit.\\n',\n after: '# Forecast\\n\\nTemperatures are in Celsius.\\n',\n },\n }\n ),\n tool('k-r6', 'bash', 'Build the site', 'npm run build', 'Built 14 pages in 2.1s', {\n meta: 'timeout 120s',\n }),\n tool(\n 'k-r7',\n 'bash',\n 'Run the unit tests',\n 'npx vitest run src/lib/units.test.ts',\n 'FAIL src/lib/units.test.ts > rounds half to even\\nExpected 22, received 21',\n {\n status: 'error',\n notes: [{ severity: 'error', text: 'Exited with code 1' }],\n }\n ),\n tool(\n 'k-r8',\n 'bash',\n 'Open the release pull request',\n 'gh pr create --repo https://git.example.com/example/harbor --title \"Celsius docs\"',\n 'Stopped before the tests pass',\n { status: 'cancelled' }\n ),\n tool('k-r9', 'bash', 'Watch the preview logs', 'wrangler tail --env preview', '', {\n status: 'running',\n }),\n ].map((call) => ({ type: 'tool' as const, tool: call })),\n {\n type: 'text',\n text: 'One test fails on rounding, so the pull request waits for the fix.',\n },\n ],\n },\n {\n id: 'k-tool2',\n role: 'tool',\n createdAt: at(13.5),\n tool: tool(\n 'k-r10',\n 'bash',\n 'Check the preview port',\n 'lsof -i :8787',\n 'workerd 4120 harbor 12u IPv4 TCP localhost:8787 (LISTEN)'\n ),\n },\n ];\n}\n\nfunction work(): Message[] {\n return [\n {\n id: 'k-m4',\n role: 'assistant',\n status: 'done',\n createdAt: at(14),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Here is where things stand.' },\n { type: 'sprinkle', sprinkle: 'status' },\n {\n type: 'delegation',\n kind: 'scoop',\n scoop: 'docs-pass',\n text: 'Started a scoop to update the docs',\n },\n {\n type: 'delegation',\n kind: 'feed',\n scoop: 'docs-pass',\n text: 'Handed over the new screenshots',\n },\n {\n type: 'delegation',\n kind: 'sprinkle',\n scoop: 'suggestions',\n text: 'Opened the suggestions sprinkle',\n },\n { type: 'delegation', kind: 'drop', scoop: 'amber-heron', text: 'Wrapped up amber-heron' },\n ],\n },\n {\n id: 'k-m5',\n role: 'assistant',\n status: 'done',\n createdAt: at(18),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Three decisions from earlier:' },\n {\n type: 'question',\n question: {\n id: 'k-q1',\n kind: 'yes-no',\n question: 'Tag 1.9.0 after the merge?',\n options: [],\n state: 'answered',\n answer: 'Yes',\n },\n },\n {\n type: 'question',\n question: {\n id: 'k-q2',\n kind: 'text',\n question: 'What should the release be called?',\n options: [],\n state: 'inert',\n },\n },\n {\n type: 'question',\n question: {\n id: 'k-q3',\n kind: 'choice',\n question: 'Where should the cache live?',\n options: ['Keep it in memory', 'Move it to KV', 'Decide after the load test'],\n state: 'open',\n },\n },\n ],\n },\n ];\n}\n\nfunction events(): Message[] {\n return [\n {\n id: 'k-s1',\n role: 'system',\n kind: 'compaction',\n title: 'Context compacted',\n text: '58 earlier messages were summarized.',\n trigger: 'threshold',\n state: 'summarized',\n createdAt: at(1440),\n },\n {\n id: 'k-s2',\n role: 'system',\n kind: 'compaction',\n title: 'Compaction failed, transcript truncated',\n text: 'The summary failed, so the oldest 20 messages were dropped instead.',\n trigger: 'overflow',\n state: 'fallback',\n createdAt: at(1441),\n },\n ...licks.map(\n ([channel, title, text, body, extra], index): Message =>\n ({\n id: `k-l${index + 1}`,\n role: 'lick',\n channel,\n title,\n text,\n createdAt: at(1445 + index),\n ...(body ? { body } : {}),\n ...extra,\n }) as Message\n ),\n {\n id: 'k-u4',\n role: 'user',\n text: 'Actually, stop the deploy, staging is frozen today.',\n mode: 'steer',\n createdAt: at(1470),\n },\n {\n id: 'k-m6',\n role: 'assistant',\n status: 'stopped',\n createdAt: at(1470),\n model: 'claude-haiku-4-5',\n parts: [{ type: 'text', text: 'Stopping the staging deploy and leaving' }],\n },\n {\n id: 'k-u5',\n role: 'user',\n text: 'Update the forecast page to Celsius and use the new screenshots.',\n from: 'harbor',\n createdAt: at(1472),\n },\n {\n id: 'k-m7',\n role: 'assistant',\n status: 'error',\n createdAt: at(1475),\n model: 'claude-haiku-4-5',\n parts: [\n {\n type: 'thinking',\n text: 'The model rejected the request because the context is too large.',\n },\n {\n type: 'error',\n message: 'The request is too large for this model.',\n detail: 'The model returned 413: the request is larger than its context window.',\n action: 'change-model',\n },\n ],\n },\n {\n id: 'k-s3',\n role: 'system',\n kind: 'error',\n title: 'docs-pass failed',\n text: 'The Adobe session expired. Log in again to continue.',\n action: 'login',\n createdAt: at(1476),\n },\n {\n id: 'k-s4',\n role: 'system',\n kind: 'error',\n title: 'Rate limited',\n text: 'Anthropic answered 429. Retrying in 30 seconds.',\n action: 'retry',\n createdAt: at(1477),\n },\n {\n id: 'k-s5',\n role: 'system',\n kind: 'notice',\n title: 'Model changed',\n text: 'to Claude Opus 5.5 (Anthropic)',\n createdAt: at(1478),\n },\n ];\n}\n\nexport function showcase(): Message[] {\n return [...opening(), ...runs(), ...work(), ...events()];\n}\n\nexport function showcaseQueue(): UserMessage[] {\n return [\n {\n id: 'k-q-1',\n role: 'user',\n text: 'Then open a pull request for the docs.',\n createdAt: at(1480),\n queued: true,\n mode: 'queue',\n },\n {\n id: 'k-q-2',\n role: 'user',\n text: 'And post the link in the release channel.',\n createdAt: at(1481),\n queued: true,\n mode: 'queue',\n },\n ];\n}\n", "import type {\n Account,\n Agent,\n BrowserTab,\n Change,\n Message,\n ModelOption,\n Settings,\n TerminalInfo,\n UserMessage,\n} from '../model/types.ts';\nimport { showcase, showcaseAgent, showcaseQueue } from './showcase.ts';\n\nconst cacheBefore = `export interface Entry<T> {\n value: T;\n storedAt: number;\n}\n\nconst TTL = 60 * 60 * 1000;\n\nexport class ForecastCache<T> {\n #entries = new Map<string, Entry<T>>();\n\n get(key: string, now = Date.now()): T | undefined {\n const entry = this.#entries.get(key);\n if (!entry) return undefined;\n const day = new Date(entry.storedAt).getDate();\n if (day !== new Date(now).getDate()) return entry.value;\n if (now - entry.storedAt > TTL) return undefined;\n return entry.value;\n }\n\n set(key: string, value: T, now = Date.now()): void {\n this.#entries.set(key, { value, storedAt: now });\n }\n}\n`;\n\nconst cacheAfter = `export interface Entry<T> {\n value: T;\n storedAt: number;\n}\n\nconst TTL = 60 * 60 * 1000;\n\nexport class ForecastCache<T> {\n #entries = new Map<string, Entry<T>>();\n\n get(key: string, now = Date.now()): T | undefined {\n const entry = this.#entries.get(key);\n if (!entry) return undefined;\n if (dayOf(entry.storedAt) !== dayOf(now)) {\n this.#entries.delete(key);\n return undefined;\n }\n if (now - entry.storedAt > TTL) return undefined;\n return entry.value;\n }\n\n set(key: string, value: T, now = Date.now()): void {\n this.#entries.set(key, { value, storedAt: now });\n }\n}\n\nfunction dayOf(time: number): string {\n return new Date(time).toISOString().slice(0, 10);\n}\n`;\n\nconst retry = `export async function retry<T>(task: () => Promise<T>, attempts = 3, wait = 250): Promise<T> {\n let last: unknown;\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n return await task();\n } catch (error) {\n last = error;\n await new Promise((resolve) => setTimeout(resolve, wait * 2 ** attempt));\n }\n }\n throw last;\n}\n`;\n\nconst legacyXml = `export function toXml(forecast: { city: string; high: number; low: number }): string {\n return \\`<forecast city=\"\\${forecast.city}\"><high>\\${forecast.high}</high><low>\\${forecast.low}</low></forecast>\\`;\n}\n`;\n\nconst forecastBefore = `import { ForecastCache } from '../lib/cache.ts';\nimport { toCelsius } from '../lib/units.ts';\n\nconst cache = new ForecastCache<Forecast>();\n\nexport interface Forecast {\n city: string;\n high: number;\n low: number;\n summary: string;\n}\n\nexport async function forecast(city: string, upstream: typeof fetch = fetch): Promise<Forecast> {\n const cached = cache.get(city);\n if (cached) return cached;\n const response = await upstream(\\`https://api.example.com/v2/forecast?city=\\${encodeURIComponent(city)}\\`);\n const body = await response.json();\n const result = {\n city,\n high: toCelsius(body.daily.max),\n low: toCelsius(body.daily.min),\n summary: body.daily.summary,\n };\n cache.set(city, result);\n return result;\n}\n`;\n\nconst forecastAfter = forecastBefore\n .replace(\n \"import { toCelsius } from '../lib/units.ts';\",\n \"import { retry } from '../lib/retry.ts';\\nimport { toCelsius } from '../lib/units.ts';\"\n )\n .replace('const response = await upstream(', 'const response = await retry(() =>\\n upstream(')\n .replace('(city)}`);', '(city)}`)\\n );');\n\nconst units = `export function toCelsius(fahrenheit: number): number {\n return Math.round(((fahrenheit - 32) * 5) / 9);\n}\n\nexport function toFahrenheit(celsius: number): number {\n return Math.round((celsius * 9) / 5 + 32);\n}\n`;\n\nconst unitsTest = `import assert from 'node:assert/strict';\nimport { test } from 'node:test';\nimport { toCelsius, toFahrenheit } from '../src/lib/units.ts';\n\ntest('converts both ways', () => {\n assert.equal(toCelsius(212), 100);\n assert.equal(toFahrenheit(0), 32);\n});\n`;\n\nconst index = `import { forecast } from './routes/forecast.ts';\n\nexport default {\n async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url);\n if (url.pathname === '/health') return new Response('ok');\n const city = url.searchParams.get('city');\n if (!city) return Response.json({ error: 'city is required' }, { status: 400 });\n return Response.json(await forecast(city));\n },\n};\n`;\n\nconst readme = `# harbor\n\nA small forecast API that sits in front of the upstream weather service and caches per city.\n\n## Development\n\n\\`\\`\\`sh\nnpm install\nnpm test\nnpm run dev\n\\`\\`\\`\n\nThe worker listens on \\`http://localhost:8787\\`. Try \\`/forecast?city=Lisbon\\`.\n`;\n\nconst pkg = `{\n \"name\": \"harbor\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"wrangler dev\",\n \"test\": \"node --test test/\"\n },\n \"devDependencies\": {\n \"wrangler\": \"4.40.0\"\n }\n}\n`;\n\nconst skill = `---\nname: release-notes\ndescription: Draft release notes from merged pull requests since the last tag.\n---\n\n1. Run \\`collect.jsh\\` with the repository and the previous tag.\n2. Group the pull requests by label: features, fixes, chores.\n3. Write one sentence per change, in the past tense, without ticket numbers.\n`;\n\nconst collect = `const [repo, since] = process.argv.slice(2);\nconst pulls = await gh(\\`repos/\\${repo}/pulls?state=closed&per_page=100\\`);\nfor (const pull of pulls.filter((p) => p.merged_at > since)) {\n console.log(\\`\\${pull.number}\\\\t\\${pull.labels.map((l) => l.name).join(',')}\\\\t\\${pull.title}\\`);\n}\n`;\n\nconst memory = `# Shared memory\n\n## Preferences\n- Keep replies short. Lead with the result, then the evidence.\n- Run the tests before saying something is fixed.\n\n## Projects\n- harbor: forecast API, deployed as a worker. Cache bugs show up around midnight UTC.\n- release-notes: drafted every Friday from merged pull requests.\n`;\n\nconst standup = `# Standup, 4 October\n\n- harbor: retries for upstream timeouts are in review.\n- Docs: the forecast endpoint page still shows Fahrenheit examples.\n- Next: move the cache to KV once the TTL fix lands.\n`;\n\nconst sample = `{\n \"city\": \"Lisbon\",\n \"daily\": { \"max\": 77, \"min\": 61, \"summary\": \"Clear, light wind from the north\" }\n}\n`;\n\nconst bashrc = `export PS1='\\\\u@slicc:\\\\w\\\\$ '\nalias ll='ls -la'\n`;\n\nconst suggestions = `${JSON.stringify(\n [\n {\n id: 'sug-units',\n kind: 'skill',\n title: 'Unit conversions',\n body: 'You converted Fahrenheit to Celsius by hand in three chats this week. A skill can do it for you.',\n skill: 'unit-converter',\n install:\n 'unit-converter from raw.githubusercontent.com/example/skills/main/unit-converter/SKILL.md',\n },\n {\n id: 'sug-notes',\n kind: 'use-case',\n title: 'Release notes from the week',\n body: 'You write release notes for harbor every Friday. Let the cone draft them from the commits.',\n prompt: 'Draft release notes for harbor from the commits since last Friday.',\n },\n {\n id: 'sug-cache',\n kind: 'tip',\n title: 'Name your cache keys',\n body: 'Forecast cache keys mix the city and the units. Splitting them makes stale entries easier to find.',\n },\n ],\n null,\n 2\n)}\n`;\n\nexport const files: Record<string, string> = {\n '/workspace/harbor/README.md': readme,\n '/workspace/harbor/package.json': pkg,\n '/workspace/harbor/wrangler.toml':\n 'name = \"harbor\"\\nmain = \"src/index.ts\"\\ncompatibility_date = \"2026-09-01\"\\n',\n '/workspace/harbor/.gitignore': 'node_modules/\\n.wrangler/\\n',\n '/workspace/harbor/src/index.ts': index,\n '/workspace/harbor/src/routes/forecast.ts': forecastBefore,\n '/workspace/harbor/src/lib/cache.ts': cacheBefore,\n '/workspace/harbor/src/lib/units.ts': units,\n '/workspace/harbor/src/legacy/xml.ts': legacyXml,\n '/workspace/harbor/static/radar.png': '\\u0089PNG\\r\\n\\u001a\\n',\n '/workspace/harbor/test/units.test.ts': unitsTest,\n '/workspace/skills/release-notes/SKILL.md': skill,\n '/workspace/skills/release-notes/scripts/collect.jsh': collect,\n '/shared/MEMORY.md': memory,\n '/shared/notes/2026-10-04-standup.md': standup,\n '/home/user/.bashrc': bashrc,\n '/home/.gelatiere/suggestions.json': suggestions,\n '/tmp/forecast-sample.json': sample,\n};\n\nexport const directories = ['/sessions', '/home/user/downloads'];\n\nexport const mountPoint = '/mnt/photos';\n\nexport const mounted: Record<string, string> = {\n 'README.md': '# Photos\\n\\nHarbor shots for the forecast pages, one album per season.\\n',\n 'albums/autumn.json': '{ \"title\": \"Autumn\", \"shots\": [\"breakwater-fog\", \"pier-at-dusk\"] }\\n',\n 'albums/winter.json': '{ \"title\": \"Winter\", \"shots\": [\"ice-on-the-buoys\"] }\\n',\n 'captions.txt':\n 'breakwater-fog: low cloud over the outer wall\\npier-at-dusk: lamps on, tide out\\n',\n};\n\nexport const pending: Change[] = [\n {\n path: '/workspace/harbor/src/lib/cache.ts',\n status: 'modified',\n before: cacheBefore,\n after: cacheAfter,\n agentId: 'cone-harbor',\n },\n {\n path: '/workspace/harbor/src/lib/retry.ts',\n status: 'added',\n before: null,\n after: retry,\n agentId: 'scoop-otter',\n },\n {\n path: '/workspace/harbor/src/routes/forecast.ts',\n status: 'modified',\n before: forecastBefore,\n after: forecastAfter,\n agentId: 'scoop-otter',\n },\n {\n path: '/workspace/harbor/src/legacy/xml.ts',\n status: 'deleted',\n before: legacyXml,\n after: null,\n agentId: 'cone-harbor',\n },\n {\n path: '/workspace/harbor/static/radar.png',\n status: 'modified',\n before: null,\n after: null,\n agentId: 'scoop-otter',\n },\n];\n\nexport const skillEdit: Change = {\n path: '/workspace/skills/release-notes/SKILL.md',\n status: 'modified',\n before: skill,\n after: `${skill}4. Link each change to its pull request.\\n`,\n agentId: null,\n};\n\nexport const models: ModelOption[] = [\n { id: 'claude-opus-5-5', label: 'Claude Opus 5.5', provider: 'Anthropic', images: true },\n { id: 'claude-sonnet-5-5', label: 'Claude Sonnet 5.5', provider: 'Anthropic', images: true },\n { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5', provider: 'Anthropic', images: true },\n { id: 'local-small', label: 'Local (ort-llama)', provider: 'This browser', images: false },\n { id: 'local-guard', label: 'Local guard', provider: 'This browser', kind: 'classifier' },\n { id: 'local-tiny', label: 'Local tiny (no tools)', provider: 'This browser', tools: false },\n];\n\nexport const laterModels: ModelOption[] = [\n { id: 'gpt-6', label: 'GPT-6', provider: 'OpenAI', images: true },\n { id: 'gpt-6-mini', label: 'GPT-6 mini', provider: 'OpenAI', images: true, default: true },\n];\n\nexport const defaults: Settings = {\n color: 'system',\n model: 'claude-sonnet-5-5',\n thinking: 'medium',\n sendOnEnter: true,\n pushToTalk: false,\n showThinking: true,\n diffStyle: 'unified',\n};\n\nexport const accounts: Account[] = [\n { id: 'anthropic', provider: 'Anthropic', identity: 'API key ending 3f2a', status: 'connected' },\n { id: 'github', provider: 'GitHub', identity: '@example-dev', status: 'connected' },\n { id: 'adobe', provider: 'Adobe', identity: 'dev@example.com', status: 'expired' },\n { id: 'openai', provider: 'OpenAI', identity: '', status: 'disconnected', auth: 'api-key' },\n {\n id: 'mcp:docs',\n provider: 'docs',\n identity: 'docs.example',\n status: 'connected',\n auth: 'api-key',\n group: 'mcp',\n secret: 'token',\n },\n {\n id: 'mcp:tickets',\n provider: 'tickets',\n identity: 'tickets.example',\n status: 'expired',\n auth: 'api-key',\n group: 'mcp',\n secret: 'token',\n },\n {\n id: 'mcp:design',\n provider: 'design',\n identity: 'design.example',\n status: 'disconnected',\n auth: 'oauth',\n group: 'mcp',\n },\n];\n\nexport const agents: Agent[] = [\n {\n id: 'cone-sliccy',\n name: 'sliccy',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0.21,\n unread: 0,\n },\n showcaseAgent,\n {\n id: 'cone-harbor',\n name: 'harbor',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-opus-5-5',\n contextFill: 0.38,\n unread: 0,\n },\n {\n id: 'scoop-otter',\n name: 'quiet-otter',\n kind: 'scoop',\n parentId: 'cone-harbor',\n status: 'working',\n model: 'claude-haiku-4-5',\n contextFill: 0.12,\n unread: 0,\n },\n {\n id: 'scoop-heron',\n name: 'amber-heron',\n kind: 'scoop',\n parentId: 'cone-harbor',\n status: 'idle',\n model: 'claude-haiku-4-5',\n contextFill: 0.04,\n unread: 0,\n },\n {\n id: 'cone-release',\n name: 'release-notes',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0.7,\n unread: 1,\n },\n {\n id: 'cone-triage',\n name: 'inbox-triage',\n kind: 'cone',\n parentId: null,\n status: 'waiting',\n model: 'claude-sonnet-5-5',\n contextFill: 0.95,\n unread: 2,\n },\n {\n id: 'scoop-wren',\n name: 'tidal-wren',\n kind: 'scoop',\n parentId: 'cone-sliccy',\n status: 'idle',\n model: 'claude-haiku-4-5',\n contextFill: 0.02,\n unread: 0,\n },\n {\n id: 'cone-tides',\n name: 'tide-tables',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0.31,\n unread: 0,\n frozen: true,\n },\n];\n\nconst start = Date.UTC(2026, 9, 5, 8, 30);\nconst at = (minutes: number) => start + minutes * 60_000;\n\nexport const queues: Record<string, UserMessage[]> = { 'cone-kitchen': showcaseQueue() };\n\nexport const conversations: Record<string, Message[]> = {\n 'cone-kitchen': showcase(),\n 'cone-sliccy': [\n {\n id: 'm-s0',\n role: 'assistant',\n status: 'done',\n createdAt: at(-24 * 60),\n parts: [\n {\n type: 'text',\n text: 'Hi, I am sliccy. Tell me a little about yourself, and I will set things up for you.',\n },\n { type: 'sprinkle', sprinkle: 'welcome' },\n ],\n },\n {\n id: 'm-s1',\n role: 'user',\n text: 'What is on my plate today?',\n createdAt: at(0),\n },\n {\n id: 'm-s2',\n role: 'assistant',\n status: 'done',\n createdAt: at(1),\n parts: [\n {\n type: 'tool',\n tool: {\n id: 't-s1',\n name: 'read_file',\n title: 'Read the standup notes',\n input: '/shared/notes/2026-10-04-standup.md',\n output: standup,\n status: 'done',\n paths: ['/shared/notes/2026-10-04-standup.md'],\n },\n },\n {\n type: 'text',\n text: 'Three things carry over from yesterday:\\n\\n1. **harbor**: the retry change is in review, and the midnight cache bug is still open.\\n2. **Docs**: the forecast page still shows Fahrenheit examples.\\n3. **release-notes** has a draft waiting for you.\\n\\nThe `harbor` cone is the one to start with.',\n },\n ],\n },\n ],\n 'cone-harbor': [\n {\n id: 'm-h1',\n role: 'lick',\n channel: 'webhook',\n title: 'GitHub \u00B7 issue opened',\n text: 'example/harbor#57: Forecast stays on yesterday after midnight UTC',\n createdAt: at(2),\n },\n {\n id: 'm-h2',\n role: 'user',\n text: 'The forecast endpoint serves stale data after midnight UTC. Find out why and fix it.',\n createdAt: at(3),\n },\n {\n id: 'm-h3',\n role: 'assistant',\n status: 'done',\n createdAt: at(4),\n parts: [\n {\n type: 'thinking',\n text: 'Stale after midnight points at the cache expiry. Check how the cache compares days.',\n },\n {\n type: 'tool',\n tool: {\n id: 't-h1',\n name: 'bash',\n title: 'Search for the cache expiry',\n input: 'rg -n \"getDate|TTL\" src',\n output:\n 'src/lib/cache.ts:6:const TTL = 60 * 60 * 1000;\\nsrc/lib/cache.ts:14: const day = new Date(entry.storedAt).getDate();\\nsrc/lib/cache.ts:16: if (now - entry.storedAt > TTL) return undefined;',\n status: 'done',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-h2',\n name: 'read_file',\n title: 'Read the cache',\n input: '/workspace/harbor/src/lib/cache.ts',\n output: cacheBefore,\n status: 'done',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-h3',\n name: 'edit_file',\n title: 'Expire entries from the previous day',\n input: '/workspace/harbor/src/lib/cache.ts',\n output: 'Replaced 1 block (4 lines \u2192 7 lines), added dayOf()',\n status: 'done',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n diff: { before: cacheBefore, after: cacheAfter },\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-h4',\n name: 'bash',\n title: 'Run the tests',\n input: 'npm test',\n meta: 'timeout 120s',\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\u2139 tests 2\\n\u2139 pass 2\\n\u2139 fail 0',\n status: 'done',\n paths: [],\n },\n },\n {\n type: 'text',\n text: 'Found it. `ForecastCache.get` compared **local** calendar days, and when the day changed it returned the old entry instead of dropping it:\\n\\n```ts\\nif (day !== new Date(now).getDate()) return entry.value;\\n```\\n\\nI changed it to compare UTC dates and delete the entry, so the first request after midnight goes upstream. The tests pass.\\n\\n| | Before | After |\\n| --- | --- | --- |\\n| Day compared | local `getDate()` | UTC `toISOString()` |\\n| On a new day | returns stale entry | deletes and refetches |\\n\\nquiet-otter is adding retries for upstream timeouts in a scoop.',\n },\n {\n type: 'delegation',\n kind: 'scoop',\n scoop: 'quiet-otter',\n text: 'Started a scoop to add retries around the upstream fetch',\n },\n ],\n },\n {\n id: 'm-h4',\n role: 'lick',\n channel: 'scoop-notify',\n title: 'quiet-otter',\n text: 'Started: add retries with backoff around the upstream fetch',\n createdAt: at(9),\n },\n ],\n 'scoop-otter': [\n {\n id: 'm-o1',\n role: 'user',\n origin: 'agent',\n from: 'harbor',\n text: 'Wrap the upstream fetch in src/routes/forecast.ts with three retries and exponential backoff.',\n createdAt: at(9),\n },\n {\n id: 'm-o2',\n role: 'assistant',\n status: 'done',\n createdAt: at(10),\n parts: [\n {\n type: 'tool',\n tool: {\n id: 't-o1',\n name: 'write_file',\n title: 'Add retry()',\n input: '/workspace/harbor/src/lib/retry.ts',\n output: 'Wrote 12 lines',\n status: 'done',\n paths: ['/workspace/harbor/src/lib/retry.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-o2',\n name: 'edit_file',\n title: 'Use retry() for the upstream call',\n input: '/workspace/harbor/src/routes/forecast.ts',\n output: 'Replaced 1 block',\n status: 'done',\n paths: ['/workspace/harbor/src/routes/forecast.ts'],\n },\n },\n { type: 'text', text: 'Both edits are in. Running the tests next.' },\n ],\n },\n ],\n 'scoop-heron': [],\n 'scoop-wren': [],\n 'cone-tides': [\n {\n id: 'm-f1',\n role: 'user',\n text: 'Add a tide table endpoint next to the forecast, with high and low water per day.',\n createdAt: at(-2900),\n },\n {\n id: 'm-f2',\n role: 'assistant',\n status: 'done',\n createdAt: at(-2898),\n parts: [\n {\n type: 'text',\n text: 'Added `/v1/tides?city=` with the next seven days of high and low water. It reads from the same upstream as the forecast and shares its cache.',\n },\n ],\n },\n ],\n 'cone-release': [\n {\n id: 'm-r1',\n role: 'lick',\n channel: 'cron',\n title: 'Every Friday 09:00',\n text: 'Draft the release notes for example/harbor',\n createdAt: at(-1440),\n },\n {\n id: 'm-r2',\n role: 'assistant',\n status: 'done',\n createdAt: at(-1438),\n parts: [\n {\n type: 'tool',\n tool: {\n id: 't-r1',\n name: 'bash',\n title: 'Collect merged pull requests',\n input: 'collect.jsh example/harbor v1.8.0',\n output:\n '41\\tfix\\tReturn 400 when the city is missing\\n43\\tfeature\\tAdd /health\\n44\\tchore\\tUpdate wrangler to 4.40.0',\n status: 'done',\n paths: ['/workspace/skills/release-notes/scripts/collect.jsh'],\n },\n },\n {\n type: 'text',\n text: '## harbor 1.9.0\\n\\n**Features**\\n- Added a `/health` endpoint.\\n\\n**Fixes**\\n- Requests without a city now get a 400 instead of a 500.\\n\\n**Chores**\\n- Updated wrangler to 4.40.0.',\n },\n ],\n },\n {\n id: 'm-r3',\n role: 'lick',\n channel: 'cron',\n severity: 'error',\n title: 'Crontab',\n text: 'Crontab line 3 is invalid',\n body: '30 25 * * * sweep-drafts\\nThe hour is 25. It must be 0 to 23.',\n createdAt: at(-1430),\n },\n {\n id: 'm-r4',\n role: 'lick',\n channel: 'fswatch',\n severity: 'warn',\n title: '/workspace/notes',\n text: 'File watch on /workspace/notes stopped; retrying',\n createdAt: at(-1429),\n },\n {\n id: 'm-r5',\n role: 'lick',\n channel: 'workflow',\n title: 'Release report',\n text: 'The weekly release report is ready',\n body: 'Summary: harbor 1.9.0 shipped three changes this week, the /health endpoint, a 400 for requests without a city and a wrangler update, with no failed deploys, no rollbacks and two flaky test runs in the forecast suite that passed on retry, so the next release can go out on Friday as planned once the docs pass lands.',\n createdAt: at(-1428),\n },\n ],\n 'cone-triage': [\n {\n id: 'm-t1',\n role: 'system',\n kind: 'compaction',\n trigger: 'threshold',\n state: 'summarized',\n title: 'Context compacted',\n text: '41 earlier messages were summarized to stay under the context limit.',\n createdAt: at(-30),\n },\n {\n id: 'm-t2',\n role: 'assistant',\n status: 'done',\n createdAt: at(-20),\n parts: [\n {\n type: 'text',\n text: 'Two messages need a decision from you:\\n\\n- A vendor asks to move Thursday\u2019s call to Friday.\\n- The staging certificate expires in 6 days. Should I open a ticket?',\n },\n ],\n },\n {\n id: 'm-t3',\n role: 'system',\n kind: 'error',\n action: 'login',\n title: 'Mail connector',\n text: 'The connector returned 401. Reconnect the account in Settings.',\n createdAt: at(-19),\n },\n ],\n};\n\nexport const tabs: BrowserTab[] = [\n {\n id: 'tab-preview',\n title: 'harbor \u00B7 localhost',\n url: 'http://localhost:8787/forecast?city=Lisbon',\n status: 'complete',\n agentId: 'cone-harbor',\n },\n {\n id: 'tab-docs',\n title: 'Forecast API reference',\n url: 'https://api.example.com/docs/v2/forecast',\n status: 'complete',\n agentId: null,\n favicon: `data:image/svg+xml;charset=utf-8,${encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><rect width=\"16\" height=\"16\" rx=\"3\" fill=\"#7a5af8\"/><text x=\"8\" y=\"12\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"700\" fill=\"#ffffff\" text-anchor=\"middle\">A</text></svg>')}`,\n },\n {\n id: 'tab-pull',\n title: 'Add retries for upstream timeouts \u00B7 Pull request #58',\n url: 'https://git.example.com/example/harbor/pull/58',\n status: 'complete',\n agentId: 'scoop-otter',\n favicon: `data:image/svg+xml;charset=utf-8,${encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><rect width=\"16\" height=\"16\" rx=\"3\" fill=\"#0a7a43\"/><text x=\"8\" y=\"12\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"700\" fill=\"#ffffff\" text-anchor=\"middle\">G</text></svg>')}`,\n },\n];\n\nexport const terminals: TerminalInfo[] = [\n { id: 'term-1', title: 'bash', cwd: '/workspace/harbor', agentId: null },\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 },\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 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\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 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 === '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 #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.#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 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';\n\nexport const readOnlyText =\n 'Watch only. The SLICC you follow runs a newer version. Update this one to send prompts.';\n\nexport const noticeFixtures: Record<'storage' | 'welcome' | 'readonly', Notice> = {\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 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};\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'\n ? [noticeFixtures.readonly]\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('The browser declined again. Bookmark this page, then try again.');\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 const shown = this.#notices.some((notice) => notice.id === 'readonly');\n if (on === shown) return;\n if (on) {\n this.#notices = [noticeFixtures.readonly, ...this.#notices];\n this.emit('notices', this.#notices);\n } else {\n this.#remove('readonly');\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 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\nexport class DummySprinkles extends Emitter<SprinkleEvents> implements SprinklePort {\n #sprinkles: Sprinkle[];\n #agent: DummyAgent;\n #files: FilePort;\n #state = new Map<string, unknown>();\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 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", "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 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 = 'mixed' | 'empty' | 'fail' | 'user';\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\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 }));\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 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',\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 'agent',\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\nexport function packageFixtures(scenario: PackageScenario): readonly PackageItem[] {\n if (scenario === 'empty') return [];\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('uv', { state: 'outdated', version: '0.8.1', actions: ['update', 'remove'] });\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 return scenario === 'user' ? [...items, ...userPackages()] : items;\n}\n\nexport interface DummyUpdatesOptions {\n packages?: PackageScenario;\n confirm?: PackageConfirm;\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\n constructor(scenario: UpdateScenario, clock: Clock, options: DummyUpdatesOptions = {}) {\n super();\n this.#items = updateFixtures(scenario);\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) => this.#actPackage(id, action);\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 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(4);\n if (this.#fail) {\n this.#patchPackage(id, {\n state: 'failed',\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: ['remove'],\n log: `${log}\\nProgress: resolved 1, downloaded 1, added 1\\nDone in 3.8s`,\n });\n }\n\n list(): readonly UpdateItem[] {\n return this.#items;\n }\n\n ready(): boolean {\n return this.#ready;\n }\n\n setScenario(scenario: UpdateScenario): void {\n this.#items = updateFixtures(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 if (action === 'update-now' || action === 'retry') {\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 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 });\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n AuditEntry,\n AuditPage,\n Availability,\n ButtonConfig,\n ButtonEvent,\n ButtonMessage,\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 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 | 'request'\n | 'backup'\n | 'waiting';\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\nexport function accountRecords(now = Date.now()): 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 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 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 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 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 };\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 ? [] : [...(policy ? [vaultPolicy(now)] : []), ...vaultAudit(now)],\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: { code: ErrorCode; message: string } | null = null;\n #time: Clock;\n #older: AuditEntry[] = vaultOlder();\n #serial = 0;\n buttons: DummyVaultButton[] = [];\n puts: { name: string; request?: string; options?: PutOptions }[] = [];\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 }\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): void {\n this.#fail = { code, message };\n }\n\n #failed(): void {\n const fail = this.#fail;\n this.#fail = null;\n if (fail) throw vaultFailure(fail.code, fail.message);\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 } = {}\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 this.puts.push({\n name,\n ...(request === undefined ? {} : { request }),\n ...(options ? { options: { ...options } } : {}),\n });\n const { kind = 'secret', provider, server } = options ?? {};\n return this.#seal(name, 'settings', kind, {\n ...(provider === undefined ? {} : { provider }),\n ...(server === undefined ? {} : { server }),\n });\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 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, 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 { clock } from './clock.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 { 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 } from './notices.ts';\nimport { DummySettings } from './settings.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 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 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 follow?: FollowScenario | 'off';\n vault?: VaultScenario | 'off';\n accounts?: 'settings' | 'vault';\n providers?: 'connected' | 'none';\n hold?: AgentHold['reason'] | 'off';\n readonly?: 'version' | 'off';\n browser?: BrowserScenario;\n sprinkles?: 'builtin' | 'cones';\n monitor?: 'dummy' | 'agent';\n}\n\nexport interface DummyModel extends SliccModel {\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}\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 function createDummyModel({\n delay = 30,\n storage = null,\n updates = 'current',\n packages = 'off',\n confirm,\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 follow = 'off',\n vault = 'off',\n accounts = 'settings',\n providers = 'connected',\n hold = 'off',\n readonly = 'off',\n browser: scenario = 'idle',\n sprinkles = 'builtin',\n monitor = 'dummy',\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 agent = new DummyAgent(\n fixtures.agents,\n fixtures.conversations,\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 if (hold !== 'off') agent.setHold({ reason: hold, held: 2 });\n if (readonly !== 'off') agent.setReadOnly(readOnlyText);\n const notice = readonly !== 'off' ? 'readonly' : notices;\n const noticePort = notice === 'off' ? null : new DummyNotices(notice, time);\n if (noticePort && readonly !== 'off') {\n agent.on('readOnly', (text) => noticePort.readOnly(Boolean(text)));\n }\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 (accounts === 'vault' ? vaultAccounts(fixtures.accounts) : fixtures.accounts).map(\n (account) =>\n providers === 'none' && account.group !== 'mcp'\n ? { ...account, status: 'disconnected' as const, identity: '' }\n : account\n ),\n storage,\n time,\n undefined,\n providers === 'none'\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.tray, time),\n updates: new DummyUpdates(updates, time, {\n ...(packages === 'off' ? {} : { packages }),\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, accounts === 'vault' ? accountRecords() : []),\n }),\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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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
|
|
6
|
-
"names": ["now", "now", "harbor", "at", "tabs", "clock", "script", "index", "files", "files", "agents", "conversations", "clock", "queues", "frozen", "status", "tool", "test", "at", "name", "agent", "name", "directories", "clock", "now", "files", "status", "at", "minutes", "label", "name", "index", "units", "suggestions", "files", "start", "at", "minutes", "memories", "memory", "index", "terminals", "files", "tray", "agents", "status", "now", "clock", "files", "status", "mounted", "at", "node", "sprinkles", "files", "files", "clock", "name", "terminals", "files", "clock", "status", "clock", "label", "name", "at", "clock", "minute", "day", "now", "status", "name", "labels", "label", "page", "accounts", "tabs", "sprinkles", "pending", "files", "status"]
|
|
3
|
+
"sources": ["../src/dummy/approvals.ts", "../src/dummy/browser.ts", "../src/dummy/changes.ts", "../src/dummy/follow.ts", "../src/dummy/guests.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/showcase.ts", "../src/dummy/fixtures.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';\n\nexport type ApprovalScenario =\n | 'agent'\n | 'user'\n | 'many'\n | 'follower'\n | 'fail'\n | 'soon'\n | 'elsewhere'\n | 'withdrawn'\n | 'secrets'\n | 'guest'\n | 'guest-follower'\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 },\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 === '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 === 'none') return [];\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 }\n\n raise(approval: Approval): void {\n this.#approvals = [...this.#approvals, 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\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 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 { GuestDraft, GuestEvents, GuestPort, GuestSeat } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type GuestsScenario = 'on' | 'none' | 'unavailable' | 'fail';\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 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\n constructor(scenario: GuestsScenario, clock: Clock) {\n super();\n this.scenario = scenario;\n this.#clock = clock;\n this.#seats = guestsFixtures(scenario);\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.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 { 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: '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 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\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 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};\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 (/\\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 (/\\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\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\nfunction ticks(steps: readonly Step[]): number {\n return steps.reduce((sum, step) => {\n if (step.type === 'tool') return sum + step.ticks;\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 #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\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) {\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\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.title,\n input: 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 await this.#clock.sleep(step.ticks * 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 async #step(agentId: string, reply: AssistantMessage, step: Step, run: Run): 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 await this.#step(agentId, reply, steps[0] as 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' ? first.text.slice(0, 80) : 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 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' ? first.text.slice(0, 80) : 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' ? first.text.slice(0, 80) : 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…</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 { FrozenCone, Memory, Message, Sprinkle, TrayStatus } 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 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\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: { percent: 32, window: 'weekly', resets: 'resets in 4 days' },\n joinUrl: 'https://www.example.com/join/7Q4D-K9TX',\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 type { Agent, LickChannel, Message, ToolCall, UserMessage } from '../model/types.ts';\n\nconst start = Date.UTC(2026, 9, 4, 16, 0);\nconst at = (minutes: number) => start + minutes * 60_000;\n\nexport function picture(\n label: string,\n from: string,\n to: string,\n width = 640,\n height = 400\n): string {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\"><defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"${from}\"/><stop offset=\"1\" stop-color=\"${to}\"/></linearGradient></defs><rect width=\"${width}\" height=\"${height}\" fill=\"url(#g)\"/><text x=\"50%\" y=\"50%\" font-family=\"sans-serif\" font-size=\"${Math.round(height / 9)}\" fill=\"#ffffff\" text-anchor=\"middle\" dominant-baseline=\"middle\">${label}</text></svg>`;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function tone(seconds = 0.6, frequency = 440, rate = 8000): string {\n const samples = Math.round(seconds * rate);\n const bytes = new Uint8Array(44 + samples);\n const view = new DataView(bytes.buffer);\n const text = (offset: number, value: string) => {\n for (let i = 0; i < value.length; i++) bytes[offset + i] = value.charCodeAt(i);\n };\n text(0, 'RIFF');\n view.setUint32(4, 36 + samples, true);\n text(8, 'WAVEfmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, rate, true);\n view.setUint32(28, rate, true);\n view.setUint16(32, 1, true);\n view.setUint16(34, 8, true);\n text(36, 'data');\n view.setUint32(40, samples, true);\n for (let i = 0; i < samples; i++) {\n const fade = Math.min(1, (samples - i) / (rate / 10));\n bytes[44 + i] = 128 + Math.round(60 * fade * Math.sin((2 * Math.PI * frequency * i) / rate));\n }\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return `data:audio/wav;base64,${btoa(binary)}`;\n}\n\nfunction tool(\n id: string,\n name: string,\n title: string,\n input: string,\n output: string,\n extra: Partial<ToolCall> = {}\n): ToolCall {\n return { id, name, title, input, output, status: 'done', paths: [], ...extra };\n}\n\nconst markdown = [\n '## The forecast API in one page',\n '',\n 'harbor answers `GET /forecast?city=\u2026` with the day\u2019s **high**, **low** and a *short summary*, and caches per city for an hour. ~~XML output~~ is gone.',\n '',\n '### How a request flows',\n '',\n '1. The worker parses the city.',\n '2. The cache answers if it has a fresh entry:',\n ' - same UTC day',\n ' - younger than one hour',\n '3. Otherwise the upstream call runs, with three retries.',\n '',\n '> Upstream is slow at the top of the hour. Retries back off at 250, 500 and 1000 ms.',\n '',\n '```ts',\n 'export async function forecast(city: string): Promise<Forecast> {',\n ' const cached = cache.get(city);',\n ' if (cached) return cached;',\n ' return cache.set(city, await retry(() => upstream(city)));',\n '}',\n '```',\n '',\n '| Route | Cache | Typical latency |',\n '| --- | --- | ---: |',\n '| `/forecast` | 1 hour, per city | 38 ms |',\n '| `/health` | none | 2 ms |',\n '| `/forecast` (miss) | \u2014 | 410 ms |',\n '',\n '- [x] TTL fix merged',\n '- [ ] Move the cache to KV',\n '',\n 'Details are in the [API reference](https://api.example.com/docs/v2/forecast). A long path that must wrap: `/workspace/harbor/node_modules/.cache/wrangler/state/v3/cache/miniflare-CacheObject/7c1f0e3b9a5d4e2f8b6a1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f.sqlite`.',\n].join('\\n');\n\nconst toolShapes: ToolCall[] = [\n tool('k-t1', 'bash', 'Count the routes', \"rg -c 'pathname ===' src\", 'src/index.ts:2'),\n tool(\n 'k-t2',\n 'read_file',\n 'Read the router',\n '/workspace/harbor/src/index.ts',\n \"import { forecast } from './routes/forecast.ts';\\n\u2026\",\n {\n paths: ['/workspace/harbor/src/index.ts'],\n }\n ),\n tool(\n 'k-t3',\n 'write_file',\n 'Create the KV binding notes',\n '/workspace/harbor/docs/kv.md',\n 'Wrote 18 lines',\n {\n paths: ['/workspace/harbor/docs/kv.md'],\n }\n ),\n tool(\n 'k-t4',\n 'edit_file',\n 'Rename the cache key',\n '/workspace/harbor/src/lib/cache.ts',\n 'No match for \"cityKey(\" in src/lib/cache.ts',\n {\n status: 'error',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n }\n ),\n tool(\n 'k-t5',\n 'grep',\n 'Find TODOs',\n 'TODO --glob \"src/**\"',\n 'src/routes/forecast.ts:14: TODO: cache negative results\\nsrc/lib/units.ts:3: TODO: round half to even'\n ),\n tool(\n 'k-t6',\n 'web_fetch',\n 'Fetch the API changelog',\n 'https://api.example.com/changelog.json',\n '{ \"latest\": \"2.4.1\", \"breaking\": false }'\n ),\n tool(\n 'k-t7',\n 'browser',\n 'Screenshot the preview',\n 'screenshot http://localhost:8787/',\n 'Captured 1280\u00D7800',\n {\n image: picture('localhost:8787', '#3b63fb', '#0a7a43', 640, 400),\n }\n ),\n tool(\n 'k-t8',\n 'scoop_scoop',\n 'Start a scoop for the docs',\n 'name: docs-pass\\ntask: Update the forecast page to Celsius',\n 'Scoop docs-pass is running'\n ),\n tool(\n 'k-t9',\n 'feed_scoop',\n 'Hand the screenshots to docs-pass',\n 'scoop_name: docs-pass\\nmessage: Use the new screenshots in /tmp/shots',\n 'Delivered'\n ),\n tool(\n 'k-t10',\n 'send_message',\n 'Tell quiet-otter the tests pass',\n 'to: quiet-otter\\nmessage: CI is green, merge when ready',\n 'Delivered'\n ),\n tool(\n 'k-t11',\n 'drop_scoop',\n 'Wrap up amber-heron',\n 'scoop_name: amber-heron',\n 'Dropped amber-heron; its notes are in /shared/notes'\n ),\n tool(\n 'k-t12',\n 'update_global_memory',\n 'Remember the cache rule',\n 'Cache keys are per city and per UTC day.',\n 'Memory updated (3 sections, 412 characters)'\n ),\n tool(\n 'k-mcp',\n 'mcp__docs__search',\n 'docs \u00B7 search',\n '{\\n \"query\": \"forecast units\"\\n}',\n '2 pages: /forecast, /units'\n ),\n tool('k-t13', 'bash', 'Deploy to staging', 'wrangler deploy --env staging', 'Stopped', {\n status: 'cancelled',\n }),\n tool('k-t14', 'bash', 'Watch the logs', 'wrangler tail --env staging', '', { status: 'running' }),\n tool(\n 'k-t16',\n 'bash',\n 'Check the staging routes',\n 'wrangler routes list --env staging',\n 'ROUTE ZONE WORKER ENV\\nforecast.harbor.example/v2/forecast/* harbor.example harbor-forecast-v2 staging\\nerror: the route forecast.harbor.example/v2/units/* belongs to another account; ask its owner to release it first',\n {\n status: 'error',\n notes: [\n { severity: 'error', text: 'Exited with code 5' },\n {\n severity: 'warn',\n text: 'Output truncated: 12 lines and 1,840 bytes dropped from the start',\n },\n { severity: 'info', text: 'Full output in /tmp/pi-bash-7f3a.log' },\n ],\n }\n ),\n];\n\nconst licks: Array<[LickChannel, string, string, string | undefined, Partial<Message>]> = [\n [\n 'webhook',\n 'GitHub \u00B7 pull_request.opened',\n 'example/harbor#58 Add retries for upstream timeouts',\n '{\\n \"action\": \"opened\",\\n \"number\": 58,\\n \"repository\": { \"full_name\": \"example/harbor\" }\\n}',\n {},\n ],\n [\n 'cron',\n 'Every weekday 09:00',\n 'Morning summary for the harbor cone',\n undefined,\n { count: 3 } as Partial<Message>,\n ],\n [\n 'sprinkle',\n 'Release board',\n 'Button \u201CShip 1.9.0\u201D clicked',\n '{ \"button\": \"ship\", \"version\": \"1.9.0\" }',\n {},\n ],\n [\n 'fswatch',\n '/workspace/harbor/src',\n '2 files changed',\n 'modified /workspace/harbor/src/lib/cache.ts\\ncreated /workspace/harbor/src/lib/retry.ts',\n {},\n ],\n [\n 'session-reload',\n 'Session restored',\n 'The page reloaded; 4 cones resumed from storage',\n undefined,\n {},\n ],\n [\n 'navigate',\n 'api.example.com',\n 'A page offered a SLICC handoff: open the forecast docs',\n '{ \"verb\": \"open\", \"target\": \"https://api.example.com/docs/v2/forecast\" }',\n {},\n ],\n [\n 'discovery',\n 'api.example.com',\n 'Found an ai-catalog.json with 3 tools',\n 'https://api.example.com/.well-known/ai-catalog.json',\n {},\n ],\n ['upgrade', 'SLICC updated', '6.4.0 \u2192 6.5.0', undefined, {}],\n [\n 'workflow',\n 'release-notes',\n 'Step 2 of 4 finished: collect merged pull requests',\n undefined,\n {},\n ],\n ['bash', 'Job 3', 'npm run build exited with status 0 after 41 s', undefined, {}],\n ['jshd', 'collect.jsh', 'Script finished: 12 pull requests since v1.8.0', undefined, {}],\n ['preview', 'Preview bridge', 'Connected from localhost:8787', undefined, {}],\n [\n 'cherry',\n 'Host page',\n 'Event \u201Ccart-updated\u201D from shop.example.com',\n '{ \"items\": 3, \"total\": 42.5 }',\n {},\n ],\n ['scoop-notify', 'docs-pass', 'Finished: the forecast page now shows Celsius', undefined, {}],\n ['scoop-idle', 'amber-heron', 'Idle for 30 minutes', undefined, {}],\n ['scoop-wait', 'quiet-otter', 'The wait for CI resolved: all checks passed', undefined, {}],\n [\n 'sudo-request',\n 'docs-pass',\n 'Wants to push to example/harbor (branch docs/celsius)',\n 'git push origin docs/celsius',\n { state: 'pending', expiresAt: Date.now() + 10 * 60_000 } as Partial<Message>,\n ],\n [\n 'sudo-request',\n 'quiet-otter',\n 'Wants to read secrets: UPSTREAM_TOKEN',\n undefined,\n { state: 'confirmed' } as Partial<Message>,\n ],\n [\n 'sudo-request',\n 'amber-heron',\n 'Wants to run: rm -rf /workspace/harbor/node_modules',\n undefined,\n { state: 'dismissed' } as Partial<Message>,\n ],\n];\n\nconst attachmentsMessage: UserMessage = {\n id: 'k-u2',\n role: 'user',\n text: 'Here is the mockup, my notes and the old spec.',\n createdAt: at(4),\n attachments: [\n {\n id: 'k-a1',\n name: 'forecast-card.png',\n kind: 'image',\n mimeType: 'image/png',\n size: 48211,\n url: picture('Mockup', '#f5a623', '#d0021b', 480, 320),\n },\n {\n id: 'k-a2',\n name: 'notes.txt',\n kind: 'text',\n mimeType: 'text/plain',\n size: 214,\n text: 'Show \u00B0C first.\\nRound to whole degrees.\\nKeep the summary under 60 characters.',\n },\n {\n id: 'k-a3',\n name: 'spec-v1.pdf',\n kind: 'file',\n mimeType: 'application/pdf',\n size: 1_204_331,\n path: '/home/user/downloads/spec-v1.pdf',\n },\n {\n id: 'k-a4',\n name: 'UPSTREAM_TOKEN',\n kind: 'secret',\n mimeType: 'application/octet-stream',\n size: 0,\n },\n {\n id: 'k-a5',\n name: 'recording.mov',\n kind: 'file',\n mimeType: 'video/quicktime',\n size: 98_304_000,\n error: 'Too large: attachments are limited to 25 MB',\n },\n ],\n};\n\nexport const showcaseAgent: Agent = {\n id: 'cone-kitchen',\n name: 'kitchen-sink',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-opus-5-5',\n contextFill: 0.47,\n unread: 0,\n};\n\nfunction opening(): Message[] {\n return [\n {\n id: 'k-u1',\n role: 'user',\n text: 'Give me the full tour of harbor, everything you can show.',\n createdAt: at(0),\n },\n {\n id: 'k-m1',\n role: 'assistant',\n status: 'done',\n createdAt: at(1),\n model: 'claude-sonnet-5-5',\n usage: { input: 18_204, output: 912, cost: 0.31 },\n parts: [\n {\n type: 'thinking',\n text: 'Start with the shape of the API, then show the pieces one kind at a time.',\n },\n { type: 'text', text: markdown },\n ],\n },\n attachmentsMessage,\n {\n id: 'k-m2',\n role: 'assistant',\n status: 'done',\n createdAt: at(5),\n model: 'claude-sonnet-5-5',\n parts: [\n {\n type: 'text',\n text: 'Mockup, notes and spec received. The recording was too large to attach. Here are the current screens and the alert sound:',\n },\n {\n type: 'media',\n items: [\n {\n kind: 'image',\n src: picture('Forecast card', '#3b63fb', '#7a5af8'),\n alt: 'The forecast card in light mode',\n },\n {\n kind: 'image',\n src: picture('Dark card', '#1d1d1d', '#3b63fb'),\n alt: 'The forecast card in dark mode',\n },\n {\n kind: 'image',\n src: picture('Phone', '#0a7a43', '#12b886', 360, 640),\n alt: 'The forecast card on a phone',\n },\n {\n kind: 'video',\n src: '',\n poster: picture('\u25B6 Walkthrough', '#292929', '#717171'),\n alt: 'A walkthrough of the forecast page',\n },\n { kind: 'audio', src: tone(), alt: 'The storm alert sound' },\n ],\n },\n ],\n },\n { id: 'k-u3', role: 'user', text: 'Show me every tool you used.', createdAt: at(8) },\n {\n id: 'k-m3',\n role: 'assistant',\n status: 'done',\n createdAt: at(9),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Every tool from today\u2019s run, in order:' },\n ...toolShapes.map((call) => ({ type: 'tool' as const, tool: call })),\n ],\n },\n {\n id: 'k-tool1',\n role: 'tool',\n createdAt: at(12),\n tool: tool(\n 'k-t15',\n 'bash',\n 'You ran a command',\n 'git log --oneline -3',\n 'a1b2c3d fix: expire entries from the previous day\\ne4f5a6b feat: retry upstream timeouts\\n0c9d8e7 chore: update wrangler'\n ),\n },\n ];\n}\n\nfunction runs(): Message[] {\n return [\n {\n id: 'k-u6',\n role: 'user',\n text: 'Get the forecast docs ready for the Celsius release.',\n createdAt: at(13),\n },\n {\n id: 'k-m8',\n role: 'assistant',\n status: 'done',\n createdAt: at(13.1),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Checking what the docs and the API say today.' },\n ...[\n tool(\n 'k-r1',\n 'bash',\n 'Ask the API for Lisbon',\n 'curl -s https://api.example.com/v2/forecast?city=Lisbon',\n '{ \"city\": \"Lisbon\", \"high\": 71, \"low\": 58, \"unit\": \"F\" }'\n ),\n tool(\n 'k-r2',\n 'bash',\n 'Read the forecast page',\n 'cat /workspace/harbor/docs/forecast.md',\n '# Forecast\\n\\nTemperatures are in Fahrenheit.'\n ),\n tool('k-r3', 'bash', 'See what changed', 'git status --short', ' M src/lib/units.ts'),\n tool(\n 'k-r4',\n 'read_file',\n 'Read the units helper',\n '/workspace/harbor/src/lib/units.ts',\n 'export function toCelsius(f: number): number {\u2026}',\n { paths: ['/workspace/harbor/src/lib/units.ts'] }\n ),\n ].map((call) => ({ type: 'tool' as const, tool: call })),\n {\n type: 'text',\n text: 'The page still says Fahrenheit. Updating it, then building and testing.',\n },\n ...[\n tool(\n 'k-r5',\n 'edit_file',\n 'Switch the page to Celsius',\n '/workspace/harbor/docs/forecast.md',\n 'Edited 1 line',\n {\n paths: ['/workspace/harbor/docs/forecast.md'],\n diff: {\n before: '# Forecast\\n\\nTemperatures are in Fahrenheit.\\n',\n after: '# Forecast\\n\\nTemperatures are in Celsius.\\n',\n },\n }\n ),\n tool('k-r6', 'bash', 'Build the site', 'npm run build', 'Built 14 pages in 2.1s', {\n meta: 'timeout 120s',\n }),\n tool(\n 'k-r7',\n 'bash',\n 'Run the unit tests',\n 'npx vitest run src/lib/units.test.ts',\n 'FAIL src/lib/units.test.ts > rounds half to even\\nExpected 22, received 21',\n {\n status: 'error',\n notes: [{ severity: 'error', text: 'Exited with code 1' }],\n }\n ),\n tool(\n 'k-r8',\n 'bash',\n 'Open the release pull request',\n 'gh pr create --repo https://git.example.com/example/harbor --title \"Celsius docs\"',\n 'Stopped before the tests pass',\n { status: 'cancelled' }\n ),\n tool('k-r9', 'bash', 'Watch the preview logs', 'wrangler tail --env preview', '', {\n status: 'running',\n }),\n ].map((call) => ({ type: 'tool' as const, tool: call })),\n {\n type: 'text',\n text: 'One test fails on rounding, so the pull request waits for the fix.',\n },\n ],\n },\n {\n id: 'k-tool2',\n role: 'tool',\n createdAt: at(13.5),\n tool: tool(\n 'k-r10',\n 'bash',\n 'Check the preview port',\n 'lsof -i :8787',\n 'workerd 4120 harbor 12u IPv4 TCP localhost:8787 (LISTEN)'\n ),\n },\n ];\n}\n\nfunction work(): Message[] {\n return [\n {\n id: 'k-m4',\n role: 'assistant',\n status: 'done',\n createdAt: at(14),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Here is where things stand.' },\n { type: 'sprinkle', sprinkle: 'status' },\n {\n type: 'delegation',\n kind: 'scoop',\n scoop: 'docs-pass',\n text: 'Started a scoop to update the docs',\n },\n {\n type: 'delegation',\n kind: 'feed',\n scoop: 'docs-pass',\n text: 'Handed over the new screenshots',\n },\n {\n type: 'delegation',\n kind: 'sprinkle',\n scoop: 'suggestions',\n text: 'Opened the suggestions sprinkle',\n },\n { type: 'delegation', kind: 'drop', scoop: 'amber-heron', text: 'Wrapped up amber-heron' },\n ],\n },\n {\n id: 'k-m5',\n role: 'assistant',\n status: 'done',\n createdAt: at(18),\n model: 'claude-sonnet-5-5',\n parts: [\n { type: 'text', text: 'Three decisions from earlier:' },\n {\n type: 'question',\n question: {\n id: 'k-q1',\n kind: 'yes-no',\n question: 'Tag 1.9.0 after the merge?',\n options: [],\n state: 'answered',\n answer: 'Yes',\n },\n },\n {\n type: 'question',\n question: {\n id: 'k-q2',\n kind: 'text',\n question: 'What should the release be called?',\n options: [],\n state: 'inert',\n },\n },\n {\n type: 'question',\n question: {\n id: 'k-q3',\n kind: 'choice',\n question: 'Where should the cache live?',\n options: ['Keep it in memory', 'Move it to KV', 'Decide after the load test'],\n state: 'open',\n },\n },\n ],\n },\n ];\n}\n\nfunction events(): Message[] {\n return [\n {\n id: 'k-s1',\n role: 'system',\n kind: 'compaction',\n title: 'Context compacted',\n text: '58 earlier messages were summarized.',\n trigger: 'threshold',\n state: 'summarized',\n createdAt: at(1440),\n },\n {\n id: 'k-s2',\n role: 'system',\n kind: 'compaction',\n title: 'Compaction failed, transcript truncated',\n text: 'The summary failed, so the oldest 20 messages were dropped instead.',\n trigger: 'overflow',\n state: 'fallback',\n createdAt: at(1441),\n },\n ...licks.map(\n ([channel, title, text, body, extra], index): Message =>\n ({\n id: `k-l${index + 1}`,\n role: 'lick',\n channel,\n title,\n text,\n createdAt: at(1445 + index),\n ...(body ? { body } : {}),\n ...extra,\n }) as Message\n ),\n {\n id: 'k-u4',\n role: 'user',\n text: 'Actually, stop the deploy, staging is frozen today.',\n mode: 'steer',\n createdAt: at(1470),\n },\n {\n id: 'k-m6',\n role: 'assistant',\n status: 'stopped',\n createdAt: at(1470),\n model: 'claude-haiku-4-5',\n parts: [{ type: 'text', text: 'Stopping the staging deploy and leaving' }],\n },\n {\n id: 'k-u5',\n role: 'user',\n text: 'Update the forecast page to Celsius and use the new screenshots.',\n from: 'harbor',\n createdAt: at(1472),\n },\n {\n id: 'k-m7',\n role: 'assistant',\n status: 'error',\n createdAt: at(1475),\n model: 'claude-haiku-4-5',\n parts: [\n {\n type: 'thinking',\n text: 'The model rejected the request because the context is too large.',\n },\n {\n type: 'error',\n message: 'The request is too large for this model.',\n detail: 'The model returned 413: the request is larger than its context window.',\n action: 'change-model',\n },\n ],\n },\n {\n id: 'k-s3',\n role: 'system',\n kind: 'error',\n title: 'docs-pass failed',\n text: 'The Adobe session expired. Log in again to continue.',\n action: 'login',\n createdAt: at(1476),\n },\n {\n id: 'k-s4',\n role: 'system',\n kind: 'error',\n title: 'Rate limited',\n text: 'Anthropic answered 429. Retrying in 30 seconds.',\n action: 'retry',\n createdAt: at(1477),\n },\n {\n id: 'k-s5',\n role: 'system',\n kind: 'notice',\n title: 'Model changed',\n text: 'to Claude Opus 5.5 (Anthropic)',\n createdAt: at(1478),\n },\n ];\n}\n\nexport function showcase(): Message[] {\n return [...opening(), ...runs(), ...work(), ...events()];\n}\n\nexport function showcaseQueue(): UserMessage[] {\n return [\n {\n id: 'k-q-1',\n role: 'user',\n text: 'Then open a pull request for the docs.',\n createdAt: at(1480),\n queued: true,\n mode: 'queue',\n },\n {\n id: 'k-q-2',\n role: 'user',\n text: 'And post the link in the release channel.',\n createdAt: at(1481),\n queued: true,\n mode: 'queue',\n },\n ];\n}\n", "import type {\n Account,\n Agent,\n BrowserTab,\n Change,\n Message,\n ModelOption,\n Settings,\n TerminalInfo,\n UserMessage,\n} from '../model/types.ts';\nimport { showcase, showcaseAgent, showcaseQueue } from './showcase.ts';\n\nconst cacheBefore = `export interface Entry<T> {\n value: T;\n storedAt: number;\n}\n\nconst TTL = 60 * 60 * 1000;\n\nexport class ForecastCache<T> {\n #entries = new Map<string, Entry<T>>();\n\n get(key: string, now = Date.now()): T | undefined {\n const entry = this.#entries.get(key);\n if (!entry) return undefined;\n const day = new Date(entry.storedAt).getDate();\n if (day !== new Date(now).getDate()) return entry.value;\n if (now - entry.storedAt > TTL) return undefined;\n return entry.value;\n }\n\n set(key: string, value: T, now = Date.now()): void {\n this.#entries.set(key, { value, storedAt: now });\n }\n}\n`;\n\nconst cacheAfter = `export interface Entry<T> {\n value: T;\n storedAt: number;\n}\n\nconst TTL = 60 * 60 * 1000;\n\nexport class ForecastCache<T> {\n #entries = new Map<string, Entry<T>>();\n\n get(key: string, now = Date.now()): T | undefined {\n const entry = this.#entries.get(key);\n if (!entry) return undefined;\n if (dayOf(entry.storedAt) !== dayOf(now)) {\n this.#entries.delete(key);\n return undefined;\n }\n if (now - entry.storedAt > TTL) return undefined;\n return entry.value;\n }\n\n set(key: string, value: T, now = Date.now()): void {\n this.#entries.set(key, { value, storedAt: now });\n }\n}\n\nfunction dayOf(time: number): string {\n return new Date(time).toISOString().slice(0, 10);\n}\n`;\n\nconst retry = `export async function retry<T>(task: () => Promise<T>, attempts = 3, wait = 250): Promise<T> {\n let last: unknown;\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n return await task();\n } catch (error) {\n last = error;\n await new Promise((resolve) => setTimeout(resolve, wait * 2 ** attempt));\n }\n }\n throw last;\n}\n`;\n\nconst legacyXml = `export function toXml(forecast: { city: string; high: number; low: number }): string {\n return \\`<forecast city=\"\\${forecast.city}\"><high>\\${forecast.high}</high><low>\\${forecast.low}</low></forecast>\\`;\n}\n`;\n\nconst forecastBefore = `import { ForecastCache } from '../lib/cache.ts';\nimport { toCelsius } from '../lib/units.ts';\n\nconst cache = new ForecastCache<Forecast>();\n\nexport interface Forecast {\n city: string;\n high: number;\n low: number;\n summary: string;\n}\n\nexport async function forecast(city: string, upstream: typeof fetch = fetch): Promise<Forecast> {\n const cached = cache.get(city);\n if (cached) return cached;\n const response = await upstream(\\`https://api.example.com/v2/forecast?city=\\${encodeURIComponent(city)}\\`);\n const body = await response.json();\n const result = {\n city,\n high: toCelsius(body.daily.max),\n low: toCelsius(body.daily.min),\n summary: body.daily.summary,\n };\n cache.set(city, result);\n return result;\n}\n`;\n\nconst forecastAfter = forecastBefore\n .replace(\n \"import { toCelsius } from '../lib/units.ts';\",\n \"import { retry } from '../lib/retry.ts';\\nimport { toCelsius } from '../lib/units.ts';\"\n )\n .replace('const response = await upstream(', 'const response = await retry(() =>\\n upstream(')\n .replace('(city)}`);', '(city)}`)\\n );');\n\nconst units = `export function toCelsius(fahrenheit: number): number {\n return Math.round(((fahrenheit - 32) * 5) / 9);\n}\n\nexport function toFahrenheit(celsius: number): number {\n return Math.round((celsius * 9) / 5 + 32);\n}\n`;\n\nconst unitsTest = `import assert from 'node:assert/strict';\nimport { test } from 'node:test';\nimport { toCelsius, toFahrenheit } from '../src/lib/units.ts';\n\ntest('converts both ways', () => {\n assert.equal(toCelsius(212), 100);\n assert.equal(toFahrenheit(0), 32);\n});\n`;\n\nconst index = `import { forecast } from './routes/forecast.ts';\n\nexport default {\n async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url);\n if (url.pathname === '/health') return new Response('ok');\n const city = url.searchParams.get('city');\n if (!city) return Response.json({ error: 'city is required' }, { status: 400 });\n return Response.json(await forecast(city));\n },\n};\n`;\n\nconst readme = `# harbor\n\nA small forecast API that sits in front of the upstream weather service and caches per city.\n\n## Development\n\n\\`\\`\\`sh\nnpm install\nnpm test\nnpm run dev\n\\`\\`\\`\n\nThe worker listens on \\`http://localhost:8787\\`. Try \\`/forecast?city=Lisbon\\`.\n`;\n\nconst pkg = `{\n \"name\": \"harbor\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"wrangler dev\",\n \"test\": \"node --test test/\"\n },\n \"devDependencies\": {\n \"wrangler\": \"4.40.0\"\n }\n}\n`;\n\nconst skill = `---\nname: release-notes\ndescription: Draft release notes from merged pull requests since the last tag.\n---\n\n1. Run \\`collect.jsh\\` with the repository and the previous tag.\n2. Group the pull requests by label: features, fixes, chores.\n3. Write one sentence per change, in the past tense, without ticket numbers.\n`;\n\nconst collect = `const [repo, since] = process.argv.slice(2);\nconst pulls = await gh(\\`repos/\\${repo}/pulls?state=closed&per_page=100\\`);\nfor (const pull of pulls.filter((p) => p.merged_at > since)) {\n console.log(\\`\\${pull.number}\\\\t\\${pull.labels.map((l) => l.name).join(',')}\\\\t\\${pull.title}\\`);\n}\n`;\n\nconst memory = `# Shared memory\n\n## Preferences\n- Keep replies short. Lead with the result, then the evidence.\n- Run the tests before saying something is fixed.\n\n## Projects\n- harbor: forecast API, deployed as a worker. Cache bugs show up around midnight UTC.\n- release-notes: drafted every Friday from merged pull requests.\n`;\n\nconst standup = `# Standup, 4 October\n\n- harbor: retries for upstream timeouts are in review.\n- Docs: the forecast endpoint page still shows Fahrenheit examples.\n- Next: move the cache to KV once the TTL fix lands.\n`;\n\nconst sample = `{\n \"city\": \"Lisbon\",\n \"daily\": { \"max\": 77, \"min\": 61, \"summary\": \"Clear, light wind from the north\" }\n}\n`;\n\nconst bashrc = `export PS1='\\\\u@slicc:\\\\w\\\\$ '\nalias ll='ls -la'\n`;\n\nconst suggestions = `${JSON.stringify(\n [\n {\n id: 'sug-units',\n kind: 'skill',\n title: 'Unit conversions',\n body: 'You converted Fahrenheit to Celsius by hand in three chats this week. A skill can do it for you.',\n skill: 'unit-converter',\n install:\n 'unit-converter from raw.githubusercontent.com/example/skills/main/unit-converter/SKILL.md',\n },\n {\n id: 'sug-notes',\n kind: 'use-case',\n title: 'Release notes from the week',\n body: 'You write release notes for harbor every Friday. Let the cone draft them from the commits.',\n prompt: 'Draft release notes for harbor from the commits since last Friday.',\n },\n {\n id: 'sug-cache',\n kind: 'tip',\n title: 'Name your cache keys',\n body: 'Forecast cache keys mix the city and the units. Splitting them makes stale entries easier to find.',\n },\n ],\n null,\n 2\n)}\n`;\n\nexport const files: Record<string, string> = {\n '/workspace/harbor/README.md': readme,\n '/workspace/harbor/package.json': pkg,\n '/workspace/harbor/wrangler.toml':\n 'name = \"harbor\"\\nmain = \"src/index.ts\"\\ncompatibility_date = \"2026-09-01\"\\n',\n '/workspace/harbor/.gitignore': 'node_modules/\\n.wrangler/\\n',\n '/workspace/harbor/src/index.ts': index,\n '/workspace/harbor/src/routes/forecast.ts': forecastBefore,\n '/workspace/harbor/src/lib/cache.ts': cacheBefore,\n '/workspace/harbor/src/lib/units.ts': units,\n '/workspace/harbor/src/legacy/xml.ts': legacyXml,\n '/workspace/harbor/static/radar.png': '\\u0089PNG\\r\\n\\u001a\\n',\n '/workspace/harbor/test/units.test.ts': unitsTest,\n '/workspace/skills/release-notes/SKILL.md': skill,\n '/workspace/skills/release-notes/scripts/collect.jsh': collect,\n '/shared/MEMORY.md': memory,\n '/shared/notes/2026-10-04-standup.md': standup,\n '/home/user/.bashrc': bashrc,\n '/home/.gelatiere/suggestions.json': suggestions,\n '/tmp/forecast-sample.json': sample,\n};\n\nexport const directories = ['/sessions', '/home/user/downloads'];\n\nexport const mountPoint = '/mnt/photos';\n\nexport const mounted: Record<string, string> = {\n 'README.md': '# Photos\\n\\nHarbor shots for the forecast pages, one album per season.\\n',\n 'albums/autumn.json': '{ \"title\": \"Autumn\", \"shots\": [\"breakwater-fog\", \"pier-at-dusk\"] }\\n',\n 'albums/winter.json': '{ \"title\": \"Winter\", \"shots\": [\"ice-on-the-buoys\"] }\\n',\n 'captions.txt':\n 'breakwater-fog: low cloud over the outer wall\\npier-at-dusk: lamps on, tide out\\n',\n};\n\nexport const pending: Change[] = [\n {\n path: '/workspace/harbor/src/lib/cache.ts',\n status: 'modified',\n before: cacheBefore,\n after: cacheAfter,\n agentId: 'cone-harbor',\n },\n {\n path: '/workspace/harbor/src/lib/retry.ts',\n status: 'added',\n before: null,\n after: retry,\n agentId: 'scoop-otter',\n },\n {\n path: '/workspace/harbor/src/routes/forecast.ts',\n status: 'modified',\n before: forecastBefore,\n after: forecastAfter,\n agentId: 'scoop-otter',\n },\n {\n path: '/workspace/harbor/src/legacy/xml.ts',\n status: 'deleted',\n before: legacyXml,\n after: null,\n agentId: 'cone-harbor',\n },\n {\n path: '/workspace/harbor/static/radar.png',\n status: 'modified',\n before: null,\n after: null,\n agentId: 'scoop-otter',\n },\n];\n\nexport const skillEdit: Change = {\n path: '/workspace/skills/release-notes/SKILL.md',\n status: 'modified',\n before: skill,\n after: `${skill}4. Link each change to its pull request.\\n`,\n agentId: null,\n};\n\nexport const models: ModelOption[] = [\n { id: 'claude-opus-5-5', label: 'Claude Opus 5.5', provider: 'Anthropic', images: true },\n { id: 'claude-sonnet-5-5', label: 'Claude Sonnet 5.5', provider: 'Anthropic', images: true },\n { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5', provider: 'Anthropic', images: true },\n { id: 'local-small', label: 'Local (ort-llama)', provider: 'This browser', images: false },\n { id: 'local-guard', label: 'Local guard', provider: 'This browser', kind: 'classifier' },\n { id: 'local-tiny', label: 'Local tiny (no tools)', provider: 'This browser', tools: false },\n];\n\nexport const laterModels: ModelOption[] = [\n { id: 'gpt-6', label: 'GPT-6', provider: 'OpenAI', images: true },\n { id: 'gpt-6-mini', label: 'GPT-6 mini', provider: 'OpenAI', images: true, default: true },\n];\n\nexport const defaults: Settings = {\n color: 'system',\n model: 'claude-sonnet-5-5',\n thinking: 'medium',\n sendOnEnter: true,\n pushToTalk: false,\n showThinking: true,\n diffStyle: 'unified',\n};\n\nexport const accounts: Account[] = [\n { id: 'anthropic', provider: 'Anthropic', identity: 'API key ending 3f2a', status: 'connected' },\n { id: 'github', provider: 'GitHub', identity: '@example-dev', status: 'connected' },\n { id: 'adobe', provider: 'Adobe', identity: 'dev@example.com', status: 'expired' },\n { id: 'openai', provider: 'OpenAI', identity: '', status: 'disconnected', auth: 'api-key' },\n {\n id: 'mcp:docs',\n provider: 'docs',\n identity: 'docs.example',\n status: 'connected',\n auth: 'api-key',\n group: 'mcp',\n secret: 'token',\n },\n {\n id: 'mcp:tickets',\n provider: 'tickets',\n identity: 'tickets.example',\n status: 'expired',\n auth: 'api-key',\n group: 'mcp',\n secret: 'token',\n },\n {\n id: 'mcp:design',\n provider: 'design',\n identity: 'design.example',\n status: 'disconnected',\n auth: 'oauth',\n group: 'mcp',\n },\n];\n\nexport const agents: Agent[] = [\n {\n id: 'cone-sliccy',\n name: 'sliccy',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0.21,\n unread: 0,\n },\n showcaseAgent,\n {\n id: 'cone-harbor',\n name: 'harbor',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-opus-5-5',\n contextFill: 0.38,\n unread: 0,\n },\n {\n id: 'scoop-otter',\n name: 'quiet-otter',\n kind: 'scoop',\n parentId: 'cone-harbor',\n status: 'working',\n model: 'claude-haiku-4-5',\n contextFill: 0.12,\n unread: 0,\n },\n {\n id: 'scoop-heron',\n name: 'amber-heron',\n kind: 'scoop',\n parentId: 'cone-harbor',\n status: 'idle',\n model: 'claude-haiku-4-5',\n contextFill: 0.04,\n unread: 0,\n },\n {\n id: 'cone-release',\n name: 'release-notes',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0.7,\n unread: 1,\n },\n {\n id: 'cone-triage',\n name: 'inbox-triage',\n kind: 'cone',\n parentId: null,\n status: 'waiting',\n model: 'claude-sonnet-5-5',\n contextFill: 0.95,\n unread: 2,\n },\n {\n id: 'scoop-wren',\n name: 'tidal-wren',\n kind: 'scoop',\n parentId: 'cone-sliccy',\n status: 'idle',\n model: 'claude-haiku-4-5',\n contextFill: 0.02,\n unread: 0,\n },\n {\n id: 'cone-tides',\n name: 'tide-tables',\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: 'claude-sonnet-5-5',\n contextFill: 0.31,\n unread: 0,\n frozen: true,\n },\n];\n\nconst start = Date.UTC(2026, 9, 5, 8, 30);\nconst at = (minutes: number) => start + minutes * 60_000;\n\nexport const queues: Record<string, UserMessage[]> = { 'cone-kitchen': showcaseQueue() };\n\nexport const conversations: Record<string, Message[]> = {\n 'cone-kitchen': showcase(),\n 'cone-sliccy': [\n {\n id: 'm-s0',\n role: 'assistant',\n status: 'done',\n createdAt: at(-24 * 60),\n parts: [\n {\n type: 'text',\n text: 'Hi, I am sliccy. Tell me a little about yourself, and I will set things up for you.',\n },\n { type: 'sprinkle', sprinkle: 'welcome' },\n ],\n },\n {\n id: 'm-s1',\n role: 'user',\n text: 'What is on my plate today?',\n createdAt: at(0),\n },\n {\n id: 'm-s2',\n role: 'assistant',\n status: 'done',\n createdAt: at(1),\n parts: [\n {\n type: 'tool',\n tool: {\n id: 't-s1',\n name: 'read_file',\n title: 'Read the standup notes',\n input: '/shared/notes/2026-10-04-standup.md',\n output: standup,\n status: 'done',\n paths: ['/shared/notes/2026-10-04-standup.md'],\n },\n },\n {\n type: 'text',\n text: 'Three things carry over from yesterday:\\n\\n1. **harbor**: the retry change is in review, and the midnight cache bug is still open.\\n2. **Docs**: the forecast page still shows Fahrenheit examples.\\n3. **release-notes** has a draft waiting for you.\\n\\nThe `harbor` cone is the one to start with.',\n },\n ],\n },\n ],\n 'cone-harbor': [\n {\n id: 'm-h1',\n role: 'lick',\n channel: 'webhook',\n title: 'GitHub \u00B7 issue opened',\n text: 'example/harbor#57: Forecast stays on yesterday after midnight UTC',\n createdAt: at(2),\n },\n {\n id: 'm-h2',\n role: 'user',\n text: 'The forecast endpoint serves stale data after midnight UTC. Find out why and fix it.',\n createdAt: at(3),\n },\n {\n id: 'm-h3',\n role: 'assistant',\n status: 'done',\n createdAt: at(4),\n parts: [\n {\n type: 'thinking',\n text: 'Stale after midnight points at the cache expiry. Check how the cache compares days.',\n },\n {\n type: 'tool',\n tool: {\n id: 't-h1',\n name: 'bash',\n title: 'Search for the cache expiry',\n input: 'rg -n \"getDate|TTL\" src',\n output:\n 'src/lib/cache.ts:6:const TTL = 60 * 60 * 1000;\\nsrc/lib/cache.ts:14: const day = new Date(entry.storedAt).getDate();\\nsrc/lib/cache.ts:16: if (now - entry.storedAt > TTL) return undefined;',\n status: 'done',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-h2',\n name: 'read_file',\n title: 'Read the cache',\n input: '/workspace/harbor/src/lib/cache.ts',\n output: cacheBefore,\n status: 'done',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-h3',\n name: 'edit_file',\n title: 'Expire entries from the previous day',\n input: '/workspace/harbor/src/lib/cache.ts',\n output: 'Replaced 1 block (4 lines \u2192 7 lines), added dayOf()',\n status: 'done',\n paths: ['/workspace/harbor/src/lib/cache.ts'],\n diff: { before: cacheBefore, after: cacheAfter },\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-h4',\n name: 'bash',\n title: 'Run the tests',\n input: 'npm test',\n meta: 'timeout 120s',\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\u2139 tests 2\\n\u2139 pass 2\\n\u2139 fail 0',\n status: 'done',\n paths: [],\n },\n },\n {\n type: 'text',\n text: 'Found it. `ForecastCache.get` compared **local** calendar days, and when the day changed it returned the old entry instead of dropping it:\\n\\n```ts\\nif (day !== new Date(now).getDate()) return entry.value;\\n```\\n\\nI changed it to compare UTC dates and delete the entry, so the first request after midnight goes upstream. The tests pass.\\n\\n| | Before | After |\\n| --- | --- | --- |\\n| Day compared | local `getDate()` | UTC `toISOString()` |\\n| On a new day | returns stale entry | deletes and refetches |\\n\\nquiet-otter is adding retries for upstream timeouts in a scoop.',\n },\n {\n type: 'delegation',\n kind: 'scoop',\n scoop: 'quiet-otter',\n text: 'Started a scoop to add retries around the upstream fetch',\n },\n ],\n },\n {\n id: 'm-h4',\n role: 'lick',\n channel: 'scoop-notify',\n title: 'quiet-otter',\n text: 'Started: add retries with backoff around the upstream fetch',\n createdAt: at(9),\n },\n ],\n 'scoop-otter': [\n {\n id: 'm-o1',\n role: 'user',\n origin: 'agent',\n from: 'harbor',\n text: 'Wrap the upstream fetch in src/routes/forecast.ts with three retries and exponential backoff.',\n createdAt: at(9),\n },\n {\n id: 'm-o2',\n role: 'assistant',\n status: 'done',\n createdAt: at(10),\n parts: [\n {\n type: 'tool',\n tool: {\n id: 't-o1',\n name: 'write_file',\n title: 'Add retry()',\n input: '/workspace/harbor/src/lib/retry.ts',\n output: 'Wrote 12 lines',\n status: 'done',\n paths: ['/workspace/harbor/src/lib/retry.ts'],\n },\n },\n {\n type: 'tool',\n tool: {\n id: 't-o2',\n name: 'edit_file',\n title: 'Use retry() for the upstream call',\n input: '/workspace/harbor/src/routes/forecast.ts',\n output: 'Replaced 1 block',\n status: 'done',\n paths: ['/workspace/harbor/src/routes/forecast.ts'],\n },\n },\n { type: 'text', text: 'Both edits are in. Running the tests next.' },\n ],\n },\n ],\n 'scoop-heron': [],\n 'scoop-wren': [],\n 'cone-tides': [\n {\n id: 'm-f1',\n role: 'user',\n text: 'Add a tide table endpoint next to the forecast, with high and low water per day.',\n createdAt: at(-2900),\n },\n {\n id: 'm-f2',\n role: 'assistant',\n status: 'done',\n createdAt: at(-2898),\n parts: [\n {\n type: 'text',\n text: 'Added `/v1/tides?city=` with the next seven days of high and low water. It reads from the same upstream as the forecast and shares its cache.',\n },\n ],\n },\n ],\n 'cone-release': [\n {\n id: 'm-r1',\n role: 'lick',\n channel: 'cron',\n title: 'Every Friday 09:00',\n text: 'Draft the release notes for example/harbor',\n createdAt: at(-1440),\n },\n {\n id: 'm-r2',\n role: 'assistant',\n status: 'done',\n createdAt: at(-1438),\n parts: [\n {\n type: 'tool',\n tool: {\n id: 't-r1',\n name: 'bash',\n title: 'Collect merged pull requests',\n input: 'collect.jsh example/harbor v1.8.0',\n output:\n '41\\tfix\\tReturn 400 when the city is missing\\n43\\tfeature\\tAdd /health\\n44\\tchore\\tUpdate wrangler to 4.40.0',\n status: 'done',\n paths: ['/workspace/skills/release-notes/scripts/collect.jsh'],\n },\n },\n {\n type: 'text',\n text: '## harbor 1.9.0\\n\\n**Features**\\n- Added a `/health` endpoint.\\n\\n**Fixes**\\n- Requests without a city now get a 400 instead of a 500.\\n\\n**Chores**\\n- Updated wrangler to 4.40.0.',\n },\n ],\n },\n {\n id: 'm-r3',\n role: 'lick',\n channel: 'cron',\n severity: 'error',\n title: 'Crontab',\n text: 'Crontab line 3 is invalid',\n body: '30 25 * * * sweep-drafts\\nThe hour is 25. It must be 0 to 23.',\n createdAt: at(-1430),\n },\n {\n id: 'm-r4',\n role: 'lick',\n channel: 'fswatch',\n severity: 'warn',\n title: '/workspace/notes',\n text: 'File watch on /workspace/notes stopped; retrying',\n createdAt: at(-1429),\n },\n {\n id: 'm-r5',\n role: 'lick',\n channel: 'workflow',\n title: 'Release report',\n text: 'The weekly release report is ready',\n body: 'Summary: harbor 1.9.0 shipped three changes this week, the /health endpoint, a 400 for requests without a city and a wrangler update, with no failed deploys, no rollbacks and two flaky test runs in the forecast suite that passed on retry, so the next release can go out on Friday as planned once the docs pass lands.',\n createdAt: at(-1428),\n },\n ],\n 'cone-triage': [\n {\n id: 'm-t1',\n role: 'system',\n kind: 'compaction',\n trigger: 'threshold',\n state: 'summarized',\n title: 'Context compacted',\n text: '41 earlier messages were summarized to stay under the context limit.',\n createdAt: at(-30),\n },\n {\n id: 'm-t2',\n role: 'assistant',\n status: 'done',\n createdAt: at(-20),\n parts: [\n {\n type: 'text',\n text: 'Two messages need a decision from you:\\n\\n- A vendor asks to move Thursday\u2019s call to Friday.\\n- The staging certificate expires in 6 days. Should I open a ticket?',\n },\n ],\n },\n {\n id: 'm-t3',\n role: 'system',\n kind: 'error',\n action: 'login',\n title: 'Mail connector',\n text: 'The connector returned 401. Reconnect the account in Settings.',\n createdAt: at(-19),\n },\n ],\n};\n\nexport const tabs: BrowserTab[] = [\n {\n id: 'tab-preview',\n title: 'harbor \u00B7 localhost',\n url: 'http://localhost:8787/forecast?city=Lisbon',\n status: 'complete',\n agentId: 'cone-harbor',\n },\n {\n id: 'tab-docs',\n title: 'Forecast API reference',\n url: 'https://api.example.com/docs/v2/forecast',\n status: 'complete',\n agentId: null,\n favicon: `data:image/svg+xml;charset=utf-8,${encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><rect width=\"16\" height=\"16\" rx=\"3\" fill=\"#7a5af8\"/><text x=\"8\" y=\"12\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"700\" fill=\"#ffffff\" text-anchor=\"middle\">A</text></svg>')}`,\n },\n {\n id: 'tab-pull',\n title: 'Add retries for upstream timeouts \u00B7 Pull request #58',\n url: 'https://git.example.com/example/harbor/pull/58',\n status: 'complete',\n agentId: 'scoop-otter',\n favicon: `data:image/svg+xml;charset=utf-8,${encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><rect width=\"16\" height=\"16\" rx=\"3\" fill=\"#0a7a43\"/><text x=\"8\" y=\"12\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"700\" fill=\"#ffffff\" text-anchor=\"middle\">G</text></svg>')}`,\n },\n];\n\nexport const terminals: TerminalInfo[] = [\n { id: 'term-1', title: 'bash', cwd: '/workspace/harbor', agentId: null },\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 },\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 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\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 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 === '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 #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.#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 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';\n\nexport const readOnlyText =\n 'Watch only. The SLICC you follow runs a newer version. Update this one to send prompts.';\n\nexport const noticeFixtures: Record<'storage' | 'welcome' | 'readonly', Notice> = {\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 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};\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'\n ? [noticeFixtures.readonly]\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('The browser declined again. Bookmark this page, then try again.');\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 const shown = this.#notices.some((notice) => notice.id === 'readonly');\n if (on === shown) return;\n if (on) {\n this.#notices = [noticeFixtures.readonly, ...this.#notices];\n this.emit('notices', this.#notices);\n } else {\n this.#remove('readonly');\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 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\nexport class DummySprinkles extends Emitter<SprinkleEvents> implements SprinklePort {\n #sprinkles: Sprinkle[];\n #agent: DummyAgent;\n #files: FilePort;\n #state = new Map<string, unknown>();\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 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", "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 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 = 'mixed' | 'empty' | 'fail' | 'user';\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\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 }));\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 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',\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 'agent',\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\nexport function packageFixtures(scenario: PackageScenario): readonly PackageItem[] {\n if (scenario === 'empty') return [];\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('uv', { state: 'outdated', version: '0.8.1', actions: ['update', 'remove'] });\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 return scenario === 'user' ? [...items, ...userPackages()] : items;\n}\n\nexport interface DummyUpdatesOptions {\n packages?: PackageScenario;\n confirm?: PackageConfirm;\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\n constructor(scenario: UpdateScenario, clock: Clock, options: DummyUpdatesOptions = {}) {\n super();\n this.#items = updateFixtures(scenario);\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) => this.#actPackage(id, action);\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 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(4);\n if (this.#fail) {\n this.#patchPackage(id, {\n state: 'failed',\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: ['remove'],\n log: `${log}\\nProgress: resolved 1, downloaded 1, added 1\\nDone in 3.8s`,\n });\n }\n\n list(): readonly UpdateItem[] {\n return this.#items;\n }\n\n ready(): boolean {\n return this.#ready;\n }\n\n setScenario(scenario: UpdateScenario): void {\n this.#items = updateFixtures(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 if (action === 'update-now' || action === 'retry') {\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 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 });\n }\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n AuditEntry,\n AuditPage,\n Availability,\n ButtonConfig,\n ButtonEvent,\n ButtonMessage,\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 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 | 'request'\n | 'backup'\n | 'waiting';\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\nexport function accountRecords(now = Date.now()): 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 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 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 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 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 };\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 ? [] : [...(policy ? [vaultPolicy(now)] : []), ...vaultAudit(now)],\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: { code: ErrorCode; message: string } | null = null;\n #time: Clock;\n #older: AuditEntry[] = vaultOlder();\n #serial = 0;\n buttons: DummyVaultButton[] = [];\n puts: { name: string; request?: string; options?: PutOptions }[] = [];\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 }\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): void {\n this.#fail = { code, message };\n }\n\n #failed(): void {\n const fail = this.#fail;\n this.#fail = null;\n if (fail) throw vaultFailure(fail.code, fail.message);\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 } = {}\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 this.puts.push({\n name,\n ...(request === undefined ? {} : { request }),\n ...(options ? { options: { ...options } } : {}),\n });\n const { kind = 'secret', provider, server } = options ?? {};\n return this.#seal(name, 'settings', kind, {\n ...(provider === undefined ? {} : { provider }),\n ...(server === undefined ? {} : { server }),\n });\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 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, 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 * 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 { 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 } from './notices.ts';\nimport { DummySettings } from './settings.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 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 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 follow?: FollowScenario | 'off';\n vault?: VaultScenario | 'off';\n guests?: GuestsScenario | 'off';\n accounts?: 'settings' | 'vault';\n providers?: 'connected' | 'none';\n hold?: AgentHold['reason'] | 'off';\n readonly?: 'version' | 'off';\n browser?: BrowserScenario;\n sprinkles?: 'builtin' | 'cones';\n monitor?: 'dummy' | 'agent';\n}\n\nexport interface DummyModel extends SliccModel {\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\nfunction guestsPort(guests: GuestsScenario | 'off', time: Clock): { guests?: DummyGuests } {\n return guests === 'off' ? {} : { guests: new DummyGuests(guests, time) };\n}\n\nexport function createDummyModel({\n delay = 30,\n storage = null,\n updates = 'current',\n packages = 'off',\n confirm,\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 follow = 'off',\n vault = 'off',\n guests = 'off',\n accounts = 'settings',\n providers = 'connected',\n hold = 'off',\n readonly = 'off',\n browser: scenario = 'idle',\n sprinkles = 'builtin',\n monitor = 'dummy',\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 agent = new DummyAgent(\n fixtures.agents,\n fixtures.conversations,\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 if (hold !== 'off') agent.setHold({ reason: hold, held: 2 });\n if (readonly !== 'off') agent.setReadOnly(readOnlyText);\n const notice = readonly !== 'off' ? 'readonly' : notices;\n const noticePort = notice === 'off' ? null : new DummyNotices(notice, time);\n if (noticePort && readonly !== 'off') {\n agent.on('readOnly', (text) => noticePort.readOnly(Boolean(text)));\n }\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 (accounts === 'vault' ? vaultAccounts(fixtures.accounts) : fixtures.accounts).map(\n (account) =>\n providers === 'none' && account.group !== 'mcp'\n ? { ...account, status: 'disconnected' as const, identity: '' }\n : account\n ),\n storage,\n time,\n undefined,\n providers === 'none'\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.tray, time),\n updates: new DummyUpdates(updates, time, {\n ...(packages === 'off' ? {} : { packages }),\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, accounts === 'vault' ? accountRecords() : []),\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": ";;;;;;;;;;;;;;;AAwBA,IAAM,UAAU;AAEhB,IAAM,OAAO,EAAE,MAAM,SAAS,MAAM,gBAAgB;AAEpD,SAAS,cAAcA,OAAM,KAAK,IAAI,GAAe;AACnD,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,QACX,EAAE,MAAM,gBAAgB,UAAU,YAAY,MAAM,MAAO;AAAA,QAC3D,EAAE,MAAM,gBAAgB,UAAU,aAAa,MAAM,QAAU;AAAA,MACjE;AAAA,MACA,WAAWA;AAAA,MACX,WAAWA,OAAM,IAAI;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS,EAAE,UAAU,SAAS,QAAQ,gDAAgD;AAAA,IACxF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAWA,OAAM;AAAA,MACjB,WAAWA,OAAM,IAAI;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS,EAAE,UAAU,QAAQ,QAAQ,kDAAkD;AAAA,IACzF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,EAAE,MAAM,SAAS,MAAM,gBAAgB;AAAA,MAClD,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAWA,OAAM;AAAA,MACjB,WAAWA,OAAM,IAAI;AAAA,MACrB,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,UAA4BA,OAAM,KAAK,IAAI,GAAe;AACzF,QAAM,QAAkB;AAAA,IACtB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,WAAW,EAAE,MAAM,SAAS,MAAM,aAAa,SAAS,aAAa;AAAA,IACrE,SAAS;AAAA,IACT,KAAK;AAAA,IACL,WAAWA;AAAA,IACX,WAAWA,QAAO,aAAa,SAAS,MAAM,UAAU,IAAI;AAAA,IAC5D,QAAQ;AAAA,EACV;AACA,QAAM,OAAiB;AAAA,IACrB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,WAAW,EAAE,MAAM,QAAQ,MAAM,QAAQ,OAAO,aAAa;AAAA,IAC7D,SAAS;AAAA,IACT,WAAWA,OAAM;AAAA,IACjB,WAAWA,OAAM,IAAI;AAAA,IACrB,QAAQ;AAAA,EACV;AACA,QAAM,QAAkB;AAAA,IACtB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,WAAW,EAAE,MAAM,SAAS,MAAM,eAAe,SAAS,cAAc;AAAA,IACxE,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAWA,OAAM;AAAA,IACjB,WAAWA,OAAM,IAAI;AAAA,IACrB,QAAQ;AAAA,EACV;AACA,MAAI,aAAa;AACf,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW,EAAE,MAAM,SAAS,MAAM,aAAa,SAAS,aAAa;AAAA,QACrE,SAAS;AAAA,QACT,KAAK;AAAA,QACL,WAAWA;AAAA,QACX,WAAWA,OAAM,IAAI;AAAA,QACrB,QAAQ;AAAA,MACV;AAAA,IACF;AACF,MAAI,aAAa,WAAW,aAAa,iBAAkB,QAAO,cAAcA,IAAG;AACnF,MAAI,aAAa,OAAQ,QAAO,CAAC;AACjC,MAAI,aAAa,OAAQ,QAAO,CAAC,IAAI;AACrC,MAAI,aAAa,OAAQ,QAAO,CAAC,OAAO,MAAM,KAAK;AACnD,MAAI,aAAa,eAAe,aAAa,YAAa,QAAO,CAAC,OAAO,IAAI;AAC7E,SAAO,CAAC,KAAK;AACf;AAEO,IAAM,iBAAN,cAA6B,QAAkD;AAAA,EACpF;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAA+C,CAAC;AAAA,EAChD;AAAA,EAEA,YAAY,UAA4B,MAAa;AACnD,UAAM;AACN,SAAK,aAAa,iBAAiB,QAAQ;AAC3C,SAAK,QAAQ;AACb,SAAK,QAAQ,aAAa;AAC1B,QAAI,aAAa,cAAc,aAAa;AAC1C,WAAK,SAAS,CAAC,IAAI,aAAa,KAAK,QAAQ,IAAI,QAAQ;AAC3D,QAAI,aAAa,eAAe,aAAa;AAC3C,WAAK,KACF,MAAM,GAAG,EACT,KAAK,MAAM,KAAK,IAAI,WAAW,aAAa,cAAc,aAAa,WAAW,CAAC;AAAA,EAC1F;AAAA,EAEA,MAAM,UAA0B;AAC9B,SAAK,aAAa,CAAC,GAAG,KAAK,YAAY,QAAQ;AAC/C,SAAK,KAAK,aAAa,KAAK,KAAK,CAAC;AAAA,EACpC;AAAA,EAEA,IAAI,IAAY,QAA2B;AACzC,SAAK,KAAK,SAAS,EAAE,IAAI,OAAO,CAAC;AACjC,SAAK,aAAa,KAAK,WAAW,OAAO,CAAC,aAAa,SAAS,OAAO,EAAE;AACzE,SAAK,KAAK,aAAa,KAAK,KAAK,CAAC;AAAA,EACpC;AAAA,EAEA,OAA4B;AAC1B,WAAO,CAAC,GAAG,KAAK,UAAU;AAAA,EAC5B;AAAA,EAEA,MAAM,QAAQ,IAAY,UAA2C;AACnE,UAAM,KAAK,MAAM,MAAM,EAAE;AACzB,QAAI,KAAK,MAAO,OAAM,IAAI,MAAM,oDAAoD;AACpF,QAAI,OAAO,aAAc,OAAM,IAAI,MAAM,qCAAqC;AAC9E,SAAK,UAAU,KAAK,CAAC,IAAI,QAAQ,CAAC;AAClC,SAAK,IAAI,IAAI,UAAU;AAAA,EACzB;AACF;;;ACjKA,SAAS,OAAO,MAAsB;AACpC,SAAO,KAAK,QAAQ,WAAW,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG;AAC/D;AAEA,SAAS,IAAI,MAAsB;AACjC,MAAI,MAAM;AACV,aAAW,QAAQ,KAAM,QAAO,MAAM,KAAK,KAAK,WAAW,CAAC,KAAK;AACjE,SAAO;AACT;AAOO,SAAS,KAAK,KAAiB,MAAuB;AAC3D,QAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI;AACnC,QAAM,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAC3B;AAAA,IACC,CAAC,MACC,mBAAmB,MAAM,IAAI,EAAE,YAAY,MAAO,IAAI,IAAK,EAAE;AAAA,EACjE,EACC,KAAK,EAAE;AACV,QAAM,MAAM,qLAAqL,CAAC,0FAA0F,OAAO,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,sFAAsF,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,oEAAoE,CAAC,eAAe,SAAS,SAAY,KAAK,mBAAmB,MAAO,OAAO,IAAK,EAAE,YAAY,MAAO,OAAO,IAAK,EAAE,gDAAgD,CAAC,+BAA+B;AACrrB,SAAO,oCAAoC,mBAAmB,GAAG,CAAC;AACpE;AAEA,SAAS,SAAS,KAAqB;AACrC,QAAM,EAAE,MAAM,SAAS,IAAI,IAAI,IAAI,GAAG;AACtC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,aAAa,MAAM,OAAO,GAAG,IAAI,GAAG,QAAQ;AACrD;AAEA,IAAM,SAAS;AAER,IAAM,eAAe,EAAE,QAAQ,KAAK,OAAO,KAAM,KAAK,KAAK,KAAK,KAAK,OAAO;AAEnF,IAAM,SAAS,CAAC,UAAU,SAAS,QAAQ,SAAS,WAAW,QAAQ;AAEvE,SAAS,QAAQC,MAA4B;AAC3C,QAAMC,UAAS,EAAE,OAAO,eAAe,SAAS,cAAc;AAC9D,SAAO,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,MAAmB;AACxD,UAAM,OAAO,OAAO,IAAI,OAAO,MAAM;AACrC,UAAMC,MAAKF,OAAM,MAAM,SAAS,IAAI;AACpC,YAAQ,IAAI,GAAG;AAAA,MACb,KAAK;AACH,eAAO;AAAA,UACL,GAAGC;AAAA,UACH,MAAM;AAAA,UACN,OAAO,uCAAuC,IAAI,SAAU,IAAI,IAAK,CAAC,sDAAsD,CAAC;AAAA,UAC7H,IAAAC;AAAA,QACF;AAAA,MACF,KAAK;AACH,eAAO,EAAE,GAAGD,SAAQ,MAAM,YAAY,IAAAC,IAAG;AAAA,MAC3C,KAAK;AACH,eAAO,EAAE,GAAGD,SAAQ,MAAM,SAAS,QAAQ,eAAgB,IAAI,IAAK,CAAC,KAAK,IAAAC,IAAG;AAAA,MAC/E,KAAK;AACH,eAAO,EAAE,GAAGD,SAAQ,MAAM,UAAU,IAAAC,IAAG;AAAA,MACzC;AACE,eAAO,EAAE,GAAGD,SAAQ,MAAM,cAAc,IAAAC,IAAG;AAAA,IAC/C;AAAA,EACF,CAAC;AACH;AAEO,SAAS,eAAe,UAA2BF,OAAM,KAAK,IAAI,GAAkB;AACzF,MAAI,aAAa,MAAO,QAAO,CAAC;AAChC,QAAMC,UAAS,EAAE,OAAO,eAAe,SAAS,cAAc;AAC9D,QAAM,QAAQ,EAAE,OAAO,YAAY,SAAS,cAAc;AAC1D,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,IAAID,OAAM,MAAM;AAAA,IAClB;AAAA,IACA,EAAE,GAAG,OAAO,MAAM,YAAY,IAAIA,OAAM,MAAM,OAAO;AAAA,IACrD,EAAE,GAAG,OAAO,MAAM,UAAU,IAAIA,OAAM,MAAM,OAAO;AAAA,IACnD,EAAE,GAAG,OAAO,MAAM,cAAc,IAAIA,OAAM,MAAM,OAAO;AAAA,IACvD,GAAG,QAAQA,IAAG;AAAA,IACd,EAAE,GAAGC,SAAQ,MAAM,QAAQ,OAAO,0BAA0B,IAAID,OAAM,MAAM,OAAO;AAAA,IACnF,EAAE,GAAGC,SAAQ,MAAM,YAAY,IAAID,OAAM,MAAM,OAAO;AAAA,IACtD,EAAE,GAAGC,SAAQ,MAAM,QAAQ,QAAQ,kBAAkB,QAAQ,GAAG,IAAID,OAAM,MAAM,OAAO;AAAA,IACvF,EAAE,GAAGC,SAAQ,MAAM,SAAS,QAAQ,0BAA0B,IAAID,OAAM,MAAM,OAAO;AAAA,IACrF,EAAE,GAAGC,SAAQ,MAAM,YAAY,IAAID,OAAM,MAAM,OAAO;AAAA,IACtD;AAAA,MACE,GAAGC;AAAA,MACH,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,IAAID,OAAM,KAAK;AAAA,IACjB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,IAAIA,OAAM,KAAK;AAAA,IACjB;AAAA,IACA,EAAE,GAAGC,SAAQ,MAAM,QAAQ,IAAID,OAAM,KAAK,OAAO;AAAA,IACjD,EAAE,GAAGC,SAAQ,MAAM,SAAS,OAAO,OAAO,IAAID,OAAM,KAAK,OAAO;AAAA,EAClE;AACF;AAEO,IAAM,QAAgC;AAAA,EAC3C,EAAE,OAAO,eAAe,SAAS,eAAe,MAAM,SAAS;AAAA,EAC/D,EAAE,OAAO,eAAe,SAAS,eAAe,MAAM,aAAa;AAAA,EACnE,EAAE,OAAO,eAAe,SAAS,eAAe,MAAM,SAAS,QAAQ,yBAAyB;AAClG;AAEO,IAAM,eAAN,cAA2B,QAA8C;AAAA,EAC9E;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAA4B,CAAC;AAAA,EAC7B,SAAS;AAAA,EAET,YACEG,OACAC,QACA;AAAA,IACE,UAAU,CAAC;AAAA,IACX,aAAa,CAAC;AAAA,EAChB,IAA0E,CAAC,GAC3E;AACA,UAAM;AACN,SAAK,SAASA;AACd,SAAK,QAAQD,MAAK,IAAI,CAAC,SAAS;AAAA,MAC9B,GAAG;AAAA,MACH,GAAI,WAAW,SAAS,IAAI,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,IAC5D,EAAE;AACF,SAAK,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM;AACpC,eAAW,SAAS,QAAS,MAAK,MAAM,KAAK;AAAA,EAC/C;AAAA,EAEA,OAA8B;AAC5B,WAAO,KAAK,MAAM,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,OAA0C;AAChD,UAAM,QAAQ,KAAK,IAAI,IAAI,aAAa;AACxC,UAAM,SAAS,oBAAI,IAA2B;AAC9C,UAAM,OAAwB,CAAC;AAC/B,eAAW,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE,QAAQ,GAAG;AACjD,UAAI,KAAK,WAAW,aAAa,MAAO;AACxC,YAAM,SAAS,OAAO,IAAI,OAAO,KAAK,KAAK,KAAK;AAChD,aAAO,IAAI,OAAO,OAAO,KAAK;AAC9B,UAAI,SAAS,aAAa,UAAU,OAAO,MAAM,MAAO,MAAK,KAAK,MAAM;AAAA,IAC1E;AACA,WAAO,KACJ,QAAQ,EACR,OAAO,CAAC,WAAW,UAAU,UAAa,OAAO,UAAU,KAAK,EAChE,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE;AAAA,EACpC;AAAA,EAEA,MAAM,OAAmC;AACvC,UAAM,SAAwB;AAAA,MAC5B,QAAQ;AAAA,MACR,GAAG;AAAA,MACH,IAAI,UAAU,KAAK,SAAS,SAAS,CAAC;AAAA,MACtC,IAAI,MAAM,MAAM,KAAK,IAAI;AAAA,IAC3B;AACA,SAAK,SAAS,KAAK,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAA4B;AACjC,UAAM,SAAS,KAAK,MAAM,EAAE,QAAQ,WAAW,GAAG,MAAM,CAAC;AACzD,UAAM,MAAM,KAAK,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,OAAO,KAAK;AACxE,QAAI,KAAK;AACP,UAAI,UAAU,OAAO;AACrB,UAAI,OAAO,QAAS,KAAI,aAAa;AACrC,WAAK,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,IAC/B;AACA,SAAK,KAAK,UAAU,EAAE,GAAG,OAAO,CAAC;AACjC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,OAAO,IAAY,OAAsB;AACvC,UAAM,SAAS,KAAK,SAAS,KAAK,CAAC,cAAc,UAAU,OAAO,EAAE;AACpE,QAAI,QAAQ,WAAW,UAAW;AAClC,WAAO,SAAS,QAAQ,WAAW;AACnC,QAAI,MAAO,QAAO,QAAQ;AAC1B,SAAK,KAAK,UAAU,EAAE,GAAG,OAAO,CAAC;AAAA,EACnC;AAAA,EAEA,MAAM,IAAIE,SAA+C;AACvD,eAAW,CAACC,QAAO,KAAK,KAAKD,QAAO,QAAQ,GAAG;AAC7C,YAAM,KAAK,KAAK,OAAO,KAAK;AAC5B,UAAIC,WAAUD,QAAO,SAAS,EAAG;AACjC,YAAM,KAAK,OAAO,MAAM,EAAE;AAC1B,WAAK,OAAO,EAAE;AACd,YAAM,KAAK,OAAO,MAAM,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,QAAQ,SAAuB;AAC7B,QAAI,UAAU;AACd,eAAW,OAAO,KAAK,OAAO;AAC5B,UAAI,IAAI,YAAY,WAAW,CAAC,IAAI,WAAY;AAChD,UAAI,aAAa;AACjB,gBAAU;AAAA,IACZ;AACA,eAAW,UAAU,KAAK;AACxB,UAAI,OAAO,YAAY,WAAW,OAAO,WAAW;AAClD,aAAK,OAAO,OAAO,IAAI,SAAS;AACpC,QAAI,QAAS,MAAK,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,MAAM,OAA2B;AAC/B,UAAM,MAAM,MAAM,KAAK,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,KAAK;AACvE,QAAI,CAAC,IAAI,GAAG,WAAY,QAAO,MAAM;AAAA,IAAC;AACtC,UAAM,OAAO,MAAM;AACjB,YAAML,OAAM,IAAI;AAChB,UAAI,CAACA,MAAK,WAAY;AACtB,WAAK,KAAK,SAAS,EAAE,OAAO,KAAK,KAAKA,MAAK,KAAK,QAAQ,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,IAC7E;AACA,UAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,SAAK,KAAK,OAAO,MAAM,CAAC,EAAE,KAAK,IAAI;AACnC,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AAAA,EAEA,WAAiB;AACf,SAAK,KAAK,QAAQ,KAAK,KAAK,CAAC;AAC7B,SAAK,KAAK,UAAU,KAAK,OAAO;AAAA,EAClC;AAAA,EAEA,SAAS,IAAkB;AACzB,QAAI,CAAC,KAAK,MAAM,KAAK,CAAC,QAAQ,IAAI,OAAO,EAAE,EAAG;AAC9C,SAAK,UAAU;AACf,SAAK,KAAK,UAAU,EAAE;AAAA,EACxB;AAAA,EAEA,MAAM,IAAY,QAAuB;AACvC,SAAK,KAAK,OAAO,MAAM,EAAE,EAAE,KAAK,MAAM;AACpC,UAAI,OAAQ,MAAK,OAAO,MAAM;AAC9B,YAAM,MAAM,KAAK,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,EAAE;AAC9D,UAAI,CAAC,IAAK;AACV,UAAI,SAAS;AACb,UAAI,QAAQ,SAAS,IAAI,GAAG;AAC5B,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,KAAa,UAAyB,MAAkB;AAC3D,UAAM,MAAkB;AAAA,MACtB,IAAI,WAAW,KAAK,OAAO;AAAA,MAC3B,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF;AACA,SAAK,MAAM,KAAK,GAAG;AACnB,SAAK,UAAU,IAAI;AACnB,UAAM,SAAS,UACX,KAAK,MAAM,EAAE,OAAO,IAAI,IAAI,SAAS,MAAM,QAAQ,OAAO,KAAK,QAAQ,UAAU,CAAC,IAClF;AACJ,SAAK,SAAS;AACd,QAAI,OAAQ,MAAK,KAAK,UAAU,EAAE,GAAG,OAAO,CAAC;AAC7C,SAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC7B,WAAO,EAAE,GAAG,IAAI;AAAA,EAClB;AAAA,EAEA,SAAS,IAAY,KAAmB;AACtC,UAAM,MAAM,KAAK,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,EAAE;AAC9D,QAAI,CAAC,IAAK;AACV,QAAI,MAAM;AACV,QAAI,QAAQ;AACZ,QAAI,SAAS;AACb,SAAK,SAAS;AACd,SAAK,MAAM,EAAE;AAAA,EACf;AAAA,EAEA,MAAM,IAAkB;AACtB,UAAMM,SAAQ,KAAK,MAAM,UAAU,CAAC,QAAQ,IAAI,OAAO,EAAE;AACzD,QAAIA,SAAQ,EAAG;AACf,SAAK,MAAM,OAAOA,QAAO,CAAC;AAC1B,QAAI,KAAK,YAAY;AACnB,WAAK,UAAU,KAAK,MAAM,KAAK,IAAIA,QAAO,KAAK,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM;AAC3E,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,WAAW,IAA6B;AAC5C,UAAM,KAAK,OAAO,MAAM,CAAC;AACzB,UAAM,MAAM,KAAK,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,EAAE;AAC9D,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,UAAU,EAAE,EAAE;AACxC,WAAO,KAAK,GAAG;AAAA,EACjB;AACF;;;ACnSO,IAAM,QAAQ,CAAC,qBAAqB,mBAAmB;AAEvD,IAAM,cAAc;AAEpB,IAAM,QACX;AAEF,SAAS,OAAO,MAAkC;AAChD,SAAO,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,GAAG,IAAI,GAAG,CAAC;AACzD;AAEO,IAAM,eAAN,MAA0C;AAAA,EAC/C;AAAA,EACA;AAAA,EAEA,YAAYC,QAAmB,KAAc;AAC3C,SAAK,SAASA;AACd,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,KAAyD,CAAC,MAAM,aAC9D,KAAK,OAAO,GAAG,MAAM,MAAM,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,EAErD,UAA6B;AAC3B,QAAI,CAAC,KAAK,KAAM,QAAO,CAAC;AACxB,WAAO,KAAK,OAAO,QAAQ,EAAE,QAAQ,CAAC,WAAW;AAC/C,YAAM,OAAO,OAAO,OAAO,IAAI;AAC/B,aAAO,OAAO,CAAC,EAAE,GAAG,QAAQ,SAAS,MAAM,KAAK,CAAC,IAAI,CAAC;AAAA,IACxD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAoB;AACzB,SAAK,OAAO,OAAO,IAAI;AAAA,EACzB;AAAA,EAEA,OAAO,MAA6B;AAClC,WAAO,KAAK,OAAO,OAAO,IAAI;AAAA,EAChC;AAAA,EAEA,cAA6B;AAC3B,WAAO,KAAK,OAAO,OAAO;AAAA,EAC5B;AAAA,EAEA,WAA8B;AAC5B,WAAO,KAAK,OAAO,CAAC,IAAI,CAAC,aAAa,UAAU;AAAA,EAClD;AACF;;;ACtCA,IAAM,QAAQ;AACd,IAAM,OAAO;AAEN,SAAS,eAAe,UAAuC;AACpE,QAAM,OAAO,EAAE,MAAM,OAAO,SAAS,OAAO,UAAU,MAAM;AAC5D,QAAM,OAAO,EAAE,MAAM,MAAM,SAAS,MAAM,UAAU,KAAK;AACzD,QAAM,OAAO,EAAE,OAAO,KAAK;AAC3B,MAAI,aAAa,aAAc,QAAO,EAAE,GAAG,MAAM,MAAM,cAAc,QAAQ,KAAK;AAClF,MAAI,aAAa,UAAW,QAAO,EAAE,GAAG,MAAM,MAAM,aAAa,QAAQ,KAAK;AAC9E,MAAI,aAAa,QAAS,QAAO,EAAE,GAAG,MAAM,MAAM,aAAa,QAAQ,EAAE,GAAG,MAAM,MAAM,KAAK,EAAE;AAC/F,MAAI,aAAa;AACf,WAAO,EAAE,GAAG,MAAM,MAAM,aAAa,QAAQ,EAAE,GAAG,MAAM,UAAU,MAAM,EAAE;AAC5E,MAAI,aAAa,eAAgB,QAAO,EAAE,GAAG,MAAM,MAAM,gBAAgB,QAAQ,KAAK;AACtF,MAAI,aAAa,WAAY,QAAO,EAAE,GAAG,MAAM,MAAM,YAAY,QAAQ,KAAK;AAC9E,MAAI,aAAa;AACf,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,uBAAkB,KAAK;AAAA,IAChC;AACF,SAAO,EAAE,GAAG,MAAM,MAAM,aAAa,QAAQ,KAAK;AACpD;AAEO,IAAM,cAAN,cAA0B,QAAuD;AAAA,EACtF;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EAEP,YAAY,UAA0B,MAAa;AACjD,UAAM;AACN,SAAK,SAAS,eAAe,QAAQ;AACrC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,QAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,UAAgC;AAC1C,SAAK,SAAS,eAAe,QAAQ;AACrC,SAAK,KAAK,UAAU,KAAK,MAAM;AAAA,EACjC;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM,MAAM,CAAC;AACxB,SAAK;AAAA,EACP;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,YAAY,YAAY;AAC7B,UAAM,KAAK,MAAM,MAAM,EAAE;AACzB,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;;;AC9DA,IAAM,OAAO;AACb,IAAM,MAAM,KAAK;AACjB,IAAM,MAAM,KAAK;AAEV,IAAM,oBACX;AAEK,IAAM,gBAAgB;AAEtB,SAAS,eAAe,UAA0BC,OAAM,KAAK,IAAI,GAAgB;AACtF,MAAI,aAAa,UAAU,aAAa,cAAe,QAAO,CAAC;AAC/D,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAWA,OAAM,IAAI;AAAA,MACrB,WAAWA,OAAM,IAAI,MAAM,IAAI;AAAA,MAC/B,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AAAA,MACzC,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAWA,OAAM,IAAI;AAAA,MACrB,WAAW;AAAA,MACX,OAAO,EAAE,UAAU,qBAAqB,OAAO,QAAQ;AAAA,MACvD,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,IAAM,cAAN,cAA0B,QAA0C;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EAET,YAAY,UAA0BC,QAAc;AAClD,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,SAASA;AACd,SAAK,SAAS,eAAe,QAAQ;AAAA,EACvC;AAAA,EAEA,OAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAA6B;AAC3B,WAAO,KAAK,aAAa,gBAAgB,oBAAoB;AAAA,EAC/D;AAAA,EAEA,YAAY,UAAgC;AAC1C,SAAK,WAAW;AAChB,SAAK,SAAS,eAAe,QAAQ;AACrC,SAAK,KAAK,eAAe,KAAK,YAAY,CAAC;AAC3C,SAAK,KAAK,SAAS,KAAK,MAAM;AAAA,EAChC;AAAA,EAEA,MAAM,KAAK,SAAiB,OAA8D;AACxF,UAAM,KAAK,OAAO,MAAM,CAAC;AACzB,UAAM,UAAU,KAAK,YAAY,MAAM,KAAK,aAAa,SAAS,gBAAgB;AAClF,QAAI,QAAS,OAAM,IAAI,MAAM,OAAO;AACpC,SAAK,UAAU;AACf,UAAMD,OAAM,KAAK,IAAI;AACrB,UAAM,OAAkB;AAAA,MACtB,IAAI,QAAQA,KAAI,SAAS,EAAE,CAAC,IAAI,KAAK,MAAM;AAAA,MAC3C,OAAO,MAAM;AAAA,MACb;AAAA,MACA,WAAWA;AAAA,MACX,WAAW,MAAM,cAAc,OAAO,OAAO,KAAK,IAAI,MAAM,WAAWA,OAAM,GAAG;AAAA,MAChF,OAAO,MAAM;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AACA,SAAK,SAAS,CAAC,GAAG,KAAK,QAAQ,IAAI;AACnC,SAAK,KAAK,SAAS,KAAK,MAAM;AAC9B,WAAO,EAAE,MAAM,KAAK,iCAAiC,KAAK,EAAE,kBAAkB;AAAA,EAChF;AAAA,EAEA,MAAM,OAAO,IAA2B;AACtC,UAAM,KAAK,OAAO,MAAM,CAAC;AACzB,QAAI,CAAC,KAAK,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,EAAG,OAAM,IAAI,MAAM,6BAA6B;AAC9F,SAAK,SAAS,KAAK,OAAO,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE;AACzD,SAAK,KAAK,SAAS,KAAK,MAAM;AAAA,EAChC;AACF;;;ACzEA,IAAM,QAAQ;AACd,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAMf,SAAS,WAAmB;AAC1B,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,OAAe;AACtB,SAAO;AAAA,IACL,EAAE,MAAM,YAAY,MAAM,+DAA+D;AAAA,IACzF;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QACE;AAAA,MACF,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,OAAe;AACtB,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QACE;AAAA,MACF,OAAO,CAAC,KAAK;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,CAAC,KAAK;AAAA,MACb,OAAO;AAAA,MACP,QAAQ,OAAO,EAAE,OAAAE,QAAO,QAAQ,MAAM;AACpC,cAAM,SAAS,MAAMA,OAAM,KAAK,KAAK;AACrC,cAAMA,OAAM,MAAM,OAAO,SAAS,QAAQ,OAAO;AAAA,MACnD;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QACE;AAAA,QACF,OAAO;AAAA;AAAA;AAAA,EAA6G,MAAM;AAAA,MAC5H;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,SAAiB;AACxB,QAAM,MAAM;AACZ,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,YAAY,GAAG;AAAA,MACtB,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,EAAE,SAAS,QAAQ,MAAM,QAAQ,KAAK,KAAK,OAAO;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,QAAgB;AACvB,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,CAAC,uBAAuB;AAAA,MAC/B,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QACE;AAAA,MACF,OAAO,CAAC,6BAA6B;AAAA,MACrC,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,SAAiB;AACxB,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QACE;AAAA,MACF,OAAO,CAAC,sCAAsC,0CAA0C;AAAA,MACxF,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,MAAM,OAAe,OAAe,QAAgB,QAAkB,CAAC,GAAS;AACvF,SAAO,EAAE,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,QAAQ,OAAO,OAAO,GAAG;AAC9E;AAEA,SAAS,cAAsB;AAC7B,SAAO;AAAA,IACL,EAAE,MAAM,YAAY,MAAM,kEAAkE;AAAA,IAC5F;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,mCAAmC;AAAA,IACtC;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,kBAAkB,0CAA0C,0BAA0B;AAAA,MAC1F;AAAA,IACF,CAAC;AAAA,IACD,MAAM,0BAA0B,sBAAsB,qBAAqB;AAAA,IAC3E,MAAM,2BAA2B,8CAA8C,eAAe;AAAA,IAC9F;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,IAAM,SAAiC;AAAA,EACrC,sBAAsB;AAAA,EACtB,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,8BAA8B;AAChC;AAEO,SAAS,MAAM,OAA8B;AAClD,SAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,KAAK,QAAwB;AACpC,SAAO;AAAA,IACL,EAAE,MAAM,YAAY,MAAM,6DAA6D;AAAA,IACvF;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QACE;AAAA,MACF,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM,YAAO,OAAO,MAAM,GAAG,EAAE,CAAC;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,MAAc;AACrB,SAAO;AAAA,IACL,EAAE,MAAM,YAAY,MAAM,+CAA+C;AAAA,IACzE;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,UAAU;AAAA,UACR,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,UAC/C,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,CAAC,qBAAqB,iBAAiB,4BAA4B;AAAA,UAC5E,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,KAAK,aAA4C;AACxD,QAAM,QAAQ,YAAY,IAAI,CAAC,eAAe,WAAW,IAAI,EAAE,KAAK,IAAI;AACxE,QAAM,SAAS,YAAY,OAAO,CAAC,eAAe,WAAW,SAAS,OAAO,EAAE;AAC/E,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,QAAQ,YAAY,WAAW,IAAI,mBAAmB,GAAG,YAAY,MAAM,cAAc;AAAA,MAChG,OAAO;AAAA,MACP,QAAQ,YACL;AAAA,QACC,CAAC,eAAe,GAAG,WAAW,IAAI,KAAK,WAAW,QAAQ,KAAK,WAAW,IAAI;AAAA,MAChF,EACC,KAAK,IAAI;AAAA,MACZ,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM,SAAS,KAAK,KAAK,SAAS,eAAe,WAAW,IAAI,aAAa,GAAG,MAAM,SAAS,KAAK,EAAE,oBAAe,YAAY,WAAW,IAAI,OAAO,MAAM;AAAA,IAC/J;AAAA,EACF;AACF;AAEA,IAAM,cAAuC;AAAA,EAC3C,CAAC,2BAA2B,+BAA+B;AAAA,EAC3D,CAAC,cAAc,kCAAkC;AAAA,EACjD,CAAC,6BAA6B,eAAe;AAAA,EAC7C,CAAC,+BAA+B,oBAAoB;AAAA,EACpD,CAAC,kCAAkC,iCAAiC;AACtE;AAEO,SAAS,OACd,QACA,cAAqC,CAAC,GACC;AACvC,QAAM,OAAO,OAAO,YAAY;AAChC,QAAM,aAAa,YAAY,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK;AAC/E,MAAI,YAAY,SAAS,EAAG,QAAO,EAAE,OAAO,KAAK,WAAW,GAAG,WAAW;AAC1E,MAAI,gBAAgB,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,SAAS,GAAG,WAAW;AACvE,MAAI,0BAA0B,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,IAAI,GAAG,WAAW;AAC5E,MAAI,0BAA0B,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,YAAY,GAAG,WAAW;AACpF,MAAI,oBAAoB,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AACzE,MAAI,aAAa,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,KAAK,GAAG,WAAW;AAChE,MAAI,4BAA4B,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,KAAK,GAAG,WAAW;AAC/E,MAAI,8BAA8B,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AACnF,MAAI,iCAAiC,KAAK,IAAI,EAAG,QAAO,EAAE,OAAO,MAAM,GAAG,WAAW;AACrF,SAAO,EAAE,OAAO,KAAK,MAAM,GAAG,WAAW;AAC3C;;;AC/RA,IAAM,QAAQ,oBAAI,IAAoB,CAAC,CAAC,gBAAgB,GAAM,CAAC,CAAC;AAEhE,SAAS,OAAO,MAAwB;AACtC,SAAO,KAAK,MAAM,aAAa,KAAK,CAAC;AACvC;AAEA,SAAS,MAAM,OAAgC;AAC7C,SAAO,MAAM,OAAO,CAAC,KAAK,SAAS;AACjC,QAAI,KAAK,SAAS,OAAQ,QAAO,MAAM,KAAK;AAC5C,QAAI,KAAK,SAAS,OAAQ,QAAO,MAAM;AACvC,WAAO,MAAM,OAAO,KAAK,IAAI,EAAE;AAAA,EACjC,GAAG,CAAC;AACN;AAEA,SAAS,SAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,EAAE,MAAM,MAAM,IAAI;AACvD;AAEO,IAAM,aAAN,cAAyB,QAA0C;AAAA,EACxE;AAAA,EACA,YAAY,oBAAI,IAAuB;AAAA,EACvC,UAAU,oBAAI,IAA2B;AAAA,EACzC,UAAwB,CAAC;AAAA,EACzB,QAA0B;AAAA,EAC1B,YAA2B;AAAA,EAC3B,OAAO,oBAAI,IAA0D;AAAA,EACrE,eAAe,oBAAI,IAAoB;AAAA,EACvC,QAAQ,oBAAI,IAAiB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EAET,YACEC,SACAC,gBACA,SACAC,QACAC,UAAiD,CAAC,GAClDC,UAA4E,CAAC,GAC7E;AACA,UAAM;AACN,SAAK,SAASF;AACd,SAAK,WAAW;AAChB,SAAK,UAAUF,QAAO,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AACnD,eAAW,SAAS,KAAK,SAAS;AAChC,WAAK,UAAU,IAAI,MAAM,IAAI,gBAAgB,CAAC,GAAIC,eAAc,MAAM,EAAE,KAAK,CAAC,CAAE,CAAC,CAAC;AAClF,WAAK,QAAQ,IAAI,MAAM,IAAI,gBAAgB,CAAC,GAAIE,QAAO,MAAM,EAAE,KAAK,CAAC,CAAE,CAAC,CAAC;AAAA,IAC3E;AACA,SAAK,UAAU,KAAK,QAAQ,CAAC,GAAG,MAAM;AACtC,eAAW,EAAE,MAAM,SAAS,KAAKC,SAAQ;AACvC,WAAK,QAAQ,KAAK,EAAE,GAAG,KAAK,CAAC;AAC7B,WAAK,KAAK,IAAI,KAAK,IAAI;AAAA,QACrB;AAAA,UACE,OAAO;AAAA,YACL,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,MAAM;AAAA,YACN,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,OAAO,KAAK;AAAA,YACZ,aAAa;AAAA,YACb,QAAQ;AAAA,UACV;AAAA,UACA,UAAU,gBAAgB,CAAC,GAAG,QAAQ,CAAC;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAyB;AACvB,WAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAAA,EACnD;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,IAA+B;AACpC,WAAO,KAAK,QAAQ,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AAAA,EACrD;AAAA,EAEA,WAAiB;AACf,SAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,EACjC;AAAA,EAEA,IAAI,QAAwB;AAC1B,WAAO,GAAG,MAAM,IAAI,KAAK,OAAO;AAAA,EAClC;AAAA,EAEA,OAAO,IAAkB;AACvB,UAAM,QAAQ,KAAK,OAAO,EAAE;AAC5B,QAAI,CAAC,MAAO;AACZ,SAAK,UAAU;AACf,UAAM,SAAS;AACf,SAAK,KAAK,UAAU,EAAE;AACtB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,SAAS,SAAqC;AAC5C,WAAO,CAAC,GAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,CAAE;AAAA,EAChD;AAAA,EAEA,MAAM,SAAyC;AAC7C,WAAO,CAAC,GAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAE;AAAA,EAC9C;AAAA,EAEA,KAAK,SAA0B;AAC7B,WAAO,KAAK,MAAM,IAAI,OAAO;AAAA,EAC/B;AAAA,EAEA,WAAW,SAAgC;AACzC,WAAO,KAAK,aAAa,IAAI,OAAO,KAAK;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAiB,IAAkC;AACvD,eAAW,WAAW,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,GAAG;AACvD,UAAI,QAAQ,SAAS,UAAU,QAAQ,KAAK,OAAO,GAAI,QAAO,QAAQ;AACtE,UAAI,QAAQ,SAAS,YAAa;AAClC,iBAAW,QAAQ,QAAQ;AACzB,YAAI,KAAK,SAAS,UAAU,KAAK,KAAK,OAAO,GAAI,QAAO,KAAK;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,SAAiB,SAAoD;AACnF,UAAM,KAAK,OAAO,MAAM,EAAE;AAC1B,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ,CAAC,KAAK,EAAE;AAClD,WAAO,QAAQ,MAAM,MAAM,KAAK,IAAI;AAAA,EACtC;AAAA,EAEA,MAAM,SAAiB,SAAwB;AAC7C,SAAK,UAAU,IAAI,OAAO,GAAG,KAAK,OAAO;AACzC,SAAK,KAAK,WAAW,EAAE,SAAS,QAAQ,CAAC;AAAA,EAC3C;AAAA,EAEA,QAAQ,SAAiBC,SAA2B;AAClD,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,QAAI,CAAC,SAAS,MAAM,WAAWA,QAAQ;AACvC,UAAM,SAASA;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,SAAiB,OAAgC;AACrD,UAAM,SAAS,MAAM,IAAI,OAAO;AAChC,UAAM,QAAQ,MAAM,KAAK;AACzB,QAAI,CAAC,UAAU,CAAC,MAAO,QAAO;AAC9B,WAAO,UAAU,QAAQ,KAAK,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,QACJ,SACA,OACA,MACA,MACA,KACe;AACf,eAAW,SAAS,OAAO,IAAI,GAAG;AAChC,YAAM,KAAK,OAAO,MAAM,IAAI,IAAI;AAChC,UAAI,IAAI,QAAS;AACjB,WAAK,QAAQ;AACb,WAAK,KAAK,WAAW,EAAE,SAAS,SAAS,MAAM,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,MACJ,SACA,OACA,MACA,KACe;AACf,SAAK,QAAQ,SAAS,SAAS;AAC/B,UAAMC,QAAO;AAAA,MACX,IAAI,KAAK,IAAI,GAAG;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO,KAAK;AAAA,IACd;AACA,UAAM,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAAA,MAAK,CAAC;AACvC,SAAK,KAAK,WAAW,EAAE,SAAS,SAAS,MAAM,CAAC;AAChD,UAAM,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI,IAAI;AAC7C,UAAM,OAAO,IAAI,UACb,EAAE,QAAQ,aAAsB,QAAQ,UAAU,IAClD,EAAE,QAAQ,QAAiB,QAAQ,KAAK,OAAO;AACnD,QAAI,CAAC,IAAI,QAAS,OAAM,KAAK,SAAS,EAAE,GAAG,KAAK,UAAU,QAAQ,CAAC;AACnE,WAAO,OAAOA,OAAM,IAAI;AACxB,SAAK,KAAK,WAAW,EAAE,SAAS,SAAS,MAAM,CAAC;AAAA,EAClD;AAAA,EAEA,MAAM,MAAM,SAAiB,OAAyB,MAAY,KAAyB;AACzF,QAAI,KAAK,SAAS,OAAQ,QAAO,KAAK,MAAM,SAAS,OAAO,MAAM,GAAG;AACrE,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,KAAK,OAAO,MAAM,IAAI,IAAI,IAAI;AACpC,UAAI,IAAI,QAAS;AACjB,YAAM,MAAM,KAAK,gBAAgB,KAAK,IAAI,CAAgB;AAC1D,WAAK,KAAK,WAAW,EAAE,SAAS,SAAS,MAAM,CAAC;AAChD;AAAA,IACF;AACA,SAAK,QAAQ,SAAS,UAAU;AAChC,UAAM,OAAO,EAAE,MAAM,KAAK,MAAM,MAAM,GAAG;AACzC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,KAAK,QAAQ,SAAS,OAAO,MAAM,KAAK,MAAM,GAAG;AAAA,EACzD;AAAA,EAEA,SAAS,SAAiB,OAAuB;AAC/C,UAAM,UAAuB;AAAA,MAC3B,IAAI,KAAK,IAAI,GAAG;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,WAAW,KAAK,IAAI;AAAA,MACpB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,GAAI,MAAM,aAAa,SAAS,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,IACxE;AACA,SAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,GAAG,OAAO,CAAC;AAC3D,SAAK,KAAK,YAAY,OAAO;AAAA,EAC/B;AAAA,EAEA,QAAQ,SAAiB,WAAyB;AAChD,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,MAAM,OAAO,EAAE,OAAO,CAAC,YAAY,QAAQ,OAAO,SAAS;AAAA,IAClE;AACA,SAAK,KAAK,YAAY,OAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,SAAmB,WAAqC;AAC5D,WAAO;AAAA,MACL,IAAI,KAAK,IAAI,GAAG;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,QAAQ,KAAK,KAAK;AAAA,MACxB,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA,GAAI,cAAc,UAAU,EAAE,MAAM,QAAiB,IAAI,CAAC;AAAA,MAC1D,GAAI,QAAQ,aAAa,SAAS,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,OAAO,OAAiC;AACtC,WAAO;AAAA,MACL,IAAI,KAAK,IAAI,GAAG;AAAA,MAChB,MAAM;AAAA,MACN,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAiB,OAAyC;AACnE,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,CAAC,KAAK,OAAO,OAAO,KAAM,CAAC,QAAQ,KAAK,KAAK,KAAK,CAAC,QAAQ,aAAa,OAAS;AACrF,UAAM,MAAM,KAAK,MAAM,IAAI,OAAO;AAClC,QAAI,OAAO,QAAQ,SAAS,SAAS;AACnC,WAAK,SAAS,SAAS,OAAO;AAC9B;AAAA,IACF;AACA,QAAI,KAAK;AACP,UAAI,OAAO,KAAK,OAAO;AACvB;AAAA,IACF;AACA,UAAM,KAAK,KAAK,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EAEA,MAAM,KAAK,SAAiB,SAAmB,WAAuC;AACpF,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,UAAM,SAAS,QAAQ,KAAK,KAAK;AACjC,SAAK,aAAa,OAAO,OAAO;AAChC,UAAM,MAAW,EAAE,SAAS,OAAO,QAAQ,CAAC,GAAG,MAAM,EAAE;AACvD,SAAK,MAAM,IAAI,SAAS,GAAG;AAC3B,SAAK,MAAM,SAAS,KAAK,MAAM,SAAS,SAAS,CAAC;AAClD,QAAI,QAAQ,KAAK,OAAO,MAAM,KAAK;AACnC,SAAK,MAAM,SAAS,KAAK;AACzB,QAAI,EAAE,OAAO,WAAW,IAAI,OAAO,QAAQ,QAAQ,eAAe,CAAC,CAAC;AACpE,QAAI,OAAO,KAAK,MAAM,SAAS,KAAK;AACpC,WAAO,MAAM,UAAU,CAAC,IAAI,SAAS;AACnC,YAAM,KAAK,MAAM,SAAS,OAAO,MAAM,CAAC,GAAW,GAAG;AACtD,cAAQ,MAAM,MAAM,CAAC;AACrB,UAAI,IAAI,OAAO,UAAU,CAAC,IAAI,WAAW,MAAM,QAAQ;AACrD,cAAM,SAAS;AACf,aAAK,KAAK,WAAW,EAAE,SAAS,SAAS,MAAM,CAAC;AAChD,cAAM,SAAS,IAAI,OAAO,OAAO,CAAC;AAClC,mBAAW,SAAS,OAAQ,MAAK,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,CAAC;AAC1E,cAAM,SAAS,OAAO,GAAG,EAAE;AAC3B,SAAC,EAAE,OAAO,WAAW,IAAI,OAAO,OAAO,KAAK,KAAK,GAAG,OAAO,eAAe,CAAC,CAAC;AAC5E,YAAI,OAAO,KAAK,MAAM,SAAS,KAAK;AACpC,gBAAQ,KAAK,OAAO,MAAM,KAAK;AAC/B,aAAK,MAAM,SAAS,KAAK;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,SAAS,IAAI,UACf,YACA,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,IAC9C,UACA;AACN,UAAM,QAAQ;AAAA,MACZ,OAAO,OAAO,OAAO,SAAS;AAAA,MAC9B,QAAQ,MAAM,MAAM,MAAM,SAAS;AAAA,MACnC,MAAM;AAAA,IACR;AACA,QAAI,KAAK,MAAM,IAAI,OAAO,MAAM,IAAK,MAAK,MAAM,OAAO,OAAO;AAC9D,UAAM,cAAc,KAAK,IAAI,MAAM,KAAK,OAAO,MAAM,cAAc,QAAQ,GAAG,IAAI,GAAG;AACrF,QAAI,YAAY,KAAK,QAAS,OAAM,UAAU;AAC9C,QAAI,CAAC,IAAI,QAAS,MAAK,aAAa,IAAI,SAAS,UAAU;AAC3D,SAAK,KAAK,WAAW,EAAE,SAAS,SAAS,MAAM,CAAC;AAChD,UAAM,SAAS;AACf,SAAK,SAAS;AACd,UAAM,OAAO,IAAI,OAAO,OAAO,CAAC;AAChC,QAAI,IAAI,SAAS;AACf,iBAAW,SAAS,KAAM,MAAK,SAAS,SAAS,KAAK;AAAA,IACxD,WAAW,KAAK,QAAQ;AACtB,YAAM,OAAO,KAAK,IAAI;AACtB,iBAAW,SAAS,KAAM,MAAK,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,CAAC;AACxE,YAAM,KAAK,KAAK,SAAS,MAAM,OAAO;AACtC;AAAA,IACF;AACA,UAAM,KAAK,OAAO,OAAO;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAO,SAAgC;AAC3C,QAAI,KAAK,KAAK,OAAO,EAAG;AACxB,UAAM,CAAC,MAAM,GAAG,IAAI,IAAI,KAAK,MAAM,OAAO;AAC1C,QAAI,CAAC,KAAM;AACX,SAAK,QAAQ,IAAI,SAAS,IAAI;AAC9B,SAAK,KAAK,YAAY,OAAO;AAC7B,UAAM,KAAK,KAAK,SAAS,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,YAAY,GAAG,WAAW;AAAA,EAC1F;AAAA,EAEA,KAAK,SAAuB;AAC1B,UAAM,MAAM,KAAK,MAAM,IAAI,OAAO;AAClC,QAAI,IAAK,KAAI,UAAU;AACvB,SAAK,MAAM,OAAO,OAAO;AAAA,EAC3B;AAAA,EAEA,MAAM,SAAiBC,OAA0D;AAC/E,WAAO,KAAK,UAAU,IAAI,OAAO,GAAG,KAAKA,KAAI;AAAA,EAC/C;AAAA,EAEA,OAAO,SAAiB,YAAoB,QAAsB;AAChE,UAAM,UAAU,KAAK;AAAA,MACnB;AAAA,MACA,CAAC,cACC,UAAU,SAAS,eACnB,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,cAAc,KAAK,SAAS,OAAO,UAAU;AAAA,IAC9F;AACA,QAAI,CAAC,QAAS;AACd,eAAW,QAAQ,QAAQ,OAAO;AAChC,UAAI,KAAK,SAAS,cAAc,KAAK,SAAS,OAAO,YAAY;AAC/D,aAAK,SAAS,QAAQ;AACtB,aAAK,SAAS,SAAS;AAAA,MACzB;AAAA,IACF;AACA,SAAK,KAAK,WAAW,EAAE,SAAS,QAAQ,CAAC;AAAA,EAC3C;AAAA,EAEA,YAAY,SAAiB,WAAmB,OAA4C;AAC1F,UAAM,UAAU,KAAK,MAAM,SAAS,CAAC,cAAc,UAAU,OAAO,SAAS;AAC7E,QAAI,SAAS,SAAS,OAAQ;AAC9B,YAAQ,QAAQ;AAChB,SAAK,KAAK,WAAW,EAAE,SAAS,QAAQ,CAAC;AAAA,EAC3C;AAAA,EAEA,QAAQ,SAAuB;AAC7B,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,QAAI,CAAC,MAAO;AACZ,UAAM,UAAmB;AAAA,MACvB,IAAI,KAAK,IAAI,GAAG;AAAA,MAChB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,SAAK,MAAM,SAAS,OAAO;AAC3B,SAAK,KAAK,OAAO,MAAM,EAAE,EAAE,KAAK,MAAM;AACpC,aAAO,OAAO,SAAS;AAAA,QACrB,OAAO;AAAA,QACP,MAAM;AAAA,MACR,CAAC;AACD,YAAM,cAAc;AACpB,WAAK,KAAK,WAAW,EAAE,SAAS,QAAQ,CAAC;AACzC,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,SAAiB,WAA6C;AACzE,UAAM,WAAW,KAAK,UAAU,IAAI,OAAO;AAC3C,UAAMC,MAAK,UAAU,UAAU,CAAC,YAAY,QAAQ,OAAO,SAAS,KAAK;AACzE,QAAI,CAAC,YAAYA,MAAK,EAAG,QAAO;AAChC,UAAM,OAAO,SAAS,MAAM,GAAGA,GAAE,EAAE,cAAc,CAAC,YAAY,QAAQ,SAAS,MAAM;AACrF,QAAI,OAAO,EAAG,QAAO;AACrB,UAAM,OAAO,SAAS,IAAI;AAC1B,UAAM,QAAQ,SAAS,OAAO,IAAI,EAAE,OAAO,CAAC,YAAY,QAAQ,SAAS,MAAM,EAAE;AACjF,aAAS,KAAK;AAAA,MACZ,IAAI,WAAW,KAAK,IAAI,CAAC;AAAA,MACzB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,UAAU,IAAI,mBAAmB,WAAW,KAAK;AAAA,MACxD,MACE,UAAU,IACN,wCACA;AAAA,MACN,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AACD,SAAK,KAAK,YAAY,OAAO;AAC7B,WAAO,EAAE,MAAM,KAAK,MAAM,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC,EAAG;AAAA,EAC3F;AAAA,EAEA,MAAM,SAAuB;AAC3B,QAAI,CAAC,KAAK,UAAU,IAAI,OAAO,EAAG;AAClC,SAAK,MAAM,IAAI,OAAO,GAAG,OAAO,OAAO,CAAC;AACxC,SAAK,KAAK,OAAO;AACjB,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,UAAM,WAAW,KAAK,UAAU,IAAI,OAAO;AAC3C,QAAI,MAAM,SAAS,UAAU,SAAS,OAAQ,MAAK,QAAQ,OAAO,QAAQ;AAC1E,SAAK,UAAU,IAAI,SAAS,CAAC,CAAC;AAC9B,SAAK,QAAQ,IAAI,SAAS,CAAC,CAAC;AAC5B,SAAK,aAAa,OAAO,OAAO;AAChC,SAAK,KAAK,YAAY,OAAO;AAAA,EAC/B;AAAA,EAEA,QAAQ,OAAc,UAA2B;AAC/C,UAAM,KAAK,GAAG,MAAM,EAAE,SAAS,KAAK,QAAQ;AAC5C,UAAM,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM;AAChE,SAAK,QAAQ,QAAQ;AAAA,MACnB;AAAA,MACA,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,OAAO,OAAO,SAAS,SAAS,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,MAChE,OAAO,MAAM;AAAA,MACb,UAAU,SAAS;AAAA,MACnB,UAAU,KAAK,IAAI;AAAA,IACrB,CAAC;AACD,SAAK,KAAK,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,QAAQ,QAAQ,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC;AACpF,SAAK,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,EACnC;AAAA,EAEA,SAAS,SAAiB,OAAqB;AAC7C,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,QAAI,CAAC,MAAO;AACZ,UAAM,QAAQ;AACd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,YAAY,SAAiB,UAA0B;AACrD,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,QAAI,CAAC,MAAO;AACZ,UAAM,WAAW;AACjB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,QAAqC;AACzC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,SAAS,SAA0C;AACjD,QAAI,KAAK,OAAO,OAAO,GAAG,SAAS,OAAQ,QAAO,CAAC;AACnD,WAAO;AAAA,MACL,EAAE,MAAM,UAAU,aAAa,wCAAwC,MAAM,SAAS;AAAA,MACtF,EAAE,MAAM,aAAa,aAAa,kCAAkC,MAAM,QAAQ;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAAA,EAAC;AAAA,EAE9B,YAAY,UAAkBC,OAAqB;AACjD,UAAM,SAAS,KAAK,OAAO,QAAQ;AACnC,UAAM,QAAe;AAAA,MACnB,IAAI,KAAK,IAAI,OAAO;AAAA,MACpB,MAAAA;AAAA,MACA,MAAM;AAAA,MACN,UAAU,QAAQ,SAAS,SAAS,OAAO,KAAM,QAAQ,YAAY;AAAA,MACrE,QAAQ;AAAA,MACR,OAAO,QAAQ,SAAS;AAAA,MACxB,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AACA,SAAK,QAAQ,KAAK,KAAK;AACvB,SAAK,UAAU,IAAI,MAAM,IAAI,CAAC,CAAC;AAC/B,QAAI,QAAQ;AACV,WAAK,MAAM,UAAU;AAAA,QACnB,IAAI,KAAK,IAAI,GAAG;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAOA;AAAA,QACP,MAAM;AAAA,QACN,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,IACH;AACA,SAAK,SAAS;AACd,WAAO,EAAE,GAAG,MAAM;AAAA,EACpB;AAAA,EAEA,MAAM,KAAK,SAAgC;AACzC,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,QAAI,OAAO,SAAS,QAAS,OAAM,IAAI,MAAM,4BAA4B;AACzE,SAAK,KAAK,OAAO;AACjB,SAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,cAAc,cAAc,KAAK;AACrE,SAAK,UAAU,OAAO,OAAO;AAC7B,SAAK,QAAQ,OAAO,OAAO;AAC3B,SAAK,aAAa,OAAO,OAAO;AAChC,QAAI,KAAK,YAAY,QAAS,MAAK,OAAO,MAAM,YAAa,KAAK,QAAQ,CAAC,EAAY,EAAE;AACzF,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,WAAWA,OAA8B;AAC7C,UAAM,UAAUA,MAAK,KAAK;AAC1B,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,qBAAqB;AACnD,QAAI,KAAK,QAAQ,KAAK,CAACC,WAAUA,OAAM,SAAS,UAAUA,OAAM,SAAS,OAAO,GAAG;AACjF,YAAM,IAAI,MAAM,gBAAgB,OAAO,iBAAiB;AAAA,IAC1D;AACA,UAAM,QAAe;AAAA,MACnB,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACzB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AACA,SAAK,QAAQ,KAAK,KAAK;AACvB,SAAK,UAAU,IAAI,MAAM,IAAI,CAAC,CAAC;AAC/B,SAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAC;AAC7B,SAAK,SAAS;AACd,WAAO,EAAE,GAAG,MAAM;AAAA,EACpB;AAAA,EAEA,KAAK,SAAiB,SAAsB,OAAe,MAAc,MAAqB;AAC5F,QAAI,CAAC,KAAK,OAAO,OAAO,EAAG;AAC3B,SAAK,MAAM,SAAS;AAAA,MAClB,IAAI,KAAK,IAAI,GAAG;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,OAAyB;AACvB,WAAO,KAAK,SAAS,EAAE,GAAG,KAAK,MAAM;AAAA,EACvC;AAAA,EAEA,QAAQ,MAA8B;AACpC,SAAK,QAAQ,QAAQ,EAAE,GAAG,KAAK;AAC/B,SAAK,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC/B;AAAA,EAEA,WAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,MAA2B;AACrC,SAAK,YAAY,QAAQ;AACzB,SAAK,KAAK,YAAY,KAAK,SAAS;AAAA,EACtC;AAAA,EAEA,SAAgC;AAC9B,UAAM,OAAO,KAAK,QACf,OAAO,CAAC,UAAU,CAAC,MAAM,MAAM,EAC/B,IAAI,CAAC,UAAsB;AAC1B,YAAM,WAAW,KAAK,UAAU,IAAI,MAAM,EAAE;AAC5C,YAAM,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM;AAChE,aAAO;AAAA,QACL,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,OAAO,OAAO,SAAS,SAAS,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,QAChE,OAAO,MAAM;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS,GAAG,EAAE,GAAG,aAAa;AAAA,MAC1C;AAAA,IACF,CAAC;AACH,WAAO,CAAC,GAAG,MAAM,GAAG,KAAK,QAAQ,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;AAAA,EAC/D;AAAA,EAEA,OAAO,SAAuB;AAC5B,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,QAAI,OAAO,SAAS,UAAU,MAAM,OAAQ;AAC5C,SAAK,KAAK,OAAO;AACjB,UAAM,SAAS,KAAK,QAAQ;AAAA,MAC1B,CAAC,cAAc,UAAU,OAAO,WAAW,UAAU,aAAa;AAAA,IACpE;AACA,UAAM,WAAW,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC;AACjD,UAAM,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM;AAChE,SAAK,QAAQ,QAAQ;AAAA,MACnB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,OAAO,OAAO,SAAS,SAAS,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,MAChE,OAAO,MAAM;AAAA,MACb,UAAU,SAAS;AAAA,MACnB,UAAU,KAAK,IAAI;AAAA,IACrB,CAAC;AACD,SAAK,KAAK;AAAA,MACR;AAAA,MACA,OAAO,IAAI,CAAC,YAAY;AAAA,QACtB,OAAO,EAAE,GAAG,QAAQ,QAAQ,OAAgB;AAAA,QAC5C,UAAU,KAAK,UAAU,IAAI,OAAO,EAAE;AAAA,MACxC,EAAE;AAAA,IACJ;AACA,eAAW,UAAU,OAAQ,MAAK,KAAK,OAAO,EAAE;AAChD,SAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,cAAc,CAAC,OAAO,SAAS,SAAS,CAAC;AAC7E,eAAW,UAAU,OAAQ,MAAK,UAAU,OAAO,OAAO,EAAE;AAC5D,QAAI,KAAK,YAAY,QAAS,MAAK,UAAU,KAAK,QAAQ,CAAC,GAAG,MAAM;AACpE,SAAK,KAAK,UAAU,KAAK,OAAO,CAAC;AACjC,SAAK,KAAK,UAAU,KAAK,OAAO;AAChC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,KAAK,IAA0B;AAC7B,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,KAAK;AACR,YAAM,QAAQ,KAAK,OAAO,EAAE;AAC5B,UAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,aAAO,MAAM;AACb,WAAK,SAAS;AACd,aAAO,EAAE,GAAG,MAAM;AAAA,IACpB;AACA,UAAM,MAAM,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACtD,QAAI,IAAI,SAAS,WAAW,IAAI,SAAS,SAAS;AAChD,YAAM,CAAC,EAAE,OAAO,SAAS,CAAC,IAAI;AAC9B,YAAM,OAAc;AAAA,QAClB,GAAG;AAAA,QACH,IAAI,GAAG,EAAE,SAAS,KAAK,QAAQ;AAAA,QAC/B,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AACA,WAAK,QAAQ,KAAK,IAAI;AACtB,WAAK,UAAU,IAAI,KAAK,IAAI,gBAAgB,QAAQ,CAAC;AACrD,WAAK,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC;AAC5B,UAAI,WAAW,KAAK;AACpB,WAAK,KAAK,UAAU,KAAK,OAAO,CAAC;AACjC,WAAK,OAAO,KAAK,EAAE;AACnB,aAAO,EAAE,GAAG,KAAK;AAAA,IACnB;AACA,SAAK,KAAK,OAAO,EAAE;AACnB,SAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE;AAC3D,eAAW,EAAE,OAAO,SAAS,KAAK,KAAK;AACrC,WAAK,QAAQ,KAAK,KAAK;AACvB,WAAK,UAAU,IAAI,MAAM,IAAI,QAAQ;AACrC,WAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAC;AAAA,IAC/B;AACA,SAAK,KAAK,UAAU,KAAK,OAAO,CAAC;AACjC,SAAK,OAAO,EAAE;AACd,WAAO,EAAE,GAAG,IAAI,CAAC,EAAE,MAAM;AAAA,EAC3B;AAAA,EAEA,QAAQ,IAAkB;AACxB,SAAK,KAAK,OAAO,EAAE;AACnB,SAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE;AAC3D,SAAK,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,EACnC;AACF;;;ACrrBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;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",
|
|
6
|
+
"names": ["now", "now", "harbor", "at", "tabs", "clock", "script", "index", "files", "now", "clock", "files", "agents", "conversations", "clock", "queues", "frozen", "status", "tool", "test", "at", "name", "agent", "day", "name", "directories", "clock", "now", "files", "status", "at", "minutes", "label", "name", "index", "units", "suggestions", "files", "start", "at", "minutes", "memories", "memory", "index", "terminals", "files", "tray", "agents", "status", "now", "clock", "files", "status", "mounted", "at", "node", "sprinkles", "files", "files", "clock", "name", "terminals", "files", "clock", "status", "clock", "label", "name", "at", "clock", "minute", "hour", "day", "now", "status", "name", "labels", "label", "page", "accounts", "tabs", "sprinkles", "pending", "files", "status"]
|
|
7
7
|
}
|