@ai-ecoverse/slicc-agent 7.2.0 → 7.3.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.
package/README.md CHANGED
@@ -27,7 +27,7 @@ await agent.prompt('What is in /home?');
27
27
  ```
28
28
 
29
29
  - `openAgent({ models, model, storage?, registry?, settings? })` opens a durable Harness (in memory unless `storage` is given) and its root conversation, and resumes work a previous worker left unfinished.
30
- - `openOpfsSqliteStorage({ directory?, file? })` keeps the session in wasm SQLite ([`@sqlite.org/sqlite-wasm`](https://www.npmjs.com/package/@sqlite.org/sqlite-wasm)) in an `opfs-sahpool` pool, by default `/.slicc/agent/` in OPFS. It needs a dedicated worker. Only one worker holds a pool at a time: the opener takes a Web Lock per directory and waits until every file of the pool can be opened before sqlite-wasm installs it, because a failed install deletes the pool's directory. `openMemorySqliteStorage()` keeps the same database in memory. **Profile marker:** every open, under the pool's lock and before pi durable opens (and migrates) the database, writes `<directory>-profile.json` next to the pool, `/.slicc/agent-profile.json` by default: `{ "durableSchema": 2, "agent": "<version>" }`, with pi durable's `CURRENT_SQLITE_SCHEMA_VERSION` and the agent's version (the `agent` option, or the version in the agent's `package.json`). A `durableSchema` already in the file is never lowered. bios reads it from OPFS before it starts an agent, and refuses one whose pi durable schema is lower (slicc-agent 6.x is 1): the schema version lives in a `durable_schema` table, not in the SQLite header, so the database itself can't be checked without opening it. On pi durable 1.4, opening a database written by an earlier agent migrates it to durable's SQLite schema 2, once and in place; an agent on pi durable 1.3 or earlier (slicc-agent 6.19.13 and earlier) can't open it afterwards, so the agent can't be rolled back past this version. Requests through the Harness are attributed to SLICC (`identity: { attribution: { name: 'SLICC', url: 'https://www.sliccy.com' } }`), which pi-ai sends as OpenRouter's `HTTP-Referer` and `X-OpenRouter-Title`, NVIDIA's `X-BILLING-INVOKE-ORIGIN` and OpenCode's `x-opencode-client`; OpenRouter's preflight allows them from `https://seven.sliccy.ai`, and NVIDIA and OpenCode answer no browser preflight at all, so they go through a CORS-free transport either way. The Harness keeps one 1.3 behaviour: a task cut off by reloads is never parked (`restartLimit: Infinity`, since a reload ends the worker without closing the session).
30
+ - `openOpfsSqliteStorage({ directory?, file? })` keeps the session in wasm SQLite ([`@sqlite.org/sqlite-wasm`](https://www.npmjs.com/package/@sqlite.org/sqlite-wasm)) in an `opfs-sahpool` pool, by default `/.slicc/agent/` in OPFS. It needs a dedicated worker. Only one worker holds a pool at a time: the opener takes a Web Lock per directory and waits until every file of the pool can be opened before sqlite-wasm installs it, because a failed install deletes the pool's directory. `openMemorySqliteStorage()` keeps the same database in memory. **Profile marker:** every open, under the pool's lock and before pi durable opens (and migrates) the database, writes `<directory>-profile.json` next to the pool, `/.slicc/agent-profile.json` by default: `{ "durableSchema": 2, "agent": "<version>" }`, with pi durable's `CURRENT_SQLITE_SCHEMA_VERSION` and the agent's version (the `agent` option, or the version in the agent's `package.json`). A `durableSchema` already in the file is never lowered. bios reads it from OPFS before it starts an agent, and refuses one whose pi durable schema is lower (slicc-agent 6.x is 1): the schema version lives in a `durable_schema` table, not in the SQLite header, so the database itself can't be checked without opening it. On pi durable 1.4, opening a database written by an earlier agent migrates it to durable's SQLite schema 2, once and in place; an agent on pi durable 1.3 or earlier (slicc-agent 6.19.13 and earlier) can't open it afterwards, so the agent can't be rolled back past this version. Requests through the Harness are attributed to SLICC (`identity: { attribution: { name: 'SLICC', url: 'https://www.sliccy.com' } }`), which pi-ai sends as OpenRouter's `HTTP-Referer` and `X-OpenRouter-Title`, NVIDIA's `X-BILLING-INVOKE-ORIGIN` and OpenCode's `x-opencode-client`; OpenRouter's preflight allows them from `https://seven.sliccy.ai`, and NVIDIA and OpenCode answer no browser preflight at all, so they go through a CORS-free transport either way. pi durable's crash-loop guard is on with its default: a task cut off 5 times in a row without committing a new state (a crash, a reload or `restart()`, which end the worker without closing the session) is parked instead of started again. The monitor shows it as `blocked: restart limit` with an error alert, "generating of sliccy is parked", whose command is `agent retry <task id>`; run from a terminal, that runs the task again (`Harness.retryTask`). Only the user can retry: an agent's `agent retry` is refused, and so is a task that isn't parked.
31
31
  - `hostAgent(agent)` serves the agent from one Chord host named `agent` (`serveAgent` in [`src/host.ts`](src/host.ts)). Its remote contracts, in [`src/services.ts`](src/services.ts), are `slicc.agent.control` (send with `whenBusy` `steer`, `followUp` or `reject`, wait, withdraw, abort, compact) and `slicc.agent.transcript` (the conversation's durable view as replicated state, plus `deliveries`: how each user entry was delivered, `run`, `steer` or `follow-up`, derived by the host from where each send it accepted was placed: after a tool result it steered, queued first it's a follow-up or a late steer per its `whenBusy`, placed at once it started a run), `slicc.agent.settings`, `slicc.agent.remote` (remote control), `slicc.agent.pages` (Panels) and `slicc.agent.guest` (Guest seats). `serveConnections(self, host)` hands it every `MessagePort` the page sends, and each port becomes one Chord link whose principal is a seat: `owner` (a page of the owner, with its own Panels), `control` (a follower with Control), `view` (a follower without) or `guest` (a guest seat, with its id, label and epoch), plus the link's number, so every link gets its own objects. The principal is typed (`AgentPrincipal` in [`src/serving.ts`](src/serving.ts)); the host's own code acts as `{ seat: 'host' }`, which no link gets. Each factory picks a variant per seat. Every contract places its objects on the host `agent` (`hostNamed`), so no caller names a host. The contracts take their methods' arguments as one JSON array, and the client in [`src/serving.ts`](src/serving.ts) turns them back into the `AgentControl`, `AgentSettings`, `AgentRemote` and `AgentPages` interfaces and their replicated states, so callers don't see Chord.
32
32
  - `@ai-ecoverse/slicc-agent/page` has what the page needs (`startAgent`, `connectAgent`) without the agent's runtime: no pi-durable, pi-ai, providers or SQLite, which load only in the worker. `@ai-ecoverse/slicc-agent/spectrum` is just as light, and a test keeps both that way.
33
33
  - `startAgent({ worker })` takes the Web Lock `slicc-agent`, so one tab at a time owns the agent worker, and waits while another tab holds it. `connect()` returns an `AgentConnection` (`control`, `transcript`, `prompt()`, and `webhook(name, { id?, headers?, body })`, which hands a webhook delivery, such as one from the tray hub, to the licks without a chord `Context`), `restart()` replaces the worker (durable resumes from SQLite), and `release()` stops it and lets the next tab take over. `port()` returns a raw `MessagePort` into the worker instead, for another tab: hand it over (through a SharedWorker, say), and that tab calls `connectAgent(port)`. A caller that already holds the lock passes `held: true`. A connection's `closed` resolves when its port ends (with the error, if any), and from then on its states keep their last values.
@@ -257,6 +257,7 @@ Each scoop is owned by a background durable task, its **anchor**, so Stop in its
257
257
 
258
258
  **The `agent` command.** One bash script is installed under seven names, `agent`, `subagent`, `memory`, `gelatiere`, `freezer`, `models` and `panel`, in `/usr/local/bin`, mode `0755`, which is on every user's `PATH`, so the user, a cone or a scoop runs it in any bash. A file at one of those paths that isn't slicc-agent's (it lacks the `slicc-agent/1` request marker), such as a root global package's `memory`, is left alone, with one warning per boot in the worker's console. Root's `$PNPM_HOME/bin` (`/usr/local/share/pnpm/bin`) is on root's `PATH` only: other users find root's installed packages in `/usr/bin`, but not loose scripts. Copies that earlier versions put in the kernel's `$PNPM_HOME/bin` are removed, so they can't shadow the new ones for root. It writes a request (NUL-separated fields: `slicc-agent/1`, the name it was called by, `$SLICC_AGENT`, or `tab:$SLICC_TAB` from a terminal that has only that, the working directory, its pid, argc, the arguments and stdin) to `/var/lib/slicc/agent/requests/in/` and polls `out/` for the answer and exit code (with an optional `<id>.err`, the answer's stdout is `<id>.out` and its stderr `<id>.err`); the worker writes `<id>.ack` when it picks a request up, and the script gives up after 20 s without one ("the SLICC agent isn't running", exit 1). The kernel environment exports `SLICC_AGENT`, `PI_PROVIDER`, `PI_MODEL` and `PI_REASONING_LEVEL` into every agent command, so the worker knows the caller, and `PLAYWRIGHT_CLI_SESSION` with the same agent id, so each agent's `playwright-cli` keeps its own current tab (slicc-cdp #129). The user's terminals get none of these. `SLICC_AGENT` is checked against the process tree: the worker reads `ps`, walks up from the request's pid to the nearest bash an agent's kernel environment started, and refuses a request whose `SLICC_AGENT` names another agent, or names one when no agent's bash is above it; with kernel users, a user whose processes belong to another agent is refused too. The pid in the request is the script's own `$$`, so it is checked first: its `ps` row has to be the command it was called as (`/…/agent`, `subagent`, …) followed by exactly the request's arguments, and with kernel users it has to run as the spool's user (by `/etc/passwd`). A request whose pid isn't in the table or fails these checks, or a `ps` read that fails or stalls, is refused. A caller with no agent above it and no `SLICC_AGENT` is the user. `/var/lib/slicc/agent/scoops/<handle>/metadata.json` mirrors each scoop's state for scripts.
259
259
  - `agent [options] --prompt <text>` (or `--file <path>`, or `-` for stdin, or v6's `agent <cwd> <allowed-commands> <prompt>`) is **synchronous**: an ephemeral scoop runs, and the command prints its final answer and exits 0, or prints the reason on stderr and exits 1. Afterwards the scoop is stopped, its folder removed, its conversation marked dropped and its transcript archived as Markdown in `/tmp/agent-sessions/<handle>.md` (`/home/sessions/` with `--persist-session`, nowhere with `--no-persist-session`). The script traps TERM, INT and HUP and cancels the scoop, and the worker checks the script's pid in the kernel's process table every second for a SIGKILL. If the caller's run is still going when the bash call dies (a bash timeout), the scoop continues and its answer arrives as a `bash` lick; `--background-after <seconds>` does the same on purpose. Sync calls nest up to three deep. Allowed commands in v6's form are told to the scoop, not enforced.
260
+ - `agent retry <task id>` runs a task that pi durable parked after 5 restarts in a row again (see the monitor). Only the user may; it fails for a task that isn't live or isn't parked.
260
261
  - `agent --async …` (= `subagent spawn …`) starts a persistent scoop and prints its handle; only cones start them. `list [--agents]`, `status`, `rename`, `send [--follow-up]`, `wait [--timeout <s>] [--notify]` (30 s by default; `--notify` returns at once and brings the answers together in one `scoop-wait` lick) and `stop` manage them. From a scoop, `agent send parent "<note>"` posts a progress note to its cone as a lick, coalesced per scoop.
261
262
  - Options: `--name`, `--agent <role>`, `--model <provider/model>`, `--thinking <level>` or `--effort low|medium|high|max`, `--tools <a,b>` (or `auto`/`full`), `--read-only <paths>`, `--system-prompt[-file]`. `--schema-b64`, `--tools output`, `--session`, `--resume`, `--image`, `--no-escalate`, `--minimal` and `--usage` answer "not supported in SLICC yet".
262
263
 
package/dist/agent.js CHANGED
@@ -25,11 +25,6 @@ async function prompt(root, text, context) {
25
25
  }
26
26
  const SLICC_ATTRIBUTION = { name: "SLICC", url: "https://www.sliccy.com" };
27
27
  const IDENTITY = { attribution: SLICC_ATTRIBUTION };
28
- const RESTARTS = { restartLimit: Number.POSITIVE_INFINITY };
29
- function withRestarts(settings) {
30
- if (typeof settings === "function") return () => ({ ...RESTARTS, ...settings() });
31
- return { ...RESTARTS, ...settings };
32
- }
33
28
  async function openAgent(options) {
34
29
  const context = options.context ?? BACKGROUND_CONTEXT;
35
30
  const registry = options.registry ?? createRegistry();
@@ -47,7 +42,7 @@ async function openAgent(options) {
47
42
  models: options.models,
48
43
  registry,
49
44
  identity: IDENTITY,
50
- settings: withRestarts(options.settings),
45
+ ...options.settings ? { settings: options.settings } : {},
51
46
  onReport: (error, info) => reports.record(error, info),
52
47
  ...options.env ? { env: options.env } : {},
53
48
  ...options.conversationCreated ? { conversationCreated: options.conversationCreated } : {}
package/dist/agent.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/agent.ts"],
4
- "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n AssistantEntry,\n type Conversation,\n createRegistry,\n type EntryId,\n Harness,\n type HarnessOptions,\n MemoryStorage,\n type ModelRef,\n type Registry,\n type Storage,\n} from '@earendil-works/pi-durable';\nimport { type Agents, openAgents } from './agents.ts';\nimport type { Cones } from './cone.ts';\nimport { type GuestToolGate, guestToolGate } from './guests/guard.ts';\nimport { type GuestReviews, guestReviews } from './guests/review.ts';\nimport { type ScoopReviews, scoopReviews } from './guests/scoop.ts';\nimport { createReports, type Reports } from './reports.ts';\n\nexport interface AgentOptions {\n models: Models;\n model: ModelRef;\n storage?: Storage;\n registry?: Registry;\n settings?: HarnessOptions['settings'];\n env?: HarnessOptions['env'];\n conversationCreated?: HarnessOptions['conversationCreated'];\n context?: Context;\n beforeResume?: (harness: Harness, context: Context) => Promise<unknown>;\n}\n\nexport interface Agent extends Cones {\n readonly harness: Harness;\n readonly root: Conversation;\n readonly agents: Agents;\n readonly reviews: GuestReviews;\n readonly gate: GuestToolGate;\n readonly scoopReviews: ScoopReviews;\n readonly reports: Reports;\n onCone(listener: (conversation: Conversation) => void | Promise<void>): () => void;\n prompt(text: string): Promise<string>;\n close(): Promise<void>;\n}\n\ninterface Block {\n type: string;\n text?: string;\n}\n\nexport function answerText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n return (content as Block[])\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('');\n}\n\nasync function prompt(root: Conversation, text: string, context: Context): Promise<string> {\n const submission = await root.submit({ type: 'input', content: text }, context);\n const settled = await submission.wait(context);\n const { answer, reason } = settled as { answer?: EntryId; reason?: string };\n if (answer === undefined) throw new Error(`unanswered: ${reason}`);\n const entry = await root.commit((tx) => tx.entry(AssistantEntry, answer), context);\n return answerText(entry?.model?.[0]?.content);\n}\n\nexport const SLICC_ATTRIBUTION = { name: 'SLICC', url: 'https://www.sliccy.com' };\nconst IDENTITY = { attribution: SLICC_ATTRIBUTION };\nconst RESTARTS = { restartLimit: Number.POSITIVE_INFINITY };\n\nfunction withRestarts(settings: HarnessOptions['settings']): HarnessOptions['settings'] {\n if (typeof settings === 'function') return () => ({ ...RESTARTS, ...settings() });\n return { ...RESTARTS, ...settings };\n}\n\nexport async function openAgent(options: AgentOptions): Promise<Agent> {\n const context = options.context ?? BACKGROUND_CONTEXT;\n const registry = options.registry ?? createRegistry();\n let opened: Harness | undefined;\n const gate = guestToolGate(() => opened);\n registry.install(gate.extension);\n const reviews = guestReviews();\n registry.install(reviews.extension);\n const scooped = scoopReviews();\n registry.install(scooped.extension);\n const reports = createReports();\n const harness = await Harness.open(\n options.storage ?? new MemoryStorage(),\n {\n models: options.models,\n registry,\n identity: IDENTITY,\n settings: withRestarts(options.settings),\n onReport: (error, info) => reports.record(error, info),\n ...(options.env ? { env: options.env } : {}),\n ...(options.conversationCreated ? { conversationCreated: options.conversationCreated } : {}),\n },\n context\n );\n opened = harness;\n const root = await harness.root(context, { agent: { model: options.model } });\n const agents = await openAgents(harness, root, context);\n await options.beforeResume?.(harness, context);\n harness.resume();\n return {\n harness,\n root,\n agents,\n reviews,\n gate,\n scoopReviews: scooped,\n reports,\n cone: () => agents.cone(),\n switchCone: (conversation, switching) => agents.switchCone(conversation, switching),\n onCone: (listener) => agents.onCone(listener),\n prompt: (text) => prompt(agents.cone(), text, context),\n close: () => harness.close(context),\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n AssistantEntry,\n type Conversation,\n createRegistry,\n type EntryId,\n Harness,\n type HarnessOptions,\n MemoryStorage,\n type ModelRef,\n type Registry,\n type Storage,\n} from '@earendil-works/pi-durable';\nimport { type Agents, openAgents } from './agents.ts';\nimport type { Cones } from './cone.ts';\nimport { type GuestToolGate, guestToolGate } from './guests/guard.ts';\nimport { type GuestReviews, guestReviews } from './guests/review.ts';\nimport { type ScoopReviews, scoopReviews } from './guests/scoop.ts';\nimport { createReports, type Reports } from './reports.ts';\n\nexport interface AgentOptions {\n models: Models;\n model: ModelRef;\n storage?: Storage;\n registry?: Registry;\n settings?: HarnessOptions['settings'];\n env?: HarnessOptions['env'];\n conversationCreated?: HarnessOptions['conversationCreated'];\n context?: Context;\n beforeResume?: (harness: Harness, context: Context) => Promise<unknown>;\n}\n\nexport interface Agent extends Cones {\n readonly harness: Harness;\n readonly root: Conversation;\n readonly agents: Agents;\n readonly reviews: GuestReviews;\n readonly gate: GuestToolGate;\n readonly scoopReviews: ScoopReviews;\n readonly reports: Reports;\n onCone(listener: (conversation: Conversation) => void | Promise<void>): () => void;\n prompt(text: string): Promise<string>;\n close(): Promise<void>;\n}\n\ninterface Block {\n type: string;\n text?: string;\n}\n\nexport function answerText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n return (content as Block[])\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('');\n}\n\nasync function prompt(root: Conversation, text: string, context: Context): Promise<string> {\n const submission = await root.submit({ type: 'input', content: text }, context);\n const settled = await submission.wait(context);\n const { answer, reason } = settled as { answer?: EntryId; reason?: string };\n if (answer === undefined) throw new Error(`unanswered: ${reason}`);\n const entry = await root.commit((tx) => tx.entry(AssistantEntry, answer), context);\n return answerText(entry?.model?.[0]?.content);\n}\n\nexport const SLICC_ATTRIBUTION = { name: 'SLICC', url: 'https://www.sliccy.com' };\nconst IDENTITY = { attribution: SLICC_ATTRIBUTION };\nexport async function openAgent(options: AgentOptions): Promise<Agent> {\n const context = options.context ?? BACKGROUND_CONTEXT;\n const registry = options.registry ?? createRegistry();\n let opened: Harness | undefined;\n const gate = guestToolGate(() => opened);\n registry.install(gate.extension);\n const reviews = guestReviews();\n registry.install(reviews.extension);\n const scooped = scoopReviews();\n registry.install(scooped.extension);\n const reports = createReports();\n const harness = await Harness.open(\n options.storage ?? new MemoryStorage(),\n {\n models: options.models,\n registry,\n identity: IDENTITY,\n ...(options.settings ? { settings: options.settings } : {}),\n onReport: (error, info) => reports.record(error, info),\n ...(options.env ? { env: options.env } : {}),\n ...(options.conversationCreated ? { conversationCreated: options.conversationCreated } : {}),\n },\n context\n );\n opened = harness;\n const root = await harness.root(context, { agent: { model: options.model } });\n const agents = await openAgents(harness, root, context);\n await options.beforeResume?.(harness, context);\n harness.resume();\n return {\n harness,\n root,\n agents,\n reviews,\n gate,\n scoopReviews: scooped,\n reports,\n cone: () => agents.cone(),\n switchCone: (conversation, switching) => agents.switchCone(conversation, switching),\n onCone: (listener) => agents.onCone(listener),\n prompt: (text) => prompt(agents.cone(), text, context),\n close: () => harness.close(context),\n };\n}\n"],
5
+ "mappings": "AACA,SAAS,0BAA0B;AAEnC;AAAA,EACE;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,OAIK;AACP,SAAsB,kBAAkB;AAExC,SAA6B,qBAAqB;AAClD,SAA4B,oBAAoB;AAChD,SAA4B,oBAAoB;AAChD,SAAS,qBAAmC;AAgCrC,SAAS,WAAW,SAA0B;AACnD,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAQ,QACL,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,EACvC,IAAI,CAAC,UAAU,MAAM,QAAQ,EAAE,EAC/B,KAAK,EAAE;AACZ;AAEA,eAAe,OAAO,MAAoB,MAAc,SAAmC;AACzF,QAAM,aAAa,MAAM,KAAK,OAAO,EAAE,MAAM,SAAS,SAAS,KAAK,GAAG,OAAO;AAC9E,QAAM,UAAU,MAAM,WAAW,KAAK,OAAO;AAC7C,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,MAAI,WAAW,OAAW,OAAM,IAAI,MAAM,eAAe,MAAM,EAAE;AACjE,QAAM,QAAQ,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,MAAM,gBAAgB,MAAM,GAAG,OAAO;AACjF,SAAO,WAAW,OAAO,QAAQ,CAAC,GAAG,OAAO;AAC9C;AAEO,MAAM,oBAAoB,EAAE,MAAM,SAAS,KAAK,yBAAyB;AAChF,MAAM,WAAW,EAAE,aAAa,kBAAkB;AAClD,eAAsB,UAAU,SAAuC;AACrE,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,QAAQ,YAAY,eAAe;AACpD,MAAI;AACJ,QAAM,OAAO,cAAc,MAAM,MAAM;AACvC,WAAS,QAAQ,KAAK,SAAS;AAC/B,QAAM,UAAU,aAAa;AAC7B,WAAS,QAAQ,QAAQ,SAAS;AAClC,QAAM,UAAU,aAAa;AAC7B,WAAS,QAAQ,QAAQ,SAAS;AAClC,QAAM,UAAU,cAAc;AAC9B,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,QAAQ,WAAW,IAAI,cAAc;AAAA,IACrC;AAAA,MACE,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,UAAU;AAAA,MACV,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MACzD,UAAU,CAAC,OAAO,SAAS,QAAQ,OAAO,OAAO,IAAI;AAAA,MACrD,GAAI,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,MAC1C,GAAI,QAAQ,sBAAsB,EAAE,qBAAqB,QAAQ,oBAAoB,IAAI,CAAC;AAAA,IAC5F;AAAA,IACA;AAAA,EACF;AACA,WAAS;AACT,QAAM,OAAO,MAAM,QAAQ,KAAK,SAAS,EAAE,OAAO,EAAE,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC5E,QAAM,SAAS,MAAM,WAAW,SAAS,MAAM,OAAO;AACtD,QAAM,QAAQ,eAAe,SAAS,OAAO;AAC7C,UAAQ,OAAO;AACf,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,MAAM,MAAM,OAAO,KAAK;AAAA,IACxB,YAAY,CAAC,cAAc,cAAc,OAAO,WAAW,cAAc,SAAS;AAAA,IAClF,QAAQ,CAAC,aAAa,OAAO,OAAO,QAAQ;AAAA,IAC5C,QAAQ,CAAC,SAAS,OAAO,OAAO,KAAK,GAAG,MAAM,OAAO;AAAA,IACrD,OAAO,MAAM,QAAQ,MAAM,OAAO;AAAA,EACpC;AACF;",
6
6
  "names": []
7
7
  }
@@ -10,6 +10,7 @@ import { LICK_CHANNELS } from "../licks/lick.js";
10
10
  import { scopedName } from "../licks/sources.js";
11
11
  import { findRole } from "../roles/roles.js";
12
12
  import { callerOf as agentOf } from "./identity.js";
13
+ import { retryParked } from "./retry.js";
13
14
  import { findScoop, modelOf } from "./service.js";
14
15
  import { cancelSync, detachSync, runSync } from "./sync.js";
15
16
  import { callerTaints } from "./taints.js";
@@ -28,6 +29,7 @@ const USAGE = `usage:
28
29
  agent send parent <note> from a scoop: a progress note to its cone
29
30
  agent wait <handle>... [--timeout <seconds>] [--notify]
30
31
  agent stop <handle>
32
+ agent retry <task id> run a task parked after 5 restarts again
31
33
  agent workflow run|list|status|stop|save ... Claude Code workflows; agent workflow help
32
34
 
33
35
  options:
@@ -496,6 +498,7 @@ async function rename(deps, request, who, context) {
496
498
  if (refused) return refused;
497
499
  return deps.scoops.rename(found[0], request.argv.slice(2).join(" "), context);
498
500
  }
501
+ const retry = (deps, request, who, context) => retryParked(deps.harness, request.argv[1], who.fromAgent, context);
499
502
  const help = async () => ok(USAGE);
500
503
  const VERBS = {
501
504
  list,
@@ -504,6 +507,7 @@ const VERBS = {
504
507
  wait,
505
508
  stop,
506
509
  rename,
510
+ retry,
507
511
  workflow: async (deps, request, who, context) => deps.workflow ? deps.workflow(
508
512
  request.argv.slice(1),
509
513
  { ...who, taints: await taintsOf(deps, request, who, context) },
@@ -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 { 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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",
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 { retryParked } from './retry.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 retry <task id> run a task parked after 5 restarts again\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\nconst retry = (deps: Deps, request: Request, who: Caller, context: Context) =>\n retryParked(deps.harness, request.argv[1], who.fromAgent, context);\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 retry,\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,19 @@
1
+ const fail = (out) => ({ code: 1, out: `agent: ${out}
2
+ ` });
3
+ async function retryParked(harness, id, fromAgent, context) {
4
+ if (fromAgent) return fail("only the user can run a parked task again");
5
+ if (!id || !/^\d+$/.test(id)) return fail("usage: agent retry <task id>");
6
+ const found = (await harness.inspect(context)).tasks.find(
7
+ (task) => String(task.record.id) === id
8
+ );
9
+ if (!found) return fail(`there is no live task ${id}`);
10
+ if (found.state.kind !== "blocked" || found.state.reason !== "restart_limit")
11
+ return fail(`task ${id} isn't parked`);
12
+ await harness.retryTask(found.record.id, context);
13
+ return { code: 0, out: `task ${id} runs again
14
+ ` };
15
+ }
16
+ export {
17
+ retryParked
18
+ };
19
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/scoops/retry.ts"],
4
+ "sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { Harness } from '@earendil-works/pi-durable';\n\nexport interface RetryAnswer {\n code: number;\n out: string;\n}\n\nconst fail = (out: string): RetryAnswer => ({ code: 1, out: `agent: ${out}\\n` });\n\nexport async function retryParked(\n harness: Pick<Harness, 'inspect' | 'retryTask'>,\n id: string | undefined,\n fromAgent: boolean,\n context: Context\n): Promise<RetryAnswer> {\n if (fromAgent) return fail('only the user can run a parked task again');\n if (!id || !/^\\d+$/.test(id)) return fail('usage: agent retry <task id>');\n const found = (await harness.inspect(context)).tasks.find(\n (task) => String(task.record.id) === id\n );\n if (!found) return fail(`there is no live task ${id}`);\n if (found.state.kind !== 'blocked' || found.state.reason !== 'restart_limit')\n return fail(`task ${id} isn't parked`);\n await harness.retryTask(found.record.id, context);\n return { code: 0, out: `task ${id} runs again\\n` };\n}\n"],
5
+ "mappings": "AAQA,MAAM,OAAO,CAAC,SAA8B,EAAE,MAAM,GAAG,KAAK,UAAU,GAAG;AAAA,EAAK;AAE9E,eAAsB,YACpB,SACA,IACA,WACA,SACsB;AACtB,MAAI,UAAW,QAAO,KAAK,2CAA2C;AACtE,MAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,EAAE,EAAG,QAAO,KAAK,8BAA8B;AACxE,QAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,GAAG,MAAM;AAAA,IACnD,CAAC,SAAS,OAAO,KAAK,OAAO,EAAE,MAAM;AAAA,EACvC;AACA,MAAI,CAAC,MAAO,QAAO,KAAK,yBAAyB,EAAE,EAAE;AACrD,MAAI,MAAM,MAAM,SAAS,aAAa,MAAM,MAAM,WAAW;AAC3D,WAAO,KAAK,QAAQ,EAAE,eAAe;AACvC,QAAM,QAAQ,UAAU,MAAM,OAAO,IAAI,OAAO;AAChD,SAAO,EAAE,MAAM,GAAG,KAAK,QAAQ,EAAE;AAAA,EAAgB;AACnD;",
6
+ "names": []
7
+ }
@@ -385,6 +385,16 @@ function taskAlerts(input, feed, nameOf) {
385
385
  detail: problem.message,
386
386
  severity: "error"
387
387
  });
