@ai-ecoverse/slicc-agent 5.5.3 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +10 -4
  2. package/dist/agent.js +2 -1
  3. package/dist/agent.js.map +2 -2
  4. package/dist/approvals/index.js +26 -17
  5. package/dist/approvals/index.js.map +2 -2
  6. package/dist/approvals/judge.js +7 -1
  7. package/dist/approvals/judge.js.map +2 -2
  8. package/dist/approvals/record.js +7 -2
  9. package/dist/approvals/record.js.map +2 -2
  10. package/dist/approvals/sudo-client.js +112 -0
  11. package/dist/approvals/sudo-client.js.map +7 -0
  12. package/dist/approvals/sudo.js +166 -0
  13. package/dist/approvals/sudo.js.map +7 -0
  14. package/dist/control.js +4 -11
  15. package/dist/control.js.map +2 -2
  16. package/dist/freezer/index.js +7 -22
  17. package/dist/freezer/index.js.map +2 -2
  18. package/dist/host.js +46 -13
  19. package/dist/host.js.map +2 -2
  20. package/dist/index.js.map +2 -2
  21. package/dist/main.js +6 -4
  22. package/dist/main.js.map +2 -2
  23. package/dist/owner.js +22 -1
  24. package/dist/owner.js.map +2 -2
  25. package/dist/page.js +2 -0
  26. package/dist/page.js.map +2 -2
  27. package/dist/scoops/index.js +2 -1
  28. package/dist/scoops/index.js.map +2 -2
  29. package/dist/scoops/service.js +5 -0
  30. package/dist/scoops/service.js.map +2 -2
  31. package/dist/secrets/extension.js +0 -30
  32. package/dist/secrets/extension.js.map +2 -2
  33. package/dist/selection.js +74 -0
  34. package/dist/selection.js.map +7 -0
  35. package/dist/services.js +10 -0
  36. package/dist/services.js.map +2 -2
  37. package/dist/serving.js +2 -0
  38. package/dist/serving.js.map +2 -2
  39. package/dist/types/agent.d.ts +1 -0
  40. package/dist/types/approvals/index.d.ts +6 -1
  41. package/dist/types/approvals/judge.d.ts +10 -0
  42. package/dist/types/approvals/record.d.ts +6 -0
  43. package/dist/types/approvals/sudo-client.d.ts +12 -0
  44. package/dist/types/approvals/sudo.d.ts +52 -0
  45. package/dist/types/host.d.ts +5 -2
  46. package/dist/types/index.d.ts +2 -1
  47. package/dist/types/owner.d.ts +4 -0
  48. package/dist/types/page.d.ts +2 -0
  49. package/dist/types/scoops/index.d.ts +2 -0
  50. package/dist/types/scoops/service.d.ts +2 -0
  51. package/dist/types/secrets/extension.d.ts +2 -4
  52. package/dist/types/selection.d.ts +15 -0
  53. package/dist/types/services.d.ts +2 -0
  54. package/dist/types/serving.d.ts +2 -0
  55. package/dist/worker.js +7 -1
  56. package/dist/worker.js.map +2 -2
  57. package/package.json +1 -1
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 { 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 { 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 { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { 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 Transport, transportFetch } from './net.ts';\nimport { sliccPrompt } from './prompt.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 { repin, 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 {\n BEDROCK,\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}\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`;\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 openRepinned(\n options: AgentWorkerOptions,\n base: Omit<AgentOptions, 'storage' | 'beforeResume'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n beforeResume: (harness, using) => repin(harness, storage, 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): 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 ].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);\n const models = createSliccModels(credentials, providers);\n const bases = () => modelBases(providers, models);\n scope.fetch = vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value)\n );\n const endpoints = vaultEndpoints(vault);\n void endpoints.models(bases()).catch(() => undefined);\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 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>>,\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped }\n) {\n const { models, records, fields, providers, bases, endpoints } = 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 });\n settings.state.subscribe(() => void endpoints.models(bases()).catch(() => undefined));\n return settings;\n}\n\nasync function setupJudge(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n memories: () => readonly MemoryEntry[] | undefined\n): Promise<ApprovalJudge> {\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n return {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent: ownerIntent({ env: home, agents: agent.agents, memories }),\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\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\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);\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] = [createActivity(), processGroups(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 identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openRepinned(options, { models, model, registry, env: environment });\n opened = agent;\n await people?.start(agent.agents);\n const sources = licks.attach(agent, {\n env: home,\n home: HOME,\n activity,\n ...(people ? { dirs: () => people.lickDirs() } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n await sources.boot(\n { version: facts.version, boot: await kernelBoot(client) },\n BACKGROUND_CONTEXT\n );\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 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 });\n licks.licks.guard(freezer.frozenTarget);\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped });\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 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 judge: await setupJudge(models, home, at, agent, () => memoryRuntime.memories.value),\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 { 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 { 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 { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { 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 Transport, transportFetch } from './net.ts';\nimport { sliccPrompt } from './prompt.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 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}\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`;\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): 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 ].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);\n const models = createSliccModels(credentials, providers);\n const bases = () => modelBases(providers, models);\n scope.fetch = vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value)\n );\n const endpoints = vaultEndpoints(vault);\n void endpoints.models(bases()).catch(() => undefined);\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 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>>,\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped }\n) {\n const { models, records, fields, providers, bases, endpoints } = 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 });\n settings.state.subscribe(() => void endpoints.models(bases()).catch(() => undefined));\n return settings;\n}\n\nasync function setupJudge(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n memories: () => readonly MemoryEntry[] | undefined\n): Promise<ApprovalJudge> {\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n return {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent: ownerIntent({ env: home, agents: agent.agents, memories }),\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\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\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);\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] = [createActivity(), processGroups(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 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 sources = licks.attach(agent, {\n env: home,\n home: HOME,\n activity,\n ...(people ? { dirs: () => people.lickDirs() } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n await sources.boot(\n { version: facts.version, boot: await kernelBoot(client) },\n BACKGROUND_CONTEXT\n );\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 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 });\n licks.licks.guard(freezer.frozenTarget);\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped });\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 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 judge: await setupJudge(models, home, at, agent, () => memoryRuntime.memories.value),\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
  }
package/dist/owner.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { askSudo, unavailable } from "./approvals/sudo-client.js";
1
2
  import { connectAgent } from "./client.js";
2
3
  import { serveAdmin } from "./kernel/users.js";
3
4
  import { holdLock } from "./opfs-pool.js";
@@ -35,6 +36,11 @@ async function startAgent(options) {
35
36
  };
36
37
  };
37
38
  let worker = Promise.resolve().then(spawn);
39
+ const asking = /* @__PURE__ */ new Set();
40
+ const stopAsking = () => {
41
+ for (const stop of asking) stop.abort();
42
+ asking.clear();
43
+ };
38
44
  try {
39
45
  await worker;
40
46
  } catch (error) {
@@ -48,7 +54,8 @@ async function startAgent(options) {
48
54
  const readOnly = portOptions.readOnly === true ? { readOnly: true } : {};
49
55
  const pages = portOptions.pages === false ? { pages: false } : {};
50
56
  const guest = portOptions.guest ? { guest: { id: String(portOptions.guest.id), label: String(portOptions.guest.label) } } : {};
51
- ready.postMessage({ connect: port2, ...readOnly, ...pages, ...guest }, [port2]);
57
+ const device = portOptions.device ? { device: portOptions.device } : {};
58
+ ready.postMessage({ connect: port2, ...readOnly, ...pages, ...guest, ...device }, [port2]);
52
59
  return port1;
53
60
  };
54
61
  return {
@@ -56,7 +63,20 @@ async function startAgent(options) {
56
63
  return connectAgent(await open(portOptions));
57
64
  },
58
65
  port: open,
66
+ async approve(request, approveOptions) {
67
+ const stop = new AbortController();
68
+ asking.add(stop);
69
+ try {
70
+ const port = await open().catch((error) => {
71
+ throw unavailable(error);
72
+ });
73
+ return await askSudo(port, request, approveOptions, stop.signal);
74
+ } finally {
75
+ asking.delete(stop);
76
+ }
77
+ },
59
78
  restart() {
79
+ stopAsking();
60
80
  worker = worker.catch(() => void 0).then((old) => {
61
81
  old?.terminate();
62
82
  return spawn();
@@ -64,6 +84,7 @@ async function startAgent(options) {
64
84
  return worker.then(() => void 0);
65
85
  },
66
86
  async release() {
87
+ stopAsking();
67
88
  const previous = worker;
68
89
  worker = Promise.resolve(void 0);
69
90
  try {
package/dist/owner.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/owner.ts"],
4
- "sourcesContent": ["import { type AgentConnection, connectAgent } from './client.ts';\nimport { type KernelSource, serveAdmin } from './kernel/users.ts';\nimport { holdLock } from './opfs-pool.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport const AGENT_LOCK = 'slicc-agent';\n\nexport interface AgentWorker {\n postMessage(message: unknown, transfer: Transferable[]): void;\n terminate(): void;\n}\n\nexport interface PortOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n}\n\nexport interface AgentOwner {\n connect(options?: PortOptions): Promise<AgentConnection>;\n port(options?: PortOptions): Promise<PortEndpoint & Transferable>;\n restart(): Promise<void>;\n release(): Promise<void>;\n}\n\nexport type { KernelSource } from './kernel/users.ts';\n\nexport interface OwnerOptions {\n worker: () => AgentWorker;\n kernel?: KernelSource;\n locks?: LockManager;\n held?: boolean;\n channel?: () => { port1: PortEndpoint & Transferable; port2: Transferable };\n}\n\nexport async function startAgent(options: OwnerOptions): Promise<AgentOwner> {\n const release = options.held\n ? () => undefined\n : await holdLock(options.locks ?? navigator.locks, AGENT_LOCK);\n const channel = options.channel ?? (() => new MessageChannel());\n const spawn = async (): Promise<AgentWorker> => {\n const created = options.worker();\n let admin: (PortEndpoint & Transferable) | undefined;\n try {\n if (options.kernel) {\n const port = await options.kernel.connect();\n if (!options.kernel.users) created.postMessage({ kernel: port }, [port]);\n else {\n const { port1, port2 } = channel();\n admin = port1;\n serveAdmin(port1, options.kernel);\n created.postMessage({ kernel: port, admin: port2 }, [port, port2]);\n }\n }\n } catch (error) {\n admin?.close?.();\n created.terminate();\n throw error;\n }\n if (!admin) return created;\n const served = admin;\n return {\n postMessage: (message, transfer) => created.postMessage(message, transfer),\n terminate() {\n served.close?.();\n created.terminate();\n },\n };\n };\n let worker: Promise<AgentWorker | undefined> = Promise.resolve().then(spawn);\n try {\n await worker;\n } catch (error) {\n release();\n throw error;\n }\n const open = async (portOptions: PortOptions = {}): Promise<PortEndpoint & Transferable> => {\n const ready = await worker;\n if (!ready) throw new Error('the agent was released');\n const { port1, port2 } = channel();\n const readOnly = portOptions.readOnly === true ? { readOnly: true } : {};\n const pages = portOptions.pages === false ? { pages: false } : {};\n const guest = portOptions.guest\n ? { guest: { id: String(portOptions.guest.id), label: String(portOptions.guest.label) } }\n : {};\n ready.postMessage({ connect: port2, ...readOnly, ...pages, ...guest }, [port2]);\n return port1;\n };\n return {\n async connect(portOptions) {\n return connectAgent(await open(portOptions));\n },\n port: open,\n restart() {\n worker = worker\n .catch(() => undefined)\n .then((old) => {\n old?.terminate();\n return spawn();\n });\n return worker.then(() => undefined);\n },\n async release() {\n const previous = worker;\n worker = Promise.resolve(undefined);\n try {\n (await previous.catch(() => undefined))?.terminate();\n } finally {\n release();\n }\n },\n };\n}\n"],
5
- "mappings": "AAAA,SAA+B,oBAAoB;AACnD,SAA4B,kBAAkB;AAC9C,SAAS,gBAAgB;AAGlB,MAAM,aAAa;AA8B1B,eAAsB,WAAW,SAA4C;AAC3E,QAAM,UAAU,QAAQ,OACpB,MAAM,SACN,MAAM,SAAS,QAAQ,SAAS,UAAU,OAAO,UAAU;AAC/D,QAAM,UAAU,QAAQ,YAAY,MAAM,IAAI,eAAe;AAC7D,QAAM,QAAQ,YAAkC;AAC9C,UAAM,UAAU,QAAQ,OAAO;AAC/B,QAAI;AACJ,QAAI;AACF,UAAI,QAAQ,QAAQ;AAClB,cAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ;AAC1C,YAAI,CAAC,QAAQ,OAAO,MAAO,SAAQ,YAAY,EAAE,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC;AAAA,aAClE;AACH,gBAAM,EAAE,OAAO,MAAM,IAAI,QAAQ;AACjC,kBAAQ;AACR,qBAAW,OAAO,QAAQ,MAAM;AAChC,kBAAQ,YAAY,EAAE,QAAQ,MAAM,OAAO,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,QAAQ;AACf,cAAQ,UAAU;AAClB,YAAM;AAAA,IACR;AACA,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,SAAS;AACf,WAAO;AAAA,MACL,aAAa,CAAC,SAAS,aAAa,QAAQ,YAAY,SAAS,QAAQ;AAAA,MACzE,YAAY;AACV,eAAO,QAAQ;AACf,gBAAQ,UAAU;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAA2C,QAAQ,QAAQ,EAAE,KAAK,KAAK;AAC3E,MAAI;AACF,UAAM;AAAA,EACR,SAAS,OAAO;AACd,YAAQ;AACR,UAAM;AAAA,EACR;AACA,QAAM,OAAO,OAAO,cAA2B,CAAC,MAA4C;AAC1F,UAAM,QAAQ,MAAM;AACpB,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wBAAwB;AACpD,UAAM,EAAE,OAAO,MAAM,IAAI,QAAQ;AACjC,UAAM,WAAW,YAAY,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;AACvE,UAAM,QAAQ,YAAY,UAAU,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAChE,UAAM,QAAQ,YAAY,QACtB,EAAE,OAAO,EAAE,IAAI,OAAO,YAAY,MAAM,EAAE,GAAG,OAAO,OAAO,YAAY,MAAM,KAAK,EAAE,EAAE,IACtF,CAAC;AACL,UAAM,YAAY,EAAE,SAAS,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC;AAC9E,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,QAAQ,aAAa;AACzB,aAAO,aAAa,MAAM,KAAK,WAAW,CAAC;AAAA,IAC7C;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AACR,eAAS,OACN,MAAM,MAAM,MAAS,EACrB,KAAK,CAAC,QAAQ;AACb,aAAK,UAAU;AACf,eAAO,MAAM;AAAA,MACf,CAAC;AACH,aAAO,OAAO,KAAK,MAAM,MAAS;AAAA,IACpC;AAAA,IACA,MAAM,UAAU;AACd,YAAM,WAAW;AACjB,eAAS,QAAQ,QAAQ,MAAS;AAClC,UAAI;AACF,SAAC,MAAM,SAAS,MAAM,MAAM,MAAS,IAAI,UAAU;AAAA,MACrD,UAAE;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { SudoAnswer, SudoRequest } from './approvals/sudo.ts';\nimport { type ApproveOptions, askSudo, unavailable } from './approvals/sudo-client.ts';\nimport { type AgentConnection, connectAgent } from './client.ts';\nimport { type KernelSource, serveAdmin } from './kernel/users.ts';\nimport { holdLock } from './opfs-pool.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport const AGENT_LOCK = 'slicc-agent';\n\nexport interface AgentWorker {\n postMessage(message: unknown, transfer: Transferable[]): void;\n terminate(): void;\n}\n\nexport interface PortOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n device?: string;\n}\n\nexport interface AgentOwner {\n connect(options?: PortOptions): Promise<AgentConnection>;\n port(options?: PortOptions): Promise<PortEndpoint & Transferable>;\n approve(request: SudoRequest, options?: ApproveOptions): Promise<SudoAnswer>;\n restart(): Promise<void>;\n release(): Promise<void>;\n}\n\nexport type { KernelSource } from './kernel/users.ts';\n\nexport interface OwnerOptions {\n worker: () => AgentWorker;\n kernel?: KernelSource;\n locks?: LockManager;\n held?: boolean;\n channel?: () => { port1: PortEndpoint & Transferable; port2: Transferable };\n}\n\nexport async function startAgent(options: OwnerOptions): Promise<AgentOwner> {\n const release = options.held\n ? () => undefined\n : await holdLock(options.locks ?? navigator.locks, AGENT_LOCK);\n const channel = options.channel ?? (() => new MessageChannel());\n const spawn = async (): Promise<AgentWorker> => {\n const created = options.worker();\n let admin: (PortEndpoint & Transferable) | undefined;\n try {\n if (options.kernel) {\n const port = await options.kernel.connect();\n if (!options.kernel.users) created.postMessage({ kernel: port }, [port]);\n else {\n const { port1, port2 } = channel();\n admin = port1;\n serveAdmin(port1, options.kernel);\n created.postMessage({ kernel: port, admin: port2 }, [port, port2]);\n }\n }\n } catch (error) {\n admin?.close?.();\n created.terminate();\n throw error;\n }\n if (!admin) return created;\n const served = admin;\n return {\n postMessage: (message, transfer) => created.postMessage(message, transfer),\n terminate() {\n served.close?.();\n created.terminate();\n },\n };\n };\n let worker: Promise<AgentWorker | undefined> = Promise.resolve().then(spawn);\n const asking = new Set<AbortController>();\n const stopAsking = () => {\n for (const stop of asking) stop.abort();\n asking.clear();\n };\n try {\n await worker;\n } catch (error) {\n release();\n throw error;\n }\n const open = async (portOptions: PortOptions = {}): Promise<PortEndpoint & Transferable> => {\n const ready = await worker;\n if (!ready) throw new Error('the agent was released');\n const { port1, port2 } = channel();\n const readOnly = portOptions.readOnly === true ? { readOnly: true } : {};\n const pages = portOptions.pages === false ? { pages: false } : {};\n const guest = portOptions.guest\n ? { guest: { id: String(portOptions.guest.id), label: String(portOptions.guest.label) } }\n : {};\n const device = portOptions.device ? { device: portOptions.device } : {};\n ready.postMessage({ connect: port2, ...readOnly, ...pages, ...guest, ...device }, [port2]);\n return port1;\n };\n return {\n async connect(portOptions) {\n return connectAgent(await open(portOptions));\n },\n port: open,\n async approve(request, approveOptions) {\n const stop = new AbortController();\n asking.add(stop);\n try {\n const port = await open().catch((error: unknown) => {\n throw unavailable(error);\n });\n return await askSudo(port, request, approveOptions, stop.signal);\n } finally {\n asking.delete(stop);\n }\n },\n restart() {\n stopAsking();\n worker = worker\n .catch(() => undefined)\n .then((old) => {\n old?.terminate();\n return spawn();\n });\n return worker.then(() => undefined);\n },\n async release() {\n stopAsking();\n const previous = worker;\n worker = Promise.resolve(undefined);\n try {\n (await previous.catch(() => undefined))?.terminate();\n } finally {\n release();\n }\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/page.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { UNAVAILABLE } from "./approvals/sudo-client.js";
1
2
  import { connectAgent } from "./client.js";
2
3
  import {
3
4
  connectGuest,
@@ -25,6 +26,7 @@ export {
25
26
  GUEST_ONLY,
26
27
  MAX_FRAME,
27
28
  SEAT_REFUSED,
29
+ UNAVAILABLE,
28
30
  VIEW_ONLY,
29
31
  bridgePort,
30
32
  connectAgent,
package/dist/page.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/page.ts"],
4
- "sourcesContent": ["export { type AgentConnection, connectAgent } from './client.ts';\nexport {\n connectGuest,\n GUEST_ONLY,\n type GuestConnection,\n SEAT_REFUSED,\n} from './guests/client.ts';\nexport {\n type ByteSink,\n bridgePort,\n encodeFrame,\n FrameReader,\n type LinkEnd,\n linkEndpoint,\n MAX_FRAME,\n} from './link.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n type PortOptions,\n startAgent,\n} from './owner.ts';\nexport {\n type RemoteControl,\n type RemoteEvent,\n type RemoteOptions,\n remoteControl,\n} from './remote/client.ts';\nexport { VIEW_ONLY } from './view-only.ts';\n"],
5
- "mappings": "AAAA,SAA+B,oBAAoB;AACnD;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAMA;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP,SAAS,iBAAiB;",
4
+ "sourcesContent": ["export type { SudoAnswer, SudoRequest } from './approvals/sudo.ts';\nexport { type ApproveOptions, UNAVAILABLE } from './approvals/sudo-client.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport {\n connectGuest,\n GUEST_ONLY,\n type GuestConnection,\n SEAT_REFUSED,\n} from './guests/client.ts';\nexport {\n type ByteSink,\n bridgePort,\n encodeFrame,\n FrameReader,\n type LinkEnd,\n linkEndpoint,\n MAX_FRAME,\n} from './link.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n type PortOptions,\n startAgent,\n} from './owner.ts';\nexport {\n type RemoteControl,\n type RemoteEvent,\n type RemoteOptions,\n remoteControl,\n} from './remote/client.ts';\nexport { VIEW_ONLY } from './view-only.ts';\n"],
5
+ "mappings": "AACA,SAA8B,mBAAmB;AACjD,SAA+B,oBAAoB;AACnD;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAMA;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP,SAAS,iBAAiB;",
6
6
  "names": []
7
7
  }
@@ -13,7 +13,7 @@ import {
13
13
  controlPlane,
14
14
  PROTOCOL
15
15
  } from "./requests.js";
16
- import { createScoops } from "./service.js";
16
+ import { choosable, createScoops } from "./service.js";
17
17
  const BUILTIN_ROLES = ["scout", "worker", "reviewer", "oracle", "delegate", "gelatiere"];
18
18
  const PNPM_HOME = "/home/.local/share/pnpm";
19
19
  const BIN_DIR = "/usr/local/bin";
@@ -182,6 +182,7 @@ function setupScoops(registry, licks, fileTools = []) {
182
182
  registry.install(guardExtension(lookup));
183
183
  return {
184
184
  scoops,
185
+ choosable: choosable(fileTools),
185
186
  async attach(options, context) {
186
187
  const { harness, agents, groups, env, home } = options;
187
188
  const assets = options.assets ?? packageAssets();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/scoops/index.ts"],
4
- "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { Harness, Registry, ToolRegistration } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { type Agents, live } from '../agents.ts';\nimport type { ProcessGroups } from '../kernel/groups.ts';\nimport { type Layout, LEGACY } from '../layout.ts';\nimport type { Licks } from '../licks/licks.ts';\nimport {\n DEFAULT_LIMITS,\n loadRoles,\n PACKAGE_ROOTS,\n packageDirs,\n type Roles,\n} from '../roles/roles.ts';\nimport { type CliOptions, createCli, RUN_DIR } from './cli.ts';\nimport { guardExtension, scoopsExtension, scoopTasks } from './extension.ts';\nimport {\n CONTROL_DIR,\n type ControlPlane,\n controlPlane,\n type PlaneOptions,\n PROTOCOL,\n} from './requests.ts';\nimport { createScoops, type EnvOf, type Scoops, type ScoopsHost } from './service.ts';\n\nexport const BUILTIN_ROLES = ['scout', 'worker', 'reviewer', 'oracle', 'delegate', 'gelatiere'];\nexport const PNPM_HOME = '/home/.local/share/pnpm';\nexport const BIN_DIR = '/usr/local/bin';\n\nexport type Assets = (path: string) => Promise<string>;\n\nexport function packageAssets(base: URL = new URL('../../', import.meta.url)): Assets {\n return async (path) => {\n const response = await fetch(new URL(path, base));\n if (!response.ok) throw new Error(`${path}: ${response.status}`);\n return response.text();\n };\n}\n\nexport interface AttachOptions {\n harness: Harness;\n agents: Agents;\n groups: ProcessGroups;\n env: ExecutionEnv;\n home: string;\n assets?: Assets;\n binDir?: string;\n controlDir?: string;\n sweepEvery?: number;\n alive?: (pid: number) => Promise<boolean>;\n reads: () => readonly string[];\n memory?: CliOptions['memory'];\n gelatiere?: CliOptions['gelatiere'];\n freezer?: CliOptions['freezer'];\n models?: CliOptions['models'];\n panel?: CliOptions['panel'];\n mcp?: (names: readonly string[]) => ToolRegistration[];\n layout?: Layout;\n enforced?: boolean;\n envOf: EnvOf;\n spools?: Spools;\n agentDir?: string;\n}\n\nexport interface Spools {\n users(): readonly string[];\n prepare(user: string, dir: string, context: Context): Promise<void>;\n}\n\nexport interface ScoopsRuntime {\n roles(context: Context): Promise<Roles>;\n plane: ControlPlane;\n close(context: Context): Promise<void>;\n}\n\nexport interface ScoopsSetup {\n scoops: Scoops;\n attach(options: AttachOptions, context: Context): Promise<ScoopsRuntime>;\n}\n\nexport const COMMANDS = ['agent', 'subagent', 'memory', 'gelatiere', 'freezer', 'models', 'panel'];\n\nexport const RETIRED_COMMANDS = ['sprinkle'];\n\nexport async function pnpmHomeOf(env: ExecutionEnv, context: Context): Promise<string> {\n let out = '';\n const ran = await env\n .exec(\n 'printf %s \"$PNPM_HOME\"',\n {\n onOutput: (text) => {\n out += text;\n },\n },\n context\n )\n .catch(() => undefined);\n return ran?.ok && ran.value.exitCode === 0 && /^\\/\\S*$/.test(out) ? out : PNPM_HOME;\n}\n\nexport interface Installed {\n done: boolean;\n skipped: string[];\n}\n\nasync function theirs(env: ExecutionEnv, path: string, context: Context): Promise<boolean> {\n const found = await env.fileInfo(path, context);\n if (!found.ok) return found.error.code !== 'not_found';\n if (found.value.kind !== 'file') return true;\n const read = await env.readTextFile(path, context);\n return !read.ok || !read.value.includes(PROTOCOL);\n}\n\nasync function install(\n env: ExecutionEnv,\n script: string,\n binDir: string,\n context: Context\n): Promise<Installed> {\n const skipped: string[] = [];\n if (!(await env.createDir(binDir, { recursive: true }, context)).ok)\n return { done: false, skipped };\n for (const name of COMMANDS) {\n const path = `${binDir}/${name}`;\n if (await theirs(env, path, context)) {\n skipped.push(name);\n continue;\n }\n if (!(await env.writeFile(path, script, context)).ok) return { done: false, skipped };\n const mode = await env.exec(['chmod', '755', path], undefined, context);\n if (!mode.ok || mode.value.exitCode !== 0) return { done: false, skipped };\n }\n for (const name of RETIRED_COMMANDS) {\n const text = await env.readTextFile(`${binDir}/${name}`, context);\n if (text.ok && text.value.includes(PROTOCOL))\n await env.remove(`${binDir}/${name}`, { force: true }, context);\n }\n return { done: true, skipped };\n}\n\nexport async function installCommands(\n env: ExecutionEnv,\n script: string,\n binDir: string,\n context: Context,\n warn: (message: string) => void = (message) => console.warn(message)\n): Promise<Installed> {\n const installed = await install(env, script, binDir, context).catch(\n (): Installed => ({ done: false, skipped: [] })\n );\n if (installed.skipped.length) {\n const paths = installed.skipped.map((name) => `${binDir}/${name}`).join(', ');\n warn(`slicc-agent: left ${paths} alone, because it isn't slicc-agent's command`);\n }\n if (installed.done) await retire(env, binDir, context).catch(() => undefined);\n return installed;\n}\n\nexport async function retire(env: ExecutionEnv, binDir: string, context: Context) {\n const old = `${await pnpmHomeOf(env, context)}/bin`;\n if (old === binDir) return;\n for (const name of [...COMMANDS, ...RETIRED_COMMANDS]) {\n const path = `${old}/${name}`;\n const text = await env.readTextFile(path, context);\n if (text.ok && text.value.includes(PROTOCOL)) await env.remove(path, { force: true }, context);\n }\n}\n\nfunction mirror(agents: Agents, env: ExecutionEnv) {\n return async (context: Context) => {\n for (const [id, record] of Object.entries(agents.state().scoops)) {\n const state = record.gone ? 'gone' : live(record) ? 'live' : 'stopped';\n const metadata = {\n handle: record.folder,\n id,\n name: record.name,\n role: record.role,\n cone: record.cone,\n state,\n };\n await env.writeFile(\n `${RUN_DIR}/${record.folder}/metadata.json`,\n `${JSON.stringify(metadata, null, 2)}\\n`,\n context\n );\n }\n };\n}\n\nfunction planeOf(\n env: ExecutionEnv,\n cli: ReturnType<typeof createCli>,\n options: AttachOptions,\n context: Context\n): ControlPlane {\n const common: PlaneOptions & { dir: string } = {\n ...(options.sweepEvery ? { sweepEvery: options.sweepEvery } : {}),\n mirror: mirror(options.agents, env),\n dir: options.controlDir ?? CONTROL_DIR,\n };\n if (!options.spools) return controlPlane(env, cli, common);\n return spooled(env, cli, options.spools, options.agents, common, context);\n}\n\nfunction spooled(\n env: ExecutionEnv,\n cli: ReturnType<typeof createCli>,\n spools: Spools,\n agents: Agents,\n options: PlaneOptions & { dir: string },\n context: Context\n): ControlPlane {\n const planes = new Map<string, Promise<ControlPlane | undefined>>();\n let off: () => void = () => undefined;\n let chain: Promise<unknown> = Promise.resolve();\n const open = async (user: string): Promise<ControlPlane | undefined> => {\n const dir = `${options.dir}/${user}`;\n try {\n await spools.prepare(user, dir, context);\n const plane = controlPlane(env, cli, { ...options, dir, user });\n await plane.start(context);\n return plane;\n } catch {\n planes.delete(user);\n return undefined;\n }\n };\n const sync = () => {\n const step = async () => {\n const wanted = new Set(spools.users());\n for (const user of wanted)\n if (!planes.has(user)) {\n const opened = open(user);\n planes.set(user, opened);\n await opened;\n }\n for (const [user, plane] of [...planes])\n if (!wanted.has(user)) {\n planes.delete(user);\n await (await plane)?.close(context);\n }\n };\n chain = chain.then(step, step);\n return chain;\n };\n const all = async () =>\n (await Promise.all(planes.values())).filter((plane): plane is ControlPlane => !!plane);\n return {\n async start() {\n off = agents.onChange(() => void sync());\n await sync();\n },\n async sweep(using) {\n for (const plane of await all()) await plane.sweep(using);\n },\n async close(using) {\n off();\n await chain;\n for (const plane of await all()) await plane.close(using);\n planes.clear();\n },\n };\n}\n\nexport function setupScoops(\n registry: Registry,\n licks: Licks,\n fileTools: readonly ToolRegistration[] = []\n): ScoopsSetup {\n let bind: (host: ScoopsHost) => void = () => undefined;\n const host = new Promise<ScoopsHost>((resolve) => {\n bind = resolve;\n });\n const lookup = () => host;\n const tasks = scoopTasks(lookup);\n const scoops = createScoops(host, () => tasks);\n let cached: Roles = { roles: [], warnings: [], limits: { ...DEFAULT_LIMITS } };\n let layout = LEGACY;\n registry.install(scoopsExtension(tasks, () => layout));\n registry.install(guardExtension(lookup));\n return {\n scoops,\n async attach(options, context) {\n const { harness, agents, groups, env, home } = options;\n const assets = options.assets ?? packageAssets();\n layout = options.layout ?? LEGACY;\n bind({\n harness,\n agents,\n licks,\n tools: fileTools,\n groups,\n reads: options.reads,\n files: env,\n layout,\n ...(options.enforced ? { enforced: true } : {}),\n envOf: options.envOf,\n ...(options.mcp ? { mcp: options.mcp } : {}),\n });\n const builtin = async () => {\n const out: { path: string; text: string }[] = [];\n for (const name of BUILTIN_ROLES) {\n const path = `packages/vfs-root/agents/${name}.md`;\n out.push({ path: `builtin:${name}`, text: await assets(path) });\n }\n return out;\n };\n const roles = async (using: Context) => {\n cached = await loadRoles(\n {\n files: env,\n builtin,\n dirs: [\n ...(await packageDirs(env, PACKAGE_ROOTS, using)).map((dir) => ({\n source: 'package' as const,\n dir,\n })),\n { source: 'user', dir: `${options.agentDir ?? `${home}/.pi/agent`}/agents` },\n ],\n settingsPath: `${options.agentDir ?? `${home}/.pi/agent`}/settings.json`,\n },\n using\n );\n return cached;\n };\n await roles(context).catch(() => cached);\n const script = await assets('bin/agent').catch(() => undefined);\n if (script) {\n const binDir = options.binDir ?? BIN_DIR;\n await installCommands(env, script, binDir, context);\n }\n const cli = createCli({\n env,\n harness,\n agents,\n scoops,\n roles: () => roles(context),\n ...(options.alive ? { alive: options.alive } : {}),\n ...(options.memory ? { memory: options.memory } : {}),\n ...(options.gelatiere ? { gelatiere: options.gelatiere } : {}),\n ...(options.freezer ? { freezer: options.freezer } : {}),\n ...(options.models ? { models: options.models } : {}),\n layout,\n ...(options.panel ? { panel: options.panel } : {}),\n });\n const plane = planeOf(env, cli, options, context);\n await plane.start(context);\n return { roles, plane, close: (using) => plane.close(using) };\n },\n };\n}\n\nexport type { Rewound, Scoops } from './service.ts';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { Harness, Registry, ToolRegistration } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { type Agents, live } from '../agents.ts';\nimport type { ProcessGroups } from '../kernel/groups.ts';\nimport { type Layout, LEGACY } from '../layout.ts';\nimport type { Licks } from '../licks/licks.ts';\nimport {\n DEFAULT_LIMITS,\n loadRoles,\n PACKAGE_ROOTS,\n packageDirs,\n type Roles,\n} from '../roles/roles.ts';\nimport type { Choosable } from '../selection.ts';\nimport { type CliOptions, createCli, RUN_DIR } from './cli.ts';\nimport { guardExtension, scoopsExtension, scoopTasks } from './extension.ts';\nimport {\n CONTROL_DIR,\n type ControlPlane,\n controlPlane,\n type PlaneOptions,\n PROTOCOL,\n} from './requests.ts';\nimport { choosable, createScoops, type EnvOf, type Scoops, type ScoopsHost } from './service.ts';\n\nexport const BUILTIN_ROLES = ['scout', 'worker', 'reviewer', 'oracle', 'delegate', 'gelatiere'];\nexport const PNPM_HOME = '/home/.local/share/pnpm';\nexport const BIN_DIR = '/usr/local/bin';\n\nexport type Assets = (path: string) => Promise<string>;\n\nexport function packageAssets(base: URL = new URL('../../', import.meta.url)): Assets {\n return async (path) => {\n const response = await fetch(new URL(path, base));\n if (!response.ok) throw new Error(`${path}: ${response.status}`);\n return response.text();\n };\n}\n\nexport interface AttachOptions {\n harness: Harness;\n agents: Agents;\n groups: ProcessGroups;\n env: ExecutionEnv;\n home: string;\n assets?: Assets;\n binDir?: string;\n controlDir?: string;\n sweepEvery?: number;\n alive?: (pid: number) => Promise<boolean>;\n reads: () => readonly string[];\n memory?: CliOptions['memory'];\n gelatiere?: CliOptions['gelatiere'];\n freezer?: CliOptions['freezer'];\n models?: CliOptions['models'];\n panel?: CliOptions['panel'];\n mcp?: (names: readonly string[]) => ToolRegistration[];\n layout?: Layout;\n enforced?: boolean;\n envOf: EnvOf;\n spools?: Spools;\n agentDir?: string;\n}\n\nexport interface Spools {\n users(): readonly string[];\n prepare(user: string, dir: string, context: Context): Promise<void>;\n}\n\nexport interface ScoopsRuntime {\n roles(context: Context): Promise<Roles>;\n plane: ControlPlane;\n close(context: Context): Promise<void>;\n}\n\nexport interface ScoopsSetup {\n scoops: Scoops;\n choosable: Choosable;\n attach(options: AttachOptions, context: Context): Promise<ScoopsRuntime>;\n}\n\nexport const COMMANDS = ['agent', 'subagent', 'memory', 'gelatiere', 'freezer', 'models', 'panel'];\n\nexport const RETIRED_COMMANDS = ['sprinkle'];\n\nexport async function pnpmHomeOf(env: ExecutionEnv, context: Context): Promise<string> {\n let out = '';\n const ran = await env\n .exec(\n 'printf %s \"$PNPM_HOME\"',\n {\n onOutput: (text) => {\n out += text;\n },\n },\n context\n )\n .catch(() => undefined);\n return ran?.ok && ran.value.exitCode === 0 && /^\\/\\S*$/.test(out) ? out : PNPM_HOME;\n}\n\nexport interface Installed {\n done: boolean;\n skipped: string[];\n}\n\nasync function theirs(env: ExecutionEnv, path: string, context: Context): Promise<boolean> {\n const found = await env.fileInfo(path, context);\n if (!found.ok) return found.error.code !== 'not_found';\n if (found.value.kind !== 'file') return true;\n const read = await env.readTextFile(path, context);\n return !read.ok || !read.value.includes(PROTOCOL);\n}\n\nasync function install(\n env: ExecutionEnv,\n script: string,\n binDir: string,\n context: Context\n): Promise<Installed> {\n const skipped: string[] = [];\n if (!(await env.createDir(binDir, { recursive: true }, context)).ok)\n return { done: false, skipped };\n for (const name of COMMANDS) {\n const path = `${binDir}/${name}`;\n if (await theirs(env, path, context)) {\n skipped.push(name);\n continue;\n }\n if (!(await env.writeFile(path, script, context)).ok) return { done: false, skipped };\n const mode = await env.exec(['chmod', '755', path], undefined, context);\n if (!mode.ok || mode.value.exitCode !== 0) return { done: false, skipped };\n }\n for (const name of RETIRED_COMMANDS) {\n const text = await env.readTextFile(`${binDir}/${name}`, context);\n if (text.ok && text.value.includes(PROTOCOL))\n await env.remove(`${binDir}/${name}`, { force: true }, context);\n }\n return { done: true, skipped };\n}\n\nexport async function installCommands(\n env: ExecutionEnv,\n script: string,\n binDir: string,\n context: Context,\n warn: (message: string) => void = (message) => console.warn(message)\n): Promise<Installed> {\n const installed = await install(env, script, binDir, context).catch(\n (): Installed => ({ done: false, skipped: [] })\n );\n if (installed.skipped.length) {\n const paths = installed.skipped.map((name) => `${binDir}/${name}`).join(', ');\n warn(`slicc-agent: left ${paths} alone, because it isn't slicc-agent's command`);\n }\n if (installed.done) await retire(env, binDir, context).catch(() => undefined);\n return installed;\n}\n\nexport async function retire(env: ExecutionEnv, binDir: string, context: Context) {\n const old = `${await pnpmHomeOf(env, context)}/bin`;\n if (old === binDir) return;\n for (const name of [...COMMANDS, ...RETIRED_COMMANDS]) {\n const path = `${old}/${name}`;\n const text = await env.readTextFile(path, context);\n if (text.ok && text.value.includes(PROTOCOL)) await env.remove(path, { force: true }, context);\n }\n}\n\nfunction mirror(agents: Agents, env: ExecutionEnv) {\n return async (context: Context) => {\n for (const [id, record] of Object.entries(agents.state().scoops)) {\n const state = record.gone ? 'gone' : live(record) ? 'live' : 'stopped';\n const metadata = {\n handle: record.folder,\n id,\n name: record.name,\n role: record.role,\n cone: record.cone,\n state,\n };\n await env.writeFile(\n `${RUN_DIR}/${record.folder}/metadata.json`,\n `${JSON.stringify(metadata, null, 2)}\\n`,\n context\n );\n }\n };\n}\n\nfunction planeOf(\n env: ExecutionEnv,\n cli: ReturnType<typeof createCli>,\n options: AttachOptions,\n context: Context\n): ControlPlane {\n const common: PlaneOptions & { dir: string } = {\n ...(options.sweepEvery ? { sweepEvery: options.sweepEvery } : {}),\n mirror: mirror(options.agents, env),\n dir: options.controlDir ?? CONTROL_DIR,\n };\n if (!options.spools) return controlPlane(env, cli, common);\n return spooled(env, cli, options.spools, options.agents, common, context);\n}\n\nfunction spooled(\n env: ExecutionEnv,\n cli: ReturnType<typeof createCli>,\n spools: Spools,\n agents: Agents,\n options: PlaneOptions & { dir: string },\n context: Context\n): ControlPlane {\n const planes = new Map<string, Promise<ControlPlane | undefined>>();\n let off: () => void = () => undefined;\n let chain: Promise<unknown> = Promise.resolve();\n const open = async (user: string): Promise<ControlPlane | undefined> => {\n const dir = `${options.dir}/${user}`;\n try {\n await spools.prepare(user, dir, context);\n const plane = controlPlane(env, cli, { ...options, dir, user });\n await plane.start(context);\n return plane;\n } catch {\n planes.delete(user);\n return undefined;\n }\n };\n const sync = () => {\n const step = async () => {\n const wanted = new Set(spools.users());\n for (const user of wanted)\n if (!planes.has(user)) {\n const opened = open(user);\n planes.set(user, opened);\n await opened;\n }\n for (const [user, plane] of [...planes])\n if (!wanted.has(user)) {\n planes.delete(user);\n await (await plane)?.close(context);\n }\n };\n chain = chain.then(step, step);\n return chain;\n };\n const all = async () =>\n (await Promise.all(planes.values())).filter((plane): plane is ControlPlane => !!plane);\n return {\n async start() {\n off = agents.onChange(() => void sync());\n await sync();\n },\n async sweep(using) {\n for (const plane of await all()) await plane.sweep(using);\n },\n async close(using) {\n off();\n await chain;\n for (const plane of await all()) await plane.close(using);\n planes.clear();\n },\n };\n}\n\nexport function setupScoops(\n registry: Registry,\n licks: Licks,\n fileTools: readonly ToolRegistration[] = []\n): ScoopsSetup {\n let bind: (host: ScoopsHost) => void = () => undefined;\n const host = new Promise<ScoopsHost>((resolve) => {\n bind = resolve;\n });\n const lookup = () => host;\n const tasks = scoopTasks(lookup);\n const scoops = createScoops(host, () => tasks);\n let cached: Roles = { roles: [], warnings: [], limits: { ...DEFAULT_LIMITS } };\n let layout = LEGACY;\n registry.install(scoopsExtension(tasks, () => layout));\n registry.install(guardExtension(lookup));\n return {\n scoops,\n choosable: choosable(fileTools),\n async attach(options, context) {\n const { harness, agents, groups, env, home } = options;\n const assets = options.assets ?? packageAssets();\n layout = options.layout ?? LEGACY;\n bind({\n harness,\n agents,\n licks,\n tools: fileTools,\n groups,\n reads: options.reads,\n files: env,\n layout,\n ...(options.enforced ? { enforced: true } : {}),\n envOf: options.envOf,\n ...(options.mcp ? { mcp: options.mcp } : {}),\n });\n const builtin = async () => {\n const out: { path: string; text: string }[] = [];\n for (const name of BUILTIN_ROLES) {\n const path = `packages/vfs-root/agents/${name}.md`;\n out.push({ path: `builtin:${name}`, text: await assets(path) });\n }\n return out;\n };\n const roles = async (using: Context) => {\n cached = await loadRoles(\n {\n files: env,\n builtin,\n dirs: [\n ...(await packageDirs(env, PACKAGE_ROOTS, using)).map((dir) => ({\n source: 'package' as const,\n dir,\n })),\n { source: 'user', dir: `${options.agentDir ?? `${home}/.pi/agent`}/agents` },\n ],\n settingsPath: `${options.agentDir ?? `${home}/.pi/agent`}/settings.json`,\n },\n using\n );\n return cached;\n };\n await roles(context).catch(() => cached);\n const script = await assets('bin/agent').catch(() => undefined);\n if (script) {\n const binDir = options.binDir ?? BIN_DIR;\n await installCommands(env, script, binDir, context);\n }\n const cli = createCli({\n env,\n harness,\n agents,\n scoops,\n roles: () => roles(context),\n ...(options.alive ? { alive: options.alive } : {}),\n ...(options.memory ? { memory: options.memory } : {}),\n ...(options.gelatiere ? { gelatiere: options.gelatiere } : {}),\n ...(options.freezer ? { freezer: options.freezer } : {}),\n ...(options.models ? { models: options.models } : {}),\n layout,\n ...(options.panel ? { panel: options.panel } : {}),\n });\n const plane = planeOf(env, cli, options, context);\n await plane.start(context);\n return { roles, plane, close: (using) => plane.close(using) };\n },\n };\n}\n\nexport type { Rewound, Scoops } from './service.ts';\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -93,6 +93,10 @@ async function addFeed(core, tx, parent, feed2) {
93
93
  };
94
94
  return Number(task);
95
95
  }
96
+ function choosable(tools) {
97
+ const names = new Set(tools.map((tool) => tool.name));
98
+ return (name) => names.has(name) || (mcpEntries([name]) ?? []).length > 0;
99
+ }
96
100
  function selection(tools, names, mcp) {
97
101
  if (!names || !tools) return void 0;
98
102
  const picked = tools.filter((tool) => names.includes(tool.name));
@@ -452,6 +456,7 @@ export {
452
456
  SCOOPS_ROOT,
453
457
  ScoopWorkDoc,
454
458
  askerName,
459
+ choosable,
455
460
  coneOf,
456
461
  createScoops,
457
462
  findScoop,