@ai-ecoverse/slicc-agent 4.0.0 → 4.2.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 (46) hide show
  1. package/dist/client.js +2 -0
  2. package/dist/client.js.map +2 -2
  3. package/dist/control.js +4 -1
  4. package/dist/control.js.map +2 -2
  5. package/dist/freezer/index.js +27 -68
  6. package/dist/freezer/index.js.map +2 -2
  7. package/dist/host.js +2 -0
  8. package/dist/host.js.map +2 -2
  9. package/dist/index.js +6 -0
  10. package/dist/index.js.map +2 -2
  11. package/dist/kernel/agent-users.js +3 -0
  12. package/dist/kernel/agent-users.js.map +2 -2
  13. package/dist/main.js +27 -10
  14. package/dist/main.js.map +2 -2
  15. package/dist/memory/runtime.js +1 -1
  16. package/dist/memory/runtime.js.map +2 -2
  17. package/dist/preferred.js +14 -0
  18. package/dist/preferred.js.map +7 -0
  19. package/dist/secrets/extension.js +6 -3
  20. package/dist/secrets/extension.js.map +2 -2
  21. package/dist/services.js.map +2 -2
  22. package/dist/settings.js +18 -2
  23. package/dist/settings.js.map +3 -3
  24. package/dist/skills/index.js +20 -3
  25. package/dist/skills/index.js.map +3 -3
  26. package/dist/spectrum/agent-port.js +29 -1
  27. package/dist/spectrum/agent-port.js.map +2 -2
  28. package/dist/spectrum/settings-port.js +23 -8
  29. package/dist/spectrum/settings-port.js.map +2 -2
  30. package/dist/titles/extension.js +110 -0
  31. package/dist/titles/extension.js.map +7 -0
  32. package/dist/{freezer/title.js → titles/generate.js} +21 -2
  33. package/dist/titles/generate.js.map +7 -0
  34. package/dist/types/client.d.ts +2 -1
  35. package/dist/types/control.d.ts +1 -1
  36. package/dist/types/freezer/index.d.ts +2 -5
  37. package/dist/types/index.d.ts +1 -1
  38. package/dist/types/preferred.d.ts +5 -0
  39. package/dist/types/services.d.ts +5 -0
  40. package/dist/types/settings.d.ts +5 -1
  41. package/dist/types/skills/index.d.ts +4 -1
  42. package/dist/types/spectrum/agent-port.d.ts +1 -1
  43. package/dist/types/titles/extension.d.ts +19 -0
  44. package/dist/types/{freezer/title.d.ts → titles/generate.d.ts} +4 -0
  45. package/package.json +3 -3
  46. package/dist/freezer/title.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/freezer/index.ts"],
