@ai-ecoverse/slicc-agent 6.4.3 → 6.5.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 (42) hide show
  1. package/README.md +25 -1
  2. package/dist/client.js +1 -0
  3. package/dist/client.js.map +2 -2
  4. package/dist/control.js +16 -2
  5. package/dist/control.js.map +2 -2
  6. package/dist/freezer/index.js +8 -4
  7. package/dist/freezer/index.js.map +2 -2
  8. package/dist/freezer/paths.js +5 -0
  9. package/dist/freezer/paths.js.map +7 -0
  10. package/dist/freezer/v6-place.js +316 -8
  11. package/dist/freezer/v6-place.js.map +3 -3
  12. package/dist/freezer/v6-write.js +94 -1
  13. package/dist/freezer/v6-write.js.map +2 -2
  14. package/dist/freezer/v6.js +119 -30
  15. package/dist/freezer/v6.js.map +3 -3
  16. package/dist/host.js +2 -0
  17. package/dist/host.js.map +2 -2
  18. package/dist/kernel/agent-users.js +2 -1
  19. package/dist/kernel/agent-users.js.map +2 -2
  20. package/dist/licks/crontab.js +2 -1
  21. package/dist/licks/crontab.js.map +2 -2
  22. package/dist/licks/sources.js +1 -0
  23. package/dist/licks/sources.js.map +2 -2
  24. package/dist/main.js +5 -2
  25. package/dist/main.js.map +2 -2
  26. package/dist/services.js +3 -0
  27. package/dist/services.js.map +2 -2
  28. package/dist/spectrum/agent-port.js +15 -3
  29. package/dist/spectrum/agent-port.js.map +2 -2
  30. package/dist/spectrum/import-port.js +93 -0
  31. package/dist/spectrum/import-port.js.map +7 -0
  32. package/dist/types/client.d.ts +2 -0
  33. package/dist/types/control.d.ts +3 -1
  34. package/dist/types/freezer/paths.d.ts +1 -0
  35. package/dist/types/freezer/v6-place.d.ts +12 -0
  36. package/dist/types/freezer/v6-write.d.ts +16 -0
  37. package/dist/types/freezer/v6.d.ts +31 -4
  38. package/dist/types/licks/crontab.d.ts +7 -0
  39. package/dist/types/services.d.ts +12 -2
  40. package/dist/types/spectrum/agent-port.d.ts +8 -1
  41. package/dist/types/spectrum/import-port.d.ts +21 -0
  42. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/freezer/v6.ts"],
