@ai-ecoverse/slicc-spectrum 1.32.1 → 1.33.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 +1 -1
- package/dist/slicc-dummy.js +8 -4
- package/dist/slicc-dummy.js.map +2 -2
- package/dist/slicc-ui.js +2592 -2562
- package/dist/slicc-ui.js.map +4 -4
- package/dist/types/app/base.d.ts +2 -1
- package/dist/types/app/chat.d.ts +2 -0
- package/dist/types/model/types.d.ts +2 -0
- package/package.json +1 -1
package/dist/slicc-dummy.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/dummy/script.ts", "../src/dummy/agent.ts", "../src/dummy/browser.ts", "../src/dummy/sprinkles/suggestions.shtml", "../src/dummy/sprinkles/welcome.shtml", "../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/sprinkles.ts", "../src/dummy/shell.ts", "../src/dummy/terminals.ts", "../src/dummy/tray.ts", "../src/dummy/updates.ts", "../src/dummy/index.ts"],
|
|
4
|
-
"sourcesContent": ["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 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 [/\\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 (/\\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 AgentPort,\n AgentStatus,\n AssistantMessage,\n DeliveredAs,\n FrozenCone,\n LickChannel,\n LickState,\n Message,\n MessagePart,\n Outgoing,\n SlashCommand,\n Thinking,\n UserMessage,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { type Effects, type Step, script } from './script.ts';\n\ninterface Run {\n stopped: boolean;\n steers: Outgoing[];\n}\n\nfunction chunks(text: string): string[] {\n return text.match(/\\S+\\s*|\\s+/g) ?? [];\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 #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\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 #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 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();\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);\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);\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: [] };\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 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 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.stop(agentId);\n this.#messages.set(agentId, []);\n this.#suggestions.delete(agentId);\n this.emit('messages', agentId);\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 frozen(): readonly FrozenCone[] {\n return 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 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 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", "import { Emitter } from '../model/emitter.ts';\nimport type { 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 function page(tab: BrowserTab): 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%)\"/></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\nexport class DummyBrowser extends Emitter<BrowserEvents> implements BrowserPort {\n #tabs: BrowserTab[];\n #active: string | null;\n #clock: Clock;\n #next = 1;\n\n constructor(tabs: readonly BrowserTab[], clock: Clock) {\n super();\n this.#clock = clock;\n this.#tabs = tabs.map((tab) => ({ ...tab }));\n this.#active = this.#tabs[0]?.id ?? null;\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 #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): void {\n void this.#clock.sleep(15).then(() => {\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 this.#changed();\n this.#load(tab.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", "<!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", "import type { FrozenCone, Memory, Message, Sprinkle, TrayStatus } from '../model/types.ts';\nimport suggestions from './sprinkles/suggestions.shtml';\nimport welcome from './sprinkles/welcome.shtml';\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 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 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 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\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\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 } 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 eject?: (path: string) => Promise<void>;\n needsFolder?: () => readonly string[];\n #mounted = new Set<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.mounts = () => [...this.#mounted];\n this.eject = (path) => this.#eject(path);\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.after === null) this.#contents.delete(change.path);\n else 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.#contents.delete(path);\n else this.#put(path, change.before, Date.now());\n this.#announce(path);\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 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('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];\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' } 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-opus-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 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 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 work(): Message[] {\n return [\n {\n id: 'k-m4',\n role: 'assistant',\n status: 'done',\n createdAt: at(14),\n parts: [\n { type: 'text', text: 'Here is where things stand.' },\n {\n type: 'card',\n card: {\n variant: 'pr',\n number: 58,\n title: 'Add retries for upstream timeouts',\n branch: 'fix/retry-upstream',\n checks: '4 of 4 checks passed',\n additions: 42,\n deletions: 7,\n files: 3,\n tone: 'positive',\n },\n },\n {\n type: 'card',\n card: {\n variant: 'tool',\n title: 'Visual regression suite',\n badge: 'bash',\n status: '2 snapshots changed',\n files: ['forecast-card.png', 'forecast-card-dark.png'],\n tone: 'notice',\n },\n },\n {\n type: 'card',\n card: {\n variant: 'light',\n title: 'Staging is healthy',\n detail: '/health answered in 2 ms',\n tone: 'informative',\n },\n },\n {\n type: 'plan',\n items: [\n 'Merge the retry pull request',\n 'Move the cache to KV',\n 'Update the forecast docs to Celsius',\n 'Tag 1.9.0',\n ],\n },\n {\n type: 'check',\n items: [\n { text: 'TTL fix merged' },\n { text: 'Retries reviewed', tone: 'informative' },\n { text: 'Docs pass running', tone: 'notice' },\n { text: 'KV migration not started', tone: 'negative' },\n ],\n },\n {\n type: 'diff',\n path: '/workspace/harbor/src/lib/units.ts',\n before:\n 'export function toCelsius(f: number): number {\\n return ((f - 32) * 5) / 9;\\n}\\n',\n after:\n 'export function toCelsius(f: number): number {\\n return Math.round(((f - 32) * 5) / 9);\\n}\\n',\n },\n {\n type: 'link',\n url: 'https://api.example.com/docs/v2/forecast',\n title: 'Forecast API reference',\n description: 'Parameters, units and rate limits for /v2/forecast.',\n },\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 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 fell back',\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 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 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: 'This cone now uses Claude Opus 5.5.',\n createdAt: at(1478),\n },\n ];\n}\n\nexport function showcase(): Message[] {\n return [...opening(), ...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/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\nexport const models: ModelOption[] = [\n { id: 'claude-opus-5-5', label: 'Claude Opus 5.5', provider: 'Anthropic' },\n { id: 'claude-sonnet-5-5', label: 'Claude Sonnet 5.5', provider: 'Anthropic' },\n { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5', provider: 'Anthropic' },\n { id: 'local-small', label: 'Local (ort-llama)', provider: 'This browser' },\n];\n\nexport const defaults: Settings = {\n color: 'system',\n model: 'claude-sonnet-5-5',\n thinking: 'medium',\n sendOnEnter: true,\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\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.09,\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.62,\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 },\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 },\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 MonitorEvents,\n MonitorPort,\n MonitorRow,\n MonitorSnapshot,\n MonitorStatus,\n SliccModel,\n} from '../model/types.ts';\n\nconst statuses: Record<string, MonitorStatus> = {\n idle: 'idle',\n thinking: 'active',\n working: 'active',\n waiting: 'warn',\n error: 'error',\n};\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 class DummyMonitor extends Emitter<MonitorEvents> implements MonitorPort {\n #model: Omit<SliccModel, 'monitor'>;\n #tick = 0;\n\n constructor(model: Omit<SliccModel, 'monitor'>) {\n super();\n this.#model = model;\n const update = () => this.resync();\n model.agent.on('agents', update);\n model.terminals.on('terminals', update);\n model.browser.on('tabs', update);\n model.files.on('changes', update);\n model.tray.on('status', update);\n }\n\n snapshot(): MonitorSnapshot {\n const { agent, terminals, browser, files, sprinkles, tray } = this.#model;\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 agentRows = agents.map(\n (candidate): MonitorRow => ({\n name: candidate.kind === 'scoop' ? `\u21B3 ${candidate.name}` : candidate.name,\n meta: `${candidate.status} \u00B7 ${Math.round(candidate.contextFill * 100)}% context`,\n status: statuses[candidate.status],\n badges: candidate.unread ? [`${candidate.unread} unread`] : [],\n })\n );\n return {\n updatedAt: Date.now(),\n vitals: [\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 {\n id: 'spend',\n label: 'Spend',\n value: `$${status.spent.toFixed(2)}`,\n delta: `$${status.rate.toFixed(2)}/h`,\n series: wave(this.#tick + 7),\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 id: 'context',\n label: 'Fullest context',\n value: `${Math.round(fill * 100)}%`,\n ratio: fill,\n },\n ],\n alerts: [\n ...agents\n .filter((candidate) => candidate.contextFill >= 0.6)\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 { id: 'agents', label: 'Cones and scoops', rows: agentRows },\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: files\n .changes()\n .map((change) => ({ name: change.path, meta: change.status, status: 'warn' as const })),\n },\n {\n id: 'sprinkles',\n label: 'Sprinkles',\n rows: sprinkles.list().map((sprinkle) => ({\n name: sprinkle.title,\n meta: sprinkle.name,\n status: 'idle' 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 { NetworkPort, NetworkStatus } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type NetworkScenario = 'ok' | 'limited' | 'failing';\n\nconst minute = 60_000;\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: 'proxy',\n health: 'ok',\n detail: 'slicc-node on localhost:5710 reaches every site.',\n failures: [],\n extensionUrl,\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 };\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 };\n}\n\nexport class DummyNetwork extends Emitter<{ network: NetworkStatus }> implements NetworkPort {\n scenario: NetworkScenario;\n #status: NetworkStatus;\n #clock: Clock;\n\n constructor(scenario: NetworkScenario, clock: Clock) {\n super();\n this.scenario = scenario;\n this.#status = networkFixtures(scenario);\n this.#clock = clock;\n }\n\n status(): NetworkStatus {\n return this.#status;\n }\n\n setScenario(scenario: NetworkScenario): void {\n this.scenario = scenario;\n this.#status = networkFixtures(scenario);\n this.emit('network', this.#status);\n }\n\n async check(): Promise<void> {\n await this.#clock.sleep(4);\n this.#status = networkFixtures(this.scenario);\n this.emit('network', this.#status);\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 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 cwd: string;\n closed = false;\n\n constructor(sink: TerminalSink, files: FilePort, cwd: string, clock: Clock) {\n this.#sink = sink;\n this.#files = files;\n this.#clock = clock;\n this.cwd = cwd;\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') this.cwd = 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(files: FilePort, cwd: string, clock: Clock): TerminalBackend {\n return { open: (sink) => new FakeShell(sink, files, cwd, clock) };\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 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);\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 { UpdateAction, UpdateItem, UpdateKind, UpdatesPort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type UpdateScenario = 'current' | 'boot' | 'available' | 'restart' | 'failure';\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 === '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\nexport class DummyUpdates extends Emitter<{ items: readonly UpdateItem[] }> implements UpdatesPort {\n #items: readonly UpdateItem[];\n #ready: boolean;\n #clock: Clock;\n\n constructor(scenario: UpdateScenario, clock: Clock) {\n super();\n this.#items = updateFixtures(scenario);\n this.#ready = scenario !== 'boot';\n this.#clock = clock;\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';\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 type { SliccModel } from '../model/types.ts';\nimport { DummyAgent } from './agent.ts';\nimport { DummyBrowser } from './browser.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 { DummyMemory } from './memory.ts';\nimport { DummyMonitor } from './monitor.ts';\nimport { DummyNetwork, type NetworkScenario } from './network.ts';\nimport { DummySettings } from './settings.ts';\nimport { DummySprinkles } from './sprinkles.ts';\nimport { DummyTerminals } from './terminals.ts';\nimport { DummyTray } from './tray.ts';\nimport { DummyUpdates, type UpdateScenario } from './updates.ts';\n\nexport interface DummyOptions {\n delay?: number;\n storage?: Storage | null;\n updates?: UpdateScenario;\n mounts?: MountScenario | 'off';\n network?: NetworkScenario | 'off';\n}\n\nexport interface DummyModel extends SliccModel {\n updates: DummyUpdates;\n network?: DummyNetwork;\n}\n\nexport function createDummyModel({\n delay = 30,\n storage = null,\n updates = 'current',\n mounts = 'off',\n network = 'limited',\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 files = new DummyFiles(fixtures.files, fixtures.directories, fixtures.pending, time, mount);\n const browser = new DummyBrowser(fixtures.tabs, time);\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 base = {\n agent,\n files,\n browser,\n terminals: new DummyTerminals(fixtures.terminals, files, time),\n settings: new DummySettings(\n fixtures.defaults,\n fixtures.models,\n fixtures.accounts,\n storage,\n time\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(extras.sprinkles, agent, files),\n tray: new DummyTray(extras.tray, time),\n updates: new DummyUpdates(updates, time),\n ...(network === 'off' ? {} : { network: new DummyNetwork(network, time) }),\n };\n return { ...base, monitor: new DummyMonitor(base) };\n}\n"],
|
|
5
|
-
"mappings": "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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;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",
|
|
4
|
+
"sourcesContent": ["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 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 [/\\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 (/\\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 AgentPort,\n AgentStatus,\n AssistantMessage,\n DeliveredAs,\n FrozenCone,\n LickChannel,\n LickState,\n Message,\n MessagePart,\n Outgoing,\n SlashCommand,\n Thinking,\n UserMessage,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\nimport { type Effects, type Step, script } from './script.ts';\n\ninterface Run {\n stopped: boolean;\n steers: Outgoing[];\n}\n\nfunction chunks(text: string): string[] {\n return text.match(/\\S+\\s*|\\s+/g) ?? [];\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 #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\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 #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 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();\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);\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);\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: [] };\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 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 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 this.#messages.set(agentId, []);\n this.#queues.set(agentId, []);\n this.#suggestions.delete(agentId);\n this.emit('messages', agentId);\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 frozen(): readonly FrozenCone[] {\n return 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 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 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", "import { Emitter } from '../model/emitter.ts';\nimport type { 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 function page(tab: BrowserTab): 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%)\"/></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\nexport class DummyBrowser extends Emitter<BrowserEvents> implements BrowserPort {\n #tabs: BrowserTab[];\n #active: string | null;\n #clock: Clock;\n #next = 1;\n\n constructor(tabs: readonly BrowserTab[], clock: Clock) {\n super();\n this.#clock = clock;\n this.#tabs = tabs.map((tab) => ({ ...tab }));\n this.#active = this.#tabs[0]?.id ?? null;\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 #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): void {\n void this.#clock.sleep(15).then(() => {\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 this.#changed();\n this.#load(tab.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", "<!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", "import type { FrozenCone, Memory, Message, Sprinkle, TrayStatus } from '../model/types.ts';\nimport suggestions from './sprinkles/suggestions.shtml';\nimport welcome from './sprinkles/welcome.shtml';\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 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 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 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\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\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 } 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 eject?: (path: string) => Promise<void>;\n needsFolder?: () => readonly string[];\n #mounted = new Set<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.mounts = () => [...this.#mounted];\n this.eject = (path) => this.#eject(path);\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.after === null) this.#contents.delete(change.path);\n else 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.#contents.delete(path);\n else this.#put(path, change.before, Date.now());\n this.#announce(path);\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 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('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];\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' } 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-opus-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 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 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 work(): Message[] {\n return [\n {\n id: 'k-m4',\n role: 'assistant',\n status: 'done',\n createdAt: at(14),\n parts: [\n { type: 'text', text: 'Here is where things stand.' },\n {\n type: 'card',\n card: {\n variant: 'pr',\n number: 58,\n title: 'Add retries for upstream timeouts',\n branch: 'fix/retry-upstream',\n checks: '4 of 4 checks passed',\n additions: 42,\n deletions: 7,\n files: 3,\n tone: 'positive',\n },\n },\n {\n type: 'card',\n card: {\n variant: 'tool',\n title: 'Visual regression suite',\n badge: 'bash',\n status: '2 snapshots changed',\n files: ['forecast-card.png', 'forecast-card-dark.png'],\n tone: 'notice',\n },\n },\n {\n type: 'card',\n card: {\n variant: 'light',\n title: 'Staging is healthy',\n detail: '/health answered in 2 ms',\n tone: 'informative',\n },\n },\n {\n type: 'plan',\n items: [\n 'Merge the retry pull request',\n 'Move the cache to KV',\n 'Update the forecast docs to Celsius',\n 'Tag 1.9.0',\n ],\n },\n {\n type: 'check',\n items: [\n { text: 'TTL fix merged' },\n { text: 'Retries reviewed', tone: 'informative' },\n { text: 'Docs pass running', tone: 'notice' },\n { text: 'KV migration not started', tone: 'negative' },\n ],\n },\n {\n type: 'diff',\n path: '/workspace/harbor/src/lib/units.ts',\n before:\n 'export function toCelsius(f: number): number {\\n return ((f - 32) * 5) / 9;\\n}\\n',\n after:\n 'export function toCelsius(f: number): number {\\n return Math.round(((f - 32) * 5) / 9);\\n}\\n',\n },\n {\n type: 'link',\n url: 'https://api.example.com/docs/v2/forecast',\n title: 'Forecast API reference',\n description: 'Parameters, units and rate limits for /v2/forecast.',\n },\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 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 fell back',\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 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 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: 'This cone now uses Claude Opus 5.5.',\n createdAt: at(1478),\n },\n ];\n}\n\nexport function showcase(): Message[] {\n return [...opening(), ...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/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\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 defaults: Settings = {\n color: 'system',\n model: 'claude-sonnet-5-5',\n thinking: 'medium',\n sendOnEnter: true,\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\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.09,\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.62,\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 },\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 },\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 MonitorEvents,\n MonitorPort,\n MonitorRow,\n MonitorSnapshot,\n MonitorStatus,\n SliccModel,\n} from '../model/types.ts';\n\nconst statuses: Record<string, MonitorStatus> = {\n idle: 'idle',\n thinking: 'active',\n working: 'active',\n waiting: 'warn',\n error: 'error',\n};\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 class DummyMonitor extends Emitter<MonitorEvents> implements MonitorPort {\n #model: Omit<SliccModel, 'monitor'>;\n #tick = 0;\n\n constructor(model: Omit<SliccModel, 'monitor'>) {\n super();\n this.#model = model;\n const update = () => this.resync();\n model.agent.on('agents', update);\n model.terminals.on('terminals', update);\n model.browser.on('tabs', update);\n model.files.on('changes', update);\n model.tray.on('status', update);\n }\n\n snapshot(): MonitorSnapshot {\n const { agent, terminals, browser, files, sprinkles, tray } = this.#model;\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 agentRows = agents.map(\n (candidate): MonitorRow => ({\n name: candidate.kind === 'scoop' ? `\u21B3 ${candidate.name}` : candidate.name,\n meta: `${candidate.status} \u00B7 ${Math.round(candidate.contextFill * 100)}% context`,\n status: statuses[candidate.status],\n badges: candidate.unread ? [`${candidate.unread} unread`] : [],\n })\n );\n return {\n updatedAt: Date.now(),\n vitals: [\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 {\n id: 'spend',\n label: 'Spend',\n value: `$${status.spent.toFixed(2)}`,\n delta: `$${status.rate.toFixed(2)}/h`,\n series: wave(this.#tick + 7),\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 id: 'context',\n label: 'Fullest context',\n value: `${Math.round(fill * 100)}%`,\n ratio: fill,\n },\n ],\n alerts: [\n ...agents\n .filter((candidate) => candidate.contextFill >= 0.6)\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 { id: 'agents', label: 'Cones and scoops', rows: agentRows },\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: files\n .changes()\n .map((change) => ({ name: change.path, meta: change.status, status: 'warn' as const })),\n },\n {\n id: 'sprinkles',\n label: 'Sprinkles',\n rows: sprinkles.list().map((sprinkle) => ({\n name: sprinkle.title,\n meta: sprinkle.name,\n status: 'idle' 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 { NetworkPort, NetworkStatus } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type NetworkScenario = 'ok' | 'limited' | 'failing';\n\nconst minute = 60_000;\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: 'proxy',\n health: 'ok',\n detail: 'slicc-node on localhost:5710 reaches every site.',\n failures: [],\n extensionUrl,\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 };\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 };\n}\n\nexport class DummyNetwork extends Emitter<{ network: NetworkStatus }> implements NetworkPort {\n scenario: NetworkScenario;\n #status: NetworkStatus;\n #clock: Clock;\n\n constructor(scenario: NetworkScenario, clock: Clock) {\n super();\n this.scenario = scenario;\n this.#status = networkFixtures(scenario);\n this.#clock = clock;\n }\n\n status(): NetworkStatus {\n return this.#status;\n }\n\n setScenario(scenario: NetworkScenario): void {\n this.scenario = scenario;\n this.#status = networkFixtures(scenario);\n this.emit('network', this.#status);\n }\n\n async check(): Promise<void> {\n await this.#clock.sleep(4);\n this.#status = networkFixtures(this.scenario);\n this.emit('network', this.#status);\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 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 cwd: string;\n closed = false;\n\n constructor(sink: TerminalSink, files: FilePort, cwd: string, clock: Clock) {\n this.#sink = sink;\n this.#files = files;\n this.#clock = clock;\n this.cwd = cwd;\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') this.cwd = 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(files: FilePort, cwd: string, clock: Clock): TerminalBackend {\n return { open: (sink) => new FakeShell(sink, files, cwd, clock) };\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 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);\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 { UpdateAction, UpdateItem, UpdateKind, UpdatesPort } from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nexport type UpdateScenario = 'current' | 'boot' | 'available' | 'restart' | 'failure';\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 === '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\nexport class DummyUpdates extends Emitter<{ items: readonly UpdateItem[] }> implements UpdatesPort {\n #items: readonly UpdateItem[];\n #ready: boolean;\n #clock: Clock;\n\n constructor(scenario: UpdateScenario, clock: Clock) {\n super();\n this.#items = updateFixtures(scenario);\n this.#ready = scenario !== 'boot';\n this.#clock = clock;\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';\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 type { SliccModel } from '../model/types.ts';\nimport { DummyAgent } from './agent.ts';\nimport { DummyBrowser } from './browser.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 { DummyMemory } from './memory.ts';\nimport { DummyMonitor } from './monitor.ts';\nimport { DummyNetwork, type NetworkScenario } from './network.ts';\nimport { DummySettings } from './settings.ts';\nimport { DummySprinkles } from './sprinkles.ts';\nimport { DummyTerminals } from './terminals.ts';\nimport { DummyTray } from './tray.ts';\nimport { DummyUpdates, type UpdateScenario } from './updates.ts';\n\nexport interface DummyOptions {\n delay?: number;\n storage?: Storage | null;\n updates?: UpdateScenario;\n mounts?: MountScenario | 'off';\n network?: NetworkScenario | 'off';\n}\n\nexport interface DummyModel extends SliccModel {\n updates: DummyUpdates;\n network?: DummyNetwork;\n}\n\nexport function createDummyModel({\n delay = 30,\n storage = null,\n updates = 'current',\n mounts = 'off',\n network = 'limited',\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 files = new DummyFiles(fixtures.files, fixtures.directories, fixtures.pending, time, mount);\n const browser = new DummyBrowser(fixtures.tabs, time);\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 base = {\n agent,\n files,\n browser,\n terminals: new DummyTerminals(fixtures.terminals, files, time),\n settings: new DummySettings(\n fixtures.defaults,\n fixtures.models,\n fixtures.accounts,\n storage,\n time\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(extras.sprinkles, agent, files),\n tray: new DummyTray(extras.tray, time),\n updates: new DummyUpdates(updates, time),\n ...(network === 'off' ? {} : { network: new DummyNetwork(network, time) }),\n };\n return { ...base, monitor: new DummyMonitor(base) };\n}\n"],
|
|
5
|
+
"mappings": "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,WAAO,KAAK,GAAG;AAAA,EACjB;AACF;;;AClHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;;;ACIA,IAAM,MAAM;AACZ,IAAM,MAAM,KAAK,I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",
|
|
6
6
|
"names": ["files", "agents", "conversations", "clock", "queues", "frozen", "tool", "test", "at", "agent", "tabs", "clock", "index", "directories", "clock", "now", "files", "at", "index", "units", "suggestions", "files", "start", "at", "memories", "memory", "index", "terminals", "files", "sprinkles", "tray", "agents", "now", "clock", "sprinkles", "files", "files", "clock", "terminals", "files", "clock", "clock", "clock", "files"]
|
|
7
7
|
}
|