4
- "sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type {\n Conversation,\n ConversationId,\n EntryRecord,\n Harness,\n} from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { answerText } from '../agent.ts';\nimport {\n type Agents,\n type AgentsState,\n type ConeRecord,\n type FrozenRecord,\n live,\n type ScoopRecord,\n} from '../agents.ts';\nimport { HOME } from '../kernel/env.ts';\nimport { type Layout, LEGACY } from '../layout.ts';\nimport type { LickTarget } from '../licks/lick.ts';\nimport { redactSecrets } from '../memory/format.ts';\nimport { pinned } from '../secrets/extension.ts';\nimport { scrubText } from '../secrets/scrub.ts';\n\nexport type Answer = { code: number; out: string };\n\nexport type ConversationKind = 'cone' | 'scoop' | 'agent';\n\nexport interface FrozenCone {\n id: string;\n name: string;\n title: string;\n model: string;\n messages: number;\n frozenAt: number;\n kind: ConversationKind;\n live: boolean;\n thawedAs: string | null;\n}\n\nexport const THAWED_KIND = 'slicc.thawed';\n\nexport type Frozen = { id: string; name: string; at: number };\n\nexport interface FreezerAttach {\n harness: Harness;\n agents: Agents;\n env: Pick<ExecutionEnv, 'remove' | 'exists'>;\n title?: (transcript: string, model: string, context: Context) => Promise<string | undefined>;\n extract?: (\n conversation: number,\n tail: number,\n context: Context,\n cone: string\n ) => Promise<unknown>;\n now?: () => number;\n layout?: Layout;\n}\n\nexport interface FreezerRuntime {\n readonly frozen: ReplicatedState<FrozenCone[]>;\n freeze(agentId: string, context: Context): Promise<string>;\n newChat(agentId: string, context: Context): Promise<string | null>;\n thaw(id: string, context: Context): Promise<string>;\n discard(id: string, context: Context): Promise<void>;\n refresh(): Promise<readonly FrozenCone[]>;\n touch(): void;\n frozenTarget(target: LickTarget): Frozen | undefined;\n command(argv: readonly string[], caller: string | null, context: Context): Promise<Answer>;\n close(): void;\n}\n\nexport const USAGE = `usage:\n freezer list every conversation: id, kind, name, title, messages, when\n freezer show <id> a conversation as Markdown\n freezer thaw <id> continue a stopped conversation as a cone\n\nDelete a cone, or start a new conversation, from the chat toolbar or the command palette.\n`;\n\nconst TITLE_LENGTH = 60;\nconst TITLE_WORDS = 6;\nexport const TITLE_TURNS = [1, 3];\nconst TRIVIAL_WORDS = 4;\nconst TRANSCRIPT_LENGTH = 4000;\nexport const TOUCH_MS = 500;\n\nfunction textOf(entry: EntryRecord): string {\n return answerText(entry.model?.[0]?.content).trim();\n}\n\nexport function modelName(model: { provider: string; modelId: string } | undefined): string {\n return model ? `${model.provider}/${model.modelId}` : '';\n}\n\nexport function firstLine(entries: readonly EntryRecord[]): string {\n const first = entries.find((entry) => entry.kind === 'pi.user' && textOf(entry));\n const line = first ? (textOf(first).split('\\n')[0] as string).trim() : '';\n if (!line) return 'Untitled chat';\n return line.length > TITLE_LENGTH ? `${line.slice(0, TITLE_LENGTH - 1)}\u2026` : line;\n}\n\nfunction calls(entry: EntryRecord): string[] {\n const content = entry.model?.[0]?.content;\n if (!Array.isArray(content)) return [];\n return (content as { type: string; name?: string; arguments?: unknown }[])\n .filter((part) => part.type === 'toolCall')\n .map((part) => `- \\`${part.name}\\` ${JSON.stringify(part.arguments ?? {})}`);\n}\n\nexport function markdown(\n record: Pick<FrozenRecord, 'title' | 'name' | 'model' | 'frozenAt'>,\n entries: readonly EntryRecord[]\n): string {\n const out = [\n `# ${record.title}`,\n '',\n `${record.name} \u00B7 ${record.model} \u00B7 ${new Date(record.frozenAt).toISOString()}`,\n ];\n for (const entry of entries) {\n if (entry.kind === 'pi.user' && textOf(entry)) out.push('', '## User', '', textOf(entry));\n if (entry.kind !== 'pi.assistant') continue;\n const text = textOf(entry);\n const tools = calls(entry);\n if (!text && !tools.length) continue;\n out.push('', '## Assistant', '');\n if (text) out.push(text);\n if (tools.length) out.push(...(text ? [''] : []), ...tools);\n }\n return `${out.join('\\n')}\\n`;\n}\n\ntype Stats = Pick<FrozenCone, 'title' | 'model' | 'messages' | 'frozenAt'>;\n\nfunction counted(entries: readonly EntryRecord[]): number {\n return entries.filter((entry) => entry.kind === 'pi.user' || entry.kind === 'pi.assistant')\n .length;\n}\n\nfunction lastAt(entries: readonly EntryRecord[]): number {\n let at = 0;\n for (const entry of entries)\n for (const message of entry.model ?? []) {\n const stamp = (message as { timestamp?: unknown }).timestamp;\n if (typeof stamp === 'number' && stamp > at) at = stamp;\n }\n return at;\n}\n\ntype Inspected = { stats: Stats; entries: readonly EntryRecord[] };\n\nasync function inspect(harness: Harness, id: number, context: Context): Promise<Inspected> {\n const conversation = await harness.conversation(id as ConversationId, context);\n if (!conversation)\n return { stats: { title: firstLine([]), model: '', messages: 0, frozenAt: 0 }, entries: [] };\n const view = await conversation.context(context);\n const agent = await conversation.agent(context);\n return {\n stats: {\n title: firstLine(view.entries),\n model: modelName(agent.model),\n messages: counted(view.entries),\n frozenAt: lastAt(view.entries),\n },\n entries: view.entries,\n };\n}\n\nexport function trivial(text: string): boolean {\n const words = text\n .split(/\\s+/)\n .map((word) => word.replace(/\\p{P}|\\p{S}|\\u200d|\\ufe0f/gu, ''))\n .filter(Boolean);\n return (\n words.length < TRIVIAL_WORDS && !(words.length === 1 && [...(words[0] as string)].length >= 8)\n );\n}\n\nexport function titleDue(\n record: Pick<ConeRecord, 'titled'>,\n entries: readonly EntryRecord[],\n final = false\n): number | undefined {\n const last = entries.at(-1);\n const stop = (last?.model?.[0] as { stopReason?: unknown } | undefined)?.stopReason;\n if (last?.kind !== 'pi.assistant' || stop !== 'stop') return undefined;\n const said = entries.filter((entry) => entry.kind === 'pi.user' && textOf(entry));\n const greeting = !final && trivial(textOf(said[0] ?? ({} as EntryRecord)));\n const next = TITLE_TURNS.find((turn) => turn > (record.titled ?? 0) && !(greeting && turn === 1));\n return next !== undefined && said.length >= next ? said.length : undefined;\n}\n\nexport function cleanTitle(title: string | undefined): string | undefined {\n const clean = title\n ?.replace(/\\s+/g, ' ')\n .trim()\n .replace(/^[\"'\u201C\u201D]+|[\"'\u201C\u201D]+$/g, '')\n .replace(/\\.+$/, '')\n .trim()\n .split(' ')\n .slice(0, TITLE_WORDS)\n .join(' ');\n return clean ? clean.slice(0, TITLE_LENGTH) : undefined;\n}\n\nfunction transcriptOf(entries: readonly EntryRecord[]): string {\n return entries\n .filter((entry) => entry.kind === 'pi.user' || entry.kind === 'pi.assistant')\n .map((entry) => `${entry.kind === 'pi.user' ? 'User' : 'Agent'}: ${textOf(entry)}`)\n .join('\\n');\n}\n\ntype Titled = Pick<ConeRecord, 'conversation' | 'title' | 'titled'>;\n\ntype Seen = (\n id: string,\n record: Titled,\n entries: readonly EntryRecord[],\n model: string,\n final?: boolean\n) => void;\n\nconst kindOf = (scoop: ScoopRecord): ConversationKind =>\n scoop.kind === 'sync' ? 'agent' : 'scoop';\n\nasync function rows(\n harness: Harness,\n state: Readonly<AgentsState>,\n cache: Map<number, Stats>,\n context: Context,\n seen?: Seen\n): Promise<FrozenCone[]> {\n const stopped = async (conversation: number) => {\n const cached = cache.get(conversation);\n if (cached) return cached;\n const found = (await inspect(harness, conversation, context)).stats;\n cache.set(conversation, found);\n return found;\n };\n const ended = async (id: string, record: Titled) => {\n const stats = await stopped(record.conversation);\n if (seen && (record.titled ?? 0) < (TITLE_TURNS.at(-1) as number)) {\n const { entries } = await inspect(harness, record.conversation, context);\n seen(id, record, entries, stats.model, true);\n }\n return { ...stats, ...(record.title ? { title: record.title } : {}) };\n };\n const running = async (id: string, record: Titled) => {\n const { stats, entries } = await inspect(harness, record.conversation, context);\n seen?.(id, record, entries, stats.model);\n return { ...stats, ...(record.title ? { title: record.title } : {}) };\n };\n const out: FrozenCone[] = [];\n for (const [id, cone] of Object.entries(state.cones))\n out.push({\n id,\n name: cone.name,\n ...(await running(id, cone)),\n kind: 'cone',\n live: true,\n thawedAs: null,\n });\n for (const [id, record] of Object.entries(state.frozen ?? {}))\n out.push({\n id,\n name: record.name,\n title: record.title,\n model: record.model,\n messages: record.messages,\n frozenAt: record.frozenAt,\n kind: 'cone',\n live: false,\n thawedAs: null,\n });\n for (const [id, scoop] of Object.entries(state.scoops)) {\n if (scoop.removed) continue;\n const on = live(scoop);\n out.push({\n id,\n name: scoop.name,\n ...(on ? await running(id, scoop) : await ended(id, scoop)),\n kind: kindOf(scoop),\n live: on,\n thawedAs: scoop.thawedAs ?? null,\n });\n }\n return out.sort((a, b) => Number(b.live) - Number(a.live) || b.frozenAt - a.frozenAt);\n}\n\nexport function thawedNote(\n kind: ConversationKind,\n name: string,\n folder: string,\n kept: boolean,\n home = HOME\n): string {\n const what = kind === 'agent' ? 'agent run' : kind;\n const place = kept\n ? `Its workspace ${folder} is still there.`\n : `Its workspace ${folder} was deleted when it stopped.`;\n return `This was ${what} ${name}'s conversation, thawed as a cone. ${place} You now work in ${home} as a cone, with a cone's tools.`;\n}\n\ntype Snapshot = { entries: readonly EntryRecord[]; record: Omit<FrozenRecord, 'scoops' | 'cone'> };\n\nasync function snapshot(\n conversation: Conversation,\n name: string,\n now: number,\n context: Context,\n title?: string\n): Promise<Snapshot> {\n const view = await conversation.context(context);\n const agent = await conversation.agent(context);\n return {\n entries: view.entries,\n record: {\n name,\n conversation: conversation.id,\n title: title ?? firstLine(view.entries),\n model: modelName(agent.model),\n messages: counted(view.entries),\n frozenAt: now,\n },\n };\n}\n\nexport function frozenTarget(state: Readonly<AgentsState>, target: LickTarget): Frozen | undefined {\n const records = Object.entries(state.frozen ?? {});\n if (target.startsWith('cone:')) {\n const cone = target.slice('cone:'.length);\n if (state.cones[cone]) return undefined;\n const found = records\n .filter(([, record]) => record.cone === cone)\n .sort(([, a], [, b]) => b.frozenAt - a.frozenAt)[0];\n return found ? { id: found[0], name: found[1].name, at: found[1].frozenAt } : undefined;\n }\n const owner = state.scoops[target]?.frozen;\n const record = owner ? state.frozen?.[owner] : undefined;\n return owner && record ? { id: owner, name: record.name, at: record.frozenAt } : undefined;\n}\n\nasync function command(\n options: FreezerAttach,\n runtime: FreezerRuntime,\n argv: readonly string[],\n context: Context\n): Promise<Answer> {\n const verb = argv[0] ?? 'help';\n const listed = await runtime.refresh();\n if (verb === 'list') {\n const lines = listed.map(\n (item) =>\n `${item.id}\\t${item.kind}${item.live ? ' (live)' : ''}\\t${item.name}\\t${item.title}\\t${item.messages} messages\\t${new Date(item.frozenAt).toISOString()}`\n );\n return { code: 0, out: lines.length ? `${lines.join('\\n')}\\n` : 'no conversations\\n' };\n }\n if (verb !== 'show' && verb !== 'thaw')\n return { code: verb === 'help' || verb === '--help' ? 0 : 2, out: USAGE };\n const id = argv[1] ?? '';\n const item = listed.find((row) => row.id === id);\n if (!item) return { code: 1, out: `freezer: there is no conversation ${id}\\n` };\n if (verb === 'thaw') {\n if (item.live) return { code: 1, out: `freezer: ${item.name} is live; it needs no thawing\\n` };\n return { code: 0, out: `thawed ${id} as ${await runtime.thaw(id, context)}\\n` };\n }\n const state = options.agents.state();\n const conversationId =\n state.frozen?.[id]?.conversation ??\n state.cones[id]?.conversation ??\n state.scoops[id]?.conversation;\n const conversation = await options.harness.conversation(\n conversationId as ConversationId,\n context\n );\n const entries = conversation ? (await conversation.context(context)).entries : [];\n return { code: 0, out: markdown(item, entries) };\n}\n\nasync function freshLike(\n harness: Harness,\n conversation: Conversation,\n context: Context\n): Promise<Conversation> {\n const agent = await conversation.agent(context);\n return harness.createConversation(\n {\n ownership: { kind: 'ownerless' },\n agent: pinned({\n model: agent.model,\n thinkingLevel: agent.thinkingLevel,\n extensions: agent.extensions,\n tools: agent.tools,\n instructions: agent.instructions ?? null,\n cwd: agent.cwd ?? null,\n }),\n },\n context\n );\n}\n\nasync function activeCone(agents: Agents, context: Context): Promise<Conversation> {\n const conversation = await agents.conversation(agents.state().active, context);\n if (!conversation) throw new Error('There is no active cone.');\n return conversation;\n}\n\nasync function thawScoop(\n options: FreezerAttach & { now: () => number },\n id: string,\n scoop: ScoopRecord,\n context: Context\n): Promise<string> {\n const { harness, agents, env, now } = options;\n const layout = options.layout ?? LEGACY;\n if (scoop.removed) throw new Error(`There is no conversation ${id}.`);\n if (live(scoop)) throw new Error(`${scoop.name} is still running; open it instead.`);\n const conversation = await harness.conversation(scoop.conversation as ConversationId, context);\n if (!conversation) throw new Error(`There is no conversation ${id}.`);\n const last = (await conversation.context(context)).entries.at(-1);\n const agent = await conversation.agent(context);\n const cone = await (await activeCone(agents, context)).agent(context);\n const created = {\n ownership: { kind: 'ownerless' as const },\n agent: pinned({\n model: agent.model as NonNullable<typeof agent.model>,\n thinkingLevel: agent.thinkingLevel,\n extensions: cone.extensions,\n tools: cone.tools,\n instructions: cone.instructions ?? null,\n ...(layout.users ? {} : { cwd: HOME }),\n }),\n };\n const fork = last\n ? await conversation.fork(last.id, created, context)\n : await harness.createConversation(created, context);\n const folder = layout.workspace(scoop.folder);\n const exists = await env.exists(folder, context);\n const kept = exists.ok && exists.value;\n await fork.submit(\n {\n type: 'write',\n entry: {\n kind: THAWED_KIND,\n data: { scoop: id, name: scoop.name, kind: kindOf(scoop), workspace: folder, kept },\n model: [\n {\n role: 'user',\n content: thawedNote(\n kindOf(scoop),\n scoop.name,\n folder,\n kept,\n layout.users ? 'your own home' : HOME\n ),\n timestamp: now(),\n },\n ],\n },\n },\n context\n );\n const coneId = await agents.update((_tx, doc) => {\n const target = `cone-${doc.next}`;\n doc.next += 1;\n doc.cones[target] = {\n name: scoop.name,\n conversation: fork.id,\n ...(scoop.title ? { title: scoop.title, titled: scoop.titled as number } : {}),\n };\n (doc.scoops[id] as ScoopRecord).thawedAs = target;\n return target;\n }, context);\n await agents.selectCone(coneId, context);\n return coneId;\n}\n\nasync function removeScoop(\n options: FreezerAttach,\n id: string,\n scoop: ScoopRecord,\n context: Context\n): Promise<void> {\n const { agents, env } = options;\n if (live(scoop)) throw new Error(`${scoop.name} is still running; stop it first.`);\n await agents.update((_tx, doc) => {\n const entry = doc.scoops[id] as ScoopRecord;\n entry.removed = true;\n entry.gone = true;\n delete entry.frozen;\n }, context);\n await env.remove(\n (options.layout ?? LEGACY).scoopRoot(scoop.folder),\n {\n recursive: true,\n force: true,\n },\n context\n );\n}\n\nfunction listing(harness: Harness, agents: Agents, seen: Seen | undefined) {\n const frozen = replicatedState<FrozenCone[]>([]);\n const cache = new Map<number, Stats>();\n let lock: Promise<readonly FrozenCone[]> = Promise.resolve([]);\n const refresh = () => {\n lock = lock\n .catch(() => [])\n .then(async () => {\n const listed = await rows(harness, agents.state(), cache, BACKGROUND_CONTEXT, seen);\n frozen.replace(BACKGROUND_CONTEXT, listed);\n return listed;\n });\n return lock;\n };\n const quiet = () => void refresh().catch(() => undefined);\n quiet();\n const stop = agents.onChange(quiet);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const touch = () => {\n clearTimeout(timer);\n timer = setTimeout(quiet, TOUCH_MS);\n };\n const off = () => {\n clearTimeout(timer);\n stop();\n };\n return { frozen, refresh, touch, off };\n}\n\nasync function thawFrozen(agents: Agents, id: string, context: Context): Promise<string> {\n const coneId = await agents.update((_tx, doc) => {\n const record = doc.frozen?.[id];\n if (!record) throw new Error(`There is no frozen chat ${id}.`);\n const reuse = !doc.cones[record.cone];\n const target = reuse ? record.cone : `cone-${doc.next}`;\n if (!reuse) doc.next += 1;\n doc.cones[target] = {\n name: record.name,\n conversation: record.conversation,\n title: record.title,\n titled: TITLE_TURNS.at(-1) as number,\n };\n for (const scoop of record.scoops) {\n const entry = doc.scoops[scoop];\n if (!entry) continue;\n delete entry.frozen;\n entry.cone = target;\n }\n delete doc.frozen?.[id];\n return target;\n }, context);\n await agents.selectCone(coneId, context);\n return coneId;\n}\n\nasync function discardFrozen(options: FreezerAttach, id: string, context: Context) {\n const { agents, env } = options;\n const record = agents.state().frozen?.[id];\n if (!record) throw new Error(`There is no frozen chat ${id}.`);\n const folders = record.scoops\n .map((scoop) => agents.state().scoops[scoop]?.folder)\n .filter((folder): folder is string => Boolean(folder));\n await agents.update((_tx, doc) => {\n for (const scoop of record.scoops) {\n const entry = doc.scoops[scoop];\n if (!entry) continue;\n delete entry.frozen;\n entry.gone = true;\n }\n delete doc.frozen?.[id];\n }, context);\n for (const folder of folders)\n await env.remove(\n (options.layout ?? LEGACY).scoopRoot(folder),\n {\n recursive: true,\n force: true,\n },\n context\n );\n}\n\nfunction titling(options: FreezerAttach) {\n const { agents } = options;\n const pending = new Map<string, { token: symbol; conversation: number }>();\n const named = (entries: readonly EntryRecord[], model: string, context: Context) =>\n scrubText(redactSecrets(transcriptOf(entries)).text)\n .then((transcript) =>\n (options.title as NonNullable<FreezerAttach['title']>)(\n transcript.slice(0, TRANSCRIPT_LENGTH),\n model,\n context\n )\n )\n .then(cleanTitle)\n .catch(() => undefined);\n const write = (id: string, titled: Titled, turns: number, title: string | undefined) =>\n agents.update((_tx, doc) => {\n const record = doc.cones[id] ?? doc.scoops[id];\n if (record?.conversation !== titled.conversation) return;\n record.titled = turns;\n if (title) record.title = title;\n }, BACKGROUND_CONTEXT);\n const seen: Seen = (id, seenAs, entries, model, final) => {\n const state = agents.state();\n const titled = state.cones[id] ?? state.scoops[id];\n if (titled?.conversation !== seenAs.conversation) return;\n if (pending.get(id)?.conversation === titled.conversation) return;\n const turns = titleDue(titled, entries, final);\n const last = TITLE_TURNS.at(-1) as number;\n if (turns === undefined) {\n if (final) void write(id, titled, last, undefined).catch(() => undefined);\n return;\n }\n const token = Symbol(id);\n pending.set(id, { token, conversation: titled.conversation });\n void named(entries, model, BACKGROUND_CONTEXT)\n .then((title) =>\n pending.get(id)?.token === token\n ? write(id, titled, final ? last : turns, title)\n : undefined\n )\n .catch(() => undefined)\n .finally(() => {\n if (pending.get(id)?.token === token) pending.delete(id);\n });\n };\n return { pending, named, seen };\n}\n\nexport function attachFreezer(options: FreezerAttach): FreezerRuntime {\n const { harness, agents } = options;\n const now = options.now ?? Date.now;\n const { pending, named, seen } = titling(options);\n const { frozen, refresh, touch, off } = listing(\n harness,\n agents,\n options.title ? seen : undefined\n );\n const conversationOf = async (agentId: string, context: Context) => {\n const conversation = await agents.conversation(agentId, context);\n if (!conversation) throw new Error(`There is no cone ${agentId}.`);\n return conversation;\n };\n const prepare = async (\n conversation: Conversation,\n entries: readonly EntryRecord[],\n cone: string,\n context: Context\n ) => {\n const tail = entries.at(-1)?.id ?? 0;\n await options.extract?.(conversation.id, tail, context, cone).catch(() => undefined);\n };\n const retitle = (\n id: string,\n model: string,\n entries: readonly EntryRecord[],\n context: Context\n ) => {\n if (!options.title) return;\n void named(entries, model, context)\n .then(async (title) => {\n if (!title) return;\n await agents.update((_tx, doc) => {\n const record = doc.frozen?.[id];\n if (record) record.title = title;\n }, context);\n })\n .catch(() => undefined);\n };\n const replacement = async (coneId: string, context: Context) => {\n const state = agents.state();\n const other = Object.keys(state.cones).find((id) => id !== coneId);\n if (other) return { id: other, conversation: undefined };\n const current = await conversationOf(coneId, context);\n const conversation = await harness.createConversation(\n {\n ownership: { kind: 'ownerless' },\n agent: { model: (await current.agent(context)).model },\n },\n context\n );\n return { id: `cone-${state.next}`, conversation };\n };\n const runtime: FreezerRuntime = {\n frozen,\n async freeze(agentId, context) {\n const cone = agents.state().cones[agentId];\n if (!cone) throw new Error(`There is no cone ${agentId}.`);\n const conversation = await conversationOf(agentId, context);\n const { entries, record } = await snapshot(\n conversation,\n cone.name,\n now(),\n context,\n cone.title\n );\n await prepare(conversation, entries, agentId, context);\n await conversation.abort(context, { background: true }).catch(() => undefined);\n const next =\n agents.state().active === agentId ? await replacement(agentId, context) : undefined;\n const { id, scoops } = await agents.update((_tx, doc) => {\n if (!doc.cones[agentId]) throw new Error(`There is no cone ${agentId}.`);\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n const owned = Object.entries(doc.scoops)\n .filter(([, scoop]) => scoop.cone === agentId && live(scoop))\n .map(([scoop]) => scoop);\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n doc.frozen ??= {};\n doc.frozen[frozenId] = { ...record, cone: agentId, scoops: owned };\n delete doc.cones[agentId];\n for (const scoop of owned) (doc.scoops[scoop] as { frozen?: string }).frozen = frozenId;\n if (next?.conversation) {\n doc.cones[next.id] = { name: record.name, conversation: next.conversation.id };\n doc.next += 1;\n }\n return { id: frozenId, scoops: owned };\n }, context);\n for (const scoop of scoops)\n await (await agents.conversation(scoop, context))?.abort(context).catch(() => undefined);\n if (next) await agents.selectCone(next.id, context);\n retitle(id, record.model, entries, context);\n return id;\n },\n async newChat(agentId, context) {\n const cone = agents.state().cones[agentId];\n const scoop = agents.state().scoops[agentId];\n if (!cone && scoop && live(scoop)) {\n pending.delete(agentId);\n await (await agents.conversation(agentId, context))?.reset(undefined, context);\n await agents.update((_tx, doc) => {\n const record = doc.scoops[agentId] as ScoopRecord;\n delete record.title;\n delete record.titled;\n }, context);\n return null;\n }\n if (!cone) throw new Error(`There is no cone ${agentId}.`);\n const conversation = await conversationOf(agentId, context);\n const before = (await conversation.context(context)).entries;\n const title = cone.title;\n if (!before.some((entry) => entry.kind === 'pi.user')) return null;\n const fresh = await freshLike(harness, conversation, context);\n await agents.setConversation(agentId, fresh, context);\n await conversation.abort(context).catch(() => undefined);\n const { entries, record } = await snapshot(conversation, cone.name, now(), context, title);\n await prepare(conversation, entries, agentId, context);\n const id = await agents.update((_tx, doc) => {\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n doc.frozen ??= {};\n doc.frozen[frozenId] = { ...record, cone: agentId, scoops: [] };\n return frozenId;\n }, context);\n retitle(id, record.model, entries, context);\n return id;\n },\n async thaw(id, context) {\n const state = agents.state();\n if (state.cones[id]) {\n await agents.selectCone(id, context);\n return id;\n }\n const scoop = state.scoops[id];\n if (scoop) return thawScoop({ ...options, now }, id, scoop, context);\n return thawFrozen(agents, id, context);\n },\n async discard(id, context) {\n const state = agents.state();\n const scoop = state.scoops[id];\n if (scoop) return removeScoop(options, id, scoop, context);\n const cone = state.cones[id];\n if (cone) throw new Error(`${cone.name} is live; delete the cone first.`);\n return discardFrozen(options, id, context);\n },\n refresh,\n touch,\n frozenTarget: (target) => frozenTarget(agents.state(), target),\n command: (argv, _caller, context) => command(options, runtime, argv, context),\n close: () => off(),\n };\n return runtime;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type {\n Conversation,\n ConversationId,\n EntryRecord,\n Harness,\n} from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { answerText } from '../agent.ts';\nimport {\n type Agents,\n type AgentsState,\n type ConeRecord,\n type FrozenRecord,\n live,\n type ScoopRecord,\n} from '../agents.ts';\nimport { HOME } from '../kernel/env.ts';\nimport { type Layout, LEGACY } from '../layout.ts';\nimport type { LickTarget } from '../licks/lick.ts';\nimport { pinned } from '../secrets/extension.ts';\nimport { cleanTitle, TITLE_TURNS, titleDue } from '../titles/extension.ts';\nimport { scrubTranscript } from '../titles/generate.ts';\n\nexport type Answer = { code: number; out: string };\n\nexport type ConversationKind = 'cone' | 'scoop' | 'agent';\n\nexport interface FrozenCone {\n id: string;\n name: string;\n title: string;\n model: string;\n messages: number;\n frozenAt: number;\n kind: ConversationKind;\n live: boolean;\n thawedAs: string | null;\n}\n\nexport const THAWED_KIND = 'slicc.thawed';\n\nexport type Frozen = { id: string; name: string; at: number };\n\nexport interface FreezerAttach {\n harness: Harness;\n agents: Agents;\n env: Pick<ExecutionEnv, 'remove' | 'exists'>;\n title?: (transcript: string, model: string, context: Context) => Promise<string | undefined>;\n extract?: (\n conversation: number,\n tail: number,\n context: Context,\n cone: string\n ) => Promise<unknown>;\n cancelTitle?: (agentId: string) => void;\n now?: () => number;\n layout?: Layout;\n}\n\nexport interface FreezerRuntime {\n readonly frozen: ReplicatedState<FrozenCone[]>;\n freeze(agentId: string, context: Context): Promise<string>;\n newChat(agentId: string, context: Context): Promise<string | null>;\n thaw(id: string, context: Context): Promise<string>;\n discard(id: string, context: Context): Promise<void>;\n refresh(): Promise<readonly FrozenCone[]>;\n touch(): void;\n frozenTarget(target: LickTarget): Frozen | undefined;\n command(argv: readonly string[], caller: string | null, context: Context): Promise<Answer>;\n close(): void;\n}\n\nexport const USAGE = `usage:\n freezer list every conversation: id, kind, name, title, messages, when\n freezer show <id> a conversation as Markdown\n freezer thaw <id> continue a stopped conversation as a cone\n\nDelete a cone, or start a new conversation, from the chat toolbar or the command palette.\n`;\n\nconst TITLE_LENGTH = 60;\nexport const TOUCH_MS = 500;\n\nfunction textOf(entry: EntryRecord): string {\n return answerText(entry.model?.[0]?.content).trim();\n}\n\nexport function modelName(model: { provider: string; modelId: string } | undefined): string {\n return model ? `${model.provider}/${model.modelId}` : '';\n}\n\nexport function firstLine(entries: readonly EntryRecord[]): string {\n const first = entries.find((entry) => entry.kind === 'pi.user' && textOf(entry));\n const line = first ? (textOf(first).split('\\n')[0] as string).trim() : '';\n if (!line) return 'Untitled chat';\n return line.length > TITLE_LENGTH ? `${line.slice(0, TITLE_LENGTH - 1)}\u2026` : line;\n}\n\nfunction calls(entry: EntryRecord): string[] {\n const content = entry.model?.[0]?.content;\n if (!Array.isArray(content)) return [];\n return (content as { type: string; name?: string; arguments?: unknown }[])\n .filter((part) => part.type === 'toolCall')\n .map((part) => `- \\`${part.name}\\` ${JSON.stringify(part.arguments ?? {})}`);\n}\n\nexport function markdown(\n record: Pick<FrozenRecord, 'title' | 'name' | 'model' | 'frozenAt'>,\n entries: readonly EntryRecord[]\n): string {\n const out = [\n `# ${record.title}`,\n '',\n `${record.name} \u00B7 ${record.model} \u00B7 ${new Date(record.frozenAt).toISOString()}`,\n ];\n for (const entry of entries) {\n if (entry.kind === 'pi.user' && textOf(entry)) out.push('', '## User', '', textOf(entry));\n if (entry.kind !== 'pi.assistant') continue;\n const text = textOf(entry);\n const tools = calls(entry);\n if (!text && !tools.length) continue;\n out.push('', '## Assistant', '');\n if (text) out.push(text);\n if (tools.length) out.push(...(text ? [''] : []), ...tools);\n }\n return `${out.join('\\n')}\\n`;\n}\n\ntype Stats = Pick<FrozenCone, 'title' | 'model' | 'messages' | 'frozenAt'>;\n\nfunction counted(entries: readonly EntryRecord[]): number {\n return entries.filter((entry) => entry.kind === 'pi.user' || entry.kind === 'pi.assistant')\n .length;\n}\n\nfunction lastAt(entries: readonly EntryRecord[]): number {\n let at = 0;\n for (const entry of entries)\n for (const message of entry.model ?? []) {\n const stamp = (message as { timestamp?: unknown }).timestamp;\n if (typeof stamp === 'number' && stamp > at) at = stamp;\n }\n return at;\n}\n\ntype Inspected = { stats: Stats; entries: readonly EntryRecord[] };\n\nasync function inspect(harness: Harness, id: number, context: Context): Promise<Inspected> {\n const conversation = await harness.conversation(id as ConversationId, context);\n if (!conversation)\n return { stats: { title: firstLine([]), model: '', messages: 0, frozenAt: 0 }, entries: [] };\n const view = await conversation.context(context);\n const agent = await conversation.agent(context);\n return {\n stats: {\n title: firstLine(view.entries),\n model: modelName(agent.model),\n messages: counted(view.entries),\n frozenAt: lastAt(view.entries),\n },\n entries: view.entries,\n };\n}\n\ntype Titled = Pick<ConeRecord, 'conversation' | 'title' | 'titled'>;\n\ntype Seen = (id: string, record: Titled, entries: readonly EntryRecord[], model: string) => void;\n\nconst kindOf = (scoop: ScoopRecord): ConversationKind =>\n scoop.kind === 'sync' ? 'agent' : 'scoop';\n\nasync function rows(\n harness: Harness,\n state: Readonly<AgentsState>,\n cache: Map<number, Stats>,\n context: Context,\n seen?: Seen\n): Promise<FrozenCone[]> {\n const stopped = async (conversation: number) => {\n const cached = cache.get(conversation);\n if (cached) return cached;\n const found = (await inspect(harness, conversation, context)).stats;\n cache.set(conversation, found);\n return found;\n };\n const ended = async (id: string, record: Titled) => {\n const stats = await stopped(record.conversation);\n if (seen && (record.titled ?? 0) < (TITLE_TURNS.at(-1) as number)) {\n const { entries } = await inspect(harness, record.conversation, context);\n seen(id, record, entries, stats.model);\n }\n return { ...stats, ...(record.title ? { title: record.title } : {}) };\n };\n const running = async (record: Titled) => {\n const { stats } = await inspect(harness, record.conversation, context);\n return { ...stats, ...(record.title ? { title: record.title } : {}) };\n };\n const out: FrozenCone[] = [];\n for (const [id, cone] of Object.entries(state.cones))\n out.push({\n id,\n name: cone.name,\n ...(await running(cone)),\n kind: 'cone',\n live: true,\n thawedAs: null,\n });\n for (const [id, record] of Object.entries(state.frozen ?? {}))\n out.push({\n id,\n name: record.name,\n title: record.title,\n model: record.model,\n messages: record.messages,\n frozenAt: record.frozenAt,\n kind: 'cone',\n live: false,\n thawedAs: null,\n });\n for (const [id, scoop] of Object.entries(state.scoops)) {\n if (scoop.removed) continue;\n const on = live(scoop);\n out.push({\n id,\n name: scoop.name,\n ...(on ? await running(scoop) : await ended(id, scoop)),\n kind: kindOf(scoop),\n live: on,\n thawedAs: scoop.thawedAs ?? null,\n });\n }\n return out.sort((a, b) => Number(b.live) - Number(a.live) || b.frozenAt - a.frozenAt);\n}\n\nexport function thawedNote(\n kind: ConversationKind,\n name: string,\n folder: string,\n kept: boolean,\n home = HOME\n): string {\n const what = kind === 'agent' ? 'agent run' : kind;\n const place = kept\n ? `Its workspace ${folder} is still there.`\n : `Its workspace ${folder} was deleted when it stopped.`;\n return `This was ${what} ${name}'s conversation, thawed as a cone. ${place} You now work in ${home} as a cone, with a cone's tools.`;\n}\n\ntype Snapshot = { entries: readonly EntryRecord[]; record: Omit<FrozenRecord, 'scoops' | 'cone'> };\n\nasync function snapshot(\n conversation: Conversation,\n name: string,\n now: number,\n context: Context,\n title?: string\n): Promise<Snapshot> {\n const view = await conversation.context(context);\n const agent = await conversation.agent(context);\n return {\n entries: view.entries,\n record: {\n name,\n conversation: conversation.id,\n title: title ?? firstLine(view.entries),\n model: modelName(agent.model),\n messages: counted(view.entries),\n frozenAt: now,\n },\n };\n}\n\nexport function frozenTarget(state: Readonly<AgentsState>, target: LickTarget): Frozen | undefined {\n const records = Object.entries(state.frozen ?? {});\n if (target.startsWith('cone:')) {\n const cone = target.slice('cone:'.length);\n if (state.cones[cone]) return undefined;\n const found = records\n .filter(([, record]) => record.cone === cone)\n .sort(([, a], [, b]) => b.frozenAt - a.frozenAt)[0];\n return found ? { id: found[0], name: found[1].name, at: found[1].frozenAt } : undefined;\n }\n const owner = state.scoops[target]?.frozen;\n const record = owner ? state.frozen?.[owner] : undefined;\n return owner && record ? { id: owner, name: record.name, at: record.frozenAt } : undefined;\n}\n\nasync function command(\n options: FreezerAttach,\n runtime: FreezerRuntime,\n argv: readonly string[],\n context: Context\n): Promise<Answer> {\n const verb = argv[0] ?? 'help';\n const listed = await runtime.refresh();\n if (verb === 'list') {\n const lines = listed.map(\n (item) =>\n `${item.id}\\t${item.kind}${item.live ? ' (live)' : ''}\\t${item.name}\\t${item.title}\\t${item.messages} messages\\t${new Date(item.frozenAt).toISOString()}`\n );\n return { code: 0, out: lines.length ? `${lines.join('\\n')}\\n` : 'no conversations\\n' };\n }\n if (verb !== 'show' && verb !== 'thaw')\n return { code: verb === 'help' || verb === '--help' ? 0 : 2, out: USAGE };\n const id = argv[1] ?? '';\n const item = listed.find((row) => row.id === id);\n if (!item) return { code: 1, out: `freezer: there is no conversation ${id}\\n` };\n if (verb === 'thaw') {\n if (item.live) return { code: 1, out: `freezer: ${item.name} is live; it needs no thawing\\n` };\n return { code: 0, out: `thawed ${id} as ${await runtime.thaw(id, context)}\\n` };\n }\n const state = options.agents.state();\n const conversationId =\n state.frozen?.[id]?.conversation ??\n state.cones[id]?.conversation ??\n state.scoops[id]?.conversation;\n const conversation = await options.harness.conversation(\n conversationId as ConversationId,\n context\n );\n const entries = conversation ? (await conversation.context(context)).entries : [];\n return { code: 0, out: markdown(item, entries) };\n}\n\nasync function freshLike(\n harness: Harness,\n conversation: Conversation,\n context: Context\n): Promise<Conversation> {\n const agent = await conversation.agent(context);\n return harness.createConversation(\n {\n ownership: { kind: 'ownerless' },\n agent: pinned({\n model: agent.model,\n thinkingLevel: agent.thinkingLevel,\n extensions: agent.extensions,\n tools: agent.tools,\n instructions: agent.instructions ?? null,\n cwd: agent.cwd ?? null,\n }),\n },\n context\n );\n}\n\nasync function activeCone(agents: Agents, context: Context): Promise<Conversation> {\n const conversation = await agents.conversation(agents.state().active, context);\n if (!conversation) throw new Error('There is no active cone.');\n return conversation;\n}\n\nasync function thawScoop(\n options: FreezerAttach & { now: () => number },\n id: string,\n scoop: ScoopRecord,\n context: Context\n): Promise<string> {\n const { harness, agents, env, now } = options;\n const layout = options.layout ?? LEGACY;\n if (scoop.removed) throw new Error(`There is no conversation ${id}.`);\n if (live(scoop)) throw new Error(`${scoop.name} is still running; open it instead.`);\n const conversation = await harness.conversation(scoop.conversation as ConversationId, context);\n if (!conversation) throw new Error(`There is no conversation ${id}.`);\n const last = (await conversation.context(context)).entries.at(-1);\n const agent = await conversation.agent(context);\n const cone = await (await activeCone(agents, context)).agent(context);\n const created = {\n ownership: { kind: 'ownerless' as const },\n agent: pinned({\n model: agent.model as NonNullable<typeof agent.model>,\n thinkingLevel: agent.thinkingLevel,\n extensions: cone.extensions,\n tools: cone.tools,\n instructions: cone.instructions ?? null,\n ...(layout.users ? {} : { cwd: HOME }),\n }),\n };\n const fork = last\n ? await conversation.fork(last.id, created, context)\n : await harness.createConversation(created, context);\n const folder = layout.workspace(scoop.folder);\n const exists = await env.exists(folder, context);\n const kept = exists.ok && exists.value;\n await fork.submit(\n {\n type: 'write',\n entry: {\n kind: THAWED_KIND,\n data: { scoop: id, name: scoop.name, kind: kindOf(scoop), workspace: folder, kept },\n model: [\n {\n role: 'user',\n content: thawedNote(\n kindOf(scoop),\n scoop.name,\n folder,\n kept,\n layout.users ? 'your own home' : HOME\n ),\n timestamp: now(),\n },\n ],\n },\n },\n context\n );\n const coneId = await agents.update((_tx, doc) => {\n const target = `cone-${doc.next}`;\n doc.next += 1;\n doc.cones[target] = {\n name: scoop.name,\n conversation: fork.id,\n ...(scoop.title ? { title: scoop.title, titled: scoop.titled as number } : {}),\n };\n (doc.scoops[id] as ScoopRecord).thawedAs = target;\n return target;\n }, context);\n await agents.selectCone(coneId, context);\n return coneId;\n}\n\nasync function removeScoop(\n options: FreezerAttach,\n id: string,\n scoop: ScoopRecord,\n context: Context\n): Promise<void> {\n const { agents, env } = options;\n if (live(scoop)) throw new Error(`${scoop.name} is still running; stop it first.`);\n await agents.update((_tx, doc) => {\n const entry = doc.scoops[id] as ScoopRecord;\n entry.removed = true;\n entry.gone = true;\n delete entry.frozen;\n }, context);\n await env.remove(\n (options.layout ?? LEGACY).scoopRoot(scoop.folder),\n {\n recursive: true,\n force: true,\n },\n context\n );\n}\n\nfunction listing(harness: Harness, agents: Agents, seen: Seen | undefined) {\n const frozen = replicatedState<FrozenCone[]>([]);\n const cache = new Map<number, Stats>();\n let lock: Promise<readonly FrozenCone[]> = Promise.resolve([]);\n const refresh = () => {\n lock = lock\n .catch(() => [])\n .then(async () => {\n const listed = await rows(harness, agents.state(), cache, BACKGROUND_CONTEXT, seen);\n frozen.replace(BACKGROUND_CONTEXT, listed);\n return listed;\n });\n return lock;\n };\n const quiet = () => void refresh().catch(() => undefined);\n quiet();\n const stop = agents.onChange(quiet);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const touch = () => {\n clearTimeout(timer);\n timer = setTimeout(quiet, TOUCH_MS);\n };\n const off = () => {\n clearTimeout(timer);\n stop();\n };\n return { frozen, refresh, touch, off };\n}\n\nasync function thawFrozen(agents: Agents, id: string, context: Context): Promise<string> {\n const coneId = await agents.update((_tx, doc) => {\n const record = doc.frozen?.[id];\n if (!record) throw new Error(`There is no frozen chat ${id}.`);\n const reuse = !doc.cones[record.cone];\n const target = reuse ? record.cone : `cone-${doc.next}`;\n if (!reuse) doc.next += 1;\n doc.cones[target] = {\n name: record.name,\n conversation: record.conversation,\n title: record.title,\n titled: TITLE_TURNS.at(-1) as number,\n };\n for (const scoop of record.scoops) {\n const entry = doc.scoops[scoop];\n if (!entry) continue;\n delete entry.frozen;\n entry.cone = target;\n }\n delete doc.frozen?.[id];\n return target;\n }, context);\n await agents.selectCone(coneId, context);\n return coneId;\n}\n\nasync function discardFrozen(options: FreezerAttach, id: string, context: Context) {\n const { agents, env } = options;\n const record = agents.state().frozen?.[id];\n if (!record) throw new Error(`There is no frozen chat ${id}.`);\n const folders = record.scoops\n .map((scoop) => agents.state().scoops[scoop]?.folder)\n .filter((folder): folder is string => Boolean(folder));\n await agents.update((_tx, doc) => {\n for (const scoop of record.scoops) {\n const entry = doc.scoops[scoop];\n if (!entry) continue;\n delete entry.frozen;\n entry.gone = true;\n }\n delete doc.frozen?.[id];\n }, context);\n for (const folder of folders)\n await env.remove(\n (options.layout ?? LEGACY).scoopRoot(folder),\n {\n recursive: true,\n force: true,\n },\n context\n );\n}\n\nfunction titling(options: FreezerAttach) {\n const { agents } = options;\n const pending = new Set<string>();\n const last = TITLE_TURNS.at(-1) as number;\n const named = (entries: readonly EntryRecord[], model: string, context: Context) =>\n scrubTranscript(entries)\n .then((transcript) =>\n (options.title as NonNullable<FreezerAttach['title']>)(transcript, model, context)\n )\n .then(cleanTitle)\n .catch(() => undefined);\n const write = (id: string, titled: Titled, title: string | undefined) =>\n agents\n .update((_tx, doc) => {\n const record = doc.scoops[id];\n if (record?.conversation !== titled.conversation || (record.titled ?? 0) >= last) return;\n record.titled = last;\n if (title) record.title = title;\n }, BACKGROUND_CONTEXT)\n .catch(() => undefined);\n const seen: Seen = (id, seenAs, entries, model) => {\n const titled = agents.state().scoops[id];\n if (titled?.conversation !== seenAs.conversation || pending.has(id)) return;\n if (titleDue(titled, entries, true) === undefined) {\n void write(id, titled, undefined);\n return;\n }\n pending.add(id);\n void named(entries, model, BACKGROUND_CONTEXT)\n .then((title) => write(id, titled, title))\n .finally(() => pending.delete(id));\n };\n return { named, seen };\n}\n\nexport function attachFreezer(options: FreezerAttach): FreezerRuntime {\n const { harness, agents } = options;\n const now = options.now ?? Date.now;\n const { named, seen } = titling(options);\n const { frozen, refresh, touch, off } = listing(\n harness,\n agents,\n options.title ? seen : undefined\n );\n const conversationOf = async (agentId: string, context: Context) => {\n const conversation = await agents.conversation(agentId, context);\n if (!conversation) throw new Error(`There is no cone ${agentId}.`);\n return conversation;\n };\n const prepare = async (\n conversation: Conversation,\n entries: readonly EntryRecord[],\n cone: string,\n context: Context\n ) => {\n const tail = entries.at(-1)?.id ?? 0;\n await options.extract?.(conversation.id, tail, context, cone).catch(() => undefined);\n };\n const retitle = (\n id: string,\n model: string,\n entries: readonly EntryRecord[],\n context: Context\n ) => {\n if (!options.title) return;\n void named(entries, model, context)\n .then(async (title) => {\n if (!title) return;\n await agents.update((_tx, doc) => {\n const record = doc.frozen?.[id];\n if (record) record.title = title;\n }, context);\n })\n .catch(() => undefined);\n };\n const replacement = async (coneId: string, context: Context) => {\n const state = agents.state();\n const other = Object.keys(state.cones).find((id) => id !== coneId);\n if (other) return { id: other, conversation: undefined };\n const current = await conversationOf(coneId, context);\n const conversation = await harness.createConversation(\n {\n ownership: { kind: 'ownerless' },\n agent: { model: (await current.agent(context)).model },\n },\n context\n );\n return { id: `cone-${state.next}`, conversation };\n };\n const runtime: FreezerRuntime = {\n frozen,\n async freeze(agentId, context) {\n const cone = agents.state().cones[agentId];\n if (!cone) throw new Error(`There is no cone ${agentId}.`);\n const conversation = await conversationOf(agentId, context);\n const { entries, record } = await snapshot(\n conversation,\n cone.name,\n now(),\n context,\n cone.title\n );\n await prepare(conversation, entries, agentId, context);\n await conversation.abort(context, { background: true }).catch(() => undefined);\n const next =\n agents.state().active === agentId ? await replacement(agentId, context) : undefined;\n const { id, scoops } = await agents.update((_tx, doc) => {\n if (!doc.cones[agentId]) throw new Error(`There is no cone ${agentId}.`);\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n const owned = Object.entries(doc.scoops)\n .filter(([, scoop]) => scoop.cone === agentId && live(scoop))\n .map(([scoop]) => scoop);\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n doc.frozen ??= {};\n doc.frozen[frozenId] = { ...record, cone: agentId, scoops: owned };\n delete doc.cones[agentId];\n for (const scoop of owned) (doc.scoops[scoop] as { frozen?: string }).frozen = frozenId;\n if (next?.conversation) {\n doc.cones[next.id] = { name: record.name, conversation: next.conversation.id };\n doc.next += 1;\n }\n return { id: frozenId, scoops: owned };\n }, context);\n for (const scoop of scoops)\n await (await agents.conversation(scoop, context))?.abort(context).catch(() => undefined);\n if (next) await agents.selectCone(next.id, context);\n retitle(id, record.model, entries, context);\n return id;\n },\n async newChat(agentId, context) {\n const cone = agents.state().cones[agentId];\n const scoop = agents.state().scoops[agentId];\n if (!cone && scoop && live(scoop)) {\n options.cancelTitle?.(agentId);\n await (await agents.conversation(agentId, context))?.reset(undefined, context);\n await agents.update((_tx, doc) => {\n const record = doc.scoops[agentId] as ScoopRecord;\n delete record.title;\n delete record.titled;\n }, context);\n return null;\n }\n if (!cone) throw new Error(`There is no cone ${agentId}.`);\n const conversation = await conversationOf(agentId, context);\n const before = (await conversation.context(context)).entries;\n const title = cone.title;\n if (!before.some((entry) => entry.kind === 'pi.user')) return null;\n const fresh = await freshLike(harness, conversation, context);\n await agents.setConversation(agentId, fresh, context);\n await conversation.abort(context).catch(() => undefined);\n const { entries, record } = await snapshot(conversation, cone.name, now(), context, title);\n await prepare(conversation, entries, agentId, context);\n const id = await agents.update((_tx, doc) => {\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n doc.frozen ??= {};\n doc.frozen[frozenId] = { ...record, cone: agentId, scoops: [] };\n return frozenId;\n }, context);\n retitle(id, record.model, entries, context);\n return id;\n },\n async thaw(id, context) {\n const state = agents.state();\n if (state.cones[id]) {\n await agents.selectCone(id, context);\n return id;\n }\n const scoop = state.scoops[id];\n if (scoop) return thawScoop({ ...options, now }, id, scoop, context);\n return thawFrozen(agents, id, context);\n },\n async discard(id, context) {\n const state = agents.state();\n const scoop = state.scoops[id];\n if (scoop) return removeScoop(options, id, scoop, context);\n const cone = state.cones[id];\n if (cone) throw new Error(`${cone.name} is live; delete the cone first.`);\n return discardFrozen(options, id, context);\n },\n refresh,\n touch,\n frozenTarget: (target) => frozenTarget(agents.state(), target),\n command: (argv, _caller, context) => command(options, runtime, argv, context),\n close: () => off(),\n };\n return runtime;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["record", "item"]
7
7
  }
