@ai-ecoverse/slicc-spectrum 1.0.0 → 1.1.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.
Files changed (80) hide show
  1. package/README.md +63 -3
  2. package/dist/chunk-24WRGUXG.js +168 -0
  3. package/dist/chunk-24WRGUXG.js.map +7 -0
  4. package/dist/chunk-364Y2XOJ.js +28 -0
  5. package/dist/chunk-364Y2XOJ.js.map +7 -0
  6. package/dist/chunk-4RGMMAR4.js +18 -0
  7. package/dist/chunk-4RGMMAR4.js.map +7 -0
  8. package/dist/chunk-5OVGH7HO.js +28 -0
  9. package/dist/chunk-5OVGH7HO.js.map +7 -0
  10. package/dist/chunk-6A6NIESE.js +9 -0
  11. package/dist/chunk-6A6NIESE.js.map +7 -0
  12. package/dist/chunk-EN3XGF2M.js +26 -0
  13. package/dist/chunk-EN3XGF2M.js.map +7 -0
  14. package/dist/chunk-ER3HU7OE.js +22 -0
  15. package/dist/chunk-ER3HU7OE.js.map +7 -0
  16. package/dist/chunk-FN3Y2AYJ.js +17 -0
  17. package/dist/chunk-FN3Y2AYJ.js.map +7 -0
  18. package/dist/chunk-H5WU2XYY.js +8 -0
  19. package/dist/chunk-H5WU2XYY.js.map +7 -0
  20. package/dist/chunk-HBUX7E54.js +234 -0
  21. package/dist/chunk-HBUX7E54.js.map +7 -0
  22. package/dist/chunk-IBQ4O4NO.js +13 -0
  23. package/dist/chunk-IBQ4O4NO.js.map +7 -0
  24. package/dist/chunk-J45KH7MF.js +180 -0
  25. package/dist/chunk-J45KH7MF.js.map +7 -0
  26. package/dist/chunk-JASEW37G.js +411 -0
  27. package/dist/chunk-JASEW37G.js.map +7 -0
  28. package/dist/chunk-MR7SU4GJ.js +59 -0
  29. package/dist/chunk-MR7SU4GJ.js.map +7 -0
  30. package/dist/chunk-MTF6JFSL.js +1093 -0
  31. package/dist/chunk-MTF6JFSL.js.map +7 -0
  32. package/dist/chunk-Q4AC2O6Z.js +13 -0
  33. package/dist/chunk-Q4AC2O6Z.js.map +7 -0
  34. package/dist/chunk-SZ33GAVH.js +2638 -0
  35. package/dist/chunk-SZ33GAVH.js.map +7 -0
  36. package/dist/chunk-T5NHW4KC.js +23 -0
  37. package/dist/chunk-T5NHW4KC.js.map +7 -0
  38. package/dist/chunk-T5QFSUYQ.js +8 -0
  39. package/dist/chunk-T5QFSUYQ.js.map +7 -0
  40. package/dist/chunk-TS7SL372.js +687 -0
  41. package/dist/chunk-TS7SL372.js.map +7 -0
  42. package/dist/chunk-Y4Z7K443.js +64 -0
  43. package/dist/chunk-Y4Z7K443.js.map +7 -0
  44. package/dist/chunk-ZMBN6APP.js +11 -0
  45. package/dist/chunk-ZMBN6APP.js.map +7 -0
  46. package/dist/chunk-ZTPYBVZL.js +181 -0
  47. package/dist/chunk-ZTPYBVZL.js.map +7 -0
  48. package/dist/fonts/source-code-pro-latin-400-normal.woff2 +0 -0
  49. package/dist/fonts/source-code-pro-latin-600-normal.woff2 +0 -0
  50. package/dist/slicc-dummy.js +1393 -0
  51. package/dist/slicc-dummy.js.map +7 -0
  52. package/dist/slicc-terminal.js +2 -27
  53. package/dist/slicc-terminal.js.map +4 -4
  54. package/dist/slicc-ui.js +22441 -0
  55. package/dist/slicc-ui.js.map +7 -0
  56. package/dist/types/app/agents.d.ts +11 -0
  57. package/dist/types/app/app.d.ts +40 -0
  58. package/dist/types/app/base.d.ts +27 -0
  59. package/dist/types/app/chat.d.ts +23 -0
  60. package/dist/types/app/fonts.d.ts +3 -0
  61. package/dist/types/app/markdown.d.ts +24 -0
  62. package/dist/types/app/panels.d.ts +31 -0
  63. package/dist/types/app/spectrum.d.ts +19 -0
  64. package/dist/types/components/dock.d.ts +24 -0
  65. package/dist/types/components/sheets.d.ts +1 -0
  66. package/dist/types/dummy/agent.d.ts +14 -0
  67. package/dist/types/dummy/browser.d.ts +15 -0
  68. package/dist/types/dummy/clock.d.ts +5 -0
  69. package/dist/types/dummy/files.d.ts +14 -0
  70. package/dist/types/dummy/fixtures.d.ts +11 -0
  71. package/dist/types/dummy/index.d.ts +6 -0
  72. package/dist/types/dummy/script.d.ts +23 -0
  73. package/dist/types/dummy/settings.d.ts +13 -0
  74. package/dist/types/dummy/shell.d.ts +16 -0
  75. package/dist/types/dummy/terminals.d.ts +15 -0
  76. package/dist/types/dummy.d.ts +2 -0
  77. package/dist/types/model/emitter.d.ts +9 -0
  78. package/dist/types/model/types.d.ts +183 -0
  79. package/dist/types/ui.d.ts +15 -0
  80. package/package.json +29 -11
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dummy/script.ts", "../src/dummy/agent.ts", "../src/dummy/browser.ts", "../src/dummy/clock.ts", "../src/dummy/files.ts", "../src/dummy/fixtures.ts", "../src/dummy/settings.ts", "../src/dummy/shell.ts", "../src/dummy/terminals.ts", "../src/dummy/index.ts"],
4
+ "sourcesContent": ["import type { BrowserPort, FilePort } from '../model/types.ts';\n\nexport interface Effects {\n files: FilePort;\n browser: BrowserPort;\n agentId: string;\n}\n\nexport type Step =\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 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: '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\nexport function script(prompt: string): Step[] {\n const text = prompt.toLowerCase();\n if (/\\btests?\\b/.test(text)) return test();\n if (/\\b(fix|edit|add|change)\\b/.test(text)) return edit();\n if (/\\b(open|browse|page|docs)\\b/.test(text)) return browse();\n if (/\\b(files?|read|show|project)\\b/.test(text)) return files();\n return chat(prompt);\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n Agent,\n AgentEvents,\n AgentPort,\n AgentStatus,\n AssistantMessage,\n Message,\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}\n\nfunction chunks(text: string): string[] {\n return text.match(/\\S+\\s*|\\s+/g) ?? [];\n}\n\nexport class DummyAgent extends Emitter<AgentEvents> implements AgentPort {\n #agents: Agent[];\n #messages = new Map<string, Message[]>();\n #runs = new Map<string, Run>();\n #active: string;\n #clock: Clock;\n #effects: Omit<Effects, 'agentId'>;\n #next = 1;\n\n constructor(\n agents: readonly Agent[],\n conversations: Record<string, readonly Message[]>,\n effects: Omit<Effects, 'agentId'>,\n clock: Clock\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 }\n this.#active = this.#agents[0]?.id ?? '';\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 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 #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 #step(agentId: string, reply: AssistantMessage, step: Step, run: Run): Promise<void> {\n if (step.type !== 'tool') {\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 return;\n }\n this.#status(agentId, 'working');\n const tool = {\n id: `t-${this.#next++}`,\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: 'error' 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 send(agentId: string, text: string): Promise<void> {\n const agent = this.#agent(agentId);\n const prompt = text.trim();\n if (!agent || !prompt) return;\n this.stop(agentId);\n const run: Run = { stopped: false };\n this.#runs.set(agentId, run);\n this.#post(agentId, {\n id: `m-${this.#next++}`,\n role: 'user',\n text: prompt,\n createdAt: Date.now(),\n });\n const reply: AssistantMessage = {\n id: `m-${this.#next++}`,\n role: 'assistant',\n parts: [],\n status: 'streaming',\n createdAt: Date.now(),\n };\n this.#post(agentId, reply);\n for (const step of script(prompt)) {\n if (run.stopped) break;\n await this.#step(agentId, reply, step, run);\n }\n reply.status = run.stopped ? 'stopped' : 'done';\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 this.emit('message', { agentId, message: reply });\n agent.status = 'idle';\n this.#changed();\n }\n\n stop(agentId: string): void {\n const run = this.#runs.get(agentId);\n if (run) run.stopped = true;\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 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", "export interface Clock {\n delay: number;\n sleep(ticks?: number): Promise<void>;\n}\n\nexport function clock(delay: number): Clock {\n return {\n delay,\n sleep: (ticks = 1) => new Promise((resolve) => setTimeout(resolve, delay * ticks)),\n };\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 class DummyFiles extends Emitter<FileEvents> implements FilePort {\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 ) {\n super();\n this.#clock = clock;\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", "import type {\n Account,\n Agent,\n BrowserTab,\n Change,\n Message,\n ModelOption,\n Settings,\n TerminalInfo,\n} from '../model/types.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\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 '/tmp/forecast-sample.json': sample,\n};\n\nexport const directories = ['/sessions', '/home/user/downloads'];\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' },\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 {\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\nconst start = Date.UTC(2026, 9, 5, 8, 30);\nconst at = (minutes: number) => start + minutes * 60_000;\n\nexport const conversations: Record<string, Message[]> = {\n 'cone-sliccy': [\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: 'event',\n kind: '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 },\n },\n {\n type: 'tool',\n tool: {\n id: 't-h4',\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\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 },\n {\n id: 'm-h4',\n role: 'event',\n kind: 'scoop',\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 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-release': [\n {\n id: 'm-r1',\n role: 'event',\n kind: '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 'cone-triage': [\n {\n id: 'm-t1',\n role: 'event',\n kind: 'compaction',\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: 'event',\n kind: 'error',\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 {\n Account,\n ModelOption,\n Settings,\n SettingsEvents,\n SettingsPort,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nconst key = 'slicc-ui.settings';\n\nexport class DummySettings extends Emitter<SettingsEvents> implements SettingsPort {\n #settings: Settings;\n #accounts: Account[];\n #models: readonly ModelOption[];\n #storage: Storage | null;\n #clock: Clock;\n\n constructor(\n defaults: Settings,\n models: readonly ModelOption[],\n accounts: readonly Account[],\n storage: Storage | null,\n clock: Clock\n ) {\n super();\n this.#storage = storage;\n this.#clock = clock;\n this.#models = models;\n this.#accounts = accounts.map((account) => ({ ...account }));\n this.#settings = { ...defaults, ...this.#load() };\n }\n\n #load(): Partial<Settings> {\n try {\n return JSON.parse(this.#storage?.getItem(key) ?? '{}');\n } catch {\n return {};\n }\n }\n\n get(): Settings {\n return { ...this.#settings };\n }\n\n update(patch: Partial<Settings>): void {\n this.#settings = { ...this.#settings, ...patch };\n this.#storage?.setItem(key, JSON.stringify(this.#settings));\n this.emit('settings', this.get());\n }\n\n models(): readonly ModelOption[] {\n return this.#models;\n }\n\n accounts(): readonly Account[] {\n return this.#accounts.map((account) => ({ ...account }));\n }\n\n #set(id: string, patch: Partial<Account>): void {\n this.#accounts = this.#accounts.map((account) =>\n account.id === id ? { ...account, ...patch } : account\n );\n this.emit('accounts', this.accounts());\n }\n\n async connect(id: string): Promise<void> {\n await this.#clock.sleep(10);\n const account = this.#accounts.find((candidate) => candidate.id === id);\n const identity = account?.identity || `${id}-user@example.com`;\n this.#set(id, { status: 'connected', identity });\n }\n\n disconnect(id: string): void {\n this.#set(id, { status: 'disconnected' });\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 type { SliccModel } from '../model/types.ts';\nimport { DummyAgent } from './agent.ts';\nimport { DummyBrowser } from './browser.ts';\nimport { clock } from './clock.ts';\nimport { DummyFiles } from './files.ts';\nimport * as fixtures from './fixtures.ts';\nimport { DummySettings } from './settings.ts';\nimport { DummyTerminals } from './terminals.ts';\n\nexport interface DummyOptions {\n delay?: number;\n storage?: Storage | null;\n}\n\nexport function createDummyModel({ delay = 30, storage = null }: DummyOptions = {}): SliccModel {\n const time = clock(delay);\n const files = new DummyFiles(fixtures.files, fixtures.directories, fixtures.pending, time);\n const browser = new DummyBrowser(fixtures.tabs, time);\n return {\n agent: new DummyAgent(fixtures.agents, fixtures.conversations, { files, browser }, time),\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 };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["files", "agents", "conversations", "clock", "tabs", "clock", "index", "resolve", "directories", "clock", "files", "units", "files", "defaults", "models", "accounts", "clock", "files", "clock", "terminals", "files", "clock", "files"]
7
+ }
@@ -1,29 +1,4 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __esm = (fn, res, err) => function __init() {
4
- if (err) throw err[0];
5
- try {
6
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
- } catch (e) {
8
- throw err = [e], e;
9
- }
10
- };
11
- var __export = (target, all) => {
12
- for (var name in all)
13
- __defProp(target, name, { get: all[name], enumerable: true });
14
- };
15
-
16
- // stub:wasm-inline
17
- var wasm_inline_exports = {};
18
- __export(wasm_inline_exports, {
19
- WASM_BASE64: () => WASM_BASE64
20
- });
21
- var WASM_BASE64;
22
- var init_wasm_inline = __esm({
23
- "stub:wasm-inline"() {
24
- WASM_BASE64 = "";
25
- }
26
- });
1
+ import "./chunk-Q4AC2O6Z.js";
27
2
 
28
3
  // node_modules/@wterm/core/dist/wasm-loading.js
29
4
  var embedded;
@@ -51,7 +26,7 @@ async function compileUrl(url) {
51
26
  }
52
27
  function loadWasmModule(url) {
53
28
  if (!url) {
54
- embedded ?? (embedded = Promise.resolve().then(() => (init_wasm_inline(), wasm_inline_exports)).then(({ WASM_BASE64: WASM_BASE642 }) => WebAssembly.compile(decodeBase64(WASM_BASE642))).catch((error) => {
29
+ embedded ?? (embedded = import("./chunk-T5QFSUYQ.js").then(({ WASM_BASE64 }) => WebAssembly.compile(decodeBase64(WASM_BASE64))).catch((error) => {
55
30
  embedded = void 0;
56
31
  throw error;
57
32
  }));