4
- "sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AssistantMessage, Message, ToolCall } from '@earendil-works/pi-ai';\nimport { configure, type EntryDraft, type ModelRef, type Tx } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { type Agents, type AgentsState, freeFolder, type ScoopRecord, scoopId } from '../agents.ts';\nimport { homeOf } from '../kernel/accounts.ts';\nimport { quote } from '../kernel/env.ts';\nimport type { KernelUsers } from '../kernel/users.ts';\nimport type { Layout } from '../layout.ts';\nimport { opfsFile } from '../opfs-pool.ts';\nimport { TITLE_TURNS } from '../titles/extension.ts';\nimport { place } from './v6-place.ts';\nimport {\n checkLicks,\n checkManifest,\n checkTranscript,\n type Licks,\n type Manifest,\n type Transcript,\n type V6Conversation,\n type V6Message,\n} from './v6-schema.ts';\nimport { Writer } from './v6-write.ts';\nimport {\n blobSource,\n bytesSource,\n ImportError,\n isLink,\n readEntry,\n type ZipEntry,\n type ZipSource,\n zipEntries,\n} from './zip.ts';\n\nexport const V6_KIND = 'slicc.v6';\nexport const IMPORTS_DIR = '/var/lib/slicc/agent/imports';\nconst MiB = 1024 ** 2;\nexport const LIMITS = {\n archive: 2048 * MiB,\n entries: 60_000,\n file: 256 * MiB,\n transcript: 64 * MiB,\n total: 4096 * MiB,\n ratio: 200,\n};\n\nexport type ImportProgress = {\n phase: 'idle' | 'checking' | 'writing' | 'done' | 'failed';\n done: number;\n total: number;\n text: string;\n};\n\nexport interface ImportPreview {\n exportId: string;\n origin: string;\n createdAt: string;\n cones: number;\n scoops: number;\n frozen: number;\n bytes: number;\n skills: string[];\n crons: number;\n webhooks: number;\n flagged: number;\n providers: string[];\n mounts: string[];\n already: number | null;\n text: string;\n}\n\nexport interface ImportResult {\n done: boolean;\n preview: ImportPreview | null;\n cones: string[];\n report: string | null;\n text: string;\n error: string | null;\n}\n\nexport type ImportSource = { path: string } | { bytes: Uint8Array };\n\nexport interface ImportDeps {\n agents: Agents;\n env: ExecutionEnv;\n layout: Layout;\n users?: Pick<KernelUsers, 'add' | 'remove'>;\n envOf?: (cone: string) => Promise<ExecutionEnv | undefined>;\n opfs?: () => Promise<FileSystemDirectoryHandle>;\n room?: () => Promise<number | undefined>;\n now?: () => number;\n}\n\nexport type Opened = {\n manifest: Manifest;\n entries: Map<string, ZipEntry>;\n source: ZipSource;\n key: string;\n};\n\nexport type Where =\n | { kind: 'data' | 'skip' | 'attachment' }\n | { kind: 'cone' | 'scoop' | 'home-user' | 'skill' | 'sprinkle'; folder: string; rest: string };\n\nexport type Scoop = {\n name: string;\n six: string | null;\n folder: string;\n conversation?: V6Conversation;\n};\n\nexport type Unit = {\n key: string;\n name: string;\n title: string;\n six: string | null;\n memory: string | null;\n doc?: Transcript;\n main?: V6Conversation;\n scoops: Scoop[];\n frozenAt: number;\n tail: string;\n cone: string;\n fresh: boolean;\n record: boolean;\n suffix: string;\n home: string;\n roots: Set<string>;\n files: Map<string, string>;\n};\n\nexport type Parsed = { data: Map<string, Uint8Array>; licks: Licks; units: Unit[] };\n\nexport const day = (at: number | string) => new Date(at).toISOString().slice(0, 10);\nconst plural = (count: number, word: string) => `${count} ${word}${count === 1 ? '' : 's'}`;\nconst decoder = new TextDecoder('utf-8', { fatal: true });\n\nexport function textOf(bytes: Uint8Array, name: string): string {\n try {\n return decoder.decode(bytes);\n } catch {\n throw new ImportError(`${name} is not UTF-8 text`);\n }\n}\n\nfunction json(bytes: Uint8Array, name: string): unknown {\n const text = textOf(bytes, name);\n try {\n return JSON.parse(text);\n } catch {\n throw new ImportError(`${name} is not JSON`);\n }\n}\n\nconst safe = (name: string) =>\n !/^\\/|^[A-Za-z]:|\\\\|\\0/.test(name) &&\n name.split('/').every((part) => part !== '' && part !== '.' && part !== '..');\n\nconst HOOKS = /(^|\\/)\\.git\\/hooks\\//;\n\nexport function whereOf(manifest: Manifest, name: string): Where {\n const where = placeOf(manifest, name);\n const tree = where.kind === 'cone' || where.kind === 'scoop' || where.kind === 'home-user';\n return tree && HOOKS.test(name) ? { kind: 'skip' } : where;\n}\n\nfunction placeOf(manifest: Manifest, name: string): Where {\n const [top = '', second = '', ...more] = name.split('/');\n const rest = more.join('/');\n if (\n ['transcripts', 'frozen', 'memory'].includes(top) ||\n [manifest.licks, manifest.gitconfig].includes(name)\n )\n return { kind: 'data' };\n if (top === 'attachments' && /^[0-9a-f]{64}$/.test(second) && !rest)\n return { kind: 'attachment' };\n if (top === 'files' && second === 'home-user' && rest)\n return { kind: 'home-user', folder: '', rest };\n const folder = more[0] as string;\n const inner = more.slice(1).join('/');\n if (\n top === 'files' &&\n second === 'cones' &&\n inner &&\n manifest.cones.some((cone) => cone.folder === folder)\n )\n return { kind: 'cone', folder, rest: inner };\n const scoops = manifest.cones.flatMap((cone) => cone.scoops);\n if (\n top === 'files' &&\n second === 'scoops' &&\n inner &&\n scoops.some((scoop) => scoop.folder === folder)\n )\n return { kind: 'scoop', folder, rest: inner };\n const listed = top === 'skills' ? manifest.skills : top === 'sprinkles' ? manifest.sprinkles : [];\n if (rest && listed.some((item) => item.name === second))\n return { kind: top === 'skills' ? 'skill' : 'sprinkle', folder: second, rest };\n throw new ImportError(`${name} has no place in a SLICC 6 profile`);\n}\n\nfunction scan(list: readonly ZipEntry[], archive: number): Map<string, ZipEntry> {\n const entries = new Map<string, ZipEntry>();\n let total = 0;\n for (const entry of list) {\n if (!safe(entry.name))\n throw new ImportError(`refused the entry name ${JSON.stringify(entry.name)}`);\n if (isLink(entry)) throw new ImportError(`${entry.name} is a symlink`);\n if (entries.has(entry.name)) throw new ImportError(`${entry.name} is in the zip twice`);\n const big = entry === list[0] || /^(transcripts|frozen)\\//.test(entry.name);\n const cap = big ? LIMITS.transcript : LIMITS.file;\n if (entry.size > cap) throw new ImportError(`${entry.name} is over ${cap / MiB} MiB`);\n total += entry.size;\n entries.set(entry.name, entry);\n }\n if (total > LIMITS.total) throw new ImportError('the files add up to over 4 GiB');\n if (total > LIMITS.ratio * archive)\n throw new ImportError('the zip expands over 200:1, like a zip bomb');\n return entries;\n}\n\nexport async function openProfile(source: ZipSource): Promise<Opened> {\n if (source.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const list = await zipEntries(source);\n if (list.length > LIMITS.entries)\n throw new ImportError(`the zip has over ${LIMITS.entries} entries`);\n if (list[0]?.name !== 'manifest.json')\n throw new ImportError('manifest.json must be the first entry');\n const entries = scan(list, source.size);\n const manifest = checkManifest(json(await readEntry(source, list[0]), 'manifest.json'));\n const listed = new Set<string>();\n for (const file of manifest.files) {\n if (entries.get(file.path)?.size !== file.size || file.path === 'manifest.json')\n throw new ImportError(\n `${file.path} is in the manifest but not in the zip, or not at that size`\n );\n listed.add(file.path);\n }\n for (const name of entries.keys()) {\n if (name === 'manifest.json') continue;\n if (!listed.has(name)) throw new ImportError(`${name} is not listed in the manifest`);\n whereOf(manifest, name);\n }\n const { exportId, part } = manifest;\n return { manifest, entries, source, key: part ? `${exportId}#${part.index}` : exportId };\n}\n\nconst noLicks: Licks = { crontasks: [], tasks: [], webhooks: [] };\n\nasync function licksIn(opened: Opened, data?: Map<string, Uint8Array>): Promise<Licks> {\n const name = opened.manifest.licks;\n if (!name) return noLicks;\n const entry = opened.entries.get(name);\n if (!entry) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n return checkLicks(json(data?.get(name) ?? (await readEntry(opened.source, entry)), name));\n}\n\nconst UNITS = [\n [1e9, 'GB'],\n [1e6, 'MB'],\n [1e3, 'KB'],\n] as const;\n\nexport async function previewOf(\n opened: Opened,\n state: Readonly<AgentsState>\n): Promise<ImportPreview> {\n const { manifest } = opened;\n const licks = await licksIn(opened);\n const bytes = manifest.files\n .filter((file) => file.path.startsWith('files/'))\n .reduce((sum, file) => sum + file.size, 0);\n const scoops = manifest.cones.reduce((sum, cone) => sum + cone.scoops.length, 0);\n const mounts = manifest.skipped\n .filter((item) => item.reason === 'mount')\n .map((item) => item.path.replace(/^\\/mnt\\//, ''));\n const crons =\n licks.crontasks.length + licks.tasks.filter((task) => task.scheduleType === 'cron').length;\n const host = URL.canParse(manifest.producer.origin)\n ? new URL(manifest.producer.origin).host\n : manifest.producer.origin;\n const [at, unit] = UNITS.find(([at]) => bytes >= at) ?? (UNITS[2] as (typeof UNITS)[2]);\n const size = `${(bytes / at).toFixed(1)} ${unit}`;\n const parts = [\n plural(manifest.cones.length, 'cone'),\n plural(scoops, 'scoop'),\n plural(manifest.frozen.length, 'frozen session'),\n `${size} of files`,\n `${plural(manifest.skills.length, 'skill')} (for every agent)`,\n `${plural(crons, 'cron')} (imported off)`,\n `${plural(licks.webhooks.length, 'webhook')} (new URLs needed)`,\n `${plural(manifest.flagged.length, 'credential-like file')} to review`,\n ];\n return {\n exportId: manifest.exportId,\n origin: manifest.producer.origin,\n createdAt: manifest.createdAt,\n cones: manifest.cones.length,\n scoops,\n frozen: manifest.frozen.length,\n bytes,\n skills: manifest.skills.map((skill) => skill.name),\n crons,\n webhooks: licks.webhooks.length,\n flagged: manifest.flagged.length,\n providers: manifest.providers,\n mounts,\n already: state.imports?.[opened.key]?.at ?? null,\n text: `SLICC 6 profile from ${host}, exported ${day(manifest.createdAt)}: ${parts.join(', ')}. Re-enter in Settings: ${manifest.providers.join(', ') || 'nothing'}. Not imported: ${plural(mounts.length, 'mount')}.`,\n };\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', bytes as Uint8Array<ArrayBuffer>);\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\ntype Show = (phase: ImportProgress['phase'], done: number, total: number) => void;\n\nasync function verify(opened: Opened, writer: Writer, stage: string | null, show: Show) {\n const data = new Map<string, Uint8Array>();\n const { files } = opened.manifest;\n for (const [at, file] of files.entries()) {\n writer.check();\n const bytes = await readEntry(opened.source, opened.entries.get(file.path) as ZipEntry);\n if ((await sha256(bytes)) !== file.sha256.toLowerCase())\n throw new ImportError(`${file.path} doesn't match its sha256`);\n const where = whereOf(opened.manifest, file.path);\n if (where.kind === 'data') data.set(file.path, bytes);\n else if (where.kind !== 'skip' && stage) await writer.put(`${stage}/${file.path}`, bytes, true);\n show('checking', at + 1, files.length);\n }\n return data;\n}\n\nfunction transcriptIn(data: Map<string, Uint8Array>, name: string | null): Transcript | undefined {\n if (!name) return undefined;\n const bytes = data.get(name);\n if (!bytes) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n const value = json(bytes, name);\n try {\n return checkTranscript(value);\n } catch (error) {\n throw new ImportError(`${name}: ${(error as Error).message}`);\n }\n}\n\nfunction draft(\n fields: Pick<Unit, 'key' | 'name' | 'title' | 'six' | 'memory' | 'scoops'> & {\n doc?: Transcript;\n main?: V6Conversation;\n },\n when: (string | null | undefined)[],\n created: string\n): Unit {\n const last = fields.main?.messages.at(-1)?.timestamp;\n const frozenAt = [...when, last, created]\n .map((value) => Date.parse(value ?? ''))\n .find((at) => !Number.isNaN(at)) as number;\n const tail = (fields.doc?.conversations ?? [])\n .map((item) => item.messages.at(-1)?.id ?? '')\n .join(',');\n return {\n ...fields,\n frozenAt,\n tail,\n cone: '',\n fresh: true,\n record: true,\n suffix: '',\n home: '',\n roots: new Set(),\n files: new Map(),\n };\n}\n\nexport function unitsOf(manifest: Manifest, data: Map<string, Uint8Array>): Unit[] {\n const cones = manifest.cones.map((cone) => {\n const doc = transcriptIn(data, cone.transcript);\n const all = doc?.conversations ?? [];\n const main =\n all.find((item) => item.id === cone.conversation) ?? all.find((item) => item.kind === 'cone');\n const scoops = cone.scoops.map((scoop) => ({\n name: scoop.name,\n six: scoop.folder,\n folder: '',\n conversation:\n all.find((item) => item.id === scoop.conversation) ??\n all.find((item) => item.kind === 'scoop' && item.folder === scoop.folder),\n }));\n const title = doc?.session.title || cone.name;\n return draft(\n {\n key: cone.key,\n name: cone.name,\n title,\n six: cone.folder,\n memory: cone.memory,\n doc,\n main,\n scoops,\n },\n [doc?.session.updatedAt],\n manifest.createdAt\n );\n });\n const frozen = manifest.frozen.map((item) => {\n const doc = transcriptIn(data, item.transcript) as Transcript;\n const [main, ...rest] = [...doc.conversations].sort(\n (a, b) => Number(b.kind === 'cone') - Number(a.kind === 'cone')\n );\n const title = item.title || doc.session.title;\n const scoops = rest.map((conversation) => ({\n name: conversation.name,\n six: null,\n folder: '',\n conversation,\n }));\n const when = [item.frozenAt, doc.session.frozenAt, doc.session.updatedAt];\n return draft(\n { key: `frozen:${item.id}`, name: title, title, six: null, memory: null, doc, main, scoops },\n when,\n manifest.createdAt\n );\n });\n return [...cones, ...frozen];\n}\n\nfunction present(data: Map<string, Uint8Array>, name: string | null | undefined) {\n if (name && !data.has(name))\n throw new ImportError(`${name} is named in the manifest but not in the zip`);\n}\n\nfunction attached(manifest: Manifest, name: string, doc: Transcript) {\n const files = new Map(manifest.files.map((file) => [file.path, file]));\n for (const item of doc.attachments) {\n const file = files.get(item.path);\n const same =\n file !== undefined &&\n file.size === item.byteLength &&\n file.sha256.toLowerCase() === item.sha256.toLowerCase();\n if (item.present && !(item.path.startsWith('attachments/') && same))\n throw new ImportError(`${name}: attachment ${item.id} doesn't match ${item.path}`);\n }\n}\n\nfunction related(manifest: Manifest, data: Map<string, Uint8Array>) {\n const transcripts = [\n ...manifest.cones.map((cone) => cone.transcript),\n ...manifest.frozen.map((item) => item.transcript),\n ].filter((name): name is string => name !== null);\n const twice = transcripts.find((name, at) => transcripts.indexOf(name) !== at);\n if (twice) throw new ImportError(`${twice} is named twice in the manifest`);\n for (const name of [...manifest.cones.map((cone) => cone.memory), manifest.gitconfig])\n present(data, name);\n for (const [kind, items] of [\n ['skills', manifest.skills],\n ['sprinkles', manifest.sprinkles],\n ] as const)\n for (const item of items)\n if (\n item.path !== `${kind}/${item.name}/` ||\n !manifest.files.some((file) => file.path.startsWith(item.path))\n )\n throw new ImportError(`${item.path} is named in the manifest but has no files`);\n for (const cone of manifest.cones) {\n const doc = transcriptIn(data, cone.transcript);\n const ids = new Set(doc?.conversations.map((item) => item.id));\n for (const id of [cone.conversation, ...cone.scoops.map((scoop) => scoop.conversation)])\n if (id !== null && !ids.has(id))\n throw new ImportError(`${cone.transcript ?? cone.folder} has no conversation ${id}`);\n }\n for (const name of transcripts) attached(manifest, name, transcriptIn(data, name) as Transcript);\n}\n\nasync function parse(opened: Opened, data: Map<string, Uint8Array>): Promise<Parsed> {\n for (const [name, bytes] of data)\n if (name.startsWith('memory/') || name === opened.manifest.gitconfig) textOf(bytes, name);\n related(opened.manifest, data);\n return { data, licks: await licksIn(opened, data), units: unitsOf(opened.manifest, data) };\n}\n\nfunction prior(state: Readonly<AgentsState>, origin: string, key: string) {\n const known = new Set([\n ...Object.keys(state.cones),\n ...Object.values(state.frozen ?? {}).map((item) => item.cone),\n ]);\n return Object.values(state.imports ?? {})\n .filter((item) => item.origin === origin && known.has(item.cones[key] as string))\n .sort((a, b) => b.at - a.at)\n .map((item) => ({ cone: item.cones[key] as string, tail: item.tails[key] as string }))[0];\n}\n\nasync function assign(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n again: boolean,\n date: string,\n context: Context\n) {\n const { agents } = deps;\n const origin = opened.manifest.producer.origin;\n let fresh = 0;\n for (const unit of units) {\n const before = again ? undefined : prior(agents.state(), origin, unit.key);\n if (!before) fresh += 1;\n if (!before) continue;\n unit.cone = before.cone;\n unit.fresh = false;\n unit.record = before.tail !== unit.tail;\n if (unit.record) unit.title = `${unit.title} (updated)`;\n if (agents.state().cones[before.cone]) unit.suffix = `.v6-${date}`;\n }\n const first = fresh\n ? await agents.update((_tx, doc) => {\n doc.next += fresh;\n return doc.next - fresh;\n }, context)\n : 0;\n const taken: Record<string, ScoopRecord> = { ...agents.state().scoops };\n let next = first;\n for (const unit of units) {\n if (unit.fresh) unit.cone = `cone-${next++}`;\n unit.home = homeOf(unit.cone);\n for (const scoop of unit.scoops) {\n scoop.folder = freeFolder({ scoops: taken }, scoop.name);\n taken[scoopId(scoop.folder)] = {} as ScoopRecord;\n }\n }\n}\n\nconst ZERO = {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nfunction piMessage(\n message: V6Message,\n names: Map<string, string>,\n files: Map<string, string>\n): Message {\n const timestamp = Date.parse(message.timestamp);\n const texts = message.content.flatMap((part) => {\n if (part.type === 'text') return [{ type: 'text' as const, text: part.text }];\n if (part.type === 'tool-call') return [];\n const file = files.get(part.attachmentId);\n return [\n {\n type: 'text' as const,\n text: file ? `[Attached file: ${file}]` : '[An attachment SLICC 6 did not export]',\n },\n ];\n });\n if (message.role === 'user') return { role: 'user', content: texts, timestamp };\n const id = message.toolCallId as string;\n if (message.role === 'tool-result')\n return {\n role: 'toolResult',\n toolCallId: id,\n toolName: names.get(id) ?? 'tool',\n content: texts,\n isError: message.isError === true,\n timestamp,\n };\n const calls = message.content.flatMap((part) => {\n if (part.type !== 'tool-call') return [];\n names.set(part.id, part.name);\n const input = part.input;\n const object = typeof input === 'object' && input !== null && !Array.isArray(input);\n return [\n {\n type: 'toolCall' as const,\n id: part.id,\n name: part.name,\n arguments: (object ? input : { input }) as ToolCall['arguments'],\n },\n ];\n });\n const assistant: AssistantMessage = {\n role: 'assistant',\n content: [...texts, ...calls],\n api: message.model?.api ?? 'slicc-6',\n provider: message.model?.provider ?? 'slicc-6',\n model: message.model?.id ?? 'unknown',\n usage: (message.usage as typeof ZERO | undefined) ?? ZERO,\n stopReason: calls.length ? 'toolUse' : 'stop',\n timestamp,\n };\n return assistant;\n}\n\nexport function entriesOf(\n conversation: V6Conversation | undefined,\n files: Map<string, string>\n): EntryDraft[] {\n const names = new Map<string, string>();\n return (conversation?.messages ?? []).map((message) => ({\n kind: V6_KIND,\n data: { id: message.id },\n model: [piMessage(message, names, files)],\n }));\n}\n\nasync function conversationIn(\n tx: Tx,\n conversation: V6Conversation | undefined,\n unit: Unit,\n model: ModelRef | undefined\n) {\n const record = await tx.createConversation({ ownership: { kind: 'ownerless' } });\n if (model) await configure(tx, record.id, { model });\n for (const entry of entriesOf(conversation, unit.files)) await tx.appendEntry(record.id, entry);\n return record.id as number;\n}\n\nfunction modelOf(conversation: V6Conversation | undefined): string {\n const model = conversation?.messages.findLast((message) => message.model)?.model;\n return model ? `${model.provider}/${model.id}` : '';\n}\n\nasync function commit(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n at: number,\n context: Context\n) {\n const model = (await deps.agents.cone().agent(context)).model;\n const origin = opened.manifest.producer.origin;\n const last = TITLE_TURNS.at(-1) as number;\n return deps.agents.update(async (tx, doc) => {\n const made: string[] = [];\n for (const unit of units.filter((item) => item.record)) {\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n const scoops: string[] = [];\n for (const scoop of unit.scoops) {\n const id = scoopId(scoop.folder);\n if (doc.scoops[id])\n throw new ImportError(`the scoop folder ${scoop.folder} was taken during the import`);\n const conversation = await conversationIn(tx, scoop.conversation, unit, model);\n doc.scoops[id] = {\n name: scoop.name,\n folder: scoop.folder,\n cone: unit.cone,\n conversation,\n anchor: 0,\n role: null,\n kind: 'async',\n parent: unit.cone,\n depth: 1,\n roots: null,\n created: null,\n dropped: null,\n gone: true,\n frozen: frozenId,\n title: scoop.name,\n titled: last,\n };\n scoops.push(id);\n }\n doc.frozen ??= {};\n doc.frozen[frozenId] = {\n cone: unit.cone,\n name: unit.name,\n conversation: await conversationIn(tx, unit.main, unit, model),\n title: unit.title,\n model: modelOf(unit.main),\n messages: (unit.main?.messages ?? []).filter((message) => message.role !== 'tool-result')\n .length,\n frozenAt: unit.frozenAt,\n scoops,\n v6: { origin, key: unit.key, ...(unit.suffix ? { suffix: unit.suffix } : {}) },\n };\n made.push(frozenId);\n }\n doc.imports ??= {};\n doc.imports[opened.key] = {\n at,\n origin,\n cones: Object.fromEntries(units.map((unit) => [unit.key, unit.cone])),\n tails: Object.fromEntries(units.map((unit) => [unit.key, unit.tail])),\n };\n return made;\n }, context);\n}\n\nasync function storageRoom(): Promise<number | undefined> {\n const estimate = await globalThis.navigator?.storage?.estimate?.().catch(() => undefined);\n return estimate?.quota === undefined ? undefined : estimate.quota - (estimate.usage ?? 0);\n}\n\nasync function importOpened(\n deps: ImportDeps,\n opened: Opened,\n options: { again: boolean; signal: AbortSignal; show: Show },\n context: Context\n): Promise<ImportResult> {\n const now = (deps.now ?? Date.now)();\n const date = day(now);\n const writer = new Writer(deps.env, context, options.signal);\n const stage = `${IMPORTS_DIR}/${opened.key.replace('#', '-part')}`;\n const total = opened.manifest.files.reduce((sum, file) => sum + file.size, 0);\n const room = await (deps.room ?? storageRoom)();\n if (room !== undefined && room < 2 * total)\n throw new ImportError('there is not enough free storage for this import');\n try {\n await writer.sh(\n `mkdir -p ${IMPORTS_DIR} && chmod 700 ${IMPORTS_DIR} && rm -rf ${quote(stage)} && mkdir -p ${quote(stage)}`\n );\n const data = await verify(opened, writer, stage, options.show);\n const parsed = await parse(opened, data);\n await assign(deps, opened, parsed.units, options.again, date, context);\n const run = {\n deps,\n opened,\n parsed,\n writer,\n stage,\n date,\n show: options.show,\n fresh: new Map(),\n ready: new Set<Unit>(),\n };\n let made: string[];\n try {\n await place(run);\n made = await commit(deps, opened, parsed.units, now, context);\n } catch (error) {\n await writer.rollback();\n throw error;\n }\n const cones = [...new Set(parsed.units.map((unit) => unit.cone))];\n const providers = opened.manifest.providers;\n return {\n done: true,\n preview: null,\n cones,\n report: null,\n text: `Imported ${plural(made.length, 'frozen cone')} from ${opened.manifest.producer.origin}${made.length ? `: ${made.join(', ')}` : ''}.\\nRe-enter in Settings: ${providers.join(', ') || 'nothing'}.\\n`,\n error: null,\n };\n } finally {\n await deps.env.remove(stage, { recursive: true, force: true }, BACKGROUND_CONTEXT);\n }\n}\n\nasync function sourceOf(\n deps: ImportDeps,\n source: ImportSource,\n context: Context\n): Promise<ZipSource> {\n if ('bytes' in source) return bytesSource(source.bytes);\n const { env } = deps;\n const real = await env.canonicalPath(source.path, context);\n const info = real.ok ? await env.fileInfo(real.value, context) : real;\n if (!info.ok) throw new ImportError(`can't read ${source.path}: ${info.error.message}`);\n if (info.value.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const file = await opfsFile(info.value.path, deps.opfs);\n if (file?.size === info.value.size) return blobSource(file);\n if (info.value.size > LIMITS.file)\n throw new ImportError(`${source.path} isn't on seven's own disk; copy the zip to /tmp first`);\n const read = await env.readBinaryFile(info.value.path, context);\n if (!read.ok) throw new ImportError(`can't read ${source.path}: ${read.error.message}`);\n return bytesSource(read.value);\n}\n\nexport interface Importer {\n readonly progress: ReplicatedState<ImportProgress>;\n run(\n source: ImportSource,\n options: { again?: boolean; preview?: boolean },\n context: Context\n ): Promise<ImportResult>;\n cancel(): void;\n}\n\nexport const IDLE: ImportProgress = { phase: 'idle', done: 0, total: 0, text: '' };\n\nexport function createImporter(deps: ImportDeps): Importer {\n const progress = replicatedState<ImportProgress>(IDLE);\n let running: AbortController | undefined;\n const result = (fields: Partial<ImportResult>): ImportResult => ({\n done: false,\n preview: null,\n cones: [],\n report: null,\n text: '',\n error: null,\n ...fields,\n });\n return {\n progress,\n cancel: () => running?.abort(),\n async run(source, options, context) {\n if (running) return result({ error: 'an import is already running' });\n const controller = new AbortController();\n running = controller;\n const show: Show = (phase, done, total) =>\n progress.replace(BACKGROUND_CONTEXT, {\n phase,\n done,\n total,\n text: phase === 'checking' ? `Checking ${done}/${total}` : `Importing ${done}/${total}`,\n });\n try {\n const opened = await openProfile(await sourceOf(deps, source, context));\n const preview = await previewOf(opened, deps.agents.state());\n if (options.preview) {\n const writer = new Writer(deps.env, context, controller.signal);\n await parse(opened, await verify(opened, writer, null, show));\n progress.replace(BACKGROUND_CONTEXT, IDLE);\n return result({ preview, text: `${preview.text}\\n` });\n }\n if (preview.already !== null && !options.again)\n return result({\n preview,\n text: `Already imported on ${day(preview.already)}; freezer import --again makes fresh copies.\\n`,\n });\n const done = await importOpened(\n deps,\n opened,\n { again: options.again === true, signal: controller.signal, show },\n context\n );\n progress.replace(BACKGROUND_CONTEXT, { ...progress.value, phase: 'done', text: done.text });\n return { ...done, preview };\n } catch (error) {\n const message =\n error instanceof ImportError\n ? error.message\n : `the import failed: ${(error as Error).message}`;\n progress.replace(BACKGROUND_CONTEXT, { phase: 'failed', done: 0, total: 0, text: message });\n return result({ error: message });\n } finally {\n running = undefined;\n }\n },\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["at"]
4
+ "sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AssistantMessage, Message, ToolCall } from '@earendil-works/pi-ai';\nimport { configure, type EntryDraft, type ModelRef, type Tx } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { type Agents, type AgentsState, freeFolder, type ScoopRecord, scoopId } from '../agents.ts';\nimport { homeOf } from '../kernel/accounts.ts';\nimport { quote } from '../kernel/env.ts';\nimport type { KernelUsers } from '../kernel/users.ts';\nimport type { Layout } from '../layout.ts';\nimport { opfsFile } from '../opfs-pool.ts';\nimport { TITLE_TURNS } from '../titles/extension.ts';\nimport { IMPORTS_DIR } from './paths.ts';\nimport { type Notes, place, reportOf } from './v6-place.ts';\nimport {\n checkLicks,\n checkManifest,\n checkTranscript,\n type Licks,\n type Manifest,\n type Transcript,\n type V6Conversation,\n type V6Message,\n} from './v6-schema.ts';\nimport { Writer } from './v6-write.ts';\nimport {\n blobSource,\n bytesSource,\n ImportError,\n isLink,\n readEntry,\n type ZipEntry,\n type ZipSource,\n zipEntries,\n} from './zip.ts';\n\nexport const V6_KIND = 'slicc.v6';\nconst MiB = 1024 ** 2;\nexport const LIMITS = {\n archive: 2048 * MiB,\n entries: 60_000,\n file: 256 * MiB,\n transcript: 64 * MiB,\n total: 4096 * MiB,\n ratio: 200,\n};\n\nexport type ImportProgress = {\n phase: 'idle' | 'checking' | 'writing' | 'done' | 'failed';\n done: number;\n total: number;\n text: string;\n};\n\nexport interface ImportPreview {\n exportId: string;\n origin: string;\n createdAt: string;\n cones: number;\n scoops: number;\n frozen: number;\n bytes: number;\n skills: string[];\n crons: number;\n webhooks: number;\n flagged: string[];\n providers: string[];\n mounts: string[];\n already: number | null;\n text: string;\n line: string;\n}\n\nexport interface ImportResult {\n done: boolean;\n preview: ImportPreview | null;\n cones: string[];\n report: string | null;\n text: string;\n line: string;\n error: string | null;\n}\n\ntype ReadSource = { path: string } | { bytes: Uint8Array };\n\nexport type ImportSource = ReadSource | { upload: string };\n\nconst UPLOAD = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const uploadPath = (id: string) => `${IMPORTS_DIR}/upload-${id}.zip`;\n\nfunction uploaded(source: ImportSource): { path: string } | undefined {\n if (!('upload' in source)) return undefined;\n if (!UPLOAD.test(source.upload)) throw new ImportError(\"that upload isn't one of the agent's\");\n return { path: uploadPath(source.upload) };\n}\n\nexport interface ImportDeps {\n agents: Agents;\n env: ExecutionEnv;\n layout: Layout;\n memoryHome: string;\n providers?: readonly Account[];\n catalog?: { getModel(provider: string, id: string): { name: string } | undefined };\n users?: Pick<KernelUsers, 'add' | 'remove'>;\n envOf?: (cone: string) => Promise<ExecutionEnv | undefined>;\n opfs?: () => Promise<FileSystemDirectoryHandle>;\n room?: () => Promise<number | undefined>;\n now?: () => number;\n}\n\nexport type Opened = {\n manifest: Manifest;\n entries: Map<string, ZipEntry>;\n source: ZipSource;\n key: string;\n};\n\nexport type Where =\n | { kind: 'data' | 'skip' | 'attachment' }\n | { kind: 'cone' | 'scoop' | 'home-user' | 'skill' | 'sprinkle'; folder: string; rest: string };\n\nexport type Scoop = {\n name: string;\n six: string | null;\n folder: string;\n conversation?: V6Conversation;\n};\n\nexport type Unit = {\n key: string;\n name: string;\n title: string;\n six: string | null;\n memory: string | null;\n doc?: Transcript;\n main?: V6Conversation;\n scoops: Scoop[];\n frozenAt: number;\n tail: string;\n cone: string;\n fresh: boolean;\n record: boolean;\n suffix: string;\n home: string;\n roots: Set<string>;\n files: Map<string, string>;\n};\n\nexport type Parsed = { data: Map<string, Uint8Array>; licks: Licks; units: Unit[] };\n\nexport const day = (at: number | string) => new Date(at).toISOString().slice(0, 10);\nconst plural = (count: number, word: string) => `${count} ${word}${count === 1 ? '' : 's'}`;\nconst decoder = new TextDecoder('utf-8', { fatal: true });\n\nexport function textOf(bytes: Uint8Array, name: string): string {\n try {\n return decoder.decode(bytes);\n } catch {\n throw new ImportError(`${name} is not UTF-8 text`);\n }\n}\n\nfunction json(bytes: Uint8Array, name: string): unknown {\n const text = textOf(bytes, name);\n try {\n return JSON.parse(text);\n } catch {\n throw new ImportError(`${name} is not JSON`);\n }\n}\n\nconst safe = (name: string) =>\n !/^\\/|^[A-Za-z]:|\\\\|\\0/.test(name) &&\n name.split('/').every((part) => part !== '' && part !== '.' && part !== '..');\n\nconst HOOKS = /(^|\\/)\\.git\\/hooks\\//;\n\nexport function whereOf(manifest: Manifest, name: string): Where {\n const where = placeOf(manifest, name);\n const tree = where.kind === 'cone' || where.kind === 'scoop' || where.kind === 'home-user';\n return tree && HOOKS.test(name) ? { kind: 'skip' } : where;\n}\n\nfunction placeOf(manifest: Manifest, name: string): Where {\n const [top = '', second = '', ...more] = name.split('/');\n const rest = more.join('/');\n if (\n ['transcripts', 'frozen', 'memory'].includes(top) ||\n [manifest.licks, manifest.gitconfig].includes(name)\n )\n return { kind: 'data' };\n if (top === 'attachments' && /^[0-9a-f]{64}$/.test(second) && !rest)\n return { kind: 'attachment' };\n if (top === 'files' && second === 'home-user' && rest)\n return { kind: 'home-user', folder: '', rest };\n const folder = more[0] as string;\n const inner = more.slice(1).join('/');\n if (\n top === 'files' &&\n second === 'cones' &&\n inner &&\n manifest.cones.some((cone) => cone.folder === folder)\n )\n return { kind: 'cone', folder, rest: inner };\n const scoops = manifest.cones.flatMap((cone) => cone.scoops);\n if (\n top === 'files' &&\n second === 'scoops' &&\n inner &&\n scoops.some((scoop) => scoop.folder === folder)\n )\n return { kind: 'scoop', folder, rest: inner };\n const listed = top === 'skills' ? manifest.skills : top === 'sprinkles' ? manifest.sprinkles : [];\n if (rest && listed.some((item) => item.name === second))\n return { kind: top === 'skills' ? 'skill' : 'sprinkle', folder: second, rest };\n throw new ImportError(`${name} has no place in a SLICC 6 profile`);\n}\n\nfunction scan(list: readonly ZipEntry[], archive: number): Map<string, ZipEntry> {\n const entries = new Map<string, ZipEntry>();\n let total = 0;\n for (const entry of list) {\n if (!safe(entry.name))\n throw new ImportError(`refused the entry name ${JSON.stringify(entry.name)}`);\n if (isLink(entry)) throw new ImportError(`${entry.name} is a symlink`);\n if (entries.has(entry.name)) throw new ImportError(`${entry.name} is in the zip twice`);\n const big = entry === list[0] || /^(transcripts|frozen)\\//.test(entry.name);\n const cap = big ? LIMITS.transcript : LIMITS.file;\n if (entry.size > cap) throw new ImportError(`${entry.name} is over ${cap / MiB} MiB`);\n total += entry.size;\n entries.set(entry.name, entry);\n }\n if (total > LIMITS.total) throw new ImportError('the files add up to over 4 GiB');\n if (total > LIMITS.ratio * archive)\n throw new ImportError('the zip expands over 200:1, like a zip bomb');\n return entries;\n}\n\nexport async function openProfile(source: ZipSource): Promise<Opened> {\n if (source.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const list = await zipEntries(source);\n if (list.length > LIMITS.entries)\n throw new ImportError(`the zip has over ${LIMITS.entries} entries`);\n if (list[0]?.name !== 'manifest.json')\n throw new ImportError('manifest.json must be the first entry');\n const entries = scan(list, source.size);\n const manifest = checkManifest(json(await readEntry(source, list[0]), 'manifest.json'));\n const listed = new Set<string>();\n for (const file of manifest.files) {\n if (entries.get(file.path)?.size !== file.size || file.path === 'manifest.json')\n throw new ImportError(\n `${file.path} is in the manifest but not in the zip, or not at that size`\n );\n listed.add(file.path);\n }\n for (const name of entries.keys()) {\n if (name === 'manifest.json') continue;\n if (!listed.has(name)) throw new ImportError(`${name} is not listed in the manifest`);\n whereOf(manifest, name);\n }\n const { exportId, part } = manifest;\n return { manifest, entries, source, key: part ? `${exportId}#${part.index}` : exportId };\n}\n\nconst noLicks: Licks = { crontasks: [], tasks: [], webhooks: [] };\n\nasync function licksIn(opened: Opened, data?: Map<string, Uint8Array>): Promise<Licks> {\n const name = opened.manifest.licks;\n if (!name) return noLicks;\n const entry = opened.entries.get(name);\n if (!entry) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n return checkLicks(json(data?.get(name) ?? (await readEntry(opened.source, entry)), name));\n}\n\nconst ACCOUNTS: Record<string, string> = {\n 'bedrock-camp': 'amazon-bedrock',\n bedrock: 'amazon-bedrock',\n};\n\nexport function accountsOf(providers: readonly string[]): string[] {\n return [...new Set(providers.map((name) => ACCOUNTS[name] ?? name))];\n}\n\nconst UNITS = [\n [1024 ** 3, 'GB'],\n [1024 ** 2, 'MB'],\n [1024, 'KB'],\n] as const;\n\nexport type Account = { readonly id: string; readonly name?: string | undefined };\n\nconst NAMES: Record<string, string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n 'github-copilot': 'GitHub Copilot',\n google: 'Google',\n azure: 'Azure',\n 'azure-openai': 'Azure OpenAI',\n 'azure-ai-foundry': 'Azure AI Foundry',\n 'amazon-bedrock': 'Amazon Bedrock',\n adobe: 'Adobe',\n openrouter: 'OpenRouter',\n mistral: 'Mistral',\n groq: 'Groq',\n xai: 'xAI',\n deepseek: 'DeepSeek',\n 'local-llm': 'Local LLM',\n};\n\nexport function listed(names: readonly string[]): string {\n return names.length > 1 ? `${names.slice(0, -1).join(', ')} and ${names.at(-1)}` : names.join('');\n}\n\nexport function accountsSplit(providers: readonly string[], known?: readonly Account[]) {\n const accounts = accountsOf(providers);\n const ids = new Map((known ?? []).map((account) => [account.id, account.name]));\n const again = known ? accounts.filter((id) => ids.has(id)) : accounts;\n const missing = accounts.filter((id) => !again.includes(id));\n const nameOf = (id: string) => ids.get(id) || NAMES[id] || id;\n const lacking = missing.length\n ? `SLICC 7 has no accounts for ${listed(missing.map(nameOf))}.`\n : '';\n const settings = again.length ? `Re-enter in Settings: ${listed(again.map(nameOf))}.` : '';\n const signIn = again.length\n ? `Sign in to ${listed(again.map(nameOf))} again before you thaw them.`\n : '';\n return { again, missing, nameOf, lacking, settings, signIn };\n}\n\nconst said = (...parts: string[]) => parts.filter(Boolean).join(' ');\n\nconst words = (at: string) =>\n new Date(at).toLocaleDateString('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n timeZone: 'UTC',\n });\n\nconst hostOf = (origin: string) => (URL.canParse(origin) ? new URL(origin).host : origin);\n\nexport async function previewOf(\n opened: Opened,\n state: Readonly<AgentsState>,\n known?: readonly Account[]\n): Promise<ImportPreview> {\n const { manifest } = opened;\n const licks = await licksIn(opened);\n const bytes = manifest.files\n .filter((file) => file.path.startsWith('files/'))\n .reduce((sum, file) => sum + file.size, 0);\n const scoops = manifest.cones.reduce((sum, cone) => sum + cone.scoops.length, 0);\n const mounts = manifest.skipped\n .filter((item) => item.reason === 'mount')\n .map((item) => item.path.replace(/^\\/mnt\\//, ''));\n const crons =\n licks.crontasks.length + licks.tasks.filter((task) => task.scheduleType === 'cron').length;\n const host = hostOf(manifest.producer.origin);\n const split = accountsSplit(manifest.providers, known);\n const [at, unit] = UNITS.find(([at]) => bytes >= at) ?? (UNITS[2] as (typeof UNITS)[2]);\n const size = `${(bytes / at).toFixed(1)} ${unit}`;\n const parts = [\n plural(manifest.cones.length, 'cone'),\n plural(scoops, 'scoop'),\n plural(manifest.frozen.length, 'frozen session'),\n `${size} of files`,\n `${plural(manifest.skills.length, 'skill')} (for every agent)`,\n `${plural(crons, 'cron')} (imported off)`,\n `${plural(licks.webhooks.length, 'webhook')} (new URLs needed)`,\n `${plural(manifest.flagged.length, 'credential-like file')} to review`,\n ];\n return {\n exportId: manifest.exportId,\n origin: manifest.producer.origin,\n createdAt: manifest.createdAt,\n cones: manifest.cones.length,\n scoops,\n frozen: manifest.frozen.length,\n bytes,\n skills: manifest.skills.map((skill) => skill.name),\n crons,\n webhooks: licks.webhooks.length,\n flagged: manifest.flagged.map((item) => item.path),\n providers: split.again,\n mounts,\n already: state.imports?.[opened.key]?.at ?? null,\n text: said(\n `SLICC 6 profile from ${host}, exported ${words(manifest.createdAt)}.`,\n split.lacking\n ),\n line: said(\n `SLICC 6 profile from ${host}, exported ${day(manifest.createdAt)}: ${parts.join(', ')}.`,\n split.settings,\n split.lacking,\n `Not imported: ${plural(mounts.length, 'mount')}.`\n ),\n };\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', bytes as Uint8Array<ArrayBuffer>);\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\ntype Show = (phase: ImportProgress['phase'], done: number, total: number) => void;\n\nasync function verify(opened: Opened, writer: Writer, stage: string | null, show: Show) {\n const data = new Map<string, Uint8Array>();\n const { files } = opened.manifest;\n for (const [at, file] of files.entries()) {\n writer.check();\n const bytes = await readEntry(opened.source, opened.entries.get(file.path) as ZipEntry);\n if ((await sha256(bytes)) !== file.sha256.toLowerCase())\n throw new ImportError(`${file.path} doesn't match its sha256`);\n const where = whereOf(opened.manifest, file.path);\n if (where.kind === 'data') data.set(file.path, bytes);\n else if (where.kind !== 'skip' && stage) await writer.put(`${stage}/${file.path}`, bytes, true);\n show('checking', at + 1, files.length);\n }\n return data;\n}\n\nfunction transcriptIn(data: Map<string, Uint8Array>, name: string | null): Transcript | undefined {\n if (!name) return undefined;\n const bytes = data.get(name);\n if (!bytes) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n const value = json(bytes, name);\n try {\n return checkTranscript(value);\n } catch (error) {\n throw new ImportError(`${name}: ${(error as Error).message}`);\n }\n}\n\nfunction draft(\n fields: Pick<Unit, 'key' | 'name' | 'title' | 'six' | 'memory' | 'scoops'> & {\n doc?: Transcript;\n main?: V6Conversation;\n },\n when: (string | null | undefined)[],\n created: string\n): Unit {\n const last = fields.main?.messages.at(-1)?.timestamp;\n const frozenAt = [...when, last, created]\n .map((value) => Date.parse(value ?? ''))\n .find((at) => !Number.isNaN(at)) as number;\n const tail = (fields.doc?.conversations ?? [])\n .map((item) => item.messages.at(-1)?.id ?? '')\n .join(',');\n return {\n ...fields,\n frozenAt,\n tail,\n cone: '',\n fresh: true,\n record: true,\n suffix: '',\n home: '',\n roots: new Set(),\n files: new Map(),\n };\n}\n\nexport function unitsOf(manifest: Manifest, data: Map<string, Uint8Array>): Unit[] {\n const cones = manifest.cones.map((cone) => {\n const doc = transcriptIn(data, cone.transcript);\n const all = doc?.conversations ?? [];\n const main =\n all.find((item) => item.id === cone.conversation) ?? all.find((item) => item.kind === 'cone');\n const scoops = cone.scoops.map((scoop) => ({\n name: scoop.name,\n six: scoop.folder,\n folder: '',\n conversation:\n all.find((item) => item.id === scoop.conversation) ??\n all.find((item) => item.kind === 'scoop' && item.folder === scoop.folder),\n }));\n const title = doc?.session.title || cone.name;\n return draft(\n {\n key: cone.key,\n name: cone.name,\n title,\n six: cone.folder,\n memory: cone.memory,\n doc,\n main,\n scoops,\n },\n [doc?.session.updatedAt],\n manifest.createdAt\n );\n });\n const frozen = manifest.frozen.map((item) => {\n const doc = transcriptIn(data, item.transcript) as Transcript;\n const [main, ...rest] = [...doc.conversations].sort(\n (a, b) => Number(b.kind === 'cone') - Number(a.kind === 'cone')\n );\n const title = item.title || doc.session.title;\n const scoops = rest.map((conversation) => ({\n name: conversation.name,\n six: null,\n folder: '',\n conversation,\n }));\n const when = [item.frozenAt, doc.session.frozenAt, doc.session.updatedAt];\n return draft(\n { key: `frozen:${item.id}`, name: title, title, six: null, memory: null, doc, main, scoops },\n when,\n manifest.createdAt\n );\n });\n return [...cones, ...frozen];\n}\n\nfunction present(data: Map<string, Uint8Array>, name: string | null | undefined) {\n if (name && !data.has(name))\n throw new ImportError(`${name} is named in the manifest but not in the zip`);\n}\n\nfunction attached(manifest: Manifest, name: string, doc: Transcript) {\n const files = new Map(manifest.files.map((file) => [file.path, file]));\n for (const item of doc.attachments) {\n const file = files.get(item.path);\n const same =\n file !== undefined &&\n file.size === item.byteLength &&\n file.sha256.toLowerCase() === item.sha256.toLowerCase();\n if (item.present && !(item.path.startsWith('attachments/') && same))\n throw new ImportError(`${name}: attachment ${item.id} doesn't match ${item.path}`);\n }\n}\n\nfunction related(manifest: Manifest, data: Map<string, Uint8Array>) {\n const transcripts = [\n ...manifest.cones.map((cone) => cone.transcript),\n ...manifest.frozen.map((item) => item.transcript),\n ].filter((name): name is string => name !== null);\n const twice = transcripts.find((name, at) => transcripts.indexOf(name) !== at);\n if (twice) throw new ImportError(`${twice} is named twice in the manifest`);\n for (const name of [...manifest.cones.map((cone) => cone.memory), manifest.gitconfig])\n present(data, name);\n for (const [kind, items] of [\n ['skills', manifest.skills],\n ['sprinkles', manifest.sprinkles],\n ] as const)\n for (const item of items)\n if (\n item.path !== `${kind}/${item.name}/` ||\n !manifest.files.some((file) => file.path.startsWith(item.path))\n )\n throw new ImportError(`${item.path} is named in the manifest but has no files`);\n for (const cone of manifest.cones) {\n const doc = transcriptIn(data, cone.transcript);\n const ids = new Set(doc?.conversations.map((item) => item.id));\n for (const id of [cone.conversation, ...cone.scoops.map((scoop) => scoop.conversation)])\n if (id !== null && !ids.has(id))\n throw new ImportError(`${cone.transcript ?? cone.folder} has no conversation ${id}`);\n }\n for (const name of transcripts) attached(manifest, name, transcriptIn(data, name) as Transcript);\n}\n\nasync function parse(opened: Opened, data: Map<string, Uint8Array>): Promise<Parsed> {\n for (const [name, bytes] of data)\n if (name.startsWith('memory/') || name === opened.manifest.gitconfig) textOf(bytes, name);\n related(opened.manifest, data);\n return { data, licks: await licksIn(opened, data), units: unitsOf(opened.manifest, data) };\n}\n\nfunction prior(state: Readonly<AgentsState>, origin: string, key: string) {\n const known = new Set([\n ...Object.keys(state.cones),\n ...Object.values(state.frozen ?? {}).map((item) => item.cone),\n ]);\n return Object.values(state.imports ?? {})\n .filter((item) => item.origin === origin && known.has(item.cones[key] as string))\n .sort((a, b) => b.at - a.at)\n .map((item) => ({ cone: item.cones[key] as string, tail: item.tails[key] as string }))[0];\n}\n\nasync function assign(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n again: boolean,\n date: string,\n context: Context\n) {\n const { agents } = deps;\n const origin = opened.manifest.producer.origin;\n let fresh = 0;\n for (const unit of units) {\n const before = again ? undefined : prior(agents.state(), origin, unit.key);\n if (!before) fresh += 1;\n if (!before) continue;\n unit.cone = before.cone;\n unit.fresh = false;\n unit.record = before.tail !== unit.tail;\n if (unit.record) unit.title = `${unit.title} (updated)`;\n if (agents.state().cones[before.cone]) unit.suffix = `.v6-${date}`;\n }\n const first = fresh\n ? await agents.update((_tx, doc) => {\n doc.next += fresh;\n return doc.next - fresh;\n }, context)\n : 0;\n const taken: Record<string, ScoopRecord> = { ...agents.state().scoops };\n let next = first;\n for (const unit of units) {\n if (unit.fresh) unit.cone = `cone-${next++}`;\n unit.home = homeOf(unit.cone);\n for (const scoop of unit.scoops) {\n scoop.folder = freeFolder({ scoops: taken }, scoop.name);\n taken[scoopId(scoop.folder)] = {} as ScoopRecord;\n }\n }\n}\n\nconst ZERO = {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nfunction piMessage(\n message: V6Message,\n names: Map<string, string>,\n files: Map<string, string>\n): Message {\n const timestamp = Date.parse(message.timestamp);\n const texts = message.content.flatMap((part) => {\n if (part.type === 'text') return [{ type: 'text' as const, text: part.text }];\n if (part.type === 'tool-call') return [];\n const file = files.get(part.attachmentId);\n return [\n {\n type: 'text' as const,\n text: file ? `[Attached file: ${file}]` : '[An attachment SLICC 6 did not export]',\n },\n ];\n });\n if (message.role === 'user') return { role: 'user', content: texts, timestamp };\n const id = message.toolCallId as string;\n if (message.role === 'tool-result')\n return {\n role: 'toolResult',\n toolCallId: id,\n toolName: names.get(id) ?? 'tool',\n content: texts,\n isError: message.isError === true,\n timestamp,\n };\n const calls = message.content.flatMap((part) => {\n if (part.type !== 'tool-call') return [];\n names.set(part.id, part.name);\n const input = part.input;\n const object = typeof input === 'object' && input !== null && !Array.isArray(input);\n return [\n {\n type: 'toolCall' as const,\n id: part.id,\n name: part.name,\n arguments: (object ? input : { input }) as ToolCall['arguments'],\n },\n ];\n });\n const assistant: AssistantMessage = {\n role: 'assistant',\n content: [...texts, ...calls],\n api: message.model?.api ?? 'slicc-6',\n provider: message.model?.provider ?? 'slicc-6',\n model: message.model?.id ?? 'unknown',\n usage: (message.usage as typeof ZERO | undefined) ?? ZERO,\n stopReason: calls.length ? 'toolUse' : 'stop',\n timestamp,\n };\n return assistant;\n}\n\nexport function entriesOf(\n conversation: V6Conversation | undefined,\n files: Map<string, string>\n): EntryDraft[] {\n const names = new Map<string, string>();\n return (conversation?.messages ?? []).map((message) => ({\n kind: V6_KIND,\n data: { id: message.id },\n model: [piMessage(message, names, files)],\n }));\n}\n\nasync function conversationIn(\n tx: Tx,\n conversation: V6Conversation | undefined,\n unit: Unit,\n model: ModelRef | undefined\n) {\n const record = await tx.createConversation({ ownership: { kind: 'ownerless' } });\n if (model) await configure(tx, record.id, { model });\n for (const entry of entriesOf(conversation, unit.files)) await tx.appendEntry(record.id, entry);\n return record.id as number;\n}\n\nfunction modelOf(deps: ImportDeps, conversation: V6Conversation | undefined): string {\n const model = conversation?.messages.findLast((message) => message.model)?.model;\n if (!model) return '';\n return deps.catalog?.getModel(model.provider, model.id)?.name ?? `${model.provider}/${model.id}`;\n}\n\nasync function commit(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n at: number,\n context: Context\n) {\n const model = (await deps.agents.cone().agent(context)).model;\n const origin = opened.manifest.producer.origin;\n const last = TITLE_TURNS.at(-1) as number;\n return deps.agents.update(async (tx, doc) => {\n const made: string[] = [];\n for (const unit of units.filter((item) => item.record)) {\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n const scoops: string[] = [];\n for (const scoop of unit.scoops) {\n const id = scoopId(scoop.folder);\n if (doc.scoops[id])\n throw new ImportError(`the scoop folder ${scoop.folder} was taken during the import`);\n const conversation = await conversationIn(tx, scoop.conversation, unit, model);\n doc.scoops[id] = {\n name: scoop.name,\n folder: scoop.folder,\n cone: unit.cone,\n conversation,\n anchor: 0,\n role: null,\n kind: 'async',\n parent: unit.cone,\n depth: 1,\n roots: null,\n created: null,\n dropped: null,\n gone: true,\n frozen: frozenId,\n title: scoop.name,\n titled: last,\n };\n scoops.push(id);\n }\n doc.frozen ??= {};\n doc.frozen[frozenId] = {\n cone: unit.cone,\n name: unit.name,\n conversation: await conversationIn(tx, unit.main, unit, model),\n title: unit.title,\n model: modelOf(deps, unit.main),\n messages: (unit.main?.messages ?? []).filter((message) => message.role !== 'tool-result')\n .length,\n frozenAt: unit.frozenAt,\n scoops,\n v6: { origin, key: unit.key, ...(unit.suffix ? { suffix: unit.suffix } : {}) },\n };\n made.push(frozenId);\n }\n doc.imports ??= {};\n doc.imports[opened.key] = {\n at,\n origin,\n cones: Object.fromEntries(units.map((unit) => [unit.key, unit.cone])),\n tails: Object.fromEntries(units.map((unit) => [unit.key, unit.tail])),\n };\n return made;\n }, context);\n}\n\nasync function storageRoom(): Promise<number | undefined> {\n const estimate = await globalThis.navigator?.storage?.estimate?.().catch(() => undefined);\n return estimate?.quota === undefined ? undefined : estimate.quota - (estimate.usage ?? 0);\n}\n\nasync function importOpened(\n deps: ImportDeps,\n opened: Opened,\n options: { again: boolean; signal: AbortSignal; show: Show },\n context: Context\n): Promise<ImportResult> {\n const now = (deps.now ?? Date.now)();\n const date = day(now);\n const writer = new Writer(deps.env, context, options.signal);\n const stage = `${IMPORTS_DIR}/${opened.key.replace('#', '-part')}`;\n const total = opened.manifest.files.reduce((sum, file) => sum + file.size, 0);\n const room = await (deps.room ?? storageRoom)();\n if (room !== undefined && room < 2 * total)\n throw new ImportError('there is not enough free storage for this import');\n try {\n await writer.sh(\n `mkdir -p ${IMPORTS_DIR} && chmod 700 ${IMPORTS_DIR} && rm -rf ${quote(stage)} && mkdir -p ${quote(stage)}`\n );\n const data = await verify(opened, writer, stage, options.show);\n const parsed = await parse(opened, data);\n await assign(deps, opened, parsed.units, options.again, date, context);\n const notes: Notes = {\n lines: [],\n skipped: [],\n shadowed: [],\n tasks: [],\n sprinkles: new Map(),\n crons: [],\n webhooks: [],\n placed: new Map(),\n };\n const run = {\n deps,\n opened,\n parsed,\n writer,\n stage,\n date,\n notes,\n show: options.show,\n fresh: new Map(),\n ready: new Set<Unit>(),\n };\n let made: string[];\n try {\n await place(run);\n made = await commit(deps, opened, parsed.units, now, context);\n } catch (error) {\n await writer.rollback();\n throw error;\n }\n const report = await reportOf(run, made).catch((error: Error) => `nowhere (${error.message})`);\n const split = accountsSplit(opened.manifest.providers, deps.providers);\n const { origin } = opened.manifest.producer;\n const settings = said(split.settings, split.lacking);\n return {\n done: true,\n preview: null,\n cones: made,\n report,\n text: said(`From ${hostOf(origin)}.`, split.signIn),\n line: `Imported ${plural(made.length, 'frozen cone')} from ${origin}${made.length ? `: ${made.join(', ')}` : ''}.\\n${settings ? `${settings}\\n` : ''}The report is ${report}.\\n`,\n error: null,\n };\n } finally {\n await deps.env.remove(stage, { recursive: true, force: true }, BACKGROUND_CONTEXT);\n }\n}\n\nasync function sourceOf(\n deps: ImportDeps,\n source: ReadSource,\n context: Context\n): Promise<ZipSource> {\n if ('bytes' in source) return bytesSource(source.bytes);\n const { env } = deps;\n const real = await env.canonicalPath(source.path, context);\n const info = real.ok ? await env.fileInfo(real.value, context) : real;\n if (!info.ok) throw new ImportError(`can't read ${source.path}: ${info.error.message}`);\n if (info.value.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const file = await opfsFile(info.value.path, deps.opfs);\n if (file?.size === info.value.size) return blobSource(file);\n if (info.value.size > LIMITS.file)\n throw new ImportError(`${source.path} isn't on seven's own disk; copy the zip to /tmp first`);\n const read = await env.readBinaryFile(info.value.path, context);\n if (!read.ok) throw new ImportError(`can't read ${source.path}: ${read.error.message}`);\n return bytesSource(read.value);\n}\n\nexport interface Importer {\n readonly progress: ReplicatedState<ImportProgress>;\n run(\n source: ImportSource,\n options: { again?: boolean; preview?: boolean },\n context: Context\n ): Promise<ImportResult>;\n cancel(): void;\n}\n\nexport const IDLE: ImportProgress = { phase: 'idle', done: 0, total: 0, text: '' };\n\nexport function createImporter(deps: ImportDeps): Importer {\n const progress = replicatedState<ImportProgress>(IDLE);\n let running: AbortController | undefined;\n const result = (fields: Partial<ImportResult>): ImportResult => ({\n done: false,\n preview: null,\n cones: [],\n report: null,\n text: '',\n line: '',\n error: null,\n ...fields,\n });\n return {\n progress,\n cancel: () => running?.abort(),\n async run(source, options, context) {\n if (running) return result({ error: 'an import is already running' });\n const controller = new AbortController();\n running = controller;\n const show: Show = (phase, done, total) =>\n progress.replace(BACKGROUND_CONTEXT, {\n phase,\n done,\n total,\n text: `${phase === 'checking' ? 'Checking' : 'Importing'} ${done} of ${total}`,\n });\n let upload: { path: string } | undefined;\n try {\n upload = uploaded(source);\n const opened = await openProfile(\n await sourceOf(deps, upload ?? (source as ReadSource), context)\n );\n const preview = await previewOf(opened, deps.agents.state(), deps.providers);\n if (options.preview) {\n const writer = new Writer(deps.env, context, controller.signal);\n await parse(opened, await verify(opened, writer, null, show));\n progress.replace(BACKGROUND_CONTEXT, IDLE);\n return result({ preview, text: preview.text, line: `${preview.line}\\n` });\n }\n if (preview.already !== null && !options.again)\n return result({\n preview,\n text: `Already imported on ${day(preview.already)}.`,\n line: `Already imported on ${day(preview.already)}; freezer import --again makes fresh copies.\\n`,\n });\n const done = await importOpened(\n deps,\n opened,\n { again: options.again === true, signal: controller.signal, show },\n context\n );\n progress.replace(BACKGROUND_CONTEXT, { ...progress.value, phase: 'done', text: done.text });\n return { ...done, preview };\n } catch (error) {\n const message =\n error instanceof ImportError\n ? error.message\n : `the import failed: ${(error as Error).message}`;\n progress.replace(BACKGROUND_CONTEXT, { phase: 'failed', done: 0, total: 0, text: message });\n return result({ error: message });\n } finally {\n running = undefined;\n if (upload) await deps.env.remove(upload.path, { force: true }, BACKGROUND_CONTEXT);\n }\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["listed", "at"]
7
7
  }