package/dist/host.js CHANGED
@@ -108,6 +108,7 @@ const idleVault = replicatedState({
108
108
  locked: "no",
109
109
  held: 0
110
110
  });
111
+ const noRevision = () => replicatedState({ revision: 0 });
111
112
  async function hostAgent(agent, options = {}) {
112
113
  const context = options.context ?? BACKGROUND_CONTEXT;
113
114
  const serverId = options.serverId ?? crypto.randomUUID();
@@ -171,6 +172,7 @@ async function hostAgent(agent, options = {}) {
171
172
  agents: mounted.agents,
172
173
  views: mounted.views,
173
174
  commands: options.skills?.commands ?? replicatedState([]),
175
+ privateRevision: options.skills?.privateRevision ?? noRevision(),
174
176
  sprinkles: options.sprinkles?.sprinkles ?? replicatedState([]),
175
177
  memories: options.memory?.memories ?? replicatedState([]),
176
178
  memoryScopes: options.memory?.scopes ?? replicatedState([]),
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 createRemoteServiceEndpoint,\n RemoteServiceProvider,\n type ReplicatedState,\n replicatedState,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport {\n type RoutedServerServiceHost,\n type RoutedSessionAttachment,\n type RoutedSessionHandle,\n Server,\n type ServerHost,\n SessionNotFoundError,\n} from '@earendil-works/pi-server';\nimport type { Agent } from './agent.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 type { UserClients } from './kernel/users.ts';\nimport { PortListener } from './listener.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 { viewControl, viewPages, viewRemote, viewSettings } from './readonly.ts';\nimport { createRemote } from './remote/host.ts';\nimport { type AgentPages, createPages, ownedPages, type Pages } from './remote/pages.ts';\nimport type { SecretName } from './secrets/names.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport {\n AGENT_SESSION,\n AgentControl,\n AgentPagesService,\n AgentRemoteService,\n AgentSessions,\n AgentSettings,\n AgentTranscript,\n type Command,\n} from './services.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 { Uploads } from './uploads.ts';\nimport { agentViews } from './views.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport interface ConnectOptions {\n readOnly?: boolean;\n pages?: boolean;\n}\n\nexport interface AgentHost {\n readonly serverId: string;\n readonly agent: Agent;\n readonly users?: UserClients;\n readonly pages: Pages;\n connect(endpoint: PortEndpoint, options?: ConnectOptions): void;\n close(): Promise<void>;\n}\n\nfunction endpointFor(provider: RemoteServiceProvider): RoutedSessionAttachment {\n const endpoint = createRemoteServiceEndpoint(provider);\n return {\n invokeService: (call, publish, context) =>\n endpoint.invoke(call, (id, update) => publish(id, update, context), context),\n release: () => endpoint.dispose(),\n };\n}\n\ntype Attached = { provider: RemoteServiceProvider; release(): void };\n\nfunction sessionServices(attach: () => Attached): RoutedSessionHandle {\n return {\n attachClient() {\n const attached = attach();\n const endpoint = endpointFor(attached.provider);\n return {\n invokeService: endpoint.invokeService,\n release(context) {\n endpoint.release(context);\n attached.release();\n },\n };\n },\n close: async () => {},\n };\n}\n\nfunction serverServices(): RoutedServerServiceHost {\n return {\n attachClient(presentation) {\n const provider = new RemoteServiceProvider([{ service: AgentSessions, mode: 'singleton' }]);\n provider.provide(AgentSessions, {\n attach: (sessionId, context) => presentation.attachSession(sessionId, context),\n detach: (context) => presentation.detachSession(context),\n });\n const attachment = endpointFor(provider);\n return {\n invokeService: attachment.invokeService,\n release(context) {\n attachment.release(context);\n provider.dispose();\n },\n };\n },\n };\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};\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\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 } = {}\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 catalogue = () =>\n new RemoteServiceProvider([\n { service: AgentControl, mode: 'singleton' },\n { service: AgentTranscript, mode: 'singleton' },\n { service: AgentSettings, mode: 'singleton' },\n { service: AgentRemoteService, mode: 'singleton' },\n { service: AgentPagesService, mode: 'singleton' },\n ]);\n const pages = options.pages ?? createPages();\n const deliveries = trackDeliveries(agent.harness, state, 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 control = 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 );\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 transcriptService = {\n state,\n deliveries: deliveries.state,\n agents: mounted.agents,\n views: mounted.views,\n commands: options.skills?.commands ?? replicatedState<Command[]>([]),\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 };\n const settings = options.settings ?? noSettings;\n const visible = (entry: number) =>\n [state.value, ...Object.values(mounted.views.value)].some((view) =>\n view.entries.some((item) => item.id === entry)\n );\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(slims.shown) };\n const viewed: AgentControl = { ...control, image: gated(visible) };\n const served = (served: AgentPages) => {\n const made = catalogue();\n made.provide(AgentControl, trusted);\n made.provide(AgentTranscript, transcriptService);\n made.provide(AgentSettings, settings);\n made.provide(AgentRemoteService, remote);\n made.provide(AgentPagesService, served);\n return made;\n };\n const owned = (): Attached => {\n const mine = ownedPages(pages);\n const made = served(mine);\n return {\n provider: made,\n release() {\n made.dispose();\n mine.release();\n },\n };\n };\n const follower = served(viewPages());\n const viewer = catalogue();\n viewer.provide(AgentControl, viewControl(viewed));\n viewer.provide(AgentTranscript, { ...transcriptService, monitor: monitor.viewState });\n viewer.provide(AgentSettings, viewSettings(settings));\n viewer.provide(AgentRemoteService, viewRemote(remote));\n viewer.provide(AgentPagesService, viewPages());\n const shared = (services: RemoteServiceProvider) => () => ({\n provider: services,\n release: () => undefined,\n });\n const serve = async (id: string, attach: () => Attached) => {\n const host: ServerHost = {\n serverServices: serverServices(),\n async resolveSession(sessionId) {\n if (sessionId !== AGENT_SESSION)\n throw new SessionNotFoundError(`unknown session ${sessionId}`);\n return { id: sessionId };\n },\n openSession: async () => sessionServices(attach),\n };\n const listener = new PortListener(id);\n const server = await new Server(host, { serverId: id, listeners: [listener] }).start();\n return { listener, server };\n };\n const full = await serve(serverId, owned);\n const view = await serve(crypto.randomUUID(), shared(viewer));\n const linked = await serve(crypto.randomUUID(), shared(follower));\n return {\n serverId,\n agent,\n pages,\n ...(options.users ? { users: options.users } : {}),\n connect(endpoint, connectOptions) {\n const chosen = connectOptions?.readOnly\n ? view\n : connectOptions?.pages === false\n ? linked\n : full;\n chosen.listener.connect(endpoint);\n },\n async close() {\n await full.server.close();\n await view.server.close();\n await linked.server.close();\n viewer.dispose();\n follower.dispose();\n await pages.dispose();\n await monitor.dispose();\n await remote.dispose();\n deliveries.dispose();\n transcript.dispose();\n mounted.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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type Context,\n createRemoteServiceEndpoint,\n RemoteServiceProvider,\n type ReplicatedState,\n replicatedState,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport {\n type RoutedServerServiceHost,\n type RoutedSessionAttachment,\n type RoutedSessionHandle,\n Server,\n type ServerHost,\n SessionNotFoundError,\n} from '@earendil-works/pi-server';\nimport type { Agent } from './agent.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 type { UserClients } from './kernel/users.ts';\nimport { PortListener } from './listener.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 { viewControl, viewPages, viewRemote, viewSettings } from './readonly.ts';\nimport { createRemote } from './remote/host.ts';\nimport { type AgentPages, createPages, ownedPages, type Pages } from './remote/pages.ts';\nimport type { SecretName } from './secrets/names.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport {\n AGENT_SESSION,\n AgentControl,\n AgentPagesService,\n AgentRemoteService,\n AgentSessions,\n AgentSettings,\n AgentTranscript,\n type Command,\n type PrivateRevision,\n} from './services.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 { Uploads } from './uploads.ts';\nimport { agentViews } from './views.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport interface ConnectOptions {\n readOnly?: boolean;\n pages?: boolean;\n}\n\nexport interface AgentHost {\n readonly serverId: string;\n readonly agent: Agent;\n readonly users?: UserClients;\n readonly pages: Pages;\n connect(endpoint: PortEndpoint, options?: ConnectOptions): void;\n close(): Promise<void>;\n}\n\nfunction endpointFor(provider: RemoteServiceProvider): RoutedSessionAttachment {\n const endpoint = createRemoteServiceEndpoint(provider);\n return {\n invokeService: (call, publish, context) =>\n endpoint.invoke(call, (id, update) => publish(id, update, context), context),\n release: () => endpoint.dispose(),\n };\n}\n\ntype Attached = { provider: RemoteServiceProvider; release(): void };\n\nfunction sessionServices(attach: () => Attached): RoutedSessionHandle {\n return {\n attachClient() {\n const attached = attach();\n const endpoint = endpointFor(attached.provider);\n return {\n invokeService: endpoint.invokeService,\n release(context) {\n endpoint.release(context);\n attached.release();\n },\n };\n },\n close: async () => {},\n };\n}\n\nfunction serverServices(): RoutedServerServiceHost {\n return {\n attachClient(presentation) {\n const provider = new RemoteServiceProvider([{ service: AgentSessions, mode: 'singleton' }]);\n provider.provide(AgentSessions, {\n attach: (sessionId, context) => presentation.attachSession(sessionId, context),\n detach: (context) => presentation.detachSession(context),\n });\n const attachment = endpointFor(provider);\n return {\n invokeService: attachment.invokeService,\n release(context) {\n attachment.release(context);\n provider.dispose();\n },\n };\n },\n };\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};\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\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 } = {}\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 catalogue = () =>\n new RemoteServiceProvider([\n { service: AgentControl, mode: 'singleton' },\n { service: AgentTranscript, mode: 'singleton' },\n { service: AgentSettings, mode: 'singleton' },\n { service: AgentRemoteService, mode: 'singleton' },\n { service: AgentPagesService, mode: 'singleton' },\n ]);\n const pages = options.pages ?? createPages();\n const deliveries = trackDeliveries(agent.harness, state, 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 control = 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 );\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 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 };\n const settings = options.settings ?? noSettings;\n const visible = (entry: number) =>\n [state.value, ...Object.values(mounted.views.value)].some((view) =>\n view.entries.some((item) => item.id === entry)\n );\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(slims.shown) };\n const viewed: AgentControl = { ...control, image: gated(visible) };\n const served = (served: AgentPages) => {\n const made = catalogue();\n made.provide(AgentControl, trusted);\n made.provide(AgentTranscript, transcriptService);\n made.provide(AgentSettings, settings);\n made.provide(AgentRemoteService, remote);\n made.provide(AgentPagesService, served);\n return made;\n };\n const owned = (): Attached => {\n const mine = ownedPages(pages);\n const made = served(mine);\n return {\n provider: made,\n release() {\n made.dispose();\n mine.release();\n },\n };\n };\n const follower = served(viewPages());\n const viewer = catalogue();\n viewer.provide(AgentControl, viewControl(viewed));\n viewer.provide(AgentTranscript, { ...transcriptService, monitor: monitor.viewState });\n viewer.provide(AgentSettings, viewSettings(settings));\n viewer.provide(AgentRemoteService, viewRemote(remote));\n viewer.provide(AgentPagesService, viewPages());\n const shared = (services: RemoteServiceProvider) => () => ({\n provider: services,\n release: () => undefined,\n });\n const serve = async (id: string, attach: () => Attached) => {\n const host: ServerHost = {\n serverServices: serverServices(),\n async resolveSession(sessionId) {\n if (sessionId !== AGENT_SESSION)\n throw new SessionNotFoundError(`unknown session ${sessionId}`);\n return { id: sessionId };\n },\n openSession: async () => sessionServices(attach),\n };\n const listener = new PortListener(id);\n const server = await new Server(host, { serverId: id, listeners: [listener] }).start();\n return { listener, server };\n };\n const full = await serve(serverId, owned);\n const view = await serve(crypto.randomUUID(), shared(viewer));\n const linked = await serve(crypto.randomUUID(), shared(follower));\n return {\n serverId,\n agent,\n pages,\n ...(options.users ? { users: options.users } : {}),\n connect(endpoint, connectOptions) {\n const chosen = connectOptions?.readOnly\n ? view\n : connectOptions?.pages === false\n ? linked\n : full;\n chosen.listener.connect(endpoint);\n },\n async close() {\n await full.server.close();\n await view.server.close();\n await linked.server.close();\n viewer.dispose();\n follower.dispose();\n await pages.dispose();\n await monitor.dispose();\n await remote.dispose();\n deliveries.dispose();\n transcript.dispose();\n mounted.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"],
5
+ "mappings": "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",
6
6
  "names": ["view", "served"]
7
7
  }
package/dist/index.js CHANGED
@@ -58,6 +58,9 @@ import {
58
58
  createSliccModels,
59
59
  DEFAULT_MODEL,
60
60
  DEFAULT_REGIONS,
61
+ PREFERRED_MODELS,
62
+ preferredModel,
63
+ resolveDefaultModel,
61
64
  sliccProviders,
62
65
  withDefaultRegions
63
66
  } from "./settings.js";
@@ -92,6 +95,7 @@ export {
92
95
  FILE_LIMIT,
93
96
  HOME,
94
97
  IMAGE_LIMIT,
98
+ PREFERRED_MODELS,
95
99
  PortChannel,
96
100
  PortListener,
97
101
  SESSION_HEADER,
@@ -123,6 +127,8 @@ export {
123
127
  openMemorySqliteStorage,
124
128
  openOpfsSqliteStorage,
125
129
  patchServerAccept,
130
+ preferredModel,
131
+ resolveDefaultModel,
126
132
  runAgentWorker,
127
133
  serveAdmin,
128
134
  serveConnections,
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["export {\n ADOBE,\n ADOBE_PROXY,\n type AdobeConfig,\n type AdobeModelInfo,\n adobeClassifiers,\n adobeConfig,\n adobeIdentity,\n adobeModel,\n adobeProvider,\n adobeUsage,\n type Budget,\n SESSION_HEADER,\n VERSION_HEADER,\n withAdobeIdentity,\n} from './adobe.ts';\nexport { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';\nexport {\n FILE_LIMIT,\n IMAGE_LIMIT,\n type SendAttachment,\n type ShownAttachment,\n splitUser,\n TOTAL_LIMIT,\n userParts,\n} from './attachments.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport { createAgentControl } from './control.ts';\nexport { type AgentHost, type ConnectOptions, hostAgent } from './host.ts';\nexport type {\n KernelClient,\n KernelFs,\n KernelProcess,\n KernelStat,\n SpawnOptions,\n} from './kernel/client.ts';\nexport { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nexport {\n adminOver,\n type KernelAdmin,\n type KernelGroup,\n type KernelGroups,\n type KernelUser,\n type KernelUsers,\n serveAdmin,\n type UserClient,\n type UserClients,\n type UserConnect,\n type UserSpec,\n userClients,\n} from './kernel/users.ts';\nexport { PortListener } from './listener.ts';\nexport {\n type AgentWorkerOptions,\n type AgentWorkerScope,\n type KernelAttach,\n runAgentWorker,\n} from './main.ts';\nexport {\n type Loopback,\n type Transport,\n type TransportResponse,\n transportFetch,\n} from './net.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n startAgent,\n} from './owner.ts';\nexport { applyPatches, patchServerAccept } from './patches.ts';\nexport { SliccPrompt, sliccPrompt } from './prompt.ts';\nexport {\n type AgentPages,\n createPages,\n type PageBatch,\n type PageCaller,\n type PageRequest,\n type PageResult,\n type Pages,\n type PagesOpened,\n type PageTab,\n} from './remote/pages.ts';\nexport {\n type AccountState,\n AGENT_SESSION,\n AgentControl,\n AgentPagesService,\n AgentSessions,\n AgentSettings,\n type AgentSettingsChange,\n AgentTranscript,\n type BudgetState,\n type ModelChoice,\n type OperationError,\n type PromptResult,\n type SendMode,\n type SendRequest,\n type SendResponse,\n type SettingsState,\n type SignIn,\n} from './services.ts';\nexport {\n BEDROCK,\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\n DEFAULT_REGIONS,\n sliccProviders,\n withDefaultRegions,\n} from './settings.ts';\nexport {\n AGENT_DIRECTORY,\n type OpfsSqliteOptions,\n openMemorySqliteStorage,\n openOpfsSqliteStorage,\n WasmSqliteDatabase,\n} from './sqlite.ts';\nexport { type SystemFacts, systemSection } from './system.ts';\nexport { UPLOADS, type Uploads, upload } from './uploads.ts';\nexport { PortChannel, type PortEndpoint, withUnrefTimers } from './wire.ts';\nexport {\n type KernelPorts,\n kernelPort,\n kernelPorts,\n serveConnections,\n type WorkerScope,\n} from './worker.ts';\n"],
5
- "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAwC,YAAY,iBAAiB;AACrE;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA+B,oBAAoB;AACnD,SAAS,0BAA0B;AACnC,SAA8C,iBAAiB;AAQ/D,SAAS,MAA6B,mBAAmB,sBAAsB;AAC/E;AAAA,EACE;AAAA,EAMA;AAAA,EAKA;AAAA,OACK;AACP,SAAS,oBAAoB;AAC7B;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAKA;AAAA,OACK;AACP,SAAS,cAAc,yBAAyB;AAChD,SAAS,aAAa,mBAAmB;AACzC;AAAA,EAEE;AAAA,OAQK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OAUK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA2B,qBAAqB;AAChD,SAAS,SAAuB,cAAc;AAC9C,SAAS,aAAgC,uBAAuB;AAChE;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
4
+ "sourcesContent": ["export {\n ADOBE,\n ADOBE_PROXY,\n type AdobeConfig,\n type AdobeModelInfo,\n adobeClassifiers,\n adobeConfig,\n adobeIdentity,\n adobeModel,\n adobeProvider,\n adobeUsage,\n type Budget,\n SESSION_HEADER,\n VERSION_HEADER,\n withAdobeIdentity,\n} from './adobe.ts';\nexport { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';\nexport {\n FILE_LIMIT,\n IMAGE_LIMIT,\n type SendAttachment,\n type ShownAttachment,\n splitUser,\n TOTAL_LIMIT,\n userParts,\n} from './attachments.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport { createAgentControl } from './control.ts';\nexport { type AgentHost, type ConnectOptions, hostAgent } from './host.ts';\nexport type {\n KernelClient,\n KernelFs,\n KernelProcess,\n KernelStat,\n SpawnOptions,\n} from './kernel/client.ts';\nexport { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nexport {\n adminOver,\n type KernelAdmin,\n type KernelGroup,\n type KernelGroups,\n type KernelUser,\n type KernelUsers,\n serveAdmin,\n type UserClient,\n type UserClients,\n type UserConnect,\n type UserSpec,\n userClients,\n} from './kernel/users.ts';\nexport { PortListener } from './listener.ts';\nexport {\n type AgentWorkerOptions,\n type AgentWorkerScope,\n type KernelAttach,\n runAgentWorker,\n} from './main.ts';\nexport {\n type Loopback,\n type Transport,\n type TransportResponse,\n transportFetch,\n} from './net.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n startAgent,\n} from './owner.ts';\nexport { applyPatches, patchServerAccept } from './patches.ts';\nexport { SliccPrompt, sliccPrompt } from './prompt.ts';\nexport {\n type AgentPages,\n createPages,\n type PageBatch,\n type PageCaller,\n type PageRequest,\n type PageResult,\n type Pages,\n type PagesOpened,\n type PageTab,\n} from './remote/pages.ts';\nexport {\n type AccountState,\n AGENT_SESSION,\n AgentControl,\n AgentPagesService,\n AgentSessions,\n AgentSettings,\n type AgentSettingsChange,\n AgentTranscript,\n type BudgetState,\n type ModelChoice,\n type OperationError,\n type PromptResult,\n type SendMode,\n type SendRequest,\n type SendResponse,\n type SettingsState,\n type SignIn,\n} from './services.ts';\nexport {\n BEDROCK,\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\n DEFAULT_REGIONS,\n PREFERRED_MODELS,\n preferredModel,\n resolveDefaultModel,\n sliccProviders,\n withDefaultRegions,\n} from './settings.ts';\nexport {\n AGENT_DIRECTORY,\n type OpfsSqliteOptions,\n openMemorySqliteStorage,\n openOpfsSqliteStorage,\n WasmSqliteDatabase,\n} from './sqlite.ts';\nexport { type SystemFacts, systemSection } from './system.ts';\nexport { UPLOADS, type Uploads, upload } from './uploads.ts';\nexport { PortChannel, type PortEndpoint, withUnrefTimers } from './wire.ts';\nexport {\n type KernelPorts,\n kernelPort,\n kernelPorts,\n serveConnections,\n type WorkerScope,\n} from './worker.ts';\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAwC,YAAY,iBAAiB;AACrE;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA+B,oBAAoB;AACnD,SAAS,0BAA0B;AACnC,SAA8C,iBAAiB;AAQ/D,SAAS,MAA6B,mBAAmB,sBAAsB;AAC/E;AAAA,EACE;AAAA,EAMA;AAAA,EAKA;AAAA,OACK;AACP,SAAS,oBAAoB;AAC7B;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAKA;AAAA,OACK;AACP,SAAS,cAAc,yBAAyB;AAChD,SAAS,aAAa,mBAAmB;AACzC;AAAA,EAEE;AAAA,OAQK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OAUK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA2B,qBAAqB;AAChD,SAAS,SAAuB,cAAc;AAC9C,SAAS,aAAgC,uBAAuB;AAChE;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
6
6
  "names": []
7
7
  }
@@ -81,6 +81,9 @@ function agentUsers(pool, client, root, agents) {
81
81
  enforced: mode === "enforce",
82
82
  people: {
83
83
  homes,
84
+ homeOfAgent(agentId) {
85
+ return accounts.home(agentId) ?? accounts.home(`${CONE_PREFIX}${agentId}`);
86
+ },
84
87
  homeOf(conversationId) {
85
88
  const agentId = accounts.agentOf(conversationId);
86
89
  return agentId ? accounts.home(agentId) : void 0;
@@ -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 { LickDir } from '../licks/sources.ts';\nimport type { Spools } from '../scoops/index.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 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 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 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 };\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 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 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 { LickDir } from '../licks/sources.ts';\nimport type { Spools } from '../scoops/index.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 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 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 };\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 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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",
6
6
  "names": ["root"]
7
7
  }
package/dist/main.js CHANGED
@@ -15,7 +15,6 @@ import {
15
15
  sandboxFactory
16
16
  } from "./codemode/index.js";
17
17
  import { attachFreezer } from "./freezer/index.js";
18
- import { settingsText, titler } from "./freezer/title.js";
19
18
  import { lateGelatiere } from "./gelatiere/index.js";
20
19
  import { hostAgent } from "./host.js";
21
20
  import { imageReads } from "./images/index.js";
@@ -47,13 +46,13 @@ import { secretNames } from "./secrets/names.js";
47
46
  import { vaultRecords } from "./secrets/records.js";
48
47
  import { scrubWith } from "./secrets/scrub.js";
49
48
  import { fileStore } from "./secrets/store.js";
50
- import { listenVault, Vault } from "./secrets/vault.js";
49
+ import { listenVault, Vault, WAITING_MS } from "./secrets/vault.js";
51
50
  import {
52
51
  BEDROCK,
53
52
  createAgentSettings,
54
53
  createSliccModels,
55
- DEFAULT_MODEL,
56
54
  providerFields,
55
+ resolveDefaultModel,
57
56
  sliccProviders
58
57
  } from "./settings.js";
59
58
  import { RELOAD_MS, setupSkills } from "./skills/index.js";
@@ -66,6 +65,8 @@ import {
66
65
  kernelBoot,
67
66
  transportName
68
67
  } from "./system.js";
68
+ import { titlesExtension } from "./titles/extension.js";
69
+ import { settingsText, titler } from "./titles/generate.js";
69
70
  import { kernelPorts, serveConnections } from "./worker.js";
70
71
  function usersOf(admin, wanted, attach) {
71
72
  if (!admin) return void 0;
@@ -161,10 +162,11 @@ async function modelsOf(scope, options, given) {
161
162
  const { vault, home, transport, version } = given;
162
163
  const store = await (options.store ?? (async () => fileStore(home, ACCOUNTS_FILE)))();
163
164
  const records = vaultRecords(vault);
164
- void records.refresh(BACKGROUND_CONTEXT).catch(() => void 0);
165
+ const loaded = records.refresh(BACKGROUND_CONTEXT).catch(() => void 0);
165
166
  const providers = options.providers ?? sliccProviders(version);
166
167
  const fields = await providerFields(store, providers);
167
- const models = createSliccModels(vaultCredentials(records, fields.env), providers);
168
+ const credentials = vaultCredentials(records, fields.env);
169
+ const models = createSliccModels(credentials, providers);
168
170
  const bases = () => modelBases(providers, models);
169
171
  scope.fetch = vaultFetch(
170
172
  vault,
@@ -173,7 +175,11 @@ async function modelsOf(scope, options, given) {
173
175
  );
174
176
  const endpoints = vaultEndpoints(vault);
175
177
  void endpoints.models(bases()).catch(() => void 0);
176
- return { store, records, providers, fields, models, bases, endpoints };
178
+ const defaultModel = async () => {
179
+ await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);
180
+ return resolveDefaultModel(credentials, providers, models);
181
+ };
182
+ return { store, records, providers, fields, models, bases, endpoints, defaultModel };
177
183
  }
178
184
  function baseRegistry(facts) {
179
185
  const registry = createRegistry();
@@ -222,6 +228,16 @@ async function settingsOf(made, mcp) {
222
228
  settings.state.subscribe(() => void endpoints.models(bases()).catch(() => void 0));
223
229
  return settings;
224
230
  }
231
+ function setupTitles(registry, models, home, at, opened) {
232
+ const titleFn = titler(models, settingsText(home, HOME, at.agentDir));
233
+ const titles = titlesExtension({
234
+ agents: () => opened()?.agents,
235
+ harness: () => opened()?.harness,
236
+ title: () => titleFn
237
+ });
238
+ registry.install(titles.extension);
239
+ return { titleFn, cancel: titles.cancel };
240
+ }
225
241
  async function start(scope, ports, options, vault) {
226
242
  const { client, users, home, at } = await attached(ports, options);
227
243
  const ready = await prepare(scope, { client, home, vault }, options);
@@ -238,9 +254,9 @@ async function start(scope, ports, options, vault) {
238
254
  const scoops = setupScoops(registry, licks.licks, [...coding, ...codemode, ...memory.tools]);
239
255
  const skills = setupSkills(registry, licks.licks);
240
256
  registry.install(secretsExtension({ names, vault }));
241
- const activity = createActivity();
242
- const groups = processGroups(client);
243
- const model = options.model ?? DEFAULT_MODEL;
257
+ const titles = setupTitles(registry, models, home, at, () => opened);
258
+ const [activity, groups] = [createActivity(), processGroups(client)];
259
+ const model = options.model ?? await ready.defaultModel();
244
260
  let opened;
245
261
  const people = users ? agentUsers(users, client, home, () => opened?.agents) : void 0;
246
262
  const environment = kernelEnvironment(client, {
@@ -323,7 +339,8 @@ async function start(scope, ports, options, vault) {
323
339
  agents: agent.agents,
324
340
  env: home,
325
341
  extract: memory.extract,
326
- title: titler(models, settingsText(home, HOME, at.agentDir)),
342
+ title: titles.titleFn,
343
+ cancelTitle: titles.cancel,
327
344
  ...people ? { layout: people.layout } : {}
328
345
  });
329
346
  licks.licks.guard(freezer.frozenTarget);