@ai-ecoverse/slicc-agent 6.19.11 → 6.19.13

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/kernel/sightings.ts"],
4
+ "sourcesContent": ["import type { KernelClient, KernelProcess } from './client.ts';\nimport { boundedPs, PS_MS } from './jobs.ts';\n\nexport const TAINT_TAG = 'slicc-taint:';\nexport const CRON_TAGS = '/var/spool/cron/tags';\n\nconst TAGGED = /slicc-taint:[0-9a-f-]+/g;\n\nexport type SeenRow = {\n pid: number;\n started?: number;\n tag?: string;\n tags?: readonly string[];\n};\n\nexport interface Sightings {\n mark(): number;\n spawned(process: KernelProcess, tag: string): void;\n observe(rows: readonly SeenRow[], at: number): Promise<void>;\n recent(pid: number, rows: readonly SeenRow[], at: number): string[];\n}\n\ntype Entry = { seen: number; gone: number | undefined };\n\ntype Client = Pick<KernelClient, 'ps' | 'fs'>;\n\nexport function tagsOf(row: { tag?: string; tags?: readonly string[] }): string[] {\n if (row.tags?.length) return [...row.tags];\n return row.tag === undefined ? [] : [row.tag];\n}\n\nconst keyOf = (row: SeenRow) => `${row.pid}:${row.started ?? ''}`;\n\nexport async function cronHeld(client: Client): Promise<Set<string> | null> {\n try {\n return new Set((await client.fs.readText(CRON_TAGS)).match(TAGGED) ?? []);\n } catch (error) {\n return (error as { code?: unknown }).code === 'ENOENT' ? new Set() : null;\n }\n}\n\nexport function sightings(\n client: Client,\n poll = PS_MS,\n warn: (message: string) => void = () => undefined\n): Sightings {\n const entries = new Map<string, Entry>();\n const first = new Map<string, number>();\n let clock = 0;\n let newest = -1;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const mark = () => ++clock;\n const alive = (tag: string, at: number) => {\n const found = entries.get(tag) ?? { seen: at, gone: undefined };\n found.seen = Math.max(found.seen, at);\n found.gone = undefined;\n entries.set(tag, found);\n };\n const stamp = (rows: readonly SeenRow[], at: number) => {\n const keys = new Set(rows.map(keyOf));\n for (const key of keys) first.set(key, Math.min(first.get(key) ?? at, at));\n if (at < newest) return;\n newest = at;\n for (const key of [...first.keys()]) if (!keys.has(key)) first.delete(key);\n };\n const observe = async (rows: readonly SeenRow[], at: number) => {\n const held = await cronHeld(client);\n const carried = new Set(\n rows.flatMap((row) => tagsOf(row).filter((tag) => tag.startsWith(TAINT_TAG)))\n );\n for (const tag of [...carried, ...(held ?? entries.keys())]) alive(tag, at);\n for (const [tag, found] of entries)\n if (\n !carried.has(tag) &&\n held &&\n !held.has(tag) &&\n found.gone === undefined &&\n found.seen < at\n )\n found.gone = at;\n stamp(rows, at);\n const waiting = [...entries].some(\n ([tag, found]) => found.gone === undefined && !held?.has(tag)\n );\n if (waiting && held && timer === undefined) timer = setTimeout(tick, poll);\n };\n const fresh = async () => {\n const at = mark();\n const rows = await boundedPs(client, warn, poll);\n if (rows) await observe(rows, at).catch(() => undefined);\n };\n function tick() {\n timer = undefined;\n void fresh();\n }\n return {\n mark,\n spawned(process, tag) {\n alive(tag, mark());\n const ended = () => void fresh();\n process.exited.then(ended, ended);\n },\n observe,\n recent(pid, rows, at) {\n const row = rows.find((candidate) => candidate.pid === pid);\n const since = (row && first.get(keyOf(row))) ?? at;\n return [...entries]\n .filter(([, found]) => found.gone === undefined || found.gone >= since)\n .map(([tag]) => tag);\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/main.js CHANGED
@@ -25,10 +25,11 @@ import {
25
25
  import { codexFetch } from "./codex.js";
26
26
  import { attachFreezer } from "./freezer/index.js";
27
27
  import { lateGelatiere } from "./gelatiere/index.js";
28
+ import { runTag } from "./guests/tags.js";
28
29
  import { hostAgent } from "./host.js";
29
30
  import { imageReads } from "./images/index.js";
30
31
  import { createActivity } from "./kernel/activity.js";
31
- import { agentUsers, warnSupport } from "./kernel/agent-users.js";
32
+ import { agentUsers, modeOf, warnSupport } from "./kernel/agent-users.js";
32
33
  import { HOME, kernelEnvironment, SliccKernelEnv } from "./kernel/env.js";
33
34
  import { processGroups } from "./kernel/groups.js";
34
35
  import { backgroundJobs } from "./kernel/jobs.js";
@@ -325,6 +326,9 @@ function freezerOf(agent, parts) {
325
326
  parts.licks.licks.guard(freezer.frozenTarget);
326
327
  return freezer;
327
328
  }
329
+ function kernelParts(client) {
330
+ return [createActivity(), processGroups(client), backgroundJobs(client)];
331
+ }
328
332
  async function start(scope, ports, options, vault) {
329
333
  const { client, users, home, at, wiped } = await attached(ports, options);
330
334
  const ready = await prepare(scope, { client, home, vault }, options);
@@ -340,11 +344,7 @@ async function start(scope, ports, options, vault) {
340
344
  const skills = setupSkills(registry, licks.licks);
341
345
  registry.install(secretsExtension({ names, vault }));
342
346
  const titles = setupTitles(registry, models, home, at, () => opened);
343
- const [activity, groups, jobs] = [
344
- createActivity(),
345
- processGroups(client),
346
- backgroundJobs(client)
347
- ];
347
+ const [activity, groups, jobs] = kernelParts(client);
348
348
  const model = options.model ?? await ready.defaultModel();
349
349
  let opened;
350
350
  const people = users ? agentUsers(users, client, home, () => opened?.agents) : void 0;
@@ -355,7 +355,8 @@ async function start(scope, ports, options, vault) {
355
355
  identify: identity(() => opened?.agents, model),
356
356
  scrub: vault,
357
357
  spawn: shellGrants(names),
358
- ...people ? { route: people.route } : {}
358
+ ...people ? { route: people.route } : {},
359
+ ...modeOf(client) === "off" ? {} : { tagOf: runTag(() => opened?.harness) }
359
360
  });
360
361
  const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });
361
362
  opened = agent;
package/dist/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["import { attachKernel } from '@ai-ecoverse/slicc-kernel';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n createRegistry,\n type ModelRef,\n type Storage,\n type ToolRegistration,\n} from '@earendil-works/pi-durable';\nimport { CodingTools } from '@earendil-works/pi-durable/tools';\nimport { type Agent, type AgentOptions, openAgent } from './agent.ts';\nimport {\n type ApprovalJudge,\n approvalJudge,\n judgeModelOf,\n judgeSpender,\n ownerIntent,\n seedPolicy,\n verdictRecorder,\n} from './approvals/index.ts';\nimport { browserGuard } from './browser/guard.ts';\nimport { attachChanges, CHANGES_MS } from './changes/index.ts';\nimport {\n codemodeExtension,\n codemodeTool,\n disabledBySettings,\n locateWasm,\n sandboxFactory,\n} from './codemode/index.ts';\nimport { codexFetch } from './codex.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { lateGelatiere } from './gelatiere/index.ts';\nimport { type AgentHost, hostAgent } from './host.ts';\nimport { imageReads } from './images/index.ts';\nimport { createActivity } from './kernel/activity.ts';\nimport { type AgentUsers, agentUsers, warnSupport } from './kernel/agent-users.ts';\nimport type { KernelClient } from './kernel/client.ts';\nimport { HOME, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nimport { processGroups } from './kernel/groups.ts';\nimport { backgroundJobs } from './kernel/jobs.ts';\nimport { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { type Licks, setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { type McpAccounts, setupMcp } from './mcp/index.ts';\nimport type { MemoryEntry } from './memory/format.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Reach, type Transport, transportFetch, transportReach } from './net.ts';\nimport { sliccPrompt } from './prompt.ts';\nimport { AZURE, azureBase } from './providers.ts';\nimport { createPages } from './remote/pages.ts';\nimport { identity } from './scoops/identity.ts';\nimport { type Assets, packageAssets, type ScoopsRuntime, setupScoops } from './scoops/index.ts';\nimport { vaultCredentials } from './secrets/credentials.ts';\nimport {\n BEDROCK_ENDPOINTS,\n type ModelBases,\n modelRoute,\n vaultEndpoints,\n} from './secrets/endpoints.ts';\nimport { secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { grantFetch, mcpFetch, vaultFetch } from './secrets/fetch.ts';\nimport { keysMoved, type Wiped, wipeLegacy } from './secrets/legacy.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { type VaultRecords, vaultRecords } from './secrets/records.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { fileStore, type PlainStore } from './secrets/store.ts';\nimport { listenVault, Vault, WAITING_MS } from './secrets/vault.ts';\nimport { type Choosable, unfreeze, unfreezeCreated } from './selection.ts';\nimport {\n BEDROCK,\n catalogStore,\n createAgentSettings,\n createSliccModels,\n providerFields,\n resolveDefaultModel,\n sliccProviders,\n} from './settings.ts';\nimport { RELOAD_MS, setupSkills } from './skills/index.ts';\nimport { setupSprinkles } from './sprinkles/index.ts';\nimport { openOpfsSqliteStorage } from './sqlite.ts';\nimport {\n agentVersion,\n browserConnected,\n commandsOnPath,\n kernelBoot,\n transportName,\n} from './system.ts';\nimport { titlesExtension } from './titles/extension.ts';\nimport { labeler, settingsText, titler } from './titles/generate.ts';\nimport { attachLabels } from './titles/labels.ts';\nimport { type KernelPorts, kernelPorts, serveConnections, type WorkerScope } from './worker.ts';\n\nexport interface AgentWorkerScope extends WorkerScope {\n fetch: typeof fetch;\n location: { origin: string };\n}\n\nexport type KernelAttach = (port: MessagePort) => Promise<KernelClient & { transport: Transport }>;\n\nexport interface AgentWorkerOptions {\n model?: ModelRef;\n providers?: Provider[];\n attach?: KernelAttach;\n store?: () => Promise<PlainStore>;\n storage?: () => Promise<Storage>;\n assets?: Assets;\n codemodeWasm?: () => Promise<WebAssembly.Module | undefined>;\n codemodeWorker?: string | URL;\n catalog?: string;\n users?: boolean;\n mcpRedirect?: string;\n approvalMs?: number;\n}\n\nexport function usersOf(\n admin: MessagePort | undefined,\n wanted: boolean | undefined,\n attach: KernelAttach\n): UserClients | undefined {\n if (!admin) return undefined;\n if (wanted === false) {\n admin.close();\n return undefined;\n }\n return userClients(adminOver(admin), attach as (port: MessagePort) => Promise<UserClient>);\n}\n\nexport const STORE_DIR = '/.slicc';\nexport const ACCOUNTS_FILE = `${STORE_DIR}/accounts.json`;\nexport const MODELS_FILE = `${STORE_DIR}/models.json`;\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\n const wiped = await wipeLegacy();\n const attach: KernelAttach = options.attach ?? attachKernel;\n const { kernel, admin } = await ports;\n const client = await attach(kernel);\n const users = usersOf(admin, options.users, attach);\n await warnSupport(users, client, options.users);\n const home = new SliccKernelEnv(client, { cwd: HOME });\n await privateStore(home);\n return {\n client,\n users,\n home,\n wiped,\n at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) },\n };\n}\n\nfunction privateStore(env: SliccKernelEnv): Promise<unknown> {\n return env.exec(`mkdir -p ${STORE_DIR} && chmod 700 ${STORE_DIR}`, undefined, BACKGROUND_CONTEXT);\n}\n\nasync function codemodeTools(\n client: KernelClient,\n options: AgentWorkerOptions,\n native: typeof fetch,\n extra: Parameters<typeof codemodeTool>[0]['extra'],\n dir = `${HOME}/.pi/agent`\n) {\n const settings = await client.fs.readFile(`${dir}/settings.json`).catch(() => undefined);\n if (disabledBySettings(settings === undefined ? undefined : new TextDecoder().decode(settings)))\n return [];\n const sandbox = sandboxFactory(\n options.codemodeWasm ?? (() => locateWasm(native, new URL(import.meta.url))),\n options.codemodeWorker\n );\n return [\n codemodeTool({ declared: CodingTools.tools as readonly ToolRegistration[], sandbox, extra }),\n ];\n}\n\nexport function seesImages(models: Pick<Models, 'getModel'>, ref: ModelRef | undefined): boolean {\n const found = ref && models.getModel(ref.provider, ref.modelId);\n return found ? found.input.includes('image') : true;\n}\n\nexport const MCP_CALLBACK = '/oauth/mcp-callback';\n\nasync function openUnfrozen(\n options: AgentWorkerOptions,\n { choosable: chosen }: { choosable: Choosable },\n base: Omit<AgentOptions, 'storage' | 'beforeResume' | 'conversationCreated'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n conversationCreated: unfreezeCreated(chosen),\n beforeResume: (harness, using) => unfreeze(harness, storage, chosen, using),\n });\n}\n\nasync function secretsFor(home: SliccKernelEnv, vault: Vault) {\n scrubWith(vault);\n const names = secretNames(home, vault);\n await names.refresh(BACKGROUND_CONTEXT);\n return names;\n}\n\nexport function modelBases(\n providers: readonly Provider[],\n models: Pick<ReturnType<typeof createSliccModels>, 'getModels'>,\n env: (providerId: string) => Readonly<Record<string, string>> | undefined = () => undefined\n): ModelBases[] {\n return providers.map((provider) => ({\n provider: provider.id,\n urls: [\n ...new Set(\n [\n provider.baseUrl,\n ...models.getModels(provider.id).map((model) => model.baseUrl),\n ...(provider.id === BEDROCK ? BEDROCK_ENDPOINTS : []),\n ...(provider.id === AZURE ? [azureBase(env(provider.id) ?? {})] : []),\n ].filter((url): url is string => typeof url === 'string' && url !== '')\n ),\n ],\n }));\n}\n\nfunction mcpVault(\n vault: Vault,\n made: { store: PlainStore; records: VaultRecords; endpoints: ReturnType<typeof vaultEndpoints> }\n) {\n const { store, records, endpoints } = made;\n return {\n store,\n vault: {\n records,\n fetch: (server: string, base: typeof fetch) => mcpFetch(vault, base, server),\n grant: (server: string, base: typeof fetch) => grantFetch(vault, server, base),\n servers: endpoints.servers,\n token: endpoints.token,\n },\n };\n}\n\nfunction hostSecrets(\n vault: Vault,\n names: Awaited<ReturnType<typeof secretsFor>>,\n parts: readonly { close(): void }[]\n) {\n return {\n vault: vault.state,\n list: () => names.state.value,\n close: () => {\n for (const part of parts) part.close();\n },\n };\n}\n\nasync function modelsOf(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions,\n given: { vault: Vault; home: SliccKernelEnv; transport: typeof fetch; version: string }\n) {\n const { vault, home, transport, version } = given;\n const store = await (options.store ?? (async () => fileStore(home, ACCOUNTS_FILE)))();\n const records = vaultRecords(vault);\n const loaded = records.refresh(BACKGROUND_CONTEXT).catch(() => undefined);\n const providers = options.providers ?? sliccProviders(version);\n const fields = await providerFields(store, providers);\n const credentials = vaultCredentials(records, fields.env, fields.ready);\n const models = createSliccModels(\n credentials,\n providers,\n catalogStore(fileStore(home, MODELS_FILE))\n );\n await models.refresh({ allowNetwork: false }).catch(() => undefined);\n const bases = () => modelBases(providers, models, fields.env);\n scope.fetch = codexFetch(\n vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value),\n records.rejecting\n )\n );\n const endpoints = vaultEndpoints(vault);\n const defaultModel = async () => {\n await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);\n return resolveDefaultModel(credentials, providers, models);\n };\n return { store, records, providers, fields, models, bases, endpoints, defaultModel };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>, origin: string) {\n const registry = createRegistry();\n registry.install(CodingTools);\n registry.install(browserGuard([origin]));\n registry.install(sliccPrompt(facts));\n const read = (CodingTools.tools as readonly ToolRegistration[]).find(\n (tool) => tool.name === 'read'\n ) as ToolRegistration;\n registry.install(imageReads(read));\n return registry;\n}\n\nasync function factsOf(client: KernelClient & { transport: Transport }, native: typeof fetch) {\n return {\n version: await agentVersion((url) => native(url)),\n commands: await commandsOnPath(client),\n transport: transportName(client.transport),\n browser: await browserConnected(client),\n };\n}\n\nfunction routeFetch(scope: AgentWorkerScope, client: KernelClient & { transport: Transport }) {\n const native = scope.fetch.bind(scope);\n const loopback = client.loopbackFetch?.bind(client);\n const transport = transportFetch(client.transport, scope.location.origin, native, loopback);\n scope.fetch = transport;\n return { native, transport };\n}\n\nasync function prepare(\n scope: AgentWorkerScope,\n kernel: { client: KernelClient & { transport: Transport }; home: SliccKernelEnv; vault: Vault },\n options: AgentWorkerOptions\n) {\n const names = await secretsFor(kernel.home, kernel.vault);\n const { native, transport } = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n const made = await modelsOf(scope, options, {\n vault: kernel.vault,\n home: kernel.home,\n transport,\n version: facts.version,\n });\n return {\n names,\n native,\n transport,\n facts,\n ...made,\n reach: transportReach(kernel.client),\n registry: baseRegistry(facts, scope.location.origin),\n };\n}\n\nfunction modelsOfAgent(\n agent: Agent,\n settings: Awaited<ReturnType<typeof createAgentSettings>>,\n catalog: Models,\n vault: Vault\n) {\n const locked = () => vault.state.value.locked !== 'no';\n return modelsCommand({ agents: agent.agents, settings, catalog, locked });\n}\n\nasync function settingsOf(\n made: Awaited<ReturnType<typeof modelsOf>> & { reach: Reach },\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped; licks: Licks }\n) {\n const { models, records, fields, providers, reach } = made;\n const keys = await keysMoved(moved.agent.harness, { records, vault: moved.vault }, moved.wiped);\n const settings = await createAgentSettings(models, { records, fields }, providers, {\n mcp,\n moved: keys,\n reach,\n vault: moved.vault,\n });\n settings.state.subscribe(() => void moved.licks.flush(BACKGROUND_CONTEXT).catch(() => undefined));\n return settings;\n}\n\nasync function setupApprovals(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n stored: { readonly value: readonly MemoryEntry[] | undefined },\n options: Pick<AgentWorkerOptions, 'approvalMs'>\n) {\n const memories = () => stored.value;\n const { approvalMs } = options;\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n const intent = ownerIntent({ env: home, agents: agent.agents, memories });\n const judge: ApprovalJudge = {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent,\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\n return { judge, intent, ...(approvalMs ? { approvalMs } : {}) };\n}\n\nfunction setupTitles(\n registry: ReturnType<typeof createRegistry>,\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n opened: () => Agent | undefined\n) {\n const settings = settingsText(home, HOME, at.agentDir);\n const titleFn = titler(models, settings);\n const titles = titlesExtension({\n agents: () => opened()?.agents,\n harness: () => opened()?.harness,\n title: () => titleFn,\n });\n registry.install(titles.extension);\n return { titleFn, cancel: titles.cancel, label: labeler(models, settings) };\n}\n\nfunction freezerOf(\n agent: Agent,\n parts: {\n home: SliccKernelEnv;\n memory: ReturnType<typeof setupMemory>;\n titles: ReturnType<typeof setupTitles>;\n people: AgentUsers | undefined;\n users: UserClients | undefined;\n ready: { providers: readonly Provider[]; models: ReturnType<typeof createSliccModels> };\n licks: ReturnType<typeof setupLicks>;\n }\n) {\n const { home, memory, titles, people, users, ready } = parts;\n const freezer = attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titles.titleFn,\n cancelTitle: titles.cancel,\n ...(people ? { layout: people.layout } : {}),\n imports: {\n env: home,\n memoryHome: people ? ROOT_HOME : HOME,\n catalog: ready.models,\n providers: ready.providers,\n ...(users ? { users: users.users } : {}),\n ...(people ? { envOf: (cone: string) => people.envOfAgent(`cone:${cone}`) } : {}),\n },\n });\n parts.licks.licks.guard(freezer.frozenTarget);\n return freezer;\n}\n\nasync function start(\n scope: AgentWorkerScope,\n ports: Promise<KernelPorts>,\n options: AgentWorkerOptions,\n vault: Vault\n): Promise<AgentHost> {\n const { client, users, home, at, wiped } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, transport, facts, models, registry, records, endpoints } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n const mcp = setupMcp(registry);\n const codemode = await codemodeTools(client, options, native, mcp.codemode, at.agentDir);\n registry.install(codemodeExtension(codemode));\n const licks = setupLicks(registry, transport);\n licks.licks.triage(lickTriage(models));\n const scoops = setupScoops(registry, licks.licks, [...coding, ...codemode, ...memory.tools]);\n const skills = setupSkills(registry, licks.licks);\n registry.install(secretsExtension({ names, vault }));\n const titles = setupTitles(registry, models, home, at, () => opened);\n const [activity, groups, jobs] = [\n createActivity(),\n processGroups(client),\n backgroundJobs(client),\n ];\n const model = options.model ?? (await ready.defaultModel());\n let opened: Agent | undefined;\n const people = users ? agentUsers(users, client, home, () => opened?.agents) : undefined;\n const environment = kernelEnvironment(client, {\n activity,\n groups,\n jobs,\n identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });\n opened = agent;\n await people?.start(agent.agents);\n const freezer = freezerOf(agent, { home, memory, titles, people, users, ready, licks });\n await freezer.swept;\n const sources = licks.attach(agent, {\n env: home,\n home: HOME,\n models,\n activity,\n jobs,\n ...(people ? { dirs: () => people.lickDirs(), cronUser: people.cronUser.bind(people) } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n const booted = { version: facts.version, boot: await kernelBoot(client) };\n await sources.boot(booted, BACKGROUND_CONTEXT);\n const skillsRuntime = await skills.attach(\n {\n env: home,\n ...at,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people ? { people: people.people } : {}),\n },\n BACKGROUND_CONTEXT\n );\n const mcpRuntime = await mcp.attach(\n {\n env: home,\n ...at,\n ...mcpVault(vault, ready),\n licks: licks.licks,\n fetch: transport,\n version: facts.version,\n reloadMs: RELOAD_MS,\n codemode: codemode.length > 0,\n cors: pageOnly(client.transport),\n redirect: options.mcpRedirect ?? new URL(MCP_CALLBACK, scope.location.origin).href,\n },\n BACKGROUND_CONTEXT\n );\n const gelatiere = lateGelatiere();\n const sprinkles = await setupSprinkles().attach(\n {\n intercept: gelatiere.intercept,\n harness: agent.harness,\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people?.sprinkles() ?? {}),\n },\n BACKGROUND_CONTEXT\n );\n people?.follow([sources, skillsRuntime, sprinkles]);\n let roles: ScoopsRuntime | undefined;\n const memoryRuntime = await memory.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n ...at,\n ...(people ? { home: ROOT_HOME } : {}),\n reloadMs: RELOAD_MS,\n roles: async (using) => roles?.roles(using),\n },\n BACKGROUND_CONTEXT\n );\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped, licks: licks.licks });\n const pages = createPages({ claim: sprinkles.claim });\n const runtime = await scoops.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n groups,\n env: home,\n envOf: async (conversationId, context) => environment({ conversationId }, context),\n ...at,\n ...(people\n ? { layout: people.layout, spools: people.spools, enforced: people.enforced }\n : {}),\n alive: alive(client),\n reads: skillsRuntime.dirs,\n memory: memoryRuntime.command,\n gelatiere: gelatiere.command,\n freezer: freezer.command,\n models: modelsOfAgent(agent, settings, models, vault),\n panel: pages.command,\n webhook: sources.webhook,\n mcp: mcp.direct,\n ...(options.assets ? { assets: options.assets } : {}),\n },\n BACKGROUND_CONTEXT\n );\n roles = runtime;\n gelatiere.attach({\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n home: HOME,\n ...(await people?.gelatiere(home)),\n scoops: scoops.scoops,\n roles: runtime.roles,\n assets: options.assets ?? packageAssets(),\n fetch: scope.fetch,\n skills: skillsRuntime.skills,\n ...(options.catalog ? { catalog: options.catalog } : {}),\n });\n await memoryRuntime.reload(BACKGROUND_CONTEXT).catch(() => undefined);\n return hostAgent(agent, {\n ...(await setupApprovals(models, home, at, agent, memoryRuntime.memories, options)),\n settings,\n licks: { licks: licks.licks, sources },\n scoops: { scoops: scoops.scoops, runtime },\n skills: skillsRuntime,\n sprinkles,\n memory: memoryRuntime,\n freezer,\n changes: attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS }),\n pages,\n labels: await attachLabels({ ...agent, label: titles.label, vault: vault.state }),\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: hostSecrets(vault, names, [names, records, endpoints]),\n uploads: {\n env: environment,\n sees: (ref) => seesImages(models, ref),\n },\n monitor: {\n kernel: client,\n groups,\n ...(users ? { users: () => users.users.list() } : {}),\n },\n });\n}\n\nexport function alive(client: KernelClient) {\n return async (pid: number): Promise<boolean> => {\n if (!client.ps) return true;\n return (await client.ps()).some((process) => process.pid === pid);\n };\n}\n\nexport function runAgentWorker(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions = {}\n): Promise<AgentHost> {\n const vault = new Vault();\n listenVault(scope, vault);\n const host = start(scope, kernelPorts(scope), options, vault);\n host.catch(() => undefined);\n serveConnections(scope, host);\n return host;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { attachKernel } from '@ai-ecoverse/slicc-kernel';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n createRegistry,\n type ModelRef,\n type Storage,\n type ToolRegistration,\n} from '@earendil-works/pi-durable';\nimport { CodingTools } from '@earendil-works/pi-durable/tools';\nimport { type Agent, type AgentOptions, openAgent } from './agent.ts';\nimport {\n type ApprovalJudge,\n approvalJudge,\n judgeModelOf,\n judgeSpender,\n ownerIntent,\n seedPolicy,\n verdictRecorder,\n} from './approvals/index.ts';\nimport { browserGuard } from './browser/guard.ts';\nimport { attachChanges, CHANGES_MS } from './changes/index.ts';\nimport {\n codemodeExtension,\n codemodeTool,\n disabledBySettings,\n locateWasm,\n sandboxFactory,\n} from './codemode/index.ts';\nimport { codexFetch } from './codex.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { lateGelatiere } from './gelatiere/index.ts';\nimport { runTag } from './guests/tags.ts';\nimport { type AgentHost, hostAgent } from './host.ts';\nimport { imageReads } from './images/index.ts';\nimport { createActivity } from './kernel/activity.ts';\nimport { type AgentUsers, agentUsers, modeOf, warnSupport } from './kernel/agent-users.ts';\nimport type { KernelClient } from './kernel/client.ts';\nimport { HOME, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nimport { processGroups } from './kernel/groups.ts';\nimport { backgroundJobs } from './kernel/jobs.ts';\nimport { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { type Licks, setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { type McpAccounts, setupMcp } from './mcp/index.ts';\nimport type { MemoryEntry } from './memory/format.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Reach, type Transport, transportFetch, transportReach } from './net.ts';\nimport { sliccPrompt } from './prompt.ts';\nimport { AZURE, azureBase } from './providers.ts';\nimport { createPages } from './remote/pages.ts';\nimport { identity } from './scoops/identity.ts';\nimport { type Assets, packageAssets, type ScoopsRuntime, setupScoops } from './scoops/index.ts';\nimport { vaultCredentials } from './secrets/credentials.ts';\nimport {\n BEDROCK_ENDPOINTS,\n type ModelBases,\n modelRoute,\n vaultEndpoints,\n} from './secrets/endpoints.ts';\nimport { secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { grantFetch, mcpFetch, vaultFetch } from './secrets/fetch.ts';\nimport { keysMoved, type Wiped, wipeLegacy } from './secrets/legacy.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { type VaultRecords, vaultRecords } from './secrets/records.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { fileStore, type PlainStore } from './secrets/store.ts';\nimport { listenVault, Vault, WAITING_MS } from './secrets/vault.ts';\nimport { type Choosable, unfreeze, unfreezeCreated } from './selection.ts';\nimport {\n BEDROCK,\n catalogStore,\n createAgentSettings,\n createSliccModels,\n providerFields,\n resolveDefaultModel,\n sliccProviders,\n} from './settings.ts';\nimport { RELOAD_MS, setupSkills } from './skills/index.ts';\nimport { setupSprinkles } from './sprinkles/index.ts';\nimport { openOpfsSqliteStorage } from './sqlite.ts';\nimport {\n agentVersion,\n browserConnected,\n commandsOnPath,\n kernelBoot,\n transportName,\n} from './system.ts';\nimport { titlesExtension } from './titles/extension.ts';\nimport { labeler, settingsText, titler } from './titles/generate.ts';\nimport { attachLabels } from './titles/labels.ts';\nimport { type KernelPorts, kernelPorts, serveConnections, type WorkerScope } from './worker.ts';\n\nexport interface AgentWorkerScope extends WorkerScope {\n fetch: typeof fetch;\n location: { origin: string };\n}\n\nexport type KernelAttach = (port: MessagePort) => Promise<KernelClient & { transport: Transport }>;\n\nexport interface AgentWorkerOptions {\n model?: ModelRef;\n providers?: Provider[];\n attach?: KernelAttach;\n store?: () => Promise<PlainStore>;\n storage?: () => Promise<Storage>;\n assets?: Assets;\n codemodeWasm?: () => Promise<WebAssembly.Module | undefined>;\n codemodeWorker?: string | URL;\n catalog?: string;\n users?: boolean;\n mcpRedirect?: string;\n approvalMs?: number;\n}\n\nexport function usersOf(\n admin: MessagePort | undefined,\n wanted: boolean | undefined,\n attach: KernelAttach\n): UserClients | undefined {\n if (!admin) return undefined;\n if (wanted === false) {\n admin.close();\n return undefined;\n }\n return userClients(adminOver(admin), attach as (port: MessagePort) => Promise<UserClient>);\n}\n\nexport const STORE_DIR = '/.slicc';\nexport const ACCOUNTS_FILE = `${STORE_DIR}/accounts.json`;\nexport const MODELS_FILE = `${STORE_DIR}/models.json`;\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\n const wiped = await wipeLegacy();\n const attach: KernelAttach = options.attach ?? attachKernel;\n const { kernel, admin } = await ports;\n const client = await attach(kernel);\n const users = usersOf(admin, options.users, attach);\n await warnSupport(users, client, options.users);\n const home = new SliccKernelEnv(client, { cwd: HOME });\n await privateStore(home);\n return {\n client,\n users,\n home,\n wiped,\n at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) },\n };\n}\n\nfunction privateStore(env: SliccKernelEnv): Promise<unknown> {\n return env.exec(`mkdir -p ${STORE_DIR} && chmod 700 ${STORE_DIR}`, undefined, BACKGROUND_CONTEXT);\n}\n\nasync function codemodeTools(\n client: KernelClient,\n options: AgentWorkerOptions,\n native: typeof fetch,\n extra: Parameters<typeof codemodeTool>[0]['extra'],\n dir = `${HOME}/.pi/agent`\n) {\n const settings = await client.fs.readFile(`${dir}/settings.json`).catch(() => undefined);\n if (disabledBySettings(settings === undefined ? undefined : new TextDecoder().decode(settings)))\n return [];\n const sandbox = sandboxFactory(\n options.codemodeWasm ?? (() => locateWasm(native, new URL(import.meta.url))),\n options.codemodeWorker\n );\n return [\n codemodeTool({ declared: CodingTools.tools as readonly ToolRegistration[], sandbox, extra }),\n ];\n}\n\nexport function seesImages(models: Pick<Models, 'getModel'>, ref: ModelRef | undefined): boolean {\n const found = ref && models.getModel(ref.provider, ref.modelId);\n return found ? found.input.includes('image') : true;\n}\n\nexport const MCP_CALLBACK = '/oauth/mcp-callback';\n\nasync function openUnfrozen(\n options: AgentWorkerOptions,\n { choosable: chosen }: { choosable: Choosable },\n base: Omit<AgentOptions, 'storage' | 'beforeResume' | 'conversationCreated'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n conversationCreated: unfreezeCreated(chosen),\n beforeResume: (harness, using) => unfreeze(harness, storage, chosen, using),\n });\n}\n\nasync function secretsFor(home: SliccKernelEnv, vault: Vault) {\n scrubWith(vault);\n const names = secretNames(home, vault);\n await names.refresh(BACKGROUND_CONTEXT);\n return names;\n}\n\nexport function modelBases(\n providers: readonly Provider[],\n models: Pick<ReturnType<typeof createSliccModels>, 'getModels'>,\n env: (providerId: string) => Readonly<Record<string, string>> | undefined = () => undefined\n): ModelBases[] {\n return providers.map((provider) => ({\n provider: provider.id,\n urls: [\n ...new Set(\n [\n provider.baseUrl,\n ...models.getModels(provider.id).map((model) => model.baseUrl),\n ...(provider.id === BEDROCK ? BEDROCK_ENDPOINTS : []),\n ...(provider.id === AZURE ? [azureBase(env(provider.id) ?? {})] : []),\n ].filter((url): url is string => typeof url === 'string' && url !== '')\n ),\n ],\n }));\n}\n\nfunction mcpVault(\n vault: Vault,\n made: { store: PlainStore; records: VaultRecords; endpoints: ReturnType<typeof vaultEndpoints> }\n) {\n const { store, records, endpoints } = made;\n return {\n store,\n vault: {\n records,\n fetch: (server: string, base: typeof fetch) => mcpFetch(vault, base, server),\n grant: (server: string, base: typeof fetch) => grantFetch(vault, server, base),\n servers: endpoints.servers,\n token: endpoints.token,\n },\n };\n}\n\nfunction hostSecrets(\n vault: Vault,\n names: Awaited<ReturnType<typeof secretsFor>>,\n parts: readonly { close(): void }[]\n) {\n return {\n vault: vault.state,\n list: () => names.state.value,\n close: () => {\n for (const part of parts) part.close();\n },\n };\n}\n\nasync function modelsOf(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions,\n given: { vault: Vault; home: SliccKernelEnv; transport: typeof fetch; version: string }\n) {\n const { vault, home, transport, version } = given;\n const store = await (options.store ?? (async () => fileStore(home, ACCOUNTS_FILE)))();\n const records = vaultRecords(vault);\n const loaded = records.refresh(BACKGROUND_CONTEXT).catch(() => undefined);\n const providers = options.providers ?? sliccProviders(version);\n const fields = await providerFields(store, providers);\n const credentials = vaultCredentials(records, fields.env, fields.ready);\n const models = createSliccModels(\n credentials,\n providers,\n catalogStore(fileStore(home, MODELS_FILE))\n );\n await models.refresh({ allowNetwork: false }).catch(() => undefined);\n const bases = () => modelBases(providers, models, fields.env);\n scope.fetch = codexFetch(\n vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value),\n records.rejecting\n )\n );\n const endpoints = vaultEndpoints(vault);\n const defaultModel = async () => {\n await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);\n return resolveDefaultModel(credentials, providers, models);\n };\n return { store, records, providers, fields, models, bases, endpoints, defaultModel };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>, origin: string) {\n const registry = createRegistry();\n registry.install(CodingTools);\n registry.install(browserGuard([origin]));\n registry.install(sliccPrompt(facts));\n const read = (CodingTools.tools as readonly ToolRegistration[]).find(\n (tool) => tool.name === 'read'\n ) as ToolRegistration;\n registry.install(imageReads(read));\n return registry;\n}\n\nasync function factsOf(client: KernelClient & { transport: Transport }, native: typeof fetch) {\n return {\n version: await agentVersion((url) => native(url)),\n commands: await commandsOnPath(client),\n transport: transportName(client.transport),\n browser: await browserConnected(client),\n };\n}\n\nfunction routeFetch(scope: AgentWorkerScope, client: KernelClient & { transport: Transport }) {\n const native = scope.fetch.bind(scope);\n const loopback = client.loopbackFetch?.bind(client);\n const transport = transportFetch(client.transport, scope.location.origin, native, loopback);\n scope.fetch = transport;\n return { native, transport };\n}\n\nasync function prepare(\n scope: AgentWorkerScope,\n kernel: { client: KernelClient & { transport: Transport }; home: SliccKernelEnv; vault: Vault },\n options: AgentWorkerOptions\n) {\n const names = await secretsFor(kernel.home, kernel.vault);\n const { native, transport } = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n const made = await modelsOf(scope, options, {\n vault: kernel.vault,\n home: kernel.home,\n transport,\n version: facts.version,\n });\n return {\n names,\n native,\n transport,\n facts,\n ...made,\n reach: transportReach(kernel.client),\n registry: baseRegistry(facts, scope.location.origin),\n };\n}\n\nfunction modelsOfAgent(\n agent: Agent,\n settings: Awaited<ReturnType<typeof createAgentSettings>>,\n catalog: Models,\n vault: Vault\n) {\n const locked = () => vault.state.value.locked !== 'no';\n return modelsCommand({ agents: agent.agents, settings, catalog, locked });\n}\n\nasync function settingsOf(\n made: Awaited<ReturnType<typeof modelsOf>> & { reach: Reach },\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped; licks: Licks }\n) {\n const { models, records, fields, providers, reach } = made;\n const keys = await keysMoved(moved.agent.harness, { records, vault: moved.vault }, moved.wiped);\n const settings = await createAgentSettings(models, { records, fields }, providers, {\n mcp,\n moved: keys,\n reach,\n vault: moved.vault,\n });\n settings.state.subscribe(() => void moved.licks.flush(BACKGROUND_CONTEXT).catch(() => undefined));\n return settings;\n}\n\nasync function setupApprovals(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n stored: { readonly value: readonly MemoryEntry[] | undefined },\n options: Pick<AgentWorkerOptions, 'approvalMs'>\n) {\n const memories = () => stored.value;\n const { approvalMs } = options;\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n const intent = ownerIntent({ env: home, agents: agent.agents, memories });\n const judge: ApprovalJudge = {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent,\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\n return { judge, intent, ...(approvalMs ? { approvalMs } : {}) };\n}\n\nfunction setupTitles(\n registry: ReturnType<typeof createRegistry>,\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n opened: () => Agent | undefined\n) {\n const settings = settingsText(home, HOME, at.agentDir);\n const titleFn = titler(models, settings);\n const titles = titlesExtension({\n agents: () => opened()?.agents,\n harness: () => opened()?.harness,\n title: () => titleFn,\n });\n registry.install(titles.extension);\n return { titleFn, cancel: titles.cancel, label: labeler(models, settings) };\n}\n\nfunction freezerOf(\n agent: Agent,\n parts: {\n home: SliccKernelEnv;\n memory: ReturnType<typeof setupMemory>;\n titles: ReturnType<typeof setupTitles>;\n people: AgentUsers | undefined;\n users: UserClients | undefined;\n ready: { providers: readonly Provider[]; models: ReturnType<typeof createSliccModels> };\n licks: ReturnType<typeof setupLicks>;\n }\n) {\n const { home, memory, titles, people, users, ready } = parts;\n const freezer = attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titles.titleFn,\n cancelTitle: titles.cancel,\n ...(people ? { layout: people.layout } : {}),\n imports: {\n env: home,\n memoryHome: people ? ROOT_HOME : HOME,\n catalog: ready.models,\n providers: ready.providers,\n ...(users ? { users: users.users } : {}),\n ...(people ? { envOf: (cone: string) => people.envOfAgent(`cone:${cone}`) } : {}),\n },\n });\n parts.licks.licks.guard(freezer.frozenTarget);\n return freezer;\n}\n\nfunction kernelParts(client: KernelClient) {\n return [createActivity(), processGroups(client), backgroundJobs(client)] as const;\n}\n\nasync function start(\n scope: AgentWorkerScope,\n ports: Promise<KernelPorts>,\n options: AgentWorkerOptions,\n vault: Vault\n): Promise<AgentHost> {\n const { client, users, home, at, wiped } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, transport, facts, models, registry, records, endpoints } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n const mcp = setupMcp(registry);\n const codemode = await codemodeTools(client, options, native, mcp.codemode, at.agentDir);\n registry.install(codemodeExtension(codemode));\n const licks = setupLicks(registry, transport);\n licks.licks.triage(lickTriage(models));\n const scoops = setupScoops(registry, licks.licks, [...coding, ...codemode, ...memory.tools]);\n const skills = setupSkills(registry, licks.licks);\n registry.install(secretsExtension({ names, vault }));\n const titles = setupTitles(registry, models, home, at, () => opened);\n const [activity, groups, jobs] = kernelParts(client);\n const model = options.model ?? (await ready.defaultModel());\n let opened: Agent | undefined;\n const people = users ? agentUsers(users, client, home, () => opened?.agents) : undefined;\n const environment = kernelEnvironment(client, {\n activity,\n groups,\n jobs,\n identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n ...(modeOf(client) === 'off' ? {} : { tagOf: runTag(() => opened?.harness) }),\n });\n const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });\n opened = agent;\n await people?.start(agent.agents);\n const freezer = freezerOf(agent, { home, memory, titles, people, users, ready, licks });\n await freezer.swept;\n const sources = licks.attach(agent, {\n env: home,\n home: HOME,\n models,\n activity,\n jobs,\n ...(people ? { dirs: () => people.lickDirs(), cronUser: people.cronUser.bind(people) } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n const booted = { version: facts.version, boot: await kernelBoot(client) };\n await sources.boot(booted, BACKGROUND_CONTEXT);\n const skillsRuntime = await skills.attach(\n {\n env: home,\n ...at,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people ? { people: people.people } : {}),\n },\n BACKGROUND_CONTEXT\n );\n const mcpRuntime = await mcp.attach(\n {\n env: home,\n ...at,\n ...mcpVault(vault, ready),\n licks: licks.licks,\n fetch: transport,\n version: facts.version,\n reloadMs: RELOAD_MS,\n codemode: codemode.length > 0,\n cors: pageOnly(client.transport),\n redirect: options.mcpRedirect ?? new URL(MCP_CALLBACK, scope.location.origin).href,\n },\n BACKGROUND_CONTEXT\n );\n const gelatiere = lateGelatiere();\n const sprinkles = await setupSprinkles().attach(\n {\n intercept: gelatiere.intercept,\n harness: agent.harness,\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people?.sprinkles() ?? {}),\n },\n BACKGROUND_CONTEXT\n );\n people?.follow([sources, skillsRuntime, sprinkles]);\n let roles: ScoopsRuntime | undefined;\n const memoryRuntime = await memory.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n ...at,\n ...(people ? { home: ROOT_HOME } : {}),\n reloadMs: RELOAD_MS,\n roles: async (using) => roles?.roles(using),\n },\n BACKGROUND_CONTEXT\n );\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped, licks: licks.licks });\n const pages = createPages({ claim: sprinkles.claim });\n const runtime = await scoops.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n groups,\n env: home,\n envOf: async (conversationId, context) => environment({ conversationId }, context),\n ...at,\n ...(people\n ? { layout: people.layout, spools: people.spools, enforced: people.enforced }\n : {}),\n alive: alive(client),\n reads: skillsRuntime.dirs,\n memory: memoryRuntime.command,\n gelatiere: gelatiere.command,\n freezer: freezer.command,\n models: modelsOfAgent(agent, settings, models, vault),\n panel: pages.command,\n webhook: sources.webhook,\n mcp: mcp.direct,\n ...(options.assets ? { assets: options.assets } : {}),\n },\n BACKGROUND_CONTEXT\n );\n roles = runtime;\n gelatiere.attach({\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n home: HOME,\n ...(await people?.gelatiere(home)),\n scoops: scoops.scoops,\n roles: runtime.roles,\n assets: options.assets ?? packageAssets(),\n fetch: scope.fetch,\n skills: skillsRuntime.skills,\n ...(options.catalog ? { catalog: options.catalog } : {}),\n });\n await memoryRuntime.reload(BACKGROUND_CONTEXT).catch(() => undefined);\n return hostAgent(agent, {\n ...(await setupApprovals(models, home, at, agent, memoryRuntime.memories, options)),\n settings,\n licks: { licks: licks.licks, sources },\n scoops: { scoops: scoops.scoops, runtime },\n skills: skillsRuntime,\n sprinkles,\n memory: memoryRuntime,\n freezer,\n changes: attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS }),\n pages,\n labels: await attachLabels({ ...agent, label: titles.label, vault: vault.state }),\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: hostSecrets(vault, names, [names, records, endpoints]),\n uploads: {\n env: environment,\n sees: (ref) => seesImages(models, ref),\n },\n monitor: {\n kernel: client,\n groups,\n ...(users ? { users: () => users.users.list() } : {}),\n },\n });\n}\n\nexport function alive(client: KernelClient) {\n return async (pid: number): Promise<boolean> => {\n if (!client.ps) return true;\n return (await client.ps()).some((process) => process.pid === pid);\n };\n}\n\nexport function runAgentWorker(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions = {}\n): Promise<AgentHost> {\n const vault = new Vault();\n listenVault(scope, vault);\n const host = start(scope, kernelPorts(scope), options, vault);\n host.catch(() => undefined);\n serveConnections(scope, host);\n return host;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,6 @@
1
+ import { distinctTaints } from "../guests/guard.js";
1
2
  import { reviewersOf } from "../guests/scoop.js";
3
+ import { taggedTaints } from "../guests/tags.js";
2
4
  import { CONE_PREFIX } from "../kernel/accounts.js";
3
5
  import { resolve } from "../kernel/paths.js";
4
6
  import { agentOfUser, LEGACY, ROOT_USER } from "../layout.js";
@@ -75,8 +77,9 @@ function claimed(agents, caller) {
75
77
  }
76
78
  class CallerError extends Error {
77
79
  }
78
- function taintsOf(deps, request, who, context) {
79
- return callerTaints(deps.harness, deps.agents.state(), who, request.caller, context);
80
+ async function taintsOf(deps, request, who, context) {
81
+ const own = await callerTaints(deps.harness, deps.agents.state(), who, request.caller, context);
82
+ return who.tagged ? distinctTaints([...own, ...who.tagged]) : own;
80
83
  }
81
84
  function anonymous(agents) {
82
85
  return { id: null, cone: agents.activeCone(), fromAgent: false, scoop: null, depth: 0 };
@@ -128,6 +131,13 @@ async function attested(deps, request, context) {
128
131
  throw new CallerError(`process ${request.pid} does not run as ${request.user}`);
129
132
  return lineage;
130
133
  }
134
+ async function tagTaints(deps, lineage, context) {
135
+ const tags = lineage ? [...lineage.tags, ...lineage.recent] : [];
136
+ return tags.length ? taggedTaints(deps.harness, tags, context) : [];
137
+ }
138
+ function withTags(who, tagged) {
139
+ return tagged.length ? { ...who, tagged: [...tagged] } : who;
140
+ }
131
141
  async function readText(deps, value, request, context) {
132
142
  const env = await deps.layout.envFor(request.user ?? null, context) ?? deps.env;
133
143
  const read = await env.readTextFile(resolve(request.cwd, value), context);
@@ -399,7 +409,7 @@ async function webhookSend(deps, request, parsed, sender, context) {
399
409
  function unnamed(parsed) {
400
410
  return { ...parsed, rest: parsed.rest.slice(1) };
401
411
  }
402
- async function lickSend(deps, request, lineage, context) {
412
+ async function lickSend(deps, request, lineage, tagged, context) {
403
413
  const parsed = flags(request.argv.slice(1), ["--file", "--lick", "--source"]);
404
414
  const unknown = [...parsed.switches][0];
405
415
  if (unknown) return fail(`unknown option ${unknown}`, 2);
@@ -407,7 +417,7 @@ async function lickSend(deps, request, lineage, context) {
407
417
  if (!PROCESS_LICKS.includes(channel)) return refusedChannel(channel);
408
418
  if (!deps.licks) return fail("licks are not available in this agent");
409
419
  const sender = {
410
- who: callerOf(deps.agents, request, lineage),
420
+ who: withTags(callerOf(deps.agents, request, lineage), tagged),
411
421
  spawned: lineage.spawned
412
422
  };
413
423
  return channel === "cron" ? cronSend(deps, deps.licks, request, parsed, sender, context) : webhookSend(deps, request, parsed, sender, context);
@@ -575,10 +585,12 @@ function createCli(options) {
575
585
  if (unchecked(request))
576
586
  return await dispatch(deps, request, anonymous(deps.agents), context);
577
587
  const lineage = await attested(deps, request, context);
588
+ const tagged = await tagTaints(deps, lineage, context);
578
589
  const argv = expanded(request.argv);
579
590
  if (request.as === "agent" && argv[0] === "send" && argv.includes("--lick"))
580
- return await lickSend(deps, { ...request, argv }, lineage, context);
581
- return await dispatch(deps, request, callerOf(deps.agents, request, lineage), context);
591
+ return await lickSend(deps, { ...request, argv }, lineage, tagged, context);
592
+ const who = withTags(callerOf(deps.agents, request, lineage), tagged);
593
+ return await dispatch(deps, request, who, context);
582
594
  } catch (error) {
583
595
  return fail(error.message);
584
596
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/scoops/cli.ts"],
4
- "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { Harness } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport type { Agents, AgentsState } from '../agents.ts';\nimport type { InheritedTaint } from '../guests/guard.ts';\nimport { reviewersOf } from '../guests/scoop.ts';\nimport { CONE_PREFIX } from '../kernel/accounts.ts';\nimport type { Lineage } from '../kernel/lineage.ts';\nimport { resolve } from '../kernel/paths.ts';\nimport { agentOfUser, type Layout, LEGACY, ROOT_USER } from '../layout.ts';\nimport { cronLick } from '../licks/crontab.ts';\nimport { webhookDelivery } from '../licks/events.ts';\nimport { LICK_CHANNELS, type LickTarget } from '../licks/lick.ts';\nimport type { Licks } from '../licks/licks.ts';\nimport { scopedName, type WebhookDelivery } from '../licks/sources.ts';\nimport { findRole, type Roles } from '../roles/roles.ts';\nimport { callerOf as agentOf } from './identity.ts';\nimport type { Request, Runner } from './requests.ts';\nimport { type Answer, findScoop, modelOf, type Scoops } from './service.ts';\nimport { cancelSync, detachSync, runSync, type SyncState } from './sync.ts';\nimport { callerTaints } from './taints.ts';\n\nexport const DEFAULT_WAIT_S = 30;\nexport const MAX_DEPTH = 3;\nexport const RUN_DIR = '/var/lib/slicc/agent/scoops';\n\nexport const THINKING = new Set(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']);\nconst EFFORT: Record<string, string> = { low: 'low', medium: 'medium', high: 'high', max: 'xhigh' };\n\nexport const USAGE = `usage:\n agent [options] (--prompt <text> | --file <path> | -)... run a scoop, wait, print its answer\n agent --async [options] (--prompt <text> | --file <path> | -)... start a scoop, print its handle\n agent <cwd> <allowed-commands> <prompt> the same as a synchronous run, in v6's form\n agent list [--agents] | status <handle> | rename <handle> <name>\n agent send <handle> [--follow-up] (<message> | --file <path> | -)\n agent send <target> --lick=<cron|webhook> [--source <name>] (<message> | --file <path> | -)\n agent send parent <note> from a scoop: a progress note to its cone\n agent wait <handle>... [--timeout <seconds>] [--notify]\n agent stop <handle>\n agent workflow run|list|status|stop|save ... Claude Code workflows; agent workflow help\n\noptions:\n --name <name> --agent <role> --model <provider/model> --thinking <level> | --effort <low|medium|high|max>\n --tools <a,b> --read-only <path,path> --system-prompt <text> | --system-prompt-file <path>\n --background-after <seconds> --persist-session | --no-persist-session\n\nA synchronous run removes the scoop's folder afterwards. Its transcript is archived in\n/tmp/agent-sessions/<handle>.md, in /home/sessions/<handle>.md with --persist-session, or nowhere\nwith --no-persist-session. subagent is the same command: subagent spawn = agent --async.\n`;\n\nexport interface CliOptions {\n env: ExecutionEnv;\n harness: Harness;\n agents: Agents;\n scoops: Scoops;\n roles: () => Promise<Roles>;\n alive?: (pid: number) => Promise<boolean>;\n now?: () => number;\n memory?: (argv: readonly string[], caller: string | null, context: Context) => Promise<Answer>;\n gelatiere?: (argv: readonly string[], caller: string | null, context: Context) => Promise<Answer>;\n freezer?: (\n argv: readonly string[],\n caller: string | null,\n context: Context,\n asker?: { user: string | null; cwd: string }\n ) => Promise<Answer>;\n models?: (argv: readonly string[], caller: string | null, context: Context) => Promise<Answer>;\n layout?: Layout;\n panel?: (argv: readonly string[], caller: PanelCaller, context: Context) => Promise<Answer>;\n licks?: Pick<Licks, 'deliver'>;\n webhook?: (name: string, delivery: WebhookDelivery, context: Context) => Promise<boolean>;\n workflow?: (\n argv: readonly string[],\n who: Caller & { taints: InheritedTaint[] },\n request: Request,\n context: Context\n ) => Promise<Answer>;\n}\n\nexport interface PanelCaller {\n agentId: string | null;\n cone: string;\n tab: string | null;\n}\n\nexport type Deps = CliOptions & { now: () => number; sync: SyncState; layout: Layout };\n\nexport interface Caller {\n id: string | null;\n cone: string;\n fromAgent: boolean;\n scoop: string | null;\n depth: number;\n}\n\nexport type Flags = { values: Map<string, string[]>; switches: Set<string>; rest: string[] };\n\nexport const ok = (out: string): Answer => ({ code: 0, out });\nexport const fail = (out: string, code = 1): Answer => ({ code, out: `agent: ${out}\\n` });\n\nexport function isAnswer(value: unknown): value is Answer {\n return typeof value === 'object' && value !== null && 'code' in value && 'out' in value;\n}\n\nexport function flags(argv: readonly string[], withValue: readonly string[]): Flags {\n const values = new Map<string, string[]>();\n const switches = new Set<string>();\n const rest: string[] = [];\n for (let at = 0; at < argv.length; at++) {\n const arg = argv[at] as string;\n if (withValue.includes(arg)) {\n const value = argv[at + 1];\n if (value === undefined) throw new Error(`${arg} needs a value`);\n values.set(arg, [...(values.get(arg) ?? []), value]);\n at++;\n } else if (arg.startsWith('--')) switches.add(arg);\n else rest.push(arg);\n }\n return { values, switches, rest };\n}\n\nexport function last(parsed: Flags, flag: string): string | undefined {\n return parsed.values.get(flag)?.at(-1);\n}\n\nfunction claimed(agents: Agents, caller: string): Caller | undefined {\n const state = agents.state();\n if (caller.startsWith('cone:') && state.cones[caller.slice(5)]) {\n const cone = caller.slice(5);\n return { id: `cone:${cone}`, cone, fromAgent: true, scoop: null, depth: 0 };\n }\n const record = caller.startsWith('scoop:') ? state.scoops[caller] : undefined;\n if (record)\n return { id: caller, cone: record.cone, fromAgent: true, scoop: caller, depth: record.depth };\n return undefined;\n}\n\nexport class CallerError extends Error {}\n\nexport function taintsOf(deps: Deps, request: Request, who: Caller, context: Context) {\n return callerTaints(deps.harness, deps.agents.state(), who, request.caller, context);\n}\n\nfunction anonymous(agents: Agents): Caller {\n return { id: null, cone: agents.activeCone(), fromAgent: false, scoop: null, depth: 0 };\n}\n\nexport function callerOf(agents: Agents, request: Request, lineage: Lineage | undefined): Caller {\n if (!lineage) throw new CallerError(\"can't tell which process is asking from the process table\");\n const walked = lineage.agent === null ? undefined : agentOf(agents, lineage.agent);\n const user = request.user;\n if (!user || user === ROOT_USER) {\n if (request.caller && request.caller !== walked)\n throw new CallerError(\n `SLICC_AGENT says ${request.caller}, but this process belongs to ${walked ?? 'no agent'}`\n );\n return (walked ? claimed(agents, walked) : undefined) ?? anonymous(agents);\n }\n const own = agentOfUser(agents.state(), user);\n if (request.caller && request.caller !== own)\n throw new CallerError(`SLICC_AGENT says ${request.caller}, but you are ${user}`);\n if (walked && walked !== own)\n throw new CallerError(`you are ${user}, but this process belongs to ${walked}`);\n const found = own ? claimed(agents, own) : undefined;\n if (!found) throw new CallerError(`${user} is no cone or live scoop`);\n return found;\n}\n\nconst UNCHECKED = new Set(['__cancel', '__detach']);\n\nfunction unchecked(request: Request): boolean {\n return request.as === 'agent' && UNCHECKED.has(request.argv[0] ?? '');\n}\n\nfunction sameArgs(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((arg, at) => arg === b[at]);\n}\n\nfunction runsCommand(argv: readonly string[], request: Request): boolean {\n return argv.some(\n (arg, at) =>\n at > 0 && arg.split('/').at(-1) === request.as && sameArgs(argv.slice(at + 1), request.argv)\n );\n}\n\nasync function uidOf(deps: Deps, user: string, context: Context): Promise<number | undefined> {\n const read = await deps.env.readTextFile('/etc/passwd', context);\n const line = read.ok ? read.value.split('\\n').find((entry) => entry.startsWith(`${user}:`)) : '';\n const uid = Number(line?.split(':')[2] ?? Number.NaN);\n return Number.isInteger(uid) ? uid : undefined;\n}\n\nasync function attested(\n deps: Deps,\n request: Request,\n context: Context\n): Promise<Lineage | undefined> {\n const lineage = await deps.scoops.lineage(request.pid);\n if (!lineage) return undefined;\n if (!runsCommand(lineage.argv, request))\n throw new CallerError(`process ${request.pid} is not this ${request.as} call`);\n if (request.user && lineage.uid !== (await uidOf(deps, request.user, context)))\n throw new CallerError(`process ${request.pid} does not run as ${request.user}`);\n return lineage;\n}\n\nexport async function readText(\n deps: Deps,\n value: string,\n request: Request,\n context: Context\n): Promise<string> {\n const env = (await deps.layout.envFor(request.user ?? null, context)) ?? deps.env;\n const read = await env.readTextFile(resolve(request.cwd, value), context);\n if (!read.ok) throw new Error(`can't read ${value}: ${read.error.message}`);\n return read.value;\n}\n\nexport async function prompts(\n deps: Deps,\n argv: readonly string[],\n request: Request,\n context: Context\n) {\n const out: string[] = [];\n for (let at = 0; at < argv.length; at++) {\n const arg = argv[at];\n if (arg === '--prompt') out.push(argv[++at] ?? '');\n else if (arg === '--file') out.push(await readText(deps, argv[++at] ?? '', request, context));\n else if (arg === '-') out.push(request.stdin);\n }\n return out.filter((prompt) => prompt.trim());\n}\n\nexport type Choice = {\n model?: { provider: string; modelId: string };\n thinking?: string;\n tools?: string[];\n};\n\nfunction toolList(listed: string | undefined): string[] | undefined {\n if (listed === undefined || listed === 'auto' || listed === 'full') return undefined;\n return listed\n .split(',')\n .map((tool) => tool.trim())\n .filter(Boolean);\n}\n\nexport function choices(parsed: Flags): Choice | Answer {\n const provider = last(parsed, '--provider');\n const modelText = last(parsed, '--model');\n const model = modelText\n ? provider\n ? { provider, modelId: modelText }\n : modelOf(modelText)\n : undefined;\n if (modelText && !model)\n return fail('--model needs provider/model, or --provider with --model', 2);\n const effort = last(parsed, '--effort');\n if (effort && !EFFORT[effort]) return fail('--effort must be low, medium, high or max', 2);\n const thinking = last(parsed, '--thinking') ?? (effort ? EFFORT[effort] : undefined);\n if (thinking && !THINKING.has(thinking))\n return fail(`--thinking must be one of ${[...THINKING].join(', ')}`, 2);\n if (last(parsed, '--tools') === 'output')\n return fail('--tools output needs --schema-b64, which is not supported in SLICC yet', 2);\n const tools = toolList(last(parsed, '--tools'));\n return {\n ...(model ? { model } : {}),\n ...(thinking ? { thinking } : {}),\n ...(tools ? { tools } : {}),\n };\n}\n\nexport async function role(deps: Deps, parsed: Flags) {\n const roles = await deps.roles();\n const name = last(parsed, '--agent');\n const found = name ? findRole(roles.roles, name) : undefined;\n if (name && !found)\n return {\n roles,\n error: fail(`there is no agent role ${name}; \\`agent list --agents\\` shows them`),\n };\n return { roles, role: found };\n}\n\nfunction handle(deps: Deps, who: Caller, name: string | undefined) {\n return name ? findScoop(deps.agents.state(), name, who.fromAgent ? who.cone : null) : undefined;\n}\n\nasync function reviewing(\n deps: Deps,\n who: Caller,\n [id, record]: [string, { name: string }],\n context: Context\n) {\n if (!who.fromAgent || who.scoop) return undefined;\n const reviewers = await reviewersOf(deps.harness, deps.agents.state(), who.cone, context);\n if (!reviewers.includes(id)) return undefined;\n return fail(\n `the scoop ${record.name} reviews this guest run's requests, so this run can't ask anything of it`\n );\n}\n\nconst ASYNC_VALUES = [\n '--name',\n '--agent',\n '--provider',\n '--model',\n '--thinking',\n '--effort',\n '--tools',\n '--prompt',\n '--file',\n];\nconst ASYNC_SWITCHES = new Set(['--async', '--no-extensions', '--no-skills', '--no-context-files']);\nconst UNSUPPORTED = new Set([\n '--no-prompt-templates',\n '--session',\n '--resume',\n '--image',\n '--no-escalate',\n '--minimal',\n '--usage',\n '--schema-b64',\n '--cwd',\n]);\n\nexport function unsupported(argv: readonly string[]): Answer | undefined {\n const found = argv.find((arg) => UNSUPPORTED.has(arg) || arg.startsWith('--image='));\n return found ? fail(`${found} is not supported in SLICC yet`, 2) : undefined;\n}\n\nasync function spawnAsync(\n deps: Deps,\n request: Request,\n who: Caller,\n argv: readonly string[],\n context: Context\n) {\n if (who.scoop) return fail('a scoop cannot start async scoops; run agent without --async');\n const refused = unsupported(argv);\n if (refused) return refused;\n const parsed = flags(argv, ASYNC_VALUES);\n const unknown = [...parsed.switches].find((flag) => !ASYNC_SWITCHES.has(flag));\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const given = await prompts(deps, argv, request, context);\n if (!given.length) return fail('--async needs at least one --prompt, --file or -', 2);\n const chosen = choices(parsed);\n if (isAnswer(chosen)) return chosen;\n const found = await role(deps, parsed);\n if (found.error) return found.error;\n const taints = await taintsOf(deps, request, who, context);\n return deps.scoops.spawn(\n {\n cone: who.cone,\n kind: 'async',\n name: last(parsed, '--name') ?? found.role?.name ?? 'scoop',\n ...(found.role ? { role: found.role } : {}),\n ...(chosen.model ? { model: chosen.model } : {}),\n ...(chosen.thinking ? { thinking: chosen.thinking as never } : {}),\n ...(chosen.tools ? { tools: chosen.tools } : {}),\n prompts: given,\n origin: request.cwd,\n fromAgent: who.fromAgent,\n request: request.id,\n limits: found.roles.limits,\n taints,\n },\n context\n );\n}\n\nasync function listAgents(deps: Deps): Promise<Answer> {\n const roles = await deps.roles();\n const lines = roles.roles.map(\n (entry) =>\n `${entry.name}\\t${entry.source}\\t${entry.description}${entry.aliases.length ? ` (also ${entry.aliases.join(', ')})` : ''}`\n );\n return ok(\n `${[\n ...lines,\n '',\n 'Agent files are read from the built-in roles, installed packages (pi-subagents.agents) and ~/.pi/agent/agents.',\n \"A project's .pi/agents folder is read only once the folder is trusted, which SLICC doesn't support yet.\",\n ...roles.warnings.map((warning) => `warning: ${warning}`),\n ].join('\\n')}\\n`\n );\n}\n\nasync function list(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n if (request.argv.includes('--agents')) return listAgents(deps);\n const rows = await deps.scoops.list(who.cone, context);\n if (!rows.length) return ok('no scoops\\n');\n return ok(\n `${rows.map((row) => `${row.folder}\\t${row.name}\\t${row.role ?? '-'}\\t${row.busy ? 'working' : 'idle'}`).join('\\n')}\\n`\n );\n}\n\nasync function status(\n deps: Deps,\n request: Request,\n who: Caller,\n context: Context\n): Promise<Answer> {\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const [, record] = found;\n const busy = await deps.scoops.busy(record.conversation, context);\n return ok(\n `${[\n `handle: ${record.folder}`,\n `name: ${record.name}`,\n `role: ${record.role ?? '-'}`,\n `kind: ${record.kind}`,\n `state: ${busy ? 'working' : 'idle'}`,\n `folder: ${deps.layout.scoopRoot(record.folder)}`,\n `reports: ${deps.layout.reports(record.folder, record.cone)}`,\n ].join('\\n')}\\n`\n );\n}\n\nasync function message(\n deps: Deps,\n parsed: Flags,\n request: Request,\n context: Context\n): Promise<string> {\n const file = last(parsed, '--file');\n if (file) return readText(deps, file, request, context);\n return parsed.rest.includes('-') ? request.stdin : parsed.rest.join(' ');\n}\n\nasync function send(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n const parsed = flags(request.argv.slice(2), ['--file']);\n const unknown = [...parsed.switches].find((flag) => flag !== '--follow-up');\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const text = await message(deps, parsed, request, context);\n if (!text.trim()) return fail('send needs a message, --file or -', 2);\n if (request.argv[1] === 'parent') {\n if (!who.scoop) return fail('only a scoop has a parent to send to');\n return deps.scoops.note(who.scoop, text, await taintsOf(deps, request, who, context), context);\n }\n if (who.scoop) return fail('a scoop can only send to its parent');\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const refused = await reviewing(deps, who, found, context);\n if (refused) return refused;\n const followUp = parsed.switches.has('--follow-up');\n const taints = await taintsOf(deps, request, who, context);\n return deps.scoops.feed(\n found[0],\n text,\n { fromAgent: who.fromAgent, request: request.id, followUp, target: who.id, taints },\n context\n );\n}\n\nfunction cronTarget(deps: Deps, request: Request, name: string): LickTarget | Answer {\n const state = deps.agents.state();\n if (!name) return fail('send needs cone or a scoop handle', 2);\n const user = request.user && request.user !== ROOT_USER ? request.user : undefined;\n const own = user ? agentOfUser(state, user) : undefined;\n if (user && !own) return fail(`${user} is no cone or scoop`);\n if (own?.startsWith('scoop:')) {\n const record = state.scoops[own] as { name: string };\n const mine = [own, own.slice('scoop:'.length), record.name].includes(name);\n return mine\n ? (own as LickTarget)\n : fail(\"a scoop's cron job can only send to the scoop itself\");\n }\n const cone = own ? own.slice(CONE_PREFIX.length) : null;\n const home: LickTarget = cone ? `cone:${cone}` : 'cone';\n if (name === 'cone') return home;\n return (findScoop(state, name, cone)?.[0] as LickTarget | undefined) ?? home;\n}\n\nconst PROCESS_LICKS = ['cron', 'webhook'];\n\nfunction expanded(argv: readonly string[]): string[] {\n return argv.flatMap((arg) => {\n const at = arg.indexOf('=');\n const name = arg.slice(0, at);\n return at > 0 && (name === '--lick' || name === '--source') ? [name, arg.slice(at + 1)] : [arg];\n });\n}\n\nfunction refusedChannel(channel: string): Answer {\n const own = (LICK_CHANNELS as readonly string[]).includes(channel);\n const what = own\n ? `--lick=${channel} is the agent's own channel`\n : `there is no lick channel \"${channel}\"`;\n return fail(\n `${what}; a process may send ${PROCESS_LICKS.map((name) => `--lick=${name}`).join(' or ')}`,\n 2\n );\n}\n\ntype Sender = { who: Caller; spawned: boolean };\n\nasync function cronSend(\n deps: Deps,\n licks: Pick<Licks, 'deliver'>,\n request: Request,\n parsed: Flags,\n sender: Sender,\n context: Context\n): Promise<Answer> {\n if (!request.cron)\n return fail('--lick=cron only works inside a cron job, which sets SLICC_CRON_JOB');\n if (sender.spawned)\n return fail(\"--lick=cron only works inside a cron job, and an agent's bash started this one\");\n if (last(parsed, '--source') !== undefined)\n return fail(\"--source is for --lick=webhook; a cron lick is named by its job's # name:\", 2);\n const target = cronTarget(deps, request, parsed.rest[0] ?? '');\n if (isAnswer(target)) return target;\n const text = (await message(deps, unnamed(parsed), request, context)).trim();\n const taints = await taintsOf(deps, request, sender.who, context);\n const lick = cronLick(request.cron, target, text);\n await licks.deliver(taints.length ? { ...lick, taints } : lick, context);\n return ok('');\n}\n\nfunction webhookScope(deps: Deps, request: Request): string | null | Answer {\n const user = request.user && request.user !== ROOT_USER ? request.user : undefined;\n if (!user) return null;\n const own = agentOfUser(deps.agents.state(), user);\n if (!own) return fail(`${user} is no cone or scoop`);\n if (own.startsWith('scoop:')) return fail(\"a scoop can't send webhook licks; its cone can\");\n return own.slice(CONE_PREFIX.length);\n}\n\nasync function webhookSend(\n deps: Deps,\n request: Request,\n parsed: Flags,\n sender: Sender,\n context: Context\n): Promise<Answer> {\n if (!deps.webhook) return fail('webhooks are not available in this agent');\n const source = last(parsed, '--source');\n if (!source)\n return fail('--lick=webhook needs --source <name>, for ~/.slicc/webhooks/<name>.json', 2);\n if (parsed.rest[0] !== 'cone')\n return fail('a webhook lick goes to the cone: agent send cone --lick=webhook \u2026', 2);\n const scope = webhookScope(deps, request);\n if (isAnswer(scope)) return scope;\n const text = await message(deps, unnamed(parsed), request, context);\n if (!text.trim()) return fail('send needs a message, --file or -', 2);\n const taints = await taintsOf(deps, request, sender.who, context);\n const delivered = await deps.webhook(\n scopedName(source, scope),\n { ...webhookDelivery(text.trimEnd()), taints },\n context\n );\n return delivered\n ? ok('')\n : fail(`there is no webhook ${source}; add ~/.slicc/webhooks/${source}.json`);\n}\n\nfunction unnamed(parsed: Flags): Flags {\n return { ...parsed, rest: parsed.rest.slice(1) };\n}\n\nasync function lickSend(\n deps: Deps,\n request: Request,\n lineage: Lineage | undefined,\n context: Context\n): Promise<Answer> {\n const parsed = flags(request.argv.slice(1), ['--file', '--lick', '--source']);\n const unknown = [...parsed.switches][0];\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const channel = last(parsed, '--lick') ?? '';\n if (!PROCESS_LICKS.includes(channel)) return refusedChannel(channel);\n if (!deps.licks) return fail('licks are not available in this agent');\n const sender = {\n who: callerOf(deps.agents, request, lineage),\n spawned: (lineage as Lineage).spawned,\n };\n return channel === 'cron'\n ? cronSend(deps, deps.licks, request, parsed, sender, context)\n : webhookSend(deps, request, parsed, sender, context);\n}\n\nasync function latest(\n deps: Deps,\n record: { folder: string; cone: string },\n context: Context\n): Promise<string> {\n const dir = deps.layout.reports(record.folder, record.cone);\n const listed = await deps.env.listDir(dir, context);\n if (!listed.ok || !listed.value.length) return '(no answer yet)';\n const newest = [...listed.value].sort(\n (a, b) => Number.parseInt(b.name, 10) - Number.parseInt(a.name, 10)\n )[0];\n const read = await deps.env.readTextFile(`${dir}/${newest?.name}`, context);\n return read.ok ? read.value.trimEnd() : '(no answer yet)';\n}\n\nfunction waitTargets(deps: Deps, who: Caller, rest: readonly string[]): string[] | Answer {\n if (!rest.length) return fail('wait needs at least one handle', 2);\n const missing = rest.filter((name) => !handle(deps, who, name));\n if (missing.length)\n return fail(missing.map((name) => noScoop(deps.agents.state(), name)).join('; '));\n return rest.map((name) => (handle(deps, who, name) as [string, unknown])[0]);\n}\n\nasync function block(\n deps: Deps,\n ids: string[],\n seconds: number,\n context: Context\n): Promise<Answer> {\n const deadline = deps.now() + seconds * 1000;\n let open = await deps.scoops.working(ids, context);\n while (open.length && deps.now() < deadline) {\n await new Promise((done) => setTimeout(done, 200));\n open = await deps.scoops.working(ids, context);\n }\n const state = deps.agents.state();\n const sections: string[] = [];\n for (const id of ids) {\n const record = state.scoops[id];\n if (record)\n sections.push(\n `## ${record.folder}${open.includes(id) ? ' (still working)' : ''}\\n${await latest(deps, record, context)}`\n );\n }\n const body = `${sections.join('\\n\\n')}\\n`;\n if (!open.length) return ok(body);\n const still = open.map((id) => state.scoops[id]?.folder).join(', ');\n return { code: 1, out: `${body}agent: timed out after ${seconds}s; still working: ${still}\\n` };\n}\n\nasync function wait(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n const parsed = flags(request.argv.slice(1), ['--timeout']);\n const unknown = [...parsed.switches].find((flag) => flag !== '--notify');\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const seconds = Number(last(parsed, '--timeout') ?? DEFAULT_WAIT_S);\n if (!Number.isInteger(seconds) || seconds <= 0)\n return fail('--timeout must be a positive whole number of seconds', 2);\n const ids = waitTargets(deps, who, parsed.rest);\n if (isAnswer(ids)) return ids;\n if (!parsed.switches.has('--notify')) return block(deps, ids, seconds, context);\n if (!who.fromAgent || who.scoop)\n return fail('wait --notify is for a cone; a terminal waits with agent wait');\n const taints = await taintsOf(deps, request, who, context);\n await deps.scoops.notifyWhenDone(who.cone, ids, deps.now() + seconds * 1000, taints, context);\n return ok(`you'll get one scoop-wait lick when ${ids.length > 1 ? 'they are' : 'it is'} done\\n`);\n}\n\nasync function stop(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n if (who.scoop) return fail('a scoop cannot stop scoops');\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const refused = await reviewing(deps, who, found, context);\n if (refused) return refused;\n return deps.scoops.stop(found[0], who.fromAgent, context);\n}\n\nasync function rename(\n deps: Deps,\n request: Request,\n who: Caller,\n context: Context\n): Promise<Answer> {\n if (who.scoop) return fail('a scoop cannot rename scoops');\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const refused = await reviewing(deps, who, found, context);\n if (refused) return refused;\n return deps.scoops.rename(found[0], request.argv.slice(2).join(' '), context);\n}\n\ntype Verb = (deps: Deps, request: Request, who: Caller, context: Context) => Promise<Answer>;\n\nconst help: Verb = async () => ok(USAGE);\n\nconst VERBS: Record<string, Verb> = {\n list,\n status,\n send,\n wait,\n stop,\n rename,\n workflow: async (deps, request, who, context) =>\n deps.workflow\n ? deps.workflow(\n request.argv.slice(1),\n { ...who, taints: await taintsOf(deps, request, who, context) },\n request,\n context\n )\n : fail('workflows are not available in this agent'),\n help,\n '--help': help,\n '-h': help,\n __cancel: (deps, request, _who, context) => cancelSync(deps, request.argv[1] ?? '', context),\n __detach: (deps, request, _who, context) => detachSync(deps, request.argv[1] ?? '', context),\n};\n\nexport function noScoop(state: Readonly<AgentsState>, name: string): string {\n const id = name.startsWith('scoop:') ? name : `scoop:${name}`;\n const record =\n state.scoops[id]?.frozen !== undefined\n ? state.scoops[id]\n : Object.values(state.scoops).find(\n (candidate) => candidate.frozen && candidate.name === name\n );\n const frozen = record?.frozen ? state.frozen?.[record.frozen] : undefined;\n if (frozen) return `scoop ${name} is frozen with cone ${frozen.name}; thaw the cone first`;\n return `there is no scoop ${name}`.trim();\n}\n\nexport function panelCaller(request: Request, who: Caller): PanelCaller {\n const agentId = who.scoop ?? (who.fromAgent ? who.cone : null);\n return { agentId, cone: who.cone, tab: agentId === null ? (request.tab ?? null) : null };\n}\n\nasync function dispatch(\n deps: Deps,\n request: Request,\n who: Caller,\n context: Context\n): Promise<Answer> {\n if (request.as === 'panel')\n return deps.panel\n ? deps.panel(request.argv, panelCaller(request, who), context)\n : { code: 1, out: 'panel: panels are not available in this agent\\n' };\n if (request.as === 'memory')\n return deps.memory\n ? deps.memory(request.argv, who.id, context)\n : fail('memory is not available in this agent');\n if (request.as === 'gelatiere')\n return deps.gelatiere\n ? deps.gelatiere(request.argv, who.id, context)\n : fail('the gelatiere is not available in this agent');\n if (request.as === 'freezer')\n return deps.freezer\n ? deps.freezer(request.argv, who.id, context, {\n user: request.user ?? null,\n cwd: request.cwd,\n })\n : fail('the freezer is not available in this agent');\n if (request.as === 'models')\n return deps.models\n ? deps.models(request.argv, who.id, context)\n : fail('models is not available in this agent');\n const first = request.argv[0] ?? '';\n const verb = VERBS[first];\n if (verb) return verb(deps, request, who, context);\n if (request.as === 'subagent') {\n if (first === 'spawn') return spawnAsync(deps, request, who, request.argv.slice(1), context);\n return { code: 2, out: USAGE };\n }\n if (!request.argv.length) return { code: 2, out: USAGE };\n if (request.argv.includes('--async'))\n return spawnAsync(deps, request, who, request.argv, context);\n return runSync(deps, request, who, context);\n}\n\nconst BLOCKING = new Set([\n 'wait',\n 'workflow',\n 'list',\n 'status',\n 'help',\n '--help',\n '-h',\n '__cancel',\n '__detach',\n]);\n\nexport function createCli(options: CliOptions): Runner {\n const deps: Deps = {\n ...options,\n now: options.now ?? Date.now,\n sync: { pending: new Map() },\n layout: options.layout ?? LEGACY,\n };\n return {\n blocking(request) {\n if (request.as === 'panel') return true;\n const first = request.argv[0] ?? '';\n if (BLOCKING.has(first)) return true;\n return request.as === 'agent' && !VERBS[first] && !request.argv.includes('--async');\n },\n async run(request, context) {\n try {\n if (unchecked(request))\n return await dispatch(deps, request, anonymous(deps.agents), context);\n const lineage = await attested(deps, request, context);\n const argv = expanded(request.argv);\n if (request.as === 'agent' && argv[0] === 'send' && argv.includes('--lick'))\n return await lickSend(deps, { ...request, argv }, lineage, context);\n return await dispatch(deps, request, callerOf(deps.agents, request, lineage), context);\n } catch (error) {\n return fail((error as Error).message);\n }\n },\n };\n}\n"],
5
- "mappings": "AAKA,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAE5B,SAAS,eAAe;AACxB,SAAS,aAA0B,QAAQ,iBAAiB;AAC5D,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,qBAAsC;AAE/C,SAAS,kBAAwC;AACjD,SAAS,gBAA4B;AACrC,SAAS,YAAY,eAAe;AAEpC,SAAsB,WAAW,eAA4B;AAC7D,SAAS,YAAY,YAAY,eAA+B;AAChE,SAAS,oBAAoB;AAEtB,MAAM,iBAAiB;AACvB,MAAM,YAAY;AAClB,MAAM,UAAU;AAEhB,MAAM,WAAW,oBAAI,IAAI,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,OAAO,CAAC;AACpF,MAAM,SAAiC,EAAE,KAAK,OAAO,QAAQ,UAAU,MAAM,QAAQ,KAAK,QAAQ;AAE3F,MAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqEd,MAAM,KAAK,CAAC,SAAyB,EAAE,MAAM,GAAG,IAAI;AACpD,MAAM,OAAO,CAAC,KAAa,OAAO,OAAe,EAAE,MAAM,KAAK,UAAU,GAAG;AAAA,EAAK;AAEhF,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,SAAS;AACpF;AAEO,SAAS,MAAM,MAAyB,WAAqC;AAClF,QAAM,SAAS,oBAAI,IAAsB;AACzC,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,OAAiB,CAAC;AACxB,WAAS,KAAK,GAAG,KAAK,KAAK,QAAQ,MAAM;AACvC,UAAM,MAAM,KAAK,EAAE;AACnB,QAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,YAAM,QAAQ,KAAK,KAAK,CAAC;AACzB,UAAI,UAAU,OAAW,OAAM,IAAI,MAAM,GAAG,GAAG,gBAAgB;AAC/D,aAAO,IAAI,KAAK,CAAC,GAAI,OAAO,IAAI,GAAG,KAAK,CAAC,GAAI,KAAK,CAAC;AACnD;AAAA,IACF,WAAW,IAAI,WAAW,IAAI,EAAG,UAAS,IAAI,GAAG;AAAA,QAC5C,MAAK,KAAK,GAAG;AAAA,EACpB;AACA,SAAO,EAAE,QAAQ,UAAU,KAAK;AAClC;AAEO,SAAS,KAAK,QAAe,MAAkC;AACpE,SAAO,OAAO,OAAO,IAAI,IAAI,GAAG,GAAG,EAAE;AACvC;AAEA,SAAS,QAAQ,QAAgB,QAAoC;AACnE,QAAM,QAAQ,OAAO,MAAM;AAC3B,MAAI,OAAO,WAAW,OAAO,KAAK,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC,GAAG;AAC9D,UAAM,OAAO,OAAO,MAAM,CAAC;AAC3B,WAAO,EAAE,IAAI,QAAQ,IAAI,IAAI,MAAM,WAAW,MAAM,OAAO,MAAM,OAAO,EAAE;AAAA,EAC5E;AACA,QAAM,SAAS,OAAO,WAAW,QAAQ,IAAI,MAAM,OAAO,MAAM,IAAI;AACpE,MAAI;AACF,WAAO,EAAE,IAAI,QAAQ,MAAM,OAAO,MAAM,WAAW,MAAM,OAAO,QAAQ,OAAO,OAAO,MAAM;AAC9F,SAAO;AACT;AAEO,MAAM,oBAAoB,MAAM;AAAC;AAEjC,SAAS,SAAS,MAAY,SAAkB,KAAa,SAAkB;AACpF,SAAO,aAAa,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,KAAK,QAAQ,QAAQ,OAAO;AACrF;AAEA,SAAS,UAAU,QAAwB;AACzC,SAAO,EAAE,IAAI,MAAM,MAAM,OAAO,WAAW,GAAG,WAAW,OAAO,OAAO,MAAM,OAAO,EAAE;AACxF;AAEO,SAAS,SAAS,QAAgB,SAAkB,SAAsC;AAC/F,MAAI,CAAC,QAAS,OAAM,IAAI,YAAY,2DAA2D;AAC/F,QAAM,SAAS,QAAQ,UAAU,OAAO,SAAY,QAAQ,QAAQ,QAAQ,KAAK;AACjF,QAAM,OAAO,QAAQ;AACrB,MAAI,CAAC,QAAQ,SAAS,WAAW;AAC/B,QAAI,QAAQ,UAAU,QAAQ,WAAW;AACvC,YAAM,IAAI;AAAA,QACR,oBAAoB,QAAQ,MAAM,iCAAiC,UAAU,UAAU;AAAA,MACzF;AACF,YAAQ,SAAS,QAAQ,QAAQ,MAAM,IAAI,WAAc,UAAU,MAAM;AAAA,EAC3E;AACA,QAAM,MAAM,YAAY,OAAO,MAAM,GAAG,IAAI;AAC5C,MAAI,QAAQ,UAAU,QAAQ,WAAW;AACvC,UAAM,IAAI,YAAY,oBAAoB,QAAQ,MAAM,iBAAiB,IAAI,EAAE;AACjF,MAAI,UAAU,WAAW;AACvB,UAAM,IAAI,YAAY,WAAW,IAAI,iCAAiC,MAAM,EAAE;AAChF,QAAM,QAAQ,MAAM,QAAQ,QAAQ,GAAG,IAAI;AAC3C,MAAI,CAAC,MAAO,OAAM,IAAI,YAAY,GAAG,IAAI,2BAA2B;AACpE,SAAO;AACT;AAEA,MAAM,YAAY,oBAAI,IAAI,CAAC,YAAY,UAAU,CAAC;AAElD,SAAS,UAAU,SAA2B;AAC5C,SAAO,QAAQ,OAAO,WAAW,UAAU,IAAI,QAAQ,KAAK,CAAC,KAAK,EAAE;AACtE;AAEA,SAAS,SAAS,GAAsB,GAA+B;AACrE,SAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,OAAO,QAAQ,EAAE,EAAE,CAAC;AACpE;AAEA,SAAS,YAAY,MAAyB,SAA2B;AACvE,SAAO,KAAK;AAAA,IACV,CAAC,KAAK,OACJ,KAAK,KAAK,IAAI,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,GAAG,QAAQ,IAAI;AAAA,EAC/F;AACF;AAEA,eAAe,MAAM,MAAY,MAAc,SAA+C;AAC5F,QAAM,OAAO,MAAM,KAAK,IAAI,aAAa,eAAe,OAAO;AAC/D,QAAM,OAAO,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI;AAC9F,QAAM,MAAM,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG;AACpD,SAAO,OAAO,UAAU,GAAG,IAAI,MAAM;AACvC;AAEA,eAAe,SACb,MACA,SACA,SAC8B;AAC9B,QAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC,YAAY,QAAQ,MAAM,OAAO;AACpC,UAAM,IAAI,YAAY,WAAW,QAAQ,GAAG,gBAAgB,QAAQ,EAAE,OAAO;AAC/E,MAAI,QAAQ,QAAQ,QAAQ,QAAS,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO;AAC1E,UAAM,IAAI,YAAY,WAAW,QAAQ,GAAG,oBAAoB,QAAQ,IAAI,EAAE;AAChF,SAAO;AACT;AAEA,eAAsB,SACpB,MACA,OACA,SACA,SACiB;AACjB,QAAM,MAAO,MAAM,KAAK,OAAO,OAAO,QAAQ,QAAQ,MAAM,OAAO,KAAM,KAAK;AAC9E,QAAM,OAAO,MAAM,IAAI,aAAa,QAAQ,QAAQ,KAAK,KAAK,GAAG,OAAO;AACxE,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,cAAc,KAAK,KAAK,KAAK,MAAM,OAAO,EAAE;AAC1E,SAAO,KAAK;AACd;AAEA,eAAsB,QACpB,MACA,MACA,SACA,SACA;AACA,QAAM,MAAgB,CAAC;AACvB,WAAS,KAAK,GAAG,KAAK,KAAK,QAAQ,MAAM;AACvC,UAAM,MAAM,KAAK,EAAE;AACnB,QAAI,QAAQ,WAAY,KAAI,KAAK,KAAK,EAAE,EAAE,KAAK,EAAE;AAAA,aACxC,QAAQ,SAAU,KAAI,KAAK,MAAM,SAAS,MAAM,KAAK,EAAE,EAAE,KAAK,IAAI,SAAS,OAAO,CAAC;AAAA,aACnF,QAAQ,IAAK,KAAI,KAAK,QAAQ,KAAK;AAAA,EAC9C;AACA,SAAO,IAAI,OAAO,CAAC,WAAW,OAAO,KAAK,CAAC;AAC7C;AAQA,SAAS,SAAS,QAAkD;AAClE,MAAI,WAAW,UAAa,WAAW,UAAU,WAAW,OAAQ,QAAO;AAC3E,SAAO,OACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEO,SAAS,QAAQ,QAAgC;AACtD,QAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,QAAM,YAAY,KAAK,QAAQ,SAAS;AACxC,QAAM,QAAQ,YACV,WACE,EAAE,UAAU,SAAS,UAAU,IAC/B,QAAQ,SAAS,IACnB;AACJ,MAAI,aAAa,CAAC;AAChB,WAAO,KAAK,4DAA4D,CAAC;AAC3E,QAAM,SAAS,KAAK,QAAQ,UAAU;AACtC,MAAI,UAAU,CAAC,OAAO,MAAM,EAAG,QAAO,KAAK,6CAA6C,CAAC;AACzF,QAAM,WAAW,KAAK,QAAQ,YAAY,MAAM,SAAS,OAAO,MAAM,IAAI;AAC1E,MAAI,YAAY,CAAC,SAAS,IAAI,QAAQ;AACpC,WAAO,KAAK,6BAA6B,CAAC,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;AACxE,MAAI,KAAK,QAAQ,SAAS,MAAM;AAC9B,WAAO,KAAK,0EAA0E,CAAC;AACzF,QAAM,QAAQ,SAAS,KAAK,QAAQ,SAAS,CAAC;AAC9C,SAAO;AAAA,IACL,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3B;AACF;AAEA,eAAsB,KAAK,MAAY,QAAe;AACpD,QAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,QAAM,OAAO,KAAK,QAAQ,SAAS;AACnC,QAAM,QAAQ,OAAO,SAAS,MAAM,OAAO,IAAI,IAAI;AACnD,MAAI,QAAQ,CAAC;AACX,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,0BAA0B,IAAI,sCAAsC;AAAA,IAClF;AACF,SAAO,EAAE,OAAO,MAAM,MAAM;AAC9B;AAEA,SAAS,OAAO,MAAY,KAAa,MAA0B;AACjE,SAAO,OAAO,UAAU,KAAK,OAAO,MAAM,GAAG,MAAM,IAAI,YAAY,IAAI,OAAO,IAAI,IAAI;AACxF;AAEA,eAAe,UACb,MACA,KACA,CAAC,IAAI,MAAM,GACX,SACA;AACA,MAAI,CAAC,IAAI,aAAa,IAAI,MAAO,QAAO;AACxC,QAAM,YAAY,MAAM,YAAY,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI,MAAM,OAAO;AACxF,MAAI,CAAC,UAAU,SAAS,EAAE,EAAG,QAAO;AACpC,SAAO;AAAA,IACL,aAAa,OAAO,IAAI;AAAA,EAC1B;AACF;AAEA,MAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,iBAAiB,oBAAI,IAAI,CAAC,WAAW,mBAAmB,eAAe,oBAAoB,CAAC;AAClG,MAAM,cAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,YAAY,MAA6C;AACvE,QAAM,QAAQ,KAAK,KAAK,CAAC,QAAQ,YAAY,IAAI,GAAG,KAAK,IAAI,WAAW,UAAU,CAAC;AACnF,SAAO,QAAQ,KAAK,GAAG,KAAK,kCAAkC,CAAC,IAAI;AACrE;AAEA,eAAe,WACb,MACA,SACA,KACA,MACA,SACA;AACA,MAAI,IAAI,MAAO,QAAO,KAAK,8DAA8D;AACzF,QAAM,UAAU,YAAY,IAAI;AAChC,MAAI,QAAS,QAAO;AACpB,QAAM,SAAS,MAAM,MAAM,YAAY;AACvC,QAAM,UAAU,CAAC,GAAG,OAAO,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,IAAI,IAAI,CAAC;AAC7E,MAAI,QAAS,QAAO,KAAK,kBAAkB,OAAO,IAAI,CAAC;AACvD,QAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO;AACxD,MAAI,CAAC,MAAM,OAAQ,QAAO,KAAK,oDAAoD,CAAC;AACpF,QAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,SAAS,MAAM,EAAG,QAAO;AAC7B,QAAM,QAAQ,MAAM,KAAK,MAAM,MAAM;AACrC,MAAI,MAAM,MAAO,QAAO,MAAM;AAC9B,QAAM,SAAS,MAAM,SAAS,MAAM,SAAS,KAAK,OAAO;AACzD,SAAO,KAAK,OAAO;AAAA,IACjB;AAAA,MACE,MAAM,IAAI;AAAA,MACV,MAAM;AAAA,MACN,MAAM,KAAK,QAAQ,QAAQ,KAAK,MAAM,MAAM,QAAQ;AAAA,MACpD,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,MACzC,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAkB,IAAI,CAAC;AAAA,MAChE,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C,SAAS;AAAA,MACT,QAAQ,QAAQ;AAAA,MAChB,WAAW,IAAI;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,QAAQ,MAAM,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,WAAW,MAA6B;AACrD,QAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,QAAM,QAAQ,MAAM,MAAM;AAAA,IACxB,CAAC,UACC,GAAG,MAAM,IAAI,IAAK,MAAM,MAAM,IAAK,MAAM,WAAW,GAAG,MAAM,QAAQ,SAAS,UAAU,MAAM,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE;AAAA,EAC5H;AACA,SAAO;AAAA,IACL,GAAG;AAAA,MACD,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,MAAM,SAAS,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE;AAAA,IAC1D,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,EACd;AACF;AAEA,eAAe,KAAK,MAAY,SAAkB,KAAa,SAAmC;AAChG,MAAI,QAAQ,KAAK,SAAS,UAAU,EAAG,QAAO,WAAW,IAAI;AAC7D,QAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,MAAM,OAAO;AACrD,MAAI,CAAC,KAAK,OAAQ,QAAO,GAAG,aAAa;AACzC,SAAO;AAAA,IACL,GAAG,KAAK,IAAI,CAAC,QAAQ,GAAG,IAAI,MAAM,IAAK,IAAI,IAAI,IAAK,IAAI,QAAQ,GAAG,IAAK,IAAI,OAAO,YAAY,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,EACrH;AACF;AAEA,eAAe,OACb,MACA,SACA,KACA,SACiB;AACjB,QAAM,QAAQ,OAAO,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC;AAC/C,MAAI,CAAC,MAAO,QAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;AAC3E,QAAM,CAAC,EAAE,MAAM,IAAI;AACnB,QAAM,OAAO,MAAM,KAAK,OAAO,KAAK,OAAO,cAAc,OAAO;AAChE,SAAO;AAAA,IACL,GAAG;AAAA,MACD,WAAW,OAAO,MAAM;AAAA,MACxB,SAAS,OAAO,IAAI;AAAA,MACpB,SAAS,OAAO,QAAQ,GAAG;AAAA,MAC3B,SAAS,OAAO,IAAI;AAAA,MACpB,UAAU,OAAO,YAAY,MAAM;AAAA,MACnC,WAAW,KAAK,OAAO,UAAU,OAAO,MAAM,CAAC;AAAA,MAC/C,YAAY,KAAK,OAAO,QAAQ,OAAO,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC7D,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,EACd;AACF;AAEA,eAAe,QACb,MACA,QACA,SACA,SACiB;AACjB,QAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,MAAI,KAAM,QAAO,SAAS,MAAM,MAAM,SAAS,OAAO;AACtD,SAAO,OAAO,KAAK,SAAS,GAAG,IAAI,QAAQ,QAAQ,OAAO,KAAK,KAAK,GAAG;AACzE;AAEA,eAAe,KAAK,MAAY,SAAkB,KAAa,SAAmC;AAChG,QAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AACtD,QAAM,UAAU,CAAC,GAAG,OAAO,QAAQ,EAAE,KAAK,CAAC,SAAS,SAAS,aAAa;AAC1E,MAAI,QAAS,QAAO,KAAK,kBAAkB,OAAO,IAAI,CAAC;AACvD,QAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO;AACzD,MAAI,CAAC,KAAK,KAAK,EAAG,QAAO,KAAK,qCAAqC,CAAC;AACpE,MAAI,QAAQ,KAAK,CAAC,MAAM,UAAU;AAChC,QAAI,CAAC,IAAI,MAAO,QAAO,KAAK,sCAAsC;AAClE,WAAO,KAAK,OAAO,KAAK,IAAI,OAAO,MAAM,MAAM,SAAS,MAAM,SAAS,KAAK,OAAO,GAAG,OAAO;AAAA,EAC/F;AACA,MAAI,IAAI,MAAO,QAAO,KAAK,qCAAqC;AAChE,QAAM,QAAQ,OAAO,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC;AAC/C,MAAI,CAAC,MAAO,QAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;AAC3E,QAAM,UAAU,MAAM,UAAU,MAAM,KAAK,OAAO,OAAO;AACzD,MAAI,QAAS,QAAO;AACpB,QAAM,WAAW,OAAO,SAAS,IAAI,aAAa;AAClD,QAAM,SAAS,MAAM,SAAS,MAAM,SAAS,KAAK,OAAO;AACzD,SAAO,KAAK,OAAO;AAAA,IACjB,MAAM,CAAC;AAAA,IACP;AAAA,IACA,EAAE,WAAW,IAAI,WAAW,SAAS,QAAQ,IAAI,UAAU,QAAQ,IAAI,IAAI,OAAO;AAAA,IAClF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAY,SAAkB,MAAmC;AACnF,QAAM,QAAQ,KAAK,OAAO,MAAM;AAChC,MAAI,CAAC,KAAM,QAAO,KAAK,qCAAqC,CAAC;AAC7D,QAAM,OAAO,QAAQ,QAAQ,QAAQ,SAAS,YAAY,QAAQ,OAAO;AACzE,QAAM,MAAM,OAAO,YAAY,OAAO,IAAI,IAAI;AAC9C,MAAI,QAAQ,CAAC,IAAK,QAAO,KAAK,GAAG,IAAI,sBAAsB;AAC3D,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,UAAM,SAAS,MAAM,OAAO,GAAG;AAC/B,UAAM,OAAO,CAAC,KAAK,IAAI,MAAM,SAAS,MAAM,GAAG,OAAO,IAAI,EAAE,SAAS,IAAI;AACzE,WAAO,OACF,MACD,KAAK,sDAAsD;AAAA,EACjE;AACA,QAAM,OAAO,MAAM,IAAI,MAAM,YAAY,MAAM,IAAI;AACnD,QAAM,OAAmB,OAAO,QAAQ,IAAI,KAAK;AACjD,MAAI,SAAS,OAAQ,QAAO;AAC5B,SAAQ,UAAU,OAAO,MAAM,IAAI,IAAI,CAAC,KAAgC;AAC1E;AAEA,MAAM,gBAAgB,CAAC,QAAQ,SAAS;AAExC,SAAS,SAAS,MAAmC;AACnD,SAAO,KAAK,QAAQ,CAAC,QAAQ;AAC3B,UAAM,KAAK,IAAI,QAAQ,GAAG;AAC1B,UAAM,OAAO,IAAI,MAAM,GAAG,EAAE;AAC5B,WAAO,KAAK,MAAM,SAAS,YAAY,SAAS,cAAc,CAAC,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG;AAAA,EAChG,CAAC;AACH;AAEA,SAAS,eAAe,SAAyB;AAC/C,QAAM,MAAO,cAAoC,SAAS,OAAO;AACjE,QAAM,OAAO,MACT,UAAU,OAAO,gCACjB,6BAA6B,OAAO;AACxC,SAAO;AAAA,IACL,GAAG,IAAI,wBAAwB,cAAc,IAAI,CAAC,SAAS,UAAU,IAAI,EAAE,EAAE,KAAK,MAAM,CAAC;AAAA,IACzF;AAAA,EACF;AACF;AAIA,eAAe,SACb,MACA,OACA,SACA,QACA,QACA,SACiB;AACjB,MAAI,CAAC,QAAQ;AACX,WAAO,KAAK,qEAAqE;AACnF,MAAI,OAAO;AACT,WAAO,KAAK,gFAAgF;AAC9F,MAAI,KAAK,QAAQ,UAAU,MAAM;AAC/B,WAAO,KAAK,6EAA6E,CAAC;AAC5F,QAAM,SAAS,WAAW,MAAM,SAAS,OAAO,KAAK,CAAC,KAAK,EAAE;AAC7D,MAAI,SAAS,MAAM,EAAG,QAAO;AAC7B,QAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,GAAG,SAAS,OAAO,GAAG,KAAK;AAC3E,QAAM,SAAS,MAAM,SAAS,MAAM,SAAS,OAAO,KAAK,OAAO;AAChE,QAAM,OAAO,SAAS,QAAQ,MAAM,QAAQ,IAAI;AAChD,QAAM,MAAM,QAAQ,OAAO,SAAS,EAAE,GAAG,MAAM,OAAO,IAAI,MAAM,OAAO;AACvE,SAAO,GAAG,EAAE;AACd;AAEA,SAAS,aAAa,MAAY,SAA0C;AAC1E,QAAM,OAAO,QAAQ,QAAQ,QAAQ,SAAS,YAAY,QAAQ,OAAO;AACzE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,MAAM,YAAY,KAAK,OAAO,MAAM,GAAG,IAAI;AACjD,MAAI,CAAC,IAAK,QAAO,KAAK,GAAG,IAAI,sBAAsB;AACnD,MAAI,IAAI,WAAW,QAAQ,EAAG,QAAO,KAAK,gDAAgD;AAC1F,SAAO,IAAI,MAAM,YAAY,MAAM;AACrC;AAEA,eAAe,YACb,MACA,SACA,QACA,QACA,SACiB;AACjB,MAAI,CAAC,KAAK,QAAS,QAAO,KAAK,0CAA0C;AACzE,QAAM,SAAS,KAAK,QAAQ,UAAU;AACtC,MAAI,CAAC;AACH,WAAO,KAAK,2EAA2E,CAAC;AAC1F,MAAI,OAAO,KAAK,CAAC,MAAM;AACrB,WAAO,KAAK,0EAAqE,CAAC;AACpF,QAAM,QAAQ,aAAa,MAAM,OAAO;AACxC,MAAI,SAAS,KAAK,EAAG,QAAO;AAC5B,QAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,GAAG,SAAS,OAAO;AAClE,MAAI,CAAC,KAAK,KAAK,EAAG,QAAO,KAAK,qCAAqC,CAAC;AACpE,QAAM,SAAS,MAAM,SAAS,MAAM,SAAS,OAAO,KAAK,OAAO;AAChE,QAAM,YAAY,MAAM,KAAK;AAAA,IAC3B,WAAW,QAAQ,KAAK;AAAA,IACxB,EAAE,GAAG,gBAAgB,KAAK,QAAQ,CAAC,GAAG,OAAO;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,YACH,GAAG,EAAE,IACL,KAAK,uBAAuB,MAAM,2BAA2B,MAAM,OAAO;AAChF;AAEA,SAAS,QAAQ,QAAsB;AACrC,SAAO,EAAE,GAAG,QAAQ,MAAM,OAAO,KAAK,MAAM,CAAC,EAAE;AACjD;AAEA,eAAe,SACb,MACA,SACA,SACA,SACiB;AACjB,QAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,UAAU,UAAU,UAAU,CAAC;AAC5E,QAAM,UAAU,CAAC,GAAG,OAAO,QAAQ,EAAE,CAAC;AACtC,MAAI,QAAS,QAAO,KAAK,kBAAkB,OAAO,IAAI,CAAC;AACvD,QAAM,UAAU,KAAK,QAAQ,QAAQ,KAAK;AAC1C,MAAI,CAAC,cAAc,SAAS,OAAO,EAAG,QAAO,eAAe,OAAO;AACnE,MAAI,CAAC,KAAK,MAAO,QAAO,KAAK,uCAAuC;AACpE,QAAM,SAAS;AAAA,IACb,KAAK,SAAS,KAAK,QAAQ,SAAS,OAAO;AAAA,IAC3C,SAAU,QAAoB;AAAA,EAChC;AACA,SAAO,YAAY,SACf,SAAS,MAAM,KAAK,OAAO,SAAS,QAAQ,QAAQ,OAAO,IAC3D,YAAY,MAAM,SAAS,QAAQ,QAAQ,OAAO;AACxD;AAEA,eAAe,OACb,MACA,QACA,SACiB;AACjB,QAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,QAAQ,OAAO,IAAI;AAC1D,QAAM,SAAS,MAAM,KAAK,IAAI,QAAQ,KAAK,OAAO;AAClD,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM,OAAQ,QAAO;AAC/C,QAAM,SAAS,CAAC,GAAG,OAAO,KAAK,EAAE;AAAA,IAC/B,CAAC,GAAG,MAAM,OAAO,SAAS,EAAE,MAAM,EAAE,IAAI,OAAO,SAAS,EAAE,MAAM,EAAE;AAAA,EACpE,EAAE,CAAC;AACH,QAAM,OAAO,MAAM,KAAK,IAAI,aAAa,GAAG,GAAG,IAAI,QAAQ,IAAI,IAAI,OAAO;AAC1E,SAAO,KAAK,KAAK,KAAK,MAAM,QAAQ,IAAI;AAC1C;AAEA,SAAS,YAAY,MAAY,KAAa,MAA4C;AACxF,MAAI,CAAC,KAAK,OAAQ,QAAO,KAAK,kCAAkC,CAAC;AACjE,QAAM,UAAU,KAAK,OAAO,CAAC,SAAS,CAAC,OAAO,MAAM,KAAK,IAAI,CAAC;AAC9D,MAAI,QAAQ;AACV,WAAO,KAAK,QAAQ,IAAI,CAAC,SAAS,QAAQ,KAAK,OAAO,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAClF,SAAO,KAAK,IAAI,CAAC,SAAU,OAAO,MAAM,KAAK,IAAI,EAAwB,CAAC,CAAC;AAC7E;AAEA,eAAe,MACb,MACA,KACA,SACA,SACiB;AACjB,QAAM,WAAW,KAAK,IAAI,IAAI,UAAU;AACxC,MAAI,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAK,OAAO;AACjD,SAAO,KAAK,UAAU,KAAK,IAAI,IAAI,UAAU;AAC3C,UAAM,IAAI,QAAQ,CAAC,SAAS,WAAW,MAAM,GAAG,CAAC;AACjD,WAAO,MAAM,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,EAC/C;AACA,QAAM,QAAQ,KAAK,OAAO,MAAM;AAChC,QAAM,WAAqB,CAAC;AAC5B,aAAW,MAAM,KAAK;AACpB,UAAM,SAAS,MAAM,OAAO,EAAE;AAC9B,QAAI;AACF,eAAS;AAAA,QACP,MAAM,OAAO,MAAM,GAAG,KAAK,SAAS,EAAE,IAAI,qBAAqB,EAAE;AAAA,EAAK,MAAM,OAAO,MAAM,QAAQ,OAAO,CAAC;AAAA,MAC3G;AAAA,EACJ;AACA,QAAM,OAAO,GAAG,SAAS,KAAK,MAAM,CAAC;AAAA;AACrC,MAAI,CAAC,KAAK,OAAQ,QAAO,GAAG,IAAI;AAChC,QAAM,QAAQ,KAAK,IAAI,CAAC,OAAO,MAAM,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,IAAI;AAClE,SAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,0BAA0B,OAAO,qBAAqB,KAAK;AAAA,EAAK;AAChG;AAEA,eAAe,KAAK,MAAY,SAAkB,KAAa,SAAmC;AAChG,QAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;AACzD,QAAM,UAAU,CAAC,GAAG,OAAO,QAAQ,EAAE,KAAK,CAAC,SAAS,SAAS,UAAU;AACvE,MAAI,QAAS,QAAO,KAAK,kBAAkB,OAAO,IAAI,CAAC;AACvD,QAAM,UAAU,OAAO,KAAK,QAAQ,WAAW,KAAK,cAAc;AAClE,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,WAAW;AAC3C,WAAO,KAAK,wDAAwD,CAAC;AACvE,QAAM,MAAM,YAAY,MAAM,KAAK,OAAO,IAAI;AAC9C,MAAI,SAAS,GAAG,EAAG,QAAO;AAC1B,MAAI,CAAC,OAAO,SAAS,IAAI,UAAU,EAAG,QAAO,MAAM,MAAM,KAAK,SAAS,OAAO;AAC9E,MAAI,CAAC,IAAI,aAAa,IAAI;AACxB,WAAO,KAAK,+DAA+D;AAC7E,QAAM,SAAS,MAAM,SAAS,MAAM,SAAS,KAAK,OAAO;AACzD,QAAM,KAAK,OAAO,eAAe,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,UAAU,KAAM,QAAQ,OAAO;AAC5F,SAAO,GAAG,uCAAuC,IAAI,SAAS,IAAI,aAAa,OAAO;AAAA,CAAS;AACjG;AAEA,eAAe,KAAK,MAAY,SAAkB,KAAa,SAAmC;AAChG,MAAI,IAAI,MAAO,QAAO,KAAK,4BAA4B;AACvD,QAAM,QAAQ,OAAO,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC;AAC/C,MAAI,CAAC,MAAO,QAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;AAC3E,QAAM,UAAU,MAAM,UAAU,MAAM,KAAK,OAAO,OAAO;AACzD,MAAI,QAAS,QAAO;AACpB,SAAO,KAAK,OAAO,KAAK,MAAM,CAAC,GAAG,IAAI,WAAW,OAAO;AAC1D;AAEA,eAAe,OACb,MACA,SACA,KACA,SACiB;AACjB,MAAI,IAAI,MAAO,QAAO,KAAK,8BAA8B;AACzD,QAAM,QAAQ,OAAO,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC;AAC/C,MAAI,CAAC,MAAO,QAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;AAC3E,QAAM,UAAU,MAAM,UAAU,MAAM,KAAK,OAAO,OAAO;AACzD,MAAI,QAAS,QAAO;AACpB,SAAO,KAAK,OAAO,OAAO,MAAM,CAAC,GAAG,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,OAAO;AAC9E;AAIA,MAAM,OAAa,YAAY,GAAG,KAAK;AAEvC,MAAM,QAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,OAAO,MAAM,SAAS,KAAK,YACnC,KAAK,WACD,KAAK;AAAA,IACH,QAAQ,KAAK,MAAM,CAAC;AAAA,IACpB,EAAE,GAAG,KAAK,QAAQ,MAAM,SAAS,MAAM,SAAS,KAAK,OAAO,EAAE;AAAA,IAC9D;AAAA,IACA;AAAA,EACF,IACA,KAAK,2CAA2C;AAAA,EACtD;AAAA,EACA,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU,CAAC,MAAM,SAAS,MAAM,YAAY,WAAW,MAAM,QAAQ,KAAK,CAAC,KAAK,IAAI,OAAO;AAAA,EAC3F,UAAU,CAAC,MAAM,SAAS,MAAM,YAAY,WAAW,MAAM,QAAQ,KAAK,CAAC,KAAK,IAAI,OAAO;AAC7F;AAEO,SAAS,QAAQ,OAA8B,MAAsB;AAC1E,QAAM,KAAK,KAAK,WAAW,QAAQ,IAAI,OAAO,SAAS,IAAI;AAC3D,QAAM,SACJ,MAAM,OAAO,EAAE,GAAG,WAAW,SACzB,MAAM,OAAO,EAAE,IACf,OAAO,OAAO,MAAM,MAAM,EAAE;AAAA,IAC1B,CAAC,cAAc,UAAU,UAAU,UAAU,SAAS;AAAA,EACxD;AACN,QAAM,SAAS,QAAQ,SAAS,MAAM,SAAS,OAAO,MAAM,IAAI;AAChE,MAAI,OAAQ,QAAO,SAAS,IAAI,wBAAwB,OAAO,IAAI;AACnE,SAAO,qBAAqB,IAAI,GAAG,KAAK;AAC1C;AAEO,SAAS,YAAY,SAAkB,KAA0B;AACtE,QAAM,UAAU,IAAI,UAAU,IAAI,YAAY,IAAI,OAAO;AACzD,SAAO,EAAE,SAAS,MAAM,IAAI,MAAM,KAAK,YAAY,OAAQ,QAAQ,OAAO,OAAQ,KAAK;AACzF;AAEA,eAAe,SACb,MACA,SACA,KACA,SACiB;AACjB,MAAI,QAAQ,OAAO;AACjB,WAAO,KAAK,QACR,KAAK,MAAM,QAAQ,MAAM,YAAY,SAAS,GAAG,GAAG,OAAO,IAC3D,EAAE,MAAM,GAAG,KAAK,kDAAkD;AACxE,MAAI,QAAQ,OAAO;AACjB,WAAO,KAAK,SACR,KAAK,OAAO,QAAQ,MAAM,IAAI,IAAI,OAAO,IACzC,KAAK,uCAAuC;AAClD,MAAI,QAAQ,OAAO;AACjB,WAAO,KAAK,YACR,KAAK,UAAU,QAAQ,MAAM,IAAI,IAAI,OAAO,IAC5C,KAAK,8CAA8C;AACzD,MAAI,QAAQ,OAAO;AACjB,WAAO,KAAK,UACR,KAAK,QAAQ,QAAQ,MAAM,IAAI,IAAI,SAAS;AAAA,MAC1C,MAAM,QAAQ,QAAQ;AAAA,MACtB,KAAK,QAAQ;AAAA,IACf,CAAC,IACD,KAAK,4CAA4C;AACvD,MAAI,QAAQ,OAAO;AACjB,WAAO,KAAK,SACR,KAAK,OAAO,QAAQ,MAAM,IAAI,IAAI,OAAO,IACzC,KAAK,uCAAuC;AAClD,QAAM,QAAQ,QAAQ,KAAK,CAAC,KAAK;AACjC,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAM,QAAO,KAAK,MAAM,SAAS,KAAK,OAAO;AACjD,MAAI,QAAQ,OAAO,YAAY;AAC7B,QAAI,UAAU,QAAS,QAAO,WAAW,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM,CAAC,GAAG,OAAO;AAC3F,WAAO,EAAE,MAAM,GAAG,KAAK,MAAM;AAAA,EAC/B;AACA,MAAI,CAAC,QAAQ,KAAK,OAAQ,QAAO,EAAE,MAAM,GAAG,KAAK,MAAM;AACvD,MAAI,QAAQ,KAAK,SAAS,SAAS;AACjC,WAAO,WAAW,MAAM,SAAS,KAAK,QAAQ,MAAM,OAAO;AAC7D,SAAO,QAAQ,MAAM,SAAS,KAAK,OAAO;AAC5C;AAEA,MAAM,WAAW,oBAAI,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,UAAU,SAA6B;AACrD,QAAM,OAAa;AAAA,IACjB,GAAG;AAAA,IACH,KAAK,QAAQ,OAAO,KAAK;AAAA,IACzB,MAAM,EAAE,SAAS,oBAAI,IAAI,EAAE;AAAA,IAC3B,QAAQ,QAAQ,UAAU;AAAA,EAC5B;AACA,SAAO;AAAA,IACL,SAAS,SAAS;AAChB,UAAI,QAAQ,OAAO,QAAS,QAAO;AACnC,YAAM,QAAQ,QAAQ,KAAK,CAAC,KAAK;AACjC,UAAI,SAAS,IAAI,KAAK,EAAG,QAAO;AAChC,aAAO,QAAQ,OAAO,WAAW,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,KAAK,SAAS,SAAS;AAAA,IACpF;AAAA,IACA,MAAM,IAAI,SAAS,SAAS;AAC1B,UAAI;AACF,YAAI,UAAU,OAAO;AACnB,iBAAO,MAAM,SAAS,MAAM,SAAS,UAAU,KAAK,MAAM,GAAG,OAAO;AACtE,cAAM,UAAU,MAAM,SAAS,MAAM,SAAS,OAAO;AACrD,cAAM,OAAO,SAAS,QAAQ,IAAI;AAClC,YAAI,QAAQ,OAAO,WAAW,KAAK,CAAC,MAAM,UAAU,KAAK,SAAS,QAAQ;AACxE,iBAAO,MAAM,SAAS,MAAM,EAAE,GAAG,SAAS,KAAK,GAAG,SAAS,OAAO;AACpE,eAAO,MAAM,SAAS,MAAM,SAAS,SAAS,KAAK,QAAQ,SAAS,OAAO,GAAG,OAAO;AAAA,MACvF,SAAS,OAAO;AACd,eAAO,KAAM,MAAgB,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { Harness } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport type { Agents, AgentsState } from '../agents.ts';\nimport { distinctTaints, type InheritedTaint } from '../guests/guard.ts';\nimport { reviewersOf } from '../guests/scoop.ts';\nimport { taggedTaints } from '../guests/tags.ts';\nimport { CONE_PREFIX } from '../kernel/accounts.ts';\nimport type { Lineage } from '../kernel/lineage.ts';\nimport { resolve } from '../kernel/paths.ts';\nimport { agentOfUser, type Layout, LEGACY, ROOT_USER } from '../layout.ts';\nimport { cronLick } from '../licks/crontab.ts';\nimport { webhookDelivery } from '../licks/events.ts';\nimport { LICK_CHANNELS, type LickTarget } from '../licks/lick.ts';\nimport type { Licks } from '../licks/licks.ts';\nimport { scopedName, type WebhookDelivery } from '../licks/sources.ts';\nimport { findRole, type Roles } from '../roles/roles.ts';\nimport { callerOf as agentOf } from './identity.ts';\nimport type { Request, Runner } from './requests.ts';\nimport { type Answer, findScoop, modelOf, type Scoops } from './service.ts';\nimport { cancelSync, detachSync, runSync, type SyncState } from './sync.ts';\nimport { callerTaints } from './taints.ts';\n\nexport const DEFAULT_WAIT_S = 30;\nexport const MAX_DEPTH = 3;\nexport const RUN_DIR = '/var/lib/slicc/agent/scoops';\n\nexport const THINKING = new Set(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']);\nconst EFFORT: Record<string, string> = { low: 'low', medium: 'medium', high: 'high', max: 'xhigh' };\n\nexport const USAGE = `usage:\n agent [options] (--prompt <text> | --file <path> | -)... run a scoop, wait, print its answer\n agent --async [options] (--prompt <text> | --file <path> | -)... start a scoop, print its handle\n agent <cwd> <allowed-commands> <prompt> the same as a synchronous run, in v6's form\n agent list [--agents] | status <handle> | rename <handle> <name>\n agent send <handle> [--follow-up] (<message> | --file <path> | -)\n agent send <target> --lick=<cron|webhook> [--source <name>] (<message> | --file <path> | -)\n agent send parent <note> from a scoop: a progress note to its cone\n agent wait <handle>... [--timeout <seconds>] [--notify]\n agent stop <handle>\n agent workflow run|list|status|stop|save ... Claude Code workflows; agent workflow help\n\noptions:\n --name <name> --agent <role> --model <provider/model> --thinking <level> | --effort <low|medium|high|max>\n --tools <a,b> --read-only <path,path> --system-prompt <text> | --system-prompt-file <path>\n --background-after <seconds> --persist-session | --no-persist-session\n\nA synchronous run removes the scoop's folder afterwards. Its transcript is archived in\n/tmp/agent-sessions/<handle>.md, in /home/sessions/<handle>.md with --persist-session, or nowhere\nwith --no-persist-session. subagent is the same command: subagent spawn = agent --async.\n`;\n\nexport interface CliOptions {\n env: ExecutionEnv;\n harness: Harness;\n agents: Agents;\n scoops: Scoops;\n roles: () => Promise<Roles>;\n alive?: (pid: number) => Promise<boolean>;\n now?: () => number;\n memory?: (argv: readonly string[], caller: string | null, context: Context) => Promise<Answer>;\n gelatiere?: (argv: readonly string[], caller: string | null, context: Context) => Promise<Answer>;\n freezer?: (\n argv: readonly string[],\n caller: string | null,\n context: Context,\n asker?: { user: string | null; cwd: string }\n ) => Promise<Answer>;\n models?: (argv: readonly string[], caller: string | null, context: Context) => Promise<Answer>;\n layout?: Layout;\n panel?: (argv: readonly string[], caller: PanelCaller, context: Context) => Promise<Answer>;\n licks?: Pick<Licks, 'deliver'>;\n webhook?: (name: string, delivery: WebhookDelivery, context: Context) => Promise<boolean>;\n workflow?: (\n argv: readonly string[],\n who: Caller & { taints: InheritedTaint[] },\n request: Request,\n context: Context\n ) => Promise<Answer>;\n}\n\nexport interface PanelCaller {\n agentId: string | null;\n cone: string;\n tab: string | null;\n}\n\nexport type Deps = CliOptions & { now: () => number; sync: SyncState; layout: Layout };\n\nexport interface Caller {\n id: string | null;\n cone: string;\n fromAgent: boolean;\n scoop: string | null;\n depth: number;\n tagged?: InheritedTaint[];\n}\n\nexport type Flags = { values: Map<string, string[]>; switches: Set<string>; rest: string[] };\n\nexport const ok = (out: string): Answer => ({ code: 0, out });\nexport const fail = (out: string, code = 1): Answer => ({ code, out: `agent: ${out}\\n` });\n\nexport function isAnswer(value: unknown): value is Answer {\n return typeof value === 'object' && value !== null && 'code' in value && 'out' in value;\n}\n\nexport function flags(argv: readonly string[], withValue: readonly string[]): Flags {\n const values = new Map<string, string[]>();\n const switches = new Set<string>();\n const rest: string[] = [];\n for (let at = 0; at < argv.length; at++) {\n const arg = argv[at] as string;\n if (withValue.includes(arg)) {\n const value = argv[at + 1];\n if (value === undefined) throw new Error(`${arg} needs a value`);\n values.set(arg, [...(values.get(arg) ?? []), value]);\n at++;\n } else if (arg.startsWith('--')) switches.add(arg);\n else rest.push(arg);\n }\n return { values, switches, rest };\n}\n\nexport function last(parsed: Flags, flag: string): string | undefined {\n return parsed.values.get(flag)?.at(-1);\n}\n\nfunction claimed(agents: Agents, caller: string): Caller | undefined {\n const state = agents.state();\n if (caller.startsWith('cone:') && state.cones[caller.slice(5)]) {\n const cone = caller.slice(5);\n return { id: `cone:${cone}`, cone, fromAgent: true, scoop: null, depth: 0 };\n }\n const record = caller.startsWith('scoop:') ? state.scoops[caller] : undefined;\n if (record)\n return { id: caller, cone: record.cone, fromAgent: true, scoop: caller, depth: record.depth };\n return undefined;\n}\n\nexport class CallerError extends Error {}\n\nexport async function taintsOf(deps: Deps, request: Request, who: Caller, context: Context) {\n const own = await callerTaints(deps.harness, deps.agents.state(), who, request.caller, context);\n return who.tagged ? distinctTaints([...own, ...who.tagged]) : own;\n}\n\nfunction anonymous(agents: Agents): Caller {\n return { id: null, cone: agents.activeCone(), fromAgent: false, scoop: null, depth: 0 };\n}\n\nexport function callerOf(agents: Agents, request: Request, lineage: Lineage | undefined): Caller {\n if (!lineage) throw new CallerError(\"can't tell which process is asking from the process table\");\n const walked = lineage.agent === null ? undefined : agentOf(agents, lineage.agent);\n const user = request.user;\n if (!user || user === ROOT_USER) {\n if (request.caller && request.caller !== walked)\n throw new CallerError(\n `SLICC_AGENT says ${request.caller}, but this process belongs to ${walked ?? 'no agent'}`\n );\n return (walked ? claimed(agents, walked) : undefined) ?? anonymous(agents);\n }\n const own = agentOfUser(agents.state(), user);\n if (request.caller && request.caller !== own)\n throw new CallerError(`SLICC_AGENT says ${request.caller}, but you are ${user}`);\n if (walked && walked !== own)\n throw new CallerError(`you are ${user}, but this process belongs to ${walked}`);\n const found = own ? claimed(agents, own) : undefined;\n if (!found) throw new CallerError(`${user} is no cone or live scoop`);\n return found;\n}\n\nconst UNCHECKED = new Set(['__cancel', '__detach']);\n\nfunction unchecked(request: Request): boolean {\n return request.as === 'agent' && UNCHECKED.has(request.argv[0] ?? '');\n}\n\nfunction sameArgs(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((arg, at) => arg === b[at]);\n}\n\nfunction runsCommand(argv: readonly string[], request: Request): boolean {\n return argv.some(\n (arg, at) =>\n at > 0 && arg.split('/').at(-1) === request.as && sameArgs(argv.slice(at + 1), request.argv)\n );\n}\n\nasync function uidOf(deps: Deps, user: string, context: Context): Promise<number | undefined> {\n const read = await deps.env.readTextFile('/etc/passwd', context);\n const line = read.ok ? read.value.split('\\n').find((entry) => entry.startsWith(`${user}:`)) : '';\n const uid = Number(line?.split(':')[2] ?? Number.NaN);\n return Number.isInteger(uid) ? uid : undefined;\n}\n\nasync function attested(\n deps: Deps,\n request: Request,\n context: Context\n): Promise<Lineage | undefined> {\n const lineage = await deps.scoops.lineage(request.pid);\n if (!lineage) return undefined;\n if (!runsCommand(lineage.argv, request))\n throw new CallerError(`process ${request.pid} is not this ${request.as} call`);\n if (request.user && lineage.uid !== (await uidOf(deps, request.user, context)))\n throw new CallerError(`process ${request.pid} does not run as ${request.user}`);\n return lineage;\n}\n\nasync function tagTaints(\n deps: Deps,\n lineage: Lineage | undefined,\n context: Context\n): Promise<InheritedTaint[]> {\n const tags = lineage ? [...lineage.tags, ...lineage.recent] : [];\n return tags.length ? taggedTaints(deps.harness, tags, context) : [];\n}\n\nfunction withTags(who: Caller, tagged: readonly InheritedTaint[]): Caller {\n return tagged.length ? { ...who, tagged: [...tagged] } : who;\n}\n\nexport async function readText(\n deps: Deps,\n value: string,\n request: Request,\n context: Context\n): Promise<string> {\n const env = (await deps.layout.envFor(request.user ?? null, context)) ?? deps.env;\n const read = await env.readTextFile(resolve(request.cwd, value), context);\n if (!read.ok) throw new Error(`can't read ${value}: ${read.error.message}`);\n return read.value;\n}\n\nexport async function prompts(\n deps: Deps,\n argv: readonly string[],\n request: Request,\n context: Context\n) {\n const out: string[] = [];\n for (let at = 0; at < argv.length; at++) {\n const arg = argv[at];\n if (arg === '--prompt') out.push(argv[++at] ?? '');\n else if (arg === '--file') out.push(await readText(deps, argv[++at] ?? '', request, context));\n else if (arg === '-') out.push(request.stdin);\n }\n return out.filter((prompt) => prompt.trim());\n}\n\nexport type Choice = {\n model?: { provider: string; modelId: string };\n thinking?: string;\n tools?: string[];\n};\n\nfunction toolList(listed: string | undefined): string[] | undefined {\n if (listed === undefined || listed === 'auto' || listed === 'full') return undefined;\n return listed\n .split(',')\n .map((tool) => tool.trim())\n .filter(Boolean);\n}\n\nexport function choices(parsed: Flags): Choice | Answer {\n const provider = last(parsed, '--provider');\n const modelText = last(parsed, '--model');\n const model = modelText\n ? provider\n ? { provider, modelId: modelText }\n : modelOf(modelText)\n : undefined;\n if (modelText && !model)\n return fail('--model needs provider/model, or --provider with --model', 2);\n const effort = last(parsed, '--effort');\n if (effort && !EFFORT[effort]) return fail('--effort must be low, medium, high or max', 2);\n const thinking = last(parsed, '--thinking') ?? (effort ? EFFORT[effort] : undefined);\n if (thinking && !THINKING.has(thinking))\n return fail(`--thinking must be one of ${[...THINKING].join(', ')}`, 2);\n if (last(parsed, '--tools') === 'output')\n return fail('--tools output needs --schema-b64, which is not supported in SLICC yet', 2);\n const tools = toolList(last(parsed, '--tools'));\n return {\n ...(model ? { model } : {}),\n ...(thinking ? { thinking } : {}),\n ...(tools ? { tools } : {}),\n };\n}\n\nexport async function role(deps: Deps, parsed: Flags) {\n const roles = await deps.roles();\n const name = last(parsed, '--agent');\n const found = name ? findRole(roles.roles, name) : undefined;\n if (name && !found)\n return {\n roles,\n error: fail(`there is no agent role ${name}; \\`agent list --agents\\` shows them`),\n };\n return { roles, role: found };\n}\n\nfunction handle(deps: Deps, who: Caller, name: string | undefined) {\n return name ? findScoop(deps.agents.state(), name, who.fromAgent ? who.cone : null) : undefined;\n}\n\nasync function reviewing(\n deps: Deps,\n who: Caller,\n [id, record]: [string, { name: string }],\n context: Context\n) {\n if (!who.fromAgent || who.scoop) return undefined;\n const reviewers = await reviewersOf(deps.harness, deps.agents.state(), who.cone, context);\n if (!reviewers.includes(id)) return undefined;\n return fail(\n `the scoop ${record.name} reviews this guest run's requests, so this run can't ask anything of it`\n );\n}\n\nconst ASYNC_VALUES = [\n '--name',\n '--agent',\n '--provider',\n '--model',\n '--thinking',\n '--effort',\n '--tools',\n '--prompt',\n '--file',\n];\nconst ASYNC_SWITCHES = new Set(['--async', '--no-extensions', '--no-skills', '--no-context-files']);\nconst UNSUPPORTED = new Set([\n '--no-prompt-templates',\n '--session',\n '--resume',\n '--image',\n '--no-escalate',\n '--minimal',\n '--usage',\n '--schema-b64',\n '--cwd',\n]);\n\nexport function unsupported(argv: readonly string[]): Answer | undefined {\n const found = argv.find((arg) => UNSUPPORTED.has(arg) || arg.startsWith('--image='));\n return found ? fail(`${found} is not supported in SLICC yet`, 2) : undefined;\n}\n\nasync function spawnAsync(\n deps: Deps,\n request: Request,\n who: Caller,\n argv: readonly string[],\n context: Context\n) {\n if (who.scoop) return fail('a scoop cannot start async scoops; run agent without --async');\n const refused = unsupported(argv);\n if (refused) return refused;\n const parsed = flags(argv, ASYNC_VALUES);\n const unknown = [...parsed.switches].find((flag) => !ASYNC_SWITCHES.has(flag));\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const given = await prompts(deps, argv, request, context);\n if (!given.length) return fail('--async needs at least one --prompt, --file or -', 2);\n const chosen = choices(parsed);\n if (isAnswer(chosen)) return chosen;\n const found = await role(deps, parsed);\n if (found.error) return found.error;\n const taints = await taintsOf(deps, request, who, context);\n return deps.scoops.spawn(\n {\n cone: who.cone,\n kind: 'async',\n name: last(parsed, '--name') ?? found.role?.name ?? 'scoop',\n ...(found.role ? { role: found.role } : {}),\n ...(chosen.model ? { model: chosen.model } : {}),\n ...(chosen.thinking ? { thinking: chosen.thinking as never } : {}),\n ...(chosen.tools ? { tools: chosen.tools } : {}),\n prompts: given,\n origin: request.cwd,\n fromAgent: who.fromAgent,\n request: request.id,\n limits: found.roles.limits,\n taints,\n },\n context\n );\n}\n\nasync function listAgents(deps: Deps): Promise<Answer> {\n const roles = await deps.roles();\n const lines = roles.roles.map(\n (entry) =>\n `${entry.name}\\t${entry.source}\\t${entry.description}${entry.aliases.length ? ` (also ${entry.aliases.join(', ')})` : ''}`\n );\n return ok(\n `${[\n ...lines,\n '',\n 'Agent files are read from the built-in roles, installed packages (pi-subagents.agents) and ~/.pi/agent/agents.',\n \"A project's .pi/agents folder is read only once the folder is trusted, which SLICC doesn't support yet.\",\n ...roles.warnings.map((warning) => `warning: ${warning}`),\n ].join('\\n')}\\n`\n );\n}\n\nasync function list(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n if (request.argv.includes('--agents')) return listAgents(deps);\n const rows = await deps.scoops.list(who.cone, context);\n if (!rows.length) return ok('no scoops\\n');\n return ok(\n `${rows.map((row) => `${row.folder}\\t${row.name}\\t${row.role ?? '-'}\\t${row.busy ? 'working' : 'idle'}`).join('\\n')}\\n`\n );\n}\n\nasync function status(\n deps: Deps,\n request: Request,\n who: Caller,\n context: Context\n): Promise<Answer> {\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const [, record] = found;\n const busy = await deps.scoops.busy(record.conversation, context);\n return ok(\n `${[\n `handle: ${record.folder}`,\n `name: ${record.name}`,\n `role: ${record.role ?? '-'}`,\n `kind: ${record.kind}`,\n `state: ${busy ? 'working' : 'idle'}`,\n `folder: ${deps.layout.scoopRoot(record.folder)}`,\n `reports: ${deps.layout.reports(record.folder, record.cone)}`,\n ].join('\\n')}\\n`\n );\n}\n\nasync function message(\n deps: Deps,\n parsed: Flags,\n request: Request,\n context: Context\n): Promise<string> {\n const file = last(parsed, '--file');\n if (file) return readText(deps, file, request, context);\n return parsed.rest.includes('-') ? request.stdin : parsed.rest.join(' ');\n}\n\nasync function send(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n const parsed = flags(request.argv.slice(2), ['--file']);\n const unknown = [...parsed.switches].find((flag) => flag !== '--follow-up');\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const text = await message(deps, parsed, request, context);\n if (!text.trim()) return fail('send needs a message, --file or -', 2);\n if (request.argv[1] === 'parent') {\n if (!who.scoop) return fail('only a scoop has a parent to send to');\n return deps.scoops.note(who.scoop, text, await taintsOf(deps, request, who, context), context);\n }\n if (who.scoop) return fail('a scoop can only send to its parent');\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const refused = await reviewing(deps, who, found, context);\n if (refused) return refused;\n const followUp = parsed.switches.has('--follow-up');\n const taints = await taintsOf(deps, request, who, context);\n return deps.scoops.feed(\n found[0],\n text,\n { fromAgent: who.fromAgent, request: request.id, followUp, target: who.id, taints },\n context\n );\n}\n\nfunction cronTarget(deps: Deps, request: Request, name: string): LickTarget | Answer {\n const state = deps.agents.state();\n if (!name) return fail('send needs cone or a scoop handle', 2);\n const user = request.user && request.user !== ROOT_USER ? request.user : undefined;\n const own = user ? agentOfUser(state, user) : undefined;\n if (user && !own) return fail(`${user} is no cone or scoop`);\n if (own?.startsWith('scoop:')) {\n const record = state.scoops[own] as { name: string };\n const mine = [own, own.slice('scoop:'.length), record.name].includes(name);\n return mine\n ? (own as LickTarget)\n : fail(\"a scoop's cron job can only send to the scoop itself\");\n }\n const cone = own ? own.slice(CONE_PREFIX.length) : null;\n const home: LickTarget = cone ? `cone:${cone}` : 'cone';\n if (name === 'cone') return home;\n return (findScoop(state, name, cone)?.[0] as LickTarget | undefined) ?? home;\n}\n\nconst PROCESS_LICKS = ['cron', 'webhook'];\n\nfunction expanded(argv: readonly string[]): string[] {\n return argv.flatMap((arg) => {\n const at = arg.indexOf('=');\n const name = arg.slice(0, at);\n return at > 0 && (name === '--lick' || name === '--source') ? [name, arg.slice(at + 1)] : [arg];\n });\n}\n\nfunction refusedChannel(channel: string): Answer {\n const own = (LICK_CHANNELS as readonly string[]).includes(channel);\n const what = own\n ? `--lick=${channel} is the agent's own channel`\n : `there is no lick channel \"${channel}\"`;\n return fail(\n `${what}; a process may send ${PROCESS_LICKS.map((name) => `--lick=${name}`).join(' or ')}`,\n 2\n );\n}\n\ntype Sender = { who: Caller; spawned: boolean };\n\nasync function cronSend(\n deps: Deps,\n licks: Pick<Licks, 'deliver'>,\n request: Request,\n parsed: Flags,\n sender: Sender,\n context: Context\n): Promise<Answer> {\n if (!request.cron)\n return fail('--lick=cron only works inside a cron job, which sets SLICC_CRON_JOB');\n if (sender.spawned)\n return fail(\"--lick=cron only works inside a cron job, and an agent's bash started this one\");\n if (last(parsed, '--source') !== undefined)\n return fail(\"--source is for --lick=webhook; a cron lick is named by its job's # name:\", 2);\n const target = cronTarget(deps, request, parsed.rest[0] ?? '');\n if (isAnswer(target)) return target;\n const text = (await message(deps, unnamed(parsed), request, context)).trim();\n const taints = await taintsOf(deps, request, sender.who, context);\n const lick = cronLick(request.cron, target, text);\n await licks.deliver(taints.length ? { ...lick, taints } : lick, context);\n return ok('');\n}\n\nfunction webhookScope(deps: Deps, request: Request): string | null | Answer {\n const user = request.user && request.user !== ROOT_USER ? request.user : undefined;\n if (!user) return null;\n const own = agentOfUser(deps.agents.state(), user);\n if (!own) return fail(`${user} is no cone or scoop`);\n if (own.startsWith('scoop:')) return fail(\"a scoop can't send webhook licks; its cone can\");\n return own.slice(CONE_PREFIX.length);\n}\n\nasync function webhookSend(\n deps: Deps,\n request: Request,\n parsed: Flags,\n sender: Sender,\n context: Context\n): Promise<Answer> {\n if (!deps.webhook) return fail('webhooks are not available in this agent');\n const source = last(parsed, '--source');\n if (!source)\n return fail('--lick=webhook needs --source <name>, for ~/.slicc/webhooks/<name>.json', 2);\n if (parsed.rest[0] !== 'cone')\n return fail('a webhook lick goes to the cone: agent send cone --lick=webhook \u2026', 2);\n const scope = webhookScope(deps, request);\n if (isAnswer(scope)) return scope;\n const text = await message(deps, unnamed(parsed), request, context);\n if (!text.trim()) return fail('send needs a message, --file or -', 2);\n const taints = await taintsOf(deps, request, sender.who, context);\n const delivered = await deps.webhook(\n scopedName(source, scope),\n { ...webhookDelivery(text.trimEnd()), taints },\n context\n );\n return delivered\n ? ok('')\n : fail(`there is no webhook ${source}; add ~/.slicc/webhooks/${source}.json`);\n}\n\nfunction unnamed(parsed: Flags): Flags {\n return { ...parsed, rest: parsed.rest.slice(1) };\n}\n\nasync function lickSend(\n deps: Deps,\n request: Request,\n lineage: Lineage | undefined,\n tagged: readonly InheritedTaint[],\n context: Context\n): Promise<Answer> {\n const parsed = flags(request.argv.slice(1), ['--file', '--lick', '--source']);\n const unknown = [...parsed.switches][0];\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const channel = last(parsed, '--lick') ?? '';\n if (!PROCESS_LICKS.includes(channel)) return refusedChannel(channel);\n if (!deps.licks) return fail('licks are not available in this agent');\n const sender = {\n who: withTags(callerOf(deps.agents, request, lineage), tagged),\n spawned: (lineage as Lineage).spawned,\n };\n return channel === 'cron'\n ? cronSend(deps, deps.licks, request, parsed, sender, context)\n : webhookSend(deps, request, parsed, sender, context);\n}\n\nasync function latest(\n deps: Deps,\n record: { folder: string; cone: string },\n context: Context\n): Promise<string> {\n const dir = deps.layout.reports(record.folder, record.cone);\n const listed = await deps.env.listDir(dir, context);\n if (!listed.ok || !listed.value.length) return '(no answer yet)';\n const newest = [...listed.value].sort(\n (a, b) => Number.parseInt(b.name, 10) - Number.parseInt(a.name, 10)\n )[0];\n const read = await deps.env.readTextFile(`${dir}/${newest?.name}`, context);\n return read.ok ? read.value.trimEnd() : '(no answer yet)';\n}\n\nfunction waitTargets(deps: Deps, who: Caller, rest: readonly string[]): string[] | Answer {\n if (!rest.length) return fail('wait needs at least one handle', 2);\n const missing = rest.filter((name) => !handle(deps, who, name));\n if (missing.length)\n return fail(missing.map((name) => noScoop(deps.agents.state(), name)).join('; '));\n return rest.map((name) => (handle(deps, who, name) as [string, unknown])[0]);\n}\n\nasync function block(\n deps: Deps,\n ids: string[],\n seconds: number,\n context: Context\n): Promise<Answer> {\n const deadline = deps.now() + seconds * 1000;\n let open = await deps.scoops.working(ids, context);\n while (open.length && deps.now() < deadline) {\n await new Promise((done) => setTimeout(done, 200));\n open = await deps.scoops.working(ids, context);\n }\n const state = deps.agents.state();\n const sections: string[] = [];\n for (const id of ids) {\n const record = state.scoops[id];\n if (record)\n sections.push(\n `## ${record.folder}${open.includes(id) ? ' (still working)' : ''}\\n${await latest(deps, record, context)}`\n );\n }\n const body = `${sections.join('\\n\\n')}\\n`;\n if (!open.length) return ok(body);\n const still = open.map((id) => state.scoops[id]?.folder).join(', ');\n return { code: 1, out: `${body}agent: timed out after ${seconds}s; still working: ${still}\\n` };\n}\n\nasync function wait(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n const parsed = flags(request.argv.slice(1), ['--timeout']);\n const unknown = [...parsed.switches].find((flag) => flag !== '--notify');\n if (unknown) return fail(`unknown option ${unknown}`, 2);\n const seconds = Number(last(parsed, '--timeout') ?? DEFAULT_WAIT_S);\n if (!Number.isInteger(seconds) || seconds <= 0)\n return fail('--timeout must be a positive whole number of seconds', 2);\n const ids = waitTargets(deps, who, parsed.rest);\n if (isAnswer(ids)) return ids;\n if (!parsed.switches.has('--notify')) return block(deps, ids, seconds, context);\n if (!who.fromAgent || who.scoop)\n return fail('wait --notify is for a cone; a terminal waits with agent wait');\n const taints = await taintsOf(deps, request, who, context);\n await deps.scoops.notifyWhenDone(who.cone, ids, deps.now() + seconds * 1000, taints, context);\n return ok(`you'll get one scoop-wait lick when ${ids.length > 1 ? 'they are' : 'it is'} done\\n`);\n}\n\nasync function stop(deps: Deps, request: Request, who: Caller, context: Context): Promise<Answer> {\n if (who.scoop) return fail('a scoop cannot stop scoops');\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const refused = await reviewing(deps, who, found, context);\n if (refused) return refused;\n return deps.scoops.stop(found[0], who.fromAgent, context);\n}\n\nasync function rename(\n deps: Deps,\n request: Request,\n who: Caller,\n context: Context\n): Promise<Answer> {\n if (who.scoop) return fail('a scoop cannot rename scoops');\n const found = handle(deps, who, request.argv[1]);\n if (!found) return fail(noScoop(deps.agents.state(), request.argv[1] ?? ''));\n const refused = await reviewing(deps, who, found, context);\n if (refused) return refused;\n return deps.scoops.rename(found[0], request.argv.slice(2).join(' '), context);\n}\n\ntype Verb = (deps: Deps, request: Request, who: Caller, context: Context) => Promise<Answer>;\n\nconst help: Verb = async () => ok(USAGE);\n\nconst VERBS: Record<string, Verb> = {\n list,\n status,\n send,\n wait,\n stop,\n rename,\n workflow: async (deps, request, who, context) =>\n deps.workflow\n ? deps.workflow(\n request.argv.slice(1),\n { ...who, taints: await taintsOf(deps, request, who, context) },\n request,\n context\n )\n : fail('workflows are not available in this agent'),\n help,\n '--help': help,\n '-h': help,\n __cancel: (deps, request, _who, context) => cancelSync(deps, request.argv[1] ?? '', context),\n __detach: (deps, request, _who, context) => detachSync(deps, request.argv[1] ?? '', context),\n};\n\nexport function noScoop(state: Readonly<AgentsState>, name: string): string {\n const id = name.startsWith('scoop:') ? name : `scoop:${name}`;\n const record =\n state.scoops[id]?.frozen !== undefined\n ? state.scoops[id]\n : Object.values(state.scoops).find(\n (candidate) => candidate.frozen && candidate.name === name\n );\n const frozen = record?.frozen ? state.frozen?.[record.frozen] : undefined;\n if (frozen) return `scoop ${name} is frozen with cone ${frozen.name}; thaw the cone first`;\n return `there is no scoop ${name}`.trim();\n}\n\nexport function panelCaller(request: Request, who: Caller): PanelCaller {\n const agentId = who.scoop ?? (who.fromAgent ? who.cone : null);\n return { agentId, cone: who.cone, tab: agentId === null ? (request.tab ?? null) : null };\n}\n\nasync function dispatch(\n deps: Deps,\n request: Request,\n who: Caller,\n context: Context\n): Promise<Answer> {\n if (request.as === 'panel')\n return deps.panel\n ? deps.panel(request.argv, panelCaller(request, who), context)\n : { code: 1, out: 'panel: panels are not available in this agent\\n' };\n if (request.as === 'memory')\n return deps.memory\n ? deps.memory(request.argv, who.id, context)\n : fail('memory is not available in this agent');\n if (request.as === 'gelatiere')\n return deps.gelatiere\n ? deps.gelatiere(request.argv, who.id, context)\n : fail('the gelatiere is not available in this agent');\n if (request.as === 'freezer')\n return deps.freezer\n ? deps.freezer(request.argv, who.id, context, {\n user: request.user ?? null,\n cwd: request.cwd,\n })\n : fail('the freezer is not available in this agent');\n if (request.as === 'models')\n return deps.models\n ? deps.models(request.argv, who.id, context)\n : fail('models is not available in this agent');\n const first = request.argv[0] ?? '';\n const verb = VERBS[first];\n if (verb) return verb(deps, request, who, context);\n if (request.as === 'subagent') {\n if (first === 'spawn') return spawnAsync(deps, request, who, request.argv.slice(1), context);\n return { code: 2, out: USAGE };\n }\n if (!request.argv.length) return { code: 2, out: USAGE };\n if (request.argv.includes('--async'))\n return spawnAsync(deps, request, who, request.argv, context);\n return runSync(deps, request, who, context);\n}\n\nconst BLOCKING = new Set([\n 'wait',\n 'workflow',\n 'list',\n 'status',\n 'help',\n '--help',\n '-h',\n '__cancel',\n '__detach',\n]);\n\nexport function createCli(options: CliOptions): Runner {\n const deps: Deps = {\n ...options,\n now: options.now ?? Date.now,\n sync: { pending: new Map() },\n layout: options.layout ?? LEGACY,\n };\n return {\n blocking(request) {\n if (request.as === 'panel') return true;\n const first = request.argv[0] ?? '';\n if (BLOCKING.has(first)) return true;\n return request.as === 'agent' && !VERBS[first] && !request.argv.includes('--async');\n },\n async run(request, context) {\n try {\n if (unchecked(request))\n return await dispatch(deps, request, anonymous(deps.agents), context);\n const lineage = await attested(deps, request, context);\n const tagged = await tagTaints(deps, lineage, context);\n const argv = expanded(request.argv);\n if (request.as === 'agent' && argv[0] === 'send' && argv.includes('--lick'))\n return await lickSend(deps, { ...request, argv }, lineage, tagged, context);\n const who = withTags(callerOf(deps.agents, request, lineage), tagged);\n return await dispatch(deps, request, who, context);\n } catch (error) {\n return fail((error as Error).message);\n }\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,9 @@
1
+ import type { Context } from '@earendil-works/chord';
2
+ import { type Harness } from '@earendil-works/pi-durable';
3
+ import { type InheritedTaint } from './guard.ts';
4
+ export declare const TaintTagDoc: import("@earendil-works/pi-durable").SessionDocToken<{
5
+ tags: Record<string, InheritedTaint[]>;
6
+ }>;
7
+ export declare function taintTag(harness: Pick<Harness, 'commit'>, taints: readonly InheritedTaint[], context: Context): Promise<string>;
8
+ export declare function taggedTaints(harness: Pick<Harness, 'snapshot'>, tags: readonly string[], context: Context): Promise<InheritedTaint[]>;
9
+ export declare function runTag(harness: () => Pick<Harness, 'commit' | 'submission' | 'snapshot'> | undefined): (conversationId: number, context: Context) => Promise<string | undefined>;
@@ -40,6 +40,7 @@ export interface SpawnOptions {
40
40
  cwd?: string;
41
41
  env?: Record<string, string>;
42
42
  pgid?: number;
43
+ tag?: string;
43
44
  onStdout?(bytes: Uint8Array): void;
44
45
  onStderr?(bytes: Uint8Array): void;
45
46
  }
@@ -54,6 +55,8 @@ export interface KernelClient {
54
55
  state?: string;
55
56
  argv?: readonly string[];
56
57
  uid?: number;
58
+ tag?: string;
59
+ tags?: readonly string[];
57
60
  }[]>;
58
61
  loopbackFetch?(request: Request, options: {
59
62
  port: number;