package/dist/host.js CHANGED
@@ -11,6 +11,7 @@ import { alwaysFor, attachApprovalPolicy } from "./approvals/policy.js";
11
11
  import { createSudo, ownedSudo } from "./approvals/sudo.js";
12
12
  import { createAgentControl } from "./control.js";
13
13
  import { trackDeliveries } from "./deliveries.js";
14
+ import { IDLE } from "./freezer/v6.js";
14
15
  import { createGuests } from "./guests/index.js";
15
16
  import { admitGuest, guestOpener } from "./guests/serve.js";
16
17
  import { createMonitor } from "./monitor/index.js";
@@ -200,6 +201,7 @@ async function hostAgent(agent, options = {}) {
200
201
  memories: options.memory?.memories ?? replicatedState([]),
201
202
  memoryScopes: options.memory?.scopes ?? replicatedState([]),
202
203
  frozen: options.freezer?.frozen ?? replicatedState([]),
204
+ importing: options.freezer?.importing ?? replicatedState(IDLE),
203
205
  changes: options.changes?.view ?? replicatedState({ unavailable: null, changes: [] }),
204
206
  monitor: monitor.state,
205
207
  vault: options.secrets?.vault ?? idleVault,
package/dist/host.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/host.ts"],
4
- "sourcesContent": ["import {\n type Context,\n createHost,\n forbidden,\n type Host,\n type Readable,\n type ReplicatedState,\n replicatedState,\n type Self,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Agent } from './agent.ts';\nimport {\n type ApprovalJudge,\n type Approvals,\n attachApprovals,\n type Decider,\n} from './approvals/index.ts';\nimport { type ApprovalPolicies, alwaysFor, attachApprovalPolicy } from './approvals/policy.ts';\nimport { type AgentSudo, createSudo, ownedSudo } from './approvals/sudo.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { ChangesRuntime } from './changes/index.ts';\nimport { createAgentControl, type HostLicks, type HostScoops } from './control.ts';\nimport { trackDeliveries } from './deliveries.ts';\nimport type { FreezerRuntime, FrozenCone } from './freezer/index.ts';\nimport { createGuests, type Guests } from './guests/index.ts';\nimport type { ScoopReviewHost } from './guests/scoop.ts';\nimport { admitGuest, guestOpener } from './guests/serve.ts';\nimport type { UserClients } from './kernel/users.ts';\nimport type { McpRuntime } from './mcp/index.ts';\nimport type { MemoryEntry, MemoryScope } from './memory/format.ts';\nimport type { MemoryRuntime } from './memory/index.ts';\nimport { createMonitor, type MonitorOptions } from './monitor/index.ts';\nimport { viewRemote } from './readonly.ts';\nimport { type AgentRemote, createRemote } from './remote/host.ts';\nimport { createPages, ownedPages, type Pages } from './remote/pages.ts';\nimport type { SecretName } from './secrets/names.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport {\n AgentControl,\n type AgentGuest,\n AgentGuestService,\n AgentPagesService,\n AgentRemoteService,\n AgentSettings,\n AgentSudoService,\n AgentTranscript,\n CONTROL_METHODS,\n CONTROL_READS,\n type Command,\n GUEST_METHODS,\n OWNER_DEVICE_METHODS,\n PAGE_METHODS,\n type PrivateRevision,\n REMOTE_METHODS,\n REMOTE_READS,\n SETTINGS_METHODS,\n SUDO_METHODS,\n} from './services.ts';\nimport {\n AGENT_HOST,\n type AgentPrincipal,\n type GuestPrincipal,\n principalKey,\n readable,\n readablesOf,\n SELF,\n type Seat,\n served,\n} from './serving.ts';\nimport type { SkillsRuntime } from './skills/index.ts';\nimport type { SprinklesRuntime } from './sprinkles/index.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\nimport { slimmer, type Thumbnail, thumbnail } from './thumbs.ts';\nimport { type LabelsRuntime, visibleLabels, watchLabel } from './titles/labels.ts';\nimport type { Uploads } from './uploads.ts';\nimport { agentViews } from './views.ts';\nimport { type PortEndpoint, PortLink } from './wire.ts';\n\nexport interface ConnectOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n device?: string;\n}\n\nexport interface AgentHost {\n readonly serverId: string;\n readonly agent: Agent;\n readonly users?: UserClients;\n readonly pages: Pages;\n readonly guests: Guests;\n readonly approvals: Approvals;\n connect(endpoint: PortEndpoint, options?: ConnectOptions): void;\n close(): Promise<void>;\n}\n\nconst noSettings: AgentSettings = {\n state: replicatedState({ models: [], accounts: [] }),\n connect: async () => {\n throw new Error('this agent has no accounts');\n },\n disconnect: async () => {},\n signIn: async () => null,\n dismissMoved: async () => {},\n};\n\nasync function follow(\n agent: Agent,\n context: Context,\n slim: (view: ConversationView) => ConversationView\n) {\n let attached = await agent.cone().viewState(context);\n const state = replicatedState<ConversationView>(slim(attached.value));\n const mirror = (value: ConversationView, from: Context) => state.replace(from, slim(value));\n let off = attached.subscribe(mirror);\n const stop = agent.onCone(async (conversation) => {\n const next = await conversation.viewState(context);\n off();\n attached.dispose();\n attached = next;\n state.replace(context, slim(next.value));\n off = next.subscribe(mirror);\n });\n return {\n state,\n refresh: () => state.replace(context, slim(attached.value)),\n dispose() {\n stop();\n off();\n attached.dispose();\n },\n };\n}\n\nexport interface HostSecrets {\n vault: ReplicatedState<VaultState>;\n list(): readonly SecretName[];\n close?(): void;\n}\n\nconst idleVault = replicatedState<VaultState>({\n port: 'none',\n needed: false,\n version: 0,\n locked: 'no',\n held: 0,\n});\n\nfunction gatedControls(\n control: AgentControl,\n shown: (entry: number) => boolean,\n views: () => readonly ConversationView[],\n labels: ReplicatedState<Record<string, string>>\n) {\n const visible = (entry: number) =>\n views().some((view) => view.entries.some((item) => item.id === entry));\n const gated =\n (allowed: (entry: number) => boolean): AgentControl['image'] =>\n async (ref, using) =>\n allowed(ref.entry) ? control.image(ref, using) : { data: null, mimeType: null };\n const trusted: AgentControl = { ...control, image: gated(shown) };\n const viewed: AgentControl = { ...control, image: gated(visible), toolLabel: watchLabel(labels) };\n return { trusted, viewed };\n}\n\nasync function approving(\n agent: Agent,\n policy: ApprovalPolicies,\n options: { judge?: ApprovalJudge; intent?: ScoopReviewHost['intent']; approvalMs?: number },\n context: Context\n): Promise<Approvals> {\n const approvals = await attachApprovals(\n {\n harness: agent.harness,\n guestAlways: alwaysFor(policy),\n sudoApprover: () => policy.current().sudo.approver,\n scoops: agent.scoopReviews,\n ...(options.judge ? { judge: options.judge } : {}),\n ...(options.approvalMs ? { ttlMs: options.approvalMs } : {}),\n },\n context\n );\n agent.scoopReviews.bind({\n approvals,\n agents: agent.agents,\n harness: agent.harness,\n ...(options.intent ? { intent: options.intent } : {}),\n });\n return approvals;\n}\n\nasync function guestsOf(\n agent: Agent,\n approvals: Approvals,\n policy: ApprovalPolicies,\n context: Context\n): Promise<Guests> {\n const guests = await createGuests({\n harness: agent.harness,\n agents: agent.agents,\n approvals,\n policy,\n reviews: agent.reviews,\n context,\n });\n agent.gate.bind({ approvals, policy: () => guests.policy() });\n return guests;\n}\n\nconst noRevision = () => replicatedState<PrivateRevision>({ revision: 0 });\n\nexport async function hostAgent(\n agent: Agent,\n options: {\n serverId?: string;\n context?: Context;\n settings?: AgentSettings;\n licks?: HostLicks;\n scoops?: HostScoops;\n skills?: SkillsRuntime;\n sprinkles?: SprinklesRuntime;\n memory?: MemoryRuntime;\n freezer?: FreezerRuntime;\n changes?: ChangesRuntime;\n mcp?: Pick<McpRuntime, 'close'>;\n users?: UserClients;\n monitor?: Pick<MonitorOptions, 'kernel' | 'groups' | 'users'>;\n pages?: Pages;\n secrets?: HostSecrets;\n uploads?: Uploads;\n thumbnail?: Thumbnail;\n labels?: LabelsRuntime;\n approvals?: Approvals;\n judge?: ApprovalJudge;\n intent?: ScoopReviewHost['intent'];\n approvalMs?: number;\n } = {}\n): Promise<AgentHost> {\n const context = options.context ?? BACKGROUND_CONTEXT;\n const serverId = options.serverId ?? crypto.randomUUID();\n let refresh = () => {};\n const slims = slimmer(options.thumbnail ?? thumbnail, () => refresh());\n const transcript = await follow(agent, context, slims.slim);\n const { state } = transcript;\n const mounted = await agentViews(agent, context, slims.slim);\n refresh = () => {\n transcript.refresh();\n mounted.refresh();\n };\n const touch = () => options.freezer?.touch();\n const untouch = [state.subscribe(touch), mounted.views.subscribe(touch)];\n const pages = options.pages ?? createPages();\n const deliveries = trackDeliveries(agent.harness, state, context);\n const policy = await attachApprovalPolicy(agent.harness, context);\n const approvals = options.approvals ?? (await approving(agent, policy, options, context));\n const monitor = createMonitor({\n ...options.monitor,\n harness: agent.harness,\n agents: agent.agents,\n views: mounted.views,\n context,\n });\n const guests = await guestsOf(agent, approvals, policy, context);\n const control: AgentControl = {\n ...createAgentControl(\n agent.harness,\n agent,\n deliveries,\n options.licks,\n options.scoops,\n options.skills,\n options.sprinkles,\n options.memory,\n options.freezer,\n options.changes,\n monitor,\n options.secrets?.list,\n options.uploads,\n options.labels,\n guests\n ),\n approvalPolicySet: (change, using) => policy.set(change, using),\n };\n const remote = createRemote({\n harness: agent.harness,\n send: (request, using) => control.send(request, using),\n vault: options.secrets?.vault ?? idleVault,\n async conversation(agentId, using) {\n if (!agentId) return agent.cone();\n const found = await agent.agents.conversation(agentId, using);\n if (!found) throw new Error(`There is no agent ${agentId}.`);\n return found;\n },\n });\n const shownViews = () => [state.value, ...Object.values(mounted.views.value)];\n const kept = options.labels?.labels ?? replicatedState<Record<string, string>>({});\n const labels = visibleLabels(kept, [state, mounted.views], shownViews);\n const transcriptService = {\n state,\n deliveries: deliveries.state,\n agents: mounted.agents,\n views: mounted.views,\n commands: options.skills?.commands ?? replicatedState<Command[]>([]),\n privateRevision: options.skills?.privateRevision ?? noRevision(),\n sprinkles: options.sprinkles?.sprinkles ?? replicatedState<Sprinkle[]>([]),\n memories: options.memory?.memories ?? replicatedState<MemoryEntry[]>([]),\n memoryScopes: options.memory?.scopes ?? replicatedState<MemoryScope[]>([]),\n frozen: options.freezer?.frozen ?? replicatedState<FrozenCone[]>([]),\n changes:\n options.changes?.view ?? replicatedState<ChangesView>({ unavailable: null, changes: [] }),\n monitor: monitor.state,\n vault: options.secrets?.vault ?? idleVault,\n labels: labels.state,\n guests: guests.seats,\n approvals: approvals.state,\n approvalPolicy: policy.state,\n };\n const sudo = createSudo({\n approvals,\n agents: () => agent.agents.state(),\n ...(options.licks ? { licks: options.licks.licks } : {}),\n });\n const settings = options.settings ?? noSettings;\n const gates = gatedControls(control, slims.shown, shownViews, transcriptService.labels);\n const { trusted, viewed } = gates;\n const host = serveAgent({\n trusted,\n viewed,\n transcript: transcriptService,\n viewMonitor: monitor.viewState,\n sudo,\n settings,\n remote,\n pages,\n guest: guestOpener(guests, agent.agents, mounted.views, context),\n decide: (by) => (id, decision, reason, using) =>\n approvals.decide(id, decision, reason, by, using),\n });\n const offGuests = guests.onEnd((id) => {\n void host.invalidatePrincipal(\n (principal) => principal.seat === 'guest' && principal.guest.id === id\n );\n });\n let links = 0;\n return {\n serverId,\n agent,\n pages,\n guests,\n approvals,\n ...(options.users ? { users: options.users } : {}),\n connect(endpoint, connectOptions) {\n if (connectOptions?.guest) {\n links += 1;\n admitGuest(guests, endpoint, connectOptions.guest, serverId, links, host);\n return;\n }\n const seat: Exclude<Seat, 'guest'> = connectOptions?.readOnly\n ? 'view'\n : connectOptions?.pages === false\n ? 'control'\n : 'owner';\n links += 1;\n const link = new PortLink(endpoint);\n link.greet(serverId);\n const device = connectOptions?.device ? { device: connectOptions.device } : {};\n host.accept(link, {\n principal: { seat, link: links, ...device } satisfies AgentPrincipal,\n });\n },\n async close() {\n offGuests();\n await host.close();\n guests.dispose();\n await pages.dispose();\n await monitor.dispose();\n await remote.dispose();\n deliveries.dispose();\n sudo.close();\n approvals.close();\n transcript.dispose();\n mounted.dispose();\n labels.dispose();\n slims.dispose();\n for (const off of untouch) off();\n options.freezer?.close();\n options.secrets?.close?.();\n await options.changes?.close(context);\n await options.memory?.close(context);\n await options.sprinkles?.close(context);\n await options.skills?.close(context);\n await options.mcp?.close(context);\n await options.scoops?.runtime.close(context);\n await options.licks?.sources.close(context);\n await agent.close();\n await options.users?.close();\n },\n };\n}\n\ninterface Served {\n trusted: AgentControl;\n viewed: AgentControl;\n transcript: Record<keyof AgentTranscript, ReplicatedState<unknown>>;\n viewMonitor: ReplicatedState<unknown>;\n sudo?: AgentSudo;\n settings: AgentSettings;\n remote: AgentRemote;\n pages: Pages;\n guest?: (principal: GuestPrincipal) => { value: AgentGuest; dispose(): void } | undefined;\n decide: (by: Decider) => AgentControl['decide'];\n}\n\nexport const CLOSED_TO_GUESTS = 'a guest seat has only its transcript and propose';\n\nconst opened = new WeakSet<object>();\n\nexport const openToGuests = <F extends object>(factory: F): F => {\n opened.add(factory);\n return factory;\n};\n\nexport function closedToGuests(host: Host<AgentPrincipal>): Host<AgentPrincipal> {\n const serve = ((type: never, factory: (...args: unknown[]) => unknown, options?: never) =>\n host.serve(\n type,\n (opened.has(factory)\n ? factory\n : (input: unknown, principal: AgentPrincipal, self: unknown) => {\n if (principal.seat === 'guest') throw forbidden(CLOSED_TO_GUESTS);\n return factory(input, principal, self);\n }) as never,\n options\n )) as Host<AgentPrincipal>['serve'];\n return new Proxy(host, {\n get(target, key) {\n if (key === 'serve') return serve;\n const value = Reflect.get(target, key, target) as unknown;\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\nexport function lazily<T>(state: () => ReplicatedState<T>): Readable<T> {\n return {\n get value() {\n return readable(state()).value;\n },\n subscribe: (listener) => readable(state()).subscribe(listener),\n events: (listener) => readable(state()).events(listener),\n };\n}\n\nconst seated = (serving: Served, principal: AgentPrincipal): AgentControl => ({\n ...(principal.seat === 'view' ? serving.viewed : serving.trusted),\n decide: serving.decide({\n by: principal.seat === 'owner' ? 'owner' : 'follower',\n ...('device' in principal && principal.device ? { device: principal.device } : {}),\n }),\n});\n\nconst VIEW_METHODS = [...CONTROL_READS, ...OWNER_DEVICE_METHODS];\n\nexport function serveAgent(serving: Served): Host<AgentPrincipal> {\n const host = closedToGuests(\n createHost<AgentPrincipal>({ name: AGENT_HOST, self: SELF, principalKey })\n );\n const viewing = { ...serving.transcript, monitor: serving.viewMonitor };\n host.serve(AgentControl, (_input, principal) => {\n const control = seated(serving, principal);\n return principal.seat === 'view'\n ? { variant: 'view', ...served(() => control, VIEW_METHODS) }\n : { variant: 'control', ...served(() => control, CONTROL_METHODS) };\n });\n host.serve(AgentTranscript, (_input, principal) => ({\n variant: 'transcript',\n ...readablesOf(principal.seat === 'view' ? viewing : serving.transcript),\n }));\n host.serve(AgentSettings, (_input, principal) =>\n principal.seat === 'view'\n ? { variant: 'view', state: readable(serving.settings.state) }\n : {\n variant: 'settings',\n state: readable(serving.settings.state),\n ...served(() => serving.settings, SETTINGS_METHODS),\n }\n );\n host.serve(AgentRemoteService, (_input, principal) => {\n if (principal.seat !== 'view')\n return { variant: 'remote', ...served(() => serving.remote, REMOTE_METHODS) };\n const scoped = viewRemote(serving.remote);\n return { variant: 'watch', ...served(() => scoped, REMOTE_READS) };\n });\n host.serve(AgentPagesService, (_input, principal, self) => {\n if (principal.seat !== 'owner') return { variant: 'none' };\n const mine = self.resource('mine', {\n version: 1,\n open: () => ownedPages(serving.pages),\n close: (owned) => owned.release(),\n });\n return { variant: 'pages', ...served(() => mine.value, PAGE_METHODS) };\n });\n host.serve(\n AgentGuestService,\n openToGuests((_input: unknown, principal: AgentPrincipal, self: Self<AgentPrincipal>) => {\n if (principal.seat !== 'guest') return { variant: 'none' };\n const opening = serving.guest?.(principal.guest);\n if (!opening) throw forbidden(CLOSED_TO_GUESTS);\n const seat = self.resource('seat', {\n version: 1,\n open: () => opening,\n close: (made) => made.dispose(),\n });\n const later = (name: 'transcript' | 'seat' | 'proposals') =>\n lazily(() => seat.value.value[name] as ReplicatedState<unknown>);\n return {\n variant: 'guest',\n transcript: later('transcript'),\n seat: later('seat'),\n proposals: later('proposals'),\n ...served(() => seat.value.value, GUEST_METHODS),\n };\n })\n );\n host.serve(AgentSudoService, (_input, principal, self) => {\n const sudo = serving.sudo;\n if (principal.seat !== 'owner' || !sudo) return { variant: 'none' };\n const mine = self.resource('mine', {\n version: 1,\n open: () => ownedSudo(sudo),\n close: (owned) => owned.release(),\n });\n return {\n variant: 'sudo',\n approvals: readable(sudo.approvals),\n ...served(() => mine.value, SUDO_METHODS),\n };\n });\n return host;\n}\n"],
5
- "mappings": "AAAA;AAAA,EAEE;AAAA,EACA;AAAA,EAIA;AAAA,OAEK;AACP,SAAS,0BAA0B;AAGnC;AAAA,EAGE;AAAA,OAEK;AACP,SAAgC,WAAW,4BAA4B;AACvE,SAAyB,YAAY,iBAAiB;AAGtD,SAAS,0BAA2D;AACpE,SAAS,uBAAuB;AAEhC,SAAS,oBAAiC;AAE1C,SAAS,YAAY,mBAAmB;AAKxC,SAAS,qBAA0C;AACnD,SAAS,kBAAkB;AAC3B,SAA2B,oBAAoB;AAC/C,SAAS,aAAa,kBAA8B;AAGpD;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAIP,SAAS,SAAyB,iBAAiB;AACnD,SAA6B,eAAe,kBAAkB;AAE9D,SAAS,kBAAkB;AAC3B,SAA4B,gBAAgB;AAoB5C,MAAM,aAA4B;AAAA,EAChC,OAAO,gBAAgB,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EACnD,SAAS,YAAY;AACnB,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAAA,EACA,YAAY,YAAY;AAAA,EAAC;AAAA,EACzB,QAAQ,YAAY;AAAA,EACpB,cAAc,YAAY;AAAA,EAAC;AAC7B;AAEA,eAAe,OACb,OACA,SACA,MACA;AACA,MAAI,WAAW,MAAM,MAAM,KAAK,EAAE,UAAU,OAAO;AACnD,QAAM,QAAQ,gBAAkC,KAAK,SAAS,KAAK,CAAC;AACpE,QAAM,SAAS,CAAC,OAAyB,SAAkB,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAC1F,MAAI,MAAM,SAAS,UAAU,MAAM;AACnC,QAAM,OAAO,MAAM,OAAO,OAAO,iBAAiB;AAChD,UAAM,OAAO,MAAM,aAAa,UAAU,OAAO;AACjD,QAAI;AACJ,aAAS,QAAQ;AACjB,eAAW;AACX,UAAM,QAAQ,SAAS,KAAK,KAAK,KAAK,CAAC;AACvC,UAAM,KAAK,UAAU,MAAM;AAAA,EAC7B,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM,MAAM,QAAQ,SAAS,KAAK,SAAS,KAAK,CAAC;AAAA,IAC1D,UAAU;AACR,WAAK;AACL,UAAI;AACJ,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;AAQA,MAAM,YAAY,gBAA4B;AAAA,EAC5C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR,CAAC;AAED,SAAS,cACP,SACA,OACA,OACA,QACA;AACA,QAAM,UAAU,CAAC,UACf,MAAM,EAAE,KAAK,CAAC,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,CAAC;AACvE,QAAM,QACJ,CAAC,YACD,OAAO,KAAK,UACV,QAAQ,IAAI,KAAK,IAAI,QAAQ,MAAM,KAAK,KAAK,IAAI,EAAE,MAAM,MAAM,UAAU,KAAK;AAClF,QAAM,UAAwB,EAAE,GAAG,SAAS,OAAO,MAAM,KAAK,EAAE;AAChE,QAAM,SAAuB,EAAE,GAAG,SAAS,OAAO,MAAM,OAAO,GAAG,WAAW,WAAW,MAAM,EAAE;AAChG,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEA,eAAe,UACb,OACA,QACA,SACA,SACoB;AACpB,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,MACE,SAAS,MAAM;AAAA,MACf,aAAa,UAAU,MAAM;AAAA,MAC7B,cAAc,MAAM,OAAO,QAAQ,EAAE,KAAK;AAAA,MAC1C,QAAQ,MAAM;AAAA,MACd,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,MAChD,GAAI,QAAQ,aAAa,EAAE,OAAO,QAAQ,WAAW,IAAI,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,EACrD,CAAC;AACD,SAAO;AACT;AAEA,eAAe,SACb,OACA,WACA,QACA,SACiB;AACjB,QAAM,SAAS,MAAM,aAAa;AAAA,IAChC,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AACD,QAAM,KAAK,KAAK,EAAE,WAAW,QAAQ,MAAM,OAAO,OAAO,EAAE,CAAC;AAC5D,SAAO;AACT;AAEA,MAAM,aAAa,MAAM,gBAAiC,EAAE,UAAU,EAAE,CAAC;AAEzE,eAAsB,UACpB,OACA,UAuBI,CAAC,GACe;AACpB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,QAAQ,YAAY,OAAO,WAAW;AACvD,MAAI,UAAU,MAAM;AAAA,EAAC;AACrB,QAAM,QAAQ,QAAQ,QAAQ,aAAa,WAAW,MAAM,QAAQ,CAAC;AACrE,QAAM,aAAa,MAAM,OAAO,OAAO,SAAS,MAAM,IAAI;AAC1D,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,UAAU,MAAM,WAAW,OAAO,SAAS,MAAM,IAAI;AAC3D,YAAU,MAAM;AACd,eAAW,QAAQ;AACnB,YAAQ,QAAQ;AAAA,EAClB;AACA,QAAM,QAAQ,MAAM,QAAQ,SAAS,MAAM;AAC3C,QAAM,UAAU,CAAC,MAAM,UAAU,KAAK,GAAG,QAAQ,MAAM,UAAU,KAAK,CAAC;AACvE,QAAM,QAAQ,QAAQ,SAAS,YAAY;AAC3C,QAAM,aAAa,gBAAgB,MAAM,SAAS,OAAO,OAAO;AAChE,QAAM,SAAS,MAAM,qBAAqB,MAAM,SAAS,OAAO;AAChE,QAAM,YAAY,QAAQ,aAAc,MAAM,UAAU,OAAO,QAAQ,SAAS,OAAO;AACvF,QAAM,UAAU,cAAc;AAAA,IAC5B,GAAG,QAAQ;AAAA,IACX,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,OAAO,QAAQ;AAAA,IACf;AAAA,EACF,CAAC;AACD,QAAM,SAAS,MAAM,SAAS,OAAO,WAAW,QAAQ,OAAO;AAC/D,QAAM,UAAwB;AAAA,IAC5B,GAAG;AAAA,MACD,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,IACA,mBAAmB,CAAC,QAAQ,UAAU,OAAO,IAAI,QAAQ,KAAK;AAAA,EAChE;AACA,QAAM,SAAS,aAAa;AAAA,IAC1B,SAAS,MAAM;AAAA,IACf,MAAM,CAAC,SAAS,UAAU,QAAQ,KAAK,SAAS,KAAK;AAAA,IACrD,OAAO,QAAQ,SAAS,SAAS;AAAA,IACjC,MAAM,aAAa,SAAS,OAAO;AACjC,UAAI,CAAC,QAAS,QAAO,MAAM,KAAK;AAChC,YAAM,QAAQ,MAAM,MAAM,OAAO,aAAa,SAAS,KAAK;AAC5D,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qBAAqB,OAAO,GAAG;AAC3D,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,QAAM,aAAa,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,OAAO,QAAQ,MAAM,KAAK,CAAC;AAC5E,QAAM,OAAO,QAAQ,QAAQ,UAAU,gBAAwC,CAAC,CAAC;AACjF,QAAM,SAAS,cAAc,MAAM,CAAC,OAAO,QAAQ,KAAK,GAAG,UAAU;AACrE,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,YAAY,WAAW;AAAA,IACvB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ,QAAQ,YAAY,gBAA2B,CAAC,CAAC;AAAA,IACnE,iBAAiB,QAAQ,QAAQ,mBAAmB,WAAW;AAAA,IAC/D,WAAW,QAAQ,WAAW,aAAa,gBAA4B,CAAC,CAAC;AAAA,IACzE,UAAU,QAAQ,QAAQ,YAAY,gBAA+B,CAAC,CAAC;AAAA,IACvE,cAAc,QAAQ,QAAQ,UAAU,gBAA+B,CAAC,CAAC;AAAA,IACzE,QAAQ,QAAQ,SAAS,UAAU,gBAA8B,CAAC,CAAC;AAAA,IACnE,SACE,QAAQ,SAAS,QAAQ,gBAA6B,EAAE,aAAa,MAAM,SAAS,CAAC,EAAE,CAAC;AAAA,IAC1F,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ,SAAS,SAAS;AAAA,IACjC,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,WAAW,UAAU;AAAA,IACrB,gBAAgB,OAAO;AAAA,EACzB;AACA,QAAM,OAAO,WAAW;AAAA,IACtB;AAAA,IACA,QAAQ,MAAM,MAAM,OAAO,MAAM;AAAA,IACjC,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,MAAM,IAAI,CAAC;AAAA,EACxD,CAAC;AACD,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,QAAQ,cAAc,SAAS,MAAM,OAAO,YAAY,kBAAkB,MAAM;AACtF,QAAM,EAAE,SAAS,OAAO,IAAI;AAC5B,QAAM,OAAO,WAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,YAAY,QAAQ,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,IAC/D,QAAQ,CAAC,OAAO,CAAC,IAAI,UAAU,QAAQ,UACrC,UAAU,OAAO,IAAI,UAAU,QAAQ,IAAI,KAAK;AAAA,EACpD,CAAC;AACD,QAAM,YAAY,OAAO,MAAM,CAAC,OAAO;AACrC,SAAK,KAAK;AAAA,MACR,CAAC,cAAc,UAAU,SAAS,WAAW,UAAU,MAAM,OAAO;AAAA,IACtE;AAAA,EACF,CAAC;AACD,MAAI,QAAQ;AACZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,QAAQ,UAAU,gBAAgB;AAChC,UAAI,gBAAgB,OAAO;AACzB,iBAAS;AACT,mBAAW,QAAQ,UAAU,eAAe,OAAO,UAAU,OAAO,IAAI;AACxE;AAAA,MACF;AACA,YAAM,OAA+B,gBAAgB,WACjD,SACA,gBAAgB,UAAU,QACxB,YACA;AACN,eAAS;AACT,YAAM,OAAO,IAAI,SAAS,QAAQ;AAClC,WAAK,MAAM,QAAQ;AACnB,YAAM,SAAS,gBAAgB,SAAS,EAAE,QAAQ,eAAe,OAAO,IAAI,CAAC;AAC7E,WAAK,OAAO,MAAM;AAAA,QAChB,WAAW,EAAE,MAAM,MAAM,OAAO,GAAG,OAAO;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACA,MAAM,QAAQ;AACZ,gBAAU;AACV,YAAM,KAAK,MAAM;AACjB,aAAO,QAAQ;AACf,YAAM,MAAM,QAAQ;AACpB,YAAM,QAAQ,QAAQ;AACtB,YAAM,OAAO,QAAQ;AACrB,iBAAW,QAAQ;AACnB,WAAK,MAAM;AACX,gBAAU,MAAM;AAChB,iBAAW,QAAQ;AACnB,cAAQ,QAAQ;AAChB,aAAO,QAAQ;AACf,YAAM,QAAQ;AACd,iBAAW,OAAO,QAAS,KAAI;AAC/B,cAAQ,SAAS,MAAM;AACvB,cAAQ,SAAS,QAAQ;AACzB,YAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,YAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,YAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,YAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,YAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,YAAM,QAAQ,QAAQ,QAAQ,MAAM,OAAO;AAC3C,YAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO;AAC1C,YAAM,MAAM,MAAM;AAClB,YAAM,QAAQ,OAAO,MAAM;AAAA,IAC7B;AAAA,EACF;AACF;AAeO,MAAM,mBAAmB;AAEhC,MAAM,SAAS,oBAAI,QAAgB;AAE5B,MAAM,eAAe,CAAmB,YAAkB;AAC/D,SAAO,IAAI,OAAO;AAClB,SAAO;AACT;AAEO,SAAS,eAAe,MAAkD;AAC/E,QAAM,SAAS,CAAC,MAAa,SAA0C,YACrE,KAAK;AAAA,IACH;AAAA,IACC,OAAO,IAAI,OAAO,IACf,UACA,CAAC,OAAgB,WAA2B,SAAkB;AAC5D,UAAI,UAAU,SAAS,QAAS,OAAM,UAAU,gBAAgB;AAChE,aAAO,QAAQ,OAAO,WAAW,IAAI;AAAA,IACvC;AAAA,IACJ;AAAA,EACF;AACF,SAAO,IAAI,MAAM,MAAM;AAAA,IACrB,IAAI,QAAQ,KAAK;AACf,UAAI,QAAQ,QAAS,QAAO;AAC5B,YAAM,QAAQ,QAAQ,IAAI,QAAQ,KAAK,MAAM;AAC7C,aAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;AAEO,SAAS,OAAU,OAA8C;AACtE,SAAO;AAAA,IACL,IAAI,QAAQ;AACV,aAAO,SAAS,MAAM,CAAC,EAAE;AAAA,IAC3B;AAAA,IACA,WAAW,CAAC,aAAa,SAAS,MAAM,CAAC,EAAE,UAAU,QAAQ;AAAA,IAC7D,QAAQ,CAAC,aAAa,SAAS,MAAM,CAAC,EAAE,OAAO,QAAQ;AAAA,EACzD;AACF;AAEA,MAAM,SAAS,CAAC,SAAiB,eAA6C;AAAA,EAC5E,GAAI,UAAU,SAAS,SAAS,QAAQ,SAAS,QAAQ;AAAA,EACzD,QAAQ,QAAQ,OAAO;AAAA,IACrB,IAAI,UAAU,SAAS,UAAU,UAAU;AAAA,IAC3C,GAAI,YAAY,aAAa,UAAU,SAAS,EAAE,QAAQ,UAAU,OAAO,IAAI,CAAC;AAAA,EAClF,CAAC;AACH;AAEA,MAAM,eAAe,CAAC,GAAG,eAAe,GAAG,oBAAoB;AAExD,SAAS,WAAW,SAAuC;AAChE,QAAM,OAAO;AAAA,IACX,WAA2B,EAAE,MAAM,YAAY,MAAM,MAAM,aAAa,CAAC;AAAA,EAC3E;AACA,QAAM,UAAU,EAAE,GAAG,QAAQ,YAAY,SAAS,QAAQ,YAAY;AACtE,OAAK,MAAM,cAAc,CAAC,QAAQ,cAAc;AAC9C,UAAM,UAAU,OAAO,SAAS,SAAS;AACzC,WAAO,UAAU,SAAS,SACtB,EAAE,SAAS,QAAQ,GAAG,OAAO,MAAM,SAAS,YAAY,EAAE,IAC1D,EAAE,SAAS,WAAW,GAAG,OAAO,MAAM,SAAS,eAAe,EAAE;AAAA,EACtE,CAAC;AACD,OAAK,MAAM,iBAAiB,CAAC,QAAQ,eAAe;AAAA,IAClD,SAAS;AAAA,IACT,GAAG,YAAY,UAAU,SAAS,SAAS,UAAU,QAAQ,UAAU;AAAA,EACzE,EAAE;AACF,OAAK;AAAA,IAAM;AAAA,IAAe,CAAC,QAAQ,cACjC,UAAU,SAAS,SACf,EAAE,SAAS,QAAQ,OAAO,SAAS,QAAQ,SAAS,KAAK,EAAE,IAC3D;AAAA,MACE,SAAS;AAAA,MACT,OAAO,SAAS,QAAQ,SAAS,KAAK;AAAA,MACtC,GAAG,OAAO,MAAM,QAAQ,UAAU,gBAAgB;AAAA,IACpD;AAAA,EACN;AACA,OAAK,MAAM,oBAAoB,CAAC,QAAQ,cAAc;AACpD,QAAI,UAAU,SAAS;AACrB,aAAO,EAAE,SAAS,UAAU,GAAG,OAAO,MAAM,QAAQ,QAAQ,cAAc,EAAE;AAC9E,UAAM,SAAS,WAAW,QAAQ,MAAM;AACxC,WAAO,EAAE,SAAS,SAAS,GAAG,OAAO,MAAM,QAAQ,YAAY,EAAE;AAAA,EACnE,CAAC;AACD,OAAK,MAAM,mBAAmB,CAAC,QAAQ,WAAW,SAAS;AACzD,QAAI,UAAU,SAAS,QAAS,QAAO,EAAE,SAAS,OAAO;AACzD,UAAM,OAAO,KAAK,SAAS,QAAQ;AAAA,MACjC,SAAS;AAAA,MACT,MAAM,MAAM,WAAW,QAAQ,KAAK;AAAA,MACpC,OAAO,CAAC,UAAU,MAAM,QAAQ;AAAA,IAClC,CAAC;AACD,WAAO,EAAE,SAAS,SAAS,GAAG,OAAO,MAAM,KAAK,OAAO,YAAY,EAAE;AAAA,EACvE,CAAC;AACD,OAAK;AAAA,IACH;AAAA,IACA,aAAa,CAAC,QAAiB,WAA2B,SAA+B;AACvF,UAAI,UAAU,SAAS,QAAS,QAAO,EAAE,SAAS,OAAO;AACzD,YAAM,UAAU,QAAQ,QAAQ,UAAU,KAAK;AAC/C,UAAI,CAAC,QAAS,OAAM,UAAU,gBAAgB;AAC9C,YAAM,OAAO,KAAK,SAAS,QAAQ;AAAA,QACjC,SAAS;AAAA,QACT,MAAM,MAAM;AAAA,QACZ,OAAO,CAAC,SAAS,KAAK,QAAQ;AAAA,MAChC,CAAC;AACD,YAAM,QAAQ,CAAC,SACb,OAAO,MAAM,KAAK,MAAM,MAAM,IAAI,CAA6B;AACjE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY,MAAM,YAAY;AAAA,QAC9B,MAAM,MAAM,MAAM;AAAA,QAClB,WAAW,MAAM,WAAW;AAAA,QAC5B,GAAG,OAAO,MAAM,KAAK,MAAM,OAAO,aAAa;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH;AACA,OAAK,MAAM,kBAAkB,CAAC,QAAQ,WAAW,SAAS;AACxD,UAAM,OAAO,QAAQ;AACrB,QAAI,UAAU,SAAS,WAAW,CAAC,KAAM,QAAO,EAAE,SAAS,OAAO;AAClE,UAAM,OAAO,KAAK,SAAS,QAAQ;AAAA,MACjC,SAAS;AAAA,MACT,MAAM,MAAM,UAAU,IAAI;AAAA,MAC1B,OAAO,CAAC,UAAU,MAAM,QAAQ;AAAA,IAClC,CAAC;AACD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,SAAS,KAAK,SAAS;AAAA,MAClC,GAAG,OAAO,MAAM,KAAK,OAAO,YAAY;AAAA,IAC1C;AAAA,EACF,CAAC;AACD,SAAO;AACT;",
4
+ "sourcesContent": ["import {\n type Context,\n createHost,\n forbidden,\n type Host,\n type Readable,\n type ReplicatedState,\n replicatedState,\n type Self,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Agent } from './agent.ts';\nimport {\n type ApprovalJudge,\n type Approvals,\n attachApprovals,\n type Decider,\n} from './approvals/index.ts';\nimport { type ApprovalPolicies, alwaysFor, attachApprovalPolicy } from './approvals/policy.ts';\nimport { type AgentSudo, createSudo, ownedSudo } from './approvals/sudo.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { ChangesRuntime } from './changes/index.ts';\nimport { createAgentControl, type HostLicks, type HostScoops } from './control.ts';\nimport { trackDeliveries } from './deliveries.ts';\nimport type { FreezerRuntime, FrozenCone } from './freezer/index.ts';\nimport { IDLE, type ImportProgress } from './freezer/v6.ts';\nimport { createGuests, type Guests } from './guests/index.ts';\nimport type { ScoopReviewHost } from './guests/scoop.ts';\nimport { admitGuest, guestOpener } from './guests/serve.ts';\nimport type { UserClients } from './kernel/users.ts';\nimport type { McpRuntime } from './mcp/index.ts';\nimport type { MemoryEntry, MemoryScope } from './memory/format.ts';\nimport type { MemoryRuntime } from './memory/index.ts';\nimport { createMonitor, type MonitorOptions } from './monitor/index.ts';\nimport { viewRemote } from './readonly.ts';\nimport { type AgentRemote, createRemote } from './remote/host.ts';\nimport { createPages, ownedPages, type Pages } from './remote/pages.ts';\nimport type { SecretName } from './secrets/names.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport {\n AgentControl,\n type AgentGuest,\n AgentGuestService,\n AgentPagesService,\n AgentRemoteService,\n AgentSettings,\n AgentSudoService,\n AgentTranscript,\n CONTROL_METHODS,\n CONTROL_READS,\n type Command,\n GUEST_METHODS,\n OWNER_DEVICE_METHODS,\n PAGE_METHODS,\n type PrivateRevision,\n REMOTE_METHODS,\n REMOTE_READS,\n SETTINGS_METHODS,\n SUDO_METHODS,\n} from './services.ts';\nimport {\n AGENT_HOST,\n type AgentPrincipal,\n type GuestPrincipal,\n principalKey,\n readable,\n readablesOf,\n SELF,\n type Seat,\n served,\n} from './serving.ts';\nimport type { SkillsRuntime } from './skills/index.ts';\nimport type { SprinklesRuntime } from './sprinkles/index.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\nimport { slimmer, type Thumbnail, thumbnail } from './thumbs.ts';\nimport { type LabelsRuntime, visibleLabels, watchLabel } from './titles/labels.ts';\nimport type { Uploads } from './uploads.ts';\nimport { agentViews } from './views.ts';\nimport { type PortEndpoint, PortLink } from './wire.ts';\n\nexport interface ConnectOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n device?: string;\n}\n\nexport interface AgentHost {\n readonly serverId: string;\n readonly agent: Agent;\n readonly users?: UserClients;\n readonly pages: Pages;\n readonly guests: Guests;\n readonly approvals: Approvals;\n connect(endpoint: PortEndpoint, options?: ConnectOptions): void;\n close(): Promise<void>;\n}\n\nconst noSettings: AgentSettings = {\n state: replicatedState({ models: [], accounts: [] }),\n connect: async () => {\n throw new Error('this agent has no accounts');\n },\n disconnect: async () => {},\n signIn: async () => null,\n dismissMoved: async () => {},\n};\n\nasync function follow(\n agent: Agent,\n context: Context,\n slim: (view: ConversationView) => ConversationView\n) {\n let attached = await agent.cone().viewState(context);\n const state = replicatedState<ConversationView>(slim(attached.value));\n const mirror = (value: ConversationView, from: Context) => state.replace(from, slim(value));\n let off = attached.subscribe(mirror);\n const stop = agent.onCone(async (conversation) => {\n const next = await conversation.viewState(context);\n off();\n attached.dispose();\n attached = next;\n state.replace(context, slim(next.value));\n off = next.subscribe(mirror);\n });\n return {\n state,\n refresh: () => state.replace(context, slim(attached.value)),\n dispose() {\n stop();\n off();\n attached.dispose();\n },\n };\n}\n\nexport interface HostSecrets {\n vault: ReplicatedState<VaultState>;\n list(): readonly SecretName[];\n close?(): void;\n}\n\nconst idleVault = replicatedState<VaultState>({\n port: 'none',\n needed: false,\n version: 0,\n locked: 'no',\n held: 0,\n});\n\nfunction gatedControls(\n control: AgentControl,\n shown: (entry: number) => boolean,\n views: () => readonly ConversationView[],\n labels: ReplicatedState<Record<string, string>>\n) {\n const visible = (entry: number) =>\n views().some((view) => view.entries.some((item) => item.id === entry));\n const gated =\n (allowed: (entry: number) => boolean): AgentControl['image'] =>\n async (ref, using) =>\n allowed(ref.entry) ? control.image(ref, using) : { data: null, mimeType: null };\n const trusted: AgentControl = { ...control, image: gated(shown) };\n const viewed: AgentControl = { ...control, image: gated(visible), toolLabel: watchLabel(labels) };\n return { trusted, viewed };\n}\n\nasync function approving(\n agent: Agent,\n policy: ApprovalPolicies,\n options: { judge?: ApprovalJudge; intent?: ScoopReviewHost['intent']; approvalMs?: number },\n context: Context\n): Promise<Approvals> {\n const approvals = await attachApprovals(\n {\n harness: agent.harness,\n guestAlways: alwaysFor(policy),\n sudoApprover: () => policy.current().sudo.approver,\n scoops: agent.scoopReviews,\n ...(options.judge ? { judge: options.judge } : {}),\n ...(options.approvalMs ? { ttlMs: options.approvalMs } : {}),\n },\n context\n );\n agent.scoopReviews.bind({\n approvals,\n agents: agent.agents,\n harness: agent.harness,\n ...(options.intent ? { intent: options.intent } : {}),\n });\n return approvals;\n}\n\nasync function guestsOf(\n agent: Agent,\n approvals: Approvals,\n policy: ApprovalPolicies,\n context: Context\n): Promise<Guests> {\n const guests = await createGuests({\n harness: agent.harness,\n agents: agent.agents,\n approvals,\n policy,\n reviews: agent.reviews,\n context,\n });\n agent.gate.bind({ approvals, policy: () => guests.policy() });\n return guests;\n}\n\nconst noRevision = () => replicatedState<PrivateRevision>({ revision: 0 });\n\nexport async function hostAgent(\n agent: Agent,\n options: {\n serverId?: string;\n context?: Context;\n settings?: AgentSettings;\n licks?: HostLicks;\n scoops?: HostScoops;\n skills?: SkillsRuntime;\n sprinkles?: SprinklesRuntime;\n memory?: MemoryRuntime;\n freezer?: FreezerRuntime;\n changes?: ChangesRuntime;\n mcp?: Pick<McpRuntime, 'close'>;\n users?: UserClients;\n monitor?: Pick<MonitorOptions, 'kernel' | 'groups' | 'users'>;\n pages?: Pages;\n secrets?: HostSecrets;\n uploads?: Uploads;\n thumbnail?: Thumbnail;\n labels?: LabelsRuntime;\n approvals?: Approvals;\n judge?: ApprovalJudge;\n intent?: ScoopReviewHost['intent'];\n approvalMs?: number;\n } = {}\n): Promise<AgentHost> {\n const context = options.context ?? BACKGROUND_CONTEXT;\n const serverId = options.serverId ?? crypto.randomUUID();\n let refresh = () => {};\n const slims = slimmer(options.thumbnail ?? thumbnail, () => refresh());\n const transcript = await follow(agent, context, slims.slim);\n const { state } = transcript;\n const mounted = await agentViews(agent, context, slims.slim);\n refresh = () => {\n transcript.refresh();\n mounted.refresh();\n };\n const touch = () => options.freezer?.touch();\n const untouch = [state.subscribe(touch), mounted.views.subscribe(touch)];\n const pages = options.pages ?? createPages();\n const deliveries = trackDeliveries(agent.harness, state, context);\n const policy = await attachApprovalPolicy(agent.harness, context);\n const approvals = options.approvals ?? (await approving(agent, policy, options, context));\n const monitor = createMonitor({\n ...options.monitor,\n harness: agent.harness,\n agents: agent.agents,\n views: mounted.views,\n context,\n });\n const guests = await guestsOf(agent, approvals, policy, context);\n const control: AgentControl = {\n ...createAgentControl(\n agent.harness,\n agent,\n deliveries,\n options.licks,\n options.scoops,\n options.skills,\n options.sprinkles,\n options.memory,\n options.freezer,\n options.changes,\n monitor,\n options.secrets?.list,\n options.uploads,\n options.labels,\n guests\n ),\n approvalPolicySet: (change, using) => policy.set(change, using),\n };\n const remote = createRemote({\n harness: agent.harness,\n send: (request, using) => control.send(request, using),\n vault: options.secrets?.vault ?? idleVault,\n async conversation(agentId, using) {\n if (!agentId) return agent.cone();\n const found = await agent.agents.conversation(agentId, using);\n if (!found) throw new Error(`There is no agent ${agentId}.`);\n return found;\n },\n });\n const shownViews = () => [state.value, ...Object.values(mounted.views.value)];\n const kept = options.labels?.labels ?? replicatedState<Record<string, string>>({});\n const labels = visibleLabels(kept, [state, mounted.views], shownViews);\n const transcriptService = {\n state,\n deliveries: deliveries.state,\n agents: mounted.agents,\n views: mounted.views,\n commands: options.skills?.commands ?? replicatedState<Command[]>([]),\n privateRevision: options.skills?.privateRevision ?? noRevision(),\n sprinkles: options.sprinkles?.sprinkles ?? replicatedState<Sprinkle[]>([]),\n memories: options.memory?.memories ?? replicatedState<MemoryEntry[]>([]),\n memoryScopes: options.memory?.scopes ?? replicatedState<MemoryScope[]>([]),\n frozen: options.freezer?.frozen ?? replicatedState<FrozenCone[]>([]),\n importing: options.freezer?.importing ?? replicatedState<ImportProgress>(IDLE),\n changes:\n options.changes?.view ?? replicatedState<ChangesView>({ unavailable: null, changes: [] }),\n monitor: monitor.state,\n vault: options.secrets?.vault ?? idleVault,\n labels: labels.state,\n guests: guests.seats,\n approvals: approvals.state,\n approvalPolicy: policy.state,\n };\n const sudo = createSudo({\n approvals,\n agents: () => agent.agents.state(),\n ...(options.licks ? { licks: options.licks.licks } : {}),\n });\n const settings = options.settings ?? noSettings;\n const gates = gatedControls(control, slims.shown, shownViews, transcriptService.labels);\n const { trusted, viewed } = gates;\n const host = serveAgent({\n trusted,\n viewed,\n transcript: transcriptService,\n viewMonitor: monitor.viewState,\n sudo,\n settings,\n remote,\n pages,\n guest: guestOpener(guests, agent.agents, mounted.views, context),\n decide: (by) => (id, decision, reason, using) =>\n approvals.decide(id, decision, reason, by, using),\n });\n const offGuests = guests.onEnd((id) => {\n void host.invalidatePrincipal(\n (principal) => principal.seat === 'guest' && principal.guest.id === id\n );\n });\n let links = 0;\n return {\n serverId,\n agent,\n pages,\n guests,\n approvals,\n ...(options.users ? { users: options.users } : {}),\n connect(endpoint, connectOptions) {\n if (connectOptions?.guest) {\n links += 1;\n admitGuest(guests, endpoint, connectOptions.guest, serverId, links, host);\n return;\n }\n const seat: Exclude<Seat, 'guest'> = connectOptions?.readOnly\n ? 'view'\n : connectOptions?.pages === false\n ? 'control'\n : 'owner';\n links += 1;\n const link = new PortLink(endpoint);\n link.greet(serverId);\n const device = connectOptions?.device ? { device: connectOptions.device } : {};\n host.accept(link, {\n principal: { seat, link: links, ...device } satisfies AgentPrincipal,\n });\n },\n async close() {\n offGuests();\n await host.close();\n guests.dispose();\n await pages.dispose();\n await monitor.dispose();\n await remote.dispose();\n deliveries.dispose();\n sudo.close();\n approvals.close();\n transcript.dispose();\n mounted.dispose();\n labels.dispose();\n slims.dispose();\n for (const off of untouch) off();\n options.freezer?.close();\n options.secrets?.close?.();\n await options.changes?.close(context);\n await options.memory?.close(context);\n await options.sprinkles?.close(context);\n await options.skills?.close(context);\n await options.mcp?.close(context);\n await options.scoops?.runtime.close(context);\n await options.licks?.sources.close(context);\n await agent.close();\n await options.users?.close();\n },\n };\n}\n\ninterface Served {\n trusted: AgentControl;\n viewed: AgentControl;\n transcript: Record<keyof AgentTranscript, ReplicatedState<unknown>>;\n viewMonitor: ReplicatedState<unknown>;\n sudo?: AgentSudo;\n settings: AgentSettings;\n remote: AgentRemote;\n pages: Pages;\n guest?: (principal: GuestPrincipal) => { value: AgentGuest; dispose(): void } | undefined;\n decide: (by: Decider) => AgentControl['decide'];\n}\n\nexport const CLOSED_TO_GUESTS = 'a guest seat has only its transcript and propose';\n\nconst opened = new WeakSet<object>();\n\nexport const openToGuests = <F extends object>(factory: F): F => {\n opened.add(factory);\n return factory;\n};\n\nexport function closedToGuests(host: Host<AgentPrincipal>): Host<AgentPrincipal> {\n const serve = ((type: never, factory: (...args: unknown[]) => unknown, options?: never) =>\n host.serve(\n type,\n (opened.has(factory)\n ? factory\n : (input: unknown, principal: AgentPrincipal, self: unknown) => {\n if (principal.seat === 'guest') throw forbidden(CLOSED_TO_GUESTS);\n return factory(input, principal, self);\n }) as never,\n options\n )) as Host<AgentPrincipal>['serve'];\n return new Proxy(host, {\n get(target, key) {\n if (key === 'serve') return serve;\n const value = Reflect.get(target, key, target) as unknown;\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\nexport function lazily<T>(state: () => ReplicatedState<T>): Readable<T> {\n return {\n get value() {\n return readable(state()).value;\n },\n subscribe: (listener) => readable(state()).subscribe(listener),\n events: (listener) => readable(state()).events(listener),\n };\n}\n\nconst seated = (serving: Served, principal: AgentPrincipal): AgentControl => ({\n ...(principal.seat === 'view' ? serving.viewed : serving.trusted),\n decide: serving.decide({\n by: principal.seat === 'owner' ? 'owner' : 'follower',\n ...('device' in principal && principal.device ? { device: principal.device } : {}),\n }),\n});\n\nconst VIEW_METHODS = [...CONTROL_READS, ...OWNER_DEVICE_METHODS];\n\nexport function serveAgent(serving: Served): Host<AgentPrincipal> {\n const host = closedToGuests(\n createHost<AgentPrincipal>({ name: AGENT_HOST, self: SELF, principalKey })\n );\n const viewing = { ...serving.transcript, monitor: serving.viewMonitor };\n host.serve(AgentControl, (_input, principal) => {\n const control = seated(serving, principal);\n return principal.seat === 'view'\n ? { variant: 'view', ...served(() => control, VIEW_METHODS) }\n : { variant: 'control', ...served(() => control, CONTROL_METHODS) };\n });\n host.serve(AgentTranscript, (_input, principal) => ({\n variant: 'transcript',\n ...readablesOf(principal.seat === 'view' ? viewing : serving.transcript),\n }));\n host.serve(AgentSettings, (_input, principal) =>\n principal.seat === 'view'\n ? { variant: 'view', state: readable(serving.settings.state) }\n : {\n variant: 'settings',\n state: readable(serving.settings.state),\n ...served(() => serving.settings, SETTINGS_METHODS),\n }\n );\n host.serve(AgentRemoteService, (_input, principal) => {\n if (principal.seat !== 'view')\n return { variant: 'remote', ...served(() => serving.remote, REMOTE_METHODS) };\n const scoped = viewRemote(serving.remote);\n return { variant: 'watch', ...served(() => scoped, REMOTE_READS) };\n });\n host.serve(AgentPagesService, (_input, principal, self) => {\n if (principal.seat !== 'owner') return { variant: 'none' };\n const mine = self.resource('mine', {\n version: 1,\n open: () => ownedPages(serving.pages),\n close: (owned) => owned.release(),\n });\n return { variant: 'pages', ...served(() => mine.value, PAGE_METHODS) };\n });\n host.serve(\n AgentGuestService,\n openToGuests((_input: unknown, principal: AgentPrincipal, self: Self<AgentPrincipal>) => {\n if (principal.seat !== 'guest') return { variant: 'none' };\n const opening = serving.guest?.(principal.guest);\n if (!opening) throw forbidden(CLOSED_TO_GUESTS);\n const seat = self.resource('seat', {\n version: 1,\n open: () => opening,\n close: (made) => made.dispose(),\n });\n const later = (name: 'transcript' | 'seat' | 'proposals') =>\n lazily(() => seat.value.value[name] as ReplicatedState<unknown>);\n return {\n variant: 'guest',\n transcript: later('transcript'),\n seat: later('seat'),\n proposals: later('proposals'),\n ...served(() => seat.value.value, GUEST_METHODS),\n };\n })\n );\n host.serve(AgentSudoService, (_input, principal, self) => {\n const sudo = serving.sudo;\n if (principal.seat !== 'owner' || !sudo) return { variant: 'none' };\n const mine = self.resource('mine', {\n version: 1,\n open: () => ownedSudo(sudo),\n close: (owned) => owned.release(),\n });\n return {\n variant: 'sudo',\n approvals: readable(sudo.approvals),\n ...served(() => mine.value, SUDO_METHODS),\n };\n });\n return host;\n}\n"],
5
+ "mappings": "AAAA;AAAA,EAEE;AAAA,EACA;AAAA,EAIA;AAAA,OAEK;AACP,SAAS,0BAA0B;AAGnC;AAAA,EAGE;AAAA,OAEK;AACP,SAAgC,WAAW,4BAA4B;AACvE,SAAyB,YAAY,iBAAiB;AAGtD,SAAS,0BAA2D;AACpE,SAAS,uBAAuB;AAEhC,SAAS,YAAiC;AAC1C,SAAS,oBAAiC;AAE1C,SAAS,YAAY,mBAAmB;AAKxC,SAAS,qBAA0C;AACnD,SAAS,kBAAkB;AAC3B,SAA2B,oBAAoB;AAC/C,SAAS,aAAa,kBAA8B;AAGpD;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAIP,SAAS,SAAyB,iBAAiB;AACnD,SAA6B,eAAe,kBAAkB;AAE9D,SAAS,kBAAkB;AAC3B,SAA4B,gBAAgB;AAoB5C,MAAM,aAA4B;AAAA,EAChC,OAAO,gBAAgB,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EACnD,SAAS,YAAY;AACnB,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAAA,EACA,YAAY,YAAY;AAAA,EAAC;AAAA,EACzB,QAAQ,YAAY;AAAA,EACpB,cAAc,YAAY;AAAA,EAAC;AAC7B;AAEA,eAAe,OACb,OACA,SACA,MACA;AACA,MAAI,WAAW,MAAM,MAAM,KAAK,EAAE,UAAU,OAAO;AACnD,QAAM,QAAQ,gBAAkC,KAAK,SAAS,KAAK,CAAC;AACpE,QAAM,SAAS,CAAC,OAAyB,SAAkB,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAC1F,MAAI,MAAM,SAAS,UAAU,MAAM;AACnC,QAAM,OAAO,MAAM,OAAO,OAAO,iBAAiB;AAChD,UAAM,OAAO,MAAM,aAAa,UAAU,OAAO;AACjD,QAAI;AACJ,aAAS,QAAQ;AACjB,eAAW;AACX,UAAM,QAAQ,SAAS,KAAK,KAAK,KAAK,CAAC;AACvC,UAAM,KAAK,UAAU,MAAM;AAAA,EAC7B,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM,MAAM,QAAQ,SAAS,KAAK,SAAS,KAAK,CAAC;AAAA,IAC1D,UAAU;AACR,WAAK;AACL,UAAI;AACJ,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;AAQA,MAAM,YAAY,gBAA4B;AAAA,EAC5C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR,CAAC;AAED,SAAS,cACP,SACA,OACA,OACA,QACA;AACA,QAAM,UAAU,CAAC,UACf,MAAM,EAAE,KAAK,CAAC,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,CAAC;AACvE,QAAM,QACJ,CAAC,YACD,OAAO,KAAK,UACV,QAAQ,IAAI,KAAK,IAAI,QAAQ,MAAM,KAAK,KAAK,IAAI,EAAE,MAAM,MAAM,UAAU,KAAK;AAClF,QAAM,UAAwB,EAAE,GAAG,SAAS,OAAO,MAAM,KAAK,EAAE;AAChE,QAAM,SAAuB,EAAE,GAAG,SAAS,OAAO,MAAM,OAAO,GAAG,WAAW,WAAW,MAAM,EAAE;AAChG,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEA,eAAe,UACb,OACA,QACA,SACA,SACoB;AACpB,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,MACE,SAAS,MAAM;AAAA,MACf,aAAa,UAAU,MAAM;AAAA,MAC7B,cAAc,MAAM,OAAO,QAAQ,EAAE,KAAK;AAAA,MAC1C,QAAQ,MAAM;AAAA,MACd,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,MAChD,GAAI,QAAQ,aAAa,EAAE,OAAO,QAAQ,WAAW,IAAI,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,EACrD,CAAC;AACD,SAAO;AACT;AAEA,eAAe,SACb,OACA,WACA,QACA,SACiB;AACjB,QAAM,SAAS,MAAM,aAAa;AAAA,IAChC,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AACD,QAAM,KAAK,KAAK,EAAE,WAAW,QAAQ,MAAM,OAAO,OAAO,EAAE,CAAC;AAC5D,SAAO;AACT;AAEA,MAAM,aAAa,MAAM,gBAAiC,EAAE,UAAU,EAAE,CAAC;AAEzE,eAAsB,UACpB,OACA,UAuBI,CAAC,GACe;AACpB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,QAAQ,YAAY,OAAO,WAAW;AACvD,MAAI,UAAU,MAAM;AAAA,EAAC;AACrB,QAAM,QAAQ,QAAQ,QAAQ,aAAa,WAAW,MAAM,QAAQ,CAAC;AACrE,QAAM,aAAa,MAAM,OAAO,OAAO,SAAS,MAAM,IAAI;AAC1D,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,UAAU,MAAM,WAAW,OAAO,SAAS,MAAM,IAAI;AAC3D,YAAU,MAAM;AACd,eAAW,QAAQ;AACnB,YAAQ,QAAQ;AAAA,EAClB;AACA,QAAM,QAAQ,MAAM,QAAQ,SAAS,MAAM;AAC3C,QAAM,UAAU,CAAC,MAAM,UAAU,KAAK,GAAG,QAAQ,MAAM,UAAU,KAAK,CAAC;AACvE,QAAM,QAAQ,QAAQ,SAAS,YAAY;AAC3C,QAAM,aAAa,gBAAgB,MAAM,SAAS,OAAO,OAAO;AAChE,QAAM,SAAS,MAAM,qBAAqB,MAAM,SAAS,OAAO;AAChE,QAAM,YAAY,QAAQ,aAAc,MAAM,UAAU,OAAO,QAAQ,SAAS,OAAO;AACvF,QAAM,UAAU,cAAc;AAAA,IAC5B,GAAG,QAAQ;AAAA,IACX,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,OAAO,QAAQ;AAAA,IACf;AAAA,EACF,CAAC;AACD,QAAM,SAAS,MAAM,SAAS,OAAO,WAAW,QAAQ,OAAO;AAC/D,QAAM,UAAwB;AAAA,IAC5B,GAAG;AAAA,MACD,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,IACA,mBAAmB,CAAC,QAAQ,UAAU,OAAO,IAAI,QAAQ,KAAK;AAAA,EAChE;AACA,QAAM,SAAS,aAAa;AAAA,IAC1B,SAAS,MAAM;AAAA,IACf,MAAM,CAAC,SAAS,UAAU,QAAQ,KAAK,SAAS,KAAK;AAAA,IACrD,OAAO,QAAQ,SAAS,SAAS;AAAA,IACjC,MAAM,aAAa,SAAS,OAAO;AACjC,UAAI,CAAC,QAAS,QAAO,MAAM,KAAK;AAChC,YAAM,QAAQ,MAAM,MAAM,OAAO,aAAa,SAAS,KAAK;AAC5D,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qBAAqB,OAAO,GAAG;AAC3D,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,QAAM,aAAa,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,OAAO,QAAQ,MAAM,KAAK,CAAC;AAC5E,QAAM,OAAO,QAAQ,QAAQ,UAAU,gBAAwC,CAAC,CAAC;AACjF,QAAM,SAAS,cAAc,MAAM,CAAC,OAAO,QAAQ,KAAK,GAAG,UAAU;AACrE,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,YAAY,WAAW;AAAA,IACvB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ,QAAQ,YAAY,gBAA2B,CAAC,CAAC;AAAA,IACnE,iBAAiB,QAAQ,QAAQ,mBAAmB,WAAW;AAAA,IAC/D,WAAW,QAAQ,WAAW,aAAa,gBAA4B,CAAC,CAAC;AAAA,IACzE,UAAU,QAAQ,QAAQ,YAAY,gBAA+B,CAAC,CAAC;AAAA,IACvE,cAAc,QAAQ,QAAQ,UAAU,gBAA+B,CAAC,CAAC;AAAA,IACzE,QAAQ,QAAQ,SAAS,UAAU,gBAA8B,CAAC,CAAC;AAAA,IACnE,WAAW,QAAQ,SAAS,aAAa,gBAAgC,IAAI;AAAA,IAC7E,SACE,QAAQ,SAAS,QAAQ,gBAA6B,EAAE,aAAa,MAAM,SAAS,CAAC,EAAE,CAAC;AAAA,IAC1F,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ,SAAS,SAAS;AAAA,IACjC,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,WAAW,UAAU;AAAA,IACrB,gBAAgB,OAAO;AAAA,EACzB;AACA,QAAM,OAAO,WAAW;AAAA,IACtB;AAAA,IACA,QAAQ,MAAM,MAAM,OAAO,MAAM;AAAA,IACjC,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,MAAM,IAAI,CAAC;AAAA,EACxD,CAAC;AACD,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,QAAQ,cAAc,SAAS,MAAM,OAAO,YAAY,kBAAkB,MAAM;AACtF,QAAM,EAAE,SAAS,OAAO,IAAI;AAC5B,QAAM,OAAO,WAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,YAAY,QAAQ,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,IAC/D,QAAQ,CAAC,OAAO,CAAC,IAAI,UAAU,QAAQ,UACrC,UAAU,OAAO,IAAI,UAAU,QAAQ,IAAI,KAAK;AAAA,EACpD,CAAC;AACD,QAAM,YAAY,OAAO,MAAM,CAAC,OAAO;AACrC,SAAK,KAAK;AAAA,MACR,CAAC,cAAc,UAAU,SAAS,WAAW,UAAU,MAAM,OAAO;AAAA,IACtE;AAAA,EACF,CAAC;AACD,MAAI,QAAQ;AACZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,QAAQ,UAAU,gBAAgB;AAChC,UAAI,gBAAgB,OAAO;AACzB,iBAAS;AACT,mBAAW,QAAQ,UAAU,eAAe,OAAO,UAAU,OAAO,IAAI;AACxE;AAAA,MACF;AACA,YAAM,OAA+B,gBAAgB,WACjD,SACA,gBAAgB,UAAU,QACxB,YACA;AACN,eAAS;AACT,YAAM,OAAO,IAAI,SAAS,QAAQ;AAClC,WAAK,MAAM,QAAQ;AACnB,YAAM,SAAS,gBAAgB,SAAS,EAAE,QAAQ,eAAe,OAAO,IAAI,CAAC;AAC7E,WAAK,OAAO,MAAM;AAAA,QAChB,WAAW,EAAE,MAAM,MAAM,OAAO,GAAG,OAAO;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACA,MAAM,QAAQ;AACZ,gBAAU;AACV,YAAM,KAAK,MAAM;AACjB,aAAO,QAAQ;AACf,YAAM,MAAM,QAAQ;AACpB,YAAM,QAAQ,QAAQ;AACtB,YAAM,OAAO,QAAQ;AACrB,iBAAW,QAAQ;AACnB,WAAK,MAAM;AACX,gBAAU,MAAM;AAChB,iBAAW,QAAQ;AACnB,cAAQ,QAAQ;AAChB,aAAO,QAAQ;AACf,YAAM,QAAQ;AACd,iBAAW,OAAO,QAAS,KAAI;AAC/B,cAAQ,SAAS,MAAM;AACvB,cAAQ,SAAS,QAAQ;AACzB,YAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,YAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,YAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,YAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,YAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,YAAM,QAAQ,QAAQ,QAAQ,MAAM,OAAO;AAC3C,YAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO;AAC1C,YAAM,MAAM,MAAM;AAClB,YAAM,QAAQ,OAAO,MAAM;AAAA,IAC7B;AAAA,EACF;AACF;AAeO,MAAM,mBAAmB;AAEhC,MAAM,SAAS,oBAAI,QAAgB;AAE5B,MAAM,eAAe,CAAmB,YAAkB;AAC/D,SAAO,IAAI,OAAO;AAClB,SAAO;AACT;AAEO,SAAS,eAAe,MAAkD;AAC/E,QAAM,SAAS,CAAC,MAAa,SAA0C,YACrE,KAAK;AAAA,IACH;AAAA,IACC,OAAO,IAAI,OAAO,IACf,UACA,CAAC,OAAgB,WAA2B,SAAkB;AAC5D,UAAI,UAAU,SAAS,QAAS,OAAM,UAAU,gBAAgB;AAChE,aAAO,QAAQ,OAAO,WAAW,IAAI;AAAA,IACvC;AAAA,IACJ;AAAA,EACF;AACF,SAAO,IAAI,MAAM,MAAM;AAAA,IACrB,IAAI,QAAQ,KAAK;AACf,UAAI,QAAQ,QAAS,QAAO;AAC5B,YAAM,QAAQ,QAAQ,IAAI,QAAQ,KAAK,MAAM;AAC7C,aAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;AAEO,SAAS,OAAU,OAA8C;AACtE,SAAO;AAAA,IACL,IAAI,QAAQ;AACV,aAAO,SAAS,MAAM,CAAC,EAAE;AAAA,IAC3B;AAAA,IACA,WAAW,CAAC,aAAa,SAAS,MAAM,CAAC,EAAE,UAAU,QAAQ;AAAA,IAC7D,QAAQ,CAAC,aAAa,SAAS,MAAM,CAAC,EAAE,OAAO,QAAQ;AAAA,EACzD;AACF;AAEA,MAAM,SAAS,CAAC,SAAiB,eAA6C;AAAA,EAC5E,GAAI,UAAU,SAAS,SAAS,QAAQ,SAAS,QAAQ;AAAA,EACzD,QAAQ,QAAQ,OAAO;AAAA,IACrB,IAAI,UAAU,SAAS,UAAU,UAAU;AAAA,IAC3C,GAAI,YAAY,aAAa,UAAU,SAAS,EAAE,QAAQ,UAAU,OAAO,IAAI,CAAC;AAAA,EAClF,CAAC;AACH;AAEA,MAAM,eAAe,CAAC,GAAG,eAAe,GAAG,oBAAoB;AAExD,SAAS,WAAW,SAAuC;AAChE,QAAM,OAAO;AAAA,IACX,WAA2B,EAAE,MAAM,YAAY,MAAM,MAAM,aAAa,CAAC;AAAA,EAC3E;AACA,QAAM,UAAU,EAAE,GAAG,QAAQ,YAAY,SAAS,QAAQ,YAAY;AACtE,OAAK,MAAM,cAAc,CAAC,QAAQ,cAAc;AAC9C,UAAM,UAAU,OAAO,SAAS,SAAS;AACzC,WAAO,UAAU,SAAS,SACtB,EAAE,SAAS,QAAQ,GAAG,OAAO,MAAM,SAAS,YAAY,EAAE,IAC1D,EAAE,SAAS,WAAW,GAAG,OAAO,MAAM,SAAS,eAAe,EAAE;AAAA,EACtE,CAAC;AACD,OAAK,MAAM,iBAAiB,CAAC,QAAQ,eAAe;AAAA,IAClD,SAAS;AAAA,IACT,GAAG,YAAY,UAAU,SAAS,SAAS,UAAU,QAAQ,UAAU;AAAA,EACzE,EAAE;AACF,OAAK;AAAA,IAAM;AAAA,IAAe,CAAC,QAAQ,cACjC,UAAU,SAAS,SACf,EAAE,SAAS,QAAQ,OAAO,SAAS,QAAQ,SAAS,KAAK,EAAE,IAC3D;AAAA,MACE,SAAS;AAAA,MACT,OAAO,SAAS,QAAQ,SAAS,KAAK;AAAA,MACtC,GAAG,OAAO,MAAM,QAAQ,UAAU,gBAAgB;AAAA,IACpD;AAAA,EACN;AACA,OAAK,MAAM,oBAAoB,CAAC,QAAQ,cAAc;AACpD,QAAI,UAAU,SAAS;AACrB,aAAO,EAAE,SAAS,UAAU,GAAG,OAAO,MAAM,QAAQ,QAAQ,cAAc,EAAE;AAC9E,UAAM,SAAS,WAAW,QAAQ,MAAM;AACxC,WAAO,EAAE,SAAS,SAAS,GAAG,OAAO,MAAM,QAAQ,YAAY,EAAE;AAAA,EACnE,CAAC;AACD,OAAK,MAAM,mBAAmB,CAAC,QAAQ,WAAW,SAAS;AACzD,QAAI,UAAU,SAAS,QAAS,QAAO,EAAE,SAAS,OAAO;AACzD,UAAM,OAAO,KAAK,SAAS,QAAQ;AAAA,MACjC,SAAS;AAAA,MACT,MAAM,MAAM,WAAW,QAAQ,KAAK;AAAA,MACpC,OAAO,CAAC,UAAU,MAAM,QAAQ;AAAA,IAClC,CAAC;AACD,WAAO,EAAE,SAAS,SAAS,GAAG,OAAO,MAAM,KAAK,OAAO,YAAY,EAAE;AAAA,EACvE,CAAC;AACD,OAAK;AAAA,IACH;AAAA,IACA,aAAa,CAAC,QAAiB,WAA2B,SAA+B;AACvF,UAAI,UAAU,SAAS,QAAS,QAAO,EAAE,SAAS,OAAO;AACzD,YAAM,UAAU,QAAQ,QAAQ,UAAU,KAAK;AAC/C,UAAI,CAAC,QAAS,OAAM,UAAU,gBAAgB;AAC9C,YAAM,OAAO,KAAK,SAAS,QAAQ;AAAA,QACjC,SAAS;AAAA,QACT,MAAM,MAAM;AAAA,QACZ,OAAO,CAAC,SAAS,KAAK,QAAQ;AAAA,MAChC,CAAC;AACD,YAAM,QAAQ,CAAC,SACb,OAAO,MAAM,KAAK,MAAM,MAAM,IAAI,CAA6B;AACjE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY,MAAM,YAAY;AAAA,QAC9B,MAAM,MAAM,MAAM;AAAA,QAClB,WAAW,MAAM,WAAW;AAAA,QAC5B,GAAG,OAAO,MAAM,KAAK,MAAM,OAAO,aAAa;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH;AACA,OAAK,MAAM,kBAAkB,CAAC,QAAQ,WAAW,SAAS;AACxD,UAAM,OAAO,QAAQ;AACrB,QAAI,UAAU,SAAS,WAAW,CAAC,KAAM,QAAO,EAAE,SAAS,OAAO;AAClE,UAAM,OAAO,KAAK,SAAS,QAAQ;AAAA,MACjC,SAAS;AAAA,MACT,MAAM,MAAM,UAAU,IAAI;AAAA,MAC1B,OAAO,CAAC,UAAU,MAAM,QAAQ;AAAA,IAClC,CAAC;AACD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,SAAS,KAAK,SAAS;AAAA,MAClC,GAAG,OAAO,MAAM,KAAK,OAAO,YAAY;AAAA,IAC1C;AAAA,EACF,CAAC;AACD,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,6 @@
1
1
  import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
2
2
  import { FIRST_CONE } from "../agents.js";
3
+ import { IMPORTS_DIR } from "../freezer/paths.js";
3
4
  import {
4
5
  AGENT_DIR,
5
6
  LEGACY,
@@ -166,7 +167,7 @@ function agentUsers(pool, client, root, agents) {
166
167
  },
167
168
  async start(opened) {
168
169
  await root.exec(
169
- `mkdir -p ${SESSIONS.tmp} ${AGENT_DIR} ${SHARED_DIR} && chmod 1777 ${SESSIONS.tmp} && chmod 755 ${AGENT_DIR} && chmod 700 ${SHARED_DIR}`,
170
+ `mkdir -p ${SESSIONS.tmp} ${AGENT_DIR} ${SHARED_DIR} ${IMPORTS_DIR} && chmod 1777 ${SESSIONS.tmp} && chmod 755 ${AGENT_DIR} && chmod 700 ${SHARED_DIR} ${IMPORTS_DIR}`,
170
171
  void 0,
171
172
  BACKGROUND_CONTEXT
172
173
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/kernel/agent-users.ts"],
4
- "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Agents, AgentsState } from '../agents.ts';\nimport { FIRST_CONE } from '../agents.ts';\nimport type { GelatiereAttach } from '../gelatiere/index.ts';\nimport {\n AGENT_DIR,\n type Layout,\n LEGACY,\n ROOT_HOME,\n ROOT_USER,\n SESSIONS,\n SHARED_DIR,\n usersLayout,\n} from '../layout.ts';\nimport type { LickTarget } from '../licks/lick.ts';\nimport type { LickDir } from '../licks/sources.ts';\nimport type { Spools } from '../scoops/index.ts';\nimport { findScoop } from '../scoops/service.ts';\nimport type { SkillPeople } from '../skills/index.ts';\nimport type { SprinklePlace, SprinklesAttach } from '../sprinkles/index.ts';\nimport {\n type Accounts,\n CONE_PREFIX,\n createAccounts,\n homeOf,\n scoopUser,\n type UsersMode,\n wanted,\n} from './accounts.ts';\nimport type { KernelClient } from './client.ts';\nimport { type EnvRoute, type EnvTargetLike, HOME, quote, SliccKernelEnv } from './env.ts';\nimport type { UserClients } from './users.ts';\n\nexport interface AgentUsers {\n readonly accounts: Accounts;\n readonly layout: Layout;\n readonly spools: Spools;\n readonly enforced: boolean;\n readonly people: SkillPeople;\n follow(\n runtimes: readonly {\n reload?(context: Context): Promise<void>;\n reconcile?(context: Context): Promise<void>;\n }[]\n ): void;\n lickDirs(): Promise<LickDir[]>;\n cronUser(target: LickTarget, place: LickDir): string | undefined;\n sprinklePlaces(): SprinklePlace[];\n sprinkles(): Partial<SprinklesAttach>;\n envOfAgent(agentId: string): Promise<SliccKernelEnv | undefined>;\n gelatiere(root: SliccKernelEnv): Promise<Partial<GelatiereAttach>>;\n route(target: EnvTargetLike): Promise<EnvRoute | undefined>;\n start(agents: Agents): Promise<void>;\n close(): void;\n}\n\nexport function modeOf(client: KernelClient): UsersMode {\n const mode = (client as { users?: unknown }).users;\n return mode === 'report' || mode === 'enforce' ? mode : 'off';\n}\n\nexport async function missingSupport(\n pool: UserClients | undefined,\n client: KernelClient,\n requested: boolean | undefined\n): Promise<string[]> {\n if (!pool) return requested === true ? ['admin (the page passed no KernelSource.users)'] : [];\n const missing: string[] = [];\n if (\n !(await pool.users.list().then(\n () => true,\n () => false\n ))\n )\n missing.push('users');\n if ((client as { users?: unknown }).users === undefined)\n missing.push('the users mode (kernel 1.57)');\n if (\n !(await pool.groups.list().then(\n () => true,\n () => false\n ))\n )\n missing.push('groups and homeMode (kernel 1.60 and KernelSource.groups)');\n return missing;\n}\n\nexport async function warnSupport(\n pool: UserClients | undefined,\n client: KernelClient,\n requested: boolean | undefined,\n report: (message: string) => void = (message) => console.error(message)\n): Promise<void> {\n const missing = await missingSupport(pool, client, requested);\n if (missing.length)\n report(\n `slicc-agent: kernel users were requested, but this kernel or page lacks ${missing.join(', ')}`\n );\n}\n\nexport function legacyCwd(state: Readonly<AgentsState>, agentId: string, cwd: string): boolean {\n if (cwd === HOME) return true;\n const record = state.scoops[agentId];\n return record !== undefined && cwd === LEGACY.workspace(record.folder);\n}\n\nexport function spoolScript(user: string, dir: string): string {\n const at = quote(dir);\n const made = `mkdir -p ${at}/in ${at}/out`;\n if (user === ROOT_USER) return made;\n return `${made} && chown -R ${quote(`${user}:${user}`)} ${at} && chmod 700 ${at} ${at}/in ${at}/out`;\n}\n\nexport function agentUsers(\n pool: UserClients,\n client: KernelClient,\n root: SliccKernelEnv,\n agents: () => Agents | undefined\n): AgentUsers {\n const mode = modeOf(client);\n const accounts = createAccounts(pool, agents, mode, pool.groups);\n const state = () => agents()?.state() ?? { cones: {}, active: 'cone', next: 2, scoops: {} };\n const envOf = async (agentId: string, home: string) =>\n new SliccKernelEnv(await accounts.client(agentId), { cwd: home });\n const layout = usersLayout(state, envOf, root);\n let ready: () => void = () => undefined;\n const started = new Promise<void>((resolve) => {\n ready = resolve;\n });\n let off: () => void = () => undefined;\n const homes = () => wanted(state()).map((entry) => homeOf(entry.spec.name));\n const listeners = new Set<() => void>();\n let known = '';\n const changed = () => {\n const key = homes().join('\\n');\n if (key === known) return;\n known = key;\n for (const listener of listeners) listener();\n };\n return {\n accounts,\n layout,\n enforced: mode === 'enforce',\n people: {\n homes,\n homeOfAgent(agentId) {\n return accounts.home(agentId) ?? accounts.home(`${CONE_PREFIX}${agentId}`);\n },\n homeOf(conversationId) {\n const agentId = accounts.agentOf(conversationId);\n return agentId ? accounts.home(agentId) : undefined;\n },\n async envOf(at) {\n const user = wanted(state()).find((entry) => homeOf(entry.spec.name) === at);\n return user ? envOf(user.agentId, at).catch(() => undefined) : undefined;\n },\n },\n sprinklePlaces() {\n return wanted(state())\n .filter((entry) => !entry.cone)\n .map((entry) => ({ dir: `${homeOf(entry.spec.name)}/sprinkles`, cone: entry.spec.name }));\n },\n sprinkles() {\n return {\n places: () => this.sprinklePlaces(),\n envOf: (agentId: string) => this.envOfAgent(agentId),\n homeOf: (agentId: string) => accounts.home(agentId),\n shared: SHARED_DIR,\n };\n },\n async envOfAgent(agentId) {\n const home = accounts.home(agentId);\n return home ? envOf(agentId, home).catch(() => undefined) : undefined;\n },\n async gelatiere(root) {\n const first = `${CONE_PREFIX}${FIRST_CONE}`;\n const files = await this.envOfAgent(first);\n return {\n home: homeOf(FIRST_CONE),\n profile: SHARED_DIR,\n shared: SHARED_DIR,\n ...(files ? { files } : {}),\n as: async (caller) => {\n const env = caller ? await this.envOfAgent(caller) : undefined;\n const home = caller ? accounts.home(caller) : undefined;\n return env && home ? { env, home } : { env: root, home: ROOT_HOME };\n },\n cronUser: async (folder) => {\n await this.envOfAgent(`scoop:${folder}`);\n return scoopUser(folder);\n },\n };\n },\n async lickDirs() {\n const cones = wanted(state()).filter((entry) => !entry.cone);\n const out: LickDir[] = [{ dir: `${ROOT_HOME}/.slicc`, home: ROOT_HOME, cone: null }];\n for (const entry of cones) {\n const home = homeOf(entry.spec.name);\n const env = await envOf(entry.agentId, home).catch(() => undefined);\n out.push({ dir: `${home}/.slicc`, home, cone: entry.spec.name, ...(env ? { env } : {}) });\n }\n return out;\n },\n cronUser(target, place) {\n if (!target.startsWith('scoop:')) return undefined;\n const found = findScoop(state(), target, place.cone);\n return found ? scoopUser(found[1].folder) : undefined;\n },\n follow(runtimes) {\n listeners.add(() => {\n for (const runtime of runtimes)\n void (runtime.reconcile ?? runtime.reload)\n ?.call(runtime, BACKGROUND_CONTEXT)\n .catch(() => undefined);\n });\n },\n spools: {\n users: () => [ROOT_USER, ...wanted(state()).map((entry) => entry.spec.name)],\n async prepare(user, dir, context) {\n await root.exec(spoolScript(user, dir), undefined, context);\n },\n },\n async route(target) {\n await started;\n const agentId = accounts.agentOf(target.conversationId);\n const home = agentId ? accounts.home(agentId) : undefined;\n if (!agentId || !home) return undefined;\n const legacy = target.cwd !== undefined && legacyCwd(state(), agentId, target.cwd);\n return { client: await accounts.client(agentId), home, ...(legacy ? { cwd: home } : {}) };\n },\n async start(opened) {\n await root.exec(\n `mkdir -p ${SESSIONS.tmp} ${AGENT_DIR} ${SHARED_DIR} && chmod 1777 ${SESSIONS.tmp} && chmod 755 ${AGENT_DIR} && chmod 700 ${SHARED_DIR}`,\n undefined,\n BACKGROUND_CONTEXT\n );\n await accounts.boot();\n known = homes().join('\\n');\n off = opened.onChange(() => {\n void accounts.reconcile();\n changed();\n });\n ready();\n },\n close() {\n off();\n },\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Agents, AgentsState } from '../agents.ts';\nimport { FIRST_CONE } from '../agents.ts';\nimport { IMPORTS_DIR } from '../freezer/paths.ts';\nimport type { GelatiereAttach } from '../gelatiere/index.ts';\nimport {\n AGENT_DIR,\n type Layout,\n LEGACY,\n ROOT_HOME,\n ROOT_USER,\n SESSIONS,\n SHARED_DIR,\n usersLayout,\n} from '../layout.ts';\nimport type { LickTarget } from '../licks/lick.ts';\nimport type { LickDir } from '../licks/sources.ts';\nimport type { Spools } from '../scoops/index.ts';\nimport { findScoop } from '../scoops/service.ts';\nimport type { SkillPeople } from '../skills/index.ts';\nimport type { SprinklePlace, SprinklesAttach } from '../sprinkles/index.ts';\nimport {\n type Accounts,\n CONE_PREFIX,\n createAccounts,\n homeOf,\n scoopUser,\n type UsersMode,\n wanted,\n} from './accounts.ts';\nimport type { KernelClient } from './client.ts';\nimport { type EnvRoute, type EnvTargetLike, HOME, quote, SliccKernelEnv } from './env.ts';\nimport type { UserClients } from './users.ts';\n\nexport interface AgentUsers {\n readonly accounts: Accounts;\n readonly layout: Layout;\n readonly spools: Spools;\n readonly enforced: boolean;\n readonly people: SkillPeople;\n follow(\n runtimes: readonly {\n reload?(context: Context): Promise<void>;\n reconcile?(context: Context): Promise<void>;\n }[]\n ): void;\n lickDirs(): Promise<LickDir[]>;\n cronUser(target: LickTarget, place: LickDir): string | undefined;\n sprinklePlaces(): SprinklePlace[];\n sprinkles(): Partial<SprinklesAttach>;\n envOfAgent(agentId: string): Promise<SliccKernelEnv | undefined>;\n gelatiere(root: SliccKernelEnv): Promise<Partial<GelatiereAttach>>;\n route(target: EnvTargetLike): Promise<EnvRoute | undefined>;\n start(agents: Agents): Promise<void>;\n close(): void;\n}\n\nexport function modeOf(client: KernelClient): UsersMode {\n const mode = (client as { users?: unknown }).users;\n return mode === 'report' || mode === 'enforce' ? mode : 'off';\n}\n\nexport async function missingSupport(\n pool: UserClients | undefined,\n client: KernelClient,\n requested: boolean | undefined\n): Promise<string[]> {\n if (!pool) return requested === true ? ['admin (the page passed no KernelSource.users)'] : [];\n const missing: string[] = [];\n if (\n !(await pool.users.list().then(\n () => true,\n () => false\n ))\n )\n missing.push('users');\n if ((client as { users?: unknown }).users === undefined)\n missing.push('the users mode (kernel 1.57)');\n if (\n !(await pool.groups.list().then(\n () => true,\n () => false\n ))\n )\n missing.push('groups and homeMode (kernel 1.60 and KernelSource.groups)');\n return missing;\n}\n\nexport async function warnSupport(\n pool: UserClients | undefined,\n client: KernelClient,\n requested: boolean | undefined,\n report: (message: string) => void = (message) => console.error(message)\n): Promise<void> {\n const missing = await missingSupport(pool, client, requested);\n if (missing.length)\n report(\n `slicc-agent: kernel users were requested, but this kernel or page lacks ${missing.join(', ')}`\n );\n}\n\nexport function legacyCwd(state: Readonly<AgentsState>, agentId: string, cwd: string): boolean {\n if (cwd === HOME) return true;\n const record = state.scoops[agentId];\n return record !== undefined && cwd === LEGACY.workspace(record.folder);\n}\n\nexport function spoolScript(user: string, dir: string): string {\n const at = quote(dir);\n const made = `mkdir -p ${at}/in ${at}/out`;\n if (user === ROOT_USER) return made;\n return `${made} && chown -R ${quote(`${user}:${user}`)} ${at} && chmod 700 ${at} ${at}/in ${at}/out`;\n}\n\nexport function agentUsers(\n pool: UserClients,\n client: KernelClient,\n root: SliccKernelEnv,\n agents: () => Agents | undefined\n): AgentUsers {\n const mode = modeOf(client);\n const accounts = createAccounts(pool, agents, mode, pool.groups);\n const state = () => agents()?.state() ?? { cones: {}, active: 'cone', next: 2, scoops: {} };\n const envOf = async (agentId: string, home: string) =>\n new SliccKernelEnv(await accounts.client(agentId), { cwd: home });\n const layout = usersLayout(state, envOf, root);\n let ready: () => void = () => undefined;\n const started = new Promise<void>((resolve) => {\n ready = resolve;\n });\n let off: () => void = () => undefined;\n const homes = () => wanted(state()).map((entry) => homeOf(entry.spec.name));\n const listeners = new Set<() => void>();\n let known = '';\n const changed = () => {\n const key = homes().join('\\n');\n if (key === known) return;\n known = key;\n for (const listener of listeners) listener();\n };\n return {\n accounts,\n layout,\n enforced: mode === 'enforce',\n people: {\n homes,\n homeOfAgent(agentId) {\n return accounts.home(agentId) ?? accounts.home(`${CONE_PREFIX}${agentId}`);\n },\n homeOf(conversationId) {\n const agentId = accounts.agentOf(conversationId);\n return agentId ? accounts.home(agentId) : undefined;\n },\n async envOf(at) {\n const user = wanted(state()).find((entry) => homeOf(entry.spec.name) === at);\n return user ? envOf(user.agentId, at).catch(() => undefined) : undefined;\n },\n },\n sprinklePlaces() {\n return wanted(state())\n .filter((entry) => !entry.cone)\n .map((entry) => ({ dir: `${homeOf(entry.spec.name)}/sprinkles`, cone: entry.spec.name }));\n },\n sprinkles() {\n return {\n places: () => this.sprinklePlaces(),\n envOf: (agentId: string) => this.envOfAgent(agentId),\n homeOf: (agentId: string) => accounts.home(agentId),\n shared: SHARED_DIR,\n };\n },\n async envOfAgent(agentId) {\n const home = accounts.home(agentId);\n return home ? envOf(agentId, home).catch(() => undefined) : undefined;\n },\n async gelatiere(root) {\n const first = `${CONE_PREFIX}${FIRST_CONE}`;\n const files = await this.envOfAgent(first);\n return {\n home: homeOf(FIRST_CONE),\n profile: SHARED_DIR,\n shared: SHARED_DIR,\n ...(files ? { files } : {}),\n as: async (caller) => {\n const env = caller ? await this.envOfAgent(caller) : undefined;\n const home = caller ? accounts.home(caller) : undefined;\n return env && home ? { env, home } : { env: root, home: ROOT_HOME };\n },\n cronUser: async (folder) => {\n await this.envOfAgent(`scoop:${folder}`);\n return scoopUser(folder);\n },\n };\n },\n async lickDirs() {\n const cones = wanted(state()).filter((entry) => !entry.cone);\n const out: LickDir[] = [{ dir: `${ROOT_HOME}/.slicc`, home: ROOT_HOME, cone: null }];\n for (const entry of cones) {\n const home = homeOf(entry.spec.name);\n const env = await envOf(entry.agentId, home).catch(() => undefined);\n out.push({ dir: `${home}/.slicc`, home, cone: entry.spec.name, ...(env ? { env } : {}) });\n }\n return out;\n },\n cronUser(target, place) {\n if (!target.startsWith('scoop:')) return undefined;\n const found = findScoop(state(), target, place.cone);\n return found ? scoopUser(found[1].folder) : undefined;\n },\n follow(runtimes) {\n listeners.add(() => {\n for (const runtime of runtimes)\n void (runtime.reconcile ?? runtime.reload)\n ?.call(runtime, BACKGROUND_CONTEXT)\n .catch(() => undefined);\n });\n },\n spools: {\n users: () => [ROOT_USER, ...wanted(state()).map((entry) => entry.spec.name)],\n async prepare(user, dir, context) {\n await root.exec(spoolScript(user, dir), undefined, context);\n },\n },\n async route(target) {\n await started;\n const agentId = accounts.agentOf(target.conversationId);\n const home = agentId ? accounts.home(agentId) : undefined;\n if (!agentId || !home) return undefined;\n const legacy = target.cwd !== undefined && legacyCwd(state(), agentId, target.cwd);\n return { client: await accounts.client(agentId), home, ...(legacy ? { cwd: home } : {}) };\n },\n async start(opened) {\n await root.exec(\n `mkdir -p ${SESSIONS.tmp} ${AGENT_DIR} ${SHARED_DIR} ${IMPORTS_DIR} && chmod 1777 ${SESSIONS.tmp} && chmod 755 ${AGENT_DIR} && chmod 700 ${SHARED_DIR} ${IMPORTS_DIR}`,\n undefined,\n BACKGROUND_CONTEXT\n );\n await accounts.boot();\n known = homes().join('\\n');\n off = opened.onChange(() => {\n void accounts.reconcile();\n changed();\n });\n ready();\n },\n close() {\n off();\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["root"]
7
7
  }
@@ -162,6 +162,7 @@ export {
162
162
  relicked,
163
163
  scheduleOf,
164
164
  sendCommand,
165
- withoutJobs
165
+ withoutJobs,
166
+ writeTable
166
167
  };
167
168
  //# sourceMappingURL=crontab.js.map