388
+ for (const task of feed.tasks)
389
+ if (task.blocked === "restart_limit")
390
+ out.push({
391
+ id: `parked-${task.id}`,
392
+ title: `${taskLabel(task)} of ${nameOf(task.agentId)} is parked`,
393
+ detail: "It was cut off by 5 restarts in a row without getting further, so it no longer starts by itself.",
394
+ severity: "error",
395
+ command: `agent retry ${task.id}`,
396
+ commandLabel: "To run it again, run"
397
+ });
388
398
  for (const task of feed.tasks)
389
399
  if (task.aborting !== null && input.now - task.aborting > ABORT_MS)
390
400
  out.push({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/spectrum/monitor-port.ts"],
4
- "sourcesContent": ["import type {\n MonitorAlert,\n MonitorEvents,\n MonitorPort,\n MonitorRow,\n MonitorSection,\n MonitorSnapshot,\n MonitorStatus,\n MonitorVital,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AgentConnection } from '../client.ts';\nimport { contextRatio } from '../context.ts';\nimport type {\n BudgetState,\n ModelChoice,\n MonitorAgent,\n MonitorFeed,\n MonitorProblem,\n MonitorProcess,\n MonitorTask,\n} from '../services.ts';\nimport { budgetName, type Selected, selectedBudget } from './budget.ts';\nimport { Emitter } from './emitter.ts';\n\nexport const RENEW_MS = 10000;\nexport const SAMPLE_MS = 2000;\nexport const ROWS_MAX = 200;\nexport const HISTORY = 24;\nexport const CPU_HISTORY = 30;\nexport const CPU_QUIET = 0.01;\nexport const BUDGET_WARN = 80;\nexport const BUDGET_ERROR = 95;\nexport const RETRY_WARN = 3;\nexport const RETRY_ERROR = 6;\nexport const RETRY_SLOW_MS = 120000;\nexport const FAILED_MS = 600000;\nexport const ABORT_MS = 30000;\nexport const ABORT_ROW_MS = 10000;\nexport const GROUP_MAX = 32;\nexport const TOTAL_MAX = 128;\nexport const ZOMBIE_MS = 60000;\nexport const STALE_MS = 1800000;\nexport const CPU_SHARE = 0.9;\nexport const CPU_SUSTAIN_MS = 120000;\nexport const CONTEXT_WARN = 0.8;\nexport const DEPTH_MAX = 6;\nconst MINUTE = 60000;\nconst HOUR = 3600000;\nconst DAY = 86400000;\n\nexport type AgentMonitorAlert = MonitorAlert & { command?: string; commandLabel?: string };\n\nexport interface Sample {\n at: number;\n cost: number;\n tokens: number;\n active: number;\n}\n\nexport interface MonitorInput {\n feed: MonitorFeed | undefined;\n budget: BudgetState | null | undefined;\n models: readonly ModelChoice[];\n changes: readonly { path: string; status: string }[];\n sprinkles?: readonly { name: string; title: string }[];\n extra: readonly MonitorSection[];\n history: readonly Sample[];\n now: number;\n hot?: ReadonlyMap<number, number>;\n cpu?: readonly number[];\n processes?: readonly number[];\n memory?: readonly number[];\n}\n\nexport function record<T>(list: T[], value: T, max: number): void {\n list.push(value);\n if (list.length > max) list.shift();\n}\n\nfunction trend(series: readonly number[] | undefined): { series?: number[] } {\n return series && series.length > 1 ? { series: [...series] } : {};\n}\n\nconst KINDS: Record<string, string> = {\n 'pi.generation': 'generating',\n 'pi.compaction': 'compacting',\n 'slicc.scoop-wait': 'agent wait',\n 'slicc.scoop-reporter': 'report',\n 'slicc.memory-extract': 'memory extraction',\n};\n\nexport function age(ms: number): string {\n const seconds = Math.max(0, Math.round(ms / 1000));\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n return `${Math.floor(seconds / 3600)}h`;\n}\n\nexport function money(value: number): string {\n if (value > 0 && value < 0.01) return '<$0.01';\n return `$${value.toFixed(2)}`;\n}\n\nexport function count(value: number): string {\n if (value < 1000) return String(value);\n if (value < 1000000) return `${(value / 1000).toFixed(1)}k`;\n return `${(value / 1000000).toFixed(1)}M`;\n}\n\nexport function bytes(value: number): string {\n if (value < 1024) return `${value} B`;\n const units = ['KiB', 'MiB', 'GiB', 'TiB'];\n let size = value / 1024;\n let unit = 0;\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024;\n unit++;\n }\n return `${size.toFixed(size < 10 ? 1 : 0)} ${units[unit]}`;\n}\n\nexport function cpuText(share: number | null | undefined): string | null {\n if (typeof share !== 'number' || share < CPU_QUIET) return null;\n return `${Math.round(share * 100)}%\\u00a0CPU`;\n}\n\nexport function agentsCpu(feed: MonitorFeed): number | null {\n const shares = feed.agents\n .map((agent) => agent.cpu)\n .filter((share): share is number => typeof share === 'number');\n return shares.length ? shares.reduce((sum, share) => sum + share, 0) : null;\n}\n\nfunction cpuVital(feed: MonitorFeed, history: readonly number[]): MonitorVital[] {\n const share = agentsCpu(feed);\n if (share === null) return [];\n return [\n {\n id: 'cpu',\n label: 'CPU',\n value: `${Math.round(share * 100)}%`,\n unit: 'of one core',\n ...trend(history.map((value) => Math.round(value * 100))),\n },\n ];\n}\n\nfunction measuredOf(processes: readonly MonitorProcess[]): MonitorProcess[] {\n return processes.filter((row) => typeof row.rss === 'number');\n}\n\nexport function memoryTotal(processes: readonly MonitorProcess[]): number | null {\n const measured = measuredOf(processes);\n return measured.length ? measured.reduce((sum, row) => sum + (row.rss as number), 0) : null;\n}\n\nfunction memoryVital(\n processes: readonly MonitorProcess[],\n history: readonly number[] | undefined\n): MonitorVital[] {\n const total = memoryTotal(processes);\n if (total === null) return [];\n const measured = measuredOf(processes);\n const agents = measured\n .filter((row) => row.agentId)\n .reduce((sum, row) => sum + (row.rss as number), 0);\n return [\n {\n id: 'memory',\n label: 'Process memory',\n value: bytes(total),\n unit: `${bytes(agents)} by agents`,\n ...trend(history),\n },\n ];\n}\n\nexport function taskLabel(task: MonitorTask): string {\n if (task.kind === 'pi.tool') return task.detail ? `tool ${task.detail}` : 'tool';\n if (task.kind === 'slicc.scoop-anchor') return task.detail ? `scoop ${task.detail}` : 'scoop';\n return KINDS[task.kind] ?? task.kind;\n}\n\nfunction coneOf(agents: ReadonlyMap<string, MonitorAgent>, id: string | null): string | null {\n const visited = new Set<string>();\n let current = id === null ? undefined : agents.get(id);\n while (current?.parentId && !visited.has(current.id)) {\n visited.add(current.id);\n const parent = agents.get(current.parentId);\n if (!parent) break;\n current = parent;\n }\n return current ? current.id : null;\n}\n\nfunction ordered(feed: MonitorFeed): MonitorAgent[] {\n const byId = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const out: MonitorAgent[] = [];\n for (const cone of feed.agents.filter((agent) => agent.kind === 'cone')) {\n out.push(cone);\n for (const agent of feed.agents)\n if (agent.kind === 'scoop' && coneOf(byId, agent.id) === cone.id) out.push(agent);\n }\n for (const agent of feed.agents) if (!out.includes(agent)) out.push(agent);\n return out;\n}\n\nexport function taskTree(feed: MonitorFeed): { task: MonitorTask; depth: number }[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const order = ordered(feed).map((agent) => agent.id);\n const rank = (task: MonitorTask) => {\n const at = task.agentId === null ? -1 : order.indexOf(task.agentId);\n return at < 0 ? order.length : at;\n };\n const groupOf = (task: MonitorTask) => coneOf(agents, task.agentId) ?? '';\n const byId = new Map(feed.tasks.map((task) => [task.id, task]));\n const children = new Map<string, MonitorTask[]>();\n const roots: MonitorTask[] = [];\n for (const task of feed.tasks) {\n const owner = task.owner === null ? undefined : byId.get(task.owner);\n if (owner && groupOf(owner) === groupOf(task)) {\n const list = children.get(owner.id) ?? [];\n list.push(task);\n children.set(owner.id, list);\n } else roots.push(task);\n }\n const sort = (list: MonitorTask[]) =>\n list.sort((a, b) => rank(a) - rank(b) || Number(a.id) - Number(b.id));\n const out: { task: MonitorTask; depth: number }[] = [];\n const visit = (task: MonitorTask, depth: number) => {\n out.push({ task, depth });\n for (const child of sort(children.get(task.id) ?? [])) visit(child, depth + 1);\n };\n for (const root of sort(roots)) visit(root, 0);\n return out;\n}\n\nfunction capped(rows: MonitorRow[]): MonitorRow[] {\n if (rows.length <= ROWS_MAX) return rows;\n const shown = rows.slice(0, ROWS_MAX - 1);\n return [\n ...shown,\n { id: 'more', name: `+${rows.length - shown.length} more`, meta: '', status: 'idle' },\n ];\n}\n\nfunction agentContext(agent: MonitorAgent, models: readonly ModelChoice[]): number | null {\n return contextRatio(agent.context, agent.model, models);\n}\n\nfunction rate(history: readonly Sample[], pick: (sample: Sample) => number): number | null {\n const first = history[0];\n const last = history.at(-1);\n if (!first || !last || last.at - first.at < MINUTE) return null;\n return ((pick(last) - pick(first)) / (last.at - first.at)) * HOUR;\n}\n\nconst RELATIVE = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });\n\nfunction resetsIn(at: number, now: number): string {\n const ms = at - now;\n if (ms <= 0) return 'resets soon';\n if (ms >= DAY)\n return `resets ${RELATIVE.format(Math.floor(at / DAY) - Math.floor(now / DAY), 'day')}`;\n if (ms >= HOUR) return `resets ${RELATIVE.format(Math.floor(ms / HOUR), 'hour')}`;\n return `resets ${RELATIVE.format(Math.ceil(ms / MINUTE), 'minute')}`;\n}\n\nfunction budgetVital(budget: BudgetState, now: number): MonitorVital {\n const resets = new Date(budget.resets);\n return {\n id: 'budget',\n provider: budget.provider,\n window: budget.window,\n label: `Budget (${budget.window})`,\n value: `${budget.percent}%`,\n ...(Number.isNaN(resets.getTime())\n ? {}\n : {\n unit: resetsIn(resets.getTime(), now),\n hint: `resets ${resets.toISOString().slice(0, 16).replace('T', ' ')} UTC`,\n }),\n ratio: Math.min(1, Math.max(0, budget.percent / 100)),\n };\n}\n\nfunction vitals(input: MonitorInput, feed: MonitorFeed): MonitorVital[] {\n const out: MonitorVital[] = [];\n if (feed.usage) {\n const free = feed.usage.free;\n const pick = (sample: Sample) => (free ? sample.tokens : sample.cost);\n const perHour = rate(input.history, pick);\n const series = input.history.map(pick);\n out.push({\n id: 'spend',\n label: free ? 'Tokens' : 'Spend',\n value: free ? count(feed.usage.tokens) : money(feed.usage.cost),\n unit: free ? 'tokens' : `${count(feed.usage.tokens)} tokens`,\n ...(perHour === null ? {} : { delta: `${free ? count(perHour) : money(perHour)}/h` }),\n ...trend(series),\n });\n }\n const active = feed.agents.filter((agent) => agent.running).length;\n out.push({\n id: 'agents',\n label: 'Active agents',\n value: String(active),\n unit: `of ${feed.agents.length}`,\n ...trend(input.history.map((sample) => sample.active)),\n });\n const tools = feed.tasks.filter(\n (task) => task.kind === 'pi.tool' && task.status === 'running'\n ).length;\n out.push({\n id: 'tasks',\n label: 'Running',\n value: String(tools),\n unit: `${tools === 1 ? 'tool' : 'tools'} \u00B7 ${feed.tasks.length} ${feed.tasks.length === 1 ? 'task' : 'tasks'}`,\n });\n out.push(\n feed.processes\n ? {\n id: 'processes',\n label: 'Processes',\n value: String(feed.processes.length),\n unit: `${feed.processes.filter((row) => row.agentId).length} by agents`,\n ...trend(input.processes),\n }\n : feed.kernel === 'checking'\n ? { id: 'processes', label: 'Processes', value: '\u2026', unit: 'checking' }\n : { id: 'processes', label: 'Processes', value: '\u2014', unit: 'kernel not reachable' }\n );\n out.push(...memoryVital(feed.processes ?? [], input.memory));\n out.push(...cpuVital(feed, input.cpu ?? []));\n const ratios = feed.agents\n .map((agent) => agentContext(agent, input.models))\n .filter((ratio): ratio is number => ratio !== null);\n if (ratios.length) {\n const fullest = Math.max(...ratios);\n out.push({\n id: 'context',\n label: 'Fullest context',\n value: `${Math.round(fullest * 100)}%`,\n ratio: fullest,\n });\n }\n return out;\n}\n\nfunction stale(process: MonitorProcess, agents: ReadonlyMap<string, MonitorAgent>, now: number) {\n if (!process.agentId || process.state === 'Z' || !process.started) return false;\n if (typeof process.utime === 'number') return false;\n if (agents.get(process.agentId)?.tool === 'bash') return false;\n return now - process.started > STALE_MS;\n}\n\nfunction zombied(process: MonitorProcess, now: number): boolean {\n return process.zombie !== null && now - process.zombie > ZOMBIE_MS;\n}\n\nfunction groups(processes: readonly MonitorProcess[]): Map<number, MonitorProcess[]> {\n const out = new Map<number, MonitorProcess[]>();\n for (const process of processes) {\n if (!process.agentId) continue;\n const list = out.get(process.pgid) ?? [];\n list.push(process);\n out.set(process.pgid, list);\n }\n return out;\n}\n\ntype Names = (id: string | null) => string;\n\nexport function groupCpu(\n processes: readonly MonitorProcess[]\n): Map<number, { agentId: string; share: number }> {\n const out = new Map<number, { agentId: string; share: number }>();\n for (const [pgid, members] of groups(processes)) {\n const measured = members.filter((row) => typeof row.cpu === 'number');\n if (!measured.length) continue;\n const share = measured.reduce((sum, row) => sum + (row.cpu as number), 0);\n out.set(pgid, { agentId: (members[0] as MonitorProcess).agentId as string, share });\n }\n return out;\n}\n\nexport function hotGroups(\n processes: readonly MonitorProcess[],\n at: number,\n previous: ReadonlyMap<number, number>\n): Map<number, number> {\n const out = new Map<number, number>();\n for (const [pgid, { share }] of groupCpu(processes))\n if (share >= CPU_SHARE) out.set(pgid, previous.get(pgid) ?? at);\n return out;\n}\n\nfunction busy(input: MonitorInput, processes: readonly MonitorProcess[]) {\n const shares = groupCpu(processes);\n const out: { pgid: number; agentId: string; share: number; held: number }[] = [];\n for (const [pgid, since] of input.hot ?? []) {\n const group = shares.get(pgid);\n const held = input.now - since;\n if (group && group.share >= CPU_SHARE && held >= CPU_SUSTAIN_MS)\n out.push({ pgid, ...group, held });\n }\n return out;\n}\n\nfunction cpuAlerts(input: MonitorInput, processes: readonly MonitorProcess[], nameOf: Names) {\n return busy(input, processes).map(\n (group): AgentMonitorAlert => ({\n id: `runaway-cpu-${group.pgid}`,\n title: `${nameOf(group.agentId)} is using a lot of CPU`,\n detail: `${Math.round(group.share * 100)}% of one core for ${Math.floor(group.held / MINUTE)} minutes.`,\n command: `kill -- -${group.pgid}`,\n commandLabel: 'To stop it, run',\n severity: cpuSeverity(group),\n })\n );\n}\n\nfunction cpuSeverity(group: { share: number; held: number }): 'warn' | 'error' {\n return group.share >= CPU_SHARE * 2 || group.held >= CPU_SUSTAIN_MS * 2 ? 'error' : 'warn';\n}\n\nfunction crowdSeverity(members: readonly MonitorProcess[]): 'warn' | 'error' {\n return members.length > GROUP_MAX * 2 ? 'error' : 'warn';\n}\n\nfunction staleSeverity(process: MonitorProcess, now: number): 'warn' | 'error' {\n return now - process.started > STALE_MS * 2 ? 'error' : 'warn';\n}\n\nfunction worse(\n a: 'warn' | 'error' | undefined,\n b: 'warn' | 'error' | undefined\n): 'warn' | 'error' | undefined {\n return a === 'error' || b === 'error' ? 'error' : (a ?? b);\n}\n\nfunction resetLine(budget: BudgetState): string {\n const resets = new Date(budget.resets);\n return Number.isNaN(resets.getTime())\n ? `The ${budget.window} budget is nearly used up.`\n : `Resets ${resets.toISOString().slice(0, 16).replace('T', ' ')} UTC.`;\n}\n\nfunction budgetAlerts(budget: BudgetState | null | undefined): AgentMonitorAlert[] {\n if (!budget || budget.percent < BUDGET_WARN) return [];\n return [\n {\n id: 'budget',\n title: `${budgetName(budget.provider)} budget ${budget.percent}% used`,\n detail: resetLine(budget),\n severity: budget.percent >= BUDGET_ERROR ? 'error' : 'warn',\n },\n ];\n}\n\nfunction agentAlerts(input: MonitorInput, feed: MonitorFeed): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const agent of feed.agents) {\n const retry = agent.retry;\n if (retry && (retry.attempt >= RETRY_WARN || input.now - retry.since > RETRY_SLOW_MS))\n out.push({\n id: `retry-${agent.id}`,\n title: `${agent.name} is retrying (attempt ${retry.attempt})`,\n detail: retry.error,\n severity: retry.attempt >= RETRY_ERROR ? 'error' : 'warn',\n });\n if (agent.failed && !agent.running)\n out.push({\n id: `turn-${agent.id}`,\n title: `${agent.name}'s last turn failed`,\n detail: agent.failed,\n severity: 'error',\n });\n }\n return out;\n}\n\nfunction taskAlerts(input: MonitorInput, feed: MonitorFeed, nameOf: Names): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const problem of feed.problems)\n if (problem.kind === 'task' && input.now - problem.at < FAILED_MS)\n out.push({\n id: `failed-${problem.id}`,\n title: `A task of ${nameOf(problem.agentId)} failed`,\n detail: problem.message,\n severity: 'error',\n });\n else if (\n problem.kind === 'report' &&\n SERIOUS.has(problem.report?.type ?? '') &&\n input.now - problem.at < FAILED_MS\n )\n out.push({\n id: `reported-${problem.id}`,\n title: `${nameOf(problem.agentId)}: ${problemName(problem)}`,\n detail: problem.message,\n severity: 'error',\n });\n for (const task of feed.tasks)\n if (task.aborting !== null && input.now - task.aborting > ABORT_MS)\n out.push({\n id: `abort-${task.id}`,\n title: `Stop is still waiting for ${taskLabel(task)}`,\n detail: `${nameOf(task.agentId)} asked it to stop ${age(input.now - task.aborting)} ago.`,\n severity: 'warn',\n });\n return out;\n}\n\nfunction crowdAlerts(processes: readonly MonitorProcess[], nameOf: Names): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const [pgid, members] of groups(processes))\n if (members.length > GROUP_MAX)\n out.push({\n id: `runaway-${pgid}`,\n title: `${nameOf((members[0] as MonitorProcess).agentId)} has ${members.length} processes`,\n detail: 'Something in it may be starting processes in a loop.',\n command: `kill -- -${pgid}`,\n commandLabel: 'To stop them, run',\n severity: crowdSeverity(members),\n });\n if (processes.length > TOTAL_MAX)\n out.push({\n id: 'runaway-total',\n title: `The kernel has ${processes.length} processes`,\n detail: 'Something may be starting processes in a loop.',\n severity: processes.length > TOTAL_MAX * 2 ? 'error' : 'warn',\n });\n return out;\n}\n\nfunction processAlerts(input: MonitorInput, feed: MonitorFeed, nameOf: Names): AgentMonitorAlert[] {\n const processes = feed.processes ?? [];\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const out = [...crowdAlerts(processes, nameOf), ...cpuAlerts(input, processes, nameOf)];\n for (const process of processes) {\n if (zombied(process, input.now))\n out.push({\n id: `zombie-${process.pid}`,\n title: `Process ${process.pid} is a zombie`,\n detail: `Its parent ${process.ppid} hasn't reaped it.`,\n ...(process.ppid > 1\n ? { command: `kill ${process.ppid}`, commandLabel: 'To clear it, stop the parent' }\n : {}),\n severity: 'warn',\n });\n if (stale(process, agents, input.now))\n out.push({\n id: `stale-${process.pid}`,\n title: `${process.command || `Process ${process.pid}`} has run for ${age(input.now - process.started)}`,\n detail: `${nameOf(process.agentId)} started it in the background.`,\n command: `kill ${process.pid}`,\n commandLabel: 'To stop it, run',\n severity: staleSeverity(process, input.now),\n });\n }\n return out;\n}\n\nfunction contextAlerts(input: MonitorInput, feed: MonitorFeed): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const agent of feed.agents) {\n const ratio = agentContext(agent, input.models);\n if (ratio !== null && ratio >= CONTEXT_WARN)\n out.push({\n id: `context-${agent.id}`,\n title: `${agent.name} is ${Math.round(ratio * 100)}% full`,\n detail: 'Compact it soon to keep replies fast.',\n severity: 'warn',\n });\n }\n if (feed.paused)\n out.push({\n id: 'scheduler',\n title: \"The agent isn't scheduling work\",\n detail: 'Its scheduler is paused.',\n severity: 'warn',\n });\n return out;\n}\n\nfunction alerts(input: MonitorInput, feed: MonitorFeed): AgentMonitorAlert[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const nameOf: Names = (id) => (id ? (agents.get(id)?.name ?? id) : 'the session');\n return [\n ...budgetAlerts(input.budget),\n ...agentAlerts(input, feed),\n ...taskAlerts(input, feed, nameOf),\n ...processAlerts(input, feed, nameOf),\n ...contextAlerts(input, feed),\n ];\n}\n\nconst BLOCKED: Record<NonNullable<MonitorTask['blocked']>, string> = {\n missing_task: 'blocked: no definition',\n task_too_old: 'blocked: definition too old',\n migration_failed: 'blocked: migration failed',\n restart_limit: 'blocked: restart limit',\n};\n\nfunction taskRow(\n task: MonitorTask,\n depth: number,\n nameOf: (id: string | null) => string,\n now: number\n): MonitorRow {\n const aborting = task.aborting !== null && now - task.aborting > ABORT_ROW_MS;\n const status: MonitorStatus =\n aborting || task.blocked\n ? 'warn'\n : task.status === 'running' || task.status === 'completing'\n ? 'active'\n : 'idle';\n const badges = [\n ...(task.background ? ['background'] : []),\n ...(task.aborting !== null ? ['aborting'] : []),\n ...(task.waits ? [`waits on ${task.waits}`] : []),\n ...(typeof task.until === 'number' ? [`sleeps ${age(task.until - now)}`] : []),\n ...(task.blocked ? [BLOCKED[task.blocked]] : []),\n ];\n return {\n id: task.id,\n name: taskLabel(task),\n depth: Math.min(depth, DEPTH_MAX),\n meta: [nameOf(task.agentId), task.phase, age(now - task.since)].filter(Boolean).join(' \u00B7 '),\n status,\n ...(badges.length ? { badges } : {}),\n };\n}\n\nfunction drivers(members: readonly MonitorProcess[]): MonitorProcess[] {\n const hot = members.filter((row) => (row.cpu ?? 0) >= CPU_SHARE);\n if (hot.length) return hot;\n const top = members.reduce((best, row) => ((row.cpu ?? 0) > (best.cpu ?? 0) ? row : best));\n return [top];\n}\n\nfunction processRows(input: MonitorInput, feed: MonitorFeed): MonitorRow[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const members = groups(feed.processes ?? []);\n const flagged = new Map<number, 'warn' | 'error'>();\n for (const group of busy(input, feed.processes ?? []))\n for (const row of drivers(members.get(group.pgid) as MonitorProcess[]))\n flagged.set(row.pid, cpuSeverity(group));\n return (feed.processes ?? []).map((process) => {\n const runaway = worse(\n worse(\n flagged.get(process.pid),\n stale(process, agents, input.now) ? staleSeverity(process, input.now) : undefined\n ),\n zombied(process, input.now) ? 'warn' : undefined\n );\n const badges = [\n ...(process.agentId ? [agents.get(process.agentId)?.name ?? process.agentId] : []),\n ...(process.tty ? ['terminal'] : []),\n ];\n return {\n id: String(process.pid),\n name: process.command || `[${process.pid}]`,\n meta: [\n `pid ${process.pid}`,\n process.user,\n typeof process.rss === 'number' ? bytes(process.rss) : null,\n cpuText(process.cpu),\n process.started ? age(input.now - process.started) : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 '),\n status: runaway ?? 'idle',\n ...(badges.length ? { badges } : {}),\n };\n });\n}\n\nconst PROBLEM_KINDS = {\n task: 'task failed',\n retry: 'retry',\n turn: 'turn failed',\n report: 'problem',\n} as const;\n\nconst REPORTED: Record<string, string> = {\n session_failed: 'session failed',\n task_faulted: 'task failed',\n task_parked: 'task parked',\n migration_failed: 'migration failed',\n task_outdated: 'task outdated',\n task_error: 'task error',\n extension_error: 'extension error',\n host_error: 'host error',\n listener_error: 'listener error',\n};\n\nconst SERIOUS = new Set(['session_failed', 'task_faulted', 'task_parked', 'migration_failed']);\n\nfunction problemName(problem: MonitorProblem): string {\n const report = problem.report;\n if (!report) return PROBLEM_KINDS[problem.kind];\n const label = REPORTED[report.type] ?? PROBLEM_KINDS[problem.kind];\n return report.source ? `${label} (${report.source})` : label;\n}\n\nfunction problemStatus(problem: MonitorProblem): MonitorStatus {\n if (problem.kind === 'retry') return 'warn';\n if (problem.kind === 'report' && !SERIOUS.has(problem.report?.type ?? '')) return 'warn';\n return 'error';\n}\n\nfunction sections(input: MonitorInput, feed: MonitorFeed): MonitorSection[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const nameOf = (id: string | null) => (id ? (agents.get(id)?.name ?? id) : 'session');\n return [\n {\n id: 'tasks',\n label: 'Tasks',\n rows: capped(\n taskTree(feed).map(({ task, depth }) => taskRow(task, depth, nameOf, input.now))\n ),\n },\n { id: 'processes', label: 'Processes', rows: capped(processRows(input, feed)) },\n {\n id: 'problems',\n label: 'Recent problems',\n rows: feed.problems.map((problem) => ({\n id: problem.id,\n name: `${nameOf(problem.agentId)} \u00B7 ${problemName(problem)}`,\n meta: problem.message,\n status: problemStatus(problem),\n })),\n },\n ];\n}\n\nfunction pageSections(input: MonitorInput): MonitorSection[] {\n return [\n {\n id: 'changes',\n label: 'Pending changes',\n rows: input.changes.map((change) => ({\n id: change.path,\n name: change.path,\n meta: change.status,\n status: 'warn',\n })),\n },\n ...input.extra,\n ];\n}\n\nexport function monitorSnapshot(input: MonitorInput): MonitorSnapshot {\n const budget = input.budget ? [budgetVital(input.budget, input.now)] : [];\n const feed = input.feed;\n if (!feed?.at)\n return {\n vitals: budget,\n alerts: [],\n sections: pageSections(input),\n updatedAt: input.now,\n };\n return {\n vitals: [...budget, ...vitals(input, feed)],\n alerts: alerts(input, feed),\n sections: [...sections(input, feed), ...pageSections(input)],\n updatedAt: feed.at,\n };\n}\n\nexport interface Intervals {\n every(run: () => void, ms: number): unknown;\n stop(handle: unknown): void;\n}\n\nexport const globalIntervals: Intervals = {\n every: (run, ms) => setInterval(run, ms),\n stop: (handle) => clearInterval(handle as ReturnType<typeof setInterval>),\n};\n\nexport interface MonitorAdapterOptions {\n extra?: () => readonly MonitorSection[];\n renewMs?: number;\n sampleMs?: number;\n intervals?: Intervals;\n now?: () => number;\n selected?: Selected;\n}\n\ninterface Open {\n lease: Promise<string | null>;\n timer: unknown;\n sampler: unknown;\n}\n\nexport class MonitorAdapter implements MonitorPort {\n readonly #connection: AgentConnection;\n readonly #emitter = new Emitter<MonitorEvents>();\n readonly #extra: () => readonly MonitorSection[];\n readonly #renewMs: number;\n readonly #sampleMs: number;\n readonly #intervals: Intervals;\n readonly #now: () => number;\n readonly #selected: Selected | undefined;\n #listeners = 0;\n #open: Open | undefined;\n #history: Sample[] = [];\n #hot = new Map<number, number>();\n #hotAt = -1;\n #cpu: number[] = [];\n #processes: number[] = [];\n #memory: number[] = [];\n\n constructor(connection: AgentConnection, options: MonitorAdapterOptions = {}) {\n this.#connection = connection;\n this.#extra = options.extra ?? (() => []);\n this.#renewMs = options.renewMs ?? RENEW_MS;\n this.#sampleMs = options.sampleMs ?? SAMPLE_MS;\n this.#intervals = options.intervals ?? globalIntervals;\n this.#now = options.now ?? Date.now;\n this.#selected = options.selected;\n let provider = options.selected?.provider();\n options.selected?.onChange(() => {\n const next = options.selected?.provider();\n if (next === provider) return;\n provider = next;\n if (this.#listeners) this.#emitter.emit('snapshot', this.snapshot());\n });\n connection.monitor?.subscribe(() => this.#update());\n connection.settings.state.subscribe(() => this.#update());\n connection.changes?.subscribe(() => this.#update());\n }\n\n on<K extends keyof MonitorEvents>(\n type: K,\n listener: (detail: MonitorEvents[K]) => void\n ): () => void {\n const off = this.#emitter.on(type, listener);\n this.#listeners++;\n if (this.#listeners === 1) this.#start();\n let done = false;\n return () => {\n if (done) return;\n done = true;\n off();\n this.#listeners--;\n if (!this.#listeners) this.#stop();\n };\n }\n\n snapshot(): MonitorSnapshot {\n const settings = this.#connection.settings.state.value;\n return monitorSnapshot({\n feed: this.#connection.monitor?.value,\n budget: selectedBudget(settings, this.#selected?.provider()),\n models: settings?.models ?? [],\n changes: this.#connection.changes?.value?.changes ?? [],\n extra: this.#extra(),\n history: this.#history,\n now: this.#now(),\n hot: this.#hot,\n cpu: this.#cpu,\n processes: this.#processes,\n memory: this.#memory,\n });\n }\n\n resync(): void {\n const open = this.#open;\n const control = this.#connection.control;\n if (open)\n void open.lease\n .then((lease) => (lease ? control.monitorOpen(lease, true, BACKGROUND_CONTEXT) : undefined))\n .catch(() => undefined);\n this.#emitter.emit('snapshot', this.snapshot());\n }\n\n #start(): void {\n const control = this.#connection.control;\n this.#history = [];\n this.#hot = new Map();\n this.#hotAt = -1;\n this.#cpu = [];\n this.#processes = [];\n this.#memory = [];\n void control.changesOpen(BACKGROUND_CONTEXT).catch(() => undefined);\n const lease = control.monitorOpen(null, true, BACKGROUND_CONTEXT).then(\n (opened) => opened.lease || null,\n () => null\n );\n const renew = () =>\n void lease\n .then((held) => (held ? control.monitorOpen(held, false, BACKGROUND_CONTEXT) : undefined))\n .catch(() => undefined);\n this.#open = {\n lease,\n timer: this.#intervals.every(renew, this.#renewMs),\n sampler: this.#intervals.every(() => this.#poll(), this.#sampleMs),\n };\n }\n\n #stop(): void {\n const open = this.#open;\n if (!open) return;\n this.#open = undefined;\n this.#intervals.stop(open.timer);\n this.#intervals.stop(open.sampler);\n const control = this.#connection.control;\n void open.lease\n .then((held) => (held ? control.monitorClose(held, BACKGROUND_CONTEXT) : undefined))\n .catch(() => undefined);\n }\n\n #sample(): void {\n const feed = this.#connection.monitor?.value;\n if (!feed?.open || !feed.usage || this.#history.at(-1)?.at === feed.at) return;\n record(\n this.#history,\n {\n at: feed.at,\n cost: feed.usage.cost,\n tokens: feed.usage.tokens,\n active: feed.agents.filter((agent) => agent.running).length,\n },\n HISTORY\n );\n }\n\n #track(): void {\n const feed = this.#connection.monitor?.value;\n if (!feed?.open || feed.at === this.#hotAt) return;\n this.#hotAt = feed.at;\n this.#hot = hotGroups(feed.processes ?? [], feed.at, this.#hot);\n const share = agentsCpu(feed);\n if (share !== null) record(this.#cpu, share, CPU_HISTORY);\n }\n\n #poll(): void {\n const feed = this.#connection.monitor?.value;\n if (!feed?.open || !feed.processes) return;\n record(this.#processes, feed.processes.length, CPU_HISTORY);\n const memory = memoryTotal(feed.processes);\n if (memory !== null) record(this.#memory, memory, CPU_HISTORY);\n this.#emitter.emit('snapshot', this.snapshot());\n }\n\n #update(): void {\n if (!this.#listeners) return;\n this.#sample();\n this.#track();\n this.#emitter.emit('snapshot', this.snapshot());\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n MonitorAlert,\n MonitorEvents,\n MonitorPort,\n MonitorRow,\n MonitorSection,\n MonitorSnapshot,\n MonitorStatus,\n MonitorVital,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AgentConnection } from '../client.ts';\nimport { contextRatio } from '../context.ts';\nimport type {\n BudgetState,\n ModelChoice,\n MonitorAgent,\n MonitorFeed,\n MonitorProblem,\n MonitorProcess,\n MonitorTask,\n} from '../services.ts';\nimport { budgetName, type Selected, selectedBudget } from './budget.ts';\nimport { Emitter } from './emitter.ts';\n\nexport const RENEW_MS = 10000;\nexport const SAMPLE_MS = 2000;\nexport const ROWS_MAX = 200;\nexport const HISTORY = 24;\nexport const CPU_HISTORY = 30;\nexport const CPU_QUIET = 0.01;\nexport const BUDGET_WARN = 80;\nexport const BUDGET_ERROR = 95;\nexport const RETRY_WARN = 3;\nexport const RETRY_ERROR = 6;\nexport const RETRY_SLOW_MS = 120000;\nexport const FAILED_MS = 600000;\nexport const ABORT_MS = 30000;\nexport const ABORT_ROW_MS = 10000;\nexport const GROUP_MAX = 32;\nexport const TOTAL_MAX = 128;\nexport const ZOMBIE_MS = 60000;\nexport const STALE_MS = 1800000;\nexport const CPU_SHARE = 0.9;\nexport const CPU_SUSTAIN_MS = 120000;\nexport const CONTEXT_WARN = 0.8;\nexport const DEPTH_MAX = 6;\nconst MINUTE = 60000;\nconst HOUR = 3600000;\nconst DAY = 86400000;\n\nexport type AgentMonitorAlert = MonitorAlert & { command?: string; commandLabel?: string };\n\nexport interface Sample {\n at: number;\n cost: number;\n tokens: number;\n active: number;\n}\n\nexport interface MonitorInput {\n feed: MonitorFeed | undefined;\n budget: BudgetState | null | undefined;\n models: readonly ModelChoice[];\n changes: readonly { path: string; status: string }[];\n sprinkles?: readonly { name: string; title: string }[];\n extra: readonly MonitorSection[];\n history: readonly Sample[];\n now: number;\n hot?: ReadonlyMap<number, number>;\n cpu?: readonly number[];\n processes?: readonly number[];\n memory?: readonly number[];\n}\n\nexport function record<T>(list: T[], value: T, max: number): void {\n list.push(value);\n if (list.length > max) list.shift();\n}\n\nfunction trend(series: readonly number[] | undefined): { series?: number[] } {\n return series && series.length > 1 ? { series: [...series] } : {};\n}\n\nconst KINDS: Record<string, string> = {\n 'pi.generation': 'generating',\n 'pi.compaction': 'compacting',\n 'slicc.scoop-wait': 'agent wait',\n 'slicc.scoop-reporter': 'report',\n 'slicc.memory-extract': 'memory extraction',\n};\n\nexport function age(ms: number): string {\n const seconds = Math.max(0, Math.round(ms / 1000));\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n return `${Math.floor(seconds / 3600)}h`;\n}\n\nexport function money(value: number): string {\n if (value > 0 && value < 0.01) return '<$0.01';\n return `$${value.toFixed(2)}`;\n}\n\nexport function count(value: number): string {\n if (value < 1000) return String(value);\n if (value < 1000000) return `${(value / 1000).toFixed(1)}k`;\n return `${(value / 1000000).toFixed(1)}M`;\n}\n\nexport function bytes(value: number): string {\n if (value < 1024) return `${value} B`;\n const units = ['KiB', 'MiB', 'GiB', 'TiB'];\n let size = value / 1024;\n let unit = 0;\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024;\n unit++;\n }\n return `${size.toFixed(size < 10 ? 1 : 0)} ${units[unit]}`;\n}\n\nexport function cpuText(share: number | null | undefined): string | null {\n if (typeof share !== 'number' || share < CPU_QUIET) return null;\n return `${Math.round(share * 100)}%\\u00a0CPU`;\n}\n\nexport function agentsCpu(feed: MonitorFeed): number | null {\n const shares = feed.agents\n .map((agent) => agent.cpu)\n .filter((share): share is number => typeof share === 'number');\n return shares.length ? shares.reduce((sum, share) => sum + share, 0) : null;\n}\n\nfunction cpuVital(feed: MonitorFeed, history: readonly number[]): MonitorVital[] {\n const share = agentsCpu(feed);\n if (share === null) return [];\n return [\n {\n id: 'cpu',\n label: 'CPU',\n value: `${Math.round(share * 100)}%`,\n unit: 'of one core',\n ...trend(history.map((value) => Math.round(value * 100))),\n },\n ];\n}\n\nfunction measuredOf(processes: readonly MonitorProcess[]): MonitorProcess[] {\n return processes.filter((row) => typeof row.rss === 'number');\n}\n\nexport function memoryTotal(processes: readonly MonitorProcess[]): number | null {\n const measured = measuredOf(processes);\n return measured.length ? measured.reduce((sum, row) => sum + (row.rss as number), 0) : null;\n}\n\nfunction memoryVital(\n processes: readonly MonitorProcess[],\n history: readonly number[] | undefined\n): MonitorVital[] {\n const total = memoryTotal(processes);\n if (total === null) return [];\n const measured = measuredOf(processes);\n const agents = measured\n .filter((row) => row.agentId)\n .reduce((sum, row) => sum + (row.rss as number), 0);\n return [\n {\n id: 'memory',\n label: 'Process memory',\n value: bytes(total),\n unit: `${bytes(agents)} by agents`,\n ...trend(history),\n },\n ];\n}\n\nexport function taskLabel(task: MonitorTask): string {\n if (task.kind === 'pi.tool') return task.detail ? `tool ${task.detail}` : 'tool';\n if (task.kind === 'slicc.scoop-anchor') return task.detail ? `scoop ${task.detail}` : 'scoop';\n return KINDS[task.kind] ?? task.kind;\n}\n\nfunction coneOf(agents: ReadonlyMap<string, MonitorAgent>, id: string | null): string | null {\n const visited = new Set<string>();\n let current = id === null ? undefined : agents.get(id);\n while (current?.parentId && !visited.has(current.id)) {\n visited.add(current.id);\n const parent = agents.get(current.parentId);\n if (!parent) break;\n current = parent;\n }\n return current ? current.id : null;\n}\n\nfunction ordered(feed: MonitorFeed): MonitorAgent[] {\n const byId = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const out: MonitorAgent[] = [];\n for (const cone of feed.agents.filter((agent) => agent.kind === 'cone')) {\n out.push(cone);\n for (const agent of feed.agents)\n if (agent.kind === 'scoop' && coneOf(byId, agent.id) === cone.id) out.push(agent);\n }\n for (const agent of feed.agents) if (!out.includes(agent)) out.push(agent);\n return out;\n}\n\nexport function taskTree(feed: MonitorFeed): { task: MonitorTask; depth: number }[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const order = ordered(feed).map((agent) => agent.id);\n const rank = (task: MonitorTask) => {\n const at = task.agentId === null ? -1 : order.indexOf(task.agentId);\n return at < 0 ? order.length : at;\n };\n const groupOf = (task: MonitorTask) => coneOf(agents, task.agentId) ?? '';\n const byId = new Map(feed.tasks.map((task) => [task.id, task]));\n const children = new Map<string, MonitorTask[]>();\n const roots: MonitorTask[] = [];\n for (const task of feed.tasks) {\n const owner = task.owner === null ? undefined : byId.get(task.owner);\n if (owner && groupOf(owner) === groupOf(task)) {\n const list = children.get(owner.id) ?? [];\n list.push(task);\n children.set(owner.id, list);\n } else roots.push(task);\n }\n const sort = (list: MonitorTask[]) =>\n list.sort((a, b) => rank(a) - rank(b) || Number(a.id) - Number(b.id));\n const out: { task: MonitorTask; depth: number }[] = [];\n const visit = (task: MonitorTask, depth: number) => {\n out.push({ task, depth });\n for (const child of sort(children.get(task.id) ?? [])) visit(child, depth + 1);\n };\n for (const root of sort(roots)) visit(root, 0);\n return out;\n}\n\nfunction capped(rows: MonitorRow[]): MonitorRow[] {\n if (rows.length <= ROWS_MAX) return rows;\n const shown = rows.slice(0, ROWS_MAX - 1);\n return [\n ...shown,\n { id: 'more', name: `+${rows.length - shown.length} more`, meta: '', status: 'idle' },\n ];\n}\n\nfunction agentContext(agent: MonitorAgent, models: readonly ModelChoice[]): number | null {\n return contextRatio(agent.context, agent.model, models);\n}\n\nfunction rate(history: readonly Sample[], pick: (sample: Sample) => number): number | null {\n const first = history[0];\n const last = history.at(-1);\n if (!first || !last || last.at - first.at < MINUTE) return null;\n return ((pick(last) - pick(first)) / (last.at - first.at)) * HOUR;\n}\n\nconst RELATIVE = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });\n\nfunction resetsIn(at: number, now: number): string {\n const ms = at - now;\n if (ms <= 0) return 'resets soon';\n if (ms >= DAY)\n return `resets ${RELATIVE.format(Math.floor(at / DAY) - Math.floor(now / DAY), 'day')}`;\n if (ms >= HOUR) return `resets ${RELATIVE.format(Math.floor(ms / HOUR), 'hour')}`;\n return `resets ${RELATIVE.format(Math.ceil(ms / MINUTE), 'minute')}`;\n}\n\nfunction budgetVital(budget: BudgetState, now: number): MonitorVital {\n const resets = new Date(budget.resets);\n return {\n id: 'budget',\n provider: budget.provider,\n window: budget.window,\n label: `Budget (${budget.window})`,\n value: `${budget.percent}%`,\n ...(Number.isNaN(resets.getTime())\n ? {}\n : {\n unit: resetsIn(resets.getTime(), now),\n hint: `resets ${resets.toISOString().slice(0, 16).replace('T', ' ')} UTC`,\n }),\n ratio: Math.min(1, Math.max(0, budget.percent / 100)),\n };\n}\n\nfunction vitals(input: MonitorInput, feed: MonitorFeed): MonitorVital[] {\n const out: MonitorVital[] = [];\n if (feed.usage) {\n const free = feed.usage.free;\n const pick = (sample: Sample) => (free ? sample.tokens : sample.cost);\n const perHour = rate(input.history, pick);\n const series = input.history.map(pick);\n out.push({\n id: 'spend',\n label: free ? 'Tokens' : 'Spend',\n value: free ? count(feed.usage.tokens) : money(feed.usage.cost),\n unit: free ? 'tokens' : `${count(feed.usage.tokens)} tokens`,\n ...(perHour === null ? {} : { delta: `${free ? count(perHour) : money(perHour)}/h` }),\n ...trend(series),\n });\n }\n const active = feed.agents.filter((agent) => agent.running).length;\n out.push({\n id: 'agents',\n label: 'Active agents',\n value: String(active),\n unit: `of ${feed.agents.length}`,\n ...trend(input.history.map((sample) => sample.active)),\n });\n const tools = feed.tasks.filter(\n (task) => task.kind === 'pi.tool' && task.status === 'running'\n ).length;\n out.push({\n id: 'tasks',\n label: 'Running',\n value: String(tools),\n unit: `${tools === 1 ? 'tool' : 'tools'} \u00B7 ${feed.tasks.length} ${feed.tasks.length === 1 ? 'task' : 'tasks'}`,\n });\n out.push(\n feed.processes\n ? {\n id: 'processes',\n label: 'Processes',\n value: String(feed.processes.length),\n unit: `${feed.processes.filter((row) => row.agentId).length} by agents`,\n ...trend(input.processes),\n }\n : feed.kernel === 'checking'\n ? { id: 'processes', label: 'Processes', value: '\u2026', unit: 'checking' }\n : { id: 'processes', label: 'Processes', value: '\u2014', unit: 'kernel not reachable' }\n );\n out.push(...memoryVital(feed.processes ?? [], input.memory));\n out.push(...cpuVital(feed, input.cpu ?? []));\n const ratios = feed.agents\n .map((agent) => agentContext(agent, input.models))\n .filter((ratio): ratio is number => ratio !== null);\n if (ratios.length) {\n const fullest = Math.max(...ratios);\n out.push({\n id: 'context',\n label: 'Fullest context',\n value: `${Math.round(fullest * 100)}%`,\n ratio: fullest,\n });\n }\n return out;\n}\n\nfunction stale(process: MonitorProcess, agents: ReadonlyMap<string, MonitorAgent>, now: number) {\n if (!process.agentId || process.state === 'Z' || !process.started) return false;\n if (typeof process.utime === 'number') return false;\n if (agents.get(process.agentId)?.tool === 'bash') return false;\n return now - process.started > STALE_MS;\n}\n\nfunction zombied(process: MonitorProcess, now: number): boolean {\n return process.zombie !== null && now - process.zombie > ZOMBIE_MS;\n}\n\nfunction groups(processes: readonly MonitorProcess[]): Map<number, MonitorProcess[]> {\n const out = new Map<number, MonitorProcess[]>();\n for (const process of processes) {\n if (!process.agentId) continue;\n const list = out.get(process.pgid) ?? [];\n list.push(process);\n out.set(process.pgid, list);\n }\n return out;\n}\n\ntype Names = (id: string | null) => string;\n\nexport function groupCpu(\n processes: readonly MonitorProcess[]\n): Map<number, { agentId: string; share: number }> {\n const out = new Map<number, { agentId: string; share: number }>();\n for (const [pgid, members] of groups(processes)) {\n const measured = members.filter((row) => typeof row.cpu === 'number');\n if (!measured.length) continue;\n const share = measured.reduce((sum, row) => sum + (row.cpu as number), 0);\n out.set(pgid, { agentId: (members[0] as MonitorProcess).agentId as string, share });\n }\n return out;\n}\n\nexport function hotGroups(\n processes: readonly MonitorProcess[],\n at: number,\n previous: ReadonlyMap<number, number>\n): Map<number, number> {\n const out = new Map<number, number>();\n for (const [pgid, { share }] of groupCpu(processes))\n if (share >= CPU_SHARE) out.set(pgid, previous.get(pgid) ?? at);\n return out;\n}\n\nfunction busy(input: MonitorInput, processes: readonly MonitorProcess[]) {\n const shares = groupCpu(processes);\n const out: { pgid: number; agentId: string; share: number; held: number }[] = [];\n for (const [pgid, since] of input.hot ?? []) {\n const group = shares.get(pgid);\n const held = input.now - since;\n if (group && group.share >= CPU_SHARE && held >= CPU_SUSTAIN_MS)\n out.push({ pgid, ...group, held });\n }\n return out;\n}\n\nfunction cpuAlerts(input: MonitorInput, processes: readonly MonitorProcess[], nameOf: Names) {\n return busy(input, processes).map(\n (group): AgentMonitorAlert => ({\n id: `runaway-cpu-${group.pgid}`,\n title: `${nameOf(group.agentId)} is using a lot of CPU`,\n detail: `${Math.round(group.share * 100)}% of one core for ${Math.floor(group.held / MINUTE)} minutes.`,\n command: `kill -- -${group.pgid}`,\n commandLabel: 'To stop it, run',\n severity: cpuSeverity(group),\n })\n );\n}\n\nfunction cpuSeverity(group: { share: number; held: number }): 'warn' | 'error' {\n return group.share >= CPU_SHARE * 2 || group.held >= CPU_SUSTAIN_MS * 2 ? 'error' : 'warn';\n}\n\nfunction crowdSeverity(members: readonly MonitorProcess[]): 'warn' | 'error' {\n return members.length > GROUP_MAX * 2 ? 'error' : 'warn';\n}\n\nfunction staleSeverity(process: MonitorProcess, now: number): 'warn' | 'error' {\n return now - process.started > STALE_MS * 2 ? 'error' : 'warn';\n}\n\nfunction worse(\n a: 'warn' | 'error' | undefined,\n b: 'warn' | 'error' | undefined\n): 'warn' | 'error' | undefined {\n return a === 'error' || b === 'error' ? 'error' : (a ?? b);\n}\n\nfunction resetLine(budget: BudgetState): string {\n const resets = new Date(budget.resets);\n return Number.isNaN(resets.getTime())\n ? `The ${budget.window} budget is nearly used up.`\n : `Resets ${resets.toISOString().slice(0, 16).replace('T', ' ')} UTC.`;\n}\n\nfunction budgetAlerts(budget: BudgetState | null | undefined): AgentMonitorAlert[] {\n if (!budget || budget.percent < BUDGET_WARN) return [];\n return [\n {\n id: 'budget',\n title: `${budgetName(budget.provider)} budget ${budget.percent}% used`,\n detail: resetLine(budget),\n severity: budget.percent >= BUDGET_ERROR ? 'error' : 'warn',\n },\n ];\n}\n\nfunction agentAlerts(input: MonitorInput, feed: MonitorFeed): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const agent of feed.agents) {\n const retry = agent.retry;\n if (retry && (retry.attempt >= RETRY_WARN || input.now - retry.since > RETRY_SLOW_MS))\n out.push({\n id: `retry-${agent.id}`,\n title: `${agent.name} is retrying (attempt ${retry.attempt})`,\n detail: retry.error,\n severity: retry.attempt >= RETRY_ERROR ? 'error' : 'warn',\n });\n if (agent.failed && !agent.running)\n out.push({\n id: `turn-${agent.id}`,\n title: `${agent.name}'s last turn failed`,\n detail: agent.failed,\n severity: 'error',\n });\n }\n return out;\n}\n\nfunction taskAlerts(input: MonitorInput, feed: MonitorFeed, nameOf: Names): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const problem of feed.problems)\n if (problem.kind === 'task' && input.now - problem.at < FAILED_MS)\n out.push({\n id: `failed-${problem.id}`,\n title: `A task of ${nameOf(problem.agentId)} failed`,\n detail: problem.message,\n severity: 'error',\n });\n else if (\n problem.kind === 'report' &&\n SERIOUS.has(problem.report?.type ?? '') &&\n input.now - problem.at < FAILED_MS\n )\n out.push({\n id: `reported-${problem.id}`,\n title: `${nameOf(problem.agentId)}: ${problemName(problem)}`,\n detail: problem.message,\n severity: 'error',\n });\n for (const task of feed.tasks)\n if (task.blocked === 'restart_limit')\n out.push({\n id: `parked-${task.id}`,\n title: `${taskLabel(task)} of ${nameOf(task.agentId)} is parked`,\n detail:\n 'It was cut off by 5 restarts in a row without getting further, so it no longer starts by itself.',\n severity: 'error',\n command: `agent retry ${task.id}`,\n commandLabel: 'To run it again, run',\n });\n for (const task of feed.tasks)\n if (task.aborting !== null && input.now - task.aborting > ABORT_MS)\n out.push({\n id: `abort-${task.id}`,\n title: `Stop is still waiting for ${taskLabel(task)}`,\n detail: `${nameOf(task.agentId)} asked it to stop ${age(input.now - task.aborting)} ago.`,\n severity: 'warn',\n });\n return out;\n}\n\nfunction crowdAlerts(processes: readonly MonitorProcess[], nameOf: Names): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const [pgid, members] of groups(processes))\n if (members.length > GROUP_MAX)\n out.push({\n id: `runaway-${pgid}`,\n title: `${nameOf((members[0] as MonitorProcess).agentId)} has ${members.length} processes`,\n detail: 'Something in it may be starting processes in a loop.',\n command: `kill -- -${pgid}`,\n commandLabel: 'To stop them, run',\n severity: crowdSeverity(members),\n });\n if (processes.length > TOTAL_MAX)\n out.push({\n id: 'runaway-total',\n title: `The kernel has ${processes.length} processes`,\n detail: 'Something may be starting processes in a loop.',\n severity: processes.length > TOTAL_MAX * 2 ? 'error' : 'warn',\n });\n return out;\n}\n\nfunction processAlerts(input: MonitorInput, feed: MonitorFeed, nameOf: Names): AgentMonitorAlert[] {\n const processes = feed.processes ?? [];\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const out = [...crowdAlerts(processes, nameOf), ...cpuAlerts(input, processes, nameOf)];\n for (const process of processes) {\n if (zombied(process, input.now))\n out.push({\n id: `zombie-${process.pid}`,\n title: `Process ${process.pid} is a zombie`,\n detail: `Its parent ${process.ppid} hasn't reaped it.`,\n ...(process.ppid > 1\n ? { command: `kill ${process.ppid}`, commandLabel: 'To clear it, stop the parent' }\n : {}),\n severity: 'warn',\n });\n if (stale(process, agents, input.now))\n out.push({\n id: `stale-${process.pid}`,\n title: `${process.command || `Process ${process.pid}`} has run for ${age(input.now - process.started)}`,\n detail: `${nameOf(process.agentId)} started it in the background.`,\n command: `kill ${process.pid}`,\n commandLabel: 'To stop it, run',\n severity: staleSeverity(process, input.now),\n });\n }\n return out;\n}\n\nfunction contextAlerts(input: MonitorInput, feed: MonitorFeed): AgentMonitorAlert[] {\n const out: AgentMonitorAlert[] = [];\n for (const agent of feed.agents) {\n const ratio = agentContext(agent, input.models);\n if (ratio !== null && ratio >= CONTEXT_WARN)\n out.push({\n id: `context-${agent.id}`,\n title: `${agent.name} is ${Math.round(ratio * 100)}% full`,\n detail: 'Compact it soon to keep replies fast.',\n severity: 'warn',\n });\n }\n if (feed.paused)\n out.push({\n id: 'scheduler',\n title: \"The agent isn't scheduling work\",\n detail: 'Its scheduler is paused.',\n severity: 'warn',\n });\n return out;\n}\n\nfunction alerts(input: MonitorInput, feed: MonitorFeed): AgentMonitorAlert[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const nameOf: Names = (id) => (id ? (agents.get(id)?.name ?? id) : 'the session');\n return [\n ...budgetAlerts(input.budget),\n ...agentAlerts(input, feed),\n ...taskAlerts(input, feed, nameOf),\n ...processAlerts(input, feed, nameOf),\n ...contextAlerts(input, feed),\n ];\n}\n\nconst BLOCKED: Record<NonNullable<MonitorTask['blocked']>, string> = {\n missing_task: 'blocked: no definition',\n task_too_old: 'blocked: definition too old',\n migration_failed: 'blocked: migration failed',\n restart_limit: 'blocked: restart limit',\n};\n\nfunction taskRow(\n task: MonitorTask,\n depth: number,\n nameOf: (id: string | null) => string,\n now: number\n): MonitorRow {\n const aborting = task.aborting !== null && now - task.aborting > ABORT_ROW_MS;\n const status: MonitorStatus =\n aborting || task.blocked\n ? 'warn'\n : task.status === 'running' || task.status === 'completing'\n ? 'active'\n : 'idle';\n const badges = [\n ...(task.background ? ['background'] : []),\n ...(task.aborting !== null ? ['aborting'] : []),\n ...(task.waits ? [`waits on ${task.waits}`] : []),\n ...(typeof task.until === 'number' ? [`sleeps ${age(task.until - now)}`] : []),\n ...(task.blocked ? [BLOCKED[task.blocked]] : []),\n ];\n return {\n id: task.id,\n name: taskLabel(task),\n depth: Math.min(depth, DEPTH_MAX),\n meta: [nameOf(task.agentId), task.phase, age(now - task.since)].filter(Boolean).join(' \u00B7 '),\n status,\n ...(badges.length ? { badges } : {}),\n };\n}\n\nfunction drivers(members: readonly MonitorProcess[]): MonitorProcess[] {\n const hot = members.filter((row) => (row.cpu ?? 0) >= CPU_SHARE);\n if (hot.length) return hot;\n const top = members.reduce((best, row) => ((row.cpu ?? 0) > (best.cpu ?? 0) ? row : best));\n return [top];\n}\n\nfunction processRows(input: MonitorInput, feed: MonitorFeed): MonitorRow[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const members = groups(feed.processes ?? []);\n const flagged = new Map<number, 'warn' | 'error'>();\n for (const group of busy(input, feed.processes ?? []))\n for (const row of drivers(members.get(group.pgid) as MonitorProcess[]))\n flagged.set(row.pid, cpuSeverity(group));\n return (feed.processes ?? []).map((process) => {\n const runaway = worse(\n worse(\n flagged.get(process.pid),\n stale(process, agents, input.now) ? staleSeverity(process, input.now) : undefined\n ),\n zombied(process, input.now) ? 'warn' : undefined\n );\n const badges = [\n ...(process.agentId ? [agents.get(process.agentId)?.name ?? process.agentId] : []),\n ...(process.tty ? ['terminal'] : []),\n ];\n return {\n id: String(process.pid),\n name: process.command || `[${process.pid}]`,\n meta: [\n `pid ${process.pid}`,\n process.user,\n typeof process.rss === 'number' ? bytes(process.rss) : null,\n cpuText(process.cpu),\n process.started ? age(input.now - process.started) : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 '),\n status: runaway ?? 'idle',\n ...(badges.length ? { badges } : {}),\n };\n });\n}\n\nconst PROBLEM_KINDS = {\n task: 'task failed',\n retry: 'retry',\n turn: 'turn failed',\n report: 'problem',\n} as const;\n\nconst REPORTED: Record<string, string> = {\n session_failed: 'session failed',\n task_faulted: 'task failed',\n task_parked: 'task parked',\n migration_failed: 'migration failed',\n task_outdated: 'task outdated',\n task_error: 'task error',\n extension_error: 'extension error',\n host_error: 'host error',\n listener_error: 'listener error',\n};\n\nconst SERIOUS = new Set(['session_failed', 'task_faulted', 'task_parked', 'migration_failed']);\n\nfunction problemName(problem: MonitorProblem): string {\n const report = problem.report;\n if (!report) return PROBLEM_KINDS[problem.kind];\n const label = REPORTED[report.type] ?? PROBLEM_KINDS[problem.kind];\n return report.source ? `${label} (${report.source})` : label;\n}\n\nfunction problemStatus(problem: MonitorProblem): MonitorStatus {\n if (problem.kind === 'retry') return 'warn';\n if (problem.kind === 'report' && !SERIOUS.has(problem.report?.type ?? '')) return 'warn';\n return 'error';\n}\n\nfunction sections(input: MonitorInput, feed: MonitorFeed): MonitorSection[] {\n const agents = new Map(feed.agents.map((agent) => [agent.id, agent]));\n const nameOf = (id: string | null) => (id ? (agents.get(id)?.name ?? id) : 'session');\n return [\n {\n id: 'tasks',\n label: 'Tasks',\n rows: capped(\n taskTree(feed).map(({ task, depth }) => taskRow(task, depth, nameOf, input.now))\n ),\n },\n { id: 'processes', label: 'Processes', rows: capped(processRows(input, feed)) },\n {\n id: 'problems',\n label: 'Recent problems',\n rows: feed.problems.map((problem) => ({\n id: problem.id,\n name: `${nameOf(problem.agentId)} \u00B7 ${problemName(problem)}`,\n meta: problem.message,\n status: problemStatus(problem),\n })),\n },\n ];\n}\n\nfunction pageSections(input: MonitorInput): MonitorSection[] {\n return [\n {\n id: 'changes',\n label: 'Pending changes',\n rows: input.changes.map((change) => ({\n id: change.path,\n name: change.path,\n meta: change.status,\n status: 'warn',\n })),\n },\n ...input.extra,\n ];\n}\n\nexport function monitorSnapshot(input: MonitorInput): MonitorSnapshot {\n const budget = input.budget ? [budgetVital(input.budget, input.now)] : [];\n const feed = input.feed;\n if (!feed?.at)\n return {\n vitals: budget,\n alerts: [],\n sections: pageSections(input),\n updatedAt: input.now,\n };\n return {\n vitals: [...budget, ...vitals(input, feed)],\n alerts: alerts(input, feed),\n sections: [...sections(input, feed), ...pageSections(input)],\n updatedAt: feed.at,\n };\n}\n\nexport interface Intervals {\n every(run: () => void, ms: number): unknown;\n stop(handle: unknown): void;\n}\n\nexport const globalIntervals: Intervals = {\n every: (run, ms) => setInterval(run, ms),\n stop: (handle) => clearInterval(handle as ReturnType<typeof setInterval>),\n};\n\nexport interface MonitorAdapterOptions {\n extra?: () => readonly MonitorSection[];\n renewMs?: number;\n sampleMs?: number;\n intervals?: Intervals;\n now?: () => number;\n selected?: Selected;\n}\n\ninterface Open {\n lease: Promise<string | null>;\n timer: unknown;\n sampler: unknown;\n}\n\nexport class MonitorAdapter implements MonitorPort {\n readonly #connection: AgentConnection;\n readonly #emitter = new Emitter<MonitorEvents>();\n readonly #extra: () => readonly MonitorSection[];\n readonly #renewMs: number;\n readonly #sampleMs: number;\n readonly #intervals: Intervals;\n readonly #now: () => number;\n readonly #selected: Selected | undefined;\n #listeners = 0;\n #open: Open | undefined;\n #history: Sample[] = [];\n #hot = new Map<number, number>();\n #hotAt = -1;\n #cpu: number[] = [];\n #processes: number[] = [];\n #memory: number[] = [];\n\n constructor(connection: AgentConnection, options: MonitorAdapterOptions = {}) {\n this.#connection = connection;\n this.#extra = options.extra ?? (() => []);\n this.#renewMs = options.renewMs ?? RENEW_MS;\n this.#sampleMs = options.sampleMs ?? SAMPLE_MS;\n this.#intervals = options.intervals ?? globalIntervals;\n this.#now = options.now ?? Date.now;\n this.#selected = options.selected;\n let provider = options.selected?.provider();\n options.selected?.onChange(() => {\n const next = options.selected?.provider();\n if (next === provider) return;\n provider = next;\n if (this.#listeners) this.#emitter.emit('snapshot', this.snapshot());\n });\n connection.monitor?.subscribe(() => this.#update());\n connection.settings.state.subscribe(() => this.#update());\n connection.changes?.subscribe(() => this.#update());\n }\n\n on<K extends keyof MonitorEvents>(\n type: K,\n listener: (detail: MonitorEvents[K]) => void\n ): () => void {\n const off = this.#emitter.on(type, listener);\n this.#listeners++;\n if (this.#listeners === 1) this.#start();\n let done = false;\n return () => {\n if (done) return;\n done = true;\n off();\n this.#listeners--;\n if (!this.#listeners) this.#stop();\n };\n }\n\n snapshot(): MonitorSnapshot {\n const settings = this.#connection.settings.state.value;\n return monitorSnapshot({\n feed: this.#connection.monitor?.value,\n budget: selectedBudget(settings, this.#selected?.provider()),\n models: settings?.models ?? [],\n changes: this.#connection.changes?.value?.changes ?? [],\n extra: this.#extra(),\n history: this.#history,\n now: this.#now(),\n hot: this.#hot,\n cpu: this.#cpu,\n processes: this.#processes,\n memory: this.#memory,\n });\n }\n\n resync(): void {\n const open = this.#open;\n const control = this.#connection.control;\n if (open)\n void open.lease\n .then((lease) => (lease ? control.monitorOpen(lease, true, BACKGROUND_CONTEXT) : undefined))\n .catch(() => undefined);\n this.#emitter.emit('snapshot', this.snapshot());\n }\n\n #start(): void {\n const control = this.#connection.control;\n this.#history = [];\n this.#hot = new Map();\n this.#hotAt = -1;\n this.#cpu = [];\n this.#processes = [];\n this.#memory = [];\n void control.changesOpen(BACKGROUND_CONTEXT).catch(() => undefined);\n const lease = control.monitorOpen(null, true, BACKGROUND_CONTEXT).then(\n (opened) => opened.lease || null,\n () => null\n );\n const renew = () =>\n void lease\n .then((held) => (held ? control.monitorOpen(held, false, BACKGROUND_CONTEXT) : undefined))\n .catch(() => undefined);\n this.#open = {\n lease,\n timer: this.#intervals.every(renew, this.#renewMs),\n sampler: this.#intervals.every(() => this.#poll(), this.#sampleMs),\n };\n }\n\n #stop(): void {\n const open = this.#open;\n if (!open) return;\n this.#open = undefined;\n this.#intervals.stop(open.timer);\n this.#intervals.stop(open.sampler);\n const control = this.#connection.control;\n void open.lease\n .then((held) => (held ? control.monitorClose(held, BACKGROUND_CONTEXT) : undefined))\n .catch(() => undefined);\n }\n\n #sample(): void {\n const feed = this.#connection.monitor?.value;\n if (!feed?.open || !feed.usage || this.#history.at(-1)?.at === feed.at) return;\n record(\n this.#history,\n {\n at: feed.at,\n cost: feed.usage.cost,\n tokens: feed.usage.tokens,\n active: feed.agents.filter((agent) => agent.running).length,\n },\n HISTORY\n );\n }\n\n #track(): void {\n const feed = this.#connection.monitor?.value;\n if (!feed?.open || feed.at === this.#hotAt) return;\n this.#hotAt = feed.at;\n this.#hot = hotGroups(feed.processes ?? [], feed.at, this.#hot);\n const share = agentsCpu(feed);\n if (share !== null) record(this.#cpu, share, CPU_HISTORY);\n }\n\n #poll(): void {\n const feed = this.#connection.monitor?.value;\n if (!feed?.open || !feed.processes) return;\n record(this.#processes, feed.processes.length, CPU_HISTORY);\n const memory = memoryTotal(feed.processes);\n if (memory !== null) record(this.#memory, memory, CPU_HISTORY);\n this.#emitter.emit('snapshot', this.snapshot());\n }\n\n #update(): void {\n if (!this.#listeners) return;\n this.#sample();\n this.#track();\n this.#emitter.emit('snapshot', this.snapshot());\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -15,7 +15,7 @@ export declare const DEFAULT_WAIT_S = 30;
15
15
  export declare const MAX_DEPTH = 3;
16
16
  export declare const RUN_DIR = "/var/lib/slicc/agent/scoops";
17
17
  export declare const THINKING: Set<string>;
18
- export declare 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";
18
+ export declare 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 retry <task id> run a task parked after 5 restarts again\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";
19
19
  export interface CliOptions {
20
20
  env: ExecutionEnv;
21
21
  harness: Harness;
@@ -0,0 +1,7 @@
1
+ import type { Context } from '@earendil-works/chord';
2
+ import type { Harness } from '@earendil-works/pi-durable';
3
+ export interface RetryAnswer {
4
+ code: number;
5
+ out: string;
6
+ }
7
+ export declare function retryParked(harness: Pick<Harness, 'inspect' | 'retryTask'>, id: string | undefined, fromAgent: boolean, context: Context): Promise<RetryAnswer>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-agent",
3
- "version": "7.2.0",
3
+ "version": "7.3.0",
4
4
  "description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",