@ai-ecoverse/slicc-agent 6.4.3 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +25 -1
  2. package/dist/client.js +1 -0
  3. package/dist/client.js.map +2 -2
  4. package/dist/control.js +16 -2
  5. package/dist/control.js.map +2 -2
  6. package/dist/freezer/index.js +8 -4
  7. package/dist/freezer/index.js.map +2 -2
  8. package/dist/freezer/paths.js +5 -0
  9. package/dist/freezer/paths.js.map +7 -0
  10. package/dist/freezer/v6-place.js +316 -8
  11. package/dist/freezer/v6-place.js.map +3 -3
  12. package/dist/freezer/v6-write.js +94 -1
  13. package/dist/freezer/v6-write.js.map +2 -2
  14. package/dist/freezer/v6.js +119 -30
  15. package/dist/freezer/v6.js.map +3 -3
  16. package/dist/host.js +2 -0
  17. package/dist/host.js.map +2 -2
  18. package/dist/kernel/agent-users.js +2 -1
  19. package/dist/kernel/agent-users.js.map +2 -2
  20. package/dist/licks/crontab.js +2 -1
  21. package/dist/licks/crontab.js.map +2 -2
  22. package/dist/licks/sources.js +1 -0
  23. package/dist/licks/sources.js.map +2 -2
  24. package/dist/main.js +5 -2
  25. package/dist/main.js.map +2 -2
  26. package/dist/services.js +3 -0
  27. package/dist/services.js.map +2 -2
  28. package/dist/spectrum/agent-port.js +15 -3
  29. package/dist/spectrum/agent-port.js.map +2 -2
  30. package/dist/spectrum/import-port.js +93 -0
  31. package/dist/spectrum/import-port.js.map +7 -0
  32. package/dist/types/client.d.ts +2 -0
  33. package/dist/types/control.d.ts +3 -1
  34. package/dist/types/freezer/paths.d.ts +1 -0
  35. package/dist/types/freezer/v6-place.d.ts +12 -0
  36. package/dist/types/freezer/v6-write.d.ts +16 -0
  37. package/dist/types/freezer/v6.d.ts +31 -4
  38. package/dist/types/licks/crontab.d.ts +7 -0
  39. package/dist/types/services.d.ts +12 -2
  40. package/dist/types/spectrum/agent-port.d.ts +8 -1
  41. package/dist/types/spectrum/import-port.d.ts +21 -0
  42. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/spectrum/agent-port.ts"],
4
- "sourcesContent": ["import type {\n Agent,\n AgentEvents,\n AgentPort,\n AgentStatus,\n FrozenCone,\n Message,\n Outgoing,\n SlashCommand,\n SystemMessage,\n Thinking,\n UserMessage,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { AgentConnection } from '../client.ts';\nimport { contextRatio, contextTokens } from '../context.ts';\nimport { shrink } from '../images/fit.ts';\nimport { entryLick } from '../licks/state.ts';\nimport { type VaultHold, vaultHold } from '../secrets/view.ts';\nimport type { AgentSettingsChange, AgentSummary, Command } from '../services.ts';\nimport { shownLabel } from '../titles/shown.ts';\nimport { attempt } from './attempt.ts';\nimport { Emitter } from './emitter.ts';\nimport { CONNECT_IT, isBusy, providerName, queued, toMessages } from './messages.ts';\nimport { readUrl, sendAttachments } from './outgoing.ts';\nimport { merged, proposalNotices, proposalQueue } from './proposals.ts';\n\nexport const CONE = 'cone';\n\nconst thinking: Record<string, Thinking> = {\n off: 'off',\n minimal: 'low',\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'high',\n max: 'high',\n};\n\ninterface AgentDoc {\n model?: { provider: string; modelId: string };\n thinkingLevel?: string;\n}\n\nfunction status(view: ConversationView | undefined, messages: readonly Message[]): AgentStatus {\n if (isBusy(view)) {\n const live = view?.docs['pi.live'] as { tools?: { status: string }[] } | undefined;\n return live?.tools?.some((slot) => slot.status === 'running') ? 'working' : 'thinking';\n }\n const last = messages.at(-1);\n return last?.role === 'assistant' && last.status === 'error' ? 'error' : 'idle';\n}\n\nfunction answers(messages: readonly Message[]): string[] {\n return messages\n .filter((message) => message.role === 'assistant' && message.status !== 'streaming')\n .map((message) => message.id);\n}\n\nexport function slashCommand({ kind, ...command }: Command): SlashCommand {\n return kind === 'action' ? command : { ...command, kind };\n}\n\nexport type AgentHold = VaultHold;\n\nexport type AgentAdapterEvents = AgentEvents & { hold: AgentHold | null };\n\nfunction sameHold(a: AgentHold | null, b: AgentHold | null): boolean {\n return a === b || (a !== null && b !== null && a.reason === b.reason && a.held === b.held);\n}\n\ninterface Pending {\n agentId: string;\n message: UserMessage;\n dropped: boolean;\n release(): void;\n released: Promise<void>;\n}\n\nexport class AgentAdapter extends Emitter<AgentAdapterEvents> implements AgentPort {\n readonly #connection: AgentConnection;\n readonly #ready: Promise<void>;\n readonly #messages = new Map<string, Message[]>();\n #active: string | null = null;\n #creating = new Map<string, Promise<string | null>>();\n #hold: AgentHold | null = null;\n readonly #outbox = new Map<string, Pending>();\n readonly #notices = new Map<string, { at: number; message: SystemMessage }[]>();\n readonly #unread = new Map<string, number>();\n readonly #seen = new Map<string, Set<string>>();\n readonly #queuedAt = new Map<string, Map<string, { at: number; seen: boolean }>>();\n #opened: ReadonlySet<string> | null = null;\n readonly #agentCommandsCache = new Map<string, Command[]>();\n readonly #agentCommandsLoading = new Set<string>();\n #agentCommandsGeneration = 0;\n\n constructor(connection: AgentConnection) {\n super();\n this.#connection = connection;\n this.#hold = this.hold();\n connection.vault?.subscribe(() => {\n const next = this.hold();\n if (sameHold(next, this.#hold)) return;\n this.#hold = next;\n if (!next) for (const pending of this.#outbox.values()) pending.release();\n this.emit('hold', next);\n this.emit('agents', this.list());\n });\n connection.proposals?.subscribe(() => {\n const agentId = connection.guest?.agentId;\n if (agentId) this.emit('messages', agentId);\n });\n connection.frozen?.subscribe(() => {\n this.emit('frozen', this.frozen());\n this.emit('agents', this.list());\n });\n this.#ready = new Promise((resolve) => {\n connection.transcript.subscribe(() => {\n this.#refresh();\n resolve();\n });\n connection.deliveries.subscribe(() => this.#refresh());\n connection.views?.subscribe(() => this.#refresh());\n connection.agents?.subscribe(() => this.#refresh());\n });\n connection.settings?.state.subscribe(() => {\n this.emit('agents', this.list());\n this.#refresh();\n });\n const stale = () => {\n this.#agentCommandsGeneration += 1;\n this.#agentCommandsLoading.clear();\n this.#agentCommandsCache.clear();\n this.emit('agents', this.list());\n };\n connection.commands?.subscribe(stale);\n connection.privateRevision?.subscribe(stale);\n }\n\n #summary(): readonly AgentSummary[] {\n const agents = this.#connection.agents?.value?.agents;\n return agents?.length\n ? agents\n : [{ id: CONE, name: 'sliccy', kind: 'cone', parentId: null, role: null }];\n }\n\n #view(agentId: string = this.active()): ConversationView | undefined {\n const views = this.#connection.views?.value;\n const view = views?.[agentId];\n if (view) return view;\n const cone = this.#connection.agents?.value?.active ?? CONE;\n return agentId === cone ? this.#connection.transcript.value : undefined;\n }\n\n #refresh(): void {\n this.#active ??= this.#connection.agents?.value?.active ?? null;\n if (!this.#opened && (!this.#connection.agents || this.#connection.agents.value))\n this.#opened = new Set(this.#summary().map((summary) => summary.id));\n for (const summary of this.#summary()) this.#stamp(summary.id, this.#view(summary.id));\n this.emit('agents', this.list());\n let unread = false;\n for (const summary of this.#summary()) unread = this.#update(summary.id) || unread;\n for (const id of [...this.#messages.keys(), ...this.#notices.keys(), ...this.#seen.keys()])\n if (!this.#summary().some((summary) => summary.id === id)) {\n this.#messages.delete(id);\n this.#notices.delete(id);\n this.#seen.delete(id);\n this.#unread.delete(id);\n this.#queuedAt.delete(id);\n }\n if (unread) this.emit('agents', this.list());\n }\n\n #count(agentId: string, view: ConversationView, messages: readonly Message[]): boolean {\n const ids = answers(messages);\n const known = this.#seen.get(agentId);\n if (agentId === this.active() || (!known && (!this.#opened || this.#opened.has(agentId)))) {\n this.#seen.set(agentId, new Set(ids));\n return false;\n }\n const seen = known ?? new Set<string>();\n this.#seen.set(agentId, seen);\n const fresh = isBusy(view) ? [] : ids.filter((id) => !seen.has(id));\n if (!fresh.length) return false;\n for (const id of fresh) seen.add(id);\n this.#unread.set(agentId, (this.#unread.get(agentId) ?? 0) + fresh.length);\n return true;\n }\n\n notify(text: string, agentId: string = this.active()): void {\n this.#note(agentId, { kind: 'notice', text });\n }\n\n #note(\n agentId: string,\n shown: Pick<SystemMessage, 'kind' | 'text' | 'title' | 'action' | 'account'>\n ): void {\n const notes = this.#notices.get(agentId) ?? [];\n notes.push({\n at: this.#messages.get(agentId)?.length ?? 0,\n message: { id: `n${crypto.randomUUID()}`, role: 'system', ...shown, createdAt: Date.now() },\n });\n this.#notices.set(agentId, notes);\n this.emit('messages', agentId);\n }\n\n #unconnected(agentId: string, submissionId: string): void {\n const provider = this.list()\n .find((row) => row.id === agentId)\n ?.model.split('/')[0];\n const accounts = this.#connection.settings?.state.value?.accounts ?? [];\n const account = accounts.find((item) => item.id === provider);\n if (!account || account.status === 'connected') return;\n const title = `${providerName(account.id, account.provider)} isn't connected.`;\n this.#connection.control.wait(submissionId, BACKGROUND_CONTEXT).then(\n (settled) => {\n if (settled.status === 'unanswered' && settled.reason === 'no_model')\n this.#note(agentId, {\n kind: 'error',\n title,\n text: CONNECT_IT,\n action: 'settings',\n account: account.id,\n });\n },\n () => undefined\n );\n }\n\n #report(agentId: string): (text: string) => void {\n return (text) => this.notify(text, agentId);\n }\n\n #update(agentId: string): boolean {\n const view = this.#view(agentId);\n if (!view) return false;\n const before = this.#messages.get(agentId) ?? [];\n const after = this.#labelled(toMessages(view, this.#connection.deliveries.value));\n this.#messages.set(agentId, after);\n if (before.length !== after.length) this.emit('messages', agentId);\n else {\n const changed = after.filter(\n (message, index) => JSON.stringify(message) !== JSON.stringify(before[index])\n );\n if (changed.length === 1) this.emit('message', { agentId, message: changed[0] as Message });\n else if (changed.length > 1) this.emit('messages', agentId);\n }\n return this.#count(agentId, view, after);\n }\n\n #labelled(messages: Message[]): Message[] {\n const state = this.#connection.settings?.state.value;\n const labels = state?.labels ?? {};\n const known = new Set((state?.models ?? []).map((model) => model.id));\n return messages.map((message) =>\n message.role === 'assistant' &&\n message.model &&\n !known.has(message.model) &&\n labels[message.model]\n ? { ...message, model: labels[message.model] as string }\n : message\n );\n }\n\n ready(): Promise<void> {\n return this.#ready;\n }\n\n hold(): AgentHold | null {\n return vaultHold(this.#connection.vault?.value);\n }\n\n list(): readonly Agent[] {\n const rows = this.#connection.frozen?.value ?? [];\n return this.#summary().map((summary) => {\n const view = this.#view(summary.id);\n const doc = view?.docs['pi.agent'] as AgentDoc | undefined;\n const title = rows.find((row) => row.id === summary.id)?.title;\n const model = doc?.model ? `${doc.model.provider}/${doc.model.modelId}` : '';\n const models = this.#connection.settings?.state.value?.models ?? [];\n return {\n id: summary.id,\n name: summary.role ? `${summary.name} \u00B7 ${summary.role}` : summary.name,\n kind: summary.kind,\n parentId: summary.parentId,\n status: this.#status(summary.id, status(view, this.#messages.get(summary.id) ?? [])),\n model,\n contextFill: contextRatio(contextTokens(view), model, models) ?? 0,\n unread: this.#unread.get(summary.id) ?? 0,\n thinking: thinking[doc?.thinkingLevel ?? 'off'] ?? 'off',\n ...(title ? { title } : {}),\n };\n });\n }\n\n active(): string {\n const known = this.#summary();\n if (this.#active && this.#creating.has(this.#active)) return this.#active;\n if (this.#active && known.some((summary) => summary.id === this.#active)) return this.#active;\n return this.#connection.agents?.value?.active ?? CONE;\n }\n\n select(id: string): void {\n if (this.#creating.has(id)) {\n this.#active = id;\n this.emit('active', id);\n return;\n }\n const found = this.#summary().find((summary) => summary.id === id);\n if (!found) return;\n this.#active = id;\n this.#seen.set(id, new Set(answers(this.#messages.get(id) ?? [])));\n const read = this.#unread.delete(id);\n if (found.kind === 'cone')\n attempt(\n this.#connection.control.selectCone(id, BACKGROUND_CONTEXT),\n 'switch cones',\n this.#report(id)\n );\n this.emit('active', id);\n this.emit('messages', id);\n if (read) this.emit('agents', this.list());\n }\n\n messages(agentId: string = this.active()): readonly Message[] {\n const listed = this.#listed(agentId);\n const guest = this.#connection.guest;\n if (!guest || guest.agentId !== agentId) return listed;\n return merged(listed, proposalNotices(this.#connection.proposals?.value));\n }\n\n #listed(agentId: string): readonly Message[] {\n const shown = this.#messages.get(agentId) ?? [];\n const notes = this.#notices.get(agentId);\n if (!notes) return shown;\n const at = (index: number) => notes.filter((note) => note.at === index).map((n) => n.message);\n const late = notes.filter((note) => note.at >= shown.length).map((note) => note.message);\n return [...shown.flatMap((message, index) => [...at(index), message]), ...late];\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const outgoing = typeof input === 'string' ? { text: input } : input;\n const attachments = outgoing.attachments?.length\n ? await sendAttachments(outgoing.attachments, readUrl, shrink, (ref) =>\n this.#connection.control.image(ref, BACKGROUND_CONTEXT)\n ).catch((error: Error) => {\n this.notify(error.message, agentId);\n return null;\n })\n : [];\n if (!attachments) return;\n const target = this.#creating.has(agentId) ? await this.#creating.get(agentId) : agentId;\n if (target === null) throw new Error('The scoop could not be created.');\n const pending = target && this.#held(target) ? this.#pending(target, outgoing) : undefined;\n if (pending) await pending.released;\n if (pending?.dropped) return this.#settle(pending);\n const at = Date.now();\n const sent = await this.#connection.control\n .send(\n {\n text: outgoing.text,\n whenBusy: outgoing.mode === 'queue' ? 'followUp' : 'steer',\n requestId: crypto.randomUUID(),\n agentId: target || null,\n ...(attachments.length ? { attachments } : {}),\n },\n BACKGROUND_CONTEXT\n )\n .finally(() => pending && this.#settle(pending));\n if (!sent.accepted) throw new Error(sent.error.message);\n this.#sent(target || agentId, `q${sent.submissionId}`, at);\n this.#unconnected(target || agentId, sent.submissionId);\n if (pending?.dropped)\n attempt(\n this.#connection.control.unqueue(pending.agentId, sent.submissionId, BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(pending.agentId)\n );\n }\n\n #stamps(agentId: string): Map<string, { at: number; seen: boolean }> {\n const stamps = this.#queuedAt.get(agentId) ?? new Map();\n this.#queuedAt.set(agentId, stamps);\n return stamps;\n }\n\n #sent(agentId: string, id: string, at: number): void {\n const stamps = this.#stamps(agentId);\n const known = stamps.get(id);\n stamps.set(id, { at: Math.min(at, known?.at ?? at), seen: known?.seen ?? false });\n }\n\n #stamp(agentId: string, view: ConversationView | undefined): void {\n const stamps = this.#stamps(agentId);\n const ids = new Set(queued(view).map((message) => message.id));\n const now = Date.now();\n for (const id of ids) stamps.set(id, { at: stamps.get(id)?.at ?? now, seen: true });\n for (const [id, stamp] of stamps)\n if (!ids.has(id) && (stamp.seen || (!ids.size && !isBusy(view)))) stamps.delete(id);\n }\n\n #pending(agentId: string, outgoing: Outgoing): Pending {\n const id = `p${crypto.randomUUID()}`;\n const message: UserMessage = {\n id,\n role: 'user',\n text: outgoing.text,\n createdAt: Date.now(),\n ...(outgoing.attachments?.length ? { attachments: [...outgoing.attachments] } : {}),\n queued: true,\n mode: outgoing.mode === 'queue' ? 'queue' : 'steer',\n };\n const { promise: released, resolve: release } = Promise.withResolvers<void>();\n const pending = { agentId, message, dropped: false, release, released };\n this.#outbox.set(id, pending);\n this.emit('messages', agentId);\n return pending;\n }\n\n #settle(pending: Pending): void {\n this.#outbox.delete(pending.message.id);\n this.emit('messages', pending.agentId);\n }\n\n async rewind(agentId: string, messageId: string): Promise<Outgoing | null> {\n const rewound = await this.#connection.control.rewindAgent(\n agentId,\n messageId,\n BACKGROUND_CONTEXT\n );\n if (!rewound.done) return null;\n return rewound.attachments?.length\n ? { text: rewound.text, attachments: rewound.attachments }\n : { text: rewound.text };\n }\n\n stop(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.stopAgent(agentId, BACKGROUND_CONTEXT),\n 'stop agents',\n this.#report(agentId)\n );\n }\n\n busy(agentId: string = this.active()): boolean {\n return isBusy(this.#view(agentId)) || this.#held(agentId);\n }\n\n #status(agentId: string, shown: AgentStatus): AgentStatus {\n return shown === 'idle' && this.#held(agentId) ? 'working' : shown;\n }\n\n #held(agentId: string): boolean {\n return this.#hold !== null && agentId === (this.#connection.agents?.value?.active ?? CONE);\n }\n\n queue(agentId: string = this.active()): readonly UserMessage[] {\n const pending = [...this.#outbox.values()]\n .filter((item) => item.agentId === agentId && !item.dropped)\n .map((item) => item.message);\n const stamps = this.#queuedAt.get(agentId);\n const at = (id: string) => stamps?.get(id)?.at ?? 0;\n const guest = this.#connection.guest;\n const proposed =\n guest && guest.agentId === agentId\n ? proposalQueue(this.#connection.proposals?.value, guest.label, guest.id)\n : [];\n return [...queued(this.#view(agentId), at), ...proposed, ...pending];\n }\n\n unqueue(agentId: string, messageId: string): void {\n const pending = this.#outbox.get(messageId);\n if (pending) {\n pending.dropped = true;\n pending.release();\n this.emit('messages', pending.agentId);\n return;\n }\n attempt(\n this.#connection.control.unqueue(agentId, messageId.replace(/^q/, ''), BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(agentId)\n );\n }\n\n suggestion(): string | null {\n return null;\n }\n\n answer(): void {}\n\n resolveLick(agentId: string, messageId: string, state: 'confirmed' | 'dismissed'): void {\n const message = this.messages(agentId).find((candidate) => candidate.id === messageId);\n const entry = this.#view(agentId)?.entries.find(\n (candidate) => `e${candidate.id}` === messageId\n );\n const lick = message?.role === 'lick' && entry ? entryLick(entry) : undefined;\n if (lick)\n attempt(\n this.#connection.control.resolveAgentLick(agentId, lick.id, state, BACKGROUND_CONTEXT),\n 'answer licks',\n this.#report(agentId)\n );\n }\n\n compact(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.compactAgent(agentId, null, BACKGROUND_CONTEXT),\n 'compact conversations',\n this.#report(agentId)\n );\n }\n\n clear(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.newChat(agentId, BACKGROUND_CONTEXT),\n 'start new chats',\n this.#report(agentId)\n );\n }\n\n freeze(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.freeze(agentId, BACKGROUND_CONTEXT),\n 'freeze cones',\n this.#report(agentId)\n );\n }\n\n #configure(agentId: string, change: Partial<AgentSettingsChange>): void {\n attempt(\n this.#connection.control.configure(\n {\n model: change.model ?? null,\n thinkingLevel: change.thinkingLevel ?? null,\n agentId,\n },\n BACKGROUND_CONTEXT\n ),\n 'change agent settings',\n this.#report(agentId)\n );\n }\n\n setModel(agentId: string, model: string): void {\n const at = model.indexOf('/');\n if (at <= 0) return;\n this.#configure(agentId, {\n model: { provider: model.slice(0, at), modelId: model.slice(at + 1) },\n });\n }\n\n setThinking(agentId: string, level: Thinking): void {\n this.#configure(agentId, { thinkingLevel: level });\n }\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n #fetchCommands(agentId: string): void {\n if (this.#agentCommandsLoading.has(agentId)) return;\n if (typeof this.#connection.control.agentCommands !== 'function') return;\n this.#agentCommandsLoading.add(agentId);\n const generation = this.#agentCommandsGeneration;\n this.#connection.control\n .agentCommands(agentId, BACKGROUND_CONTEXT)\n .then((commands) => {\n if (generation !== this.#agentCommandsGeneration) return;\n this.#agentCommandsCache.set(agentId, commands);\n this.emit('agents', this.list());\n })\n .catch(() => undefined)\n .finally(() => {\n if (generation === this.#agentCommandsGeneration)\n this.#agentCommandsLoading.delete(agentId);\n });\n }\n\n commands(agentId: string = this.active()): readonly SlashCommand[] {\n const cached = this.#agentCommandsCache.get(agentId);\n if (cached) return cached.map(slashCommand);\n this.#fetchCommands(agentId);\n return (this.#connection.commands?.value ?? []).map(slashCommand);\n }\n\n createScoop(parentId: string, name: string): Agent {\n const provisional = `scoop:creating-${crypto.randomUUID()}`;\n const created = this.#connection.control.createScoop(parentId, name, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, created);\n void created.then((id) => {\n if (this.#active !== provisional) return;\n this.#active = id ?? parentId;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name,\n kind: 'scoop',\n parentId,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async drop(agentId: string): Promise<void> {\n const parent = this.#summary().find((summary) => summary.id === agentId)?.parentId ?? CONE;\n const dropped = await this.#connection.control.drop(agentId, BACKGROUND_CONTEXT);\n if (dropped.error !== null) throw new Error(dropped.error);\n if (this.#active === agentId) this.select(parent);\n }\n\n async createCone(name: string): Promise<Agent> {\n const created = await this.#connection.control.createCone(name, BACKGROUND_CONTEXT);\n if (created.error !== null) throw new Error(created.error);\n return {\n id: created.id,\n name: name.trim(),\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async toolLabel(agentId: string, callIds: readonly string[]): Promise<string | null> {\n const shown = shownLabel(this.#connection.labels?.value, callIds);\n if (shown !== undefined) return shown;\n return this.#connection.control\n .toolLabel(agentId, [...callIds], BACKGROUND_CONTEXT)\n .catch(() => null);\n }\n\n frozen(): readonly FrozenCone[] {\n return (this.#connection.frozen?.value ?? []).map(\n ({ id, name, title, model, messages, frozenAt, kind, live, thawedAs }) => ({\n id,\n name,\n title,\n model,\n messages,\n frozenAt,\n kind,\n live,\n ...(thawedAs ? { thawedAs } : {}),\n })\n );\n }\n\n thaw(id: string): Agent | null {\n const record = this.frozen().find((item) => item.id === id);\n if (!record) return null;\n if (record.live) {\n const running = this.list().find((agent) => agent.id === id) ?? null;\n if (running) this.select(id);\n return running;\n }\n const provisional = `thawing-${crypto.randomUUID()}`;\n const thawed = this.#connection.control.thaw(id, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, thawed);\n void thawed.then((cone) => {\n if (this.#active !== provisional) return;\n this.#active = cone ?? CONE;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name: record.name,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: record.model,\n contextFill: 0,\n unread: 0,\n };\n }\n\n discard(id: string): void {\n attempt(\n this.#connection.control.discard(id, BACKGROUND_CONTEXT),\n 'discard frozen cones',\n this.#report(this.active())\n );\n }\n}\n"],
5
- "mappings": "AAaA,SAAS,0BAA0B;AAGnC,SAAS,cAAc,qBAAqB;AAC5C,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAyB,iBAAiB;AAE1C,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,YAAY,QAAQ,cAAc,QAAQ,kBAAkB;AACrE,SAAS,SAAS,uBAAuB;AACzC,SAAS,QAAQ,iBAAiB,qBAAqB;AAEhD,MAAM,OAAO;AAEpB,MAAM,WAAqC;AAAA,EACzC,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AACP;AAOA,SAAS,OAAO,MAAoC,UAA2C;AAC7F,MAAI,OAAO,IAAI,GAAG;AAChB,UAAM,OAAO,MAAM,KAAK,SAAS;AACjC,WAAO,MAAM,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,SAAS,IAAI,YAAY;AAAA,EAC9E;AACA,QAAM,OAAO,SAAS,GAAG,EAAE;AAC3B,SAAO,MAAM,SAAS,eAAe,KAAK,WAAW,UAAU,UAAU;AAC3E;AAEA,SAAS,QAAQ,UAAwC;AACvD,SAAO,SACJ,OAAO,CAAC,YAAY,QAAQ,SAAS,eAAe,QAAQ,WAAW,WAAW,EAClF,IAAI,CAAC,YAAY,QAAQ,EAAE;AAChC;AAEO,SAAS,aAAa,EAAE,MAAM,GAAG,QAAQ,GAA0B;AACxE,SAAO,SAAS,WAAW,UAAU,EAAE,GAAG,SAAS,KAAK;AAC1D;AAMA,SAAS,SAAS,GAAqB,GAA8B;AACnE,SAAO,MAAM,KAAM,MAAM,QAAQ,MAAM,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE;AACvF;AAUO,MAAM,qBAAqB,QAAiD;AAAA,EACxE;AAAA,EACA;AAAA,EACA,YAAY,oBAAI,IAAuB;AAAA,EAChD,UAAyB;AAAA,EACzB,YAAY,oBAAI,IAAoC;AAAA,EACpD,QAA0B;AAAA,EACjB,UAAU,oBAAI,IAAqB;AAAA,EACnC,WAAW,oBAAI,IAAsD;AAAA,EACrE,UAAU,oBAAI,IAAoB;AAAA,EAClC,QAAQ,oBAAI,IAAyB;AAAA,EACrC,YAAY,oBAAI,IAAwD;AAAA,EACjF,UAAsC;AAAA,EAC7B,sBAAsB,oBAAI,IAAuB;AAAA,EACjD,wBAAwB,oBAAI,IAAY;AAAA,EACjD,2BAA2B;AAAA,EAE3B,YAAY,YAA6B;AACvC,UAAM;AACN,SAAK,cAAc;AACnB,SAAK,QAAQ,KAAK,KAAK;AACvB,eAAW,OAAO,UAAU,MAAM;AAChC,YAAM,OAAO,KAAK,KAAK;AACvB,UAAI,SAAS,MAAM,KAAK,KAAK,EAAG;AAChC,WAAK,QAAQ;AACb,UAAI,CAAC,KAAM,YAAW,WAAW,KAAK,QAAQ,OAAO,EAAG,SAAQ,QAAQ;AACxE,WAAK,KAAK,QAAQ,IAAI;AACtB,WAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,IACjC,CAAC;AACD,eAAW,WAAW,UAAU,MAAM;AACpC,YAAM,UAAU,WAAW,OAAO;AAClC,UAAI,QAAS,MAAK,KAAK,YAAY,OAAO;AAAA,IAC5C,CAAC;AACD,eAAW,QAAQ,UAAU,MAAM;AACjC,WAAK,KAAK,UAAU,KAAK,OAAO,CAAC;AACjC,WAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,IACjC,CAAC;AACD,SAAK,SAAS,IAAI,QAAQ,CAAC,YAAY;AACrC,iBAAW,WAAW,UAAU,MAAM;AACpC,aAAK,SAAS;AACd,gBAAQ;AAAA,MACV,CAAC;AACD,iBAAW,WAAW,UAAU,MAAM,KAAK,SAAS,CAAC;AACrD,iBAAW,OAAO,UAAU,MAAM,KAAK,SAAS,CAAC;AACjD,iBAAW,QAAQ,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,IACpD,CAAC;AACD,eAAW,UAAU,MAAM,UAAU,MAAM;AACzC,WAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAC/B,WAAK,SAAS;AAAA,IAChB,CAAC;AACD,UAAM,QAAQ,MAAM;AAClB,WAAK,4BAA4B;AACjC,WAAK,sBAAsB,MAAM;AACjC,WAAK,oBAAoB,MAAM;AAC/B,WAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,IACjC;AACA,eAAW,UAAU,UAAU,KAAK;AACpC,eAAW,iBAAiB,UAAU,KAAK;AAAA,EAC7C;AAAA,EAEA,WAAoC;AAClC,UAAM,SAAS,KAAK,YAAY,QAAQ,OAAO;AAC/C,WAAO,QAAQ,SACX,SACA,CAAC,EAAE,IAAI,MAAM,MAAM,UAAU,MAAM,QAAQ,UAAU,MAAM,MAAM,KAAK,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,UAAkB,KAAK,OAAO,GAAiC;AACnE,UAAM,QAAQ,KAAK,YAAY,OAAO;AACtC,UAAM,OAAO,QAAQ,OAAO;AAC5B,QAAI,KAAM,QAAO;AACjB,UAAM,OAAO,KAAK,YAAY,QAAQ,OAAO,UAAU;AACvD,WAAO,YAAY,OAAO,KAAK,YAAY,WAAW,QAAQ;AAAA,EAChE;AAAA,EAEA,WAAiB;AACf,SAAK,YAAY,KAAK,YAAY,QAAQ,OAAO,UAAU;AAC3D,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,YAAY,UAAU,KAAK,YAAY,OAAO;AACxE,WAAK,UAAU,IAAI,IAAI,KAAK,SAAS,EAAE,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;AACrE,eAAW,WAAW,KAAK,SAAS,EAAG,MAAK,OAAO,QAAQ,IAAI,KAAK,MAAM,QAAQ,EAAE,CAAC;AACrF,SAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAC/B,QAAI,SAAS;AACb,eAAW,WAAW,KAAK,SAAS,EAAG,UAAS,KAAK,QAAQ,QAAQ,EAAE,KAAK;AAC5E,eAAW,MAAM,CAAC,GAAG,KAAK,UAAU,KAAK,GAAG,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,KAAK,MAAM,KAAK,CAAC;AACvF,UAAI,CAAC,KAAK,SAAS,EAAE,KAAK,CAAC,YAAY,QAAQ,OAAO,EAAE,GAAG;AACzD,aAAK,UAAU,OAAO,EAAE;AACxB,aAAK,SAAS,OAAO,EAAE;AACvB,aAAK,MAAM,OAAO,EAAE;AACpB,aAAK,QAAQ,OAAO,EAAE;AACtB,aAAK,UAAU,OAAO,EAAE;AAAA,MAC1B;AACF,QAAI,OAAQ,MAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,EAC7C;AAAA,EAEA,OAAO,SAAiB,MAAwB,UAAuC;AACrF,UAAM,MAAM,QAAQ,QAAQ;AAC5B,UAAM,QAAQ,KAAK,MAAM,IAAI,OAAO;AACpC,QAAI,YAAY,KAAK,OAAO,KAAM,CAAC,UAAU,CAAC,KAAK,WAAW,KAAK,QAAQ,IAAI,OAAO,IAAK;AACzF,WAAK,MAAM,IAAI,SAAS,IAAI,IAAI,GAAG,CAAC;AACpC,aAAO;AAAA,IACT;AACA,UAAM,OAAO,SAAS,oBAAI,IAAY;AACtC,SAAK,MAAM,IAAI,SAAS,IAAI;AAC5B,UAAM,QAAQ,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;AAClE,QAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,eAAW,MAAM,MAAO,MAAK,IAAI,EAAE;AACnC,SAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,MAAM,MAAM;AACzE,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,UAAkB,KAAK,OAAO,GAAS;AAC1D,SAAK,MAAM,SAAS,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,EAC9C;AAAA,EAEA,MACE,SACA,OACM;AACN,UAAM,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC;AAC7C,UAAM,KAAK;AAAA,MACT,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,UAAU;AAAA,MAC3C,SAAS,EAAE,IAAI,IAAI,OAAO,WAAW,CAAC,IAAI,MAAM,UAAU,GAAG,OAAO,WAAW,KAAK,IAAI,EAAE;AAAA,IAC5F,CAAC;AACD,SAAK,SAAS,IAAI,SAAS,KAAK;AAChC,SAAK,KAAK,YAAY,OAAO;AAAA,EAC/B;AAAA,EAEA,aAAa,SAAiB,cAA4B;AACxD,UAAM,WAAW,KAAK,KAAK,EACxB,KAAK,CAAC,QAAQ,IAAI,OAAO,OAAO,GAC/B,MAAM,MAAM,GAAG,EAAE,CAAC;AACtB,UAAM,WAAW,KAAK,YAAY,UAAU,MAAM,OAAO,YAAY,CAAC;AACtE,UAAM,UAAU,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ;AAC5D,QAAI,CAAC,WAAW,QAAQ,WAAW,YAAa;AAChD,UAAM,QAAQ,GAAG,aAAa,QAAQ,IAAI,QAAQ,QAAQ,CAAC;AAC3D,SAAK,YAAY,QAAQ,KAAK,cAAc,kBAAkB,EAAE;AAAA,MAC9D,CAAC,YAAY;AACX,YAAI,QAAQ,WAAW,gBAAgB,QAAQ,WAAW;AACxD,eAAK,MAAM,SAAS;AAAA,YAClB,MAAM;AAAA,YACN;AAAA,YACA,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,MACL;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,QAAQ,SAAyC;AAC/C,WAAO,CAAC,SAAS,KAAK,OAAO,MAAM,OAAO;AAAA,EAC5C;AAAA,EAEA,QAAQ,SAA0B;AAChC,UAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,SAAS,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC;AAC/C,UAAM,QAAQ,KAAK,UAAU,WAAW,MAAM,KAAK,YAAY,WAAW,KAAK,CAAC;AAChF,SAAK,UAAU,IAAI,SAAS,KAAK;AACjC,QAAI,OAAO,WAAW,MAAM,OAAQ,MAAK,KAAK,YAAY,OAAO;AAAA,SAC5D;AACH,YAAM,UAAU,MAAM;AAAA,QACpB,CAAC,SAAS,UAAU,KAAK,UAAU,OAAO,MAAM,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,MAC9E;AACA,UAAI,QAAQ,WAAW,EAAG,MAAK,KAAK,WAAW,EAAE,SAAS,SAAS,QAAQ,CAAC,EAAa,CAAC;AAAA,eACjF,QAAQ,SAAS,EAAG,MAAK,KAAK,YAAY,OAAO;AAAA,IAC5D;AACA,WAAO,KAAK,OAAO,SAAS,MAAM,KAAK;AAAA,EACzC;AAAA,EAEA,UAAU,UAAgC;AACxC,UAAM,QAAQ,KAAK,YAAY,UAAU,MAAM;AAC/C,UAAM,SAAS,OAAO,UAAU,CAAC;AACjC,UAAM,QAAQ,IAAI,KAAK,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AACpE,WAAO,SAAS;AAAA,MAAI,CAAC,YACnB,QAAQ,SAAS,eACjB,QAAQ,SACR,CAAC,MAAM,IAAI,QAAQ,KAAK,KACxB,OAAO,QAAQ,KAAK,IAChB,EAAE,GAAG,SAAS,OAAO,OAAO,QAAQ,KAAK,EAAY,IACrD;AAAA,IACN;AAAA,EACF;AAAA,EAEA,QAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAyB;AACvB,WAAO,UAAU,KAAK,YAAY,OAAO,KAAK;AAAA,EAChD;AAAA,EAEA,OAAyB;AACvB,UAAM,OAAO,KAAK,YAAY,QAAQ,SAAS,CAAC;AAChD,WAAO,KAAK,SAAS,EAAE,IAAI,CAAC,YAAY;AACtC,YAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,YAAM,MAAM,MAAM,KAAK,UAAU;AACjC,YAAM,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,QAAQ,EAAE,GAAG;AACzD,YAAM,QAAQ,KAAK,QAAQ,GAAG,IAAI,MAAM,QAAQ,IAAI,IAAI,MAAM,OAAO,KAAK;AAC1E,YAAM,SAAS,KAAK,YAAY,UAAU,MAAM,OAAO,UAAU,CAAC;AAClE,aAAO;AAAA,QACL,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ,OAAO,GAAG,QAAQ,IAAI,SAAM,QAAQ,IAAI,KAAK,QAAQ;AAAA,QACnE,MAAM,QAAQ;AAAA,QACd,UAAU,QAAQ;AAAA,QAClB,QAAQ,KAAK,QAAQ,QAAQ,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,QACnF;AAAA,QACA,aAAa,aAAa,cAAc,IAAI,GAAG,OAAO,MAAM,KAAK;AAAA,QACjE,QAAQ,KAAK,QAAQ,IAAI,QAAQ,EAAE,KAAK;AAAA,QACxC,UAAU,SAAS,KAAK,iBAAiB,KAAK,KAAK;AAAA,QACnD,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC3B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,SAAiB;AACf,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,KAAK,WAAW,KAAK,UAAU,IAAI,KAAK,OAAO,EAAG,QAAO,KAAK;AAClE,QAAI,KAAK,WAAW,MAAM,KAAK,CAAC,YAAY,QAAQ,OAAO,KAAK,OAAO,EAAG,QAAO,KAAK;AACtF,WAAO,KAAK,YAAY,QAAQ,OAAO,UAAU;AAAA,EACnD;AAAA,EAEA,OAAO,IAAkB;AACvB,QAAI,KAAK,UAAU,IAAI,EAAE,GAAG;AAC1B,WAAK,UAAU;AACf,WAAK,KAAK,UAAU,EAAE;AACtB;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,SAAS,EAAE,KAAK,CAAC,YAAY,QAAQ,OAAO,EAAE;AACjE,QAAI,CAAC,MAAO;AACZ,SAAK,UAAU;AACf,SAAK,MAAM,IAAI,IAAI,IAAI,IAAI,QAAQ,KAAK,UAAU,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACjE,UAAM,OAAO,KAAK,QAAQ,OAAO,EAAE;AACnC,QAAI,MAAM,SAAS;AACjB;AAAA,QACE,KAAK,YAAY,QAAQ,WAAW,IAAI,kBAAkB;AAAA,QAC1D;AAAA,QACA,KAAK,QAAQ,EAAE;AAAA,MACjB;AACF,SAAK,KAAK,UAAU,EAAE;AACtB,SAAK,KAAK,YAAY,EAAE;AACxB,QAAI,KAAM,MAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEA,SAAS,UAAkB,KAAK,OAAO,GAAuB;AAC5D,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,CAAC,SAAS,MAAM,YAAY,QAAS,QAAO;AAChD,WAAO,OAAO,QAAQ,gBAAgB,KAAK,YAAY,WAAW,KAAK,CAAC;AAAA,EAC1E;AAAA,EAEA,QAAQ,SAAqC;AAC3C,UAAM,QAAQ,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC;AAC9C,UAAM,QAAQ,KAAK,SAAS,IAAI,OAAO;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,KAAK,CAAC,UAAkB,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAC5F,UAAM,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,MAAM,MAAM,MAAM,EAAE,IAAI,CAAC,SAAS,KAAK,OAAO;AACvF,WAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,SAAS,UAAU,CAAC,GAAG,GAAG,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI;AAAA,EAChF;AAAA,EAEA,MAAM,KAAK,SAAiB,OAAyC;AACnE,UAAM,WAAW,OAAO,UAAU,WAAW,EAAE,MAAM,MAAM,IAAI;AAC/D,UAAM,cAAc,SAAS,aAAa,SACtC,MAAM;AAAA,MAAgB,SAAS;AAAA,MAAa;AAAA,MAAS;AAAA,MAAQ,CAAC,QAC5D,KAAK,YAAY,QAAQ,MAAM,KAAK,kBAAkB;AAAA,IACxD,EAAE,MAAM,CAAC,UAAiB;AACxB,WAAK,OAAO,MAAM,SAAS,OAAO;AAClC,aAAO;AAAA,IACT,CAAC,IACD,CAAC;AACL,QAAI,CAAC,YAAa;AAClB,UAAM,SAAS,KAAK,UAAU,IAAI,OAAO,IAAI,MAAM,KAAK,UAAU,IAAI,OAAO,IAAI;AACjF,QAAI,WAAW,KAAM,OAAM,IAAI,MAAM,iCAAiC;AACtE,UAAM,UAAU,UAAU,KAAK,MAAM,MAAM,IAAI,KAAK,SAAS,QAAQ,QAAQ,IAAI;AACjF,QAAI,QAAS,OAAM,QAAQ;AAC3B,QAAI,SAAS,QAAS,QAAO,KAAK,QAAQ,OAAO;AACjD,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,OAAO,MAAM,KAAK,YAAY,QACjC;AAAA,MACC;AAAA,QACE,MAAM,SAAS;AAAA,QACf,UAAU,SAAS,SAAS,UAAU,aAAa;AAAA,QACnD,WAAW,OAAO,WAAW;AAAA,QAC7B,SAAS,UAAU;AAAA,QACnB,GAAI,YAAY,SAAS,EAAE,YAAY,IAAI,CAAC;AAAA,MAC9C;AAAA,MACA;AAAA,IACF,EACC,QAAQ,MAAM,WAAW,KAAK,QAAQ,OAAO,CAAC;AACjD,QAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,KAAK,MAAM,OAAO;AACtD,SAAK,MAAM,UAAU,SAAS,IAAI,KAAK,YAAY,IAAI,EAAE;AACzD,SAAK,aAAa,UAAU,SAAS,KAAK,YAAY;AACtD,QAAI,SAAS;AACX;AAAA,QACE,KAAK,YAAY,QAAQ,QAAQ,QAAQ,SAAS,KAAK,cAAc,kBAAkB;AAAA,QACvF;AAAA,QACA,KAAK,QAAQ,QAAQ,OAAO;AAAA,MAC9B;AAAA,EACJ;AAAA,EAEA,QAAQ,SAA6D;AACnE,UAAM,SAAS,KAAK,UAAU,IAAI,OAAO,KAAK,oBAAI,IAAI;AACtD,SAAK,UAAU,IAAI,SAAS,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAiB,IAAY,IAAkB;AACnD,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,UAAM,QAAQ,OAAO,IAAI,EAAE;AAC3B,WAAO,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,MAAM,EAAE,GAAG,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,EAClF;AAAA,EAEA,OAAO,SAAiB,MAA0C;AAChE,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,UAAM,MAAM,IAAI,IAAI,OAAO,IAAI,EAAE,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;AAC7D,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,MAAM,IAAK,QAAO,IAAI,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,GAAG,MAAM,KAAK,MAAM,KAAK,CAAC;AAClF,eAAW,CAAC,IAAI,KAAK,KAAK;AACxB,UAAI,CAAC,IAAI,IAAI,EAAE,MAAM,MAAM,QAAS,CAAC,IAAI,QAAQ,CAAC,OAAO,IAAI,GAAK,QAAO,OAAO,EAAE;AAAA,EACtF;AAAA,EAEA,SAAS,SAAiB,UAA6B;AACrD,UAAM,KAAK,IAAI,OAAO,WAAW,CAAC;AAClC,UAAM,UAAuB;AAAA,MAC3B;AAAA,MACA,MAAM;AAAA,MACN,MAAM,SAAS;AAAA,MACf,WAAW,KAAK,IAAI;AAAA,MACpB,GAAI,SAAS,aAAa,SAAS,EAAE,aAAa,CAAC,GAAG,SAAS,WAAW,EAAE,IAAI,CAAC;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM,SAAS,SAAS,UAAU,UAAU;AAAA,IAC9C;AACA,UAAM,EAAE,SAAS,UAAU,SAAS,QAAQ,IAAI,QAAQ,cAAoB;AAC5E,UAAM,UAAU,EAAE,SAAS,SAAS,SAAS,OAAO,SAAS,SAAS;AACtE,SAAK,QAAQ,IAAI,IAAI,OAAO;AAC5B,SAAK,KAAK,YAAY,OAAO;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,SAAwB;AAC9B,SAAK,QAAQ,OAAO,QAAQ,QAAQ,EAAE;AACtC,SAAK,KAAK,YAAY,QAAQ,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,SAAiB,WAA6C;AACzE,UAAM,UAAU,MAAM,KAAK,YAAY,QAAQ;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,KAAM,QAAO;AAC1B,WAAO,QAAQ,aAAa,SACxB,EAAE,MAAM,QAAQ,MAAM,aAAa,QAAQ,YAAY,IACvD,EAAE,MAAM,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEA,KAAK,UAAkB,KAAK,OAAO,GAAS;AAC1C;AAAA,MACE,KAAK,YAAY,QAAQ,UAAU,SAAS,kBAAkB;AAAA,MAC9D;AAAA,MACA,KAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,KAAK,UAAkB,KAAK,OAAO,GAAY;AAC7C,WAAO,OAAO,KAAK,MAAM,OAAO,CAAC,KAAK,KAAK,MAAM,OAAO;AAAA,EAC1D;AAAA,EAEA,QAAQ,SAAiB,OAAiC;AACxD,WAAO,UAAU,UAAU,KAAK,MAAM,OAAO,IAAI,YAAY;AAAA,EAC/D;AAAA,EAEA,MAAM,SAA0B;AAC9B,WAAO,KAAK,UAAU,QAAQ,aAAa,KAAK,YAAY,QAAQ,OAAO,UAAU;AAAA,EACvF;AAAA,EAEA,MAAM,UAAkB,KAAK,OAAO,GAA2B;AAC7D,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EACtC,OAAO,CAAC,SAAS,KAAK,YAAY,WAAW,CAAC,KAAK,OAAO,EAC1D,IAAI,CAAC,SAAS,KAAK,OAAO;AAC7B,UAAM,SAAS,KAAK,UAAU,IAAI,OAAO;AACzC,UAAM,KAAK,CAAC,OAAe,QAAQ,IAAI,EAAE,GAAG,MAAM;AAClD,UAAM,QAAQ,KAAK,YAAY;AAC/B,UAAM,WACJ,SAAS,MAAM,YAAY,UACvB,cAAc,KAAK,YAAY,WAAW,OAAO,MAAM,OAAO,MAAM,EAAE,IACtE,CAAC;AACP,WAAO,CAAC,GAAG,OAAO,KAAK,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,UAAU,GAAG,OAAO;AAAA,EACrE;AAAA,EAEA,QAAQ,SAAiB,WAAyB;AAChD,UAAM,UAAU,KAAK,QAAQ,IAAI,SAAS;AAC1C,QAAI,SAAS;AACX,cAAQ,UAAU;AAClB,cAAQ,QAAQ;AAChB,WAAK,KAAK,YAAY,QAAQ,OAAO;AACrC;AAAA,IACF;AACA;AAAA,MACE,KAAK,YAAY,QAAQ,QAAQ,SAAS,UAAU,QAAQ,MAAM,EAAE,GAAG,kBAAkB;AAAA,MACzF;AAAA,MACA,KAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,aAA4B;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,SAAe;AAAA,EAAC;AAAA,EAEhB,YAAY,SAAiB,WAAmB,OAAwC;AACtF,UAAM,UAAU,KAAK,SAAS,OAAO,EAAE,KAAK,CAAC,cAAc,UAAU,OAAO,SAAS;AACrF,UAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,QAAQ;AAAA,MACzC,CAAC,cAAc,IAAI,UAAU,EAAE,OAAO;AAAA,IACxC;AACA,UAAM,OAAO,SAAS,SAAS,UAAU,QAAQ,UAAU,KAAK,IAAI;AACpE,QAAI;AACF;AAAA,QACE,KAAK,YAAY,QAAQ,iBAAiB,SAAS,KAAK,IAAI,OAAO,kBAAkB;AAAA,QACrF;AAAA,QACA,KAAK,QAAQ,OAAO;AAAA,MACtB;AAAA,EACJ;AAAA,EAEA,QAAQ,UAAkB,KAAK,OAAO,GAAS;AAC7C;AAAA,MACE,KAAK,YAAY,QAAQ,aAAa,SAAS,MAAM,kBAAkB;AAAA,MACvE;AAAA,MACA,KAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,UAAkB,KAAK,OAAO,GAAS;AAC3C;AAAA,MACE,KAAK,YAAY,QAAQ,QAAQ,SAAS,kBAAkB;AAAA,MAC5D;AAAA,MACA,KAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO,UAAkB,KAAK,OAAO,GAAS;AAC5C;AAAA,MACE,KAAK,YAAY,QAAQ,OAAO,SAAS,kBAAkB;AAAA,MAC3D;AAAA,MACA,KAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,WAAW,SAAiB,QAA4C;AACtE;AAAA,MACE,KAAK,YAAY,QAAQ;AAAA,QACvB;AAAA,UACE,OAAO,OAAO,SAAS;AAAA,UACvB,eAAe,OAAO,iBAAiB;AAAA,UACvC;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA,KAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,SAAS,SAAiB,OAAqB;AAC7C,UAAM,KAAK,MAAM,QAAQ,GAAG;AAC5B,QAAI,MAAM,EAAG;AACb,SAAK,WAAW,SAAS;AAAA,MACvB,OAAO,EAAE,UAAU,MAAM,MAAM,GAAG,EAAE,GAAG,SAAS,MAAM,MAAM,KAAK,CAAC,EAAE;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,SAAiB,OAAuB;AAClD,SAAK,WAAW,SAAS,EAAE,eAAe,MAAM,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,QAAqC;AACzC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,eAAe,SAAuB;AACpC,QAAI,KAAK,sBAAsB,IAAI,OAAO,EAAG;AAC7C,QAAI,OAAO,KAAK,YAAY,QAAQ,kBAAkB,WAAY;AAClE,SAAK,sBAAsB,IAAI,OAAO;AACtC,UAAM,aAAa,KAAK;AACxB,SAAK,YAAY,QACd,cAAc,SAAS,kBAAkB,EACzC,KAAK,CAAC,aAAa;AAClB,UAAI,eAAe,KAAK,yBAA0B;AAClD,WAAK,oBAAoB,IAAI,SAAS,QAAQ;AAC9C,WAAK,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,IACjC,CAAC,EACA,MAAM,MAAM,MAAS,EACrB,QAAQ,MAAM;AACb,UAAI,eAAe,KAAK;AACtB,aAAK,sBAAsB,OAAO,OAAO;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EAEA,SAAS,UAAkB,KAAK,OAAO,GAA4B;AACjE,UAAM,SAAS,KAAK,oBAAoB,IAAI,OAAO;AACnD,QAAI,OAAQ,QAAO,OAAO,IAAI,YAAY;AAC1C,SAAK,eAAe,OAAO;AAC3B,YAAQ,KAAK,YAAY,UAAU,SAAS,CAAC,GAAG,IAAI,YAAY;AAAA,EAClE;AAAA,EAEA,YAAY,UAAkB,MAAqB;AACjD,UAAM,cAAc,kBAAkB,OAAO,WAAW,CAAC;AACzD,UAAM,UAAU,KAAK,YAAY,QAAQ,YAAY,UAAU,MAAM,kBAAkB,EAAE;AAAA,MACvF,CAAC,WAAW,OAAO;AAAA,MACnB,MAAM;AAAA,IACR;AACA,SAAK,UAAU,IAAI,aAAa,OAAO;AACvC,SAAK,QAAQ,KAAK,CAAC,OAAO;AACxB,UAAI,KAAK,YAAY,YAAa;AAClC,WAAK,UAAU,MAAM;AACrB,WAAK,KAAK,UAAU,KAAK,OAAO;AAChC,WAAK,KAAK,YAAY,KAAK,OAAO;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAgC;AACzC,UAAM,SAAS,KAAK,SAAS,EAAE,KAAK,CAAC,YAAY,QAAQ,OAAO,OAAO,GAAG,YAAY;AACtF,UAAM,UAAU,MAAM,KAAK,YAAY,QAAQ,KAAK,SAAS,kBAAkB;AAC/E,QAAI,QAAQ,UAAU,KAAM,OAAM,IAAI,MAAM,QAAQ,KAAK;AACzD,QAAI,KAAK,YAAY,QAAS,MAAK,OAAO,MAAM;AAAA,EAClD;AAAA,EAEA,MAAM,WAAW,MAA8B;AAC7C,UAAM,UAAU,MAAM,KAAK,YAAY,QAAQ,WAAW,MAAM,kBAAkB;AAClF,QAAI,QAAQ,UAAU,KAAM,OAAM,IAAI,MAAM,QAAQ,KAAK;AACzD,WAAO;AAAA,MACL,IAAI,QAAQ;AAAA,MACZ,MAAM,KAAK,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,SAAiB,SAAoD;AACnF,UAAM,QAAQ,WAAW,KAAK,YAAY,QAAQ,OAAO,OAAO;AAChE,QAAI,UAAU,OAAW,QAAO;AAChC,WAAO,KAAK,YAAY,QACrB,UAAU,SAAS,CAAC,GAAG,OAAO,GAAG,kBAAkB,EACnD,MAAM,MAAM,IAAI;AAAA,EACrB;AAAA,EAEA,SAAgC;AAC9B,YAAQ,KAAK,YAAY,QAAQ,SAAS,CAAC,GAAG;AAAA,MAC5C,CAAC,EAAE,IAAI,MAAM,OAAO,OAAO,UAAU,UAAU,MAAM,MAAM,SAAS,OAAO;AAAA,QACzE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,IAA0B;AAC7B,UAAM,SAAS,KAAK,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAC1D,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,OAAO,MAAM;AACf,YAAM,UAAU,KAAK,KAAK,EAAE,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK;AAChE,UAAI,QAAS,MAAK,OAAO,EAAE;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,cAAc,WAAW,OAAO,WAAW,CAAC;AAClD,UAAM,SAAS,KAAK,YAAY,QAAQ,KAAK,IAAI,kBAAkB,EAAE;AAAA,MACnE,CAAC,WAAW,OAAO;AAAA,MACnB,MAAM;AAAA,IACR;AACA,SAAK,UAAU,IAAI,aAAa,MAAM;AACtC,SAAK,OAAO,KAAK,CAAC,SAAS;AACzB,UAAI,KAAK,YAAY,YAAa;AAClC,WAAK,UAAU,QAAQ;AACvB,WAAK,KAAK,UAAU,KAAK,OAAO;AAChC,WAAK,KAAK,YAAY,KAAK,OAAO;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO,OAAO;AAAA,MACd,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,QAAQ,IAAkB;AACxB;AAAA,MACE,KAAK,YAAY,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,MACvD;AAAA,MACA,KAAK,QAAQ,KAAK,OAAO,CAAC;AAAA,IAC5B;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type {\n Agent,\n AgentEvents,\n AgentPort,\n AgentStatus,\n FrozenCone,\n Message,\n Outgoing,\n ProfileImportProgress,\n SlashCommand,\n SystemMessage,\n Thinking,\n UserMessage,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { AgentConnection } from '../client.ts';\nimport { contextRatio, contextTokens } from '../context.ts';\nimport { shrink } from '../images/fit.ts';\nimport { entryLick } from '../licks/state.ts';\nimport { type VaultHold, vaultHold } from '../secrets/view.ts';\nimport type { AgentSettingsChange, AgentSummary, Command } from '../services.ts';\nimport { shownLabel } from '../titles/shown.ts';\nimport { attempt, warn } from './attempt.ts';\nimport { Emitter } from './emitter.ts';\nimport { IDLE_IMPORT, importProfile, type ShownImport } from './import-port.ts';\nimport { CONNECT_IT, isBusy, providerName, queued, toMessages } from './messages.ts';\nimport { readUrl, sendAttachments } from './outgoing.ts';\nimport { merged, proposalNotices, proposalQueue } from './proposals.ts';\n\nexport const CONE = 'cone';\n\nconst thinking: Record<string, Thinking> = {\n off: 'off',\n minimal: 'low',\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'high',\n max: 'high',\n};\n\ninterface AgentDoc {\n model?: { provider: string; modelId: string };\n thinkingLevel?: string;\n}\n\nfunction status(view: ConversationView | undefined, messages: readonly Message[]): AgentStatus {\n if (isBusy(view)) {\n const live = view?.docs['pi.live'] as { tools?: { status: string }[] } | undefined;\n return live?.tools?.some((slot) => slot.status === 'running') ? 'working' : 'thinking';\n }\n const last = messages.at(-1);\n return last?.role === 'assistant' && last.status === 'error' ? 'error' : 'idle';\n}\n\nfunction answers(messages: readonly Message[]): string[] {\n return messages\n .filter((message) => message.role === 'assistant' && message.status !== 'streaming')\n .map((message) => message.id);\n}\n\nexport function slashCommand({ kind, ...command }: Command): SlashCommand {\n return kind === 'action' ? command : { ...command, kind };\n}\n\nexport type AgentHold = VaultHold;\n\nexport type AgentAdapterEvents = AgentEvents & { hold: AgentHold | null };\n\nfunction sameHold(a: AgentHold | null, b: AgentHold | null): boolean {\n return a === b || (a !== null && b !== null && a.reason === b.reason && a.held === b.held);\n}\n\ninterface Pending {\n agentId: string;\n message: UserMessage;\n dropped: boolean;\n release(): void;\n released: Promise<void>;\n}\n\nexport class AgentAdapter extends Emitter<AgentAdapterEvents> implements AgentPort {\n readonly #connection: AgentConnection;\n readonly #ready: Promise<void>;\n readonly #messages = new Map<string, Message[]>();\n #active: string | null = null;\n #creating = new Map<string, Promise<string | null>>();\n #hold: AgentHold | null = null;\n readonly #outbox = new Map<string, Pending>();\n readonly #notices = new Map<string, { at: number; message: SystemMessage }[]>();\n readonly #unread = new Map<string, number>();\n readonly #seen = new Map<string, Set<string>>();\n readonly #queuedAt = new Map<string, Map<string, { at: number; seen: boolean }>>();\n #opened: ReadonlySet<string> | null = null;\n readonly #agentCommandsCache = new Map<string, Command[]>();\n readonly #agentCommandsLoading = new Set<string>();\n #agentCommandsGeneration = 0;\n\n constructor(connection: AgentConnection) {\n super();\n this.#connection = connection;\n this.#hold = this.hold();\n connection.vault?.subscribe(() => {\n const next = this.hold();\n if (sameHold(next, this.#hold)) return;\n this.#hold = next;\n if (!next) for (const pending of this.#outbox.values()) pending.release();\n this.emit('hold', next);\n this.emit('agents', this.list());\n });\n connection.proposals?.subscribe(() => {\n const agentId = connection.guest?.agentId;\n if (agentId) this.emit('messages', agentId);\n });\n connection.frozen?.subscribe(() => {\n this.emit('frozen', this.frozen());\n this.emit('agents', this.list());\n });\n connection.importing?.subscribe(() => this.emit('importing', this.importing()));\n this.#ready = new Promise((resolve) => {\n connection.transcript.subscribe(() => {\n this.#refresh();\n resolve();\n });\n connection.deliveries.subscribe(() => this.#refresh());\n connection.views?.subscribe(() => this.#refresh());\n connection.agents?.subscribe(() => this.#refresh());\n });\n connection.settings?.state.subscribe(() => {\n this.emit('agents', this.list());\n this.#refresh();\n });\n const stale = () => {\n this.#agentCommandsGeneration += 1;\n this.#agentCommandsLoading.clear();\n this.#agentCommandsCache.clear();\n this.emit('agents', this.list());\n };\n connection.commands?.subscribe(stale);\n connection.privateRevision?.subscribe(stale);\n }\n\n #summary(): readonly AgentSummary[] {\n const agents = this.#connection.agents?.value?.agents;\n return agents?.length\n ? agents\n : [{ id: CONE, name: 'sliccy', kind: 'cone', parentId: null, role: null }];\n }\n\n #view(agentId: string = this.active()): ConversationView | undefined {\n const views = this.#connection.views?.value;\n const view = views?.[agentId];\n if (view) return view;\n const cone = this.#connection.agents?.value?.active ?? CONE;\n return agentId === cone ? this.#connection.transcript.value : undefined;\n }\n\n #refresh(): void {\n this.#active ??= this.#connection.agents?.value?.active ?? null;\n if (!this.#opened && (!this.#connection.agents || this.#connection.agents.value))\n this.#opened = new Set(this.#summary().map((summary) => summary.id));\n for (const summary of this.#summary()) this.#stamp(summary.id, this.#view(summary.id));\n this.emit('agents', this.list());\n let unread = false;\n for (const summary of this.#summary()) unread = this.#update(summary.id) || unread;\n for (const id of [...this.#messages.keys(), ...this.#notices.keys(), ...this.#seen.keys()])\n if (!this.#summary().some((summary) => summary.id === id)) {\n this.#messages.delete(id);\n this.#notices.delete(id);\n this.#seen.delete(id);\n this.#unread.delete(id);\n this.#queuedAt.delete(id);\n }\n if (unread) this.emit('agents', this.list());\n }\n\n #count(agentId: string, view: ConversationView, messages: readonly Message[]): boolean {\n const ids = answers(messages);\n const known = this.#seen.get(agentId);\n if (agentId === this.active() || (!known && (!this.#opened || this.#opened.has(agentId)))) {\n this.#seen.set(agentId, new Set(ids));\n return false;\n }\n const seen = known ?? new Set<string>();\n this.#seen.set(agentId, seen);\n const fresh = isBusy(view) ? [] : ids.filter((id) => !seen.has(id));\n if (!fresh.length) return false;\n for (const id of fresh) seen.add(id);\n this.#unread.set(agentId, (this.#unread.get(agentId) ?? 0) + fresh.length);\n return true;\n }\n\n notify(text: string, agentId: string = this.active()): void {\n this.#note(agentId, { kind: 'notice', text });\n }\n\n #note(\n agentId: string,\n shown: Pick<SystemMessage, 'kind' | 'text' | 'title' | 'action' | 'account'>\n ): void {\n const notes = this.#notices.get(agentId) ?? [];\n notes.push({\n at: this.#messages.get(agentId)?.length ?? 0,\n message: { id: `n${crypto.randomUUID()}`, role: 'system', ...shown, createdAt: Date.now() },\n });\n this.#notices.set(agentId, notes);\n this.emit('messages', agentId);\n }\n\n #unconnected(agentId: string, submissionId: string): void {\n const provider = this.list()\n .find((row) => row.id === agentId)\n ?.model.split('/')[0];\n const accounts = this.#connection.settings?.state.value?.accounts ?? [];\n const account = accounts.find((item) => item.id === provider);\n if (!account || account.status === 'connected') return;\n const title = `${providerName(account.id, account.provider)} isn't connected.`;\n this.#connection.control.wait(submissionId, BACKGROUND_CONTEXT).then(\n (settled) => {\n if (settled.status === 'unanswered' && settled.reason === 'no_model')\n this.#note(agentId, {\n kind: 'error',\n title,\n text: CONNECT_IT,\n action: 'settings',\n account: account.id,\n });\n },\n () => undefined\n );\n }\n\n #report(agentId: string): (text: string) => void {\n return (text) => this.notify(text, agentId);\n }\n\n #update(agentId: string): boolean {\n const view = this.#view(agentId);\n if (!view) return false;\n const before = this.#messages.get(agentId) ?? [];\n const after = this.#labelled(toMessages(view, this.#connection.deliveries.value));\n this.#messages.set(agentId, after);\n if (before.length !== after.length) this.emit('messages', agentId);\n else {\n const changed = after.filter(\n (message, index) => JSON.stringify(message) !== JSON.stringify(before[index])\n );\n if (changed.length === 1) this.emit('message', { agentId, message: changed[0] as Message });\n else if (changed.length > 1) this.emit('messages', agentId);\n }\n return this.#count(agentId, view, after);\n }\n\n #labelled(messages: Message[]): Message[] {\n const state = this.#connection.settings?.state.value;\n const labels = state?.labels ?? {};\n const known = new Set((state?.models ?? []).map((model) => model.id));\n return messages.map((message) =>\n message.role === 'assistant' &&\n message.model &&\n !known.has(message.model) &&\n labels[message.model]\n ? { ...message, model: labels[message.model] as string }\n : message\n );\n }\n\n ready(): Promise<void> {\n return this.#ready;\n }\n\n hold(): AgentHold | null {\n return vaultHold(this.#connection.vault?.value);\n }\n\n list(): readonly Agent[] {\n const rows = this.#connection.frozen?.value ?? [];\n return this.#summary().map((summary) => {\n const view = this.#view(summary.id);\n const doc = view?.docs['pi.agent'] as AgentDoc | undefined;\n const title = rows.find((row) => row.id === summary.id)?.title;\n const model = doc?.model ? `${doc.model.provider}/${doc.model.modelId}` : '';\n const models = this.#connection.settings?.state.value?.models ?? [];\n return {\n id: summary.id,\n name: summary.role ? `${summary.name} \u00B7 ${summary.role}` : summary.name,\n kind: summary.kind,\n parentId: summary.parentId,\n status: this.#status(summary.id, status(view, this.#messages.get(summary.id) ?? [])),\n model,\n contextFill: contextRatio(contextTokens(view), model, models) ?? 0,\n unread: this.#unread.get(summary.id) ?? 0,\n thinking: thinking[doc?.thinkingLevel ?? 'off'] ?? 'off',\n ...(title ? { title } : {}),\n };\n });\n }\n\n active(): string {\n const known = this.#summary();\n if (this.#active && this.#creating.has(this.#active)) return this.#active;\n if (this.#active && known.some((summary) => summary.id === this.#active)) return this.#active;\n return this.#connection.agents?.value?.active ?? CONE;\n }\n\n select(id: string): void {\n if (this.#creating.has(id)) {\n this.#active = id;\n this.emit('active', id);\n return;\n }\n const found = this.#summary().find((summary) => summary.id === id);\n if (!found) return;\n this.#active = id;\n this.#seen.set(id, new Set(answers(this.#messages.get(id) ?? [])));\n const read = this.#unread.delete(id);\n if (found.kind === 'cone')\n attempt(\n this.#connection.control.selectCone(id, BACKGROUND_CONTEXT),\n 'switch cones',\n this.#report(id)\n );\n this.emit('active', id);\n this.emit('messages', id);\n if (read) this.emit('agents', this.list());\n }\n\n messages(agentId: string = this.active()): readonly Message[] {\n const listed = this.#listed(agentId);\n const guest = this.#connection.guest;\n if (!guest || guest.agentId !== agentId) return listed;\n return merged(listed, proposalNotices(this.#connection.proposals?.value));\n }\n\n #listed(agentId: string): readonly Message[] {\n const shown = this.#messages.get(agentId) ?? [];\n const notes = this.#notices.get(agentId);\n if (!notes) return shown;\n const at = (index: number) => notes.filter((note) => note.at === index).map((n) => n.message);\n const late = notes.filter((note) => note.at >= shown.length).map((note) => note.message);\n return [...shown.flatMap((message, index) => [...at(index), message]), ...late];\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const outgoing = typeof input === 'string' ? { text: input } : input;\n const attachments = outgoing.attachments?.length\n ? await sendAttachments(outgoing.attachments, readUrl, shrink, (ref) =>\n this.#connection.control.image(ref, BACKGROUND_CONTEXT)\n ).catch((error: Error) => {\n this.notify(error.message, agentId);\n return null;\n })\n : [];\n if (!attachments) return;\n const target = this.#creating.has(agentId) ? await this.#creating.get(agentId) : agentId;\n if (target === null) throw new Error('The scoop could not be created.');\n const pending = target && this.#held(target) ? this.#pending(target, outgoing) : undefined;\n if (pending) await pending.released;\n if (pending?.dropped) return this.#settle(pending);\n const at = Date.now();\n const sent = await this.#connection.control\n .send(\n {\n text: outgoing.text,\n whenBusy: outgoing.mode === 'queue' ? 'followUp' : 'steer',\n requestId: crypto.randomUUID(),\n agentId: target || null,\n ...(attachments.length ? { attachments } : {}),\n },\n BACKGROUND_CONTEXT\n )\n .finally(() => pending && this.#settle(pending));\n if (!sent.accepted) throw new Error(sent.error.message);\n this.#sent(target || agentId, `q${sent.submissionId}`, at);\n this.#unconnected(target || agentId, sent.submissionId);\n if (pending?.dropped)\n attempt(\n this.#connection.control.unqueue(pending.agentId, sent.submissionId, BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(pending.agentId)\n );\n }\n\n #stamps(agentId: string): Map<string, { at: number; seen: boolean }> {\n const stamps = this.#queuedAt.get(agentId) ?? new Map();\n this.#queuedAt.set(agentId, stamps);\n return stamps;\n }\n\n #sent(agentId: string, id: string, at: number): void {\n const stamps = this.#stamps(agentId);\n const known = stamps.get(id);\n stamps.set(id, { at: Math.min(at, known?.at ?? at), seen: known?.seen ?? false });\n }\n\n #stamp(agentId: string, view: ConversationView | undefined): void {\n const stamps = this.#stamps(agentId);\n const ids = new Set(queued(view).map((message) => message.id));\n const now = Date.now();\n for (const id of ids) stamps.set(id, { at: stamps.get(id)?.at ?? now, seen: true });\n for (const [id, stamp] of stamps)\n if (!ids.has(id) && (stamp.seen || (!ids.size && !isBusy(view)))) stamps.delete(id);\n }\n\n #pending(agentId: string, outgoing: Outgoing): Pending {\n const id = `p${crypto.randomUUID()}`;\n const message: UserMessage = {\n id,\n role: 'user',\n text: outgoing.text,\n createdAt: Date.now(),\n ...(outgoing.attachments?.length ? { attachments: [...outgoing.attachments] } : {}),\n queued: true,\n mode: outgoing.mode === 'queue' ? 'queue' : 'steer',\n };\n const { promise: released, resolve: release } = Promise.withResolvers<void>();\n const pending = { agentId, message, dropped: false, release, released };\n this.#outbox.set(id, pending);\n this.emit('messages', agentId);\n return pending;\n }\n\n #settle(pending: Pending): void {\n this.#outbox.delete(pending.message.id);\n this.emit('messages', pending.agentId);\n }\n\n async rewind(agentId: string, messageId: string): Promise<Outgoing | null> {\n const rewound = await this.#connection.control.rewindAgent(\n agentId,\n messageId,\n BACKGROUND_CONTEXT\n );\n if (!rewound.done) return null;\n return rewound.attachments?.length\n ? { text: rewound.text, attachments: rewound.attachments }\n : { text: rewound.text };\n }\n\n stop(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.stopAgent(agentId, BACKGROUND_CONTEXT),\n 'stop agents',\n this.#report(agentId)\n );\n }\n\n busy(agentId: string = this.active()): boolean {\n return isBusy(this.#view(agentId)) || this.#held(agentId);\n }\n\n #status(agentId: string, shown: AgentStatus): AgentStatus {\n return shown === 'idle' && this.#held(agentId) ? 'working' : shown;\n }\n\n #held(agentId: string): boolean {\n return this.#hold !== null && agentId === (this.#connection.agents?.value?.active ?? CONE);\n }\n\n queue(agentId: string = this.active()): readonly UserMessage[] {\n const pending = [...this.#outbox.values()]\n .filter((item) => item.agentId === agentId && !item.dropped)\n .map((item) => item.message);\n const stamps = this.#queuedAt.get(agentId);\n const at = (id: string) => stamps?.get(id)?.at ?? 0;\n const guest = this.#connection.guest;\n const proposed =\n guest && guest.agentId === agentId\n ? proposalQueue(this.#connection.proposals?.value, guest.label, guest.id)\n : [];\n return [...queued(this.#view(agentId), at), ...proposed, ...pending];\n }\n\n unqueue(agentId: string, messageId: string): void {\n const pending = this.#outbox.get(messageId);\n if (pending) {\n pending.dropped = true;\n pending.release();\n this.emit('messages', pending.agentId);\n return;\n }\n attempt(\n this.#connection.control.unqueue(agentId, messageId.replace(/^q/, ''), BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(agentId)\n );\n }\n\n suggestion(): string | null {\n return null;\n }\n\n answer(): void {}\n\n resolveLick(agentId: string, messageId: string, state: 'confirmed' | 'dismissed'): void {\n const message = this.messages(agentId).find((candidate) => candidate.id === messageId);\n const entry = this.#view(agentId)?.entries.find(\n (candidate) => `e${candidate.id}` === messageId\n );\n const lick = message?.role === 'lick' && entry ? entryLick(entry) : undefined;\n if (lick)\n attempt(\n this.#connection.control.resolveAgentLick(agentId, lick.id, state, BACKGROUND_CONTEXT),\n 'answer licks',\n this.#report(agentId)\n );\n }\n\n compact(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.compactAgent(agentId, null, BACKGROUND_CONTEXT),\n 'compact conversations',\n this.#report(agentId)\n );\n }\n\n clear(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.newChat(agentId, BACKGROUND_CONTEXT),\n 'start new chats',\n this.#report(agentId)\n );\n }\n\n freeze(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.freeze(agentId, BACKGROUND_CONTEXT),\n 'freeze cones',\n this.#report(agentId)\n );\n }\n\n #configure(agentId: string, change: Partial<AgentSettingsChange>): void {\n attempt(\n this.#connection.control.configure(\n {\n model: change.model ?? null,\n thinkingLevel: change.thinkingLevel ?? null,\n agentId,\n },\n BACKGROUND_CONTEXT\n ),\n 'change agent settings',\n this.#report(agentId)\n );\n }\n\n setModel(agentId: string, model: string): void {\n const at = model.indexOf('/');\n if (at <= 0) return;\n this.#configure(agentId, {\n model: { provider: model.slice(0, at), modelId: model.slice(at + 1) },\n });\n }\n\n setThinking(agentId: string, level: Thinking): void {\n this.#configure(agentId, { thinkingLevel: level });\n }\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n #fetchCommands(agentId: string): void {\n if (this.#agentCommandsLoading.has(agentId)) return;\n if (typeof this.#connection.control.agentCommands !== 'function') return;\n this.#agentCommandsLoading.add(agentId);\n const generation = this.#agentCommandsGeneration;\n this.#connection.control\n .agentCommands(agentId, BACKGROUND_CONTEXT)\n .then((commands) => {\n if (generation !== this.#agentCommandsGeneration) return;\n this.#agentCommandsCache.set(agentId, commands);\n this.emit('agents', this.list());\n })\n .catch(() => undefined)\n .finally(() => {\n if (generation === this.#agentCommandsGeneration)\n this.#agentCommandsLoading.delete(agentId);\n });\n }\n\n commands(agentId: string = this.active()): readonly SlashCommand[] {\n const cached = this.#agentCommandsCache.get(agentId);\n if (cached) return cached.map(slashCommand);\n this.#fetchCommands(agentId);\n return (this.#connection.commands?.value ?? []).map(slashCommand);\n }\n\n createScoop(parentId: string, name: string): Agent {\n const provisional = `scoop:creating-${crypto.randomUUID()}`;\n const created = this.#connection.control.createScoop(parentId, name, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, created);\n void created.then((id) => {\n if (this.#active !== provisional) return;\n this.#active = id ?? parentId;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name,\n kind: 'scoop',\n parentId,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async drop(agentId: string): Promise<void> {\n const parent = this.#summary().find((summary) => summary.id === agentId)?.parentId ?? CONE;\n const dropped = await this.#connection.control.drop(agentId, BACKGROUND_CONTEXT);\n if (dropped.error !== null) throw new Error(dropped.error);\n if (this.#active === agentId) this.select(parent);\n }\n\n async createCone(name: string): Promise<Agent> {\n const created = await this.#connection.control.createCone(name, BACKGROUND_CONTEXT);\n if (created.error !== null) throw new Error(created.error);\n return {\n id: created.id,\n name: name.trim(),\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async toolLabel(agentId: string, callIds: readonly string[]): Promise<string | null> {\n const shown = shownLabel(this.#connection.labels?.value, callIds);\n if (shown !== undefined) return shown;\n return this.#connection.control\n .toolLabel(agentId, [...callIds], BACKGROUND_CONTEXT)\n .catch(() => null);\n }\n\n frozen(): readonly FrozenCone[] {\n return (this.#connection.frozen?.value ?? []).map(\n ({ id, name, title, model, messages, frozenAt, kind, live, thawedAs, v6 }) => ({\n id,\n name,\n title,\n model,\n messages,\n frozenAt,\n kind,\n live,\n ...(thawedAs ? { thawedAs } : {}),\n ...(v6 ? { v6 } : {}),\n })\n );\n }\n\n importProfile(file: Blob, options: { preview: boolean; again?: boolean }): Promise<ShownImport> {\n return importProfile(this.#connection, file, options);\n }\n\n importCancel(): void {\n void this.#connection.control.importCancel(BACKGROUND_CONTEXT).catch(warn);\n }\n\n importing(): ProfileImportProgress {\n return this.#connection.importing?.value ?? IDLE_IMPORT;\n }\n\n thaw(id: string): Agent | null {\n const record = this.frozen().find((item) => item.id === id);\n if (!record) return null;\n if (record.live) {\n const running = this.list().find((agent) => agent.id === id) ?? null;\n if (running) this.select(id);\n return running;\n }\n const provisional = `thawing-${crypto.randomUUID()}`;\n const thawed = this.#connection.control.thaw(id, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, thawed);\n void thawed.then((cone) => {\n if (this.#active !== provisional) return;\n this.#active = cone ?? CONE;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name: record.name,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: record.model,\n contextFill: 0,\n unread: 0,\n };\n }\n\n discard(id: string): void {\n attempt(\n this.#connection.control.discard(id, BACKGROUND_CONTEXT),\n 'discard frozen cones',\n this.#report(this.active())\n );\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,93 @@
1
+ import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
2
+ import { IMPORTS_DIR } from "../freezer/paths.js";
3
+ import { opfsDirectory } from "../opfs-pool.js";
4
+ const DATA_MAX = 16 * 1024 * 1024;
5
+ const IDLE_IMPORT = { phase: "idle", done: 0, total: 0, text: "" };
6
+ const TOO_BIG = "This profile is too big to send from this device. Import it in the browser that runs SLICC, or with freezer import there.";
7
+ function base64(bytes) {
8
+ let out = "";
9
+ for (let at = 0; at < bytes.length; at += 32768)
10
+ out += String.fromCharCode(...bytes.subarray(at, at + 32768));
11
+ return btoa(out);
12
+ }
13
+ async function upload(file, root = () => navigator.storage.getDirectory()) {
14
+ const dir = await Promise.resolve().then(root).then(
15
+ (handle) => opfsDirectory(handle, IMPORTS_DIR),
16
+ () => void 0
17
+ );
18
+ if (dir) {
19
+ const id = crypto.randomUUID();
20
+ const name = `upload-${id}.zip`;
21
+ const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();
22
+ await file.stream().pipeTo(writable);
23
+ const done = () => dir.removeEntry(name).catch(() => void 0);
24
+ return { upload: id, data: null, done };
25
+ }
26
+ if (file.size > DATA_MAX) throw new Error(TOO_BIG);
27
+ const data = base64(new Uint8Array(await file.arrayBuffer()));
28
+ return { upload: null, data, done: async () => void 0 };
29
+ }
30
+ function sentence(text) {
31
+ const said = text.trim().replace(/^./, (first) => first.toUpperCase());
32
+ return /[.!?]$/.test(said) ? said : `${said}.`;
33
+ }
34
+ function shownPreview({
35
+ exportId: _,
36
+ line: __,
37
+ createdAt,
38
+ ...rest
39
+ }) {
40
+ return { ...rest, createdAt: Date.parse(createdAt) };
41
+ }
42
+ const LISTED_MS = 1e4;
43
+ function listed(connection, ids, ms = LISTED_MS) {
44
+ const frozen = connection.frozen;
45
+ if (!frozen) return Promise.resolve();
46
+ const shown = () => ids.every((id) => (frozen.value ?? []).some((row) => row.id === id && row.v6));
47
+ if (shown()) return Promise.resolve();
48
+ return new Promise((resolve) => {
49
+ const done = () => {
50
+ clearTimeout(timer);
51
+ off();
52
+ resolve();
53
+ };
54
+ const timer = setTimeout(done, ms);
55
+ const off = frozen.subscribe(() => {
56
+ if (shown()) done();
57
+ });
58
+ });
59
+ }
60
+ async function importProfile(connection, file, options, root) {
61
+ const sent = await upload(file, root);
62
+ try {
63
+ const answer = await connection.control.importProfile(
64
+ {
65
+ upload: sent.upload,
66
+ data: sent.data,
67
+ again: options.again === true,
68
+ preview: options.preview
69
+ },
70
+ BACKGROUND_CONTEXT
71
+ );
72
+ if (answer.error) throw new Error(sentence(answer.error));
73
+ await listed(connection, answer.cones);
74
+ return {
75
+ preview: answer.preview ? shownPreview(answer.preview) : null,
76
+ cones: answer.cones,
77
+ report: answer.report,
78
+ text: answer.text.trim()
79
+ };
80
+ } finally {
81
+ await sent.done();
82
+ }
83
+ }
84
+ export {
85
+ DATA_MAX,
86
+ IDLE_IMPORT,
87
+ LISTED_MS,
88
+ importProfile,
89
+ listed,
90
+ shownPreview,
91
+ upload
92
+ };
93
+ //# sourceMappingURL=import-port.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/spectrum/import-port.ts"],
4
+ "sourcesContent": ["import type {\n ProfileImportPreview,\n ProfileImportProgress,\n ProfileImportResult,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AgentConnection } from '../client.ts';\nimport { IMPORTS_DIR } from '../freezer/paths.ts';\nimport type { ImportPreview } from '../freezer/v6.ts';\nimport { opfsDirectory } from '../opfs-pool.ts';\n\nexport const DATA_MAX = 16 * 1024 * 1024;\n\nexport type ShownPreview = ProfileImportPreview;\n\nexport type ShownImport = ProfileImportResult;\n\nexport const IDLE_IMPORT: ProfileImportProgress = { phase: 'idle', done: 0, total: 0, text: '' };\n\ntype Upload = { upload: string | null; data: string | null; done(): Promise<void> };\n\nconst TOO_BIG =\n 'This profile is too big to send from this device. Import it in the browser that runs SLICC, or with freezer import there.';\n\nfunction base64(bytes: Uint8Array): string {\n let out = '';\n for (let at = 0; at < bytes.length; at += 0x8000)\n out += String.fromCharCode(...bytes.subarray(at, at + 0x8000));\n return btoa(out);\n}\n\nexport async function upload(\n file: Blob,\n root: () => Promise<FileSystemDirectoryHandle> = () => navigator.storage.getDirectory()\n): Promise<Upload> {\n const dir = await Promise.resolve()\n .then(root)\n .then(\n (handle) => opfsDirectory(handle, IMPORTS_DIR),\n () => undefined\n );\n if (dir) {\n const id = crypto.randomUUID();\n const name = `upload-${id}.zip`;\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await file.stream().pipeTo(writable);\n const done = () => dir.removeEntry(name).catch(() => undefined);\n return { upload: id, data: null, done };\n }\n if (file.size > DATA_MAX) throw new Error(TOO_BIG);\n const data = base64(new Uint8Array(await file.arrayBuffer()));\n return { upload: null, data, done: async () => undefined };\n}\n\nfunction sentence(text: string): string {\n const said = text.trim().replace(/^./, (first) => first.toUpperCase());\n return /[.!?]$/.test(said) ? said : `${said}.`;\n}\n\nexport function shownPreview({\n exportId: _,\n line: __,\n createdAt,\n ...rest\n}: ImportPreview): ShownPreview {\n return { ...rest, createdAt: Date.parse(createdAt) };\n}\n\nexport const LISTED_MS = 10_000;\n\nexport function listed(\n connection: Pick<AgentConnection, 'frozen'>,\n ids: readonly string[],\n ms = LISTED_MS\n): Promise<void> {\n const frozen = connection.frozen;\n if (!frozen) return Promise.resolve();\n const shown = () =>\n ids.every((id) => (frozen.value ?? []).some((row) => row.id === id && row.v6));\n if (shown()) return Promise.resolve();\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timer);\n off();\n resolve();\n };\n const timer = setTimeout(done, ms);\n const off = frozen.subscribe(() => {\n if (shown()) done();\n });\n });\n}\n\nexport async function importProfile(\n connection: Pick<AgentConnection, 'control' | 'frozen'>,\n file: Blob,\n options: { preview: boolean; again?: boolean },\n root?: () => Promise<FileSystemDirectoryHandle>\n): Promise<ShownImport> {\n const sent = await upload(file, root);\n try {\n const answer = await connection.control.importProfile(\n {\n upload: sent.upload,\n data: sent.data,\n again: options.again === true,\n preview: options.preview,\n },\n BACKGROUND_CONTEXT\n );\n if (answer.error) throw new Error(sentence(answer.error));\n await listed(connection, answer.cones);\n return {\n preview: answer.preview ? shownPreview(answer.preview) : null,\n cones: answer.cones,\n report: answer.report,\n text: answer.text.trim(),\n };\n } finally {\n await sent.done();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -4,6 +4,7 @@ import type { ApprovalPolicy } from './approvals/policy.ts';
4
4
  import type { Approval } from './approvals/record.ts';
5
5
  import type { ChangesView } from './changes/git.ts';
6
6
  import type { FrozenCone } from './freezer/index.ts';
7
+ import type { ImportProgress } from './freezer/v6.ts';
7
8
  import type { GuestSeat } from './guests/seats.ts';
8
9
  import type { MemoryEntry, MemoryScope } from './memory/format.ts';
9
10
  import type { AgentRemote } from './remote/host.ts';
@@ -26,6 +27,7 @@ export interface AgentConnection {
26
27
  readonly memories?: ReplicatedState<MemoryEntry[]>;
27
28
  readonly memoryScopes?: ReplicatedState<MemoryScope[]>;
28
29
  readonly frozen?: ReplicatedState<FrozenCone[]>;
30
+ readonly importing?: ReplicatedState<ImportProgress>;
29
31
  readonly changes?: ReplicatedState<ChangesView>;
30
32
  readonly monitor?: ReplicatedState<MonitorFeed>;
31
33
  readonly vault?: ReplicatedState<VaultState>;
@@ -23,5 +23,7 @@ export interface HostScoops {
23
23
  runtime: ScoopsRuntime;
24
24
  }
25
25
  export declare function readable(out: string): string;
26
+ type FreezerControl = Pick<FreezerRuntime, 'freeze' | 'newChat' | 'thaw' | 'discard' | 'importProfile' | 'cancelImport'>;
26
27
  export declare function submissionId(value: string): SubmissionId | undefined;
27
- export declare function createAgentControl(harness: Harness, target: Conversation | Cones, deliveries?: Deliveries, licks?: HostLicks, scoops?: HostScoops, skills?: Pick<SkillsRuntime, 'expand' | 'commandsFor'>, sprinkles?: Pick<SprinklesRuntime, 'send' | 'call'>, memory?: Pick<MemoryRuntime, 'save' | 'remove'>, freezer?: Pick<FreezerRuntime, 'freeze' | 'newChat' | 'thaw' | 'discard'>, changes?: Pick<ChangesRuntime, 'open' | 'accept' | 'revert'>, monitor?: Pick<Monitor, 'open' | 'close'>, secrets?: () => readonly SecretName[], uploads?: Uploads, labels?: Pick<LabelsRuntime, 'label'>, guests?: Pick<Guests, 'open' | 'revoke' | 'forgetAlways'>): Omit<AgentControl, 'approvalPolicySet'>;
28
+ export declare function createAgentControl(harness: Harness, target: Conversation | Cones, deliveries?: Deliveries, licks?: HostLicks, scoops?: HostScoops, skills?: Pick<SkillsRuntime, 'expand' | 'commandsFor'>, sprinkles?: Pick<SprinklesRuntime, 'send' | 'call'>, memory?: Pick<MemoryRuntime, 'save' | 'remove'>, freezer?: FreezerControl, changes?: Pick<ChangesRuntime, 'open' | 'accept' | 'revert'>, monitor?: Pick<Monitor, 'open' | 'close'>, secrets?: () => readonly SecretName[], uploads?: Uploads, labels?: Pick<LabelsRuntime, 'label'>, guests?: Pick<Guests, 'open' | 'revoke' | 'forgetAlways'>): Omit<AgentControl, 'approvalPolicySet'>;
29
+ export {};
@@ -0,0 +1 @@
1
+ export declare const IMPORTS_DIR = "/var/lib/slicc/agent/imports";
@@ -2,6 +2,16 @@ import type { ImportDeps } from './v6.ts';
2
2
  import { type Opened, type Parsed, type Unit } from './v6.ts';
3
3
  import { type Writer } from './v6-write.ts';
4
4
  export declare const V6_ROOT = "/root/v6";
5
+ export type Notes = {
6
+ lines: string[];
7
+ skipped: string[];
8
+ shadowed: string[];
9
+ tasks: string[];
10
+ sprinkles: Map<string, Set<string>>;
11
+ crons: string[];
12
+ webhooks: string[];
13
+ placed: Map<string, string>;
14
+ };
5
15
  export type Run = {
6
16
  deps: ImportDeps;
7
17
  opened: Opened;
@@ -9,8 +19,10 @@ export type Run = {
9
19
  writer: Writer;
10
20
  stage: string;
11
21
  date: string;
22
+ notes: Notes;
12
23
  show: (phase: 'writing', done: number, total: number) => void;
13
24
  fresh: Map<string, boolean>;
14
25
  ready: Set<Unit>;
15
26
  };
16
27
  export declare function place(run: Run): Promise<void>;
28
+ export declare function reportOf(run: Run, made: readonly string[]): Promise<string>;
@@ -1,5 +1,6 @@
1
1
  import type { Context } from '@earendil-works/chord';
2
2
  import type { ExecutionEnv } from '@earendil-works/pi-durable/env';
3
+ import type { LickTarget } from '../licks/lick.ts';
3
4
  export declare function same(a: Uint8Array, b: Uint8Array): boolean;
4
5
  export declare class Writer {
5
6
  #private;
@@ -11,8 +12,23 @@ export declare class Writer {
11
12
  later(step: () => Promise<unknown>): void;
12
13
  exists(path: string, env?: ExecutionEnv): Promise<boolean>;
13
14
  tree(root: string, env?: ExecutionEnv): Promise<boolean>;
15
+ direct(path: string): Promise<void>;
14
16
  put(path: string, content: Uint8Array | string, fresh: boolean, env?: ExecutionEnv): Promise<boolean>;
15
17
  sh(command: string): Promise<void>;
16
18
  rollback(): Promise<void>;
17
19
  }
18
20
  export declare function ownTree(writer: Writer, user: string, home: string, roots: Iterable<string>): Promise<void>;
21
+ export declare function remember(writer: Writer, file: string, text: string, rest: {
22
+ file: string;
23
+ date: string;
24
+ }): Promise<'merged' | 'aside' | 'none'>;
25
+ export type CronLine = {
26
+ name: string;
27
+ schedule: string;
28
+ target: LickTarget;
29
+ message: string;
30
+ filter?: string;
31
+ };
32
+ export declare function installCrons(writer: Writer, user: string, crons: readonly CronLine[], date: string): Promise<number>;
33
+ export declare function withoutImported(table: string, names: ReadonlySet<string>): string[];
34
+ export declare function userSection(text: string): string;
@@ -7,7 +7,6 @@ import type { Layout } from '../layout.ts';
7
7
  import { type Licks, type Manifest, type Transcript, type V6Conversation } from './v6-schema.ts';
8
8
  import { type ZipEntry, type ZipSource } from './zip.ts';
9
9
  export declare const V6_KIND = "slicc.v6";
10
- export declare const IMPORTS_DIR = "/var/lib/slicc/agent/imports";
11
10
  export declare const LIMITS: {
12
11
  archive: number;
13
12
  entries: number;
@@ -33,11 +32,12 @@ export interface ImportPreview {
33
32
  skills: string[];
34
33
  crons: number;
35
34
  webhooks: number;
36
- flagged: number;
35
+ flagged: string[];
37
36
  providers: string[];
38
37
  mounts: string[];
39
38
  already: number | null;
40
39
  text: string;
40
+ line: string;
41
41
  }
42
42
  export interface ImportResult {
43
43
  done: boolean;
@@ -45,17 +45,29 @@ export interface ImportResult {
45
45
  cones: string[];
46
46
  report: string | null;
47
47
  text: string;
48
+ line: string;
48
49
  error: string | null;
49
50
  }
50
- export type ImportSource = {
51
+ type ReadSource = {
51
52
  path: string;
52
53
  } | {
53
54
  bytes: Uint8Array;
54
55
  };
56
+ export type ImportSource = ReadSource | {
57
+ upload: string;
58
+ };
59
+ export declare const uploadPath: (id: string) => string;
55
60
  export interface ImportDeps {
56
61
  agents: Agents;
57
62
  env: ExecutionEnv;
58
63
  layout: Layout;
64
+ memoryHome: string;
65
+ providers?: readonly Account[];
66
+ catalog?: {
67
+ getModel(provider: string, id: string): {
68
+ name: string;
69
+ } | undefined;
70
+ };
59
71
  users?: Pick<KernelUsers, 'add' | 'remove'>;
60
72
  envOf?: (cone: string) => Promise<ExecutionEnv | undefined>;
61
73
  opfs?: () => Promise<FileSystemDirectoryHandle>;
@@ -109,7 +121,21 @@ export declare const day: (at: number | string) => string;
109
121
  export declare function textOf(bytes: Uint8Array, name: string): string;
110
122
  export declare function whereOf(manifest: Manifest, name: string): Where;
111
123
  export declare function openProfile(source: ZipSource): Promise<Opened>;
112
- export declare function previewOf(opened: Opened, state: Readonly<AgentsState>): Promise<ImportPreview>;
124
+ export declare function accountsOf(providers: readonly string[]): string[];
125
+ export type Account = {
126
+ readonly id: string;
127
+ readonly name?: string | undefined;
128
+ };
129
+ export declare function listed(names: readonly string[]): string;
130
+ export declare function accountsSplit(providers: readonly string[], known?: readonly Account[]): {
131
+ again: string[];
132
+ missing: string[];
133
+ nameOf: (id: string) => string;
134
+ lacking: string;
135
+ settings: string;
136
+ signIn: string;
137
+ };
138
+ export declare function previewOf(opened: Opened, state: Readonly<AgentsState>, known?: readonly Account[]): Promise<ImportPreview>;
113
139
  export declare function unitsOf(manifest: Manifest, data: Map<string, Uint8Array>): Unit[];
114
140
  export declare function entriesOf(conversation: V6Conversation | undefined, files: Map<string, string>): EntryDraft[];
115
141
  export interface Importer {
@@ -122,3 +148,4 @@ export interface Importer {
122
148
  }
123
149
  export declare const IDLE: ImportProgress;
124
150
  export declare function createImporter(deps: ImportDeps): Importer;
151
+ export {};
@@ -25,10 +25,16 @@ export declare function legacyJobs(text: string): {
25
25
  };
26
26
  export declare function sendCommand(target: LickTarget, message: string, lick?: boolean): string;
27
27
  export declare function relicked(table: string, jobs: readonly LegacyJob[]): string | undefined;
28
+ type Ran = {
29
+ code: number;
30
+ out: string;
31
+ err: string;
32
+ };
28
33
  export declare function readTable(env: ExecutionEnv, user: string, context: Context): Promise<string | CronProblem>;
29
34
  export declare function withoutJobs(table: string, names: ReadonlySet<string>): string[];
30
35
  export declare function scheduleOf(table: string, name: string): string | undefined;
31
36
  export declare function installJobs(env: ExecutionEnv, user: string, jobs: readonly CronJob[], context: Context): Promise<CronProblem[]>;
37
+ export declare function writeTable(env: ExecutionEnv, user: string, table: string, context: Context): Promise<Ran>;
32
38
  export declare function relickJobs(env: ExecutionEnv, user: string, jobs: readonly LegacyJob[], context: Context): Promise<CronProblem[]>;
33
39
  export interface CronRun {
34
40
  job: string;
@@ -37,3 +43,4 @@ export interface CronRun {
37
43
  }
38
44
  export declare function cronText(run: CronRun, at: number): string;
39
45
  export declare function cronLick(run: CronRun, target: LickTarget, message: string): LickEvent;
46
+ export {};
@@ -5,6 +5,7 @@ import type { ApprovalPolicy, ApprovalPolicyChange, ApprovalPolicySet } from './
5
5
  import type { SendAttachment, ShownAttachment } from './attachments.ts';
6
6
  import type { ChangesView } from './changes/git.ts';
7
7
  import type { FrozenCone } from './freezer/index.ts';
8
+ import type { ImportProgress, ImportResult } from './freezer/v6.ts';
8
9
  import type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';
9
10
  import type { GuestDraft, GuestGates, GuestSeat } from './guests/seats.ts';
10
11
  import type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';
@@ -83,6 +84,8 @@ export interface AgentControl {
83
84
  newChat(agentId: string, context: Context): Promise<Created>;
84
85
  thaw(frozenId: string, context: Context): Promise<Created>;
85
86
  discard(frozenId: string, context: Context): Promise<Created>;
87
+ importProfile(request: ImportRequest, context: Context): Promise<ImportResult>;
88
+ importCancel(context: Context): Promise<void>;
86
89
  changesOpen(context: Context): Promise<void>;
87
90
  changeAccept(path: string, context: Context): Promise<Created>;
88
91
  changeRevert(path: string, context: Context): Promise<Created>;
@@ -101,6 +104,12 @@ export interface AgentControl {
101
104
  approvalPolicySet(change: ApprovalPolicyChange, context: Context): Promise<ApprovalPolicySet>;
102
105
  decide(id: string, decision: ApprovalAnswer, reason: string | null, context: Context): Promise<ApprovalDecided>;
103
106
  }
107
+ export interface ImportRequest {
108
+ upload: string | null;
109
+ data: string | null;
110
+ again: boolean;
111
+ preview: boolean;
112
+ }
104
113
  export interface ImageRef {
105
114
  entry: number;
106
115
  message: number;
@@ -244,7 +253,7 @@ export interface AgentSettingsChange {
244
253
  thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;
245
254
  agentId?: string | null;
246
255
  }
247
- export declare const CONTROL_METHODS: ("abort" | "agentCommands" | "approvalPolicySet" | "changeAccept" | "changeRevert" | "changesOpen" | "compact" | "compactAgent" | "configure" | "createCone" | "createScoop" | "decide" | "discard" | "drop" | "freeze" | "guestAlwaysForget" | "guestOpen" | "guestRevoke" | "image" | "memoryRemove" | "memorySave" | "monitorClose" | "monitorOpen" | "newChat" | "reset" | "resolveAgentLick" | "resolveLick" | "rewind" | "rewindAgent" | "selectCone" | "send" | "sprinkleCall" | "sprinkleSend" | "stopAgent" | "thaw" | "toolLabel" | "unqueue" | "wait" | "webhook" | "withdraw")[];
256
+ export declare const CONTROL_METHODS: ("abort" | "agentCommands" | "approvalPolicySet" | "changeAccept" | "changeRevert" | "changesOpen" | "compact" | "compactAgent" | "configure" | "createCone" | "createScoop" | "decide" | "discard" | "drop" | "freeze" | "guestAlwaysForget" | "guestOpen" | "guestRevoke" | "image" | "importCancel" | "importProfile" | "memoryRemove" | "memorySave" | "monitorClose" | "monitorOpen" | "newChat" | "reset" | "resolveAgentLick" | "resolveLick" | "rewind" | "rewindAgent" | "selectCone" | "send" | "sprinkleCall" | "sprinkleSend" | "stopAgent" | "thaw" | "toolLabel" | "unqueue" | "wait" | "webhook" | "withdraw")[];
248
257
  export declare const OWNER_DEVICE_METHODS: readonly (keyof AgentControl & string)[];
249
258
  export declare const CONTROL_READS: readonly (keyof AgentControl & string)[];
250
259
  export declare const AgentControl: RemoteContract;
@@ -260,6 +269,7 @@ export interface AgentTranscript {
260
269
  readonly memories: ReplicatedState<MemoryEntry[]>;
261
270
  readonly memoryScopes: ReplicatedState<MemoryScope[]>;
262
271
  readonly frozen: ReplicatedState<FrozenCone[]>;
272
+ readonly importing: ReplicatedState<ImportProgress>;
263
273
  readonly changes: ReplicatedState<ChangesView>;
264
274
  readonly monitor: ReplicatedState<MonitorFeed>;
265
275
  readonly vault: ReplicatedState<VaultState>;
@@ -276,7 +286,7 @@ export interface Command {
276
286
  description: string;
277
287
  kind: 'prompt' | 'skill' | 'action';
278
288
  }
279
- export declare const TRANSCRIPT_STATES: ("agents" | "approvalPolicy" | "approvals" | "changes" | "commands" | "deliveries" | "frozen" | "guests" | "labels" | "memories" | "memoryScopes" | "monitor" | "privateRevision" | "sprinkles" | "state" | "vault" | "views")[];
289
+ export declare const TRANSCRIPT_STATES: ("agents" | "approvalPolicy" | "approvals" | "changes" | "commands" | "deliveries" | "frozen" | "guests" | "importing" | "labels" | "memories" | "memoryScopes" | "monitor" | "privateRevision" | "sprinkles" | "state" | "vault" | "views")[];
280
290
  export declare const AgentTranscript: RemoteContract;
281
291
  export declare const REMOTE_METHODS: ("abort" | "close" | "next" | "prompt" | "watch")[];
282
292
  export declare const REMOTE_READS: readonly (keyof AgentRemote & string)[];
@@ -1,8 +1,9 @@
1
- import type { Agent, AgentEvents, AgentPort, FrozenCone, Message, Outgoing, SlashCommand, Thinking, UserMessage } from '@ai-ecoverse/slicc-spectrum/ui';
1
+ import type { Agent, AgentEvents, AgentPort, FrozenCone, Message, Outgoing, ProfileImportProgress, SlashCommand, Thinking, UserMessage } from '@ai-ecoverse/slicc-spectrum/ui';
2
2
  import type { AgentConnection } from '../client.ts';
3
3
  import { type VaultHold } from '../secrets/view.ts';
4
4
  import type { Command } from '../services.ts';
5
5
  import { Emitter } from './emitter.ts';
6
+ import { type ShownImport } from './import-port.ts';
6
7
  export declare const CONE = "cone";
7
8
  export declare function slashCommand({ kind, ...command }: Command): SlashCommand;
8
9
  export type AgentHold = VaultHold;
@@ -40,6 +41,12 @@ export declare class AgentAdapter extends Emitter<AgentAdapterEvents> implements
40
41
  createCone(name: string): Promise<Agent>;
41
42
  toolLabel(agentId: string, callIds: readonly string[]): Promise<string | null>;
42
43
  frozen(): readonly FrozenCone[];
44
+ importProfile(file: Blob, options: {
45
+ preview: boolean;
46
+ again?: boolean;
47
+ }): Promise<ShownImport>;
48
+ importCancel(): void;
49
+ importing(): ProfileImportProgress;
43
50
  thaw(id: string): Agent | null;
44
51
  discard(id: string): void;
45
52
  }
@@ -0,0 +1,21 @@
1
+ import type { ProfileImportPreview, ProfileImportProgress, ProfileImportResult } from '@ai-ecoverse/slicc-spectrum/ui';
2
+ import type { AgentConnection } from '../client.ts';
3
+ import type { ImportPreview } from '../freezer/v6.ts';
4
+ export declare const DATA_MAX: number;
5
+ export type ShownPreview = ProfileImportPreview;
6
+ export type ShownImport = ProfileImportResult;
7
+ export declare const IDLE_IMPORT: ProfileImportProgress;
8
+ type Upload = {
9
+ upload: string | null;
10
+ data: string | null;
11
+ done(): Promise<void>;
12
+ };
13
+ export declare function upload(file: Blob, root?: () => Promise<FileSystemDirectoryHandle>): Promise<Upload>;
14
+ export declare function shownPreview({ exportId: _, line: __, createdAt, ...rest }: ImportPreview): ShownPreview;
15
+ export declare const LISTED_MS = 10000;
16
+ export declare function listed(connection: Pick<AgentConnection, 'frozen'>, ids: readonly string[], ms?: number): Promise<void>;
17
+ export declare function importProfile(connection: Pick<AgentConnection, 'control' | 'frozen'>, file: Blob, options: {
18
+ preview: boolean;
19
+ again?: boolean;
20
+ }, root?: () => Promise<FileSystemDirectoryHandle>): Promise<ShownImport>;
21
+ export {};