@mu-crew/mu 4.1.1 → 4.2.1
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/dist/{chunk-L7I3BLXP.js → chunk-4ZWBLTZK.js} +1512 -411
- package/dist/chunk-4ZWBLTZK.js.map +1 -0
- package/dist/{chunk-DEYBQDTO.js → chunk-FVRIKUBR.js} +2 -2
- package/dist/{chunk-B74N2EAS.js → chunk-RJQNDFBU.js} +8 -4
- package/dist/chunk-RJQNDFBU.js.map +1 -0
- package/dist/{chunk-LBBZAG5C.js → chunk-U2QLTREB.js} +26 -23
- package/dist/chunk-U2QLTREB.js.map +1 -0
- package/dist/{cli-H2PWJAJN.js → cli-H3VVCP7M.js} +146 -31
- package/dist/cli-H3VVCP7M.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/{errors-G5IVXSMY.js → errors-MDQZHB42.js} +8 -2
- package/dist/extension/mu-pi.js +20 -3
- package/dist/extension/mu-pi.js.map +1 -1
- package/dist/index.d.ts +2574 -2288
- package/dist/index.js +58 -4
- package/dist/index.js.map +1 -1
- package/dist/{tui-EN2CDP6G.js → tui-5ZARE7RS.js} +14 -15
- package/dist/tui-5ZARE7RS.js.map +1 -0
- package/docs/ARCHITECTURE.md +15 -8
- package/docs/VOCABULARY.md +14 -6
- package/docs/guide/remote.md +113 -4
- package/docs/guide/sql.md +1 -1
- package/docs/reference/env.md +1 -0
- package/package.json +1 -1
- package/skills/mu/recipes/remote-workers.md +7 -6
- package/dist/chunk-B74N2EAS.js.map +0 -1
- package/dist/chunk-L7I3BLXP.js.map +0 -1
- package/dist/chunk-LBBZAG5C.js.map +0 -1
- package/dist/cli-H2PWJAJN.js.map +0 -1
- package/dist/tui-EN2CDP6G.js.map +0 -1
- /package/dist/{chunk-DEYBQDTO.js.map → chunk-FVRIKUBR.js.map} +0 -0
- /package/dist/{errors-G5IVXSMY.js.map → errors-MDQZHB42.js.map} +0 -0
package/dist/cli-H2PWJAJN.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../node_modules/commander/lib/error.js","../node_modules/commander/lib/argument.js","../node_modules/commander/lib/command.js","../node_modules/commander/lib/help.js","../node_modules/commander/lib/option.js","../node_modules/commander/lib/suggestSimilar.js","../node_modules/commander/index.js","../src/cli/agents.ts","../src/edit-distance.ts","../src/cli/handle.ts","../src/cli/agent-close.ts","../src/cli/agent-collect.ts","../src/cli/stdin.ts","../src/cli/wait-output.ts","../src/cli/wait.ts","../src/cli/wait-arm.ts","../src/cli/me-identity.ts","../src/cli/state.ts","../src/cli/format.ts","../src/cli/tasks/edit.ts","../src/cli/tasks/queries.ts","../src/cli/tasks/auto.ts","../src/cli/tasks/claim.ts","../src/cli/tasks/edges.ts","../src/cli/tasks/lifecycle.ts","../src/cli/tasks/tree.ts","../src/cli/tasks/wire.ts","../src/cli/dashboard-shutdown.ts","../src/cli/dashboard-launch.ts","../src/cli/db.ts","../src/disk-recon.ts","../src/cli/db-query.ts","../src/delegate-process.ts","../src/delegate-prune.ts","../src/workstream-scope.ts","../src/cli/delegates.ts","../src/cli/doctor.ts","../src/doctor-summary.ts","../src/dormant.ts","../src/cli/host.ts","../src/cli/human-needed.ts","../src/cli/log.ts","../src/cli/next.ts","../src/cli/pi.ts","../src/cli/rebuild.ts","../src/cli/sync.ts","../src/cli/workstream.ts"],"sourcesContent":["// mu — command-line interface.\n//\n// One namespace/command per verb group (see `mu --help` for the current\n// list), each registered via commander as a thin wrapper around the\n// corresponding programmatic function in src/. The real work happens in\n// agents.ts, tasks.ts, db.ts, mux.ts; this file is just\n// argument parsing, output formatting, and error-to-exit-code\n// translation.\n//\n// Layout: cli.ts is the wiring root. Pure rendering helpers live in\n// `src/cli/format.ts`; typed-error → exit-code mapping + the `handle`\n// wrapper live in `src/cli/handle.ts`. cli.ts re-exports their public\n// surface so existing tests + cli/* importers don't need to change\n// import paths. The exit-code catalogue is documented at the top of\n// `src/cli/handle.ts`.\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command, InvalidArgumentError } from \"commander\";\n\nimport { AgentNotInWorkstreamError, type AgentRow, getAgent, getAgentByPane } from \"./agents.js\";\nimport { wireAgentCommands, wireSelfCommands } from \"./cli/agents.js\";\nimport { openDashboardOrHelp } from \"./cli/dashboard-launch.js\";\nimport { wireDbCommands } from \"./cli/db.js\";\nimport { wireDbQueryCommand } from \"./cli/db-query.js\";\nimport { wireDelegatesCommands } from \"./cli/delegates.js\";\nimport { wireDoctorCommand } from \"./cli/doctor.js\";\nimport {\n emitParseError,\n finalNext,\n findCommandForArgv,\n fitNext,\n NameAmbiguousError,\n setNextScope,\n UsageError,\n} from \"./cli/handle.js\";\nimport { wireHostCommands } from \"./cli/host.js\";\nimport { wireHumanNeededCommand } from \"./cli/human-needed.js\";\nimport { wireLogCommand } from \"./cli/log.js\";\nimport { wireNextCommand } from \"./cli/next.js\";\nimport { wirePiCommand } from \"./cli/pi.js\";\nimport { wireRebuildCommand } from \"./cli/rebuild.js\";\nimport { wireStateCommands } from \"./cli/state.js\";\nimport { wireSyncCommand } from \"./cli/sync.js\";\nimport { wireTaskCommands } from \"./cli/tasks.js\";\nimport { wireWaitCommand } from \"./cli/wait.js\";\nimport { wireWorkstreamCommands } from \"./cli/workstream.js\";\nimport { type Db, tryResolveLiveWorkstreamId, WorkstreamNotFoundError } from \"./db.js\";\nimport { editDistance } from \"./edit-distance.js\";\nimport { encodeEnvelope, okEnvelope, safeJsonLine } from \"./output-contract.js\";\nimport { isTaskSortKey, TASK_SORT_KEYS, type TaskSortKey } from \"./tasks/sort.js\";\nimport { TASK_SUBSTATES, type TaskSubstate } from \"./tasks/status.js\";\nimport {\n isTaskStatus,\n TASK_STATUS_LIST,\n TaskNotInWorkstreamError,\n type TaskStatus,\n} from \"./tasks.js\";\nimport {\n isScratchWorkstream,\n isValidWorkstreamName,\n resolveMuxSessionWorkstreamName,\n} from \"./workstream.js\";\nimport {\n parseWorkstreamFragments,\n qualifiedRefProblem,\n workstreamNameProblem,\n} from \"./workstream-scope.js\";\n\n// ─── Re-exports for downstream cli/* modules ──────────────────────────\n//\n// Pure rendering helpers and the typed-error catalogue live in\n// `src/cli/format.ts` and `src/cli/handle.ts`; cli/* modules import\n// them through `cli.ts` for ergonomic single-import lines.\n\nexport {\n colorPair,\n formatAgentsTable,\n IDLE_GLYPH,\n relTime,\n statusIcon,\n truncate,\n truncateFront,\n} from \"./cli/format.js\";\nexport {\n CliExitError,\n classifyError,\n handle,\n NameAmbiguousError,\n UsageError,\n} from \"./cli/handle.js\";\nexport {\n byRoiDesc,\n isTaskSortKey,\n relTimeBasisForSort,\n sortTasks,\n TASK_SORT_KEYS,\n type TaskSortKey,\n} from \"./tasks/sort.js\";\n\n// ─── Workstream resolution ─────────────────────────────────────────────\n\n/**\n * The workstream a mu-spawned worker was injected with, or undefined.\n * Spawn sets `MU_MANAGED_AGENT=1` and `MU_WORKSTREAM` together; the gate\n * keeps a stale `$MU_WORKSTREAM` in a user shell from routing anything.\n */\nexport function injectedWorkstream(): string | undefined {\n if (process.env.MU_MANAGED_AGENT !== \"1\") return undefined;\n const ws = process.env.MU_WORKSTREAM;\n if (ws === undefined || ws === \"\") return undefined;\n return checkWorkstreamName(ws, \"$MU_WORKSTREAM\");\n}\n\n/** The managed worker this process runs as (spawn-injected), or undefined. */\nexport function injectedIdentity(): { name: string; workstream: string } | undefined {\n const workstream = injectedWorkstream();\n const name = process.env.MU_AGENT_NAME;\n if (workstream === undefined || name === undefined || name === \"\") return undefined;\n return { name, workstream };\n}\n\n/**\n * Validate ONE workstream name from `-w`: exactly what the caller typed,\n * or a UsageError. Empty, blank or padded values are rejected rather than\n * trimmed, because trimming turns a quoting accident into a different,\n * valid workstream (`-w ' auth'` would read `auth`).\n */\nexport function checkWorkstreamName(value: string, flag = \"-w/--workstream\"): string {\n const problem = workstreamNameProblem(value, flag);\n if (problem !== undefined) throw new UsageError(problem, { showHelp: false });\n return value;\n}\n\n/**\n * Parse repeated / comma-separated `-w` values into names. Like\n * parseCsvFlag, a structurally empty fragment (`\"a,\"`) is a comma\n * artifact and is dropped; unlike it, a fragment is never trimmed:\n * padded or blank ones, and a lone empty value, are usage errors.\n */\nexport function parseWorkstreamList(values: readonly string[], flag = \"-w/--workstream\"): string[] {\n const parsed = parseWorkstreamFragments(values, flag);\n if (\"problem\" in parsed) throw new UsageError(parsed.problem, { showHelp: false });\n return parsed.names;\n}\n\n/**\n * The one-line \"no scope\" error. The session name is only a SUGGESTION,\n * read best-effort here on the error path; nothing ever routes by it.\n * `extra` carries verb-specific hints (a candidate qualified ref, `--all`).\n */\nexport async function missingWorkstreamError(\n opts: { extra?: string; orAll?: boolean } = {},\n): Promise<UsageError> {\n const parts: string[] = [];\n const session = await resolveMuxSessionWorkstreamName();\n if (session !== null) parts.push(`tmux session mu-${session}: -w ${session}`);\n if (opts.extra !== undefined) parts.push(opts.extra);\n const tail = parts.length > 0 ? ` (${parts.join(\", \")})` : \"\";\n return new UsageError(`no workstream: pass -w <name>${opts.orAll ? \" or --all\" : \"\"}${tail}`, {\n showHelp: false,\n });\n}\n\n/**\n * Resolve the workstream a verb acts on. Scope is explicit or injected:\n * 1. `-w <name>` (validated, never trimmed)\n * 2. the injected `$MU_WORKSTREAM` of a managed worker (`MU_MANAGED_AGENT=1`)\n * Anything else is a one-line UsageError. `$MU_SESSION` and the mux\n * session name never route a verb: a silent misroute is worse than a\n * cheap error.\n */\nexport async function resolveWorkstream(explicit?: string): Promise<string> {\n const ws = explicit !== undefined ? checkWorkstreamName(explicit) : injectedWorkstream();\n if (ws === undefined) throw await missingWorkstreamError();\n setNextScope(ws);\n return ws;\n}\n\n/** The live workstreams whose name is near `name`, closest first (at most three). */\nfunction nearWorkstreams(db: Db, name: string): string[] {\n const rows = db.prepare(\"SELECT name FROM workstreams WHERE torn_down_at IS NULL\").all() as {\n name: string;\n }[];\n return rows\n .map((r) => ({ name: r.name, d: editDistance(r.name, name) }))\n .filter((r) => r.d <= Math.max(2, Math.floor(name.length / 3)) || r.name.includes(name))\n .sort((a, b) => a.d - b.d || a.name.localeCompare(b.name))\n .slice(0, 3)\n .map((r) => r.name);\n}\n\n/** Throw `WorkstreamNotFoundError` (exit 3) unless the workstream `name` is live; the reserved\n * `scratch` always passes (its first `task add` / `agent spawn` creates it). The one existence\n * check of every verb that reads or writes inside a workstream. A torn-down name throws\n * `WorkstreamTornDownError`. */\nexport function requireLiveWorkstream(db: Db, name: string): void {\n if (isScratchWorkstream(name) || tryResolveLiveWorkstreamId(db, name) !== null) return;\n throw new WorkstreamNotFoundError(name, {\n near: nearWorkstreams(db, name),\n init: isValidWorkstreamName(name),\n });\n}\n\n/** `resolveWorkstream`, then the existence check: a typo'd `-w` is exit 3, never an empty\n * success or a silently created workstream. */\nexport async function resolveExistingWorkstream(db: Db, explicit?: string): Promise<string> {\n const ws = await resolveWorkstream(explicit);\n requireLiveWorkstream(db, ws);\n return ws;\n}\n\n// ─── Qualified entity refs (cross-workstream verb args) ────────────────\n//\n// Every verb that takes an entity name (mu task show <id>, mu agent\n// send <name>, mu agent close <agent>) accepts EITHER:\n// - bare `<name>` → resolves via current workstream context\n// - qualified `<ws>/<name>` → resolves directly, no -w needed\n// Implemented as a parse-at-CLI-entry helper so the SDK signatures\n// stay workstream-explicit (no entity ref shape leaks below cli.ts).\n\nexport interface ParsedRef {\n /** Workstream prefix when the input was `<ws>/<name>`; undefined for\n * bare names. */\n workstream?: string;\n /** The bare name (everything after the first '/' if qualified, else\n * the whole input). */\n name: string;\n}\n\n/** Split `<ws>/<name>` on the FIRST '/'. Bare input → workstream=undefined.\n * Names today are restricted to [a-z0-9_-] (slugify / agent name validator)\n * so '/' is unambiguous: no entity name can contain it. */\nexport function parseQualifiedRef(raw: string): ParsedRef {\n const slash = raw.indexOf(\"/\");\n if (slash === -1) return { name: raw };\n return { workstream: raw.slice(0, slash), name: raw.slice(slash + 1) };\n}\n\n/** The `<ws>` of a qualified ref goes through the same validator as `-w`:\n * ` own/t` or `/t` is an error, never trimmed into `own`. */\nexport function checkQualifiedPrefix(raw: string, workstream: string): string {\n const problem = qualifiedRefProblem(raw) ?? workstreamNameProblem(workstream);\n if (problem !== undefined) throw new UsageError(problem, { showHelp: false });\n return workstream;\n}\n\n/** Sync glue: parse a qualified ref and (if qualified) push the\n * workstream onto opts.workstream. Throws UsageError when the caller\n * passed BOTH `--workstream A` AND `B/<name>` and they disagree.\n * Returns the bare name for downstream use. Mutates opts. */\nexport function applyQualifiedRef(raw: string, opts: { workstream?: string }): string {\n const parsed = parseQualifiedRef(raw);\n if (opts.workstream !== undefined) checkWorkstreamName(opts.workstream);\n if (parsed.workstream === undefined) return raw;\n checkQualifiedPrefix(raw, parsed.workstream);\n if (opts.workstream !== undefined && opts.workstream !== parsed.workstream) {\n throw new UsageError(\n `qualified ref ${JSON.stringify(raw)} (workstream=${JSON.stringify(parsed.workstream)}) conflicts with --workstream ${JSON.stringify(opts.workstream)}`,\n { showHelp: false },\n );\n }\n opts.workstream = parsed.workstream;\n return parsed.name;\n}\n\n/** Per-entity table+key+error mapping for findEntityWorkstreams /\n * resolveEntityRef. Centralised so adding a new entity is one row. */\nconst ENTITY_TABLES = {\n task: { table: \"tasks\", keyCol: \"local_id\" },\n agent: { table: \"agents\", keyCol: \"name\" },\n} as const;\n\nexport type EntityKind = keyof typeof ENTITY_TABLES;\n\n/** List the workstream names where `entity` exists. Used for ambiguity\n * detection when the bare-name caller has no resolved -w context. */\nexport function findEntityWorkstreams(db: Db, kind: EntityKind, name: string): string[] {\n const { table, keyCol } = ENTITY_TABLES[kind];\n const rows = db\n .prepare(\n `SELECT ws.name AS workstream FROM ${table} t\n JOIN workstreams ws ON ws.id = t.workstream_id\n WHERE t.${keyCol} = ?\n ORDER BY ws.name`,\n )\n .all(name) as { workstream: string }[];\n return rows.map((r) => r.workstream);\n}\n\n/**\n * One-stop ref resolver for verbs taking an entity name + optional -w.\n *\n * Pipeline:\n * 1. Parse `<ws>/<name>` (qualified form) — sets opts.workstream\n * from the prefix and returns the bare name.\n * 2. Resolve the workstream: -w, else the injected worker scope\n * (the ladder in resolveWorkstream). An invalid -w is an error,\n * never a reason to guess.\n * 3. When no scope exists and the bare name lives in ≥2 workstreams:\n * throw NameAmbiguousError listing the candidates. Otherwise throw\n * the one-line missing-scope error, naming the qualified ref when\n * exactly one workstream has the name. Nothing is routed by a guess.\n *\n * Returns `{ name, workstream }`. The verb then uses `name` for the\n * entity lookup and `workstream` for downstream SDK calls; opts.workstream\n * is mutated to match (so existing helpers like assertTaskInWorkstream\n * still work as the second-line check).\n */\nexport async function resolveEntityRef(\n db: Db,\n raw: string,\n opts: { workstream?: string },\n kind: EntityKind,\n): Promise<{ name: string; workstream: string }> {\n const name = applyQualifiedRef(raw, opts);\n if (opts.workstream !== undefined || injectedWorkstream() !== undefined) {\n return { name, workstream: await resolveExistingWorkstream(db, opts.workstream) };\n }\n const matches = findEntityWorkstreams(db, kind, name);\n if (matches.length >= 2) throw new NameAmbiguousError(name, matches, kind);\n const only = matches[0];\n throw await missingWorkstreamError(only !== undefined ? { extra: `${only}/${name}?` } : {});\n}\n\n/** Standard --status validation: case-insensitive, returns the\n * canonical TaskStatus or throws UsageError naming every legal\n * value. Centralised so adding a status updates every CLI surface\n * at once (the OPEN | IN_PROGRESS | CLOSED list used to drift\n * across `mu task list --status`, `mu task wait --status`, the\n * --help text, and error messages). Source list lives in\n * src/tasks.ts as TASK_STATUS_LIST. */\nexport function parseStatusOption(raw: string, flag = \"--status\"): TaskStatus {\n const upper = raw.toUpperCase();\n if (!isTaskStatus(upper)) {\n throw new UsageError(`${flag} must be one of ${TASK_STATUS_LIST} (got ${JSON.stringify(raw)})`);\n }\n return upper;\n}\n\n/** Multi-status flag parser for the `--status <s...>` shape used by\n * `mu task list / task next / approve list` (per\n * task_list_multi_status_union). Composes parseCsvFlag (repeat OR\n * comma-separated OR mix) with per-element parseStatusOption\n * validation, then dedups case-insensitively (parseStatusOption\n * upper-cases). Returns `undefined` when the flag is absent or\n * resolves to an empty array — semantically \"no filter\", matching\n * today's no-`--status` shape. Throws UsageError naming the offending\n * element on the first invalid value (so the operator sees which one\n * failed, not just \"some value was wrong\"). */\nexport function parseStatusesOption(\n values: readonly string[] | undefined,\n flag = \"--status\",\n): TaskStatus[] | undefined {\n const fragments = parseCsvFlag(values, flag);\n if (fragments.length === 0) return undefined;\n const seen = new Set<TaskStatus>();\n const out: TaskStatus[] = [];\n for (const raw of fragments) {\n const status = parseStatusOption(raw, flag);\n if (seen.has(status)) continue;\n seen.add(status);\n out.push(status);\n }\n return out;\n}\n\n/** Every substate across all statuses, in canonical order. */\nconst ALL_SUBSTATES: readonly TaskSubstate[] = [...new Set(Object.values(TASK_SUBSTATES).flat())];\n\n/** `--substate <s...>` parser: same repeat/comma shape as\n * parseStatusesOption, validated against every status's substates\n * (case-insensitive, deduped). undefined = no filter. */\nexport function parseSubstatesOption(\n values: readonly string[] | undefined,\n flag = \"--substate\",\n): TaskSubstate[] | undefined {\n const fragments = parseCsvFlag(values, flag);\n if (fragments.length === 0) return undefined;\n const out = new Set<TaskSubstate>();\n for (const raw of fragments) {\n const lower = raw.toLowerCase();\n const match = ALL_SUBSTATES.find((s) => s === lower);\n if (match === undefined) {\n throw new UsageError(\n `${flag} must be one of ${ALL_SUBSTATES.join(\" | \")} (got ${JSON.stringify(raw)})`,\n );\n }\n out.add(match);\n }\n return [...out];\n}\n\n// ─── Self-resolution (injected identity → AgentRow) ────────────────────\n\n/**\n * Resolve \"the agent running this process\". A mu-spawned worker carries\n * its identity in the env (`MU_AGENT_NAME` + `MU_WORKSTREAM`, injected at\n * spawn), and that is authoritative: the row is looked up by name in that\n * workstream, never guessed from a pane. A managed identity with no row\n * is an error. Only a process with no injected identity falls back to\n * `$TMUX_PANE` (a hand-registered agent, or an adopted pane). Returns null\n * when neither identifies a managed agent.\n */\nexport function resolveSelfOptional(db: Db): AgentRow | null {\n const injected = injectedIdentity();\n if (injected !== undefined) {\n const row = getAgent(db, injected.name, injected.workstream);\n if (row === undefined) {\n throw new UsageError(\n `injected identity ${injected.workstream}/${injected.name} has no agent row (closed or torn down). Use \\`mu agent list -w ${injected.workstream}\\`.`,\n { showHelp: false },\n );\n }\n return row;\n }\n const paneId = process.env.TMUX_PANE;\n if (!paneId) return null;\n return getAgentByPane(db, paneId) ?? null;\n}\n\n/**\n * Strict variant of `resolveSelfOptional`: throws UsageError when the\n * process is neither a managed worker nor in a managed pane. Used by\n * `mu me` / `mu me tasks` / `mu me next`. Lives in cli.ts so cli/agents.ts\n * and cli/tasks.ts can both import it without a lateral cli/* dependency.\n */\nexport function resolveSelf(db: Db): AgentRow {\n const agent = resolveSelfOptional(db);\n if (agent) return agent;\n const paneId = process.env.TMUX_PANE;\n throw new UsageError(\n paneId\n ? `pane ${paneId} is not a managed agent. Use \\`mu agent list\\` to see managed panes, or \\`mu agent spawn\\` to register a new one.`\n : \"not a managed agent: this verb needs the identity spawn injects (MU_AGENT_NAME, MU_WORKSTREAM) or a managed tmux pane\",\n { showHelp: false },\n );\n}\n\n// ─── Shared SDK-CLI bridge helpers (used by cli/*.ts) ──────────────\n//\n// These were extracted from inline-with-task-verbs in cli.ts; the\n// task verbs moved to src/cli/tasks.ts but the helpers stay here so\n// every cli/*.ts module can import them from one canonical location.\n\nexport function parseSortOption(raw: string, flag = \"--sort\"): TaskSortKey {\n if (!isTaskSortKey(raw)) {\n throw new UsageError(\n `${flag} must be one of ${TASK_SORT_KEYS.join(\" | \")} (got ${JSON.stringify(raw)})`,\n );\n }\n return raw;\n}\n\n// ─── Workstream-scope assertions ──────────────────────────────────────\n\n/**\n * Generic workstream-scope assertion. The two typed wrappers\n * (`assertAgentInWorkstream`, `assertTaskInWorkstream`) share this\n * shape: SELECT the `workstream` column from `<table>` WHERE\n * `<keyCol>` = key, and if the row exists with a non-matching\n * workstream throw a typed `*NotInWorkstreamError`. No-op when\n * `expectedWs` is undefined or the row doesn't exist (downstream\n * handlers raise the matching `*NotFoundError`).\n *\n * Doing the lookup directly via raw SQL (rather than through the\n * typed `getAgent` / `getTask`) keeps the helper decoupled from\n * each row's full schema — it only ever needs the one column. The\n * typed errors are constructed by `errFactory` so each caller keeps\n * its specific error class and exit-code mapping.\n */\nexport function assertEntityInWorkstream<E extends Error>(\n db: Db,\n table: string,\n keyCol: string,\n keyVal: string,\n expectedWs: string | undefined,\n errFactory: (keyVal: string, expectedWs: string, actualWs: string | null) => E,\n): void {\n if (!expectedWs) return;\n // v5: per-scope unique TEXT names mean a bare\n // `WHERE keyCol = ? LIMIT 1` could pick the wrong workstream's row\n // and falsely raise NotInWorkstreamError when the expected workstream\n // ALSO has a row of this name.\n // Fast path: if a row exists in the expected workstream, we're done.\n const inScope = db\n .prepare(\n `SELECT 1 AS hit FROM ${table} t\n JOIN workstreams ws ON ws.id = t.workstream_id\n WHERE t.${keyCol} = ? AND ws.name = ?\n LIMIT 1`,\n )\n .get(keyVal, expectedWs) as { hit: number } | undefined;\n if (inScope) return;\n // Slow path: name doesn't exist in expected ws — check whether it\n // exists anywhere else so we can raise the typed mismatch error\n // (rather than letting downstream raise the generic NotFoundError).\n // Pick any other workstream's row deterministically.\n const elsewhere = db\n .prepare(\n `SELECT ws.name AS workstream FROM ${table} t\n LEFT JOIN workstreams ws ON ws.id = t.workstream_id\n WHERE t.${keyCol} = ?\n ORDER BY ws.name\n LIMIT 1`,\n )\n .get(keyVal) as { workstream: string | null } | undefined;\n if (elsewhere) {\n throw errFactory(keyVal, expectedWs, elsewhere.workstream);\n }\n}\n\n/**\n * Sister of `assertTaskInWorkstream` for verbs that target an agent\n * by name. Agent names are per-workstream unique\n * (`UNIQUE(workstream_id, name)` in src/db.ts), so the same name can\n * exist in multiple workstreams; `-w` is the scope check that turns a\n * wrong-target verb into a clear `AgentNotInWorkstreamError` (exit 4)\n * instead of silently operating on a same-named agent in another\n * workstream. No-op when `workstream` is undefined or the agent\n * doesn't exist (downstream handler raises `AgentNotFoundError`).\n */\nexport function assertAgentInWorkstream(\n db: Db,\n agentName: string,\n workstream: string | undefined,\n): void {\n // agents.workstream is NOT NULL in the schema, so `actual` is\n // never null in practice; the `?? \"—\"` is defence-in-depth for the\n // typed-error contract (which expects a non-null actual).\n assertEntityInWorkstream(\n db,\n \"agents\",\n \"name\",\n agentName,\n workstream,\n (n, exp, actual) => new AgentNotInWorkstreamError(n, exp, actual ?? \"—\"),\n );\n}\n\n/**\n * Sister of `assertAgentInWorkstream` for verbs that target a single\n * task by ID. Task ids are unique per workstream, so a bare id under the\n * wrong `-w` is a different (or no) task: this raises a clear\n * `TaskNotInWorkstreamError` naming the real workstream. `resolveEntityRef`\n * has already validated and existence-checked `-w`. No-op when `workstream` is undefined or the task\n * doesn't exist (downstream handler raises `TaskNotFoundError`).\n */\nexport function assertTaskInWorkstream(\n db: Db,\n taskId: string,\n workstream: string | undefined,\n): void {\n // tasks.workstream is NOT NULL in the schema; see assertAgentInWorkstream.\n assertEntityInWorkstream(\n db,\n \"tasks\",\n \"local_id\",\n taskId,\n workstream,\n (id, exp, actual) => new TaskNotInWorkstreamError(id, exp, actual ?? \"—\"),\n );\n}\n\n// ─── Numeric arg parsers ─────────────────────────────────────────────\n//\n// All strict: the whole string must be the number. parseInt/parseFloat\n// kept a numeric prefix (\"5.9abc\" -> 5, \"2x\" -> 2) and parseFloat let\n// \"1e999\" through as Infinity, which JSON serialises as null.\n\nconst NON_NEGATIVE_INT_RE = /^\\s*\\d+\\s*$/;\n\nexport function parsePositiveNumber(value: string): number {\n const n = value.trim() === \"\" ? Number.NaN : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(`expected a positive number, got ${JSON.stringify(value)}`);\n }\n return n;\n}\n\n// Parses a duration in seconds for --timeout / --stuck-after: any\n// non-negative finite number, fractions included. Strict on purpose:\n// parseInt read \"0.5\" as 0 (wait forever) and \"10m\" as 10, so a\n// suffix or other trailing text is an error, not a prefix to keep.\nexport function parseSeconds(value: string): number {\n const n = value.trim() === \"\" ? Number.NaN : Number(value);\n if (!Number.isFinite(n) || n < 0) {\n throw new InvalidArgumentError(\n `expected a non-negative number of seconds, got ${JSON.stringify(value)}`,\n );\n }\n return n;\n}\n\nexport function parseImpact(value: string): number {\n const n = NON_NEGATIVE_INT_RE.test(value) ? Number(value) : Number.NaN;\n if (Number.isNaN(n) || n < 1 || n > 100) {\n throw new InvalidArgumentError(`expected 1..100, got ${JSON.stringify(value)}`);\n }\n return n;\n}\n\n// Parses a non-negative integer (0 is valid): line counts, --limit,\n// and --since, which uses 0 as the \"replay everything\" cursor.\nexport function parseNonNegativeInt(value: string): number {\n const n = NON_NEGATIVE_INT_RE.test(value) ? Number(value) : Number.NaN;\n if (!Number.isSafeInteger(n)) {\n throw new InvalidArgumentError(`expected a non-negative integer, got ${JSON.stringify(value)}`);\n }\n return n;\n}\n\n/** A whole number >= 1: run ceilings (`task auto --max`). */\nexport function parsePositiveInt(value: string): number {\n const n = NON_NEGATIVE_INT_RE.test(value) ? Number(value) : Number.NaN;\n if (!Number.isSafeInteger(n) || n < 1) {\n throw new InvalidArgumentError(`expected an integer >= 1, got ${JSON.stringify(value)}`);\n }\n return n;\n}\n\n/** Line counts (-n/--lines/--events): same rule as parseNonNegativeInt. */\nexport const parseLines = parseNonNegativeInt;\n\n// ─── Program definition ───────────────────────────────────────────────\n//\n// See the `wire*Commands` calls below for the full namespace/utility\n// list (`workstream`, `agent`, `task`, `log`, `state`,\n// `sql`, `sync`, `rebuild`, `db`, `doctor`, plus the bare `mu`\n// TTY-aware default) rather than a count here, which drifts.\n//\n// Every flag is declared on the subcommand that consumes it. The one\n// exception is the root `-w`: a preAction hook (forwardRootWorkstream)\n// writes it into the verb's own `-w`, so `mu -w ws <verb>` and\n// `mu --workstream=ws <verb>` scope exactly like `mu <verb> -w ws`.\n// Verbs therefore read `this.opts()` and still see a root `-w`; without\n// the hook, teardown and state silently fell back to $MU_SESSION. The\n// optsWithGlobals() verbs also see the root array and funnel it through\n// normalizeInheritedWorkstream.\n//\n// Bare `mu` takes only the root `-w` / `--json` flags and prints help.\n\n// Reusable workstream flag declaration. Each subcommand that needs it\n// gets its own copy via `.option(...WORKSTREAM_OPT)` so there is no\n// cross-command leakage.\nexport const WORKSTREAM_OPT = [\n \"-w, --workstream <name>\",\n \"workstream (required; a qualified <ws>/<name> ref carries its own; a spawned worker defaults to its own)\",\n] as const;\n\n// Reusable --json flag for every read verb. Output shape is documented\n// per-verb but follows a consistent pattern: collections → the\n// `{items, count}` envelope (emitJsonCollection), so an empty one prints\n// `{\"items\":[],\"count\":0}`; single entities → JSON objects (every\n// \"single\" verb errors on a miss rather than printing `null`). Pretty-printing is OFF; one\n// document per line so output is grep/jq friendly.\nexport const JSON_OPT = [\"--json\", \"emit machine-readable JSON instead of a table\"] as const;\n\n/**\n * Canonical multi-value-flag parser. Every commander variadic flag\n * (`--foo <vals...>`) in mu is post-processed through this helper so\n * the operator can use repeated-flag form, comma-separated form, or\n * any mix:\n *\n * --foo a --foo b --foo c → [\"a\", \"b\", \"c\"]\n * --foo a,b,c → [\"a\", \"b\", \"c\"]\n * --foo a,b --foo c → [\"a\", \"b\", \"c\"]\n *\n * Whitespace inside fragments is trimmed. Two kinds of \"empty\" get\n * DIFFERENT treatment, and the distinction is the whole point (see\n * docs/reference/naming.md § Empty and blank list fragments):\n *\n * EMPTY (`\"\"` before trimming) — DROPPED. This is either a\n * structural comma artifact (`\"a,b,\"`, `\"a,,b\"`) or the\n * deliberate clear-everything sentinel that\n * `mu task reparent --blocked-by ''` documents. Both are\n * things an operator means.\n * BLANK (non-empty before trimming, empty after — i.e. entirely\n * whitespace, `\" \"` / `\"\\t\"`) — a UsageError (exit 2). An\n * operator never means \"filter by the space character\";\n * it is a typo or a quoting accident, and silently dropping\n * it produced a silent wrong answer:\n * `--status \"OPEN, \"`\n * quietly widened to no-filter-at-all, and `--status \" \"`\n * returned every task as though no filter were given.\n *\n * Trim-then-drop-empty conflated the two. Deciding it HERE rather\n * than per-call-site is deliberate: a per-call-site answer is exactly\n * how the flag-vs-positional inconsistency arose.\n *\n * Idempotent: the helper is safe to apply twice (its output never\n * contains a blank fragment, so a second pass cannot throw).\n *\n * Convention codified by cli_audit_plurality_uniformity (v0.3). See\n * docs/guide/sql.md \"Pass list flags\".\n */\nexport function parseCsvFlag(\n values: readonly string[] | undefined,\n flag = \"a list flag\",\n): string[] {\n if (!values) return [];\n const out: string[] = [];\n for (const value of values) {\n for (const fragment of value.split(\",\")) {\n // Empty BEFORE trimming: comma artifact or clear-all sentinel.\n if (fragment.length === 0) continue;\n const trimmed = fragment.trim();\n // Non-empty before, empty after: entirely whitespace.\n if (trimmed.length === 0) {\n throw new UsageError(\n `${flag} got a blank (whitespace-only) value ${JSON.stringify(fragment)}. Remove it, or pass an empty string ('') if you meant \"none\".`,\n );\n }\n out.push(trimmed);\n }\n }\n return out;\n}\n\n/**\n * Normalize an `optsWithGlobals()` workstream value into a single name.\n *\n * Subcommands that call `optsWithGlobals()` inherit the ROOT\n * `-w, --workstream <names>` flag, which COLLECTS into an array — so a\n * root-position invocation like `mu -w foo task owned-by worker-1`\n * yields `[\"foo\"]` (an array), not `\"foo\"`. The subcommand's own\n * `WORKSTREAM_OPT` is single-value (`<name>`) and yields a string.\n * `optsWithGlobals()` can hand either shape to a single-workstream\n * verb, so callers MUST funnel the merged value through this helper:\n * it accepts string | string[] | undefined, reuses parseCsvFlag's\n * canonicalisation (repeat / comma / mixed forms), returns the single\n * name (or undefined when none was passed), and throws UsageError when\n * more than one workstream is supplied to a verb that scopes to one.\n *\n * Guards finding_optswithglobals_can_pass_root: without this, an array\n * leaks unchanged through resolveWorkstream into DB calls, producing\n * confusing substrate errors instead of the documented scoping.\n */\nexport function normalizeInheritedWorkstream(\n value: string | readonly string[] | undefined,\n): string | undefined {\n if (value === undefined) return undefined;\n const names = parseWorkstreamList(typeof value === \"string\" ? [value] : value);\n if (names.length === 0) return undefined;\n if (names.length > 1) {\n throw new UsageError(\n `-w/--workstream takes a single workstream here (got ${names.length}: ${names.join(\", \")})`,\n { showHelp: false },\n );\n }\n return names[0];\n}\n\n/** The one JSON document of a successful `--json` invocation: the payload in\n * a `{ok:true,data,next}` envelope (src/output-contract.ts), one line. `next`\n * is the one finalisation (`finalNext`, src/cli/handle.ts), fitted to what the\n * result budget leaves. An explicit success envelope passes through, never\n * `data.ok`. Exported so cli/*.ts modules share one formatter. */\nexport function emitJson(value: unknown): void {\n const env = okEnvelope(value);\n const base = encodeEnvelope(env);\n if (env.next !== null || value === env) {\n console.log(base);\n return;\n }\n console.log(encodeEnvelope({ ...env, next: fitNext(finalNext(), Buffer.byteLength(base)) }));\n}\n\n/** One raw JSON line, NOT enveloped: the NDJSON stream rows of `mu log --tail`\n * (a stream is not a document, and its rows keep the stored op shape). */\nexport function emitJsonRow(value: unknown): void {\n console.log(safeJsonLine(JSON.stringify(value)));\n}\n\n/** Wrap a collection in mu's canonical `{items, count}` payload (the `data` of the envelope).\n * Every collection-read verb (list,\n * next, owned-by, notes, search, orphans, commits, ...) emits this\n * shape so a future sibling field (`baseRef`, `totalAcrossPages`,\n * ...) can be added without breaking every caller. Pre-1.0\n * breaking versus the pre-audit bare-array shape.\n *\n * Carve-out: `mu sql` pages its rows as `{items, count, more, retrieve?}` (src/cli/db-query.ts;\n * row shape is per-query, not part of the typed contract).\n * `mu log --tail --json` keeps NDJSON (one object per line) since\n * it's a stream, not a collection. */\nexport function emitJsonCollection<T>(items: readonly T[]): void {\n emitJson({ items, count: items.length });\n}\n\n/**\n * Read the package version from the shipped package.json. Works for\n * both source mode (src/cli.ts → ../package.json) and bundled mode\n * (dist/cli.js → ../package.json), since both layouts have package.json\n * exactly one directory up. Avoids hand-bumping a string literal in\n * code on every release.\n */\nfunction readPackageVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n const pkgPath = join(here, \"..\", \"package.json\");\n const raw = readFileSync(pkgPath, \"utf8\");\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === \"string\" ? parsed.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"mu\")\n .description(\n \"Persistent crew of AI agents in tmux or herdr panes coordinated through a built-in task DAG.\",\n )\n .version(readPackageVersion())\n .helpOption(\"-h, --help\")\n // .showHelpAfterError() is not used:\n // emitError() in handle.ts now owns help-on-error emission for both\n // commander mistakes and handler-thrown UsageErrors. Without this\n // removal, commander would print its own \"\\n<help>\" appendix to\n // stderr before throwing CommanderError, leaving us with a duplicate\n // help dump (commander's then ours). We suppress commander's stderr\n // entirely in applyExitOverride below; this comment is the load-\n // bearing explanation of why we don't reach for showHelpAfterError().\n // Sort most Commands lists (NOT the Options list) alphabetically.\n // Commander v14 inherits configureHelp via copyInheritedSettings()\n // when subcommands are created with .command(), but we also walk the\n // tree below for certainty — future subcommand groups added via\n // .addCommand() do not inherit.\n .configureHelp({ sortSubcommands: true })\n // Without this, `mu task list --json` would bind --json to the\n // program (where we declare it for the bare `mu --json` help path)\n // instead of the `list` subcommand. With it,\n // options before a subcommand bind to the program; options after\n // bind to the subcommand. Subcommands inherit it automatically.\n .enablePositionalOptions()\n // Default action when no subcommand is given: print help (TTY or not).\n //\n // NOT variadic (`<names...>`): a variadic root flag swallowed the\n // verb too, so `mu -w ws task list` parsed as workstreams\n // [\"ws\",\"task\",\"list\"] and printed root help with exit 0.\n .option(\n \"-w, --workstream <names>\",\n \"workstream(s) to render (repeat or comma-separate; or both). Before a verb, it is that verb's -w\",\n (value: string, previous: string[] | undefined) => [...(previous ?? []), value],\n )\n .option(...JSON_OPT)\n .hook(\"preAction\", (root, leaf) => {\n forwardRootJson(root, leaf);\n forwardRootWorkstream(root, leaf);\n })\n .action(openDashboardOrHelp(program));\n\n wireWorkstreamCommands(program);\n wireAgentCommands(program);\n wireSelfCommands(program);\n wireTaskCommands(program);\n wireWaitCommand(program);\n wireNextCommand(program);\n wireLogCommand(program);\n wireStateCommands(program);\n wireSyncCommand(program);\n wireHostCommands(program);\n wireHumanNeededCommand(program);\n wireDelegatesCommands(program);\n wireRebuildCommand(program);\n wireDbCommands(program);\n wireDbQueryCommand(program);\n wireDoctorCommand(program);\n wirePiCommand(program);\n applyAlphabeticalHelpSort(program);\n // Every node in the command tree\n // must call exitOverride() so commander throws CommanderError\n // instead of calling process.exit() itself. Lets the parseAsync()\n // catch route every operator-error through emitError() with the\n // failing subcommand's --help (human) or `usage` JSON (--json).\n applyExitOverride(program);\n return program;\n}\n\n/** preAction hook: hand a root-position `--json` to the verb's own `--json`,\n * so `mu --json task list` prints the same envelope as `mu task list --json`.\n * Without it enablePositionalOptions binds the flag to the root and the\n * success path prints a human table (errors read argv, so they already\n * honoured it). Help and `--version` stay raw text: they are not verbs. */\nfunction forwardRootJson(root: Command, leaf: Command): void {\n if (leaf === root || root.opts().json !== true) return;\n if (leaf.options.some((o) => o.attributeName() === \"json\")) {\n leaf.setOptionValueWithSource(\"json\", true, \"cli\");\n }\n}\n\n/** preAction hook: hand a root-position `-w` to the verb's own `-w`, so\n * `mu -w ws task list` means `mu task list -w ws`. Fails loud (exit 2)\n * rather than silently ignoring the flag when the verb takes no `-w`,\n * or when `-w` is given on both sides of the verb. */\nfunction forwardRootWorkstream(root: Command, leaf: Command): void {\n if (leaf === root) return;\n const names = root.opts().workstream as string[] | undefined;\n if (names === undefined) return;\n // One line, no help dump: the message already names the fix.\n const usage = (message: string): never => {\n throw new UsageError(message, { showHelp: false });\n };\n const opt = leaf.options.find((o) => o.attributeName() === \"workstream\");\n if (opt === undefined) {\n usage(`\\`${leaf.name()}\\` takes no -w/--workstream; drop the root -w`);\n return;\n }\n if (leaf.getOptionValue(\"workstream\") !== undefined) {\n usage(\"-w/--workstream given both before and after the verb; pass it once\");\n return;\n }\n // optsWithGlobals() lets the root's value overwrite the leaf's, so the root\n // must end up holding exactly what the leaf holds: a string for a\n // single-workstream verb, never the root's raw array.\n const settle = (value: string | string[]): void => {\n leaf.setOptionValueWithSource(\"workstream\", value, \"cli\");\n root.setOptionValueWithSource(\"workstream\", value, \"cli\");\n };\n if (opt.variadic) {\n settle(names);\n return;\n }\n const parsed = parseWorkstreamList(names);\n if (parsed.length > 1) {\n usage(\n `-w/--workstream takes a single workstream here (got ${parsed.length}: ${parsed.join(\", \")})`,\n );\n return;\n }\n if (parsed[0] !== undefined) settle(parsed[0]);\n}\n\n// Recursively set sortSubcommands on every command in the tree. Belt\n// and braces over the root .configureHelp() call: guarantees the sort\n// holds regardless of how a subcommand was attached (.command() vs\n// .addCommand()) and regardless of inheritance behaviour across\n// commander versions. Preserves any other help-configuration keys\n// already set on a subcommand.\nfunction applyAlphabeticalHelpSort(cmd: Command): void {\n cmd.configureHelp({ ...cmd.configureHelp(), sortSubcommands: true });\n for (const sub of cmd.commands) {\n applyAlphabeticalHelpSort(sub);\n }\n}\n\n/** Recursively call exitOverride() on every command in the tree.\n * Without this, commander writes its error to stderr and calls\n * process.exit() inline — we never see the error and our emitError()\n * contract (--help on usage errors, --json envelopes, exit-2\n * uniformity) doesn't apply.\n *\n * We ALSO swallow commander's writeErr so commander never prints the\n * unformatted \"error: ...\" / help combo before our handler runs. The\n * captured text is discarded; emitError() re-emits message + help in\n * mu's format. Help displays via --help still flow through writeOut\n * (commander.helpDisplayed code, which classifyCommanderError maps to\n * exit 0 with no further output). */\nfunction applyExitOverride(cmd: Command): void {\n cmd.exitOverride();\n cmd.configureOutput({\n writeOut: (s) => process.stdout.write(s),\n writeErr: () => {\n // Swallow commander's pre-throw stderr; emitError re-emits.\n },\n });\n for (const sub of cmd.commands) {\n applyExitOverride(sub);\n }\n}\n\n// ─── Entry point ───────────────────────────────────────────────────────\n\n/** Bare verb-namespace invocations (`mu agent`, `mu task`, …)\n * used to print nothing and exit 0 because commander, given a parent\n * with subcommands and no .action(), produces an empty render. We\n * fix this BEFORE parseAsync rather than via .action() on each\n * namespace because attaching .action() makes commander treat\n * `mu task bogus` as a positional arg to `task` instead of routing\n * it to the \"unknown subcommand\" lane (which other tests + emitError\n * depend on). Surfaced by `bare_verb_namespaces_mu_workspace_task` (when `workspace` was a namespace).\n *\n * Triggers when:\n * - argv after the program name is exactly one token\n * - that token names a top-level subcommand of `mu`\n * - that subcommand itself has its own subcommands (i.e. it's a\n * namespace, not a leaf verb); `me` is the exception: bare, it runs\n * `state --me`\n * In that case we append `--help` so commander routes through its\n * help printer. Bare `mu` is unaffected because\n * the slice has length 0.\n */\nexport function injectBareNamespaceHelp(\n program: Command,\n argv: readonly string[],\n): readonly string[] {\n // argv is the full process.argv shape: [node, mu, ...userArgs].\n if (argv.length !== 3) return argv;\n const token = argv[2];\n if (token === undefined || token.startsWith(\"-\")) return argv;\n const sub = program.commands.find((c) => c.name() === token || c.aliases().includes(token));\n if (!sub) return argv;\n if (sub.commands.length === 0) return argv;\n // `mu me` has subcommands AND its own action (`state --me`): bare, it runs.\n if (sub.name() === \"me\") return argv;\n return [...argv, \"--help\"];\n}\n\n/** Parse and run one `mu` invocation. Called by the bin bootstrap\n * (src/main.ts) after it enables the compile cache; tests use\n * buildProgram() directly. */\nexport async function runCli(rawArgv: readonly string[]): Promise<void> {\n const program = buildProgram();\n const argv = injectBareNamespaceHelp(program, rawArgv);\n try {\n await program.parseAsync(argv);\n } catch (err) {\n // CommanderError (parse-time) lands here because every command in\n // the tree had .exitOverride() applied. Locate the deepest matching\n // subcommand from argv so emitError can render its --help (human)\n // or `usage` JSON (--json).\n const failingCmd = findCommandForArgv(program, argv.slice(2));\n const exitCode = emitParseError(err, failingCmd);\n process.exit(exitCode);\n }\n}\n","/**\n * CommanderError class\n */\nexport class CommanderError extends Error {\n /**\n * Constructs the CommanderError class\n * @param {number} exitCode suggested exit code which could be used with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n */\n constructor(exitCode, code, message) {\n super(message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n this.code = code;\n this.exitCode = exitCode;\n this.nestedError = undefined;\n }\n}\n\n/**\n * InvalidArgumentError class\n */\nexport class InvalidArgumentError extends CommanderError {\n /**\n * Constructs the InvalidArgumentError class\n * @param {string} [message] explanation of why argument is invalid\n */\n constructor(message) {\n super(1, 'commander.invalidArgument', message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Argument {\n /**\n * Initialize a new command argument with the given name and description.\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @param {string} name\n * @param {string} [description]\n */\n\n constructor(name, description) {\n this.description = description || '';\n this.variadic = false;\n this.parseArg = undefined;\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.argChoices = undefined;\n\n switch (name[0]) {\n case '<': // e.g. <required>\n this.required = true;\n this._name = name.slice(1, -1);\n break;\n case '[': // e.g. [optional]\n this.required = false;\n this._name = name.slice(1, -1);\n break;\n default:\n this.required = true;\n this._name = name;\n break;\n }\n\n if (this._name.endsWith('...')) {\n this.variadic = true;\n this._name = this._name.slice(0, -3);\n }\n }\n\n /**\n * Return argument name.\n *\n * @return {string}\n */\n\n name() {\n return this._name;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Argument}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI command arguments into argument values.\n *\n * @param {Function} [fn]\n * @return {Argument}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Only allow argument value to be one of choices.\n *\n * @param {string[]} values\n * @return {Argument}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Make argument required.\n *\n * @returns {Argument}\n */\n argRequired() {\n this.required = true;\n return this;\n }\n\n /**\n * Make argument optional.\n *\n * @returns {Argument}\n */\n argOptional() {\n this.required = false;\n return this;\n }\n}\n\n/**\n * Takes an argument and returns its human readable equivalent for help usage.\n *\n * @param {Argument} arg\n * @return {string}\n * @private\n */\n\nexport function humanReadableArgName(arg) {\n const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');\n\n return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';\n}\n","import { EventEmitter } from 'node:events';\nimport childProcess from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport process from 'node:process';\nimport { stripVTControlCharacters } from 'node:util';\n\nimport { Argument, humanReadableArgName } from './argument.js';\nimport { CommanderError } from './error.js';\nimport { Help } from './help.js';\nimport { Option, DualOptions } from './option.js';\nimport { suggestSimilar } from './suggestSimilar.js';\n\nexport class Command extends EventEmitter {\n /**\n * Initialize a new `Command`.\n *\n * @param {string} [name]\n */\n\n constructor(name) {\n super();\n /** @type {Command[]} */\n this.commands = [];\n /** @type {Option[]} */\n this.options = [];\n this.parent = null;\n this._allowUnknownOption = false;\n this._allowExcessArguments = false;\n /** @type {Argument[]} */\n this.registeredArguments = [];\n this._args = this.registeredArguments; // deprecated old name\n /** @type {string[]} */\n this.args = []; // cli args with options removed\n this.rawArgs = [];\n this.processedArgs = []; // like .args but after custom processing and collecting variadic\n this._scriptPath = null;\n this._name = name || '';\n this._optionValues = {};\n this._optionValueSources = {}; // default, env, cli etc\n this._storeOptionsAsProperties = false;\n this._actionHandler = null;\n this._executableHandler = false;\n this._executableFile = null; // custom name for executable\n this._executableDir = null; // custom search directory for subcommands\n this._defaultCommandName = null;\n this._exitCallback = null;\n this._aliases = [];\n this._combineFlagAndOptionalValue = true;\n this._description = '';\n this._summary = '';\n this._argsDescription = undefined; // legacy\n this._enablePositionalOptions = false;\n this._passThroughOptions = false;\n this._lifeCycleHooks = {}; // a hash of arrays\n /** @type {(boolean | string)} */\n this._showHelpAfterError = false;\n this._showSuggestionAfterError = true;\n this._savedState = null; // used in save/restoreStateBeforeParse\n\n // see configureOutput() for docs\n this._outputConfiguration = {\n writeOut: (str) => process.stdout.write(str),\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(str),\n getOutHelpWidth: () =>\n process.stdout.isTTY ? process.stdout.columns : undefined,\n getErrHelpWidth: () =>\n process.stderr.isTTY ? process.stderr.columns : undefined,\n getOutHasColors: () =>\n useColor() ?? (process.stdout.isTTY && process.stdout.hasColors?.()),\n getErrHasColors: () =>\n useColor() ?? (process.stderr.isTTY && process.stderr.hasColors?.()),\n stripColor: (str) => stripVTControlCharacters(str),\n };\n\n this._hidden = false;\n /** @type {(Option | null | undefined)} */\n this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled.\n this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited\n /** @type {Command} */\n this._helpCommand = undefined; // lazy initialised, inherited\n this._helpConfiguration = {};\n /** @type {string | undefined} */\n this._helpGroupHeading = undefined; // soft initialised when added to parent\n /** @type {string | undefined} */\n this._defaultCommandGroup = undefined;\n /** @type {string | undefined} */\n this._defaultOptionGroup = undefined;\n }\n\n /**\n * Copy settings that are useful to have in common across root command and subcommands.\n *\n * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)\n *\n * @param {Command} sourceCommand\n * @return {Command} `this` command for chaining\n */\n copyInheritedSettings(sourceCommand) {\n this._outputConfiguration = sourceCommand._outputConfiguration;\n this._helpOption = sourceCommand._helpOption;\n this._helpCommand = sourceCommand._helpCommand;\n this._helpConfiguration = sourceCommand._helpConfiguration;\n this._exitCallback = sourceCommand._exitCallback;\n this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;\n this._combineFlagAndOptionalValue =\n sourceCommand._combineFlagAndOptionalValue;\n this._allowExcessArguments = sourceCommand._allowExcessArguments;\n this._enablePositionalOptions = sourceCommand._enablePositionalOptions;\n this._showHelpAfterError = sourceCommand._showHelpAfterError;\n this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError;\n\n return this;\n }\n\n /**\n * @returns {Command[]}\n * @private\n */\n\n _getCommandAndAncestors() {\n const result = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n for (let command = this; command; command = command.parent) {\n result.push(command);\n }\n return result;\n }\n\n /**\n * Define a command.\n *\n * There are two styles of command: pay attention to where to put the description.\n *\n * @example\n * // Command implemented using action handler (description is supplied separately to `.command`)\n * program\n * .command('clone <source> [destination]')\n * .description('clone a repository into a newly created directory')\n * .action((source, destination) => {\n * console.log('clone command called');\n * });\n *\n * // Command implemented using separate executable file (description is second parameter to `.command`)\n * program\n * .command('start <service>', 'start named service')\n * .command('stop [service]', 'stop named service, or all if no name supplied');\n *\n * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`\n * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)\n * @param {object} [execOpts] - configuration options (for executable)\n * @return {Command} returns new command for action handler, or `this` for executable command\n */\n\n command(nameAndArgs, actionOptsOrExecDesc, execOpts) {\n let desc = actionOptsOrExecDesc;\n let opts = execOpts;\n if (typeof desc === 'object' && desc !== null) {\n opts = desc;\n desc = null;\n }\n opts = opts || {};\n const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/);\n\n const cmd = this.createCommand(name);\n if (desc) {\n cmd.description(desc);\n cmd._executableHandler = true;\n }\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden\n cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor\n if (args) cmd.arguments(args);\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd.copyInheritedSettings(this);\n\n if (desc) return this;\n return cmd;\n }\n\n /**\n * Factory routine to create a new unattached command.\n *\n * See .command() for creating an attached subcommand, which uses this routine to\n * create the command. You can override createCommand to customise subcommands.\n *\n * @param {string} [name]\n * @return {Command} new command\n */\n\n createCommand(name) {\n return new Command(name);\n }\n\n /**\n * You can customise the help with a subclass of Help by overriding createHelp,\n * or by overriding Help properties using configureHelp().\n *\n * @return {Help}\n */\n\n createHelp() {\n return Object.assign(new Help(), this.configureHelp());\n }\n\n /**\n * You can customise the help by overriding Help properties using configureHelp(),\n * or with a subclass of Help by overriding createHelp().\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureHelp(configuration) {\n if (configuration === undefined) return this._helpConfiguration;\n\n this._helpConfiguration = configuration;\n return this;\n }\n\n /**\n * The default output goes to stdout and stderr. You can customise this for special\n * applications. You can also customise the display of errors by overriding outputError.\n *\n * The configuration properties are all functions:\n *\n * // change how output being written, defaults to stdout and stderr\n * writeOut(str)\n * writeErr(str)\n * // change how output being written for errors, defaults to writeErr\n * outputError(str, write) // used for displaying errors and not used for displaying help\n * // specify width for wrapping help\n * getOutHelpWidth()\n * getErrHelpWidth()\n * // color support, currently only used with Help\n * getOutHasColors()\n * getErrHasColors()\n * stripColor() // used to remove ANSI escape codes if output does not have colors\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureOutput(configuration) {\n if (configuration === undefined) return this._outputConfiguration;\n\n this._outputConfiguration = {\n ...this._outputConfiguration,\n ...configuration,\n };\n return this;\n }\n\n /**\n * Display the help or a custom message after an error occurs.\n *\n * @param {(boolean|string)} [displayHelp]\n * @return {Command} `this` command for chaining\n */\n showHelpAfterError(displayHelp = true) {\n if (typeof displayHelp !== 'string') displayHelp = !!displayHelp;\n this._showHelpAfterError = displayHelp;\n return this;\n }\n\n /**\n * Display suggestion of similar commands for unknown commands, or options for unknown options.\n *\n * @param {boolean} [displaySuggestion]\n * @return {Command} `this` command for chaining\n */\n showSuggestionAfterError(displaySuggestion = true) {\n this._showSuggestionAfterError = !!displaySuggestion;\n return this;\n }\n\n /**\n * Add a prepared subcommand.\n *\n * See .command() for creating an attached subcommand which inherits settings from its parent.\n *\n * @param {Command} cmd - new subcommand\n * @param {object} [opts] - configuration options\n * @return {Command} `this` command for chaining\n */\n\n addCommand(cmd, opts) {\n if (!cmd._name) {\n throw new Error(`Command passed to .addCommand() must have a name\n- specify the name in Command constructor or using .name()`);\n }\n\n opts = opts || {};\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation\n\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd._checkForBrokenPassThrough();\n\n return this;\n }\n\n /**\n * Factory routine to create a new unattached argument.\n *\n * See .argument() for creating an attached argument, which uses this routine to\n * create the argument. You can override createArgument to return a custom argument.\n *\n * @param {string} name\n * @param {string} [description]\n * @return {Argument} new argument\n */\n\n createArgument(name, description) {\n return new Argument(name, description);\n }\n\n /**\n * Define argument syntax for command.\n *\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @example\n * program.argument('<input-file>');\n * program.argument('[output-file]');\n *\n * @param {string} name\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom argument processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n argument(name, description, parseArg, defaultValue) {\n const argument = this.createArgument(name, description);\n if (typeof parseArg === 'function') {\n argument.default(defaultValue).argParser(parseArg);\n } else {\n argument.default(parseArg);\n }\n this.addArgument(argument);\n return this;\n }\n\n /**\n * Define argument syntax for command, adding multiple at once (without descriptions).\n *\n * See also .argument().\n *\n * @example\n * program.arguments('<cmd> [env]');\n *\n * @param {string} names\n * @return {Command} `this` command for chaining\n */\n\n arguments(names) {\n names\n .trim()\n .split(/ +/)\n .forEach((detail) => {\n this.argument(detail);\n });\n return this;\n }\n\n /**\n * Define argument syntax for command, adding a prepared argument.\n *\n * @param {Argument} argument\n * @return {Command} `this` command for chaining\n */\n addArgument(argument) {\n const previousArgument = this.registeredArguments.slice(-1)[0];\n if (previousArgument?.variadic) {\n throw new Error(\n `only the last argument can be variadic '${previousArgument.name()}'`,\n );\n }\n if (\n argument.required &&\n argument.defaultValue !== undefined &&\n argument.parseArg === undefined\n ) {\n throw new Error(\n `a default value for a required argument is never used: '${argument.name()}'`,\n );\n }\n this.registeredArguments.push(argument);\n return this;\n }\n\n /**\n * Customise or override default help command. By default a help command is automatically added if your command has subcommands.\n *\n * @example\n * program.helpCommand('help [cmd]');\n * program.helpCommand('help [cmd]', 'show help');\n * program.helpCommand(false); // suppress default help command\n * program.helpCommand(true); // add help command even if no subcommands\n *\n * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added\n * @param {string} [description] - custom description\n * @return {Command} `this` command for chaining\n */\n\n helpCommand(enableOrNameAndArgs, description) {\n if (typeof enableOrNameAndArgs === 'boolean') {\n this._addImplicitHelpCommand = enableOrNameAndArgs;\n if (enableOrNameAndArgs && this._defaultCommandGroup) {\n // make the command to store the group\n this._initCommandGroup(this._getHelpCommand());\n }\n return this;\n }\n\n const nameAndArgs = enableOrNameAndArgs ?? 'help [command]';\n const [, helpName, helpArgs] = nameAndArgs.match(/([^ ]+) *(.*)/);\n const helpDescription = description ?? 'display help for command';\n\n const helpCommand = this.createCommand(helpName);\n helpCommand.helpOption(false);\n if (helpArgs) helpCommand.arguments(helpArgs);\n if (helpDescription) helpCommand.description(helpDescription);\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n // init group unless lazy create\n if (enableOrNameAndArgs || description) this._initCommandGroup(helpCommand);\n\n return this;\n }\n\n /**\n * Add prepared custom help command.\n *\n * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()`\n * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only\n * @return {Command} `this` command for chaining\n */\n addHelpCommand(helpCommand, deprecatedDescription) {\n // If not passed an object, call through to helpCommand for backwards compatibility,\n // as addHelpCommand was originally used like helpCommand is now.\n if (typeof helpCommand !== 'object') {\n this.helpCommand(helpCommand, deprecatedDescription);\n return this;\n }\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n this._initCommandGroup(helpCommand);\n return this;\n }\n\n /**\n * Lazy create help command.\n *\n * @return {(Command|null)}\n * @package\n */\n _getHelpCommand() {\n const hasImplicitHelpCommand =\n this._addImplicitHelpCommand ??\n (this.commands.length &&\n !this._actionHandler &&\n !this._findCommand('help'));\n\n if (hasImplicitHelpCommand) {\n if (this._helpCommand === undefined) {\n this.helpCommand(undefined, undefined); // use default name and description\n }\n return this._helpCommand;\n }\n return null;\n }\n\n /**\n * Add hook for life cycle event.\n *\n * @param {string} event\n * @param {Function} listener\n * @return {Command} `this` command for chaining\n */\n\n hook(event, listener) {\n const allowedValues = ['preSubcommand', 'preAction', 'postAction'];\n if (!allowedValues.includes(event)) {\n throw new Error(`Unexpected value for event passed to hook : '${event}'.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n if (this._lifeCycleHooks[event]) {\n this._lifeCycleHooks[event].push(listener);\n } else {\n this._lifeCycleHooks[event] = [listener];\n }\n return this;\n }\n\n /**\n * Register callback to use as replacement for calling process.exit.\n *\n * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing\n * @return {Command} `this` command for chaining\n */\n\n exitOverride(fn) {\n if (fn) {\n this._exitCallback = fn;\n } else {\n this._exitCallback = (err) => {\n if (err.code !== 'commander.executeSubCommandAsync') {\n throw err;\n } else {\n // Async callback from spawn events, not useful to throw.\n }\n };\n }\n return this;\n }\n\n /**\n * Call process.exit, and _exitCallback if defined.\n *\n * @param {number} exitCode exit code for using with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n * @return never\n * @private\n */\n\n _exit(exitCode, code, message) {\n if (this._exitCallback) {\n this._exitCallback(new CommanderError(exitCode, code, message));\n // Expecting this line is not reached.\n }\n process.exit(exitCode);\n }\n\n /**\n * Register callback `fn` for the command.\n *\n * @example\n * program\n * .command('serve')\n * .description('start service')\n * .action(function() {\n * // do work here\n * });\n *\n * @param {Function} fn\n * @return {Command} `this` command for chaining\n */\n\n action(fn) {\n const listener = (args) => {\n // The .action callback takes an extra parameter which is the command or options.\n const expectedArgsCount = this.registeredArguments.length;\n const actionArgs = args.slice(0, expectedArgsCount);\n if (this._storeOptionsAsProperties) {\n actionArgs[expectedArgsCount] = this; // backwards compatible \"options\"\n } else {\n actionArgs[expectedArgsCount] = this.opts();\n }\n actionArgs.push(this);\n\n return fn.apply(this, actionArgs);\n };\n this._actionHandler = listener;\n return this;\n }\n\n /**\n * Factory routine to create a new unattached option.\n *\n * See .option() for creating an attached option, which uses this routine to\n * create the option. You can override createOption to return a custom option.\n *\n * @param {string} flags\n * @param {string} [description]\n * @return {Option} new option\n */\n\n createOption(flags, description) {\n return new Option(flags, description);\n }\n\n /**\n * Wrap parseArgs to catch 'commander.invalidArgument'.\n *\n * @param {(Option | Argument)} target\n * @param {string} value\n * @param {*} previous\n * @param {string} invalidArgumentMessage\n * @private\n */\n\n _callParseArg(target, value, previous, invalidArgumentMessage) {\n try {\n return target.parseArg(value, previous);\n } catch (err) {\n if (err.code === 'commander.invalidArgument') {\n const message = `${invalidArgumentMessage} ${err.message}`;\n this.error(message, { exitCode: err.exitCode, code: err.code });\n }\n throw err;\n }\n }\n\n /**\n * Check for option flag conflicts.\n * Register option if no conflicts found, or throw on conflict.\n *\n * @param {Option} option\n * @private\n */\n\n _registerOption(option) {\n const matchingOption =\n (option.short && this._findOption(option.short)) ||\n (option.long && this._findOption(option.long));\n if (matchingOption) {\n const matchingFlag =\n option.long && this._findOption(option.long)\n ? option.long\n : option.short;\n throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}'\n- already used by option '${matchingOption.flags}'`);\n }\n\n this._initOptionGroup(option);\n this.options.push(option);\n }\n\n /**\n * Check for command name and alias conflicts with existing commands.\n * Register command if no conflicts found, or throw on conflict.\n *\n * @param {Command} command\n * @private\n */\n\n _registerCommand(command) {\n const knownBy = (cmd) => {\n return [cmd.name()].concat(cmd.aliases());\n };\n\n const alreadyUsed = knownBy(command).find((name) =>\n this._findCommand(name),\n );\n if (alreadyUsed) {\n const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|');\n const newCmd = knownBy(command).join('|');\n throw new Error(\n `cannot add command '${newCmd}' as already have command '${existingCmd}'`,\n );\n }\n\n this._initCommandGroup(command);\n this.commands.push(command);\n }\n\n /**\n * Add an option.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addOption(option) {\n this._registerOption(option);\n\n const oname = option.name();\n const name = option.attributeName();\n\n // store default value\n if (option.defaultValue !== undefined) {\n this.setOptionValueWithSource(name, option.defaultValue, 'default');\n }\n\n // handler for cli and env supplied values\n const handleOptionValue = (val, invalidValueMessage, valueSource) => {\n // val is null for optional option used without an optional-argument.\n // val is undefined for boolean and negated option.\n if (val == null && option.presetArg !== undefined) {\n val = option.presetArg;\n }\n\n // custom processing\n const oldValue = this.getOptionValue(name);\n if (val !== null && option.parseArg) {\n val = this._callParseArg(option, val, oldValue, invalidValueMessage);\n } else if (val !== null && option.variadic) {\n val = option._collectValue(val, oldValue);\n }\n\n // Fill-in appropriate missing values. Long winded but easy to follow.\n if (val == null) {\n if (option.negate) {\n val = false;\n } else if (option.isBoolean() || option.optional) {\n val = true;\n } else {\n val = ''; // not normal, parseArg might have failed or be a mock function for testing\n }\n }\n this.setOptionValueWithSource(name, val, valueSource);\n };\n\n this.on('option:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'cli');\n });\n\n if (option.envVar) {\n this.on('optionEnv:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'env');\n });\n }\n\n return this;\n }\n\n /**\n * Internal implementation shared by .option() and .requiredOption()\n *\n * @return {Command} `this` command for chaining\n * @private\n */\n _optionEx(config, flags, description, fn, defaultValue) {\n if (typeof flags === 'object' && flags instanceof Option) {\n throw new Error(\n 'To add an Option object use addOption() instead of option() or requiredOption()',\n );\n }\n const option = this.createOption(flags, description);\n option.makeOptionMandatory(!!config.mandatory);\n if (typeof fn === 'function') {\n option.default(defaultValue).argParser(fn);\n } else if (fn instanceof RegExp) {\n // deprecated\n const regex = fn;\n fn = (val, def) => {\n const m = regex.exec(val);\n return m ? m[0] : def;\n };\n option.default(defaultValue).argParser(fn);\n } else {\n option.default(fn);\n }\n\n return this.addOption(option);\n }\n\n /**\n * Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required\n * option-argument is indicated by `<>` and an optional option-argument by `[]`.\n *\n * See the README for more details, and see also addOption() and requiredOption().\n *\n * @example\n * program\n * .option('-p, --pepper', 'add pepper')\n * .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument\n * .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default\n * .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n option(flags, description, parseArg, defaultValue) {\n return this._optionEx({}, flags, description, parseArg, defaultValue);\n }\n\n /**\n * Add a required option which must have a value after parsing. This usually means\n * the option must be specified on the command line. (Otherwise the same as .option().)\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n requiredOption(flags, description, parseArg, defaultValue) {\n return this._optionEx(\n { mandatory: true },\n flags,\n description,\n parseArg,\n defaultValue,\n );\n }\n\n /**\n * Alter parsing of short flags with optional values.\n *\n * @example\n * // for `.option('-f,--flag [value]'):\n * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour\n * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`\n *\n * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag.\n * @return {Command} `this` command for chaining\n */\n combineFlagAndOptionalValue(combine = true) {\n this._combineFlagAndOptionalValue = !!combine;\n return this;\n }\n\n /**\n * Allow unknown options on the command line.\n *\n * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options.\n * @return {Command} `this` command for chaining\n */\n allowUnknownOption(allowUnknown = true) {\n this._allowUnknownOption = !!allowUnknown;\n return this;\n }\n\n /**\n * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.\n *\n * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments.\n * @return {Command} `this` command for chaining\n */\n allowExcessArguments(allowExcess = true) {\n this._allowExcessArguments = !!allowExcess;\n return this;\n }\n\n /**\n * Enable positional options. Positional means global options are specified before subcommands which lets\n * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.\n * The default behaviour is non-positional and global options may appear anywhere on the command line.\n *\n * @param {boolean} [positional]\n * @return {Command} `this` command for chaining\n */\n enablePositionalOptions(positional = true) {\n this._enablePositionalOptions = !!positional;\n return this;\n }\n\n /**\n * Pass through options that come after command-arguments rather than treat them as command-options,\n * so actual command-options come before command-arguments. Turning this on for a subcommand requires\n * positional options to have been enabled on the program (parent commands).\n * The default behaviour is non-positional and options may appear before or after command-arguments.\n *\n * @param {boolean} [passThrough] for unknown options.\n * @return {Command} `this` command for chaining\n */\n passThroughOptions(passThrough = true) {\n this._passThroughOptions = !!passThrough;\n this._checkForBrokenPassThrough();\n return this;\n }\n\n /**\n * @private\n */\n\n _checkForBrokenPassThrough() {\n if (\n this.parent &&\n this._passThroughOptions &&\n !this.parent._enablePositionalOptions\n ) {\n throw new Error(\n `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`,\n );\n }\n }\n\n /**\n * Whether to store option values as properties on command object,\n * or store separately (specify false). In both cases the option values can be accessed using .opts().\n *\n * @param {boolean} [storeAsProperties=true]\n * @return {Command} `this` command for chaining\n */\n\n storeOptionsAsProperties(storeAsProperties = true) {\n if (this.options.length) {\n throw new Error('call .storeOptionsAsProperties() before adding options');\n }\n if (Object.keys(this._optionValues).length) {\n throw new Error(\n 'call .storeOptionsAsProperties() before setting option values',\n );\n }\n this._storeOptionsAsProperties = !!storeAsProperties;\n return this;\n }\n\n /**\n * Retrieve option value.\n *\n * @param {string} key\n * @return {object} value\n */\n\n getOptionValue(key) {\n if (this._storeOptionsAsProperties) {\n return this[key];\n }\n return this._optionValues[key];\n }\n\n /**\n * Store option value.\n *\n * @param {string} key\n * @param {object} value\n * @return {Command} `this` command for chaining\n */\n\n setOptionValue(key, value) {\n return this.setOptionValueWithSource(key, value, undefined);\n }\n\n /**\n * Store option value and where the value came from.\n *\n * @param {string} key\n * @param {object} value\n * @param {string} source - expected values are default/config/env/cli/implied\n * @return {Command} `this` command for chaining\n */\n\n setOptionValueWithSource(key, value, source) {\n if (this._storeOptionsAsProperties) {\n this[key] = value;\n } else {\n this._optionValues[key] = value;\n }\n this._optionValueSources[key] = source;\n return this;\n }\n\n /**\n * Get source of option value.\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSource(key) {\n return this._optionValueSources[key];\n }\n\n /**\n * Get source of option value. See also .optsWithGlobals().\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSourceWithGlobals(key) {\n // global overwrites local, like optsWithGlobals\n let source;\n this._getCommandAndAncestors().forEach((cmd) => {\n if (cmd.getOptionValueSource(key) !== undefined) {\n source = cmd.getOptionValueSource(key);\n }\n });\n return source;\n }\n\n /**\n * Get user arguments from implied or explicit arguments.\n * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches.\n *\n * @private\n */\n\n _prepareUserArgs(argv, parseOptions) {\n if (argv !== undefined && !Array.isArray(argv)) {\n throw new Error('first parameter to parse must be array or undefined');\n }\n parseOptions = parseOptions || {};\n\n // auto-detect argument conventions if nothing supplied\n if (argv === undefined && parseOptions.from === undefined) {\n if (process.versions?.electron) {\n parseOptions.from = 'electron';\n }\n // check node specific options for scenarios where user CLI args follow executable without scriptname\n const execArgv = process.execArgv ?? [];\n if (\n execArgv.includes('-e') ||\n execArgv.includes('--eval') ||\n execArgv.includes('-p') ||\n execArgv.includes('--print')\n ) {\n parseOptions.from = 'eval'; // internal usage, not documented\n }\n }\n\n // default to using process.argv\n if (argv === undefined) {\n argv = process.argv;\n }\n this.rawArgs = argv.slice();\n\n // extract the user args and scriptPath\n let userArgs;\n switch (parseOptions.from) {\n case undefined:\n case 'node':\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n break;\n case 'electron':\n // @ts-ignore: because defaultApp is an unknown property\n if (process.defaultApp) {\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n } else {\n userArgs = argv.slice(1);\n }\n break;\n case 'user':\n userArgs = argv.slice(0);\n break;\n case 'eval':\n userArgs = argv.slice(1);\n break;\n default:\n throw new Error(\n `unexpected parse option { from: '${parseOptions.from}' }`,\n );\n }\n\n // Find default name for program from arguments.\n if (!this._name && this._scriptPath)\n this.nameFromFilename(this._scriptPath);\n this._name = this._name || 'program';\n\n return userArgs;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Use parseAsync instead of parse if any of your action handlers are async.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * program.parse(); // parse process.argv and auto-detect electron and special node flags\n * program.parse(process.argv); // assume argv[0] is app and argv[1] is script\n * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv] - optional, defaults to process.argv\n * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron\n * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'\n * @return {Command} `this` command for chaining\n */\n\n parse(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n this._parseCommand([], userArgs);\n\n return this;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags\n * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script\n * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv]\n * @param {object} [parseOptions]\n * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'\n * @return {Promise}\n */\n\n async parseAsync(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n await this._parseCommand([], userArgs);\n\n return this;\n }\n\n _prepareForParse() {\n // Save the state the first time, then restore the state before each subsequent parse.\n if (this._savedState === null) {\n // Do the special default of lone negated option to true, now that we have all the options.\n // Filter for negated options that have not been processed already.\n this.options\n .filter(\n (option) =>\n option.negate &&\n option.defaultValue === undefined &&\n this.getOptionValue(option.attributeName()) === undefined,\n )\n .forEach((option) => {\n // check for lone negated option: --no-foo without a --foo option\n const positiveLongFlag = option.long.replace(/^--no-/, '--');\n if (!this._findOption(positiveLongFlag)) {\n this.setOptionValueWithSource(\n option.attributeName(),\n true,\n 'default',\n );\n }\n });\n\n this.saveStateBeforeParse();\n } else {\n this.restoreStateBeforeParse();\n }\n }\n\n /**\n * Called the first time parse is called to save state and allow a restore before subsequent calls to parse.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state saved.\n */\n saveStateBeforeParse() {\n this._savedState = {\n // name is stable if supplied by author, but may be unspecified for root command and deduced during parsing\n _name: this._name,\n // option values before parse have default values (including false for negated options)\n // shallow clones\n _optionValues: { ...this._optionValues },\n _optionValueSources: { ...this._optionValueSources },\n };\n }\n\n /**\n * Restore state before parse for calls after the first.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state restored.\n */\n restoreStateBeforeParse() {\n if (this._storeOptionsAsProperties)\n throw new Error(`Can not call parse again when storeOptionsAsProperties is true.\n- either make a new Command for each call to parse, or stop storing options as properties`);\n\n // clear state from _prepareUserArgs\n this._name = this._savedState._name;\n this._scriptPath = null;\n this.rawArgs = [];\n // clear state from setOptionValueWithSource\n this._optionValues = { ...this._savedState._optionValues };\n this._optionValueSources = { ...this._savedState._optionValueSources };\n // clear state from _parseCommand\n this.args = [];\n // clear state from _processArguments\n this.processedArgs = [];\n }\n\n /**\n * Throw if expected executable is missing. Add lots of help for author.\n *\n * @param {string} executableFile\n * @param {string} executableDir\n * @param {string} subcommandName\n */\n _checkForMissingExecutable(executableFile, executableDir, subcommandName) {\n if (fs.existsSync(executableFile)) return;\n\n const executableDirMessage = executableDir\n ? `searched for local subcommand relative to directory '${executableDir}'`\n : 'no directory for search for local subcommand, use .executableDir() to supply a custom directory';\n const executableMissing = `'${executableFile}' does not exist\n - if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead\n - if the default executable name is not suitable, use the executableFile option to supply a custom name or path\n - ${executableDirMessage}`;\n throw new Error(executableMissing);\n }\n\n /**\n * Execute a sub-command executable.\n *\n * @private\n */\n\n _executeSubCommand(subcommand, args) {\n args = args.slice();\n const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];\n\n function findFile(baseDir, baseName) {\n // Look for specified file\n const localBin = path.resolve(baseDir, baseName);\n if (fs.existsSync(localBin)) return localBin;\n\n // Stop looking if candidate already has an expected extension.\n if (sourceExt.includes(path.extname(baseName))) return undefined;\n\n // Try all the extensions.\n const foundExt = sourceExt.find((ext) =>\n fs.existsSync(`${localBin}${ext}`),\n );\n if (foundExt) return `${localBin}${foundExt}`;\n\n return undefined;\n }\n\n // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // executableFile and executableDir might be full path, or just a name\n let executableFile =\n subcommand._executableFile || `${this._name}-${subcommand._name}`;\n let executableDir = this._executableDir || '';\n if (this._scriptPath) {\n let resolvedScriptPath; // resolve possible symlink for installed npm binary\n try {\n resolvedScriptPath = fs.realpathSync(this._scriptPath);\n } catch {\n resolvedScriptPath = this._scriptPath;\n }\n executableDir = path.resolve(\n path.dirname(resolvedScriptPath),\n executableDir,\n );\n }\n\n // Look for a local file in preference to a command in PATH.\n if (executableDir) {\n let localFile = findFile(executableDir, executableFile);\n\n // Legacy search using prefix of script name instead of command name\n if (!localFile && !subcommand._executableFile && this._scriptPath) {\n const legacyName = path.basename(\n this._scriptPath,\n path.extname(this._scriptPath),\n );\n if (legacyName !== this._name) {\n localFile = findFile(\n executableDir,\n `${legacyName}-${subcommand._name}`,\n );\n }\n }\n executableFile = localFile || executableFile;\n }\n\n const launchWithNode = sourceExt.includes(path.extname(executableFile));\n\n let proc;\n if (process.platform !== 'win32') {\n if (launchWithNode) {\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n\n proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });\n } else {\n proc = childProcess.spawn(executableFile, args, { stdio: 'inherit' });\n }\n } else {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });\n }\n\n if (!proc.killed) {\n // testing mainly to avoid leak warnings during unit tests with mocked spawn\n const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n signals.forEach((signal) => {\n process.on(signal, () => {\n if (proc.killed === false && proc.exitCode === null) {\n // @ts-ignore because signals not typed to known strings\n proc.kill(signal);\n }\n });\n });\n }\n\n // By default terminate process when spawned process terminates.\n const exitCallback = this._exitCallback;\n proc.on('close', (code) => {\n code = code ?? 1; // code is null if spawned process terminated due to a signal\n if (!exitCallback) {\n process.exit(code);\n } else {\n exitCallback(\n new CommanderError(\n code,\n 'commander.executeSubCommandAsync',\n '(close)',\n ),\n );\n }\n });\n proc.on('error', (err) => {\n // @ts-ignore: because err.code is an unknown property\n if (err.code === 'ENOENT') {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n // @ts-ignore: because err.code is an unknown property\n } else if (err.code === 'EACCES') {\n throw new Error(`'${executableFile}' not executable`);\n }\n if (!exitCallback) {\n process.exit(1);\n } else {\n const wrappedError = new CommanderError(\n 1,\n 'commander.executeSubCommandAsync',\n '(error)',\n );\n wrappedError.nestedError = err;\n exitCallback(wrappedError);\n }\n });\n\n // Store the reference to the child process\n this.runningCommand = proc;\n }\n\n /**\n * @private\n */\n\n _dispatchSubcommand(commandName, operands, unknown) {\n const subCommand = this._findCommand(commandName);\n if (!subCommand) this.help({ error: true });\n\n subCommand._prepareForParse();\n let promiseChain;\n promiseChain = this._chainOrCallSubCommandHook(\n promiseChain,\n subCommand,\n 'preSubcommand',\n );\n promiseChain = this._chainOrCall(promiseChain, () => {\n if (subCommand._executableHandler) {\n this._executeSubCommand(subCommand, operands.concat(unknown));\n } else {\n return subCommand._parseCommand(operands, unknown);\n }\n });\n return promiseChain;\n }\n\n /**\n * Invoke help directly if possible, or dispatch if necessary.\n * e.g. help foo\n *\n * @private\n */\n\n _dispatchHelpCommand(subcommandName) {\n if (!subcommandName) {\n this.help();\n }\n const subCommand = this._findCommand(subcommandName);\n if (subCommand && !subCommand._executableHandler) {\n subCommand.help();\n }\n\n // Fallback to parsing the help flag to invoke the help.\n return this._dispatchSubcommand(\n subcommandName,\n [],\n [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'],\n );\n }\n\n /**\n * Check this.args against expected this.registeredArguments.\n *\n * @private\n */\n\n _checkNumberOfArguments() {\n // too few\n this.registeredArguments.forEach((arg, i) => {\n if (arg.required && this.args[i] == null) {\n this.missingArgument(arg.name());\n }\n });\n // too many\n if (\n this.registeredArguments.length > 0 &&\n this.registeredArguments[this.registeredArguments.length - 1].variadic\n ) {\n return;\n }\n if (this.args.length > this.registeredArguments.length) {\n this._excessArguments(this.args);\n }\n }\n\n /**\n * Process this.args using this.registeredArguments and save as this.processedArgs!\n *\n * @private\n */\n\n _processArguments() {\n const myParseArg = (argument, value, previous) => {\n // Extra processing for nice error message on parsing failure.\n let parsedValue = value;\n if (value !== null && argument.parseArg) {\n const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`;\n parsedValue = this._callParseArg(\n argument,\n value,\n previous,\n invalidValueMessage,\n );\n }\n return parsedValue;\n };\n\n this._checkNumberOfArguments();\n\n const processedArgs = [];\n this.registeredArguments.forEach((declaredArg, index) => {\n let value = declaredArg.defaultValue;\n if (declaredArg.variadic) {\n // Collect together remaining arguments for passing together as an array.\n if (index < this.args.length) {\n value = this.args.slice(index);\n if (declaredArg.parseArg) {\n value = value.reduce((processed, v) => {\n return myParseArg(declaredArg, v, processed);\n }, declaredArg.defaultValue);\n }\n } else if (value === undefined) {\n value = [];\n }\n } else if (index < this.args.length) {\n value = this.args[index];\n if (declaredArg.parseArg) {\n value = myParseArg(declaredArg, value, declaredArg.defaultValue);\n }\n }\n processedArgs[index] = value;\n });\n this.processedArgs = processedArgs;\n }\n\n /**\n * Once we have a promise we chain, but call synchronously until then.\n *\n * @param {(Promise|undefined)} promise\n * @param {Function} fn\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCall(promise, fn) {\n // thenable\n if (promise?.then && typeof promise.then === 'function') {\n // already have a promise, chain callback\n return promise.then(() => fn());\n }\n // callback might return a promise\n return fn();\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallHooks(promise, event) {\n let result = promise;\n const hooks = [];\n this._getCommandAndAncestors()\n .reverse()\n .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined)\n .forEach((hookedCommand) => {\n hookedCommand._lifeCycleHooks[event].forEach((callback) => {\n hooks.push({ hookedCommand, callback });\n });\n });\n if (event === 'postAction') {\n hooks.reverse();\n }\n\n hooks.forEach((hookDetail) => {\n result = this._chainOrCall(result, () => {\n return hookDetail.callback(hookDetail.hookedCommand, this);\n });\n });\n return result;\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {Command} subCommand\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallSubCommandHook(promise, subCommand, event) {\n let result = promise;\n if (this._lifeCycleHooks[event] !== undefined) {\n this._lifeCycleHooks[event].forEach((hook) => {\n result = this._chainOrCall(result, () => {\n return hook(this, subCommand);\n });\n });\n }\n return result;\n }\n\n /**\n * Process arguments in context of this command.\n * Returns action result, in case it is a promise.\n *\n * @private\n */\n\n _parseCommand(operands, unknown) {\n const parsed = this.parseOptions(unknown);\n this._parseOptionsEnv(); // after cli, so parseArg not called on both cli and env\n this._parseOptionsImplied();\n operands = operands.concat(parsed.operands);\n unknown = parsed.unknown;\n this.args = operands.concat(unknown);\n\n if (operands && this._findCommand(operands[0])) {\n return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);\n }\n if (\n this._getHelpCommand() &&\n operands[0] === this._getHelpCommand().name()\n ) {\n return this._dispatchHelpCommand(operands[1]);\n }\n if (this._defaultCommandName) {\n this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command\n return this._dispatchSubcommand(\n this._defaultCommandName,\n operands,\n unknown,\n );\n }\n if (\n this.commands.length &&\n this.args.length === 0 &&\n !this._actionHandler &&\n !this._defaultCommandName\n ) {\n // probably missing subcommand and no handler, user needs help (and exit)\n this.help({ error: true });\n }\n\n this._outputHelpIfRequested(parsed.unknown);\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // We do not always call this check to avoid masking a \"better\" error, like unknown command.\n const checkForUnknownOptions = () => {\n if (parsed.unknown.length > 0) {\n this.unknownOption(parsed.unknown[0]);\n }\n };\n\n const commandEvent = `command:${this.name()}`;\n if (this._actionHandler) {\n checkForUnknownOptions();\n this._processArguments();\n\n let promiseChain;\n promiseChain = this._chainOrCallHooks(promiseChain, 'preAction');\n promiseChain = this._chainOrCall(promiseChain, () =>\n this._actionHandler(this.processedArgs),\n );\n if (this.parent) {\n promiseChain = this._chainOrCall(promiseChain, () => {\n this.parent.emit(commandEvent, operands, unknown); // legacy\n });\n }\n promiseChain = this._chainOrCallHooks(promiseChain, 'postAction');\n return promiseChain;\n }\n if (this.parent?.listenerCount(commandEvent)) {\n checkForUnknownOptions();\n this._processArguments();\n this.parent.emit(commandEvent, operands, unknown); // legacy\n } else if (operands.length) {\n if (this._findCommand('*')) {\n // legacy default command\n return this._dispatchSubcommand('*', operands, unknown);\n }\n if (this.listenerCount('command:*')) {\n // skip option check, emit event for possible misspelling suggestion\n this.emit('command:*', operands, unknown);\n } else if (this.commands.length) {\n this.unknownCommand();\n } else {\n checkForUnknownOptions();\n this._processArguments();\n }\n } else if (this.commands.length) {\n checkForUnknownOptions();\n // This command has subcommands and nothing hooked up at this level, so display help (and exit).\n this.help({ error: true });\n } else {\n checkForUnknownOptions();\n this._processArguments();\n // fall through for caller to handle after calling .parse()\n }\n }\n\n /**\n * Find matching command.\n *\n * @private\n * @return {Command | undefined}\n */\n _findCommand(name) {\n if (!name) return undefined;\n return this.commands.find(\n (cmd) => cmd._name === name || cmd._aliases.includes(name),\n );\n }\n\n /**\n * Return an option matching `arg` if any.\n *\n * @param {string} arg\n * @return {Option}\n * @package\n */\n\n _findOption(arg) {\n return this.options.find((option) => option.is(arg));\n }\n\n /**\n * Display an error message if a mandatory option does not have a value.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n\n _checkForMissingMandatoryOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd.options.forEach((anOption) => {\n if (\n anOption.mandatory &&\n cmd.getOptionValue(anOption.attributeName()) === undefined\n ) {\n cmd.missingMandatoryOptionValue(anOption);\n }\n });\n });\n }\n\n /**\n * Display an error message if conflicting options are used together in this.\n *\n * @private\n */\n _checkForConflictingLocalOptions() {\n const definedNonDefaultOptions = this.options.filter((option) => {\n const optionKey = option.attributeName();\n if (this.getOptionValue(optionKey) === undefined) {\n return false;\n }\n return this.getOptionValueSource(optionKey) !== 'default';\n });\n\n const optionsWithConflicting = definedNonDefaultOptions.filter(\n (option) => option.conflictsWith.length > 0,\n );\n\n optionsWithConflicting.forEach((option) => {\n const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>\n option.conflictsWith.includes(defined.attributeName()),\n );\n if (conflictingAndDefined) {\n this._conflictingOption(option, conflictingAndDefined);\n }\n });\n }\n\n /**\n * Display an error message if conflicting options are used together.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n _checkForConflictingOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd._checkForConflictingLocalOptions();\n });\n }\n\n /**\n * Parse options from `argv` removing known options,\n * and return argv split into operands and unknown arguments.\n *\n * Side effects: modifies command by storing options. Does not reset state if called again.\n *\n * Examples:\n *\n * argv => operands, unknown\n * --known kkk op => [op], []\n * op --known kkk => [op], []\n * sub --unknown uuu op => [sub], [--unknown uuu op]\n * sub -- --unknown uuu op => [sub --unknown uuu op], []\n *\n * @param {string[]} args\n * @return {{operands: string[], unknown: string[]}}\n */\n\n parseOptions(args) {\n const operands = []; // operands, not options or values\n const unknown = []; // first unknown option and remaining unknown args\n let dest = operands;\n\n function maybeOption(arg) {\n return arg.length > 1 && arg[0] === '-';\n }\n\n const negativeNumberArg = (arg) => {\n // return false if not a negative number\n if (!/^-(\\d+|\\d*\\.\\d+)(e[+-]?\\d+)?$/.test(arg)) return false;\n // negative number is ok unless digit used as an option in command hierarchy\n return !this._getCommandAndAncestors().some((cmd) =>\n cmd.options\n .map((opt) => opt.short)\n .some((short) => /^-\\d$/.test(short)),\n );\n };\n\n // parse options\n let activeVariadicOption = null;\n let activeGroup = null; // working through group of short options, like -abc\n let i = 0;\n while (i < args.length || activeGroup) {\n const arg = activeGroup ?? args[i++];\n activeGroup = null;\n\n // literal\n if (arg === '--') {\n if (dest === unknown) dest.push(arg);\n dest.push(...args.slice(i));\n break;\n }\n\n if (\n activeVariadicOption &&\n (!maybeOption(arg) || negativeNumberArg(arg))\n ) {\n this.emit(`option:${activeVariadicOption.name()}`, arg);\n continue;\n }\n activeVariadicOption = null;\n\n if (maybeOption(arg)) {\n const option = this._findOption(arg);\n // recognised option, call listener to assign value with possible custom processing\n if (option) {\n if (option.required) {\n const value = args[i++];\n if (value === undefined) this.optionMissingArgument(option);\n this.emit(`option:${option.name()}`, value);\n } else if (option.optional) {\n let value = null;\n // historical behaviour is optional value is following arg unless an option\n if (\n i < args.length &&\n (!maybeOption(args[i]) || negativeNumberArg(args[i]))\n ) {\n value = args[i++];\n }\n this.emit(`option:${option.name()}`, value);\n } else {\n // boolean flag\n this.emit(`option:${option.name()}`);\n }\n activeVariadicOption = option.variadic ? option : null;\n continue;\n }\n }\n\n // Look for combo options following single dash, eat first one if known.\n if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {\n const option = this._findOption(`-${arg[1]}`);\n if (option) {\n if (\n option.required ||\n (option.optional && this._combineFlagAndOptionalValue)\n ) {\n // option with value following in same argument\n this.emit(`option:${option.name()}`, arg.slice(2));\n } else {\n // boolean option\n this.emit(`option:${option.name()}`);\n // remove the processed option and keep processing group\n activeGroup = `-${arg.slice(2)}`;\n }\n continue;\n }\n }\n\n // Look for known long flag with value, like --foo=bar\n if (/^--[^=]+=/.test(arg)) {\n const index = arg.indexOf('=');\n const option = this._findOption(arg.slice(0, index));\n if (option && (option.required || option.optional)) {\n this.emit(`option:${option.name()}`, arg.slice(index + 1));\n continue;\n }\n }\n\n // Not a recognised option by this command.\n // Might be a command-argument, or subcommand option, or unknown option, or help command or option.\n\n // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.\n // A negative number in a leaf command is not an unknown option.\n if (\n dest === operands &&\n maybeOption(arg) &&\n !(this.commands.length === 0 && negativeNumberArg(arg))\n ) {\n dest = unknown;\n }\n\n // If using positionalOptions, stop processing our options at subcommand.\n if (\n (this._enablePositionalOptions || this._passThroughOptions) &&\n operands.length === 0 &&\n unknown.length === 0\n ) {\n if (this._findCommand(arg)) {\n operands.push(arg);\n unknown.push(...args.slice(i));\n break;\n } else if (\n this._getHelpCommand() &&\n arg === this._getHelpCommand().name()\n ) {\n operands.push(arg, ...args.slice(i));\n break;\n } else if (this._defaultCommandName) {\n unknown.push(arg, ...args.slice(i));\n break;\n }\n }\n\n // If using passThroughOptions, stop processing options at first command-argument.\n if (this._passThroughOptions) {\n dest.push(arg, ...args.slice(i));\n break;\n }\n\n // add arg\n dest.push(arg);\n }\n\n return { operands, unknown };\n }\n\n /**\n * Return an object containing local option values as key-value pairs.\n *\n * @return {object}\n */\n opts() {\n if (this._storeOptionsAsProperties) {\n // Preserve original behaviour so backwards compatible when still using properties\n const result = {};\n const len = this.options.length;\n\n for (let i = 0; i < len; i++) {\n const key = this.options[i].attributeName();\n result[key] =\n key === this._versionOptionName ? this._version : this[key];\n }\n return result;\n }\n\n return this._optionValues;\n }\n\n /**\n * Return an object containing merged local and global option values as key-value pairs.\n *\n * @return {object}\n */\n optsWithGlobals() {\n // globals overwrite locals\n return this._getCommandAndAncestors().reduce(\n (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),\n {},\n );\n }\n\n /**\n * Display error message and exit (or call exitOverride).\n *\n * @param {string} message\n * @param {object} [errorOptions]\n * @param {string} [errorOptions.code] - an id string representing the error\n * @param {number} [errorOptions.exitCode] - used with process.exit\n */\n error(message, errorOptions) {\n // output handling\n this._outputConfiguration.outputError(\n `${message}\\n`,\n this._outputConfiguration.writeErr,\n );\n if (typeof this._showHelpAfterError === 'string') {\n this._outputConfiguration.writeErr(`${this._showHelpAfterError}\\n`);\n } else if (this._showHelpAfterError) {\n this._outputConfiguration.writeErr('\\n');\n this.outputHelp({ error: true });\n }\n\n // exit handling\n const config = errorOptions || {};\n const exitCode = config.exitCode || 1;\n const code = config.code || 'commander.error';\n this._exit(exitCode, code, message);\n }\n\n /**\n * Apply any option related environment variables, if option does\n * not have a value from cli or client code.\n *\n * @private\n */\n _parseOptionsEnv() {\n this.options.forEach((option) => {\n if (option.envVar && option.envVar in process.env) {\n const optionKey = option.attributeName();\n // Priority check. Do not overwrite cli or options from unknown source (client-code).\n if (\n this.getOptionValue(optionKey) === undefined ||\n ['default', 'config', 'env'].includes(\n this.getOptionValueSource(optionKey),\n )\n ) {\n if (option.required || option.optional) {\n // option can take a value\n // keep very simple, optional always takes value\n this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]);\n } else {\n // boolean\n // keep very simple, only care that envVar defined and not the value\n this.emit(`optionEnv:${option.name()}`);\n }\n }\n }\n });\n }\n\n /**\n * Apply any implied option values, if option is undefined or default value.\n *\n * @private\n */\n _parseOptionsImplied() {\n const dualHelper = new DualOptions(this.options);\n const hasCustomOptionValue = (optionKey) => {\n return (\n this.getOptionValue(optionKey) !== undefined &&\n !['default', 'implied'].includes(this.getOptionValueSource(optionKey))\n );\n };\n this.options\n .filter(\n (option) =>\n option.implied !== undefined &&\n hasCustomOptionValue(option.attributeName()) &&\n dualHelper.valueFromOption(\n this.getOptionValue(option.attributeName()),\n option,\n ),\n )\n .forEach((option) => {\n Object.keys(option.implied)\n .filter((impliedKey) => !hasCustomOptionValue(impliedKey))\n .forEach((impliedKey) => {\n this.setOptionValueWithSource(\n impliedKey,\n option.implied[impliedKey],\n 'implied',\n );\n });\n });\n }\n\n /**\n * Argument `name` is missing.\n *\n * @param {string} name\n * @private\n */\n\n missingArgument(name) {\n const message = `error: missing required argument '${name}'`;\n this.error(message, { code: 'commander.missingArgument' });\n }\n\n /**\n * `Option` is missing an argument.\n *\n * @param {Option} option\n * @private\n */\n\n optionMissingArgument(option) {\n const message = `error: option '${option.flags}' argument missing`;\n this.error(message, { code: 'commander.optionMissingArgument' });\n }\n\n /**\n * `Option` does not have a value, and is a mandatory option.\n *\n * @param {Option} option\n * @private\n */\n\n missingMandatoryOptionValue(option) {\n const message = `error: required option '${option.flags}' not specified`;\n this.error(message, { code: 'commander.missingMandatoryOptionValue' });\n }\n\n /**\n * `Option` conflicts with another option.\n *\n * @param {Option} option\n * @param {Option} conflictingOption\n * @private\n */\n _conflictingOption(option, conflictingOption) {\n // The calling code does not know whether a negated option is the source of the\n // value, so do some work to take an educated guess.\n const findBestOptionFromValue = (option) => {\n const optionKey = option.attributeName();\n const optionValue = this.getOptionValue(optionKey);\n const negativeOption = this.options.find(\n (target) => target.negate && optionKey === target.attributeName(),\n );\n const positiveOption = this.options.find(\n (target) => !target.negate && optionKey === target.attributeName(),\n );\n if (\n negativeOption &&\n ((negativeOption.presetArg === undefined && optionValue === false) ||\n (negativeOption.presetArg !== undefined &&\n optionValue === negativeOption.presetArg))\n ) {\n return negativeOption;\n }\n return positiveOption || option;\n };\n\n const getErrorMessage = (option) => {\n const bestOption = findBestOptionFromValue(option);\n const optionKey = bestOption.attributeName();\n const source = this.getOptionValueSource(optionKey);\n if (source === 'env') {\n return `environment variable '${bestOption.envVar}'`;\n }\n return `option '${bestOption.flags}'`;\n };\n\n const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;\n this.error(message, { code: 'commander.conflictingOption' });\n }\n\n /**\n * Unknown option `flag`.\n *\n * @param {string} flag\n * @private\n */\n\n unknownOption(flag) {\n if (this._allowUnknownOption) return;\n let suggestion = '';\n\n if (flag.startsWith('--') && this._showSuggestionAfterError) {\n // Looping to pick up the global options too\n let candidateFlags = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n do {\n const moreFlags = command\n .createHelp()\n .visibleOptions(command)\n .filter((option) => option.long)\n .map((option) => option.long);\n candidateFlags = candidateFlags.concat(moreFlags);\n command = command.parent;\n } while (command && !command._enablePositionalOptions);\n suggestion = suggestSimilar(flag, candidateFlags);\n }\n\n const message = `error: unknown option '${flag}'${suggestion}`;\n this.error(message, { code: 'commander.unknownOption' });\n }\n\n /**\n * Excess arguments, more than expected.\n *\n * @param {string[]} receivedArgs\n * @private\n */\n\n _excessArguments(receivedArgs) {\n if (this._allowExcessArguments) return;\n\n const expected = this.registeredArguments.length;\n const s = expected === 1 ? '' : 's';\n const received = receivedArgs.length;\n const forSubcommand = this.parent ? ` for '${this.name()}'` : '';\n const details = receivedArgs.join(', ');\n const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${received}: ${details}.`;\n this.error(message, { code: 'commander.excessArguments' });\n }\n\n /**\n * Unknown command.\n *\n * @private\n */\n\n unknownCommand() {\n const unknownName = this.args[0];\n let suggestion = '';\n\n if (this._showSuggestionAfterError) {\n const candidateNames = [];\n this.createHelp()\n .visibleCommands(this)\n .forEach((command) => {\n candidateNames.push(command.name());\n // just visible alias\n if (command.alias()) candidateNames.push(command.alias());\n });\n suggestion = suggestSimilar(unknownName, candidateNames);\n }\n\n const message = `error: unknown command '${unknownName}'${suggestion}`;\n this.error(message, { code: 'commander.unknownCommand' });\n }\n\n /**\n * Get or set the program version.\n *\n * This method auto-registers the \"-V, --version\" option which will print the version number.\n *\n * You can optionally supply the flags and description to override the defaults.\n *\n * @param {string} [str]\n * @param {string} [flags]\n * @param {string} [description]\n * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments\n */\n\n version(str, flags, description) {\n if (str === undefined) return this._version;\n this._version = str;\n flags = flags || '-V, --version';\n description = description || 'output the version number';\n const versionOption = this.createOption(flags, description);\n this._versionOptionName = versionOption.attributeName();\n this._registerOption(versionOption);\n\n this.on('option:' + versionOption.name(), () => {\n this._outputConfiguration.writeOut(`${str}\\n`);\n this._exit(0, 'commander.version', str);\n });\n return this;\n }\n\n /**\n * Set the description.\n *\n * @param {string} [str]\n * @param {object} [argsDescription]\n * @return {(string|Command)}\n */\n description(str, argsDescription) {\n if (str === undefined && argsDescription === undefined)\n return this._description;\n this._description = str;\n if (argsDescription) {\n this._argsDescription = argsDescription;\n }\n return this;\n }\n\n /**\n * Set the summary. Used when listed as subcommand of parent.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n summary(str) {\n if (str === undefined) return this._summary;\n this._summary = str;\n return this;\n }\n\n /**\n * Set an alias for the command.\n *\n * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.\n *\n * @param {string} [alias]\n * @return {(string|Command)}\n */\n\n alias(alias) {\n if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility\n\n /** @type {Command} */\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n if (\n this.commands.length !== 0 &&\n this.commands[this.commands.length - 1]._executableHandler\n ) {\n // assume adding alias for last added executable subcommand, rather than this\n command = this.commands[this.commands.length - 1];\n }\n\n if (alias === command._name)\n throw new Error(\"Command alias can't be the same as its name\");\n const matchingCommand = this.parent?._findCommand(alias);\n if (matchingCommand) {\n // c.f. _registerCommand\n const existingCmd = [matchingCommand.name()]\n .concat(matchingCommand.aliases())\n .join('|');\n throw new Error(\n `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`,\n );\n }\n\n command._aliases.push(alias);\n return this;\n }\n\n /**\n * Set aliases for the command.\n *\n * Only the first alias is shown in the auto-generated help.\n *\n * @param {string[]} [aliases]\n * @return {(string[]|Command)}\n */\n\n aliases(aliases) {\n // Getter for the array of aliases is the main reason for having aliases() in addition to alias().\n if (aliases === undefined) return this._aliases;\n\n aliases.forEach((alias) => this.alias(alias));\n return this;\n }\n\n /**\n * Set / get the command usage `str`.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n usage(str) {\n if (str === undefined) {\n if (this._usage) return this._usage;\n\n const args = this.registeredArguments.map((arg) => {\n return humanReadableArgName(arg);\n });\n return []\n .concat(\n this.options.length || this._helpOption !== null ? '[options]' : [],\n this.commands.length ? '[command]' : [],\n this.registeredArguments.length ? args : [],\n )\n .join(' ');\n }\n\n this._usage = str;\n return this;\n }\n\n /**\n * Get or set the name of the command.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n name(str) {\n if (str === undefined) return this._name;\n this._name = str;\n return this;\n }\n\n /**\n * Set/get the help group heading for this subcommand in parent command's help.\n *\n * @param {string} [heading]\n * @return {Command | string}\n */\n\n helpGroup(heading) {\n if (heading === undefined) return this._helpGroupHeading ?? '';\n this._helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for subcommands added to this command.\n * (This does not override a group set directly on the subcommand using .helpGroup().)\n *\n * @example\n * program.commandsGroup('Development Commands:);\n * program.command('watch')...\n * program.command('lint')...\n * ...\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n commandsGroup(heading) {\n if (heading === undefined) return this._defaultCommandGroup ?? '';\n this._defaultCommandGroup = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for options added to this command.\n * (This does not override a group set directly on the option using .helpGroup().)\n *\n * @example\n * program\n * .optionsGroup('Development Options:')\n * .option('-d, --debug', 'output extra debugging')\n * .option('-p, --profile', 'output profiling information')\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n optionsGroup(heading) {\n if (heading === undefined) return this._defaultOptionGroup ?? '';\n this._defaultOptionGroup = heading;\n return this;\n }\n\n /**\n * @param {Option} option\n * @private\n */\n _initOptionGroup(option) {\n if (this._defaultOptionGroup && !option.helpGroupHeading)\n option.helpGroup(this._defaultOptionGroup);\n }\n\n /**\n * @param {Command} cmd\n * @private\n */\n _initCommandGroup(cmd) {\n if (this._defaultCommandGroup && !cmd.helpGroup())\n cmd.helpGroup(this._defaultCommandGroup);\n }\n\n /**\n * Set the name of the command from script filename, such as process.argv[1],\n * or import.meta.filename.\n *\n * (Used internally and public although not documented in README.)\n *\n * @example\n * program.nameFromFilename(import.meta.filename);\n *\n * @param {string} filename\n * @return {Command}\n */\n\n nameFromFilename(filename) {\n this._name = path.basename(filename, path.extname(filename));\n\n return this;\n }\n\n /**\n * Get or set the directory for searching for executable subcommands of this command.\n *\n * @example\n * program.executableDir(import.meta.dirname);\n * // or\n * program.executableDir('subcommands');\n *\n * @param {string} [path]\n * @return {(string|null|Command)}\n */\n\n executableDir(path) {\n if (path === undefined) return this._executableDir;\n this._executableDir = path;\n return this;\n }\n\n /**\n * Return program help documentation.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout\n * @return {string}\n */\n\n helpInformation(contextOptions) {\n const helper = this.createHelp();\n const context = this._getOutputContext(contextOptions);\n helper.prepareContext({\n error: context.error,\n helpWidth: context.helpWidth,\n outputHasColors: context.hasColors,\n });\n const text = helper.formatHelp(this, helper);\n if (context.hasColors) return text;\n return this._outputConfiguration.stripColor(text);\n }\n\n /**\n * @typedef HelpContext\n * @type {object}\n * @property {boolean} error\n * @property {number} helpWidth\n * @property {boolean} hasColors\n * @property {function} write - includes stripColor if needed\n *\n * @returns {HelpContext}\n * @private\n */\n\n _getOutputContext(contextOptions) {\n contextOptions = contextOptions || {};\n const error = !!contextOptions.error;\n let baseWrite;\n let hasColors;\n let helpWidth;\n if (error) {\n baseWrite = (str) => this._outputConfiguration.writeErr(str);\n hasColors = this._outputConfiguration.getErrHasColors();\n helpWidth = this._outputConfiguration.getErrHelpWidth();\n } else {\n baseWrite = (str) => this._outputConfiguration.writeOut(str);\n hasColors = this._outputConfiguration.getOutHasColors();\n helpWidth = this._outputConfiguration.getOutHelpWidth();\n }\n const write = (str) => {\n if (!hasColors) str = this._outputConfiguration.stripColor(str);\n return baseWrite(str);\n };\n return { error, write, hasColors, helpWidth };\n }\n\n /**\n * Output help information for this command.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n outputHelp(contextOptions) {\n let deprecatedCallback;\n if (typeof contextOptions === 'function') {\n deprecatedCallback = contextOptions;\n contextOptions = undefined;\n }\n\n const outputContext = this._getOutputContext(contextOptions);\n /** @type {HelpTextEventContext} */\n const eventContext = {\n error: outputContext.error,\n write: outputContext.write,\n command: this,\n };\n\n this._getCommandAndAncestors()\n .reverse()\n .forEach((command) => command.emit('beforeAllHelp', eventContext));\n this.emit('beforeHelp', eventContext);\n\n let helpInformation = this.helpInformation({ error: outputContext.error });\n if (deprecatedCallback) {\n helpInformation = deprecatedCallback(helpInformation);\n if (\n typeof helpInformation !== 'string' &&\n !Buffer.isBuffer(helpInformation)\n ) {\n throw new Error('outputHelp callback must return a string or a Buffer');\n }\n }\n outputContext.write(helpInformation);\n\n if (this._getHelpOption()?.long) {\n this.emit(this._getHelpOption().long); // deprecated\n }\n this.emit('afterHelp', eventContext);\n this._getCommandAndAncestors().forEach((command) =>\n command.emit('afterAllHelp', eventContext),\n );\n }\n\n /**\n * You can pass in flags and a description to customise the built-in help option.\n * Pass in false to disable the built-in help option.\n *\n * @example\n * program.helpOption('-?, --help' 'show help'); // customise\n * program.helpOption(false); // disable\n *\n * @param {(string | boolean)} flags\n * @param {string} [description]\n * @return {Command} `this` command for chaining\n */\n\n helpOption(flags, description) {\n // Support enabling/disabling built-in help option.\n if (typeof flags === 'boolean') {\n if (flags) {\n if (this._helpOption === null) this._helpOption = undefined; // reenable\n if (this._defaultOptionGroup) {\n // make the option to store the group\n this._initOptionGroup(this._getHelpOption());\n }\n } else {\n this._helpOption = null; // disable\n }\n return this;\n }\n\n // Customise flags and description.\n this._helpOption = this.createOption(\n flags ?? '-h, --help',\n description ?? 'display help for command',\n );\n // init group unless lazy create\n if (flags || description) this._initOptionGroup(this._helpOption);\n\n return this;\n }\n\n /**\n * Lazy create help option.\n * Returns null if has been disabled with .helpOption(false).\n *\n * @returns {(Option | null)} the help option\n * @package\n */\n _getHelpOption() {\n // Lazy create help option on demand.\n if (this._helpOption === undefined) {\n this.helpOption(undefined, undefined);\n }\n return this._helpOption;\n }\n\n /**\n * Supply your own option to use for the built-in help option.\n * This is an alternative to using helpOption() to customise the flags and description etc.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addHelpOption(option) {\n this._helpOption = option;\n this._initOptionGroup(option);\n return this;\n }\n\n /**\n * Output help information and exit.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n help(contextOptions) {\n this.outputHelp(contextOptions);\n let exitCode = Number(process.exitCode ?? 0); // process.exitCode does allow a string or an integer, but we prefer just a number\n if (\n exitCode === 0 &&\n contextOptions &&\n typeof contextOptions !== 'function' &&\n contextOptions.error\n ) {\n exitCode = 1;\n }\n // message: do not have all displayed text available so only passing placeholder.\n this._exit(exitCode, 'commander.help', '(outputHelp)');\n }\n\n /**\n * // Do a little typing to coordinate emit and listener for the help text events.\n * @typedef HelpTextEventContext\n * @type {object}\n * @property {boolean} error\n * @property {Command} command\n * @property {function} write\n */\n\n /**\n * Add additional text to be displayed with the built-in help.\n *\n * Position is 'before' or 'after' to affect just this command,\n * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.\n *\n * @param {string} position - before or after built-in help\n * @param {(string | Function)} text - string to add, or a function returning a string\n * @return {Command} `this` command for chaining\n */\n\n addHelpText(position, text) {\n const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];\n if (!allowedValues.includes(position)) {\n throw new Error(`Unexpected value for position to addHelpText.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n\n const helpEvent = `${position}Help`;\n this.on(helpEvent, (/** @type {HelpTextEventContext} */ context) => {\n let helpStr;\n if (typeof text === 'function') {\n helpStr = text({ error: context.error, command: context.command });\n } else {\n helpStr = text;\n }\n // Ignore falsy value when nothing to output.\n if (helpStr) {\n context.write(`${helpStr}\\n`);\n }\n });\n return this;\n }\n\n /**\n * Output help information if help flags specified\n *\n * @param {Array} args - array of options to search for help flags\n * @private\n */\n\n _outputHelpIfRequested(args) {\n const helpOption = this._getHelpOption();\n const helpRequested = helpOption && args.find((arg) => helpOption.is(arg));\n if (helpRequested) {\n this.outputHelp();\n // (Do not have all displayed text available so only passing placeholder.)\n this._exit(0, 'commander.helpDisplayed', '(outputHelp)');\n }\n }\n}\n\n/**\n * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).\n *\n * @param {string[]} args - array of arguments from node.execArgv\n * @returns {string[]}\n * @private\n */\n\nfunction incrementNodeInspectorPort(args) {\n // Testing for these options:\n // --inspect[=[host:]port]\n // --inspect-brk[=[host:]port]\n // --inspect-port=[host:]port\n return args.map((arg) => {\n if (!arg.startsWith('--inspect')) {\n return arg;\n }\n let debugOption;\n let debugHost = '127.0.0.1';\n let debugPort = '9229';\n let match;\n if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {\n // e.g. --inspect\n debugOption = match[1];\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null\n ) {\n debugOption = match[1];\n if (/^\\d+$/.test(match[3])) {\n // e.g. --inspect=1234\n debugPort = match[3];\n } else {\n // e.g. --inspect=localhost\n debugHost = match[3];\n }\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\\d+)$/)) !== null\n ) {\n // e.g. --inspect=localhost:1234\n debugOption = match[1];\n debugHost = match[3];\n debugPort = match[4];\n }\n\n if (debugOption && debugPort !== '0') {\n return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;\n }\n return arg;\n });\n}\n\n/**\n * Exported for using from tests, not otherwise used outside this file.\n *\n * @returns {boolean | undefined}\n * @package\n */\nexport function useColor() {\n // Test for common conventions.\n // NB: the observed behaviour is in combination with how author adds color! For example:\n // - we do not test NODE_DISABLE_COLORS, but util:styletext does\n // - we do test NO_COLOR, but Chalk does not\n //\n // References:\n // https://no-color.org\n // https://bixense.com/clicolors/\n // https://github.com/nodejs/node/blob/0a00217a5f67ef4a22384cfc80eb6dd9a917fdc1/lib/internal/tty.js#L109\n // https://github.com/chalk/supports-color/blob/c214314a14bcb174b12b3014b2b0a8de375029ae/index.js#L33\n // (https://force-color.org recent web page from 2023, does not match major javascript implementations)\n\n if (\n process.env.NO_COLOR ||\n process.env.FORCE_COLOR === '0' ||\n process.env.FORCE_COLOR === 'false'\n )\n return false;\n if (process.env.FORCE_COLOR || process.env.CLICOLOR_FORCE !== undefined)\n return true;\n return undefined;\n}\n","import { humanReadableArgName } from './argument.js';\nimport { stripVTControlCharacters } from 'node:util';\n\n/**\n * TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`\n * https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types\n * @typedef { import(\"./argument.js\").Argument } Argument\n * @typedef { import(\"./command.js\").Command } Command\n * @typedef { import(\"./option.js\").Option } Option\n */\n\n// Although this is a class, methods are static in style to allow override using subclass or just functions.\nexport class Help {\n constructor() {\n this.helpWidth = undefined;\n this.minWidthToWrap = 40;\n this.sortSubcommands = false;\n this.sortOptions = false;\n this.showGlobalOptions = false;\n }\n\n /**\n * prepareContext is called by Commander after applying overrides from `Command.configureHelp()`\n * and just before calling `formatHelp()`.\n *\n * Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses.\n *\n * @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions\n */\n prepareContext(contextOptions) {\n this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80;\n }\n\n /**\n * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.\n *\n * @param {Command} cmd\n * @returns {Command[]}\n */\n\n visibleCommands(cmd) {\n const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);\n const helpCommand = cmd._getHelpCommand();\n if (helpCommand && !helpCommand._hidden) {\n visibleCommands.push(helpCommand);\n }\n if (this.sortSubcommands) {\n visibleCommands.sort((a, b) => {\n // @ts-ignore: because overloaded return type\n return a.name().localeCompare(b.name());\n });\n }\n return visibleCommands;\n }\n\n /**\n * Compare options for sort.\n *\n * @param {Option} a\n * @param {Option} b\n * @returns {number}\n */\n compareOptions(a, b) {\n const getSortKey = (option) => {\n // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.\n return option.short\n ? option.short.replace(/^-/, '')\n : option.long.replace(/^--/, '');\n };\n return getSortKey(a).localeCompare(getSortKey(b));\n }\n\n /**\n * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleOptions(cmd) {\n const visibleOptions = cmd.options.filter((option) => !option.hidden);\n // Built-in help option.\n const helpOption = cmd._getHelpOption();\n if (helpOption && !helpOption.hidden) {\n // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs.\n const removeShort = helpOption.short && cmd._findOption(helpOption.short);\n const removeLong = helpOption.long && cmd._findOption(helpOption.long);\n if (!removeShort && !removeLong) {\n visibleOptions.push(helpOption); // no changes needed\n } else if (helpOption.long && !removeLong) {\n visibleOptions.push(\n cmd.createOption(helpOption.long, helpOption.description),\n );\n } else if (helpOption.short && !removeShort) {\n visibleOptions.push(\n cmd.createOption(helpOption.short, helpOption.description),\n );\n }\n }\n if (this.sortOptions) {\n visibleOptions.sort(this.compareOptions);\n }\n return visibleOptions;\n }\n\n /**\n * Get an array of the visible global options. (Not including help.)\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleGlobalOptions(cmd) {\n if (!this.showGlobalOptions) return [];\n\n const globalOptions = [];\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n const visibleOptions = ancestorCmd.options.filter(\n (option) => !option.hidden,\n );\n globalOptions.push(...visibleOptions);\n }\n if (this.sortOptions) {\n globalOptions.sort(this.compareOptions);\n }\n return globalOptions;\n }\n\n /**\n * Get an array of the arguments if any have a description.\n *\n * @param {Command} cmd\n * @returns {Argument[]}\n */\n\n visibleArguments(cmd) {\n // Side effect! Apply the legacy descriptions before the arguments are displayed.\n if (cmd._argsDescription) {\n cmd.registeredArguments.forEach((argument) => {\n argument.description =\n argument.description || cmd._argsDescription[argument.name()] || '';\n });\n }\n\n // If there are any arguments with a description then return all the arguments.\n if (cmd.registeredArguments.find((argument) => argument.description)) {\n return cmd.registeredArguments;\n }\n return [];\n }\n\n /**\n * Get the command term to show in the list of subcommands.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandTerm(cmd) {\n // Legacy. Ignores custom usage string, and nested commands.\n const args = cmd.registeredArguments\n .map((arg) => humanReadableArgName(arg))\n .join(' ');\n return (\n cmd._name +\n (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +\n (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option\n (args ? ' ' + args : '')\n );\n }\n\n /**\n * Get the option term to show in the list of options.\n *\n * @param {Option} option\n * @returns {string}\n */\n\n optionTerm(option) {\n return option.flags;\n }\n\n /**\n * Get the argument term to show in the list of arguments.\n *\n * @param {Argument} argument\n * @returns {string}\n */\n\n argumentTerm(argument) {\n return argument.name();\n }\n\n /**\n * Get the longest command term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestSubcommandTermLength(cmd, helper) {\n return helper.visibleCommands(cmd).reduce((max, command) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleSubcommandTerm(helper.subcommandTerm(command)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the longest option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestOptionTermLength(cmd, helper) {\n return helper.visibleOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest global option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestGlobalOptionTermLength(cmd, helper) {\n return helper.visibleGlobalOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest argument term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestArgumentTermLength(cmd, helper) {\n return helper.visibleArguments(cmd).reduce((max, argument) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the command usage to be displayed at the top of the built-in help.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandUsage(cmd) {\n // Usage\n let cmdName = cmd._name;\n if (cmd._aliases[0]) {\n cmdName = cmdName + '|' + cmd._aliases[0];\n }\n let ancestorCmdNames = '';\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;\n }\n return ancestorCmdNames + cmdName + ' ' + cmd.usage();\n }\n\n /**\n * Get the description for the command.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.description();\n }\n\n /**\n * Get the subcommand summary to show in the list of subcommands.\n * (Fallback to description for backwards compatibility.)\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.summary() || cmd.description();\n }\n\n /**\n * Get the option description to show in the list of options.\n *\n * @param {Option} option\n * @return {string}\n */\n\n optionDescription(option) {\n const extraInfo = [];\n\n if (option.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (option.defaultValue !== undefined) {\n // default for boolean and negated more for programmer than end user,\n // but show true/false for boolean option as may be for hand-rolled env or config processing.\n const showDefault =\n option.required ||\n option.optional ||\n (option.isBoolean() && typeof option.defaultValue === 'boolean');\n if (showDefault) {\n extraInfo.push(\n `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,\n );\n }\n }\n // preset for boolean and negated are more for programmer than end user\n if (option.presetArg !== undefined && option.optional) {\n extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);\n }\n if (option.envVar !== undefined) {\n extraInfo.push(`env: ${option.envVar}`);\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (option.description) {\n return `${option.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n\n return option.description;\n }\n\n /**\n * Get the argument description to show in the list of arguments.\n *\n * @param {Argument} argument\n * @return {string}\n */\n\n argumentDescription(argument) {\n const extraInfo = [];\n if (argument.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (argument.defaultValue !== undefined) {\n extraInfo.push(\n `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,\n );\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (argument.description) {\n return `${argument.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n return argument.description;\n }\n\n /**\n * Format a list of items, given a heading and an array of formatted items.\n *\n * @param {string} heading\n * @param {string[]} items\n * @param {Help} helper\n * @returns string[]\n */\n formatItemList(heading, items, helper) {\n if (items.length === 0) return [];\n\n return [helper.styleTitle(heading), ...items, ''];\n }\n\n /**\n * Group items by their help group heading.\n *\n * @param {Command[] | Option[]} unsortedItems\n * @param {Command[] | Option[]} visibleItems\n * @param {Function} getGroup\n * @returns {Map<string, Command[] | Option[]>}\n */\n groupItems(unsortedItems, visibleItems, getGroup) {\n const result = new Map();\n // Add groups in order of appearance in unsortedItems.\n unsortedItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) result.set(group, []);\n });\n // Add items in order of appearance in visibleItems.\n visibleItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group).push(item);\n });\n return result;\n }\n\n /**\n * Generate the built-in help text.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {string}\n */\n\n formatHelp(cmd, helper) {\n const termWidth = helper.padWidth(cmd, helper);\n const helpWidth = helper.helpWidth ?? 80; // in case prepareContext() was not called\n\n function callFormatItem(term, description) {\n return helper.formatItem(term, termWidth, description, helper);\n }\n\n // Usage\n let output = [\n `${helper.styleTitle('Usage:')} ${helper.styleUsage(helper.commandUsage(cmd))}`,\n '',\n ];\n\n // Description\n const commandDescription = helper.commandDescription(cmd);\n if (commandDescription.length > 0) {\n output = output.concat([\n helper.boxWrap(\n helper.styleCommandDescription(commandDescription),\n helpWidth,\n ),\n '',\n ]);\n }\n\n // Arguments\n const argumentList = helper.visibleArguments(cmd).map((argument) => {\n return callFormatItem(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n helper.styleArgumentDescription(helper.argumentDescription(argument)),\n );\n });\n output = output.concat(\n this.formatItemList('Arguments:', argumentList, helper),\n );\n\n // Options\n const optionGroups = this.groupItems(\n cmd.options,\n helper.visibleOptions(cmd),\n (option) => option.helpGroupHeading ?? 'Options:',\n );\n optionGroups.forEach((options, group) => {\n const optionList = options.map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(this.formatItemList(group, optionList, helper));\n });\n\n if (helper.showGlobalOptions) {\n const globalOptionList = helper\n .visibleGlobalOptions(cmd)\n .map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(\n this.formatItemList('Global Options:', globalOptionList, helper),\n );\n }\n\n // Commands\n const commandGroups = this.groupItems(\n cmd.commands,\n helper.visibleCommands(cmd),\n (sub) => sub.helpGroup() || 'Commands:',\n );\n commandGroups.forEach((commands, group) => {\n const commandList = commands.map((sub) => {\n return callFormatItem(\n helper.styleSubcommandTerm(helper.subcommandTerm(sub)),\n helper.styleSubcommandDescription(helper.subcommandDescription(sub)),\n );\n });\n output = output.concat(this.formatItemList(group, commandList, helper));\n });\n\n return output.join('\\n');\n }\n\n /**\n * Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations.\n *\n * @param {string} str\n * @returns {number}\n */\n displayWidth(str) {\n return stripVTControlCharacters(str).length;\n }\n\n /**\n * Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc.\n *\n * @param {string} str\n * @returns {string}\n */\n styleTitle(str) {\n return str;\n }\n\n styleUsage(str) {\n // Usage has lots of parts the user might like to color separately! Assume default usage string which is formed like:\n // command subcommand [options] [command] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word === '[command]') return this.styleSubcommandText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleCommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleCommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleOptionDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleSubcommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleArgumentDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleDescriptionText(str) {\n return str;\n }\n styleOptionTerm(str) {\n return this.styleOptionText(str);\n }\n styleSubcommandTerm(str) {\n // This is very like usage with lots of parts! Assume default string which is formed like:\n // subcommand [options] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleSubcommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleArgumentTerm(str) {\n return this.styleArgumentText(str);\n }\n styleOptionText(str) {\n return str;\n }\n styleArgumentText(str) {\n return str;\n }\n styleSubcommandText(str) {\n return str;\n }\n styleCommandText(str) {\n return str;\n }\n\n /**\n * Calculate the pad width from the maximum term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n padWidth(cmd, helper) {\n return Math.max(\n helper.longestOptionTermLength(cmd, helper),\n helper.longestGlobalOptionTermLength(cmd, helper),\n helper.longestSubcommandTermLength(cmd, helper),\n helper.longestArgumentTermLength(cmd, helper),\n );\n }\n\n /**\n * Detect manually wrapped and indented strings by checking for line break followed by whitespace.\n *\n * @param {string} str\n * @returns {boolean}\n */\n preformatted(str) {\n return /\\n[^\\S\\r\\n]/.test(str);\n }\n\n /**\n * Format the \"item\", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.\n *\n * So \"TTT\", 5, \"DDD DDDD DD DDD\" might be formatted for this.helpWidth=17 like so:\n * TTT DDD DDDD\n * DD DDD\n *\n * @param {string} term\n * @param {number} termWidth\n * @param {string} description\n * @param {Help} helper\n * @returns {string}\n */\n formatItem(term, termWidth, description, helper) {\n const itemIndent = 2;\n const itemIndentStr = ' '.repeat(itemIndent);\n if (!description) return itemIndentStr + term;\n\n // Pad the term out to a consistent width, so descriptions are aligned.\n const paddedTerm = term.padEnd(\n termWidth + term.length - helper.displayWidth(term),\n );\n\n // Format the description.\n const spacerWidth = 2; // between term and description\n const helpWidth = this.helpWidth ?? 80; // in case prepareContext() was not called\n const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent;\n let formattedDescription;\n if (\n remainingWidth < this.minWidthToWrap ||\n helper.preformatted(description)\n ) {\n formattedDescription = description;\n } else {\n const wrappedDescription = helper.boxWrap(description, remainingWidth);\n formattedDescription = wrappedDescription.replace(\n /\\n/g,\n '\\n' + ' '.repeat(termWidth + spacerWidth),\n );\n }\n\n // Construct and overall indent.\n return (\n itemIndentStr +\n paddedTerm +\n ' '.repeat(spacerWidth) +\n formattedDescription.replace(/\\n/g, `\\n${itemIndentStr}`)\n );\n }\n\n /**\n * Wrap a string at whitespace, preserving existing line breaks.\n * Wrapping is skipped if the width is less than `minWidthToWrap`.\n *\n * @param {string} str\n * @param {number} width\n * @returns {string}\n */\n boxWrap(str, width) {\n if (width < this.minWidthToWrap) return str;\n\n const rawLines = str.split(/\\r\\n|\\n/);\n // split up text by whitespace\n const chunkPattern = /[\\s]*[^\\s]+/g;\n const wrappedLines = [];\n rawLines.forEach((line) => {\n const chunks = line.match(chunkPattern);\n if (chunks === null) {\n wrappedLines.push('');\n return;\n }\n\n let sumChunks = [chunks.shift()];\n let sumWidth = this.displayWidth(sumChunks[0]);\n chunks.forEach((chunk) => {\n const visibleWidth = this.displayWidth(chunk);\n // Accumulate chunks while they fit into width.\n if (sumWidth + visibleWidth <= width) {\n sumChunks.push(chunk);\n sumWidth += visibleWidth;\n return;\n }\n wrappedLines.push(sumChunks.join(''));\n\n const nextChunk = chunk.trimStart(); // trim space at line break\n sumChunks = [nextChunk];\n sumWidth = this.displayWidth(nextChunk);\n });\n wrappedLines.push(sumChunks.join(''));\n });\n\n return wrappedLines.join('\\n');\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Option {\n /**\n * Initialize a new `Option` with the given `flags` and `description`.\n *\n * @param {string} flags\n * @param {string} [description]\n */\n\n constructor(flags, description) {\n this.flags = flags;\n this.description = description || '';\n\n this.required = flags.includes('<'); // A value must be supplied when the option is specified.\n this.optional = flags.includes('['); // A value is optional when the option is specified.\n // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument\n this.variadic = /\\w\\.\\.\\.[>\\]]$/.test(flags); // The option can take multiple values.\n this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.\n const optionFlags = splitOptionFlags(flags);\n this.short = optionFlags.shortFlag; // May be a short flag, undefined, or even a long flag (if option has two long flags).\n this.long = optionFlags.longFlag;\n this.negate = false;\n if (this.long) {\n this.negate = this.long.startsWith('--no-');\n }\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.presetArg = undefined;\n this.envVar = undefined;\n this.parseArg = undefined;\n this.hidden = false;\n this.argChoices = undefined;\n this.conflictsWith = [];\n this.implied = undefined;\n this.helpGroupHeading = undefined; // soft initialised when option added to command\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Option}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Preset to use when option used without option-argument, especially optional but also boolean and negated.\n * The custom processing (parseArg) is called.\n *\n * @example\n * new Option('--color').default('GREYSCALE').preset('RGB');\n * new Option('--donate [amount]').preset('20').argParser(parseFloat);\n *\n * @param {*} arg\n * @return {Option}\n */\n\n preset(arg) {\n this.presetArg = arg;\n return this;\n }\n\n /**\n * Add option name(s) that conflict with this option.\n * An error will be displayed if conflicting options are found during parsing.\n *\n * @example\n * new Option('--rgb').conflicts('cmyk');\n * new Option('--js').conflicts(['ts', 'jsx']);\n *\n * @param {(string | string[])} names\n * @return {Option}\n */\n\n conflicts(names) {\n this.conflictsWith = this.conflictsWith.concat(names);\n return this;\n }\n\n /**\n * Specify implied option values for when this option is set and the implied options are not.\n *\n * The custom processing (parseArg) is not called on the implied values.\n *\n * @example\n * program\n * .addOption(new Option('--log', 'write logging information to file'))\n * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));\n *\n * @param {object} impliedOptionValues\n * @return {Option}\n */\n implies(impliedOptionValues) {\n let newImplied = impliedOptionValues;\n if (typeof impliedOptionValues === 'string') {\n // string is not documented, but easy mistake and we can do what user probably intended.\n newImplied = { [impliedOptionValues]: true };\n }\n this.implied = Object.assign(this.implied || {}, newImplied);\n return this;\n }\n\n /**\n * Set environment variable to check for option value.\n *\n * An environment variable is only used if when processed the current option value is\n * undefined, or the source of the current value is 'default' or 'config' or 'env'.\n *\n * @param {string} name\n * @return {Option}\n */\n\n env(name) {\n this.envVar = name;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI option arguments into option values.\n *\n * @param {Function} [fn]\n * @return {Option}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Whether the option is mandatory and must have a value after parsing.\n *\n * @param {boolean} [mandatory=true]\n * @return {Option}\n */\n\n makeOptionMandatory(mandatory = true) {\n this.mandatory = !!mandatory;\n return this;\n }\n\n /**\n * Hide option in help.\n *\n * @param {boolean} [hide=true]\n * @return {Option}\n */\n\n hideHelp(hide = true) {\n this.hidden = !!hide;\n return this;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Only allow option value to be one of choices.\n *\n * @param {string[]} values\n * @return {Option}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Return option name.\n *\n * @return {string}\n */\n\n name() {\n if (this.long) {\n return this.long.replace(/^--/, '');\n }\n return this.short.replace(/^-/, '');\n }\n\n /**\n * Return option name, in a camelcase format that can be used\n * as an object attribute key.\n *\n * @return {string}\n */\n\n attributeName() {\n if (this.negate) {\n return camelcase(this.name().replace(/^no-/, ''));\n }\n return camelcase(this.name());\n }\n\n /**\n * Set the help group heading.\n *\n * @param {string} heading\n * @return {Option}\n */\n helpGroup(heading) {\n this.helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Check if `arg` matches the short or long flag.\n *\n * @param {string} arg\n * @return {boolean}\n * @package\n */\n\n is(arg) {\n return this.short === arg || this.long === arg;\n }\n\n /**\n * Return whether a boolean option.\n *\n * Options are one of boolean, negated, required argument, or optional argument.\n *\n * @return {boolean}\n * @package\n */\n\n isBoolean() {\n return !this.required && !this.optional && !this.negate;\n }\n}\n\n/**\n * This class is to make it easier to work with dual options, without changing the existing\n * implementation. We support separate dual options for separate positive and negative options,\n * like `--build` and `--no-build`, which share a single option value. This works nicely for some\n * use cases, but is tricky for others where we want separate behaviours despite\n * the single shared option value.\n */\nexport class DualOptions {\n /**\n * @param {Option[]} options\n */\n constructor(options) {\n this.positiveOptions = new Map();\n this.negativeOptions = new Map();\n this.dualOptions = new Set();\n options.forEach((option) => {\n if (option.negate) {\n this.negativeOptions.set(option.attributeName(), option);\n } else {\n this.positiveOptions.set(option.attributeName(), option);\n }\n });\n this.negativeOptions.forEach((value, key) => {\n if (this.positiveOptions.has(key)) {\n this.dualOptions.add(key);\n }\n });\n }\n\n /**\n * Did the value come from the option, and not from possible matching dual option?\n *\n * @param {*} value\n * @param {Option} option\n * @returns {boolean}\n */\n valueFromOption(value, option) {\n const optionKey = option.attributeName();\n if (!this.dualOptions.has(optionKey)) return true;\n\n // Use the value to deduce if (probably) came from the option.\n const preset = this.negativeOptions.get(optionKey).presetArg;\n const negativeValue = preset !== undefined ? preset : false;\n return option.negate === (negativeValue === value);\n }\n}\n\n/**\n * Convert string from kebab-case to camelCase.\n *\n * @param {string} str\n * @return {string}\n * @private\n */\n\nfunction camelcase(str) {\n return str.split('-').reduce((str, word) => {\n return str + word[0].toUpperCase() + word.slice(1);\n });\n}\n\n/**\n * Split the short and long flag out of something like '-m,--mixed <value>'\n *\n * @private\n */\n\nfunction splitOptionFlags(flags) {\n let shortFlag;\n let longFlag;\n // short flag, single dash and single character\n const shortFlagExp = /^-[^-]$/;\n // long flag, double dash and at least one character\n const longFlagExp = /^--[^-]/;\n\n const flagParts = flags.split(/[ |,]+/).concat('guard');\n // Normal is short and/or long.\n if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift();\n if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift();\n // Long then short. Rarely used but fine.\n if (!shortFlag && shortFlagExp.test(flagParts[0]))\n shortFlag = flagParts.shift();\n // Allow two long flags, like '--ws, --workspace'\n // This is the supported way to have a shortish option flag.\n if (!shortFlag && longFlagExp.test(flagParts[0])) {\n shortFlag = longFlag;\n longFlag = flagParts.shift();\n }\n\n // Check for unprocessed flag. Fail noisily rather than silently ignore.\n if (flagParts[0].startsWith('-')) {\n const unsupportedFlag = flagParts[0];\n const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags}'`;\n if (/^-[^-][^-]/.test(unsupportedFlag))\n throw new Error(\n `${baseError}\n- a short flag is a single dash and a single character\n - either use a single dash and a single character (for a short flag)\n - or use a double dash for a long option (and can have two, like '--ws, --workspace')`,\n );\n if (shortFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many short flags`);\n if (longFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many long flags`);\n\n throw new Error(`${baseError}\n- unrecognised flag format`);\n }\n if (shortFlag === undefined && longFlag === undefined)\n throw new Error(\n `option creation failed due to no flags found in '${flags}'.`,\n );\n\n return { shortFlag, longFlag };\n}\n","const maxDistance = 3;\n\nfunction editDistance(a, b) {\n // https://en.wikipedia.org/wiki/Damerau–Levenshtein_distance\n // Calculating optimal string alignment distance, no substring is edited more than once.\n // (Simple implementation.)\n\n // Quick early exit, return worst case.\n if (Math.abs(a.length - b.length) > maxDistance)\n return Math.max(a.length, b.length);\n\n // distance between prefix substrings of a and b\n const d = [];\n\n // pure deletions turn a into empty string\n for (let i = 0; i <= a.length; i++) {\n d[i] = [i];\n }\n // pure insertions turn empty string into b\n for (let j = 0; j <= b.length; j++) {\n d[0][j] = j;\n }\n\n // fill matrix\n for (let j = 1; j <= b.length; j++) {\n for (let i = 1; i <= a.length; i++) {\n let cost;\n if (a[i - 1] === b[j - 1]) {\n cost = 0;\n } else {\n cost = 1;\n }\n d[i][j] = Math.min(\n d[i - 1][j] + 1, // deletion\n d[i][j - 1] + 1, // insertion\n d[i - 1][j - 1] + cost, // substitution\n );\n // transposition\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n }\n }\n }\n\n return d[a.length][b.length];\n}\n\n/**\n * Find close matches, restricted to same number of edits.\n *\n * @param {string} word\n * @param {string[]} candidates\n * @returns {string}\n */\n\nexport function suggestSimilar(word, candidates) {\n if (!candidates || candidates.length === 0) return '';\n // remove possible duplicates\n candidates = Array.from(new Set(candidates));\n\n const searchingOptions = word.startsWith('--');\n if (searchingOptions) {\n word = word.slice(2);\n candidates = candidates.map((candidate) => candidate.slice(2));\n }\n\n let similar = [];\n let bestDistance = maxDistance;\n const minSimilarity = 0.4;\n candidates.forEach((candidate) => {\n if (candidate.length <= 1) return; // no one character guesses\n\n const distance = editDistance(word, candidate);\n const length = Math.max(word.length, candidate.length);\n const similarity = (length - distance) / length;\n if (similarity > minSimilarity) {\n if (distance < bestDistance) {\n // better edit distance, throw away previous worse matches\n bestDistance = distance;\n similar = [candidate];\n } else if (distance === bestDistance) {\n similar.push(candidate);\n }\n }\n });\n\n similar.sort((a, b) => a.localeCompare(b));\n if (searchingOptions) {\n similar = similar.map((candidate) => `--${candidate}`);\n }\n\n if (similar.length > 1) {\n return `\\n(Did you mean one of ${similar.join(', ')}?)`;\n }\n if (similar.length === 1) {\n return `\\n(Did you mean ${similar[0]}?)`;\n }\n return '';\n}\n","import { Argument } from './lib/argument.js';\nimport { Command } from './lib/command.js';\nimport { CommanderError, InvalidArgumentError } from './lib/error.js';\nimport { Help } from './lib/help.js';\nimport { Option } from './lib/option.js';\n\nexport const program = new Command();\n\nexport const createCommand = (name) => new Command(name);\nexport const createOption = (flags, description) =>\n new Option(flags, description);\nexport const createArgument = (name, description) =>\n new Argument(name, description);\n\n/**\n * Expose classes\n */\n\nexport { Command, Option, Argument, Help };\nexport { CommanderError, InvalidArgumentError };\nexport { InvalidArgumentError as InvalidOptionArgumentError }; // Deprecated\n","// mu — every `mu agent ...` verb + spawn / send / read / list / show /\n// close + the top-level `mu me` agent-self\n// verb (default + `tasks` / `next` subcommands).\n//\n// `mu me` / `mu me tasks` / `mu me next` are the agent-self verbs\n// (`cmdMyTasks` and `cmdMyNext` back the last two).\n\nimport { dirname } from \"node:path\";\nimport { agentToOutput, liveAgentToOutput, workstreamIdOf } from \"../agent-output.js\";\nimport { agentKey, blockedReason, type RuntimeState, readAgentStates } from \"../agent-state.js\";\nimport { isCommandGate } from \"../agents/spawn.js\";\nimport {\n AgentCtlUnreachableError,\n AgentNotFoundError,\n AgentSendIndeterminateError,\n abortAgent,\n agentCtlSocket,\n checkMessage,\n delegateOutcome,\n expectsCtl,\n getAgent,\n interruptAgent,\n isSlashCommand,\n listLiveAgents,\n parseSessionCommand,\n readAgent,\n requireFeature,\n resolveCliCommand,\n resolveCliCommandWithSource,\n type SpawnedAgent,\n sendToAgent,\n spawnAgent,\n spawnForTask,\n type Transport,\n} from \"../agents.js\";\nimport {\n applyQualifiedRef,\n assertAgentInWorkstream,\n CliExitError,\n classifyError,\n emitJson,\n formatAgentsTable,\n resolveEntityRef,\n resolveExistingWorkstream,\n resolveWorkstream,\n statusIcon,\n UsageError,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { say } from \"../messages.js\";\nimport { activeMux, attachShellLine, type SendWarning } from \"../mux.js\";\nimport { pc } from \"../output.js\";\nimport { buildTaskBrief, TaskBriefMissingError } from \"../task-brief.js\";\nimport { getTask } from \"../tasks/queries.js\";\nimport { type WaitRef, type WaitSnapshot, waitForEvents } from \"../wait.js\";\nimport { ctlAgentHooks } from \"../wait-ctl.js\";\nimport { wireCloseCommand } from \"./agent-close.js\";\nimport { wireCollectCommand } from \"./agent-collect.js\";\nimport { setNextOutcome } from \"./handle.js\";\nimport { readStdinText, STDIN_ARG } from \"./stdin.js\";\nimport { installWaitSignals, runWait, type WaitSignals } from \"./wait.js\";\nimport { armSend, taskRef } from \"./wait-arm.js\";\n\ninterface SpawnOpts {\n cli?: string;\n command?: string;\n tab?: string;\n role?: string;\n cwd?: string;\n workstream?: string;\n worktree?: boolean;\n from?: string;\n root?: string;\n /** commander's `--no-ctl` negation: false skips the ctl handshake. */\n ctl?: boolean;\n /** Take the next free name when `<name>` is taken. */\n nextFree?: boolean;\n /** Run on this host profile (`mu host add`): the pane runs its shell template. */\n host?: string;\n /** Send this text once the agent is up (`-` reads stdin). */\n send?: string;\n /** Bind the spawn to this task: claim it for the new agent and send the text as its brief (default text: the task's brief). */\n task?: string;\n /** With `--task`: the attempt's name (default: the task id). Replays of a name never send twice. */\n attempt?: string;\n json?: boolean;\n signal?: AbortSignal;\n}\n// --from / --root only mean something with --worktree; refuse a stray one\n// before any side effect rather than silently ignoring it.\nfunction assertWorktreeFlags(opts: SpawnOpts): void {\n if (opts.worktree) {\n if (opts.cwd !== undefined) {\n throw new UsageError(say(\"agent.spawn_cwd_worktree\"));\n }\n return;\n }\n for (const flag of [\"from\", \"root\"] as const) {\n // With --host, --root alone names the remote repo the agent starts in.\n if (flag === \"root\" && opts.host !== undefined) continue;\n if (opts[flag] !== undefined) throw new UsageError(say(\"agent.spawn_needs_worktree\", flag));\n }\n}\n\n// A remote command gate runs one command and reports its exit: it takes no\n// brief, task or worktree. Refused before any effect (stdin read included).\nfunction assertGateFlags(opts: SpawnOpts): void {\n if (!isCommandGate(opts)) return;\n for (const flag of [\"task\", \"send\", \"attempt\"] as const) {\n if (opts[flag] !== undefined) {\n throw new UsageError(say(\"agent.spawn_gate_flag\", flag));\n }\n }\n if (opts.worktree) {\n throw new UsageError(say(\"agent.spawn_gate_worktree\"));\n }\n}\n\nexport async function cmdSpawn(\n db: Db,\n rawName: string,\n opts: SpawnOpts,\n sig?: WaitSignals,\n): Promise<void> {\n try {\n await spawnOnce(db, rawName, { ...opts, ...(sig ? { signal: sig.signal } : {}) });\n } catch (err) {\n // SIGINT/SIGTERM rolled the spawn back (pane, row, worktree, git child).\n const which = sig?.which();\n if (which === undefined) throw err;\n const message = `${which} during spawn of ${rawName}: rolled back (${err instanceof Error ? err.message : String(err)})`;\n if (!opts.json) console.error(message);\n throw new CliExitError(\n which === \"SIGTERM\" ? 143 : 130,\n opts.json ? { error: \"SpawnInterruptedError\", message } : undefined,\n );\n }\n}\n\n/** What `--task` sends when `--send` is absent: the task's brief (as `mu task auto` builds it), or,\n * with no brief note, one line from its title. That line carries no footer: it is pinned as the brief. */\nfunction taskBriefText(db: Db, workstream: string, task: string): string {\n try {\n return buildTaskBrief(db, workstream, task).text;\n } catch (err) {\n if (!(err instanceof TaskBriefMissingError)) throw err;\n const title = getTask(db, task, workstream)?.title ?? task;\n return say(\"agent.spawn_task_default\", task, workstream, title);\n }\n}\n\nasync function spawnOnce(db: Db, rawName: string, opts: SpawnOpts): Promise<void> {\n assertGateFlags(opts);\n // Spawn is a create path: the first spawn into a workstream creates it (insertAgent), as\n // `scratch` does. Every other verb refuses an unknown -w.\n const workstream = await resolveWorkstream(opts.workstream);\n // Read stdin before any side effect: an empty pipe must not leave a pane.\n // `--task` without `--send` sends the task's own brief (what `mu auto` sends).\n const sendText =\n opts.send === undefined\n ? opts.task === undefined\n ? undefined\n : taskBriefText(db, workstream, opts.task)\n : opts.send === STDIN_ARG\n ? await readStdinText(\"send text\")\n : opts.send;\n\n assertWorktreeFlags(opts);\n if (opts.attempt !== undefined && opts.task === undefined) {\n throw new UsageError(say(\"agent.spawn_attempt_task\"));\n }\n if (opts.task !== undefined && sendText !== undefined) {\n return cmdSpawnTask(db, rawName, workstream, opts.task, sendText, opts);\n }\n\n const agent = await spawnAgent(db, {\n name: rawName,\n workstream,\n ...(opts.cli !== undefined ? { cli: opts.cli } : {}),\n ...(opts.command !== undefined ? { command: opts.command } : {}),\n ...(opts.tab !== undefined ? { tab: opts.tab } : {}),\n ...(opts.role !== undefined ? { role: opts.role } : {}),\n ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),\n ...(opts.worktree === true ? { worktree: true } : {}),\n ...(opts.from !== undefined ? { from: opts.from } : {}),\n ...(opts.root !== undefined ? { root: opts.root } : {}),\n ...(opts.ctl === false ? { ctl: false } : {}),\n ...(opts.nextFree === true ? { nextFree: true } : {}),\n ...(opts.host !== undefined ? { host: opts.host } : {}),\n ...(opts.signal !== undefined ? { signal: opts.signal } : {}),\n });\n // --next-free may have picked another name than the one asked for.\n const name = agent.name;\n // A pi agent whose control socket never answered still spawned (the\n // pane is usable by hand), but say so loudly on stderr: every exact\n // send / wait on it will fail until the extension answers.\n // Under --json the warnings ride in the one document (`warnings`), never stderr.\n const warnings: string[] = [];\n if (agent.ctl === \"missing\" || agent.ctl === \"refused\") {\n const warn = new AgentCtlUnreachableError(\n name,\n workstream,\n agent.ctlSocket,\n agent.ctl,\n agent.host,\n );\n warnings.push(warn.message);\n if (!opts.json) console.error(pc.yellow(`warning: ${warn.message}`));\n }\n // Claude parks at a trust dialog whose default is \"No, exit\": the Enter\n // that ends a send would quit it. Keep the pane, skip the send, say why.\n const trustSkip = agent.trustDialog === true && sendText !== undefined;\n if (agent.trustDialog === true) {\n const trustWarning = say(\"agent.spawn_trust_warning\", name, trustSkip);\n warnings.push(trustWarning);\n if (!opts.json) console.error(pc.yellow(`warning: ${trustWarning}`));\n }\n const sent: SpawnSend | undefined = trustSkip\n ? {\n ok: false,\n error: \"TrustDialogPending\",\n message: \"send skipped: Claude's folder-trust dialog is waiting in the pane\",\n exitCode: 0,\n }\n : sendText === undefined\n ? undefined\n : await spawnSend(db, agent, sendText);\n // A DELIVERED --send owes a wait: arm it for the ACTUAL agent (--next-free may have\n // renamed it), fenced by the runs/incarnation the send measured. Trust-skipped,\n // undelivered and failed or UNKNOWN sends arm nothing.\n if (sent?.ok && sent.delivered) {\n const armed = armSend(\n db,\n { name, workstreamName: workstream },\n { transport: sent.transport, runs: sent.runs, incarnation: sent.incarnation },\n );\n if (armed.warning !== undefined) {\n warnings.push(armed.warning);\n if (!opts.json) console.error(pc.yellow(`warning: ${armed.warning}`));\n }\n }\n // Resolve the actual command that landed in the pane, so the operator\n // can confirm `--command 'pi-meta --no-solo'` (etc.) took effect.\n // Mirrors the resolution chain in spawnAgent: explicit --command >\n // $MU_<UPPER_CLI>_COMMAND > the cli value itself. 'Spawned ... (pi)'\n // was misleading when --command overrode the binary.\n const resolvedCommand = opts.command ?? resolveCliCommand(agent.cli);\n const commandOverridden = resolvedCommand !== agent.cli;\n // When the override came from an env var (no explicit --command), the success\n // line names it, so a stale $MU_<CLI>_COMMAND is visible without `mu agent show`.\n // An explicit --command is shown via the `(cmd: ...)` suffix below.\n const envSourced =\n opts.command === undefined ? resolveCliCommandWithSource(agent.cli) : undefined;\n // What the spawn owes next: a gate's wait, or the exact wait of a delivered --send.\n if (agent.gateToken != null) {\n setNextOutcome({ kind: \"gate-spawned\", agent: { name, workstream } });\n } else if (sent?.ok && sent.runs !== undefined) {\n setNextOutcome({\n kind: \"sent\",\n agent: { name, workstream },\n runs: sent.runs,\n ...(sent.incarnation !== undefined ? { incarnation: sent.incarnation } : {}),\n });\n }\n // The attach line is data (the delegate tool prints it), not a hint. Best effort.\n let attach: string | undefined;\n try {\n const mux = await activeMux();\n attach = attachShellLine(\n await mux.attachCommands({\n session: `mu-${workstream}`,\n window: agent.tab ?? name,\n inside: Boolean(process.env.TMUX),\n }),\n );\n } catch {\n // no attach line\n }\n if (opts.json) {\n const payload = {\n agent: agentToOutput(agent, workstreamIdOf(db, workstream), {\n ctl: agent.ctl,\n ctlSocket: agent.ctlSocket,\n ...(agent.trustDialog === true ? { trustDialog: true } : {}),\n }),\n resolvedCommand,\n commandOverridden,\n // env-var attribution for machine consumers: present iff the\n // resolution came from $MU_<UPPER_CLI>_COMMAND. Mirrors the\n // human `(via $MU_PI_META_COMMAND)` suffix below.\n ...(envSourced?.resolvedFromEnv ? { resolvedFromEnvVar: envSourced.envVar } : {}),\n ctl: agent.ctl,\n ctlSocket: agent.ctlSocket,\n ...(sent !== undefined ? { send: sent } : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n ...(attach !== undefined ? { attach } : {}),\n };\n // A failed --send is ONE failure document: the spawn evidence (the pane is\n // up) rides in `data` with the nested `send.ok:false`, and the delivery\n // receipt (msgId / incarnation / delivery) stays structured beside it.\n if (sent !== undefined && !sent.ok && sent.exitCode !== 0) {\n throw new CliExitError(sent.exitCode, {\n error: sent.error,\n message: sent.message,\n data: payload,\n extra: {\n ...(sent.msgId !== undefined ? { msgId: sent.msgId } : {}),\n ...(sent.incarnation !== undefined ? { incarnation: sent.incarnation } : {}),\n ...(sent.delivery !== undefined ? { delivery: sent.delivery } : {}),\n },\n });\n }\n emitJson(payload);\n return;\n }\n const wsBit = opts.worktree ? pc.dim(\" with its own worktree\") : \"\";\n // Three display modes (precedence top-down):\n // 1. --command was explicit → 'pi (cmd: pi-meta --no-solo)'\n // 2. resolved via env var override → 'pi (via $MU_PI_COMMAND)'\n // 3. bare CLI name on PATH → 'pi'\n // Env-var attribution is preferred over the generic '(cmd: ...)'\n // suffix because the env-var name is the actionable knob the\n // operator can grep for / unset.\n const cliDisplay =\n opts.command !== undefined\n ? `${agent.cli} ${pc.dim(`(cmd: ${resolvedCommand})`)}`\n : envSourced?.resolvedFromEnv\n ? `${agent.cli} ${pc.dim(`(via $${envSourced.envVar})`)}`\n : agent.cli;\n console.log(\n `Spawned ${pc.bold(agent.name)} (${cliDisplay}) in window ${pc.bold(agent.tab ?? agent.name)} of ${pc.bold(`mu-${workstream}`)}, pane ${pc.dim(agent.paneId)}${wsBit}`,\n );\n if (agent.cwd !== null) console.log(pc.dim(` cwd: ${agent.cwd}`));\n console.log(pc.dim(` ctl: ${agent.ctl} (${agent.ctlSocket})`));\n if (sent?.ok) {\n const runs = sent.runs !== undefined ? `, runs ${sent.runs}` : \"\";\n console.log(pc.dim(` sent ${sent.sentBytes} bytes (via ${sent.transport}${runs})`));\n } else if (sent !== undefined) {\n console.error(\n sent.exitCode === 0\n ? pc.yellow(`warning: ${sent.message}`)\n : pc.red(`error: --send failed: ${sent.message}`),\n );\n }\n if (attach !== undefined) console.log(pc.dim(` attach: ${attach}`));\n if (sent !== undefined && !sent.ok && sent.exitCode !== 0) throw new CliExitError(sent.exitCode);\n}\n\n/**\n * `mu agent spawn --task <id> --send <text>`: spawn, claim the task for the\n * new agent and send the brief as ONE journaled attempt (spawnForTask). A\n * delivered attempt (now or by an earlier run) prints the same spawn record\n * as a plain `--send`; an UNKNOWN one exits 1 with the receipt, never a\n * resend. An unsent failure rolls back its own resources and rethrows.\n */\nasync function cmdSpawnTask(\n db: Db,\n name: string,\n workstream: string,\n task: string,\n text: string,\n opts: SpawnOpts,\n): Promise<void> {\n const out = await spawnForTask(db, {\n task,\n text,\n ...(opts.attempt !== undefined ? { attempt: opts.attempt } : {}),\n spawn: {\n name,\n workstream,\n ...(opts.cli !== undefined ? { cli: opts.cli } : {}),\n ...(opts.command !== undefined ? { command: opts.command } : {}),\n ...(opts.tab !== undefined ? { tab: opts.tab } : {}),\n ...(opts.role !== undefined ? { role: opts.role } : {}),\n ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),\n ...(opts.worktree === true ? { worktree: true } : {}),\n ...(opts.from !== undefined ? { from: opts.from } : {}),\n ...(opts.root !== undefined ? { root: opts.root } : {}),\n ...(opts.ctl === false ? { ctl: false } : {}),\n ...(opts.nextFree === true ? { nextFree: true } : {}),\n ...(opts.host !== undefined ? { host: opts.host } : {}),\n ...(opts.signal !== undefined ? { signal: opts.signal } : {}),\n },\n });\n const rec = out.receipt;\n const agentName = out.agent?.name ?? rec.name;\n const fresh = out.agent !== undefined && \"ctl\" in out.agent ? out.agent : undefined;\n const sent: SpawnSend =\n out.state === \"sent\"\n ? {\n ok: true,\n sentBytes: Buffer.byteLength(text),\n transport: rec.transport ?? \"ctl\",\n ...(out.send?.state !== undefined ? { state: out.send.state } : {}),\n ...(rec.runs !== null ? { runs: rec.runs } : {}),\n msgId: rec.msgId,\n ...(rec.incarnation !== null ? { incarnation: rec.incarnation } : {}),\n delivery: \"delivered\",\n ...(out.send?.sessionFile !== undefined ? { sessionFile: out.send.sessionFile } : {}),\n delivered: true,\n }\n : {\n ok: false,\n error: \"AgentSendIndeterminateError\",\n message: out.reason ?? \"delivery unknown\",\n exitCode: 1,\n msgId: rec.msgId,\n ...(rec.incarnation !== null ? { incarnation: rec.incarnation } : {}),\n delivery: \"unknown\",\n };\n // Arm what this attempt owes: the task and its agent, from the SAVED receipt (a replay\n // answers with the original run and incarnation). A stale identity (the agent was deleted\n // or the name now belongs to a replacement) arms nothing: never a replacement under an\n // old receipt. A delivery-UNKNOWN attempt arms its task only (the prompt may be running).\n const warnings: string[] = [];\n if (out.stale === undefined && rec.state !== \"reserved\" && rec.state !== \"pane\") {\n const armed =\n out.state === \"sent\" && out.agent !== undefined\n ? armSend(\n db,\n { name: agentName, workstreamName: workstream },\n {\n transport: rec.transport ?? \"ctl\",\n ...(rec.runs !== null ? { runs: rec.runs } : {}),\n ...(rec.incarnation !== null ? { incarnation: rec.incarnation } : {}),\n },\n [taskRef(workstream, task)],\n )\n : armSend(db, { name: agentName, workstreamName: workstream }, { transport: \"ctl\" }, [\n taskRef(workstream, task),\n ]);\n if (armed.warning !== undefined) {\n warnings.push(armed.warning);\n if (!opts.json) console.error(pc.yellow(`warning: ${armed.warning}`));\n }\n }\n if (out.state === \"sent\" && rec.runs !== null && out.stale === undefined) {\n setNextOutcome({\n kind: \"sent\",\n agent: { name: agentName, workstream },\n runs: rec.runs,\n ...(rec.incarnation !== null ? { incarnation: rec.incarnation } : {}),\n });\n } else if (out.state === \"unknown\" && rec.transport === \"ctl\" && out.stale === undefined) {\n const row = getAgent(db, agentName, workstream);\n if (row !== undefined) {\n setNextOutcome({\n kind: \"send-unknown\",\n agent: { name: agentName, workstream },\n msgId: rec.msgId,\n agentId: row.incarnation,\n });\n }\n }\n const taskInfo = {\n id: task,\n attempt: rec.attemptKey,\n state: rec.state,\n replay: out.replay,\n brief: out.brief,\n claimed: rec.state !== \"reserved\" && rec.state !== \"pane\" && rec.state !== \"failed\",\n ...(out.stale !== undefined ? { stale: out.stale } : {}),\n ...(out.checked !== undefined ? { checked: out.checked } : {}),\n };\n if (opts.json) {\n const payload = {\n ...(out.agent !== undefined\n ? {\n agent: agentToOutput(out.agent, workstreamIdOf(db, workstream), {\n ...(fresh !== undefined\n ? {\n ctl: fresh.ctl,\n ctlSocket: fresh.ctlSocket,\n ...(fresh.trustDialog === true ? { trustDialog: true } : {}),\n }\n : {}),\n }),\n }\n : {}),\n ...(fresh !== undefined ? { ctl: fresh.ctl, ctlSocket: fresh.ctlSocket } : {}),\n send: sent,\n task: taskInfo,\n delivery: sent.delivery,\n msgId: rec.msgId,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n if (!sent.ok) {\n throw new CliExitError(1, {\n error: sent.error,\n message: sent.message,\n data: payload,\n extra: {\n msgId: rec.msgId,\n ...(rec.incarnation !== null ? { incarnation: rec.incarnation } : {}),\n delivery: \"unknown\",\n },\n });\n }\n emitJson(payload);\n return;\n }\n const verb = out.replay ? \"Replayed\" : \"Spawned\";\n console.log(\n `${verb} ${pc.bold(agentName)} for ${pc.bold(task)} (${rec.attemptKey}): ${\n out.state === \"sent\" ? \"prompt delivered\" : pc.yellow(\"delivery UNKNOWN; never resent\")\n }`,\n );\n if (out.stale !== undefined) {\n console.log(\n pc.yellow(` the agent of this attempt is ${out.stale}; the replacement was left alone`),\n );\n }\n if (out.state === \"unknown\") {\n console.error(pc.yellow(`warning: ${out.reason ?? \"delivery unknown\"}`));\n }\n if (out.brief === \"pending\")\n console.log(pc.dim(\" brief not recorded yet; a replay records it once delivery is confirmed\"));\n if (out.state === \"unknown\") throw new CliExitError(1);\n}\n\n/** `mu agent spawn --send`: the outcome of the send, as `--json` reports it. */\ntype SpawnSend =\n | {\n ok: true;\n sentBytes: number;\n transport: Transport;\n state?: string;\n runs?: number;\n /** The send's receipt id (`mu agent check`) and pi's incarnation (`wait --inc`). */\n msgId?: string;\n incarnation?: string;\n delivery?: \"delivered\";\n /** pi's session file, where the delegate's transcript is written. */\n sessionFile?: string;\n delivered: boolean;\n }\n | {\n ok: false;\n error: string;\n message: string;\n exitCode: number;\n msgId?: string;\n incarnation?: string;\n delivery?: \"unknown\";\n };\n\n/**\n * Send the first prompt to a just-spawned agent, so a caller that would\n * run spawn then send pays one mu process instead of two. The pane stays\n * up when the send fails: the spawn succeeded, and the caller decides.\n * A pi whose control socket never answered is not sent to (the send\n * could not be confirmed).\n */\nasync function spawnSend(db: Db, agent: SpawnedAgent, text: string): Promise<SpawnSend> {\n const fail = (err: unknown): SpawnSend => ({\n ok: false,\n error: err instanceof Error ? err.name : \"Error\",\n message: err instanceof Error ? err.message : String(err),\n exitCode: classifyError(err).exitCode,\n // A delivery-unknown send names its receipt: `mu agent check <agent> <msgId>`.\n ...(err instanceof AgentSendIndeterminateError && err.msgId !== undefined\n ? {\n msgId: err.msgId,\n delivery: \"unknown\" as const,\n ...(err.incarnation !== undefined ? { incarnation: err.incarnation } : {}),\n }\n : {}),\n });\n if (agent.ctl === \"missing\" || agent.ctl === \"refused\")\n return fail(\n new AgentCtlUnreachableError(\n agent.name,\n agent.workstreamName,\n agent.ctlSocket,\n agent.ctl,\n agent.host,\n ),\n );\n let undelivered = false;\n try {\n const sent = await sendToAgent(db, agent.name, text, {\n workstream: agent.workstreamName,\n expect: { incarnation: agent.incarnation, paneId: agent.paneId },\n // Bound to the pi the spawn handshake saw: a replacement bound at the same socket path is refused.\n ...(agent.ctlIncarnation !== undefined ? { expectIncarnation: agent.ctlIncarnation } : {}),\n onUndelivered: () => {\n undelivered = true;\n },\n });\n return {\n ok: true,\n sentBytes: Buffer.byteLength(text),\n transport: sent.transport,\n ...(sent.state !== undefined ? { state: sent.state } : {}),\n ...(sent.runs !== undefined ? { runs: sent.runs } : {}),\n ...(sent.msgId !== undefined ? { msgId: sent.msgId, delivery: \"delivered\" as const } : {}),\n ...(sent.incarnation !== undefined ? { incarnation: sent.incarnation } : {}),\n ...(sent.sessionFile !== undefined ? { sessionFile: sent.sessionFile } : {}),\n delivered: !undelivered,\n };\n } catch (err) {\n return fail(err);\n }\n}\n\nexport async function cmdSend(\n db: Db,\n rawName: string,\n rawText: string,\n opts: {\n workstream?: string;\n json?: boolean;\n steer?: boolean;\n fresh?: boolean;\n force?: boolean;\n interrupt?: boolean;\n timeout?: number;\n /** Enter the wait for the run this send starts (one JSON document: the receipt in `sent`, then the wait). */\n wait?: boolean;\n } = {},\n sig?: WaitSignals,\n): Promise<void> {\n const text = rawText === STDIN_ARG ? await readStdinText(\"send text\") : rawText;\n if (opts.interrupt) {\n for (const [on, flag] of [\n [opts.fresh, \"--fresh\"],\n [opts.steer, \"--steer\"],\n [opts.force, \"--force\"],\n ] as const) {\n if (on) throw new UsageError(say(\"agent.send_interrupt_excl\", flag));\n }\n if (isSlashCommand(text)) {\n throw new UsageError(say(\"agent.send_interrupt_slash\"));\n }\n // Refuse before the abort: an empty prompt would kill the running turn\n // and then send nothing.\n if (text === \"\") throw new UsageError(say(\"agent.send_interrupt_empty\"));\n } else if (opts.timeout !== undefined) {\n throw new UsageError(say(\"agent.send_timeout\"));\n }\n if (opts.force && !opts.fresh && parseSessionCommand(text) === undefined) {\n throw new UsageError(say(\"agent.send_force\"));\n }\n if (opts.fresh && opts.steer) throw new UsageError(say(\"agent.send_fresh_steer\"));\n if (opts.wait) {\n if (sig === undefined) throw new UsageError(say(\"agent.send_wait_sig\"));\n // A slash command starts no run: there is nothing to wait for (refused before the send).\n if (isSlashCommand(text)) {\n throw new UsageError(say(\"agent.send_wait_slash\"));\n }\n }\n if (opts.interrupt) return cmdSendInterrupt(db, rawName, text, opts, sig);\n const { name } = await resolveEntityRef(db, rawName, opts, \"agent\");\n assertAgentInWorkstream(db, name, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n // dogfood_send_after_new_dropped: capture the undelivered warning\n // rather than letting it print raw, so it lands in the JSON payload\n // too. `exit 0` must not be able to mean \"silently dropped\".\n let undelivered: SendWarning | undefined;\n const sent = await sendToAgent(db, name, text, {\n workstream: ws,\n ...(opts.steer ? { mode: \"steer\" as const } : {}),\n ...(opts.fresh ? { fresh: true } : {}),\n ...(opts.force ? { force: true } : {}),\n onUndelivered: (w) => {\n undelivered = w;\n },\n });\n // Arm the wait this send owes (a delivered prompt; fenced by the runs measured BEFORE it).\n const armed =\n undelivered === undefined\n ? armSend(db, { name, workstreamName: ws }, sent)\n : { armed: false as const };\n const warnings = armed.warning === undefined ? [] : [armed.warning];\n if (!opts.json && !opts.wait) for (const w of warnings) console.error(pc.yellow(`warning: ${w}`));\n if (opts.wait && sig !== undefined) {\n return enterSendWait(db, { name, workstreamName: ws }, sent, {\n sig,\n verb: \"mu agent send --wait\",\n undelivered: undelivered === undefined ? undefined : undelivered.message,\n receipt: {\n agentName: name,\n sentBytes: Buffer.byteLength(text),\n transport: sent.transport,\n ...(sent.runs !== undefined ? { runs: sent.runs } : {}),\n ...(sent.incarnation !== undefined ? { incarnation: sent.incarnation } : {}),\n ...(sent.msgId !== undefined ? { msgId: sent.msgId } : {}),\n ...(sent.receipt !== undefined ? { receipt: sent.receipt } : {}),\n },\n warnings,\n });\n }\n // ONE next: a delivered ctl reply with runs gives the exact wait baseline (the wait\n // returns the run's final text). An undelivered or mux send owes no wait.\n if (sent.transport === \"ctl\" && sent.runs !== undefined && undelivered === undefined) {\n setNextOutcome({\n kind: \"sent\",\n agent: { name, workstream: ws },\n runs: sent.runs,\n ...(sent.incarnation !== undefined ? { incarnation: sent.incarnation } : {}),\n });\n }\n if (opts.json) {\n emitJson({\n agentName: name,\n sentBytes: Buffer.byteLength(text),\n transport: sent.transport,\n fresh: opts.fresh === true,\n ...(sent.command !== undefined ? { command: sent.command } : {}),\n ...(sent.state !== undefined ? { state: sent.state } : {}),\n ...(sent.runs !== undefined ? { runs: sent.runs } : {}),\n ...(sent.incarnation !== undefined ? { incarnation: sent.incarnation } : {}),\n ...(sent.msgId !== undefined ? { msgId: sent.msgId, delivery: \"delivered\" } : {}),\n ...(sent.receipt !== undefined ? { receipt: sent.receipt } : {}),\n delivered: undelivered === undefined,\n ...(undelivered !== undefined\n ? { undelivered: { reason: undelivered.reason, message: undelivered.message } }\n : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n });\n return;\n }\n if (undelivered !== undefined) {\n console.error(pc.yellow(`warning: ${undelivered.message}`));\n } else {\n const how =\n sent.transport === \"mux\"\n ? \"via mux\"\n : opts.fresh\n ? \"via ctl, fresh session\"\n : sent.command !== undefined\n ? `via ctl, pi ran /${sent.command}`\n : sent.runs !== undefined\n ? `via ctl, pi was ${sent.state ?? \"?\"}, runs ${sent.runs}`\n : `via ctl, pi ${sent.state ?? \"?\"}`;\n const receipt =\n sent.receipt === undefined ? \"\" : \"; no reply, but its receipt confirms it landed\";\n console.log(pc.dim(`sent ${Buffer.byteLength(text)} bytes to ${name} (${how}${receipt})`));\n }\n}\n\n/**\n * `send --wait`: the prompt is delivered (and armed); now wait for exactly the run it\n * started: one explicit agent ref pinned by the measured runs + incarnation, `all` mode so a\n * sibling's event does not end it (an urgent one still does: the worker died, a dialog, a\n * delegate report). ONE document: the wait's, with the send's receipt as `sent`.\n * An UNDELIVERED send waits for nothing: it fails with the receipt (the prompt may not have landed).\n */\nasync function enterSendWait(\n db: Db,\n agent: { name: string; workstreamName: string },\n sent: { transport?: \"ctl\" | \"mux\"; runs?: number; incarnation?: string },\n o: {\n sig: WaitSignals;\n verb: string;\n receipt: Record<string, unknown>;\n warnings: string[];\n undelivered?: string | undefined;\n },\n): Promise<void> {\n if (o.undelivered !== undefined) {\n throw new CliExitError(1, {\n error: \"SendUndelivered\",\n message: say(\"agent.send_undelivered\", o.undelivered),\n data: { sent: { ...o.receipt, delivered: false } },\n });\n }\n const ref: WaitRef = {\n kind: \"agent\",\n workstream: agent.workstreamName,\n id: agent.name,\n ...(sent.transport !== \"mux\" && sent.runs !== undefined ? { afterRuns: sent.runs } : {}),\n ...(sent.transport !== \"mux\" && sent.incarnation !== undefined\n ? { incarnation: sent.incarnation }\n : {}),\n };\n await runWait(\n db,\n {\n refs: [ref],\n mode: \"all\",\n onStall: \"exit\",\n verb: o.verb,\n scope: agent.workstreamName,\n },\n o.sig,\n {\n extraData: {\n sent: { ...o.receipt, delivered: true },\n ...(o.warnings.length > 0 ? { warnings: o.warnings } : {}),\n },\n },\n );\n}\n\n/** `mu agent send --interrupt`: abort a busy pi, wait for settle, send. */\nasync function cmdSendInterrupt(\n db: Db,\n rawName: string,\n text: string,\n opts: { workstream?: string; json?: boolean; timeout?: number; wait?: boolean },\n sig?: WaitSignals,\n): Promise<void> {\n const { name } = await resolveEntityRef(db, rawName, opts, \"agent\");\n assertAgentInWorkstream(db, name, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const r = await interruptAgent(db, name, text, {\n workstream: ws,\n ...(opts.timeout === undefined ? {} : { timeoutMs: Math.round(opts.timeout * 1000) }),\n });\n // The interrupt is delivered (it threw otherwise): arm the run it started, same fence rule.\n const armed = armSend(db, { name, workstreamName: ws }, { transport: \"ctl\", ...r });\n const warnings = armed.warning === undefined ? [] : [armed.warning];\n if (!opts.json && !opts.wait) for (const w of warnings) console.error(pc.yellow(`warning: ${w}`));\n if (opts.wait && sig !== undefined) {\n return enterSendWait(\n db,\n { name, workstreamName: ws },\n { transport: \"ctl\", ...r },\n {\n sig,\n verb: \"mu agent send --interrupt --wait\",\n receipt: {\n agentName: name,\n sentBytes: Buffer.byteLength(text),\n transport: \"ctl\",\n interrupt: true,\n wasBusy: r.wasBusy,\n ...(r.pending ? { pending: true } : {}),\n ...(r.runs !== undefined ? { runs: r.runs } : {}),\n ...(r.incarnation !== undefined ? { incarnation: r.incarnation } : {}),\n msgId: r.msgId,\n ...(r.receipt !== undefined ? { receipt: r.receipt } : {}),\n },\n warnings,\n },\n );\n }\n if (r.runs !== undefined) {\n setNextOutcome({\n kind: \"sent\",\n agent: { name, workstream: ws },\n runs: r.runs,\n ...(r.incarnation !== undefined ? { incarnation: r.incarnation } : {}),\n });\n }\n if (opts.json) {\n emitJson({\n agentName: name,\n sentBytes: Buffer.byteLength(text),\n transport: \"ctl\",\n interrupt: true,\n ...r,\n ...(r.msgId !== undefined ? { delivery: \"delivered\" } : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n });\n return;\n }\n const what = r.wasBusy ? \"interrupted a busy run\" : \"pi was idle\";\n const runs = r.runs !== undefined ? `, runs ${r.runs}` : \"\";\n const receipt = r.receipt === undefined ? \"\" : \"; no reply, but its receipt confirms it landed\";\n console.log(\n pc.dim(`sent ${Buffer.byteLength(text)} bytes to ${name} (via ctl, ${what}${runs}${receipt})`),\n );\n if (r.pending) console.log(pc.yellow(\"queued messages went back to the pane's editor unsent\"));\n}\n\n/** Lines in captured scrollback: a final newline ends the last line, it\n * does not start an empty one, and empty text has none. `scrollbackLines`\n * in `agent read --json` and `agent show --json` both mean this. */\nfunction countLines(text: string): number {\n if (text === \"\") return 0;\n return text.split(\"\\n\").length - (text.endsWith(\"\\n\") ? 1 : 0);\n}\n\nexport async function cmdRead(\n db: Db,\n rawName: string,\n opts: { lines?: number; workstream?: string; json?: boolean },\n): Promise<void> {\n const { name } = await resolveEntityRef(db, rawName, opts, \"agent\");\n assertAgentInWorkstream(db, name, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const text = await readAgent(db, name, {\n workstream: ws,\n ...(opts.lines !== undefined ? { lines: opts.lines } : {}),\n });\n if (opts.json) {\n emitJson({\n agentName: name,\n lines: opts.lines ?? null,\n scrollback: text,\n scrollbackLines: countLines(text),\n });\n return;\n }\n process.stdout.write(text);\n if (!text.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n}\n\nexport async function cmdList(\n db: Db,\n opts: { workstream?: string; json?: boolean },\n): Promise<void> {\n const workstream = await resolveExistingWorkstream(db, opts.workstream);\n const view = await listLiveAgents(db, { workstream });\n if (opts.json) {\n const wsId = workstreamIdOf(db, workstream);\n emitJson({\n workstreamName: workstream,\n agents: view.agents.map((a) => liveAgentToOutput(a, wsId)),\n orphans: view.orphans,\n });\n return;\n }\n console.log(pc.bold(`mu-${workstream}`));\n console.log(formatAgentsTable(view.agents));\n if (view.orphans.length > 0) {\n console.log(\"\");\n console.log(pc.yellow(`Orphan panes (${view.orphans.length})`));\n console.log(pc.dim(\" Panes that look like agents but aren't in the registry.\"));\n console.log(pc.dim(\" Kill one with tmux/herdr or ignore it.\"));\n for (const orphan of view.orphans) {\n console.log(` ${pc.dim(orphan.paneId)} cli=${orphan.command}`);\n }\n }\n}\n\nexport async function cmdAgentShow(\n db: Db,\n rawName: string,\n opts: { lines?: number; json?: boolean; workstream?: string },\n): Promise<void> {\n const { name } = await resolveEntityRef(db, rawName, opts, \"agent\");\n assertAgentInWorkstream(db, name, opts.workstream);\n // v5: agents.name is per-workstream unique. Resolve the operator's\n // workstream up front so the lookup scopes correctly.\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const agent = getAgent(db, name, ws);\n if (!agent) throw new AgentNotFoundError(name);\n const lines = opts.lines ?? 20;\n let scrollback: string;\n try {\n // Best-effort: `mu agent show` still has a registry row to print\n // when the mux is unreachable. Empty scrollback degrades the\n // status refresh below, it doesn't fail the verb.\n scrollback = await (await activeMux()).capture(agent.paneId, { lines });\n } catch {\n scrollback = \"\";\n }\n\n const reading = (await readAgentStates([agent], { stateDir: dirname(db.name) })).get(\n agentKey(agent),\n );\n const displayed = {\n ...agent,\n state: reading?.state ?? (\"unknown\" as const),\n source: reading?.source ?? (\"none\" as const),\n ctl: reading?.ctl ?? (\"n/a\" as const),\n since:\n reading?.since === null || reading?.since === undefined\n ? null\n : new Date(reading.since).toISOString(),\n ...(reading?.reason !== undefined ? { reason: reading.reason } : {}),\n };\n\n if (opts.json) {\n emitJson({\n agent: liveAgentToOutput(displayed, workstreamIdOf(db, agent.workstreamName)),\n scrollback,\n scrollbackLines: countLines(scrollback),\n });\n return;\n }\n\n console.log(pc.bold(`${displayed.name} ${statusIcon(displayed.state)} ${displayed.state}`));\n console.log(` workstream : ${agent.workstreamName}`);\n console.log(` cli : ${agent.cli}`);\n console.log(` pane : ${pc.dim(agent.paneId)}`);\n console.log(` window : ${agent.tab ?? agent.name}`);\n console.log(` role : ${agent.role}`);\n if (agent.host !== null) console.log(` host : ${agent.host}`);\n console.log(` cwd : ${agent.cwd ?? pc.dim(\"—\")}`);\n console.log(` created : ${pc.dim(agent.createdAt)}`);\n console.log(` updated : ${pc.dim(agent.updatedAt)}`);\n\n console.log(\"\");\n console.log(pc.bold(`Recent scrollback (last ${lines} lines)`));\n if (scrollback.trim() === \"\") {\n console.log(pc.dim(\" (pane gone or empty)\"));\n return;\n }\n for (const line of scrollback.replace(/\\n+$/, \"\").split(\"\\n\")) {\n console.log(` ${line}`);\n }\n}\n\n/**\n * `mu agent check <agent> <msgId>`: one `status {msgId}` probe. Exit 0\n * `accepted runs=<n> at=<iso>`; 3 `not-accepted` (the extension never took\n * it, or no longer remembers it: NOT proof it was never sent); 1 `unreachable` (no answer: still unknown).\n */\nexport async function cmdAgentCheck(\n db: Db,\n rawName: string,\n msgId: string,\n opts: { workstream?: string; json?: boolean } = {},\n): Promise<void> {\n const { name } = await resolveEntityRef(db, rawName, opts, \"agent\");\n assertAgentInWorkstream(db, name, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const agent = getAgent(db, name, ws);\n if (agent === undefined) throw new AgentNotFoundError(name, ws);\n const check = await checkMessage(agentCtlSocket(db, agent), msgId);\n const exit = check.state === \"accepted\" ? 0 : check.state === \"not-accepted\" ? 3 : 1;\n if (opts.json) {\n // A check that is not \"accepted\" fails with ONE document: the verdict\n // rides in `data`, the reason is the message.\n if (exit !== 0) {\n throw new CliExitError(exit, {\n error: check.state === \"unreachable\" ? \"AgentCtlUnreachableError\" : \"MessageNotAccepted\",\n message:\n check.state === \"unreachable\"\n ? check.reason\n : say(\"agent.check_not_accepted\", name, msgId),\n data: { agentName: name, ...check },\n });\n }\n emitJson({ agentName: name, ...check });\n } else if (check.state === \"accepted\") {\n const at = check.at === undefined ? \"?\" : new Date(check.at).toISOString();\n console.log(`accepted runs=${check.runs ?? \"?\"} at=${at}`);\n } else if (check.state === \"not-accepted\") {\n console.log(\"not-accepted\");\n } else {\n console.log(\"unreachable\");\n console.error(pc.dim(check.reason));\n }\n if (exit !== 0) throw new CliExitError(exit);\n}\n\nexport async function cmdAbort(\n db: Db,\n rawName: string,\n opts: { workstream?: string; timeout?: number; json?: boolean } = {},\n): Promise<void> {\n const { name } = await resolveEntityRef(db, rawName, opts, \"agent\");\n assertAgentInWorkstream(db, name, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const result = await abortAgent(db, name, {\n workstream: ws,\n ...(opts.timeout === undefined ? {} : { timeoutMs: Math.round(opts.timeout * 1000) }),\n });\n if (opts.json) {\n emitJson(result);\n return;\n }\n console.log(\n result.aborted\n ? `Aborted ${pc.bold(name)} ${pc.dim(`(${result.before} → ${result.after} in ${result.elapsedMs}ms)`)}`\n : `${pc.bold(name)} was ${result.before}; nothing to abort`,\n );\n}\n\n/** One agent of the `mu agent wait` document (the extension reads these fields; JSON drops the undefined ones). A gate that exited nonzero is a failure here: never a clean finish. */\nfunction agentWaitState(\n ref: { workstreamName: string; name: string },\n snap: WaitSnapshot | undefined,\n) {\n const failedGate = snap?.exit !== undefined && snap.exit !== 0;\n return {\n ...ref,\n status: (snap?.status ?? null) as RuntimeState | null,\n wasBusy: snap?.wasBusy === true,\n fired: snap?.fired === true && !failedGate,\n dead: snap?.dead === true || failedGate,\n exit: snap?.exit,\n unknownReason: snap?.unknownReason,\n lastText: snap?.lastText,\n lastError: snap?.lastError,\n sessionFile: snap?.sessionFile,\n blocked: snap?.blocked,\n afterRuns: snap?.afterRuns,\n };\n}\n\n/**\n * `mu agent wait <names...>` — block until agents finish working.\n *\n * The task-less, agent-keyed form of `mu wait` (same engine, own document): scratch / off-the-cuff\n * helpers have no task in the DAG, so the only \"done\" signal is the\n * agent's own runtime status. An agent fires when it goes **busy → any\n * other state** (it must be observed busy first, so an already-idle\n * agent doesn't fire instantly — you're waiting for THIS work to end).\n *\n * One timeout rule with `mu wait`: a timeout is ok:true with `timedOut`, exit 0;\n * run the same command again to keep waiting (`--after-runs` makes that lossless:\n * a run that settled in between still fires). Exit 6 = a watched agent's pane died; 7 = a pi agent is\n * waiting on an extension dialog (needs a human).\n * `--any`/`--first` fire on the first agent; default = all must fire.\n * `--first` additionally prints the firing agent's qualified ref.\n */\nexport async function cmdAgentWait(\n db: Db,\n rawNames: readonly string[],\n opts: {\n any?: boolean;\n first?: boolean;\n timeout?: number;\n afterRuns?: number;\n /** pi's incarnation from `send --json`: refuse to wait on another pi process. */\n inc?: string;\n workstream?: string;\n json?: boolean;\n },\n): Promise<void> {\n if (rawNames.length === 0) {\n throw new UsageError(say(\"agent.wait_names\"));\n }\n // --first is a CLI alias for --any with a richer output shape.\n const wantAny = opts.any === true || opts.first === true;\n\n // Resolve each ref — cross-workstream-aware via `<ws>/<name>`; bare\n // names resolve through -w or the injected worker scope.\n const refs = await Promise.all(\n rawNames.map(async (raw) => {\n const local: { workstream?: string } = { workstream: opts.workstream };\n const name = applyQualifiedRef(raw, local);\n const workstreamName = await resolveExistingWorkstream(db, local.workstream);\n return { name, workstreamName };\n }),\n );\n\n // --after-runs is a ctl run count: refuse an agent that has none\n // rather than silently polling it with no baseline.\n if (opts.afterRuns !== undefined) {\n for (const ref of refs) {\n const agent = getAgent(db, ref.name, ref.workstreamName);\n if (agent !== undefined && !expectsCtl(agent, agentCtlSocket(db, agent))) {\n throw new UsageError(\n say(\"agent.wait_after_runs_pi\", `${ref.workstreamName}/${ref.name}`, agent.cli),\n );\n }\n }\n }\n\n // --inc pins the pi process the run belongs to: it needs an extension that\n // reports incarnations (else AgentExtensionOutdatedError with the reload\n // ladder), and it only makes sense for pi agents.\n if (opts.inc !== undefined) {\n if (rawNames.length > 1) {\n throw new UsageError(say(\"agent.wait_inc_one\"));\n }\n for (const ref of refs) {\n const agent = getAgent(db, ref.name, ref.workstreamName);\n if (agent === undefined) continue;\n const sock = agentCtlSocket(db, agent);\n if (!expectsCtl(agent, sock)) {\n throw new UsageError(\n say(\"agent.wait_inc_pi\", `${ref.workstreamName}/${ref.name}`, agent.cli),\n );\n }\n await requireFeature(agent, sock, \"incarnation\");\n }\n }\n\n // `waitForEvents` over these refs only: no caller, no CLOSE applied, no sync. pi agents wait on\n // the ctl `wait` (src/wait-ctl.ts), resolved by the extension on agent_settled; `afterRuns` is\n // --after-runs (the `runs` a send replied with, so a run that settled before this wait still\n // counts), else a status read taken BEFORE the wait starts.\n const res = await waitForEvents(\n db,\n refs.map((r) => ({\n kind: \"agent\" as const,\n workstream: r.workstreamName,\n id: r.name,\n ...(opts.afterRuns !== undefined ? { afterRuns: opts.afterRuns } : {}),\n ...(opts.inc !== undefined ? { incarnation: opts.inc } : {}),\n })),\n {\n callers: [],\n mode: wantAny ? \"first\" : \"all\",\n eventScope: \"refs\",\n stuckAfterMs: 0,\n uncapped: true,\n timeoutMs: (opts.timeout ?? 600) * 1000,\n sync: false,\n applyClose: false,\n ...ctlAgentHooks(db),\n onInitialUnknown: (snaps) => {\n // --json carries the same reasons per agent (`unknownReason`) in the document.\n if (opts.json) return;\n const names = snaps.map((s) => `${s.ref.workstream}/${s.ref.id}`).join(\", \");\n const reasons = [...new Set(snaps.map((s) => s.unknownReason ?? \"no reason\"))].join(\", \");\n process.stderr.write(say(\"agent.wait_unknown\", names, reasons));\n },\n },\n );\n const byKey = new Map(res.refs.map((s) => [`${s.ref.workstream}/${s.ref.id}`, s]));\n const result = {\n timedOut: res.timedOut,\n agents: refs.map((ref) => agentWaitState(ref, byKey.get(`${ref.workstreamName}/${ref.name}`))),\n };\n\n const dead = result.agents.filter((a) => a.dead);\n const blocked = result.agents.filter((a) => a.blocked !== undefined);\n const fired = result.agents.filter((a) => a.fired);\n // --any and --first share one contract: the result names the agent that fired.\n const firing = wantAny && fired.length > 0 ? fired[0] : null;\n const qualified = (a: { workstreamName: string; name: string }): string =>\n `${a.workstreamName}/${a.name}`;\n if (opts.json) {\n emitJson({\n agents: result.agents.map((a) => ({\n ...a,\n outcome: delegateOutcome(a, result.timedOut),\n })),\n timedOut: result.timedOut,\n ...(firing ? { firing: { workstream: firing.workstreamName, name: firing.name } } : {}),\n ...(dead.length > 0 ? { dead: dead.map(qualified) } : {}),\n });\n } else {\n // A dead pane is reported whenever one happened, even beside agents\n // that fired: the wait counts a death as done, so \"All N finished\"\n // would hide a crashed worker.\n if (dead.length > 0) {\n console.log(pc.red(`Agent pane(s) died: ${dead.map(qualified).join(\", \")}`));\n }\n for (const a of blocked) {\n const why = a.blocked ? blockedReason(a.blocked) : \"dialog\";\n console.log(pc.magenta(`${qualified(a)} is waiting on a ${why}; its run is not finished`));\n }\n // A blocked run is not finished: the dialog lines above say so.\n if (blocked.length === 0 && result.timedOut) {\n console.log(\n pc.yellow(\n `Timed out after ${opts.timeout ?? 600}s; ${fired.length}/${result.agents.length} finished`,\n ),\n );\n } else if (blocked.length === 0 && firing) {\n console.log(`${pc.bold(qualified(firing))} finished`);\n } else if (blocked.length === 0 && fired.length === result.agents.length) {\n console.log(`All ${result.agents.length} agent(s) finished`);\n } else if (blocked.length === 0 && fired.length > 0) {\n // --any, or --all where the rest died: name who finished.\n console.log(\n `${fired.map(qualified).join(\", \")} finished (${fired.length}/${result.agents.length})`,\n );\n }\n }\n\n // 6 (a watched pane died, even when others finished) wins over 7 (a dialog);\n // a met condition and a timeout are both 0 (`timedOut` says which).\n if (dead.length > 0) {\n process.exitCode = 6;\n } else if (blocked.length > 0) {\n process.exitCode = 7;\n }\n}\n\n// ─── commander wiring ──────────────────────────────────────────\n//\n// wireAgentCommands is called by buildProgram() in src/cli.ts. Wired here so\n// every per-namespace builder lives next to its cmd functions.\n\nimport type { Command } from \"commander\";\nimport {\n handle,\n JSON_OPT,\n normalizeInheritedWorkstream,\n parseLines,\n parseNonNegativeInt,\n parsePositiveNumber,\n parseSeconds,\n WORKSTREAM_OPT,\n} from \"../cli.js\";\n// wireSelfCommands needs cmdMyTasks / cmdMyNext which live in cli/tasks.ts\n// (they're task queries scoped to the resolved-self agent). Lateral\n// cluster→cluster import documented as the single intentional edge.\nimport { cmdState } from \"./state.js\";\nimport { cmdMyNext, cmdMyTasks } from \"./tasks.js\";\n\nexport function wireAgentCommands(program: Command): void {\n const agent = program\n .command(\"agent\")\n .description(\"Agent-level commands\")\n // Every agent verb needs a multiplexer, including the ones that only\n // read a registry row (show): no backend at all is exit 5\n // with the install line, before any DB or scope work.\n .hook(\"preAction\", async () => {\n await activeMux();\n });\n\n agent\n .command(\"spawn <name>\")\n .description(\"Spawn a new agent in a mux pane\")\n .option(\n \"--cli <cli>\",\n \"agent CLI key (default: pi); also used as the lookup key for $MU_<UPPER_CLI>_COMMAND, e.g. --cli pi_big resolves $MU_PI_BIG_COMMAND. Omitted, a --host --command that is not pi is a command gate\",\n )\n .option(\n \"--command <cmd>\",\n \"executable to run in the pane (defaults to $MU_<CLI>_COMMAND or the cli value)\",\n )\n .option(\"--tab <tab>\", \"mux window/tab name to group under (defaults to agent name)\")\n .option(\"--role <role>\", \"full-access | read-only\", \"full-access\")\n .option(\n \"--cwd <dir>\",\n \"directory the pane starts in (default: yours); conflicts with --worktree\",\n )\n .option(\n \"--worktree\",\n \"run in its own git worktree (git worktree add --detach under the state dir); its path is the cwd\",\n )\n .option(\"--from <ref>\", \"with --worktree: start at this commit or branch (default: HEAD)\")\n .option(\n \"--root <repo>\",\n \"with --worktree: the repo to add it to (default: the git root of your cwd). With --host: a REMOTE repo (default the profile's --repo), also without --worktree, as the start directory\",\n )\n .option(\n \"--host <profile>\",\n \"run on this host profile (mu host add): the pane runs its --shell template, which starts the remote pi and forwards its control socket here; --cwd and --worktree name REMOTE paths (the worktree is made by its --exec, under ~/.local/state/mu-next/remote-worktrees/<ws>/<name>); --root names the remote repo; the pane dying is the agent dying. tmux only\",\n )\n .option(\"--no-ctl\", \"skip the control-socket handshake with the mu pi extension\")\n .option(\n \"--next-free\",\n \"if <name> is taken, take the next free one (worker-1 → worker-2, review → review-2); --json's agent.name says which\",\n )\n .option(\n \"--send <text>\",\n \"send this text once the agent is up (one mu call for spawn + send; `-` reads stdin). A failed send keeps the pane and exits non-zero; --json still prints the spawn with send.error\",\n )\n .option(\n \"--task <id>\",\n \"bind the spawn to this task: claim it for the new agent after the pane exists, then send --send's text (default: the task's brief note, else its title) as its brief (pinned once delivered, kept when the task already has one). One journaled attempt: a failure before the send rolls back its own pane and claim; an unknown delivery keeps both and is never resent\",\n )\n .option(\n \"--attempt <key>\",\n \"with --task: name this attempt (default: the task id). The same key replays its saved outcome and never sends a second prompt; reopened work needs a new key\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as {\n nextFree?: boolean;\n host?: string;\n send?: string;\n task?: string;\n attempt?: string;\n cli?: string;\n command?: string;\n tab?: string;\n role?: string;\n cwd?: string;\n workstream?: string;\n worktree?: boolean;\n from?: string;\n root?: string;\n ctl?: boolean;\n json?: boolean;\n };\n const sig = installWaitSignals();\n const run = handle((db) => cmdSpawn(db, name, opts, sig), this as Command);\n return run().finally(() => sig.dispose());\n });\n\n agent\n .command(\"send <name> <text>\")\n .description(\n \"Send text to an agent: pi through its control socket (no paste fallback), other CLIs on herdr only. --fresh = new session + send in one step. Text `-` reads stdin: mu agent send <name> - <<'EOF' for prose.\",\n )\n .option(\n \"--steer\",\n \"if pi is busy, deliver after the current tool calls finish, before the next model call (default: after the run ends); does not stop a running tool: use --interrupt\",\n )\n .option(\n \"--interrupt\",\n \"pi only: if busy, abort the current run (kills the running tool; queued messages go back to the editor), wait for pi to settle, then send the text as a new run. Exit 5 if pi does not settle; the text is then not sent\",\n )\n .option(\n \"--timeout <seconds>\",\n \"with --interrupt: max seconds to wait for pi to settle (default 30)\",\n parsePositiveNumber,\n )\n .option(\n \"--fresh\",\n \"pi only: new session + this prompt, one operation (refused with exit 4 while pi is busy)\",\n )\n .option(\n \"--force\",\n \"with --fresh or a pi /new, /reload, /compact: abandon a running turn instead of refusing\",\n )\n .option(\n \"--wait\",\n \"after the send, wait for exactly the run it started and print the wait's ONE JSON result (`data.sent` is the send's receipt, `data.snapshots[].lastText` the answer; `mu wait` semantics: SIGINT/SIGTERM print a snapshot and a `resume`). Not for slash commands\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string, text: string) {\n const opts = (this as Command).opts() as {\n workstream?: string;\n json?: boolean;\n steer?: boolean;\n fresh?: boolean;\n force?: boolean;\n interrupt?: boolean;\n timeout?: number;\n wait?: boolean;\n };\n // --wait: listen before the DB opens, like `mu wait` (a signal during setup still prints a snapshot).\n const sig = opts.wait ? installWaitSignals() : undefined;\n const run = handle((db) => cmdSend(db, name, text, opts, sig), this as Command)();\n return sig === undefined ? run : run.finally(() => sig.dispose());\n });\n\n agent\n .command(\"check <name> <msgId>\")\n .description(\n \"Ask whether a send landed: one status probe for its msgId. Prints `accepted runs=<n> at=<iso>` (0), `not-accepted` (3; an evicted or in-flight send reads the same: read the pane before resending) or `unreachable` (1).\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string, msgId: string) {\n const opts = (this as Command).optsWithGlobals() as {\n workstream?: string | string[];\n json?: boolean;\n };\n return handle(\n (db) =>\n cmdAgentCheck(db, name, msgId, {\n ...opts,\n workstream: normalizeInheritedWorkstream(opts.workstream),\n }),\n this as Command,\n )();\n });\n\n agent\n .command(\"read <name>\")\n .description(\"Read an agent's pane scrollback\")\n .option(\"-n, --lines <n>\", \"show last N lines (default: full scrollback)\", parseLines)\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as {\n lines?: number;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdRead(db, name, opts), this as Command)();\n });\n\n agent\n .command(\"list\")\n .description(\n \"List agents in the current workstream (reconciled with the active mux). One JSON document by default; --table for the human table\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .option(\"--table\", \"print the human table instead of the JSON document\")\n .action(function () {\n const opts = (this as Command).opts() as {\n workstream?: string;\n json?: boolean;\n table?: boolean;\n };\n // JSON unless --table; an explicit --json wins (isJsonMode reads argv the same way).\n opts.json = opts.json === true || opts.table !== true;\n return handle((db) => cmdList(db, opts), this as Command)();\n });\n\n agent\n .command(\"show <name>\")\n .description(\"Show an agent: registry row + recent scrollback (last N lines, default 20)\")\n .option(\"-n, --lines <n>\", \"how many scrollback lines to show (default 20)\", parseLines)\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as {\n lines?: number;\n json?: boolean;\n workstream?: string;\n };\n return handle((db) => cmdAgentShow(db, name, opts), this as Command)();\n });\n\n wireCloseCommand(agent);\n wireCollectCommand(agent);\n\n // `mu agent abort` — stop a pi agent's turn through its control socket.\n agent\n .command(\"abort <name>\")\n .description(\n \"Stop a pi agent's current turn over its control socket (Esc) and wait for pi to settle; idle agents are left alone; a queued follow-up returns to the editor unsent. Exit 5 if still busy after --timeout. Non-pi: `mu agent close`.\",\n )\n .option(\n \"--timeout <seconds>\",\n \"max seconds to wait for pi to settle (default 30)\",\n parsePositiveNumber,\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as {\n workstream?: string;\n timeout?: number;\n json?: boolean;\n };\n return handle((db) => cmdAbort(db, name, opts), this as Command)();\n });\n\n // `mu agent wait` — the task-less, agent-keyed form of `mu wait`. Block\n // until agents finish (busy → any other state). For scratch /\n // off-the-cuff helpers that own no task to wait on.\n agent\n .command(\"wait <names...>\")\n .description(\n \"Block until agents leave busy; fires on needs_input too. For task work prefer `mu wait`. A pi agent opening a dialog ends it as `blocked`. Exit 0 met or timed out (`timedOut`), 6 pane died, 7 dialog.\",\n )\n .option(\"--any\", \"succeed as soon as ONE listed agent finishes (default: all)\")\n .option(\"--first\", \"alias for --any that also prints the firing agent's ref\")\n .option(\n \"--timeout <seconds>\",\n \"max seconds to wait, fractions allowed (0 = forever, default 600)\",\n parseSeconds,\n )\n .option(\n \"--after-runs <n>\",\n \"pi agents only: fire on the first run settled past N (the `runs` that `mu agent send --json` printed), even one that settled before this wait started. One N applies to every named agent\",\n parseNonNegativeInt,\n )\n .option(\n \"--inc <incarnation>\",\n \"pi agents only: the `incarnation` that `mu agent send --json` printed. Refuses (exit 4) when the agent restarted since: its run is gone\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (names: string[]) {\n const opts = (this as Command).optsWithGlobals() as {\n any?: boolean;\n first?: boolean;\n timeout?: number;\n afterRuns?: number;\n inc?: string;\n workstream?: string | string[];\n json?: boolean;\n };\n return handle(\n (db) =>\n cmdAgentWait(db, names, {\n ...opts,\n workstream: normalizeInheritedWorkstream(opts.workstream),\n }),\n this as Command,\n )();\n });\n\n // ─── task ───────────────────────────────────────────────────────────\n}\n\nexport function wireSelfCommands(program: Command): void {\n // `mu me` IS `mu state --me` (src/cli/state.ts): one identity path, one JSON read.\n // mu me tasks — just the owned-tasks records (paged)\n // mu me next [-n K] — top-K ready in the agent's workstream\n const me = program\n .command(\"me\")\n .description(\n \"The caller's own state, exactly `mu state --me`: identity ($MU_AGENT_NAME in $MU_WORKSTREAM, or pi:$PI_SESSION_ID; never a pane), owned and ready tasks, its delegates and human needs. `mu me tasks` / `mu me next [-n K]` list them.\",\n )\n .option(...JSON_OPT)\n .option(\"--full\", \"no cap: the whole read (a cut result names `mu state --me --full`)\")\n .action(function () {\n const opts = (this as Command).opts() as { full?: boolean };\n return handle((db) => cmdState(db, { me: true, ...opts }), this as Command)();\n });\n\n me.command(\"tasks\")\n .description(\n \"List tasks owned by the current agent (the second half of `mu me`'s output). Excludes CLOSED by default.\",\n )\n .option(\"--include-closed\", \"include CLOSED tasks in the list\")\n .option(\"--all\", \"no cap: every record, whole (a cut result names this command)\")\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).opts() as {\n json?: boolean;\n includeClosed?: boolean;\n all?: boolean;\n };\n return handle((db) => cmdMyTasks(db, opts), this as Command)();\n });\n\n me.command(\"next\")\n .description(\n \"Top-K ready tasks in the current agent's workstream (alias for `task next -w <self.workstream>`)\",\n )\n .option(\n \"-n, --lines <k>\",\n \"how many top-K tasks to return (default 1; 0 = all ready)\",\n parseLines,\n )\n .option(\"--all\", \"no cap: every record, whole (a cut result names this command)\")\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).opts() as { lines?: number; json?: boolean; all?: boolean };\n return handle((db) => cmdMyNext(db, opts), this as Command)();\n });\n}\n","// mu — Levenshtein distance, shared by the did-you-mean hints (unknown verb, wrong column, unknown workstream).\n// Leaf module: imports nothing.\n\n/** Levenshtein distance between `a` and `b`. */\nexport function editDistance(a: string, b: string): number {\n let prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const row = [i];\n for (let j = 1; j <= b.length; j++) {\n row.push(\n Math.min(\n (prev[j] as number) + 1,\n (row[j - 1] as number) + 1,\n (prev[j - 1] as number) + (a[i - 1] === b[j - 1] ? 0 : 1),\n ),\n );\n }\n prev = row;\n }\n return prev[b.length] as number;\n}\n","// mu — typed-error → exit-code mapping + CLI handler wrapper.\n//\n// classifyError + emitError + handle live here so cli.ts is just argument parsing /\n// workstream resolution / program wiring; the typed-error catalogue\n// belongs next to its own helper. cli.ts re-exports `classifyError`\n// and `handle` for back-compat with existing tests + cli/* importers.\n//\n// Exit codes (docs/guide/sql.md § Script with --json):\n// 0 = success\n// 1 = generic error\n// 2 = usage error (validation / missing-flag / type / mutex /\n// unknown subcommand) — commander-detected mistakes AND\n// handler-thrown UsageError. Both surfaces print the failing\n// subcommand's --help (human path) or include a structured\n// `usage` field (--json path).\n// 3 = not found (no such agent / task / pane)\n// 4 = conflict (name collision, double-claim, cycle, etc.)\n// 5 = substrate unavailable or unsafe (no multiplexer, DB locked,\n// ops-log drift, a `mu doctor` FAIL row, an abort/interrupt that\n// did not settle in time; a wait timeout is NOT here: it is exit 0)\n// 6 / 7 = `mu wait` results, not errors: an owner died / needs attention\n// (`WaitResult.exit`, src/wait.ts); no error class maps here.\n\nimport { type Command, CommanderError } from \"commander\";\nimport {\n AgentAbortNeedsCtlError,\n AgentAbortTimeoutError,\n AgentBusyError,\n AgentCtlUnreachableError,\n AgentDiedOnSpawnError,\n AgentEmptySendError,\n AgentExistsError,\n AgentExtensionOutdatedError,\n AgentFreshNeedsCtlError,\n AgentLockBusyError,\n AgentNameExhaustedError,\n AgentNotFoundError,\n AgentNotInWorkstreamError,\n AgentPaneStillAliveError,\n AgentReplacedError,\n AgentRestartedError,\n AgentSendIndeterminateError,\n AgentSendUnsupportedError,\n AgentSlashCommandUnsupportedError,\n AgentSpawnCliNotFoundError,\n AgentSpawnStartupError,\n SpawnAttemptBusyError,\n SpawnAttemptFailedError,\n SpawnAttemptGuardError,\n SpawnReceiptConflictError,\n SpawnTaskStateError,\n SpawnTrustDialogError,\n} from \"../agents.js\";\nimport {\n type Db,\n defaultDbPath,\n openDb,\n SchemaTooNewError,\n SchemaTooOldError,\n SqliteTooOldError,\n WorkstreamNotFoundError,\n} from \"../db.js\";\nimport {\n DelegateCallConflictError,\n DelegateNotFoundError,\n DelegateStateError,\n} from \"../delegates.js\";\nimport { DriftDetectedError } from \"../drift.js\";\nimport { editDistance } from \"../edit-distance.js\";\nimport { checkDbInsideSyncDir, DbInsideSyncDirError, HazardFailError } from \"../fleet-hazards.js\";\nimport {\n HostChannelBusyError,\n HostCheckFailedError,\n HostExistsError,\n HostInUseError,\n HostNotFoundError,\n HostProfileError,\n HostSpawnUnsupportedError,\n} from \"../hosts.js\";\nimport { HumanNeededInvalidError } from \"../human-needed.js\";\nimport { GroupIdAmbiguousError, GroupNotFoundError, LogKindReservedError } from \"../logs.js\";\nimport {\n HerdrCommandOverrideError,\n HerdrUnsupportedCliError,\n HerdrWorkspaceGroupCloseError,\n MuxError,\n NoMultiplexerError,\n PaneNotFoundError,\n} from \"../mux.js\";\nimport { NextArgError } from \"../next.js\";\nimport { capPlan, computeNext, NEXT_BYTES, type NextOutcome } from \"../next-hints.js\";\nimport {\n isAgentListArgv,\n isJsonMode,\n isStateVerbArgv,\n pc,\n printUsageHuman,\n usageLines,\n} from \"../output.js\";\nimport { encodeEnvelope, type NextPlan, RESULT_BYTES } from \"../output-contract.js\";\nimport { RebuildTargetExistsError, RebuildTargetIsSourceError } from \"../rebuild.js\";\nimport { RemoteCloseRefusedError, RemotePrepareError } from \"../remote-agent.js\";\nimport { RemoteCollectError, RemoteCollectUnsupportedError } from \"../remote-collect.js\";\nimport { RemoteRecoveryRefusedError } from \"../remote-recovery.js\";\nimport { RevisionMismatchError } from \"../revision.js\";\nimport { syncDir } from \"../segments.js\";\nimport {\n ambientFlush,\n ambientIngest,\n SyncPeerNotFoundError,\n SyncPeerRefAmbiguousError,\n SyncSourceNotFoundError,\n SyncSourceTooNewError,\n syncEnabled,\n} from \"../sync.js\";\nimport { assertSyncDirV2, SyncDirForeignError } from \"../sync-dir-guard.js\";\nimport { TaskAutoArgError, TaskAutoRefusedError } from \"../task-auto.js\";\nimport { TaskBriefMissingError } from \"../task-brief.js\";\nimport { candidateTaskIds } from \"../tasks/id.js\";\nimport {\n ClaimerNotRegisteredError,\n CloseNeedsEvidenceError,\n CrossWorkstreamEdgeError,\n CycleError,\n HumanTaskError,\n InvalidSubstateError,\n SubstateReasonRequiredError,\n TaskAlreadyOwnedError,\n TaskExistsError,\n TaskHasOpenBlockersError,\n TaskIdInvalidError,\n TaskInTriageError,\n TaskNoteRangeError,\n TaskNotFoundError,\n TaskNotInWorkstreamError,\n TaskParkedError,\n TaskParkStateError,\n TaskTitleSlugEmptyError,\n} from \"../tasks.js\";\nimport { currentCallers } from \"../wait-callers.js\";\nimport { WaitResumeNotFoundError } from \"../wait-resume.js\";\nimport { WaveNotFoundError } from \"../wait-types.js\";\nimport {\n WorkstreamExistsError,\n WorkstreamHasAgentsError,\n WorkstreamNameInvalidError,\n WorkstreamNameReservedError,\n WorkstreamPanesLiveError,\n WorkstreamRevisionMismatchError,\n WorkstreamSessionLiveError,\n} from \"../workstream.js\";\nimport {\n WorktreeBranchExistsError,\n WorktreeDirtyError,\n WorktreeHeldError,\n WorktreePathNotEmptyError,\n WorktreeVcsRequiredError,\n} from \"../worktree.js\";\n\nexport class UsageError extends Error {\n override readonly name: string = \"UsageError\";\n /** `false`: the message already names the fix, so emitError prints it\n * alone (exit 2) instead of following it with the verb's --help. */\n readonly showHelp: boolean;\n constructor(message: string, opts: { showHelp?: boolean } = {}) {\n super(message);\n this.showHelp = opts.showHelp ?? true;\n }\n}\n\n/** `mu db backup` was pointed at a file that exists: backup never overwrites. A collision, exit 4,\n * like `mu rebuild`'s (RebuildTargetExistsError). */\nexport class BackupTargetExistsError extends Error {\n override readonly name = \"BackupTargetExistsError\";\n constructor(public readonly path: string) {\n super(`${path} already exists: mu db backup never overwrites`);\n }\n}\n\n/** `mu db query` hit `no such column`: the message already names the columns\n * and the closest ones, so it is one line (exit 2, no help dump). */\nexport class SqlColumnError extends UsageError {\n override readonly name = \"SqlColumnError\";\n constructor(message: string) {\n super(message, { showHelp: false });\n }\n}\n\n/**\n * Internal CLI-control sentinel for handlers that already rendered their\n * success/partial-success payload and only need `handle()` to exit with a\n * non-zero code AFTER its DB-close finally has run. Unlike `UsageError` it\n * emits no stderr text; it is a return-code mechanism owned by handle().\n */\nexport class CliExitError extends Error {\n override readonly name = \"CliExitError\";\n constructor(\n public readonly exitCode: number,\n /** With `--json`: the ONE failure document (instead of a success one). */\n public readonly failure?: JsonFailure,\n ) {\n super(`exit ${exitCode}`);\n }\n}\n\n/** A failure document a verb builds itself: the error class and message, the\n * partial evidence it already produced (`data`), and receipts (`extra`). */\nexport interface JsonFailure {\n error: string;\n message: string;\n data?: unknown;\n extra?: Record<string, unknown>;\n}\n\n/** The sentinel for a verb that fails AFTER producing its report (doctor's\n * drift/hazard/no-mux): `--json` prints one failure document holding `data`,\n * with the real error's class, message and exit code. */\nexport function failureWithData(err: unknown, data: unknown): CliExitError {\n return new CliExitError(classifyError(err).exitCode, {\n error: err instanceof Error ? err.name : \"Error\",\n message: err instanceof Error ? err.message : String(err),\n data,\n });\n}\n\n// ─── The ONE finalisation of `next` ──────────────────────────────────\n//\n// Every result's `next` (success JSON, failure JSON, partial failure, human\n// text) is `finalNext()`: `computeNext` (src/next-hints.ts) over the DB\n// `handle()` holds open, read when the result is printed, so after the verb's\n// writes. A verb only DECLARES what it did (`setNextOutcome`) and its scope\n// (`setNextScope`, done by resolveWorkstream); it never builds a hint. Outside\n// `handle()` (parse errors, no DB) the plan is null.\n\nlet nextDb: Db | undefined;\nlet nextScope: string | undefined;\nlet nextOutcome: NextOutcome | undefined;\nlet nextArmed = false;\n\n/** What the verb did that a follow-up depends on (a delivered send, a preview, …). */\nexport function setNextOutcome(outcome: NextOutcome): void {\n nextOutcome = outcome;\n}\n\n/** The verb registered owed work (`armWait`): the bare wait may follow it. */\nexport function setNextArmed(): void {\n nextArmed = true;\n}\n\n/** The resolved workstream of the call (resolveWorkstream records it). */\nexport function setNextScope(workstream: string): void {\n nextScope = workstream;\n}\n\n/** The plan of this result, or null outside handle(). Best effort: a hint never fails a verb. */\nexport function finalNext(): NextPlan {\n if (nextDb === undefined) return null;\n try {\n return computeNext(nextDb, {\n callers: currentCallers(),\n armed: nextArmed,\n ...(nextScope !== undefined ? { workstream: nextScope } : {}),\n ...(nextOutcome !== undefined ? { outcome: nextOutcome } : {}),\n });\n } catch {\n return null;\n }\n}\n\n/**\n * The plan cut to what is left of the result budget once `base` (the document\n * with `next:null`) is counted: a seq is dropped whole, an alt from its tail.\n * A document already over budget (a brief is never cut) keeps NEXT_BYTES.\n */\nexport function fitNext(plan: NextPlan, baseBytes: number): NextPlan {\n const left = baseBytes > RESULT_BYTES ? NEXT_BYTES : RESULT_BYTES - baseBytes + 4;\n return capPlan(plan, Math.min(NEXT_BYTES, left)).next;\n}\n\n/** The human rendering of a plan: one `next:` line per command. */\nexport function printNext(plan: NextPlan, sink: \"stdout\" | \"stderr\"): void {\n if (plan === null) return;\n const out = sink === \"stderr\" ? console.error : console.log;\n const head = plan.mode === \"seq\" ? \"next (in order):\" : \"next:\";\n if (plan.commands.length === 1) out(pc.dim(`${head} ${plan.commands[0]}`));\n else {\n out(pc.dim(head));\n for (const c of plan.commands) out(pc.dim(` ${c}`));\n }\n}\n\n/** One failure document on STDOUT, its plan fitted to the budget. */\nfunction printFailure(env: {\n error: string;\n message: string;\n exit: number;\n extra?: Record<string, unknown>;\n data?: unknown;\n}): void {\n const doc = (next: NextPlan) => encodeEnvelope({ ok: false, ...env, next });\n console.log(doc(fitNext(finalNext(), Buffer.byteLength(doc(null)))));\n}\n\n// ─── Active-command tracking for the validation-error contract ──────\n//\n// `setActiveCommand` is called by `handle()` at the entry of every\n// .action() body. `emitError()` reads it to render the failing\n// subcommand's --help on usage errors. We thread it via module-local\n// state (mirror of `isJsonMode` reading process.argv) instead of\n// constructor-arg-ing every UsageError throw site — there are many\n// of them, several inside helpers (resolveWorkstream, parseStatusFilter)\n// that don't know which subcommand called them.\n//\n// Cleared in handle()'s finally so a sequence of test calls (which\n// re-use the process) doesn't bleed state across cases.\n\nlet activeCommand: Command | undefined;\n\n/** Map a commander.CommanderError to (exitCode, label). The codes that\n * represent successful early-exits (--help, --version) are mapped to\n * exitCode 0 and a sentinel label so emitError can short-circuit\n * without printing anything. All other codes are uniform exit 2 —\n * the documented \"usage error\" lane that handler-thrown UsageError\n * also occupies. */\nfunction classifyCommanderError(err: CommanderError): { label: string; exitCode: number } {\n if (\n err.code === \"commander.helpDisplayed\" ||\n err.code === \"commander.help\" ||\n err.code === \"commander.version\"\n ) {\n return { label: \"help\", exitCode: 0 };\n }\n // Everything else is a usage mistake (missing required option,\n // unknown option, unknown command, missing argument, type-coercion\n // via InvalidArgumentError). Renumber commander's default exit 1\n // to mu's documented exit 2 so the surface is uniform with the\n // handler-thrown UsageError lane.\n return { label: \"error\", exitCode: 2 };\n}\n\n/** Predicate: is this error a usage-class one for which we should\n * render the failing subcommand's --help? Three families:\n * 1. CommanderError (missing required option, unknown option,\n * unknown command, missing argument, type-coercion failure).\n * 2. UsageError (handler-thrown mutex / arity / range checks).\n * 3. Typed *Invalid* domain errors that fault on a value the\n * operator typed at the CLI (workstream name, task id, prune-flag\n * combination). The verb's --help would\n * have explained the constraint; show it.\n *\n */\nfunction isUsageClassError(err: unknown): boolean {\n if (err instanceof CommanderError) return true;\n if (err instanceof UsageError) return err.showHelp;\n if (\n // The verb's --help would explain a constraint on a value the operator typed. (A workstream\n // name, an empty slug: their messages name the fix, so they are one line, no help.)\n err instanceof WorkstreamNameReservedError ||\n err instanceof TaskIdInvalidError\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Raised when a bare entity name is used at the CLI but the resolution\n * context (no --workstream and no injected worker scope) is empty\n * AND the same name lives in two or more workstreams. Exit 4 (conflict)\n * via classifyError. The message names every candidate workstream.\n *\n * See verb_arg_qualified_workstream_name for the design.\n */\nexport class NameAmbiguousError extends Error {\n override readonly name = \"NameAmbiguousError\";\n constructor(\n public readonly entityName: string,\n public readonly candidates: readonly string[],\n public readonly kind: \"task\" | \"agent\",\n ) {\n super(\n `${kind} name \"${entityName}\" exists in ${candidates.length} workstreams (${candidates.join(\", \")}); pass -w <workstream> or use the qualified form <workstream>/${entityName}`,\n );\n }\n}\n\n/**\n * Map a typed error to (label, exitCode). The label is the prefix\n * before the message in human output (e.g. \"conflict\", \"not found\");\n * the exit code is what the process exits with.\n *\n * Order matters: more-specific classes first. The fallthrough at the\n * end is the generic exit-1 catch-all.\n */\nexport function classifyError(err: unknown): { label: string; exitCode: number } {\n if (\n err instanceof UsageError ||\n err instanceof TaskAutoArgError ||\n err instanceof NextArgError ||\n // `mu log --kind task|note|...`: a tag naming a projectable entity.\n err instanceof LogKindReservedError ||\n // abort on a non-pi agent: there is no control socket to carry it.\n err instanceof AgentAbortNeedsCtlError ||\n // send --fresh on an agent with no control socket: wrong recipe.\n err instanceof AgentFreshNeedsCtlError ||\n // an empty send or unsupported slash command to a pi agent: ctl cannot carry it.\n err instanceof AgentEmptySendError ||\n err instanceof AgentSlashCommandUnsupportedError ||\n err instanceof WorkstreamNameInvalidError ||\n err instanceof WorkstreamNameReservedError ||\n // A host profile field or template mu refuses: nothing is stored or run.\n err instanceof HostProfileError ||\n // collect on an agent with no remote worktree of its own.\n err instanceof RemoteCollectUnsupportedError ||\n // The active mux cannot run a profile's shell template: refused before any effect.\n err instanceof HostSpawnUnsupportedError ||\n // Same typed-*Invalid* class: a task id or a title the operator\n // typed that cannot become an id. isUsageClassError prints --help.\n err instanceof TaskIdInvalidError ||\n err instanceof TaskTitleSlugEmptyError ||\n // A close without its reason: a missing flag (--evidence, --why), whether the CLI, the SDK\n // or a `mu sql --write` guard found it. One lane (usage, 2), no help dump: the message\n // names the command.\n err instanceof CloseNeedsEvidenceError ||\n err instanceof SubstateReasonRequiredError ||\n // A blank reason or missing caller identity for `mu human-needed`.\n err instanceof HumanNeededInvalidError ||\n // The operator asked the ACTIVE backend for something it cannot do:\n // a `--cli` the mux does not recognise as an agent kind, or a\n // `--command` / `MU_<CLI>_COMMAND` override it cannot honour. The\n // substrate is healthy and answered precisely, so this is the usage\n // lane, not the exit-5 \"mux is down\" lane. Both refuse BEFORE any\n // side effect.\n err instanceof HerdrUnsupportedCliError ||\n err instanceof HerdrCommandOverrideError ||\n // herdr refused to close a workspace with linked worktree\n // workspaces. Same lane: the substrate answered precisely and only\n // the operator can decide whether those siblings may die.\n err instanceof HerdrWorkspaceGroupCloseError\n ) {\n return { label: \"error\", exitCode: 2 };\n }\n if (\n err instanceof AgentNotFoundError ||\n err instanceof DelegateNotFoundError ||\n err instanceof WaitResumeNotFoundError ||\n err instanceof WaveNotFoundError ||\n err instanceof TaskNotFoundError ||\n err instanceof TaskNoteRangeError ||\n err instanceof HostNotFoundError ||\n err instanceof WorkstreamNotFoundError\n ) {\n // WorkstreamNotFoundError originates inside resolveWorkstreamId\n // (src/db.ts) — it's the canonical resolve-time miss for the\n // first leg of the SDK boundary (operator-name → surrogate id).\n // Without this entry it fell through to generic exit 1, robbing\n // operators of the same -> exit-3 mapping that AgentNotFoundError /\n // TaskNotFoundError get. (schema_v5_cli_boundary)\n return { label: \"not found\", exitCode: 3 };\n }\n if (\n err instanceof NameAmbiguousError ||\n // A host profile that exists, is at its channel cap, or still holds channels.\n err instanceof HostExistsError ||\n err instanceof HostChannelBusyError ||\n // A remote worktree close refuses to remove (dirty, uncollected HEAD, moved).\n err instanceof RemoteCloseRefusedError ||\n // A recovery record that is ambiguous, claimed, changed or pinned to another profile.\n err instanceof RemoteRecoveryRefusedError ||\n err instanceof HostInUseError ||\n err instanceof AgentExistsError ||\n err instanceof AgentNameExhaustedError ||\n err instanceof TaskExistsError ||\n err instanceof BackupTargetExistsError ||\n err instanceof TaskAutoRefusedError ||\n err instanceof TaskBriefMissingError ||\n err instanceof DelegateCallConflictError ||\n err instanceof DelegateStateError ||\n err instanceof TaskAlreadyOwnedError ||\n err instanceof TaskHasOpenBlockersError ||\n // Substate refusals (ts_4): a park from the wrong phase, a claim on a\n // parked task, a pair outside TASK_SUBSTATES.\n err instanceof TaskParkStateError ||\n err instanceof TaskParkedError ||\n err instanceof HumanTaskError ||\n err instanceof TaskInTriageError ||\n err instanceof InvalidSubstateError ||\n err instanceof TaskNotInWorkstreamError ||\n err instanceof AgentNotInWorkstreamError ||\n err instanceof AgentSendUnsupportedError ||\n err instanceof CycleError ||\n err instanceof CrossWorkstreamEdgeError ||\n err instanceof WorktreeDirtyError ||\n err instanceof WorktreeBranchExistsError ||\n err instanceof WorktreeHeldError ||\n err instanceof WorktreePathNotEmptyError ||\n err instanceof WorktreeVcsRequiredError ||\n err instanceof ClaimerNotRegisteredError ||\n err instanceof SchemaTooOldError ||\n err instanceof SchemaTooNewError ||\n err instanceof SqliteTooOldError ||\n err instanceof SyncSourceTooNewError ||\n err instanceof DbInsideSyncDirError ||\n err instanceof SyncDirForeignError ||\n err instanceof WorkstreamExistsError ||\n err instanceof WorkstreamRevisionMismatchError ||\n err instanceof RevisionMismatchError ||\n err instanceof WorkstreamHasAgentsError ||\n err instanceof WorkstreamPanesLiveError ||\n err instanceof WorkstreamSessionLiveError ||\n // Rebuild refuses to overwrite an existing target or to write onto\n // the source DB: both are name/state collisions, not usage errors.\n err instanceof RebuildTargetExistsError ||\n err instanceof RebuildTargetIsSourceError ||\n // An abbreviated group id matching several groups: the operator must\n // disambiguate. Guessing could pick the wrong group.\n err instanceof GroupIdAmbiguousError\n ) {\n return { label: \"conflict\", exitCode: 4 };\n }\n if (\n err instanceof GroupNotFoundError ||\n // A `--repair <peer>` ref or a `--from <path>` that names nothing:\n // the same resolve-time-miss lane as every other not-found.\n err instanceof SyncPeerNotFoundError ||\n err instanceof SyncSourceNotFoundError\n ) {\n return { label: \"not found\", exitCode: 3 };\n }\n if (err instanceof SyncPeerRefAmbiguousError) {\n // An abbreviated peer id matching several peers. Same rule as an\n // ambiguous group id: the operator disambiguates, mu never guesses.\n return { label: \"conflict\", exitCode: 4 };\n }\n if (err instanceof DriftDetectedError) {\n // 5 = substrate unavailable/inconsistent. Drift means the SQLite\n // substrate is internally inconsistent (the log and the tables\n // disagree), which is exactly that category — not a usage mistake (2)\n // and not a name collision (4).\n return { label: \"drift\", exitCode: 5 };\n }\n if (err instanceof HazardFailError) {\n // Same lane as drift: a doctor `fail` row (the DB inside\n // MU_SYNC_DIR) means the substrate is unsafe to keep writing.\n return { label: \"doctor\", exitCode: 5 };\n }\n if (isSqliteBusy(err)) {\n // Another process held the write lock past busy_timeout (5s, set in\n // openDb). The DB is unavailable, not wrong: retry later.\n return { label: \"db locked\", exitCode: 5 };\n }\n if (err instanceof AgentSpawnCliNotFoundError) {\n // Pre-flight failure: --cli's resolved binary isn't on PATH. We\n // refused before any side effect, so this is the cleanest\n // operator-typo lane there is. Generic exit 1 (substrate-class)\n // matches AgentDiedOnSpawnError / AgentSpawnStartupError below —\n // all three are \"the spawn can't produce a working agent\".\n return { label: \"spawn cli not found\", exitCode: 1 };\n }\n if (err instanceof AgentSendIndeterminateError) {\n // Delivery unknown: same lane as ctl unreachable, distinct label.\n return { label: \"send delivery unknown\", exitCode: 1 };\n }\n if (err instanceof AgentCtlUnreachableError) {\n // The agent runs, but mu cannot control it: same \"spawn can't\n // produce a working agent\" lane as the spawn failures around it.\n return { label: \"ctl unreachable\", exitCode: 1 };\n }\n if (err instanceof AgentDiedOnSpawnError || err instanceof SpawnTrustDialogError) {\n // Substrate-level failure (CLI exited at spawn). The message is\n // already rich (includes captured scrollback). Generic exit 1.\n return { label: \"spawn failed\", exitCode: 1 };\n }\n if (err instanceof AgentSpawnStartupError) {\n // Pane is alive but the spawned CLI parked at a known\n // provider-auth-failure prompt. Same generic exit 1 lane as\n // AgentDiedOnSpawnError — both are \"the spawn looked OK to mu but\n // the operator can't actually use this agent\". The error message\n // already carries the matched line + scrollback.\n return { label: \"spawn startup error\", exitCode: 1 };\n }\n if (err instanceof AgentExtensionOutdatedError) {\n // The agent runs, but its extension cannot serve this op yet:\n // a state conflict the operator resolves by /reload or respawn.\n return { label: \"extension outdated\", exitCode: 4 };\n }\n if (\n err instanceof AgentReplacedError ||\n err instanceof AgentLockBusyError ||\n err instanceof SpawnAttemptBusyError ||\n err instanceof SpawnAttemptFailedError ||\n err instanceof SpawnAttemptGuardError ||\n err instanceof SpawnTaskStateError ||\n err instanceof SpawnReceiptConflictError\n ) {\n // The name changed hands, or another mu holds the agent: retry after a preview.\n return { label: \"conflict\", exitCode: 4 };\n }\n if (err instanceof AgentPaneStillAliveError) {\n // The pane outlived the kill: a state conflict the operator resolves.\n return { label: \"conflict\", exitCode: 4 };\n }\n if (err instanceof AgentRestartedError) {\n // The run being waited on died with the old pi process: state conflict.\n return { label: \"conflict\", exitCode: 4 };\n }\n if (err instanceof AgentBusyError) {\n // The agent's state collides with the request; abort or --force.\n return { label: \"conflict\", exitCode: 4 };\n }\n if (err instanceof AgentAbortTimeoutError) {\n // Still busy after --timeout: substrate lane, try again.\n return { label: \"timeout\", exitCode: 5 };\n }\n if (err instanceof RemotePrepareError || err instanceof RemoteCollectError) {\n // The host's own exec step failed or answered nothing usable: substrate, not usage.\n return { label: \"remote host\", exitCode: 5 };\n }\n if (err instanceof HostCheckFailedError) {\n // The host (or its forward) failed a check step: substrate, not usage.\n return { label: \"host check\", exitCode: 5 };\n }\n if (err instanceof NoMultiplexerError) {\n return { label: \"no multiplexer\", exitCode: 5 };\n }\n if (err instanceof MuxError || err instanceof PaneNotFoundError) {\n // MuxError is the base of the per-backend families (TmuxError, …),\n // so one instanceof covers every multiplexer.\n return { label: \"mux\", exitCode: 5 };\n }\n return { label: \"error\", exitCode: 1 };\n}\n\n/** better-sqlite3's SqliteError for a lock it could not get: SQLITE_BUSY\n * ('database is locked') and SQLITE_LOCKED, with their extended codes. */\nfunction isSqliteBusy(err: unknown): boolean {\n if (!(err instanceof Error) || err.name !== \"SqliteError\") return false;\n const code = (err as { code?: unknown }).code;\n return (\n typeof code === \"string\" && (code.startsWith(\"SQLITE_BUSY\") || code.startsWith(\"SQLITE_LOCKED\"))\n );\n}\n\n/** prose-quoting: on the verbs that carry prose, \"too many arguments\"\n * nearly always means an apostrophe ended a single-quoted string and\n * bash split the rest into words. The message says so and names stdin. */\nfunction quotingHint(err: unknown, cmd: Command | undefined): string | undefined {\n if (!(err instanceof CommanderError) || err.code !== \"commander.excessArguments\") return;\n const verb = `${cmd?.parent?.name()} ${cmd?.name()}`;\n if (verb !== \"task add\" && verb !== \"task note\" && verb !== \"agent send\") return;\n return \"; a quote in the text probably ended the string early (an apostrophe inside '...'): pass the text on stdin as - with a quoted heredoc (<<'EOF')\";\n}\n\n/**\n * An unknown verb, as one line: `unknown command 'x'` plus the closest verb\n * of `cmd` (or `mu --help`). The root takes no arguments, so commander calls\n * an unknown top-level verb \"too many arguments\"; a namespace says\n * \"unknown command\". undefined for any other error.\n */\nfunction unknownVerb(err: unknown, cmd: Command | undefined): string | undefined {\n if (!(err instanceof CommanderError) || cmd === undefined) return;\n const root = cmd.parent === null;\n // An unknown option on the bare root: the 70-line root help is no answer, `mu --help` is.\n if (root && err.code === \"commander.unknownOption\") {\n const opt = /'([^']*)'/.exec(err.message)?.[1];\n if (opt !== undefined) return `unknown option '${opt}'; see mu --help`;\n }\n let word: string | undefined;\n if (err.code === \"commander.unknownCommand\") word = /'([^']*)'/.exec(err.message)?.[1];\n else if (err.code === \"commander.excessArguments\" && root) word = cmd.args[0];\n if (word === undefined) return;\n // The verbs one level down count too (`mu next` → `mu task next`); a direct one wins a tie.\n const path = root ? \"mu\" : `mu ${cmd.name()}`;\n const names = cmd.commands.flatMap((c) => [c.name(), ...c.aliases()].map((n) => [n, n]));\n // `task` verbs first: they win a tie (`mu show` → `mu task show`, not `mu agent show`).\n const nested = [...cmd.commands]\n .sort((a, b) => Number(b.name() === \"task\") - Number(a.name() === \"task\"))\n .flatMap((c) => c.commands.map((g) => [g.name(), `${c.name()} ${g.name()}`]));\n // The shell's spellings of a verb: `ls` is `list`, `rm` is `delete`.\n const alias = { ls: \"list\", rm: \"delete\" }[word as \"ls\" | \"rm\"];\n if (alias !== undefined && cmd.commands.some((c) => c.name() === alias)) {\n const p = root ? \"mu\" : `mu ${cmd.name()}`;\n return `unknown command '${word}' (closest: ${p} ${alias}); see ${p} --help`;\n }\n // A plural noun names its namespace's list: `mu tasks` → `mu task list`.\n const singular = word.endsWith(\"s\") ? word.slice(0, -1) : undefined;\n const ns = cmd.commands.find((c) => c.name() === singular);\n if (ns?.commands.some((g) => g.name() === \"list\")) {\n return `unknown command '${word}' (closest: ${path} ${ns.name()} list); see ${path} --help`;\n }\n let best: string | undefined;\n let bestD = Number.POSITIVE_INFINITY;\n for (const [n, full] of [...names, ...nested] as [string, string][]) {\n const d = n === word ? 0 : n.startsWith(word) || word.startsWith(n) ? 1 : editDistance(n, word);\n if (d < bestD) [best, bestD] = [full, d];\n }\n const near =\n best !== undefined && bestD <= Math.max(word.length <= 3 ? 1 : 2, Math.floor(word.length / 3));\n return `unknown command '${word}'${near ? ` (closest: ${path} ${best})` : \"\"}; see ${path} --help`;\n}\n\n/** Render the error and return the resolved exit code. Returning the\n * exitCode lets `handle` reuse it instead of re-classifying the same\n * error twice.\n *\n * Usage-class errors (commander +\n * UsageError + typed *Invalid*) ALSO emit the failing subcommand's\n * --help (human path) or a structured `usage` field (JSON path); an\n * unknown verb is one line naming the closest verb instead. */\nfunction emitError(err: unknown): number {\n if (err instanceof CliExitError) {\n const f = err.failure;\n if (f !== undefined) {\n printFailure({\n error: f.error,\n message: f.message,\n exit: err.exitCode,\n ...(f.extra !== undefined ? { extra: f.extra } : {}),\n ...(f.data !== undefined ? { data: f.data } : {}),\n });\n } else if (!isJsonMode()) printNext(finalNext(), \"stderr\");\n return err.exitCode;\n }\n\n // Commander's --help / --version success-exits arrive as CommanderError\n // with exitCode 0. helpInformation() has already been written by\n // commander itself; nothing more to do.\n if (err instanceof CommanderError) {\n const { exitCode } = classifyCommanderError(err);\n if (exitCode === 0) return 0;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const { label, exitCode } =\n err instanceof CommanderError ? classifyCommanderError(err) : classifyError(err);\n const errClass = err instanceof Error ? err.name : \"Error\";\n const unknown = unknownVerb(err, activeCommand);\n // Strip commander's own \"error: \" prefix — we re-add our own \"error: \"\n // (red, in the human path) and don't want \"error: error: ...\".\n const cleanMessage =\n unknown ??\n (err instanceof CommanderError\n ? // `message` is one line (the output contract): commander puts its suggestion on a second one.\n message.replace(/^error: /, \"\").replace(/\\s*\\n\\s*/g, \" \")\n : message) + (quotingHint(err, activeCommand) ?? \"\");\n const usageCmd = isUsageClassError(err) ? activeCommand : undefined;\n // A send whose delivery is unknown: its receipt check (never a resend), from the row it went to.\n if (\n err instanceof AgentSendIndeterminateError &&\n err.msgId !== undefined &&\n err.agentId !== undefined\n ) {\n setNextOutcome({\n kind: \"send-unknown\",\n agent: { name: err.agentName, workstream: err.workstream },\n msgId: err.msgId,\n agentId: err.agentId,\n });\n }\n\n // `mu state` and `mu agent list` are JSON without asking; a machine with no multiplexer is\n // still the one human line on stderr every other verb prints (the install hint), not a\n // document on stdout.\n const humanNoMux =\n err instanceof NoMultiplexerError &&\n (isStateVerbArgv(process.argv) || isAgentListArgv(process.argv)) &&\n !process.argv.some((a) => a === \"--json\" || a.startsWith(\"--json=\"));\n if (isJsonMode() && !humanNoMux) {\n // ONE failure document on STDOUT, the real exit code beside it: a caller\n // that pipes `2>/dev/null` loses nothing.\n const extra: Record<string, unknown> = {};\n if (usageCmd) extra.usage = usageLines(usageCmd);\n // A stale `--if` names both revisions; a wrong task id its near ids.\n if (err instanceof RevisionMismatchError) {\n extra.expected_rev = err.expectedRev;\n extra.current_rev = err.currentRev;\n }\n if (err instanceof TaskNotFoundError && err.candidateIds.length > 0) {\n extra.candidate_ids = err.candidateIds;\n }\n if (err instanceof NameAmbiguousError) extra.candidates = err.candidates;\n // A send whose delivery is unknown still names its receipt, structurally.\n if (err instanceof AgentSendIndeterminateError && err.msgId !== undefined) {\n extra.msgId = err.msgId;\n if (err.incarnation !== undefined) extra.incarnation = err.incarnation;\n extra.delivery = \"unknown\";\n }\n printFailure({\n error: errClass,\n message: cleanMessage,\n exit: exitCode,\n ...(Object.keys(extra).length > 0 ? { extra } : {}),\n });\n return exitCode;\n }\n\n console.error(pc.red(`${label}: ${cleanMessage}`));\n if (err instanceof TaskNotFoundError && err.candidateIds.length > 0) {\n console.error(pc.dim(`similar: ${err.candidateIds.join(\", \")}`));\n }\n printNext(finalNext(), \"stderr\");\n if (usageCmd && unknown === undefined) {\n printUsageHuman(usageCmd);\n }\n return exitCode;\n}\n\nexport interface HandleOptions {\n /**\n * Opt OUT of the ambient sync hook. Exactly one verb sets this: `mu\n * sync`, which IS the pass (flush, then ingest, so its report counts\n * what it did rather than \"ingested 0\" after the hook ate everything).\n * Every other verb, `mu sql` included, ingests before and flushes\n * after. The DB-inside-MU_SYNC_DIR refusal does not honour this flag.\n */\n ambientSync?: false;\n}\n\n/** Refuse to open a DB that lives inside MU_SYNC_DIR. Runs before\n * `openDb` for every verb, ambient or not, so nothing is created or\n * written and `mu sync` cannot bypass it. Path-based, symlinks resolved:\n * it fires even when the DB file does not exist yet. `mu pi migrate` (which\n * opens no DB, so it is outside handle()) calls it too. */\nexport function refuseDbInsideSyncDir(): void {\n const dir = syncDir();\n if (dir === null) return;\n const dbPath = defaultDbPath();\n if (checkDbInsideSyncDir(dbPath, dir).severity === \"fail\") {\n throw new DbInsideSyncDirError(dbPath, dir);\n }\n // A 3.x peer shares the folder: mu 4 neither writes into it nor reads it.\n assertSyncDirV2(dir);\n}\n\n/** Wrap an async handler so typed errors become specific exit codes.\n *\n * The optional `command` arg is the failing subcommand's `Command`\n * (commander's `this` in a `.action(function () { ... })` body).\n * When supplied, usage-class errors thrown inside `fn` will render\n * that subcommand's --help (human) or `usage` JSON (--json).\n *\n * THE AMBIENT-SYNC SEAM. `handle()` is the one place every verb passes\n * through, and it is ALREADY async while most verb bodies are\n * synchronous — which is exactly why the hook belongs here and nowhere\n * else. `ambientFlush` is async (it takes a cross-process file lock); if the\n * hook lived inside the verbs, ~63 synchronous handlers would have had\n * to become async to await it. Here, one `await` before `fn(db)` and one\n * after covers all of them, and no verb learns that sync exists.\n *\n * Order is load-bearing: INGEST before the body (so the verb reads the\n * freshest state transport has delivered) and FLUSH after (so the ops\n * the verb just wrote are in this machine's segment before the process\n * exits, rather than waiting for the next invocation).\n *\n * Neither half can fail the command — see src/sync.ts. */\nexport function handle(\n fn: (db: Db) => Promise<void>,\n command?: Command,\n opts?: HandleOptions,\n): () => Promise<void> {\n return async () => {\n let db: Db | undefined;\n let exitCode: number | undefined;\n activeCommand = command;\n // The single `if` the unconfigured single-machine case pays: one env\n // var read, no promise allocated, no filesystem touched.\n const ambient = opts?.ambientSync !== false && syncEnabled();\n try {\n refuseDbInsideSyncDir();\n db = openDb();\n if (ambient) await ambientIngest(db);\n nextDb = db;\n await fn(db);\n if (!isJsonMode()) printNext(finalNext(), \"stdout\");\n } catch (err) {\n // Read-only suggestions for a wrong task id, from the partition the\n // exact lookup missed in. Best effort: a hint never masks the miss.\n if (err instanceof TaskNotFoundError && err.workstream !== undefined && db !== undefined) {\n try {\n err.candidateIds = candidateTaskIds(db, err.workstream, err.lookupId);\n } catch {}\n }\n exitCode = emitError(err);\n } finally {\n activeCommand = undefined;\n nextDb = undefined;\n nextScope = undefined;\n nextOutcome = undefined;\n nextArmed = false;\n // Flush even on the error path: the verb may have committed ops\n // before throwing (a cascade that hit a cycle halfway), and those\n // ops are already canonical in `ops`. Withholding them from the\n // segment would make this machine's history depend on whether the\n // command happened to exit 0.\n if (ambient && db !== undefined) {\n try {\n await ambientFlush(db);\n } catch {\n // ambientFlush is already total; belt and braces.\n }\n }\n try {\n db?.close();\n } catch {\n // best effort\n }\n }\n if (exitCode !== undefined) {\n // A document piped to a slow reader is still in the stream's buffer: drain it,\n // or process.exit truncates the one result a caller is waiting for.\n if (process.stdout.writableLength > 0) {\n await new Promise<void>((resolve) => process.stdout.write(\"\", () => resolve()));\n }\n process.exit(exitCode);\n }\n };\n}\n\n/** Translate a commander parse-time error into mu's wire format,\n * then return the exit code. Used by the top-level `parseAsync` catch\n * in cli.ts so commander mistakes go through the same emitError\n * pipeline that handler-thrown errors use. */\nexport function emitParseError(err: unknown, failingCommand: Command | undefined): number {\n activeCommand = failingCommand;\n try {\n return emitError(err);\n } finally {\n activeCommand = undefined;\n }\n}\n\n/** Walk argv tokens against the program tree to find the deepest\n * matching subcommand. Used by parseAsync's catch to identify which\n * subcommand commander was processing when it threw. Skips options the\n * current command declares (and their values) the way commander's\n * parseOptions does, so a leading global (`mu --json task list`,\n * `mu -w x --json task note …`) still resolves the verb. Stops at an\n * unknown option or token. */\nexport function findCommandForArgv(root: Command, argv: readonly string[]): Command {\n let cur: Command = root;\n for (let i = 0; i < argv.length; i++) {\n const t = argv[i] ?? \"\";\n if (t === \"--\") break;\n if (t.length > 1 && t.startsWith(\"-\")) {\n // Inline value: `--flag=value`, or `-wvalue` for a short flag.\n const long = t.startsWith(\"--\");\n const eq = long ? t.indexOf(\"=\") : -1;\n const flag = long ? (eq === -1 ? t : t.slice(0, eq)) : t.slice(0, 2);\n const inline = long ? eq !== -1 : t.length > 2;\n const opt = cur.options.find((o) => o.short === flag || o.long === flag);\n if (!opt || (inline && !opt.required)) break;\n if (inline || !opt.required) continue;\n i++;\n // A variadic option keeps consuming non-option tokens, as in\n // commander: `--substate a b` binds [a, b] to --substate.\n if (opt.variadic) {\n while (i + 1 < argv.length && !(argv[i + 1] ?? \"-\").startsWith(\"-\")) i++;\n }\n continue;\n }\n const next: Command | undefined = cur.commands.find(\n (c) => c.name() === t || (c.aliases().includes(t) ?? false),\n );\n if (!next) break;\n cur = next;\n }\n return cur;\n}\n","// mu — `mu agent close <name>`: preview and apply (src/agents/close.ts), for a\n// live agent, a local orphan worktree and a REMOVED agent's remote worktree\n// (`remote_recovery`, src/agents/close-recovery.ts). Kept out of\n// src/cli/agents.ts, which is past its cap.\n//\n// Scope: a recovery outlives its agent row, its workstream and (after a\n// reinit) the workstream's generation, so the live-agent scope checks do not\n// apply to it: `-w`, or a qualified `<ws>/<name>`, names the workstream the\n// record was kept under, and `--recovery <id>` picks one of several.\n\nimport type { Command } from \"commander\";\nimport { closePreviewToOutput } from \"../agent-output.js\";\nimport { type ClosePreview, closeAgent, previewClose } from \"../agents.js\";\nimport {\n applyQualifiedRef,\n assertAgentInWorkstream,\n emitJson,\n findEntityWorkstreams,\n handle,\n injectedWorkstream,\n JSON_OPT,\n missingWorkstreamError,\n parseNonNegativeInt,\n resolveWorkstream,\n WORKSTREAM_OPT,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { pc } from \"../output.js\";\nimport { recoveriesFor, recoveryWorkstreams } from \"../remote-recovery.js\";\nimport { NameAmbiguousError, setNextOutcome } from \"./handle.js\";\n\ninterface CloseOpts {\n workstream?: string;\n json?: boolean;\n discard?: boolean;\n keepBranch?: boolean;\n if?: number;\n recovery?: number;\n force?: boolean;\n}\n\n/**\n * The workstream a close means. Explicit or injected scope as everywhere; with\n * none, the workstreams holding a live agent OR a recovery record of the\n * name: several are ambiguous, one is offered as the qualified ref.\n */\nexport async function closeScope(\n db: Db,\n name: string,\n explicit: string | undefined,\n): Promise<string> {\n if (explicit !== undefined || injectedWorkstream() !== undefined) {\n return resolveWorkstream(explicit);\n }\n const matches = [\n ...new Set([...findEntityWorkstreams(db, \"agent\", name), ...recoveryWorkstreams(db, name)]),\n ].sort();\n if (matches.length >= 2) throw new NameAmbiguousError(name, matches, \"agent\");\n const only = matches[0];\n throw await missingWorkstreamError(only !== undefined ? { extra: `${only}/${name}?` } : {});\n}\n\nexport async function cmdClose(db: Db, rawName: string, opts: CloseOpts = {}): Promise<void> {\n const name = applyQualifiedRef(rawName, opts);\n const ws = await closeScope(db, name, opts.workstream);\n // A record kept under `ws` is a legitimate target even when a live agent of\n // that name sits in another workstream; the live-agent check is for rows.\n if (opts.recovery === undefined && recoveriesFor(db, ws, name).length === 0) {\n assertAgentInWorkstream(db, name, opts.workstream ?? ws);\n }\n const discard = opts.discard === true;\n const keepBranch = opts.keepBranch === true;\n const recoveryId = opts.recovery;\n const force = opts.force === true;\n // Bare close is the preview: it reads, it never kills. `--if <rev>` applies.\n if (opts.if === undefined) {\n const p = await previewClose(db, name, {\n workstream: ws,\n discard,\n keepBranch,\n ...(recoveryId === undefined ? {} : { recoveryId }),\n });\n if (p.kind !== \"none\" && !p.refusesDirty && p.recovery?.refusal == null) {\n setNextOutcome({\n kind: \"preview\",\n apply: [\n \"mu\",\n \"agent\",\n \"close\",\n name,\n \"-w\",\n ws,\n ...(p.recovery === null ? [] : [\"--recovery\", String(p.recovery.id)]),\n ...(discard ? [\"--discard\"] : []),\n ...(keepBranch ? [\"--keep-branch\"] : []),\n ...(force ? [\"--force\"] : []),\n ],\n revision: p.revision,\n });\n }\n if (opts.json) {\n emitJson({ ...closePreviewToOutput(p), dryRun: true });\n return;\n }\n printClosePreview(p);\n return;\n }\n const result = await closeAgent(db, name, {\n workstream: ws,\n ifRevision: opts.if,\n ...(discard ? { discard: true } : {}),\n ...(keepBranch ? { keepBranch: true } : {}),\n ...(force ? { force: true } : {}),\n ...(recoveryId === undefined ? {} : { recoveryId }),\n });\n if (opts.json) {\n emitJson({ agentName: name, ...result });\n return;\n }\n if (!result.killedPane && !result.deletedRow && result.worktree === null) {\n console.log(pc.dim(`no agent named ${name} (already closed?)`));\n return;\n }\n console.log(\n result.recovery === undefined\n ? `Closed ${pc.bold(name)}`\n : `Closed the remote worktree ${pc.bold(name)} left (recovery ${result.recovery.id})`,\n );\n if (result.worktree !== null) {\n const w = result.worktree;\n console.log(\n pc.dim(\n w.action === \"kept-branch\"\n ? ` worktree removed; unmerged commits kept on branch ${w.branch}`\n : w.action === \"discarded\"\n ? \" worktree discarded\"\n : w.action === \"gone\"\n ? \" worktree already gone\"\n : \" worktree removed\",\n ),\n );\n for (const warn of w.warnings ?? []) console.error(pc.yellow(`warning: ${warn}`));\n }\n}\n\nfunction printClosePreview(p: ClosePreview): void {\n if (p.kind === \"none\") {\n console.log(pc.dim(`no agent named ${p.agentName} (already closed?)`));\n return;\n }\n if (p.kind === \"recovery\" && p.recovery !== null && p.remote !== null) {\n const head = p.remote.collectedHead;\n console.log(\n `${pc.bold(p.agentName)} has no agent row, only the remote worktree it left (recovery ${p.recovery.id}, kept on ${p.recovery.preservedAt}, rev ${p.revision}): no pane is killed, no task changes`,\n );\n console.log(\n ` remote worktree ${p.remote.path} on ${p.remote.host}: removed only if clean and at ${p.remote.base.slice(0, 12)}${head === null ? \"\" : ` or ${head.slice(0, 12)} (collected)`}; otherwise it refuses${p.keepBranch ? \" (--keep-branch: unmerged commits go on a remote branch first; dirty still refuses)\" : \"\"}`,\n );\n if (p.recovery.refusal !== null)\n console.log(pc.yellow(` would refuse: ${p.recovery.refusal}`));\n return;\n }\n console.log(\n p.kind === \"agent\"\n ? `Close ${pc.bold(p.agentName)}? pane ${p.paneId} will be killed and its row removed (rev ${p.revision})`\n : `${pc.bold(p.agentName)} has no agent row, only a registered worktree (rev ${p.revision})`,\n );\n for (const t of p.ownedTasks) {\n console.log(` owns ${t.ref} (${t.status}${t.reverts ? \": goes back to OPEN\" : \"\"})`);\n }\n if (p.remote !== null) {\n const head = p.remote.collectedHead;\n console.log(\n ` remote worktree ${p.remote.path} on ${p.remote.host}: removed after the pane dies, only if clean and at ${p.remote.base.slice(0, 12)}${head === null ? \"\" : ` or ${head.slice(0, 12)} (collected)`}; otherwise it refuses${p.keepBranch ? \" (--keep-branch: unmerged commits go on a remote branch first; dirty still refuses)\" : \"\"}`,\n );\n }\n if (p.worktree !== null) {\n console.log(` worktree ${p.worktree.path}: ${p.worktree.state}`);\n if (p.refusesDirty) {\n console.log(\n pc.yellow(\" uncommitted work: close refuses. Commit it, or preview with --discard\"),\n );\n }\n }\n}\n\nexport function wireCloseCommand(agent: Command): void {\n agent\n .command(\"close <name>\")\n .alias(\"stop\")\n .description(\n \"Close an agent: previews without --if; --if <rev> kills the pane, removes the row and its clean worktree (unmerged commits keep a branch; a dirty tree refuses first). Remote and recovery-record rules: docs/guide/remote.md.\",\n )\n .option(\n \"--discard\",\n \"close even with uncommitted work in the worktree (lossy: it is thrown away)\",\n )\n .option(\n \"--keep-branch\",\n \"a remote worktree whose HEAD was never collected: keep it as the remote branch mu/<ws>/<agent>-<sha12>, then remove it (dirty still refuses, with or without --discard)\",\n )\n .option(\n \"--recovery <id>\",\n \"close the remote worktree of the removed agent whose recovery id this is (shown by the preview; needed when several records share the name)\",\n parseNonNegativeInt,\n )\n .option(\n \"--force\",\n \"close past what you vouch for: a pane mu cannot ask, or a worktree a process writes in or no scan can check (a cwd or reader there only warns); never overrides a live pane or uncommitted work\",\n )\n .option(\"--if <rev>\", \"apply the preview with this revision\", parseNonNegativeInt)\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as CloseOpts;\n return handle((db) => cmdClose(db, name, opts), this as Command)();\n });\n}\n","// mu — `mu agent collect <name>`: bring a remote worker's commits home\n// (src/remote-collect.ts). Kept out of src/cli/agents.ts, which is past its cap.\n\nimport type { Command } from \"commander\";\nimport {\n applyQualifiedRef,\n assertAgentInWorkstream,\n emitJson,\n handle,\n JSON_OPT,\n parseNonNegativeInt,\n UsageError,\n WORKSTREAM_OPT,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { say } from \"../messages.js\";\nimport { pc } from \"../output.js\";\nimport { collectRemoteAgent } from \"../remote-collect.js\";\nimport { recoveriesFor } from \"../remote-recovery.js\";\nimport { gitToplevel } from \"../vcs/git.js\";\nimport { closeScope } from \"./agent-close.js\";\n\nexport async function cmdCollect(\n db: Db,\n rawName: string,\n opts: { workstream?: string; json?: boolean; recovery?: number } = {},\n): Promise<void> {\n const name = applyQualifiedRef(rawName, opts);\n const ws = await closeScope(db, name, opts.workstream);\n // A removed agent's recovery record is a target too (qualified ref or -w names its workstream).\n if (opts.recovery === undefined && recoveriesFor(db, ws, name).length === 0) {\n assertAgentInWorkstream(db, name, opts.workstream);\n }\n const repo = await gitToplevel(process.cwd());\n if (repo === undefined) {\n throw new UsageError(say(\"agent.collect_cwd\"));\n }\n const r = await collectRemoteAgent(db, {\n workstream: ws,\n name,\n repo,\n ...(opts.recovery === undefined ? {} : { recoveryId: opts.recovery }),\n });\n if (opts.json) {\n emitJson({ agentName: name, ...r });\n return;\n }\n console.log(\n r.changed\n ? `Collected ${pc.bold(name)} at ${r.head.slice(0, 12)} (pinned as ${r.ref})`\n : `${pc.bold(name)} has nothing new: still ${r.head.slice(0, 12)} (pinned as ${r.ref})`,\n );\n console.log(pc.dim(` merge it yourself (mu never merges): ${r.merge}`));\n}\n\nexport function wireCollectCommand(agent: Command): void {\n agent\n .command(\"collect <name>\")\n .description(\n \"Fetch a remote worker's commits into this repo (the profile's --fetch), pin them as refs/mu/collect/<ws>/<agent>, print the merge command; mu never merges. Channel and recovery-record rules: docs/guide/remote.md.\",\n )\n .option(\n \"--recovery <id>\",\n \"collect from the remote worktree of the removed agent with this recovery id (shown by `agent close`'s preview; needed when several records share the name)\",\n parseNonNegativeInt,\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as {\n workstream?: string;\n json?: boolean;\n recovery?: number;\n };\n return handle((db) => cmdCollect(db, name, opts), this as Command)();\n });\n}\n","// mu — `-` as a text argument: read the text from stdin.\n//\n// Prose (notes, briefs) breaks shell quoting: an apostrophe ends '...',\n// and \"...\" expands $VAR and backticks. A quoted heredoc piped to `-`\n// needs no quoting at all: `mu task note x - <<'EOF' ... EOF`.\n\nimport { UsageError } from \"./handle.js\";\n\n/** The argument value that means \"read the text from stdin\". */\nexport const STDIN_ARG = \"-\";\n\ntype StdinReader = () => Promise<string>;\n\nasync function readProcessStdin(): Promise<string> {\n let text = \"\";\n process.stdin.setEncoding(\"utf8\");\n for await (const chunk of process.stdin) text += chunk;\n return text;\n}\n\nlet reader: StdinReader | null = null;\n\n/** Test seam: replace the stdin reader (null restores process.stdin). */\nexport function setStdinReaderForTests(fn: StdinReader | null): void {\n reader = fn;\n}\n\n/** Read the text verbatim, minus all trailing newlines (as bash\n * `$(...)` strips them); interior newlines are kept.\n * Empty input is a UsageError: `-` with nothing piped is a mistake. */\nexport async function readStdinText(what: string): Promise<string> {\n const text = (await (reader ?? readProcessStdin)()).replace(/\\n+$/, \"\");\n if (text.trim() === \"\") {\n throw new UsageError(`${what} is \"-\" but stdin was empty; pipe the text in: <<'EOF' ... EOF`);\n }\n return text;\n}\n","// mu — the one JSON result of `mu wait` (and its `task wait` alias): the typed\n// ref spelling, the snapshot records, the per-wave tally line, the resume\n// command, and the wait-specific bound.\n//\n// Pure: no DB, no I/O. cmdWait (src/cli/wait.ts) builds a WaitResult and hands\n// it here. The shape (docs/VOCABULARY.md, \"wait event\"): `firing` (alias `event`), `exit`,\n// `timedOut`, `snapshots`, `cursor`, `resume` (the stored handle, see\n// src/wait-resume.ts; null with `resumeWhy` when nothing is left to wait for).\n\nimport type { VerdictTally } from \"../delegates.js\";\nimport type { HumanNeeded } from \"../human-needed.js\";\nimport { renderArgv, resumeArgv } from \"../next-hints.js\";\nimport { encodeEnvelope, okEnvelope, RESULT_BYTES } from \"../output-contract.js\";\nimport type { WaitEvent, WaitRef, WaitResult, WaitSnapshot } from \"../wait-types.js\";\nimport { pageRecords } from \"./tasks/records.js\";\n\n/** `task:<ws>/<id>`, `agent:<ws>/<name>`, `delegate:<call id>`: a ref a later `mu wait` can take as is. */\nexport function refString(ref: WaitRef): string {\n return ref.kind === \"delegate\" ? `delegate:${ref.id}` : `${ref.kind}:${ref.workstream}/${ref.id}`;\n}\n\n/**\n * The explicit refs a resume must still wait on, each with the run baseline and pi\n * incarnation it was last SEEN at (the observed one wins over the ref as typed, so a\n * pi that restarted meanwhile is refused on resume, never miscounted). A real event\n * leaves out what it delivered; a timeout or an interrupt delivered nothing, so every\n * ref stays. Refs the wait discovered itself (a caller's owned work, a wave, the\n * blockers) are not listed: the stored callers and filters find them again. Never\n * truncated: they live in the stored handle, not in the printed line.\n */\nexport function owedRefs(result: WaitResult, explicit: readonly WaitRef[]): WaitRef[] {\n // What the engine handed over as completed: an input or stall is never delivered, and an\n // early urgent return of --all names only itself (a closed target stays owed).\n const delivered = new Set(result.delivered.map(refString));\n const seen = new Set<string>();\n const out: WaitRef[] = [];\n for (const ref of explicit) {\n const key = refString(ref);\n if (seen.has(key)) continue;\n seen.add(key);\n const snap = result.refs.find((s) => refString(s.ref) === key);\n if (delivered.has(key)) continue;\n if (ref.kind !== \"agent\") {\n out.push({ kind: ref.kind, workstream: ref.workstream, id: ref.id });\n continue;\n }\n const runs = snap?.afterRuns ?? ref.afterRuns;\n const inc = snap?.incarnation ?? ref.incarnation;\n out.push({\n kind: \"agent\",\n workstream: ref.workstream,\n id: ref.id,\n ...(runs !== undefined ? { afterRuns: runs } : {}),\n ...(inc !== undefined ? { incarnation: inc } : {}),\n });\n }\n return out;\n}\n\n/** The one-line resume a result prints: the stored handle (the condition set lives in `wait_resumes`). */\nexport function resumeCommand(id: string, scope: string | undefined): string {\n return renderArgv(resumeArgv(id, scope));\n}\n\n/** `6/12 CONFIRMED, 2 REFUTED, 1 UNVERIFIED, 3 pending`: the wave in one line. */\nexport function tallySummary(t: VerdictTally): string {\n const sum = (k: \"confirmed\" | \"refuted\" | \"unverified\" | \"pending\"): number =>\n t.findings.reduce((n, f) => n + f[k], 0);\n const confirmed = sum(\"confirmed\");\n const refuted = sum(\"refuted\");\n const unverified = sum(\"unverified\");\n const pending = sum(\"pending\");\n const total = confirmed + refuted + unverified + pending;\n const bits = [`${confirmed}/${total} CONFIRMED`];\n if (refuted > 0) bits.push(`${refuted} REFUTED`);\n if (unverified > 0) bits.push(`${unverified} UNVERIFIED`);\n if (pending > 0) bits.push(`${pending} pending`);\n if (t.refused.length > 0) bits.push(`${t.refused.length} refused`);\n return bits.join(\", \");\n}\n\n/** A snapshot as one flat record: id and status first, so a reader finds them together. */\nexport function snapshotRecord(s: WaitSnapshot, textCap: number): Record<string, unknown> {\n // A delegate's ref already is its (global) call id: no second copy of it, no workstream.\n const out: Record<string, unknown> =\n s.ref.kind === \"delegate\"\n ? { kind: s.ref.kind, ref: refString(s.ref), status: s.status }\n : {\n kind: s.ref.kind,\n ref: refString(s.ref),\n id: s.ref.id,\n workstream: s.ref.workstream,\n status: s.status,\n };\n const put = (k: string, v: unknown): void => {\n if (v !== undefined && v !== null && v !== \"\") out[k] = v;\n };\n put(\"substate\", s.substate);\n put(\"owner\", s.owner);\n put(\"ownerWorkstream\", s.ownerWorkstream);\n out.fired = s.fired;\n out.dead = s.dead;\n if (s.stuck === true) {\n out.stuck = true;\n put(\"stuckWhy\", s.stuckWhy);\n put(\"stuckSecs\", s.stuckSecs);\n put(\"ownerRuns\", s.ownerRuns);\n }\n put(\"verdict\", s.verdict);\n put(\"callTask\", s.callTask);\n put(\"record\", s.record);\n put(\"wave\", s.wave);\n put(\"incarnation\", s.incarnation);\n put(\"runs\", s.runs);\n if (s.exit !== undefined) out.exit = s.exit;\n put(\"afterRuns\", s.afterRuns);\n if (s.settled !== undefined) out.settled = s.settled;\n if (s.close !== undefined) out.close = s.close;\n if (s.blocked !== undefined) {\n out.blocked = {\n kind: s.blocked.kind,\n ...(s.blocked.title !== undefined ? { title: s.blocked.title } : {}),\n };\n }\n put(\"unknownReason\", s.unknownReason);\n if (s.unknownBaseline === true) out.unknownBaseline = true;\n put(\"lastError\", s.lastError);\n put(\"sessionFile\", s.sessionFile);\n put(\"textSource\", s.textSource);\n if (s.lastText !== undefined && s.lastText !== \"\") {\n // The tail is what matters: a CLOSE block and its report end the message.\n if (textCap > 0 && s.lastText.length > textCap) {\n out.lastText = s.lastText.slice(-textCap);\n out.lastTextCut = s.lastText.length - textCap;\n } else if (textCap > 0) {\n out.lastText = s.lastText;\n } else {\n out.lastTextCut = s.lastText.length;\n }\n }\n return out;\n}\n\n/** The event record (docs/VOCABULARY.md, \"wait event\"): kind, typed ref, incarnation, runs. */\nexport function eventRecord(e: WaitEvent): Record<string, unknown> {\n return {\n kind: e.kind,\n ref: e.ref === null ? null : refString(e.ref),\n ...(e.incarnation !== undefined ? { incarnation: e.incarnation } : {}),\n ...(e.runs !== undefined ? { runs: e.runs } : {}),\n };\n}\n\nexport interface WaitDataInput {\n result: WaitResult;\n /** The exit the process returns (a signal exit replaces the engine's 130). */\n exit: number;\n /** The one-line handle (`mu wait --resume <id>`), or null when nothing is left to wait for. */\n resume: string | null;\n /** Why `resume` is null. */\n resumeWhy?: string;\n signal?: string;\n /** One-line notices beside `next` (`noticesField`: a course check due). Never cut. */\n notices?: string[];\n /** The words for a non-routine event: why it ended the wait. */\n reason?: string;\n warning?: string;\n /**\n * Fields the verb that entered the wait adds (`sent` for `send --wait`, `claimed` for\n * `claim --and-wait`: the producer's receipt). Small by contract; they count against the\n * bound and are never cut.\n */\n extra?: Record<string, unknown>;\n}\n\n/** What one shrink step keeps. */\ninterface Shape {\n /** Each snapshot's `lastText` is clipped to this many characters (0 = dropped). */\n text: number;\n humanNeeds: number;\n /** Each human need's reason is clipped to NEED_CHARS. */\n clipNeeds: boolean;\n /** The wave's per-finding rows in full. */\n findings: boolean;\n}\n\n/** A human need's reason is clipped to this once the result is shrinking. */\nconst NEED_CHARS = 200;\n/** The tally keeps this many refused names once its rows are cut. */\nconst REFUSED_KEPT = 3;\n\n/**\n * The result document, bounded to RESULT_BYTES on its FINAL bytes (envelope, `next`,\n * `humanNeeds` and `resume` included; the measure of the shared pager,\n * src/cli/page-records.ts). The firing event, exit, timedOut, interrupted, resume and\n * the open count are never cut. What is cut, in order: each snapshot's `lastText` (tail\n * kept), the human needs, the tally's per-finding rows, then the least\n * important snapshots (`pageRecords`); every cut says how many it took, and `retrieve`\n * names how to read the rest.\n */\nexport function waitData(input: WaitDataInput): Record<string, unknown> {\n const { result, exit } = input;\n const event = eventRecord(result.event);\n const fired = (s: WaitSnapshot): boolean => {\n const e = result.event.ref;\n return e !== null && refString(e) === refString(s.ref);\n };\n // Importance: the firing ref, then what is still open, then the rest.\n const ordered = [...result.refs].sort(\n (a, b) =>\n Number(fired(b)) - Number(fired(a)) || Number(a.fired || a.dead) - Number(b.fired || b.dead),\n );\n const open = result.refs.filter((s) => !s.fired && !s.dead).length;\n const tallyFull =\n result.tally === undefined\n ? undefined\n : { summary: tallySummary(result.tally), ...result.tally };\n const needs: readonly HumanNeeded[] = result.humanNeeds;\n const build = (shape: Shape, shown: number): Record<string, unknown> => {\n const snaps = ordered.slice(0, shown);\n const keys = new Set(snaps.map((s) => `${s.ref.kind}:${s.ref.workstream}/${s.ref.id}`));\n const cursor = Object.fromEntries(\n Object.entries(result.cursor).filter(([k]) => {\n // cursor keys are `<kind>:<ws>/<id>` (an urgent one `input|<kind>:<ws>/<id>`): keep a ref we show.\n const bar = k.indexOf(\"|\");\n return keys.has(bar === -1 ? k : k.slice(bar + 1));\n }),\n );\n const cut = ordered.length - snaps.length;\n const cursorCut = Object.keys(result.cursor).length - Object.keys(cursor).length;\n const keptNeeds = needs\n .slice(0, shape.humanNeeds)\n .map((n) =>\n !shape.clipNeeds || n.reason.length <= NEED_CHARS\n ? n\n : { ...n, reason: `${n.reason.slice(0, NEED_CHARS)}…` },\n );\n return {\n firing: event,\n event,\n exit,\n timedOut: result.timedOut,\n interrupted: result.interrupted,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n open,\n snapshots: snaps.map((s) => snapshotRecord(s, shape.text)),\n ...(cut > 0\n ? {\n snapshotsCut: cut,\n retrieve: \"mu task show <id> -w <ws> | mu agent read <name> -w <ws>; or resume\",\n }\n : {}),\n ...(tallyFull === undefined\n ? {}\n : shape.findings\n ? { tally: tallyFull }\n : {\n tally: {\n summary: tallyFull.summary,\n queued: tallyFull.queued,\n running: tallyFull.running,\n refused: tallyFull.refused.slice(0, REFUSED_KEPT),\n ...(tallyFull.refused.length > REFUSED_KEPT\n ? { refusedCut: tallyFull.refused.length - REFUSED_KEPT }\n : {}),\n findingsCut: tallyFull.findings.length,\n },\n }),\n ...(keptNeeds.length > 0 ? { humanNeeds: keptNeeds } : {}),\n ...(needs.length > keptNeeds.length\n ? { humanNeedsCut: needs.length - keptNeeds.length }\n : {}),\n cursor,\n ...(cursorCut > 0 ? { cursorCut } : {}),\n resume: input.resume,\n ...(input.resumeWhy !== undefined ? { resumeWhy: input.resumeWhy } : {}),\n ...(result.drained === true ? { drained: true } : {}),\n ...(result.superseded === true ? { superseded: true } : {}),\n ...(result.action !== undefined ? { action: result.action } : {}),\n ...(input.warning !== undefined ? { warning: input.warning } : {}),\n ...(input.notices !== undefined && input.notices.length > 0\n ? { notices: input.notices }\n : {}),\n ...(input.extra ?? {}),\n };\n };\n const fits = (d: Record<string, unknown>): boolean =>\n Buffer.byteLength(encodeEnvelope(okEnvelope(d))) <= RESULT_BYTES;\n const every = Number.POSITIVE_INFINITY;\n // The texts shrink first (a CLOSE block and its report end a message, so the tail stays).\n for (const text of [1500, 800, 300, 120, 0]) {\n const d = build({ text, humanNeeds: every, clipNeeds: false, findings: true }, ordered.length);\n if (fits(d)) return d;\n }\n // Then the hints; the snapshots are paged on final bytes, the findings kept while they can be.\n for (const findings of [true, false]) {\n const shape: Shape = { text: 0, humanNeeds: 3, clipNeeds: true, findings };\n const page = pageRecords(\n ordered,\n (p) => Buffer.byteLength(encodeEnvelope(okEnvelope(build(shape, p.shown.length)))),\n RESULT_BYTES,\n 1,\n );\n const d = build(shape, page.shown.length);\n if (fits(d)) return d;\n }\n return build(\n { text: 0, humanNeeds: 1, clipNeeds: true, findings: false },\n Math.min(1, ordered.length),\n );\n}\n","// mu — `mu wait`: the one orchestrator wait, over waitForEvents (src/wait.ts).\n//\n// mu wait [<ref>...] [--first | --all] [-w ws] [--until-text re] [--status s]\n// [--stuck-after s] [--on-stall exit|warn|steer|release] [--wave w] [--blockers-of t]\n// [--timeout s]\n//\n// A ref is typed: `task:[ws/]id`, `agent:[ws/]name[@runs][#incarnation]`,\n// `delegate:<call id>`. No refs: the wait owns what this caller started (the\n// agents it spawned and their tasks, its delegate calls). `mu task wait` is\n// the same core over `task:` refs (src/cli/tasks/claim.ts).\n//\n// `mu wait --resume <id>` continues a wait from its stored condition set (src/wait-resume.ts):\n// every result that leaves something to wait for prints that one short handle, so the resume\n// is lossless (no ref, incarnation or caller is dropped) whatever the size of the wait.\n//\n// stdout is ONE JSON envelope for every terminal outcome: an event, a heartbeat\n// timeout (ok:true, timedOut), SIGINT/SIGTERM (a final snapshot and a resume\n// command), and every error. SIGKILL cannot print and is not promised.\n// stderr may carry one heartbeat line a minute. Never ANSI.\n\nimport type { Command } from \"commander\";\nimport { agentKey } from \"../agent-state.js\";\nimport { getAgent } from \"../agents.js\";\nimport {\n checkQualifiedPrefix,\n checkWorkstreamName,\n emitJson,\n handle,\n injectedWorkstream,\n JSON_OPT,\n normalizeInheritedWorkstream,\n parseQualifiedRef,\n parseSeconds,\n parseStatusOption,\n resolveExistingWorkstream,\n UsageError,\n WORKSTREAM_OPT,\n} from \"../cli.js\";\nimport { type Db, tryResolveLiveWorkstreamId } from \"../db.js\";\nimport { DelegateNotFoundError, getDelegateCall } from \"../delegates.js\";\nimport { noticesField } from \"../next-hints.js\";\nimport { reconcile } from \"../reconcile.js\";\nimport { TaskNotFoundError } from \"../tasks/errors.js\";\nimport { getTask, getTaskOwner } from \"../tasks/queries.js\";\nimport { TASK_STATUS_LIST } from \"../tasks/status.js\";\nimport type {\n StallActionResult,\n WaitRef,\n WaitResult,\n WaitSnapshot,\n WaitStallContext,\n} from \"../wait.js\";\nimport { releaseStallHandler, steerStallHandler, waitWithActions } from \"../wait-actions.js\";\nimport { currentCallers } from \"../wait-callers.js\";\nimport { ctlAgentHooks } from \"../wait-ctl.js\";\nimport { compileTextMatcher } from \"../wait-regex.js\";\nimport { loadResume, type ResumeSpec, saveResume } from \"../wait-resume.js\";\nimport { CliExitError, setNextOutcome } from \"./handle.js\";\nimport { owedRefs, resumeCommand, waitData } from \"./wait-output.js\";\n\n/** Heartbeat to stderr every this many ms while a wait is open. */\nconst HEARTBEAT_MS = 60_000;\n/** The default `--timeout` (the engine's heartbeat cap), in seconds. */\nexport const WAIT_DEFAULT_TIMEOUT_S = 1500;\n\n/** What a wait verb asks of the core, whatever spelling it came in (the stored shape plus the verb's name). */\nexport interface WaitSpec extends ResumeSpec {\n /** The words of the verb, for messages. */\n verb: string;\n}\n\n// ─── signals: installed before any async setup ─────────────────────\n\nexport interface WaitSignals {\n signal: AbortSignal;\n /** `SIGINT` / `SIGTERM` once one arrived. */\n which(): \"SIGINT\" | \"SIGTERM\" | undefined;\n dispose(): void;\n}\n\n/**\n * Listen for SIGINT and SIGTERM BEFORE the DB is opened or anything is awaited:\n * a signal during setup still ends in an honest snapshot, never a bare kill.\n * The listeners stay until `dispose()` (after the document is out), so a second\n * signal while the result is being written is absorbed, not fatal.\n */\nexport function installWaitSignals(): WaitSignals {\n const ctl = new AbortController();\n let got: \"SIGINT\" | \"SIGTERM\" | undefined;\n const on = (name: \"SIGINT\" | \"SIGTERM\") => (): void => {\n got ??= name;\n ctl.abort();\n };\n const onInt = on(\"SIGINT\");\n const onTerm = on(\"SIGTERM\");\n process.on(\"SIGINT\", onInt);\n process.on(\"SIGTERM\", onTerm);\n return {\n signal: ctl.signal,\n which: () => got,\n dispose: () => {\n process.off(\"SIGINT\", onInt);\n process.off(\"SIGTERM\", onTerm);\n },\n };\n}\n\n// ─── ref grammar ───────────────────────────────────────────────────\n\nconst TYPED_FORMS =\n \"task:[<ws>/]<id>, agent:[<ws>/]<name>[@<runs>][#<incarnation>], delegate:<call id>\";\n\n/**\n * One typed ref. A bare word is refused (it could be a task or an agent) with the\n * spelling that names it; a typo'd workstream or id is the same error the other\n * verbs give, before anything waits.\n */\nexport async function parseWaitRef(\n db: Db,\n raw: string,\n scope: string | undefined,\n legacy: { afterRuns?: number; inc?: string } = {},\n): Promise<WaitRef> {\n const colon = raw.indexOf(\":\");\n const kind = colon === -1 ? \"\" : raw.slice(0, colon);\n if (kind !== \"task\" && kind !== \"agent\" && kind !== \"delegate\") {\n throw new UsageError(\n `ref ${JSON.stringify(raw)} is not typed: use ${TYPED_FORMS}` +\n (raw.includes(\":\") ? \"\" : ` (e.g. task:${raw} or agent:${raw})`),\n { showHelp: false },\n );\n }\n let rest = raw.slice(colon + 1);\n if (rest === \"\")\n throw new UsageError(`ref ${JSON.stringify(raw)} names nothing`, { showHelp: false });\n if (kind === \"delegate\") {\n const call = getDelegateCall(db, rest);\n if (call === undefined) throw new DelegateNotFoundError(rest);\n return { kind, workstream: call.workstream, id: rest };\n }\n let afterRuns = legacy.afterRuns;\n let incarnation = legacy.inc;\n if (kind === \"agent\") {\n const hash = rest.indexOf(\"#\");\n if (hash !== -1) {\n incarnation = rest.slice(hash + 1);\n rest = rest.slice(0, hash);\n if (incarnation === \"\")\n throw new UsageError(`ref ${JSON.stringify(raw)}: empty #incarnation`, { showHelp: false });\n }\n const at = rest.lastIndexOf(\"@\");\n if (at !== -1) {\n const n = rest.slice(at + 1);\n if (!/^\\d+$/.test(n)) {\n throw new UsageError(`ref ${JSON.stringify(raw)}: @<runs> must be a whole number`, {\n showHelp: false,\n });\n }\n afterRuns = Number(n);\n rest = rest.slice(0, at);\n }\n }\n const parsed = parseQualifiedRef(rest);\n const workstream =\n parsed.workstream !== undefined\n ? checkQualifiedPrefix(rest, parsed.workstream)\n : await resolveExistingWorkstream(db, scope);\n if (kind === \"task\") {\n if (getTask(db, parsed.name, workstream) === undefined) {\n throw new TaskNotFoundError(\n parsed.workstream !== undefined ? rest : parsed.name,\n workstream,\n parsed.name,\n );\n }\n return { kind, workstream, id: parsed.name };\n }\n if (getAgent(db, parsed.name, workstream) === undefined) {\n // The engine raises the typed AgentNotFoundError; say it before any wait starts.\n const { AgentNotFoundError } = await import(\"../agents/errors.js\");\n throw new AgentNotFoundError(parsed.name);\n }\n return {\n kind,\n workstream,\n id: parsed.name,\n ...(afterRuns !== undefined ? { afterRuns } : {}),\n ...(incarnation !== undefined ? { incarnation } : {}),\n };\n}\n\n// ─── the run ───────────────────────────────────────────────────────\n\n/** Workstreams with registered agents: the only ones worth a reconcile (no mux touched otherwise). */\nfunction agentWorkstreams(db: Db, among: ReadonlySet<string>): string[] {\n const out: string[] = [];\n for (const ws of among) {\n const id = tryResolveLiveWorkstreamId(db, ws);\n if (id === null) continue;\n const row = db.prepare(\"SELECT 1 FROM agents WHERE workstream_id = ? LIMIT 1\").get(id);\n if (row !== undefined) out.push(ws);\n }\n return out;\n}\n\n/**\n * Prune ghost panes before each poll so a worker that died is seen dead, in every\n * workstream the wait touches (the watched refs', their owners', the scope).\n * Best effort and a no-op without agents: a DB-only wait never needs a mux.\n */\nfunction reconcileHook(\n db: Db,\n spec: WaitSpec,\n refs: () => readonly WaitRef[],\n): () => Promise<void> {\n return async () => {\n const among = new Set<string>();\n if (spec.scope !== undefined) among.add(spec.scope);\n for (const r of refs()) {\n among.add(r.workstream);\n if (r.kind === \"task\") {\n const owner = getTaskOwner(db, r.id, r.workstream);\n if (owner !== undefined) among.add(owner.workstreamName);\n }\n }\n for (const ws of agentWorkstreams(db, among)) {\n try {\n await reconcile(db, { workstream: ws, mode: \"full\" });\n } catch {\n // A mux hiccup mid-wait: the next poll retries.\n }\n }\n };\n}\n\n/** Why the wait ended, in words (the event kind says what; this says which and why). */\nexport function reasonOf(result: WaitResult, signal: string | undefined, open: number): string {\n const e = result.event;\n const snap = result.refs.find(\n (s) =>\n e.ref !== null &&\n s.ref.kind === e.ref.kind &&\n s.ref.workstream === e.ref.workstream &&\n s.ref.id === e.ref.id,\n );\n const who = e.ref === null ? \"\" : `${e.ref.kind} ${e.ref.workstream}/${e.ref.id}`;\n switch (e.kind) {\n case \"closed\":\n return `${who} is ${snap?.status ?? \"CLOSED\"}${snap?.substate !== undefined && snap.substate !== \"done\" ? `/${snap.substate}` : \"\"}`;\n case \"settled\":\n return `${who} finished its run${snap?.runs !== undefined ? ` (run ${snap.runs})` : \"\"}`;\n case \"exited\":\n return `${who}'s command exited with status ${snap?.exit ?? \"?\"}${snap?.exit === 0 ? \"\" : \" (the exit of this wait)\"}; the pane is kept until \\`mu agent close\\``;\n case \"pane-text\":\n return `${who}'s pane printed the awaited text (no control socket: this is pane output, not a finished run)`;\n case \"input\":\n return `${who} is blocked on a dialog${snap?.blocked !== undefined ? ` (${snap.blocked.kind})` : \"\"}; its run is not finished`;\n case \"dead\":\n // A task's owner died before it closed: that work is not done. An agent ref says only that it is gone.\n return e.ref?.kind === \"task\"\n ? `${who} is gone (its owner's pane died); the work is not done`\n : `${who} is gone (its pane died or it was closed)`;\n case \"stall\": {\n // The owner's settled run may have left the task open: a refused\n // CLOSE block names why and the two ways out.\n const refused = snap?.close?.applied === false ? snap.close : undefined;\n const acted =\n result.action === undefined\n ? \"\"\n : `; --on-stall ${result.action.action}: ${result.action.state}${result.action.reason !== undefined ? ` (${result.action.reason})` : \"\"}`;\n if (refused !== undefined && e.ref !== null) {\n return `${who}'s owner ${snap?.owner} finished its run without closing it: ${refused.reason === \"already applied\" ? `its CLOSE block was refused on an earlier wait (see the task notes: mu task show ${e.ref.id} -w ${e.ref.workstream})` : refused.reason}. Fix: mu task close ${e.ref.id} -w ${e.ref.workstream} --evidence \"<what you verified>\", or have ${snap?.owner} resend the block (mu agent send ${snap?.owner} -w ${snap?.ownerWorkstream ?? e.ref.workstream} ...)${acted}`;\n }\n if (e.ref === null || snap?.owner == null) {\n return `${who}'s owner needs attention (needs_input past --stuck-after)${acted}`;\n }\n const ows = snap.ownerWorkstream ?? e.ref.workstream;\n return `${who}'s owner ${snap.owner} needs attention (${snap.stuckWhy ?? \"needs_input\"} for ${snap.stuckSecs ?? 0}s, past --stuck-after). Fix: read it (mu agent read ${snap.owner} -w ${ows}) and answer it (mu agent send ${snap.owner} -w ${ows} ...), or free the task (mu task release ${e.ref.id} -w ${e.ref.workstream})${acted}`;\n }\n case \"delegate\":\n return `${who} reached ${snap?.status ?? \"a final state\"}${snap?.verdict ? ` (${snap.verdict})` : \"\"}`;\n case \"interrupted\":\n return `${signal ?? \"interrupted\"}: nothing consumed; ${open} still open`;\n case \"heartbeat\":\n return result.drained === true\n ? \"everything watched is done and was already delivered\"\n : `no event before the deadline; ${open} still open`;\n default:\n return e.kind;\n }\n}\n\n/** What a handled stall did, in one stderr line (a sent nudge continues the wait, so the document may never carry it). */\nexport function stallActionLine(key: string, owner: string, a: StallActionResult): string {\n const what =\n a.state === \"sent\"\n ? `sent the reminder to ${owner}`\n : a.state === \"released\"\n ? `released the task from ${owner}`\n : a.state === \"unknown\"\n ? `unknown whether the ${a.action} reached ${owner} (not repeated)`\n : a.state === \"budget-exhausted\"\n ? `${a.action} already used for this owner (not repeated)`\n : `${a.action} refused`;\n const tail = a.disposition === \"continue\" ? \"; still waiting\" : \"\";\n return `mu wait: ${key}: --on-stall ${a.action}: ${what}${a.reason !== undefined && a.state !== \"sent\" ? ` (${a.reason})` : \"\"}${tail}\\n`;\n}\n\n/** `handleStall` for --on-stall steer|release: the merged action, plus the stderr line that names what it did. */\nfunction stallHandler(\n db: Db,\n action: \"steer\" | \"release\",\n callers: readonly string[],\n): (ctx: WaitStallContext) => Promise<StallActionResult> {\n const run =\n action === \"steer\" ? steerStallHandler(db, { callers }) : releaseStallHandler(db, { callers });\n return async (ctx) => {\n const res = await run(ctx);\n process.stderr.write(\n stallActionLine(`${ctx.ref.workstream}/${ctx.ref.id}`, ctx.owner.name, res),\n );\n return res;\n };\n}\n\n/** Run one wait and print its one document. Throws CliExitError(exit) after printing when the exit is not 0. */\nexport async function runWait(\n db: Db,\n spec: WaitSpec,\n sig: WaitSignals,\n opts: {\n /** A resume runs for the callers the stored wait ran for, not for whoever types it. */\n callers?: readonly string[];\n /** The producer's receipt (`sent`, `claimed`, `warnings`) when a verb entered the wait: see WaitDataInput.extra. */\n extraData?: Record<string, unknown>;\n } = {},\n): Promise<void> {\n const callers = opts.callers !== undefined ? [...opts.callers] : currentCallers();\n if (spec.refs.length === 0 && spec.wave === undefined && spec.blockersOf === undefined) {\n if (callers.length === 0) {\n throw new UsageError(\n `${spec.verb}: nothing to wait for. Name refs (${TYPED_FORMS}), or run as a managed agent or a pi session: a wait with no refs owns what that caller started`,\n { showHelp: false },\n );\n }\n }\n if (spec.wave !== undefined && callers.length === 0) {\n throw new UsageError(\n `${spec.verb}: --wave counts delegate calls, which belong to the pi session that issued them; no pi session here (PI_SESSION_ID unset)`,\n { showHelp: false },\n );\n }\n if (spec.untilText !== undefined) {\n try {\n compileTextMatcher(spec.untilText);\n } catch (e) {\n throw new UsageError(e instanceof Error ? e.message : String(e), {\n showHelp: false,\n });\n }\n }\n const status = spec.status !== undefined ? parseStatusOption(spec.status) : undefined;\n const timeoutS = spec.timeout ?? WAIT_DEFAULT_TIMEOUT_S;\n\n let open = 0;\n let last: readonly WaitSnapshot[] = [];\n const warned = new Set<string>();\n const started = Date.now();\n const beat = setInterval(() => {\n const s = Math.round((Date.now() - started) / 1000);\n process.stderr.write(\n `mu wait: ${s}s elapsed, ${open} still open (a signal prints the snapshot)\\n`,\n );\n }, HEARTBEAT_MS);\n beat.unref();\n\n let result: WaitResult;\n try {\n result = await waitWithActions(db, spec.refs, {\n callers,\n mode: spec.mode,\n eventScope: \"owned\",\n ...(spec.scope !== undefined ? { scope: spec.scope } : {}),\n ...(status !== undefined ? { status } : {}),\n ...(spec.untilText !== undefined ? { until: { text: spec.untilText } } : {}),\n ...(spec.stuckAfter !== undefined ? { stuckAfterMs: spec.stuckAfter * 1000 } : {}),\n onStall: spec.onStall,\n ...(spec.onStall === \"steer\" || spec.onStall === \"release\"\n ? { handleStall: stallHandler(db, spec.onStall, callers) }\n : {}),\n ...(spec.wave !== undefined ? { wave: { name: spec.wave } } : {}),\n ...(spec.blockersOf !== undefined ? { blockersOf: spec.blockersOf } : {}),\n timeoutMs: Math.round(timeoutS * 1000),\n ...(spec.since !== undefined ? { sinceSeq: spec.since } : {}),\n signal: sig.signal,\n ...ctlAgentHooks(db, { paneText: spec.untilText !== undefined }),\n beforePoll: reconcileHook(db, spec, () =>\n last.length > 0 ? last.map((s) => s.ref) : spec.refs,\n ),\n onPicture: (snaps) => {\n last = snaps;\n open = snaps.filter((s) => !s.fired && !s.dead).length;\n // --on-stall warn: one stderr line per stalled task, then the wait goes on.\n if (spec.onStall !== \"warn\") return;\n for (const s of snaps) {\n const key = `${s.ref.workstream}/${s.ref.id}`;\n if (s.stuck !== true || warned.has(key)) continue;\n warned.add(key);\n process.stderr.write(\n `mu wait: ${key}: owner ${s.owner ?? \"?\"} needs attention (${s.stuckWhy ?? \"needs_input\"} for ${s.stuckSecs ?? 0}s); still waiting (--on-stall warn). Read it: mu agent read ${s.owner ?? \"<owner>\"} -w ${s.ownerWorkstream ?? s.ref.workstream}\\n`,\n );\n }\n },\n });\n } finally {\n clearInterval(beat);\n }\n\n const signal = sig.which();\n const exit = result.interrupted ? (signal === \"SIGTERM\" ? 143 : 130) : result.exit;\n const openNow = result.refs.filter((s) => !s.fired && !s.dead).length;\n // The handle: what is still owed, stored; the printed line stays tiny. With no caller there is\n // nothing to discover, so no owed ref (and no wave or blockers) means nothing to resume.\n const owed = owedRefs(result, spec.refs);\n const resumable =\n owed.length > 0 ||\n callers.length > 0 ||\n spec.wave !== undefined ||\n spec.blockersOf !== undefined;\n const resumeId = resumable\n ? saveResume(db, callers, {\n refs: owed,\n mode: spec.mode,\n onStall: spec.onStall,\n ...(spec.scope !== undefined ? { scope: spec.scope } : {}),\n ...(status !== undefined ? { status } : {}),\n ...(spec.untilText !== undefined ? { untilText: spec.untilText } : {}),\n ...(spec.stuckAfter !== undefined ? { stuckAfter: spec.stuckAfter } : {}),\n ...(spec.wave !== undefined ? { wave: spec.wave } : {}),\n ...(spec.blockersOf !== undefined ? { blockersOf: spec.blockersOf } : {}),\n ...(spec.timeout !== undefined ? { timeout: spec.timeout } : {}),\n ...(result.sinceSeq !== undefined ? { since: result.sinceSeq } : {}),\n })\n : null;\n const resume = resumeId === null ? null : resumeCommand(resumeId, spec.scope);\n // A wait that ended with something still owed: `next` is its stored resume.\n if (resumeId !== null && openNow > 0) {\n setNextOutcome({\n kind: \"waited\",\n resumeId,\n ...(spec.scope !== undefined ? { scope: spec.scope } : {}),\n });\n }\n const short =\n result.timedOut && spec.timeout !== undefined && spec.timeout > 0 && spec.timeout < 300\n ? `--timeout ${spec.timeout} is below the ${WAIT_DEFAULT_TIMEOUT_S}s default: the wait ended at your deadline, not on an event; run the resume command`\n : undefined;\n emitJson(\n waitData({\n result,\n exit,\n resume,\n ...(resume === null\n ? {\n resumeWhy:\n \"everything named was delivered and no caller owns more: nothing left to wait for\",\n }\n : {}),\n ...(signal !== undefined ? { signal } : {}),\n reason: reasonOf(result, signal, openNow),\n ...(short !== undefined ? { warning: short } : {}),\n // The call's workstream: its -w, else every workstream its refs name.\n ...noticesField(\n db,\n spec.scope !== undefined ? [spec.scope] : result.refs.map((s) => s.ref.workstream),\n ),\n ...(opts.extraData !== undefined ? { extra: opts.extraData } : {}),\n }),\n );\n sig.dispose();\n if (exit !== 0) throw new CliExitError(exit);\n}\n\n// ─── commander wiring ──────────────────────────────────────────────\n\ninterface WaitOpts {\n first?: boolean;\n firstOf?: boolean;\n all?: boolean;\n allOf?: boolean;\n untilIdle?: boolean;\n untilText?: string;\n status?: string;\n stuckAfter?: number;\n onStall?: string;\n wave?: string;\n blockersOf?: string;\n timeout?: number;\n afterRuns?: number;\n inc?: string;\n resume?: string;\n workstream?: string | string[];\n}\n\n/** `--first`/`--first-of` versus `--all`/`--all-of`: one mode, or a usage error (never a silent pick). */\nexport function waitMode(\n o: Pick<WaitOpts, \"first\" | \"firstOf\" | \"all\" | \"allOf\"> & { any?: boolean },\n): \"first\" | \"all\" {\n const first = o.first === true || o.firstOf === true || o.any === true;\n const all = o.all === true || o.allOf === true;\n if (first && all) {\n throw new UsageError(\n \"--first and --all are opposites: drop --first to wait for every ref, or drop --all to return on the first\",\n {\n showHelp: false,\n },\n );\n }\n return all ? \"all\" : \"first\";\n}\n\n/** `--on-stall`: exit, warn, steer or release. */\nexport function parseOnStall(raw: string | undefined): \"exit\" | \"warn\" | \"steer\" | \"release\" {\n const v = raw ?? \"exit\";\n if (v === \"exit\" || v === \"warn\" || v === \"steer\" || v === \"release\") return v;\n throw new UsageError(\n `--on-stall: expected 'exit', 'warn', 'steer' or 'release', got ${JSON.stringify(v)}`,\n { showHelp: false },\n );\n}\n\n/** `--blockers-of [<ws>/]<task>` as a checked task ref. */\nexport async function parseBlockersOf(\n db: Db,\n raw: string,\n scope: string | undefined,\n): Promise<{ workstream: string; id: string }> {\n const parsed = parseQualifiedRef(raw);\n const workstream =\n parsed.workstream !== undefined\n ? checkQualifiedPrefix(raw, parsed.workstream)\n : await resolveExistingWorkstream(db, scope);\n if (getTask(db, parsed.name, workstream) === undefined) {\n throw new TaskNotFoundError(\n parsed.workstream !== undefined ? raw : parsed.name,\n workstream,\n parsed.name,\n );\n }\n return { workstream, id: parsed.name };\n}\n\nexport async function cmdWait(\n db: Db,\n rawRefs: readonly string[],\n o: WaitOpts,\n sig: WaitSignals,\n): Promise<void> {\n if (o.resume !== undefined) return cmdWaitResume(db, rawRefs, o, sig);\n const mode = waitMode(o);\n if (o.untilIdle === true && o.untilText !== undefined) {\n throw new UsageError(\"--until-idle and --until-text are two different conditions: pass one\", {\n showHelp: false,\n });\n }\n const scope = normalizeInheritedWorkstream(o.workstream);\n if (scope !== undefined) checkWorkstreamName(scope);\n const onStall = parseOnStall(o.onStall);\n const refs: WaitRef[] = [];\n for (const raw of rawRefs) {\n refs.push(await parseWaitRef(db, raw, scope, { afterRuns: o.afterRuns, inc: o.inc }));\n }\n if ((o.afterRuns !== undefined || o.inc !== undefined) && !refs.some((r) => r.kind === \"agent\")) {\n throw new UsageError(\"--after-runs / --inc pin an agent ref: name one (agent:<name>)\", {\n showHelp: false,\n });\n }\n const spec: WaitSpec = {\n refs,\n mode,\n onStall,\n verb: \"mu wait\",\n ...(scope !== undefined ? { scope } : {}),\n ...(o.status !== undefined ? { status: o.status } : {}),\n ...(o.untilText !== undefined ? { untilText: o.untilText } : {}),\n ...(o.stuckAfter !== undefined ? { stuckAfter: o.stuckAfter } : {}),\n ...(o.wave !== undefined ? { wave: o.wave } : {}),\n ...(o.blockersOf !== undefined\n ? { blockersOf: await parseBlockersOf(db, o.blockersOf, scope) }\n : {}),\n ...(o.timeout !== undefined ? { timeout: o.timeout } : {}),\n };\n await runWait(db, spec, sig);\n}\n\n/**\n * `mu wait --resume <id>`: the stored wait, whole. Nothing else may be named (a flag or a\n * ref beside the handle would be a second, silently different wait); the callers are the\n * ones the stored wait ran for. `-w` is a guard: it must name the stored scope.\n */\nasync function cmdWaitResume(\n db: Db,\n rawRefs: readonly string[],\n o: WaitOpts,\n sig: WaitSignals,\n): Promise<void> {\n const id = o.resume ?? \"\";\n const extras = (\n [\n [\"refs\", rawRefs.length > 0],\n [\n \"--first/--all\",\n o.first === true || o.firstOf === true || o.all === true || o.allOf === true,\n ],\n [\"--until-idle\", o.untilIdle === true],\n [\"--until-text\", o.untilText !== undefined],\n [\"--status\", o.status !== undefined],\n [\"--stuck-after\", o.stuckAfter !== undefined],\n [\"--on-stall\", o.onStall !== undefined],\n [\"--wave\", o.wave !== undefined],\n [\"--blockers-of\", o.blockersOf !== undefined],\n [\"--timeout\", o.timeout !== undefined],\n [\"--after-runs/--inc\", o.afterRuns !== undefined || o.inc !== undefined],\n ] as const\n )\n .filter(([, given]) => given)\n .map(([name]) => name);\n if (extras.length > 0) {\n throw new UsageError(\n `--resume ${id} replays the stored wait as it was: do not also pass ${extras.join(\", \")} (to change the wait, name the refs again without --resume)`,\n { showHelp: false },\n );\n }\n const stored = loadResume(db, id);\n const scope = normalizeInheritedWorkstream(o.workstream);\n if (scope !== undefined && scope !== stored.spec.scope) {\n throw new UsageError(\n `--resume ${id}: -w ${scope} does not match the stored wait (${stored.spec.scope === undefined ? \"no workstream\" : `-w ${stored.spec.scope}`})`,\n { showHelp: false },\n );\n }\n await runWait(db, { ...stored.spec, verb: \"mu wait --resume\" }, sig, { callers: stored.callers });\n}\n\nexport function wireWaitCommand(program: Command): void {\n program\n .command(\"wait\")\n .argument(\"[refs...]\", `typed: ${TYPED_FORMS}; none = what this caller started`)\n .description(\n \"Block until the first event you own, then print ONE JSON result: `data.firing`, `exit` (6 owner died, 7 needs you), `snapshots`, `cursor` (consumed; `cursorCut` = entries dropped to fit), `resume` (run as printed; no other flags).\",\n )\n .option(\"--first\", \"end on the first event (default)\")\n .option(\"--first-of\", \"alias for --first\")\n .option(\"--all\", \"end when every named ref is done (an urgent event still ends it early)\")\n .option(\"--all-of\", \"alias for --all\")\n .option(\"--until-idle\", \"a run ending is the event (default for agents)\")\n .option(\n \"--until-text <regex>\",\n \"a settled run's final text (or a done task's report) must match: bounded regex, at most 200 chars, no backreferences or lookaround. A pi agent's text is its ctl lastText (never its pane); a non-pi pane has no ctl and no run to settle: its tail is matched and the wait ends as the distinct `pane-text` event (textSource:pane), never `settled`\",\n )\n .option(\n \"--status <status>\",\n `a task counts at this status (${TASK_STATUS_LIST}, case-insensitive); default CLOSED`,\n )\n .option(\n \"--stuck-after <seconds>\",\n \"report an owner stalled after this long in needs_input (0 = never; default 120, or 5 for a pi owner read over ctl); the stall is an event with exit 7\",\n parseSeconds,\n )\n .option(\n \"--on-stall <action>\",\n \"exit (default): a stall ends the wait; warn: flag it (`stuck` on the snapshot) and keep waiting; steer: send the stalled owner ONE fixed reminder (once per task and owner) and keep waiting; release: free the stalled task for another worker and end the wait (`data.action` says what was done). steer and release act only on workers this caller spawned\",\n )\n .option(\n \"--wave <name>\",\n \"wait on this caller's delegate calls of the wave, in any workstream (-w does not narrow it); the result carries `data.tally`; an unknown name is exit 3\",\n )\n .option(\n \"--blockers-of <task>\",\n \"wait on every open transitive blocker of this task, re-read each poll\",\n )\n .option(\n \"--timeout <seconds>\",\n `heartbeat deadline, fractions allowed (default ${WAIT_DEFAULT_TIMEOUT_S}, which is also the cap; 0 = the cap)`,\n parseSeconds,\n )\n .option(\n \"--after-runs <n>\",\n \"agent refs: count runs past N (what `mu agent send --json` printed)\",\n (v) => {\n if (!/^\\d+$/.test(v))\n throw new UsageError(`--after-runs: expected a whole number, got ${JSON.stringify(v)}`, {\n showHelp: false,\n });\n return Number(v);\n },\n )\n .option(\"--inc <incarnation>\", \"agent refs: pin the pi process; another one is refused\")\n .option(\n \"--resume <id>\",\n \"continue the wait a result's `resume` handle names, with every stored condition (refs with their run baseline and pi incarnation, mode, filters, deadline, callers); only -w may be added (it must match the stored scope)\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (refs: string[]) {\n const opts = (this as Command).optsWithGlobals() as WaitOpts;\n // Listen before anything is awaited (the DB open included).\n const sig = installWaitSignals();\n const run = handle((db) => cmdWait(db, refs, opts, sig), this as Command);\n return run().finally(() => sig.dispose());\n });\n}\n\n// `agentKey` is re-exported for the alias in tasks/claim.ts (one key spelling).\nexport { agentKey, injectedWorkstream };\n","// mu — producer arming: what `spawn --send`, `send`, `send --interrupt` and\n// `claim --for` owe the next wait.\n//\n// A producer that DID something (delivered a prompt, handed a task over)\n// registers the typed refs it started under the caller's identity\n// (`wait_registrations`, src/wait-registration.ts), so a later bare `mu wait`\n// (or the settle hook) owns them without anyone parsing a shell line. Three rules:\n//\n// 1. The caller is the managed `<ws>/<agent>` when there is one, else\n// `pi:<session>`: the same name `agents.spawner` records, so one ref is owed\n// to exactly one caller. No identity (a plain shell) arms nothing; an\n// explicit `mu wait <ref>` still works there.\n// 2. An agent ref carries the UNCONSUMED fence the producer measured BEFORE its\n// effect (ctl runs, pi incarnation, registry id): a run that settles before\n// any wait starts is still delivered. Never a baseline sampled afterwards.\n// 3. Arming never fails the producer. The effect is committed; a refused or\n// full registration comes back as a warning, and provenance discovery\n// (src/wait.ts) still finds spawned workers' in-progress tasks.\n//\n// Direct SDK calls (spawnAgent, sendToAgent, claimTask, spawnForTask) do not arm:\n// the verbs do, because only they know whether the effect landed.\n\nimport { getAgent } from \"../agents.js\";\nimport type { Db } from \"../db.js\";\nimport { currentCallers } from \"../wait-callers.js\";\nimport { type RefBaseline, type RegisterRef, registerOwnedWait } from \"../wait-registration.js\";\nimport { setNextArmed } from \"./handle.js\";\n\nexport interface ArmResult {\n armed: boolean;\n /** The caller the refs were registered under. */\n caller?: string;\n /** Set when registration was refused: the producer's effect stands. */\n warning?: string;\n}\n\n/** The agent ref a delivered prompt owes, fenced by what the producer saw before it. */\nexport function agentRef(\n agent: { name: string; workstreamName: string; incarnation: number },\n fence: { runs?: number; incarnation?: string } = {},\n): RegisterRef {\n const baseline: RefBaseline | undefined =\n fence.runs === undefined\n ? undefined\n : {\n afterRuns: fence.runs,\n agentId: agent.incarnation,\n ...(fence.incarnation !== undefined ? { incarnation: fence.incarnation } : {}),\n };\n return {\n kind: \"agent\",\n workstream: agent.workstreamName,\n id: agent.name,\n ...(baseline !== undefined ? { baseline } : {}),\n };\n}\n\n/** The task ref of work a producer handed over, in the TASK's own workstream. */\nexport function taskRef(workstream: string, id: string): RegisterRef {\n return { kind: \"task\", workstream, id };\n}\n\n/** Register `refs` for the current caller; never throws. */\nexport function armWait(db: Db, refs: readonly RegisterRef[]): ArmResult {\n const caller = currentCallers()[0];\n if (caller === undefined || refs.length === 0) return { armed: false };\n try {\n registerOwnedWait(db, caller, refs);\n setNextArmed();\n return { armed: true, caller };\n } catch (e) {\n return {\n armed: false,\n caller,\n warning: `the wait was not armed (${e instanceof Error ? e.message : String(e)}); the work itself is committed; name it with mu wait`,\n };\n }\n}\n\n/** What a send measured before its effect (the SendResult / InterruptResult / saved receipt fields). */\nexport interface SentFence {\n transport?: \"ctl\" | \"mux\";\n runs?: number;\n incarnation?: string;\n}\n\n/**\n * Arm the wait a DELIVERED prompt owes. A ctl send with a run count is fenced exactly\n * (runs + incarnation + registry id). A delivered mux send (a non-pi pane: its busy-to-idle\n * is all there is) is owed with no fence. A ctl send with no run count (a slash command,\n * an extension that predates runs) started no run: no agent ref. `extraRefs` ride in the\n * same registration (the task a spawn bound), so it is all or nothing.\n */\nexport function armSend(\n db: Db,\n agent: { name: string; workstreamName: string },\n sent: SentFence,\n extraRefs: readonly RegisterRef[] = [],\n): ArmResult {\n const row = getAgent(db, agent.name, agent.workstreamName);\n if (row === undefined) return { armed: false };\n if (sent.transport !== \"mux\" && sent.runs === undefined) return armWait(db, extraRefs);\n return armWait(db, [\n ...extraRefs,\n agentRef(\n row,\n sent.transport === \"mux\"\n ? {}\n : {\n runs: sent.runs,\n ...(sent.incarnation !== undefined ? { incarnation: sent.incarnation } : {}),\n },\n ),\n ]);\n}\n","// mu — who is running this process, for `mu me` and `mu state --me`.\n//\n// One path, no guessing: a managed worker's injected identity (the exact\n// `<ws>/<name>` row, looked up in THAT workstream), else a pi session\n// (`pi:<PI_SESSION_ID>`, which has no agent row), else an error. `$TMUX_PANE`\n// and pane titles never identify anyone here (the older `resolveSelf` still\n// does, for the verbs that have not moved).\n\nimport { spawnerFromEnv } from \"../agents/spawn.js\";\nimport { type AgentRow, getAgent } from \"../agents.js\";\nimport { injectedIdentity } from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { UsageError } from \"./handle.js\";\n\nexport interface MeIdentity {\n /** `spawnerFromEnv()` form: `<ws>/<agent>` or `pi:<session>`. */\n caller: string;\n /** The managed agent's registry row; null for a pi session. */\n agent: AgentRow | null;\n}\n\nexport function resolveMe(db: Db): MeIdentity {\n const injected = injectedIdentity();\n if (injected !== undefined) {\n const agent = getAgent(db, injected.name, injected.workstream);\n if (agent === undefined) {\n throw new UsageError(\n `injected identity ${injected.workstream}/${injected.name} has no agent row (closed or torn down). Use \\`mu agent list -w ${injected.workstream}\\`.`,\n { showHelp: false },\n );\n }\n return { caller: `${injected.workstream}/${injected.name}`, agent };\n }\n const caller = spawnerFromEnv();\n if (caller !== null) return { caller, agent: null };\n throw new UsageError(\n \"no identity: mu me needs the env spawn injects (MU_MANAGED_AGENT=1, MU_WORKSTREAM, MU_AGENT_NAME) or a pi session ($PI_SESSION_ID); a tmux pane is never guessed\",\n { showHelp: false },\n );\n}\n\n/** The managed agent, for `mu me tasks` / `mu me next`: they read one agent's workstream, so a pi session (no row) cannot use them. */\nexport function resolveMeAgent(db: Db): AgentRow {\n const me = resolveMe(db);\n if (me.agent === null) {\n throw new UsageError(\n `${me.caller} is not a managed agent: this verb needs MU_MANAGED_AGENT=1, MU_WORKSTREAM and MU_AGENT_NAME. Use \\`mu state --me\\` for a pi session.`,\n { showHelp: false },\n );\n }\n return me.agent;\n}\n","// mu — `mu state` and `mu me` (the canonical state read).\n//\n// mu state -w <ws>[,<ws>…] | --all tasks, agents, the caller's delegate queue\n// and waves, its open human needs\n// mu state --me the same, from the caller's own identity\n// mu me exactly `mu state --me`\n//\n// The output is ONE JSON document (envelope included) by default: SQL column\n// names, at most RESULT_BYTES. A cut says `more=N` records left out and `cut=N`\n// characters clipped, and names the one way back: the same read with `--full`.\n// `mu state -w` reconciles first (reaps panes that are gone, lists orphans);\n// `--me` and the snapshot itself never touch the mux. Identity is\n// src/cli/me-identity.ts: the injected `<ws>/<name>` or a pi session, never a pane.\n\nimport type { Command } from \"commander\";\nimport { spawnerFromEnv } from \"../agents/spawn.js\";\nimport {\n emitJson,\n handle,\n injectedWorkstream,\n JSON_OPT,\n missingWorkstreamError,\n parseWorkstreamList,\n requireLiveWorkstream,\n UsageError,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { noticesField } from \"../next-hints.js\";\nimport { RESULT_BYTES } from \"../output-contract.js\";\nimport { reconcile } from \"../reconcile.js\";\nimport { shellWord } from \"../shell-quote.js\";\nimport {\n callerWorkstreams,\n type StateSnapshot,\n stateSnapshot,\n type WorkstreamState,\n} from \"../state.js\";\nimport { listWorkstreams } from \"../workstream.js\";\nimport { resolveMe } from \"./me-identity.js\";\nimport { clipEscaped, jsonDocument } from \"./tasks/records.js\";\n\nexport interface StateOpts {\n /** Variadic: `-w a b`, `-w a,b`, `-w a -w b`. */\n workstream?: string[];\n all?: boolean;\n me?: boolean;\n /** No cap: the whole snapshot. */\n full?: boolean;\n json?: boolean;\n}\n\n/** Longest string any field of a state read keeps (code points); a clipped one counts into `cut`. */\nconst FIELD_CHARS = 160;\n/** Largest per-list length tried; the loop shrinks it until the document fits. */\nconst LIST_STEPS = [20, 10, 5, 3, 2, 1, 0];\n/** Field lengths the zero-item fallback tries, longest first (the identity block's fields shrink). */\nconst FALLBACK_CHARS = [FIELD_CHARS, 80, 40, 20, 10, 5];\n\n// ─── Scope ─────────────────────────────────────────────────────────\n\nasync function resolveScope(db: Db, opts: StateOpts): Promise<string[]> {\n const explicitW = opts.workstream !== undefined && opts.workstream.length > 0;\n if (opts.all === true && explicitW) {\n throw new UsageError(\"--all and -w/--workstream are mutually exclusive\", { showHelp: false });\n }\n if (opts.all === true) return (await listWorkstreams(db)).map((w) => w.name);\n if (explicitW) {\n // Repeat / comma / mixed forms become one flat list; blank or padded names are a usage error.\n const names = Array.from(new Set(parseWorkstreamList(opts.workstream ?? [])));\n for (const n of names) {\n requireLiveWorkstream(db, n);\n }\n if (names.length > 0) return names;\n }\n if (opts.me === true) {\n // Own scope: a managed agent's workstream, or where a pi session has work.\n const me = resolveMe(db);\n return me.agent !== null ? [me.agent.workstreamName] : callerWorkstreams(db, me.caller);\n }\n const injected = injectedWorkstream();\n if (injected !== undefined) return [injected];\n const first = (await listWorkstreams(db))[0]?.name;\n throw await missingWorkstreamError({\n orAll: true,\n ...(first ? { extra: `e.g. -w ${first}` } : {}),\n });\n}\n\n/** The same read, uncapped: what a cut result names. `short` drops the scope names for `--all` (a superset, but a fixed-size command). */\nfunction fullCommand(opts: StateOpts, scope: readonly string[], short = false): string {\n const parts = [\"mu\", \"state\"];\n if (opts.me === true) parts.push(\"--me\");\n if (opts.all === true || short) parts.push(\"--all\");\n else if ((opts.workstream?.length ?? 0) > 0) parts.push(\"-w\", scope.map(shellWord).join(\",\"));\n parts.push(\"--full\");\n return parts.join(\" \");\n}\n\n// ─── Bounding ──────────────────────────────────────────────────────\n\ninterface Bounded {\n data: Record<string, unknown>;\n more: number;\n cut: number;\n}\n\n/** Every string of `value` as one inert, escaped line of at most `chars` characters (`…` ends a clipped one); `n.cut` counts the code points dropped. */\nfunction clipStrings(value: unknown, n: { cut: number }, chars: number): unknown {\n if (typeof value === \"string\") {\n const whole = clipEscaped(value, chars);\n if (whole.cut === 0) return whole.text;\n const room = clipEscaped(value, chars - 1);\n n.cut += room.cut;\n return `${room.text}…`;\n }\n if (Array.isArray(value)) return value.map((v) => clipStrings(v, n, chars));\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, clipStrings(v, n, chars)]));\n }\n return value;\n}\n\nconst LISTS = [\n \"ready\",\n \"in_progress\",\n \"blocked\",\n \"triage\",\n \"recent_closed\",\n \"agents\",\n \"orphans\",\n \"delegates\",\n \"waves\",\n \"human_needs\",\n] as const;\n\n/** `snap` with every list cut to `k` records, workstreams cut to `wsCount`, strings clipped to `chars`. */\nfunction bound(snap: StateSnapshot, k: number, wsCount: number, chars = FIELD_CHARS): Bounded {\n let more = Math.max(0, snap.workstreams.length - wsCount);\n const limit = <T>(list: readonly T[]): T[] => {\n more += Math.max(0, list.length - k);\n return list.slice(0, k);\n };\n const workstreams = snap.workstreams.slice(0, wsCount).map((w) => {\n const out: Record<string, unknown> = { ...w };\n for (const key of LISTS) {\n const list = (w as unknown as Record<string, unknown[] | undefined>)[key];\n if (list !== undefined) out[key] = limit(list);\n }\n return out;\n });\n const me = snap.me === null ? null : { ...snap.me, owned_tasks: limit(snap.me.owned_tasks) };\n const n = { cut: 0 };\n const data = clipStrings({ caller: snap.caller, me, workstreams }, n, chars) as Record<\n string,\n unknown\n >;\n return { data, more, cut: n.cut };\n}\n\nconst sizeOf = (data: unknown): number => Buffer.byteLength(jsonDocument(data)) + 1;\n\n/**\n * The largest read (lists, then workstreams) whose FINAL document fits\n * RESULT_BYTES, with its cut counts and way back. When even bare counts\n * overflow, the last resorts are zero-item envelopes (no workstream) whose\n * `retrieve` is `short` if the named one is too long, and whose strings (the\n * identity block's) shrink until the document fits: the fallback is validated\n * like every other candidate, never returned unchecked.\n */\nexport function boundState(\n snap: StateSnapshot,\n retrieve: string,\n full: boolean,\n short = retrieve,\n notices: { notices?: string[] } = {},\n): unknown {\n if (full) return { caller: snap.caller, me: snap.me, workstreams: snap.workstreams, ...notices };\n const finish = (b: Bounded, way: string): Record<string, unknown> => ({\n ...b.data,\n ...notices,\n ...(b.more > 0 ? { more: b.more } : {}),\n ...(b.cut > 0 ? { cut: b.cut } : {}),\n ...(b.more > 0 || b.cut > 0 ? { retrieve: way } : {}),\n });\n const count = snap.workstreams.length;\n const ways = retrieve === short ? [retrieve] : [retrieve, short];\n const fit = (b: Bounded): Record<string, unknown> | null => {\n for (const way of ways) {\n const doc = finish(b, way);\n if (sizeOf(doc) <= RESULT_BYTES) return doc;\n }\n return null;\n };\n for (const k of LIST_STEPS) {\n const doc = fit(bound(snap, k, count));\n if (doc !== null) return doc;\n }\n // Even bare counts overflow: page the workstreams themselves (none is allowed).\n for (let w = count - 1; w >= 1; w--) {\n const doc = fit(bound(snap, 0, w));\n if (doc !== null) return doc;\n }\n for (const chars of FALLBACK_CHARS) {\n const doc = fit(bound(snap, 0, 0, chars));\n if (doc !== null) return doc;\n }\n return finish(bound(snap, 0, 0, 1), short);\n}\n\n// ─── cmdState ──────────────────────────────────────────────────────\n\nexport async function cmdState(db: Db, opts: StateOpts): Promise<void> {\n const me = opts.me === true ? resolveMe(db) : null;\n const caller = me?.caller ?? spawnerFromEnv();\n const scope = await resolveScope(db, opts);\n\n // Explicit reconciliation is the CLI's (it reaps panes that are gone and\n // finds orphans); `--me` reads no mux, and the snapshot never writes.\n const orphans = new Map<string, WorkstreamState[\"orphans\"]>();\n if (me === null) {\n for (const ws of scope) {\n const report = await reconcile(db, { workstream: ws });\n orphans.set(\n ws,\n report.orphans.map((p) => ({ pane_id: p.paneId, command: p.command })),\n );\n }\n }\n\n const snap = await stateSnapshot(db, {\n workstreams: scope,\n caller,\n ...(me !== null ? { me: { agent: me.agent } } : {}),\n });\n for (const w of snap.workstreams) {\n const found = orphans.get(w.workstream);\n if (found !== undefined) w.orphans = found;\n }\n emitJson(\n boundState(\n snap,\n fullCommand(opts, scope),\n opts.full === true,\n fullCommand(opts, scope, true),\n noticesField(db, scope),\n ),\n );\n}\n\n// ─── commander wiring ──────────────────────────────────────────────\n\nexport function wireStateCommands(program: Command): void {\n program\n .command(\"state\")\n .description(\n \"ONE JSON document of canonical state: per workstream task counts and lists, agents with runtime state, orphan panes, and the CALLER'S delegates and human needs. -w repeats; --all; --me (own identity). 4 KB cap; a cut names --full.\",\n )\n .option(\n \"-w, --workstream <names...>\",\n \"workstream(s) to read (repeat or comma-separate; or both). Required unless --all, --me or run as a spawned worker\",\n )\n .option(\"--all\", \"include every workstream on this machine\")\n .option(\n \"--me\",\n \"the caller's own identity and owned tasks, with its delegate queue and human needs\",\n )\n .option(\"--full\", \"no cap: the whole read (a cut result names this command)\")\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).opts() as StateOpts;\n return handle((db) => cmdState(db, opts), this as Command)();\n });\n}\n","// mu — pure rendering helpers used by every cli/*.ts verb wrapper.\n//\n// The table renderers, status colourers, truncators, and relative-time\n// formatter were the bulk of cli.ts's bloat (~600 LOC over the 800-LOC\n// refactor signal). Co-locating them here keeps cli.ts focused on\n// argument parsing, workstream resolution, and program wiring.\n//\n// All helpers are pure (no I/O beyond returning a string). cli.ts\n// re-exports every symbol for back-compat with the existing import\n// surface (tests + cli/* importers).\n\nimport { type RuntimeState, UNKNOWN_REASON } from \"../agent-state.js\";\nimport type { LiveAgent } from \"../agents.js\";\nimport { agentStateGlyph, GLYPH } from \"../glyphs.js\";\nimport { muTable, pc } from \"../output.js\";\nimport { RESULT_BYTES } from \"../output-contract.js\";\nimport { formatPair, type TaskPair } from \"../tasks/status.js\";\nimport type { TaskNoteRow } from \"../tasks.js\";\n\n// ─── Status colours / icons ────────────────────────────────────────────\n\n/** Per-status colour for the table view. The glyph itself comes from\n * agentStateGlyph in src/glyphs.ts — single source of truth so the\n * CLI and TUI status surfaces never drift. */\nconst STATUS_COLORS: Record<RuntimeState, (s: string) => string> = {\n busy: pc.cyan,\n needs_input: pc.dim,\n needs_permission: pc.magenta,\n unknown: pc.dim,\n};\n\nexport function statusIcon(state: RuntimeState): string {\n return STATUS_COLORS[state](agentStateGlyph(state));\n}\n\n/**\n * Glyph used to flag the derived 'idle but assigned' state\n * (`AgentRow.idle === true`; idle_assigned_agent_detection). Same\n * warning glyph the doctor card paints for a `warn` check — one\n * symbol, one meaning, from src/glyphs.ts.\n */\nexport const IDLE_GLYPH = GLYPH.warn;\n\n/** Colour a task's (status, substate) pair, rendered by formatPair:\n * bare \"OPEN\" for a default substate, \"CLOSED/wontfix\" otherwise.\n * OPEN cyan, IN_PROGRESS yellow, CLOSED/done green, any other CLOSED\n * red (not done), OPEN/parked dim (out of the ready set). */\nexport function colorPair(pair: TaskPair): string {\n const text = formatPair(pair);\n switch (pair.status) {\n case \"OPEN\":\n return pair.substate === \"parked\" || pair.substate === \"triage\"\n ? pc.dim(text)\n : pc.cyan(text);\n case \"IN_PROGRESS\":\n return pc.yellow(text);\n case \"CLOSED\":\n return pair.substate === \"done\" ? pc.green(text) : pc.red(text);\n }\n}\n\n// ─── Width / truncation helpers ───────────────────────────────────────\n\n/** Truncate `s` to fit `max` columns (counting display width as length;\n * good enough for ASCII titles, undercount for emoji/CJK — acceptable\n * trade-off given the terminal will visually clip anyway). Adds an\n * ellipsis when truncated. */\nexport function truncate(s: string, max: number): string {\n if (max <= 1) return s.slice(0, max);\n if (s.length <= max) return s;\n return `${s.slice(0, max - 1)}…`;\n}\n\n/** Front-truncate `s` to fit `max` columns, prepending an ellipsis when\n * truncated. Used for paths where the trailing `<workstream>/<agent>`\n * suffix is the only useful bit (the leading `~/.local/state/mu-next/...`\n * prefix is identical for every row). Surfaced live by `mu agent\n * list` blowing the terminal width on the `path` column\n * (tables_truncate_long_cols_audit). */\nexport function truncateFront(s: string, max: number): string {\n if (max <= 1) return s.slice(-max);\n if (s.length <= max) return s;\n return `…${s.slice(-(max - 1))}`;\n}\n\n/** Format an elapsed duration (in ms) as a compact relative string:\n * '12s', '3m', '1h', '2d', '3w'. Used by the task list table when\n * `--sort recency`/`--sort age` is active so the timeframe the user\n * is sorting by is visible. Mirrors the helper in src/cli/state.ts\n * (TUI renderers); kept in sync (the TUI version omits weeks because it shows tighter\n * windows, but for task list a 5w-old item is real and worth a tag).\n */\nexport function relTime(ms: number): string {\n const sec = Math.max(0, Math.floor(ms / 1000));\n if (sec < 60) return `${sec}s`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h`;\n const day = Math.floor(hr / 24);\n if (day < 7) return `${day}d`;\n return `${Math.floor(day / 7)}w`;\n}\n\n/** Like {@link relTime} but with a trailing \" ago\" suffix. The TUI's\n * Recent card / popup wants past-tense formatting (\"3m ago\") while\n * the In-progress card / popup wants the bare token (\"3m\"); both\n * buckets share the rest of the arithmetic. Hoisted out of the TUI\n * cluster so the two formatters\n * can't drift the way they were starting to. */\nexport function relTimeAgo(ms: number): string {\n return `${relTime(ms)} ago`;\n}\n\n// ─── Table renderers ──────────────────────────────────────────────────\n\n/** Width of the cwd column: a worktree path is ~70 chars; front-truncate so\n * the useful trailing `<ws>/<agent>` suffix survives. */\nconst CWD_BUDGET = 40;\n\nexport function formatAgentsTable(agents: readonly LiveAgent[]): string {\n if (agents.length === 0) return pc.dim(\" (no agents)\");\n // Cap the variable-width columns so a long tmux window name (or a\n // future free-text role) can't push the table past the terminal.\n // Other columns are bounded by their schemas (name 32-char cap,\n // cli is one of pi/codex/claude, status is one of OPEN/...).\n const table = muTable({\n head: [\n pc.bold(\"\"),\n pc.bold(\"name\"),\n pc.bold(\"cli\"),\n pc.bold(\"state\"),\n pc.bold(\"window\"),\n pc.bold(\"role\"),\n pc.bold(\"cwd\"),\n ],\n colWidths: [null, null, null, null, 32, 14, CWD_BUDGET],\n style: { head: [] },\n });\n for (const a of agents) {\n // Idle (alive + assigned + no recent progress): supplement the\n // status glyph with the yellow shared warning glyph, and yellow the\n // agent name itself so the row is visually obvious. The status column\n // stays the truth ('needs_input'); GLYPH.warn is the supplement.\n const idle = a.idle === true;\n const glyphCell = idle\n ? `${pc.yellow(IDLE_GLYPH)} ${statusIcon(a.state)}`\n : statusIcon(a.state);\n const nameCell = idle ? pc.yellow(a.name) : a.name;\n table.push([\n glyphCell,\n nameCell,\n a.cli,\n (a.state === \"unknown\" || a.state === \"needs_permission\") && a.reason !== undefined\n ? `${a.state}: ${a.reason}`\n : a.state,\n a.tab ?? a.name,\n a.role === \"read-only\" ? pc.yellow(\"read-only\") : \"\",\n a.cwd === null ? pc.dim(\"—\") : truncateFront(a.cwd, CWD_BUDGET - 2),\n ]);\n }\n const needsMurmur = agents.some(\n (a) =>\n a.state === \"unknown\" &&\n (a.reason === UNKNOWN_REASON.murmurMissing || a.reason === UNKNOWN_REASON.extensionMissing),\n );\n return needsMurmur\n ? `${table.toString()}\\n${pc.dim(\"agent state needs murmur (see mu doctor)\")}`\n : table.toString();\n}\n\n// ─── Note records ──────────────────────────────────────────────────────\n\n/** Escape so one note is one line: `\\\\`, newline, tab and CR become two-character\n * escapes (the inverse of `unescapeNoteText`), so a raw tab or newline in\n * a record is always a separator. */\nexport function escapeNoteText(s: string): string {\n return s.replace(/[\\\\\\n\\t\\r]/g, (c) =>\n c === \"\\\\\" ? \"\\\\\\\\\" : c === \"\\n\" ? \"\\\\n\" : c === \"\\t\" ? \"\\\\t\" : \"\\\\r\",\n );\n}\n\n/** Characters of an oversize ordinary note kept as a preview in its stub. */\nconst NOTE_PREVIEW_CHARS = 120;\n/** Characters of the author a stub keeps; `show --note` prints the whole one. */\nconst STUB_AUTHOR_CHARS = 64;\n\n/** The author as a stub shows it: clipped, so free-text metadata cannot blow the cap. */\nexport function stubAuthor(author: string | null): string | null {\n if (author === null) return null;\n const chars = [...author];\n return chars.length <= STUB_AUTHOR_CHARS\n ? author\n : `${chars.slice(0, STUB_AUTHOR_CHARS).join(\"\")}…`;\n}\n\n/** The content preview a stub shows. */\nexport function stubPreview(content: string): string {\n return `${[...content].slice(0, NOTE_PREVIEW_CHARS).join(\"\")}…`;\n}\n\n/** One note, one line, TAB-separated: `kind n by=… at=… <escaped text>`.\n * `retrieve` marks a stub: author and text are clipped previews, `cut=` is the\n * whole note's bytes and `next=` names the command that prints it whole. */\nexport function noteRecord(\n n: TaskNoteRow,\n retrieve?: { cutBytes: number; command: string },\n): string {\n const author = retrieve === undefined ? n.author : stubAuthor(n.author);\n const head = [\n n.kind,\n String(n.n),\n `by=${escapeNoteText(author ?? \"<orchestrator>\")}`,\n `at=${n.createdAt}`,\n ];\n if (retrieve === undefined) return [...head, escapeNoteText(n.content)].join(\"\\t\");\n return [\n ...head,\n escapeNoteText(stubPreview(n.content)),\n `cut=${retrieve.cutBytes}`,\n `next=${retrieve.command}`,\n ].join(\"\\t\");\n}\n\n/** A note to print; `cutBytes` set on an oversize ordinary stub. */\nexport interface ShownNote {\n note: TaskNoteRow;\n cutBytes?: number;\n}\n\nexport interface PlannedNotes {\n /** Notes to print, oldest first. */\n shown: ShownNote[];\n /** `n` of every note left out, ascending. */\n omitted: number[];\n}\n\n/**\n * Apply the byte cap. It is measured on what is EMITTED: `size(ordinary)`\n * serializes the whole output for that set of ordinary notes (text lines or\n * JSON envelope, record keys and the `more` footer included) and returns its\n * bytes with the pinned notes set aside, because pinned notes (the brief,\n * report and verdicts) are content: always whole, never charged, never\n * dropped. A note that alone exceeds `budget` becomes a\n * stub, so a page always makes progress and `show --note` has something to\n * name. Filling runs newest-first when `fill` is \"newest\" (the default view:\n * the oldest ordinary notes are dropped) and oldest-first when it is \"page\"\n * (`--all` / `--from`: what is left out is a suffix a further `--from`\n * reaches); it stops at the first ordinary note that does not fit, so the\n * shown ordinary notes are one contiguous run.\n */\nexport function planNotes(\n notes: readonly TaskNoteRow[],\n pinned: ReadonlySet<number>,\n fill: \"newest\" | \"page\",\n size: (ordinary: readonly ShownNote[]) => number,\n opts: { budget?: number } = {},\n): PlannedNotes {\n const budget = opts.budget ?? RESULT_BYTES;\n const ordinary = notes.filter((n) => !pinned.has(n.n));\n const keep = new Map<number, number | undefined>();\n const toShown = (): ShownNote[] =>\n notes\n .filter((n) => keep.has(n.n) && !pinned.has(n.n))\n .map((note) => {\n const cutBytes = keep.get(note.n);\n return cutBytes === undefined ? { note } : { note, cutBytes };\n });\n const whole = (n: TaskNoteRow): number => Buffer.byteLength(noteRecord(n)) + 1;\n if (size(ordinary.map((note) => ({ note }))) <= budget) {\n for (const n of ordinary) keep.set(n.n, undefined);\n } else {\n let full = false;\n for (const n of fill === \"newest\" ? [...ordinary].reverse() : ordinary) {\n if (full) continue;\n const plain: ShownNote = { note: n };\n const entry: ShownNote = size([plain]) > budget ? { note: n, cutBytes: whole(n) } : plain;\n const shownNow = toShown();\n const probe = fill === \"newest\" ? [entry, ...shownNow] : [...shownNow, entry];\n if (shownNow.length > 0 && size(probe) > budget) {\n full = true;\n continue;\n }\n keep.set(n.n, entry.cutBytes);\n }\n }\n for (const n of notes) if (pinned.has(n.n)) keep.set(n.n, undefined);\n const shown = notes\n .filter((n) => keep.has(n.n))\n .map((note) => {\n const cutBytes = keep.get(note.n);\n return cutBytes === undefined ? { note } : { note, cutBytes };\n });\n return { shown, omitted: notes.filter((n) => !keep.has(n.n)).map((n) => n.n) };\n}\n","// mu — `mu task` create/read/edit verbs (add / show / notes / note / update).\n//\n// add → addTasks (one or a batch), with auto-id derivation when ids are omitted.\n// show → row + edges + notes (+ lastClaimActor when owner=NULL).\n// notes / note → list + append on task_notes.\n// update → scalar edits (title/impact/effortDays).\n//\n// Plus the helpers:\n// unescapeNoteText — \\n / \\t / \\r / \\\\ inside a quoted string body\n// printNote — shared note formatter for show + notes\n//\n// `who claimed this task?` for the owner=NULL --self path comes from\n// the SDK's lastClaimActor (src/logs.ts) directly — the prior CLI-side\n// thin-wrapper was a vestigial re-export from the cluster split, gone\n// in schema_v5_cleanups.\n\nimport {\n assertTaskInWorkstream,\n emitJson,\n parseCsvFlag,\n resolveEntityRef,\n resolveExistingWorkstream,\n UsageError,\n} from \"../../cli.js\";\nimport type { Db, NoteKind } from \"../../db.js\";\nimport { lastClaimActor } from \"../../logs.js\";\nimport { say } from \"../../messages.js\";\nimport { pc } from \"../../output.js\";\nimport { encodeEnvelope, okEnvelope, RESULT_BYTES } from \"../../output-contract.js\";\nimport { taskRevision } from \"../../revision.js\";\nimport { shellWord } from \"../../shell-quote.js\";\nimport { formatPair, type TaskStatus, type TaskSubstate } from \"../../tasks/status.js\";\nimport {\n addNote,\n addTasks,\n getTask,\n getTaskEdgesWithStatus,\n getTaskNote,\n listNotes,\n resolveActorIdentity,\n selectTaskNotes,\n type TaskEdgeWithStatus,\n type TaskNoteRow,\n TaskNotFoundError,\n type UpdateTaskOptions,\n updateTask,\n} from \"../../tasks.js\";\nimport { noteRecord, planNotes, type ShownNote, stubAuthor, stubPreview } from \"../format.js\";\nimport { readStdinText, STDIN_ARG } from \"../stdin.js\";\nimport {\n escapeRecordText,\n footerLine,\n linesBytes,\n SHOW_TITLE_CHARS,\n taskItemCut,\n taskRecordCut,\n taskToOutput,\n} from \"./records.js\";\n\n/**\n * Translate the small set of shell-style escapes (\\n, \\t, \\r, \\\\)\n * inside a note body so a heredoc-free shell call can write a\n * multi-line note in one quoted string:\n *\n * mu task note auth \"FILES: a.rs:45\\nDECISION: chose JWT\"\n *\n * Backslashes are protected via a NUL placeholder so `\\\\n` stays as\n * a literal `\\n` in the output rather than being processed twice.\n */\nexport function unescapeNoteText(s: string): string {\n // Single-pass regex: match a backslash followed by one of the four\n // recognised escape characters and decide per-match what to emit.\n // This avoids the in-band-sentinel pattern (where a placeholder string\n // could in principle collide with legitimate note content) and means\n // `\\\\n` correctly yields a literal `\\n` rather than a newline, because\n // the leading `\\\\` consumes the backslash before `\\n` can match.\n return s.replace(/\\\\([\\\\ntr])/g, (_, ch: string) => {\n switch (ch) {\n case \"\\\\\":\n return \"\\\\\";\n case \"n\":\n return \"\\n\";\n case \"t\":\n return \"\\t\";\n case \"r\":\n return \"\\r\";\n default:\n return _;\n }\n });\n}\n\n/** Kinds a filtered `notes` view still never cuts (the default view also pins the closer's fallback). */\nconst PINNED_KINDS: ReadonlySet<string> = new Set([\"brief\", \"report\", \"verdict\"]);\n\n/** The notes view of one task, ready to print or to put in the JSON envelope. */\ninterface NotesPage {\n /** The records shown (oldest first), JSON-shaped. */\n items: Record<string, unknown>[];\n /** Notes left out (by the selection or by the byte cap). */\n more: number;\n /** The exact command that recovers them; null when nothing is left out. */\n next: string | null;\n lines: string[];\n /** Emitted bytes of the whole output as measured for the cap (pinned notes exempt). */\n size: number;\n}\n\n/** The JSON record of one shown note; a stub carries a clipped author and preview, `cut` and `retrieve`. */\nfunction noteItem(ref: string, { note, cutBytes }: ShownNote): Record<string, unknown> {\n const rec: Record<string, unknown> = {\n n: note.n,\n kind: note.kind,\n author: cutBytes === undefined ? note.author : stubAuthor(note.author),\n created_at: note.createdAt,\n content: cutBytes === undefined ? note.content : stubPreview(note.content),\n };\n if (cutBytes !== undefined) {\n rec.cut = cutBytes;\n rec.retrieve = noteCommand(ref, note.n);\n }\n return rec;\n}\n\nconst noteCommand = (ref: string, n: number): string => `mu task show ${ref} --note ${n}`;\n\n/**\n * Cap a selection into a page. `omitted` counts what the selection left out\n * before the byte cap (default view only; an explicit `--from` asked for its\n * suffix, so only the cap's cuts count). The way back is `--from <n>` for the\n * smallest `n` not shown, or `--all` when that is note 1. The 4 KB cap is\n * measured on the bytes that go out (text lines, or the JSON document with\n * its keys and `more`/`retrieve`), pinned notes set aside; `show` and `notes`\n * differ only in the JSON key names, so each passes its own `wrap`.\n */\nfunction buildNotesPage(\n taskId: string,\n ws: string,\n notes: readonly TaskNoteRow[],\n opts: {\n pinned: ReadonlySet<number>;\n total: number;\n fill: \"newest\" | \"page\";\n explicit: boolean;\n json: boolean;\n wrap: (items: Record<string, unknown>[], fields: Record<string, unknown>) => unknown;\n /** Text lines printed BEFORE the notes that count toward the cap (the `show` task and edge records). */\n fixedLines?: readonly string[];\n /** Text lines printed after the notes that count toward the cap (hints). */\n tailLines?: readonly string[];\n /** The cap on the whole output (default RESULT_BYTES). */\n budget?: number;\n /** The one way back a `more=` names (default: `task notes --all` / `--from`). */\n next?: string;\n /** The text footer, given the notes left out (`show` adds its edges and cuts); default `more=N next=…`. */\n footer?: (notesMore: number) => string | null;\n /** May the cap drop every ordinary note (`show`: the task and edges come first)? Default: the last one stays. */\n allowEmpty?: boolean;\n },\n): NotesPage {\n const budget = opts.budget ?? RESULT_BYTES;\n const ref = `${taskId} -w ${ws}`;\n const nextFor = (first: number): string =>\n opts.next !== undefined\n ? opts.next\n : first === 1\n ? `mu task notes ${ref} --all`\n : `mu task notes ${ref} --from ${first}`;\n const isPinned = (s: ShownNote): boolean => opts.pinned.has(s.note.n);\n const pinnedShown: ShownNote[] = notes\n .filter((n) => opts.pinned.has(n.n))\n .map((note) => ({ note }));\n\n // What the output says is left out, from what is actually shown.\n const omission = (shown: readonly ShownNote[]): { more: number; next: string | null } => {\n const shownN = new Set(shown.map((s) => s.note.n));\n const left = opts.explicit\n ? notes.filter((n) => !shownN.has(n.n)).map((n) => n.n)\n : Array.from({ length: opts.total }, (_, i) => i + 1).filter((i) => !shownN.has(i));\n const first = left[0];\n return { more: left.length, next: first === undefined ? null : nextFor(first) };\n };\n const footLine = (more: number, next: string | null): string | null =>\n opts.footer !== undefined\n ? opts.footer(more)\n : next === null\n ? null\n : `more=${more} next=${next}`;\n const render = (shown: readonly ShownNote[]): NotesPage => {\n const { more, next } = omission(shown);\n const lines = shown.map((s) => noteLine(ref, s));\n const foot = footLine(more, next);\n if (foot !== null) lines.push(foot);\n return { items: shown.map((s) => noteItem(ref, s)), lines, more, next, size: emitted(shown) };\n };\n // The cap, measured on the FINAL output (every metadata field as emitted),\n // pinned records set aside. Exact, not predicted: serialize, then shrink.\n const emitted = (shown: readonly ShownNote[]): number => {\n const { more, next } = omission(shown);\n const ordinary = shown.filter((s) => !isPinned(s));\n if (!opts.json) {\n const lines = [...(opts.fixedLines ?? []), ...ordinary.map((s) => noteLine(ref, s))];\n const foot = footLine(more, next);\n if (foot !== null) lines.push(foot);\n lines.push(...(opts.tailLines ?? []));\n return Buffer.byteLength(lines.join(\"\\n\")) + 1;\n }\n const fields = next === null ? { more: 0 } : { more, retrieve: next };\n const items = ordinary.map((s) => noteItem(ref, s));\n return Buffer.byteLength(encodeEnvelope(okEnvelope(opts.wrap(items, fields)))) + 1;\n };\n // The planner's probes are the same serialization, not an estimate: the\n // pinned notes are always shown, so a probe is pinned plus the ordinary run.\n const plan = planNotes(\n notes,\n opts.pinned,\n opts.fill,\n (ordinary) => emitted([...pinnedShown, ...ordinary]),\n { budget },\n );\n const final = [...plan.shown];\n // Drop the oldest ordinary note (default view) or the last (a page, so what\n // is left out stays a suffix `--from` reaches). The last one stays: a page\n // makes progress, and a stub is bounded.\n while (emitted(final) > budget) {\n const ordinary = final.filter((s) => !isPinned(s));\n const victim = opts.fill === \"newest\" ? ordinary[0] : ordinary[ordinary.length - 1];\n if (ordinary.length <= (opts.allowEmpty === true ? 0 : 1) || victim === undefined) break;\n final.splice(final.indexOf(victim), 1);\n }\n return render(final);\n}\n\nfunction noteLine(ref: string, s: ShownNote): string {\n return s.cutBytes === undefined\n ? noteRecord(s.note)\n : noteRecord(s.note, { cutBytes: s.cutBytes, command: noteCommand(ref, s.note.n) });\n}\n\n/** `more` and `retrieve`: the notes left out and the command that recovers them (key-prefixed in `show`). */\nfunction pageFields(page: NotesPage, prefix = \"\"): Record<string, unknown> {\n return prefixed(\n page.next === null ? { more: 0 } : { more: page.more, retrieve: page.next },\n prefix,\n );\n}\n\nfunction prefixed(fields: Record<string, unknown>, prefix: string): Record<string, unknown> {\n return Object.fromEntries(Object.entries(fields).map(([k, v]) => [`${prefix}${k}`, v]));\n}\n\n/** Split a list of edge neighbours into (still-gating, satisfied)\n * buckets. CLOSED is the only status that satisfies a `blocks` edge;\n * OPEN/IN_PROGRESS stay in the still-gating bucket.\n * (task_show_blocked_by_renders_closed.) */\nfunction partitionEdges(edges: readonly TaskEdgeWithStatus[]): {\n stillGating: TaskEdgeWithStatus[];\n satisfied: TaskEdgeWithStatus[];\n} {\n const stillGating: TaskEdgeWithStatus[] = [];\n const satisfied: TaskEdgeWithStatus[] = [];\n for (const e of edges) {\n if (e.status === \"CLOSED\") satisfied.push(e);\n else stillGating.push(e);\n }\n return { stillGating, satisfied };\n}\n\n/** A note whose whole text is empty, whitespace or a bare `-` is almost\n * always a mistake (an older mu stored `-` literally when stdin was\n * meant; a typo or an empty variable gives \"\"). It is still stored,\n * but loudly: the warning goes to stderr and the --json `warnings`. */\nexport function suspiciousNoteWarnings(text: string): string[] {\n const t = text.trim();\n if (t === \"\") return [\"note text is empty or whitespace only; stored anyway\"];\n if (t === STDIN_ARG) {\n return [\n `note text is a bare \"-\"; stored anyway. To read stdin, pass - and pipe the text: <<'EOF' ... EOF`,\n ];\n }\n return [];\n}\n\n/** Human mode: yellow stderr lines. `--json` carries them in the document's `warnings`. */\nfunction emitWarnings(warnings: readonly string[], json: boolean | undefined): void {\n if (json) return;\n for (const w of warnings) console.error(pc.yellow(`warning: ${w}`));\n}\n\nexport async function cmdTaskAdd(\n db: Db,\n localIds: readonly string[],\n opts: {\n title: string[];\n impact?: number;\n effortDays?: number;\n blockedBy?: string[];\n blocks?: string[];\n note?: string;\n noteAuthor?: string;\n triage?: boolean;\n workstream?: string;\n json?: boolean;\n },\n): Promise<void> {\n const workstream = await resolveExistingWorkstream(db, opts.workstream);\n const titles = opts.title;\n if (localIds.length > 0 && titles.length !== localIds.length) {\n // A stray word is nearly always an apostrophe that ended '...' early\n // (the commander \"too many arguments\" case this used to be).\n throw new UsageError(say(\"task.add_titles\", localIds, titles.length), { showHelp: false });\n }\n // Ids come from the positionals, or are derived from each title via\n // slugify (collisions get _2, _3, … suffixes) and carry the truncation\n // telemetry (slugifytitle_silently_drops_clauses). `autoDerived`\n // distinguishes the explicit-id branch so `--json` exposes the\n // truncation fields only when meaningful\n //.\n const autoDerived = localIds.length === 0;\n const blockedBy = parseCsvFlag(opts.blockedBy, \"-b/--blocked-by\");\n const blocks = parseCsvFlag(opts.blocks, \"--blocks\");\n const hasBlockers = blockedBy.length > 0;\n // `--note -` reads stdin verbatim (no \\\\n unescaping: a heredoc has\n // real newlines). Read before the transaction; it is async.\n const noteText =\n opts.note === STDIN_ARG\n ? await readStdinText(\"--note\")\n : opts.note !== undefined\n ? unescapeNoteText(opts.note)\n : undefined;\n const warnings = noteText !== undefined ? suspiciousNoteWarnings(noteText) : [];\n emitWarnings(warnings, opts.json);\n const initialNoteAuthor =\n noteText !== undefined ? (opts.noteAuthor ?? (await resolveActorIdentity())) : undefined;\n // One group, one transaction: every task, brief and edge, or none.\n const { ids, derived: derivations } = addTasks(\n db,\n titles.map((title, i) => ({\n ...(autoDerived ? {} : { id: localIds[i] ?? \"\" }),\n title,\n ...(noteText !== undefined ? { note: noteText } : {}),\n })),\n {\n workstream,\n ...(hasBlockers ? { blockedBy } : {}),\n ...(blocks.length > 0 ? { blocks } : {}),\n ...(opts.triage === true ? { triage: true } : {}),\n ...(opts.impact !== undefined ? { impact: opts.impact } : {}),\n ...(opts.effortDays !== undefined ? { effortDays: opts.effortDays } : {}),\n ...(initialNoteAuthor !== undefined ? { noteAuthor: initialNoteAuthor } : {}),\n },\n );\n const tasks = ids.map((id) => {\n const t = getTask(db, id, workstream);\n if (!t) throw new TaskNotFoundError(id, workstream);\n return t;\n });\n const task = tasks[0];\n if (task === undefined) throw new UsageError(say(\"task.add_nothing\"), { showHelp: true });\n const note = noteText !== undefined ? (listNotes(db, task.name, workstream)[0] ?? null) : null;\n const derivation = derivations[0] ?? { id: task.name, truncated: false, originalSlug: task.name };\n if (opts.json) {\n // JSON callers are scripts: stay machine-readable. The human\n // stderr hint is suppressed under --json (matches every other\n // prose surface in the CLI). The truncation signal still has to\n // reach scripted callers, though — otherwise pipelines that\n // build follow-up commands from the JSON envelope can't tell the\n // id no longer carries the title's full meaning. Surface it as\n // top-level `truncated`/`originalSlug` siblings of `task` (NOT\n // inside `task`, which mirrors the persisted row).\n // Conventions, consistent with the {items, count} envelope\n // singleton style: only emit when meaningful. Both fields are\n // omitted when the operator passed an explicit <id> (no\n // auto-derive) and when auto-derivation produced no truncation\n // (task_add_slugify_silently_truncates_ids).\n const truncationFields =\n autoDerived && derivation.truncated\n ? { truncated: true, originalSlug: derivation.originalSlug }\n : {};\n emitJson({\n // The SQL-column record every task read prints (records.ts), never the SDK row.\n task: taskToOutput(task),\n ...(tasks.length > 1 ? { tasks: tasks.map((t) => taskToOutput(t)) } : {}),\n blockers: blockedBy,\n ...(blocks.length > 0 ? { blocks } : {}),\n ...(note !== null ? { note } : {}),\n ...truncationFields,\n ...(warnings.length > 0 ? { warnings } : {}),\n });\n return;\n }\n // Stderr hint when auto-id derivation truncated the slug. Stderr +\n // exit 0 so scripts that already pipe stdout aren't disturbed; the\n // operator sees the heads-up that the id no longer carries the full\n // title's meaning, with a one-paste fix (pass <id> positional).\n // Suppressed when the operator passed an explicit id (truncated is\n // false in that branch) since they already chose the id by hand.\n derivations.forEach((d, i) => {\n if (!d.truncated) return;\n process.stderr.write(say(\"task.add_truncated\", tasks[i]?.name ?? \"\"));\n });\n const idHint = autoDerived ? pc.dim(\" (id derived from title)\") : \"\";\n for (const t of tasks) {\n console.log(\n `Added task ${pc.bold(t.name)}${idHint} ${pc.dim(\n `(workstream=${workstream}, impact=${t.impact}, effort=${t.effortDays})`,\n )}`,\n );\n }\n if (note !== null) {\n console.log(\n pc.dim(` initial note: ${note.content.length} chars by ${note.author ?? \"<orchestrator>\"}`),\n );\n }\n if (hasBlockers) console.log(pc.dim(` blocked by: ${blockedBy.join(\", \")}`));\n if (blocks.length > 0) console.log(pc.dim(` blocks: ${blocks.join(\", \")}`));\n}\n\n/** Reconcile `mu task note <id> [text]`'s positional text with its flag\n * aliases (`-m/--message`, `--note`, `--text`): exactly one source.\n *\n * dogfood-note-arg-shape: `mu task add --note <text>` is a FLAG, so the\n * flag form is what operators and models reach for on `mu task note`. */\nexport function resolveNoteText(\n positional: string | undefined,\n flags: Readonly<Record<string, string | undefined>>,\n): string {\n const given: [string, string][] = [];\n if (positional !== undefined) given.push([\"the positional text\", positional]);\n for (const [name, value] of Object.entries(flags)) {\n if (value !== undefined) given.push([name, value]);\n }\n if (given.length > 1) {\n throw new UsageError(\n say(\n \"task.note_twice\",\n given.map(([n]) => n),\n ),\n );\n }\n const text = given[0]?.[1];\n if (text === undefined) {\n throw new UsageError(say(\"task.note_required\"), { showHelp: false });\n }\n return text;\n}\n\nexport async function cmdTaskNote(\n db: Db,\n rawId: string,\n content: string,\n opts: {\n workstream?: string;\n json?: boolean;\n author?: string;\n report?: boolean;\n kind?: NoteKind;\n } = {},\n): Promise<void> {\n if (opts.report === true && opts.kind !== undefined) {\n throw new UsageError(say(\"task.note_kind_twice\"), { showHelp: false });\n }\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n // Author resolution: explicit --author wins; otherwise consult\n // MU_AGENT_NAME (env var injected at spawn) > $USER >\n // 'orchestrator'. Surfaced from mufeedback note #176: notes from\n // spawned agents were appearing as <orchestrator> because the CLI\n // wasn't propagating identity. After this fix, mu-spawned workers'\n // notes are correctly attributed to the agent name.\n const author = opts.author ?? (await resolveActorIdentity());\n const text = content === STDIN_ARG ? await readStdinText(\"note text\") : unescapeNoteText(content);\n const warnings = suspiciousNoteWarnings(text);\n const kind: NoteKind = opts.report === true ? \"report\" : (opts.kind ?? \"note\");\n const note = addNote(db, localId, text, { author, workstream: ws, kind });\n // A worker reads notes at dispatch, not while it runs: a note on its\n // IN_PROGRESS task reaches it only through a send.\n const task = getTask(db, localId, ws);\n const owner = task?.status === \"IN_PROGRESS\" ? task.ownerName : null;\n if (owner !== null && owner !== author) {\n warnings.push(say(\"task.note_unseen\", owner, ws));\n }\n emitWarnings(warnings, opts.json);\n if (opts.json) {\n emitJson({\n taskName: localId,\n note,\n ...(warnings.length > 0 ? { warnings } : {}),\n });\n return;\n }\n console.log(pc.dim(`note appended to ${localId}`));\n}\n\n/** Bytes the edge records of one `show` may take before the notes get their share of the 4 KB. */\nconst EDGE_BYTES = 1200;\n/** Title bounds `show` tries, widest first, when even the task alone does not fit. */\nconst SHOW_TITLE_STEPS = [SHOW_TITLE_CHARS, 300, 150, 75, 30];\n\n/** One neighbour of a task, in the order `show` lists them: blockers then dependents, still-gating first. */\ninterface EdgeRecord {\n kind: \"blocker\" | \"dependent\";\n id: string;\n status: string;\n substate: string;\n}\n\nfunction edgeRecords(edges: {\n blockers: readonly TaskEdgeWithStatus[];\n dependents: readonly TaskEdgeWithStatus[];\n}): EdgeRecord[] {\n const side = (kind: EdgeRecord[\"kind\"], list: readonly TaskEdgeWithStatus[]): EdgeRecord[] => {\n const { stillGating, satisfied } = partitionEdges(list);\n return [...stillGating, ...satisfied].map((e) => ({\n kind,\n id: e.name,\n status: e.status,\n substate: e.substate,\n }));\n };\n return [...side(\"blocker\", edges.blockers), ...side(\"dependent\", edges.dependents)];\n}\n\nconst edgeLine = (e: EdgeRecord): string =>\n [\n e.kind,\n escapeRecordText(e.id),\n formatPair({ status: e.status as TaskStatus, substate: e.substate as TaskSubstate }),\n ].join(\"\\t\");\nconst edgeItem = (e: EdgeRecord): Record<string, unknown> => ({\n id: e.id,\n status: e.status,\n substate: e.substate,\n});\n\nexport async function cmdTaskShow(\n db: Db,\n rawId: string,\n opts: { json?: boolean; workstream?: string; note?: number; all?: boolean } = {},\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n // v5: tasks.local_id is per-workstream unique. Resolve the\n // operator's workstream up front so the lookup scopes correctly.\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const task = getTask(db, localId, ws);\n if (!task) throw new TaskNotFoundError(localId, ws);\n const json = opts.json === true;\n const whole = opts.all === true;\n const ref = `${shellWord(task.name)} -w ${shellWord(task.workstreamName)}`;\n const edges = edgeRecords(getTaskEdgesWithStatus(db, localId, task.workstreamName));\n if (opts.note !== undefined) {\n // One note, whole: no cap, exact membership of this task's own notes.\n const note = getTaskNote(db, localId, task.workstreamName, opts.note);\n if (json) {\n emitJson({\n n: note.n,\n kind: note.kind,\n author: note.author,\n created_at: note.createdAt,\n content: note.content,\n });\n return;\n }\n console.log(noteRecord(note));\n return;\n }\n // The ONE way back from a cut: this same read with --all (uncapped).\n const allCmd = `mu task show ${ref} ${json ? \"--json \" : \"\"}--all`;\n const view = whole\n ? selectTaskNotes(db, localId, { workstream: task.workstreamName, all: true })\n : selectTaskNotes(db, localId, { workstream: task.workstreamName });\n\n // When owner IS NULL but the task is IN_PROGRESS (or recently was),\n // the actor is in the ops log (ops.actor). Surface it so 'who's working on this'\n // is answerable from `mu task show` alone.\n const lastActor =\n task.ownerName === null && task.status !== \"OPEN\"\n ? lastClaimActor(db, task.workstreamName, task.name)\n : null;\n const lastActorShown =\n lastActor === null || whole ? lastActor : [...lastActor].slice(0, 80).join(\"\");\n const actorCut =\n lastActor === null ? 0 : [...lastActor].length - [...(lastActorShown ?? \"\")].length;\n const revision = taskRevision(db, task.workstreamName, task.name);\n\n // Only the non-default substates get a hint: they are the ones whose\n // way out is not obvious from the status alone. Executable as printed (no placeholder).\n const hints: string[] = [];\n if (task.substate === \"parked\" && task.kind !== \"human\") hints.push(`next=mu task unpark ${ref}`);\n else if (task.substate === \"triage\") {\n hints.push(`next=mu task accept ${ref}`);\n } else if (task.status === \"CLOSED\" && task.substate !== \"done\") {\n hints.push(`next=mu task open ${ref}`);\n }\n\n /** The whole output for `k` neighbours and a title of `titleChars`, serialized: its lines, JSON data and emitted bytes. */\n const build = (k: number, titleChars: number) => {\n const shownEdges = edges.slice(0, k);\n const more = edges.length - k;\n const rec = taskRecordCut(task, {\n withWorkstream: true,\n revision,\n claimedBy: lastActor,\n times: true,\n whole,\n titleChars,\n maxChars: titleChars + 400,\n });\n const itm = taskItemCut(task, {\n withWorkstream: true,\n revision,\n whole,\n titleChars,\n extraCut: actorCut,\n });\n const fixedLines = [rec.line, ...shownEdges.map(edgeLine)];\n // One footer, last: everything cut (neighbours, notes, clipped fields) and the one way back.\n const footer = (notesMore: number): string | null =>\n footerLine({ more: more + notesMore, cut: rec.cut }, allCmd);\n const wrap = (items: Record<string, unknown>[], fields: Record<string, unknown>) => {\n const notesMore = Number(fields.more ?? 0);\n return {\n task: itm.item,\n blockers: shownEdges.filter((e) => e.kind === \"blocker\").map(edgeItem),\n dependents: shownEdges.filter((e) => e.kind === \"dependent\").map(edgeItem),\n edges_more: more,\n notes: items,\n notes_more: notesMore,\n ...(itm.cut > 0 ? { cut: itm.cut } : {}),\n ...(more + notesMore > 0 || itm.cut > 0 ? { retrieve: allCmd } : {}),\n lastClaimActor: lastActorShown,\n };\n };\n const page = buildNotesPage(localId, task.workstreamName, view.notes, {\n pinned: new Set(view.pinned),\n total: view.total,\n fill: whole ? \"page\" : \"newest\",\n explicit: whole,\n json,\n wrap,\n fixedLines,\n tailLines: hints,\n next: allCmd,\n footer,\n allowEmpty: true,\n ...(whole ? { budget: Number.POSITIVE_INFINITY } : {}),\n });\n return { page, fixedLines, wrap };\n };\n // The cap is on the FINAL bytes (task, edges, footer, notes; pinned notes exempt): shrink by\n // whole records. Neighbours first (at most their EDGE_BYTES share, then as few as the notes\n // leave room for), the title only when the task alone does not fit.\n let kMax = edges.length;\n if (!whole) {\n const edgeBytes = (k: number): number =>\n json\n ? Buffer.byteLength(JSON.stringify(edges.slice(0, k).map(edgeItem)))\n : linesBytes(edges.slice(0, k).map(edgeLine));\n kMax = 0;\n while (kMax < edges.length && edgeBytes(kMax + 1) <= EDGE_BYTES) kMax++;\n }\n const fits = (k: number, t: number): boolean => whole || build(k, t).page.size <= RESULT_BYTES;\n let out = build(kMax, SHOW_TITLE_CHARS);\n if (!fits(kMax, SHOW_TITLE_CHARS)) {\n let lo = 0;\n let hi = kMax;\n let titleChars = SHOW_TITLE_CHARS;\n if (!fits(0, titleChars)) {\n titleChars = SHOW_TITLE_STEPS.find((t) => fits(0, t)) ?? 30;\n hi = 0;\n } else {\n // Largest k in [0, kMax) that fits (fewer neighbours never need more room).\n hi = kMax - 1;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n if (fits(mid, titleChars)) lo = mid;\n else hi = mid - 1;\n }\n hi = lo;\n }\n out = build(hi, titleChars);\n }\n const { page, fixedLines, wrap } = out;\n\n if (json) {\n emitJson(wrap(page.items, { more: page.more }));\n return;\n }\n // Notes keep their own records; an empty view prints none (the task record says nothing of them).\n console.log([...fixedLines, ...page.lines, ...hints].join(\"\\n\"));\n}\n\nexport async function cmdTaskNotes(\n db: Db,\n rawId: string,\n opts: {\n json?: boolean;\n workstream?: string;\n tail?: number;\n since?: string;\n sinceClaim?: boolean;\n all?: boolean;\n from?: number;\n } = {},\n): Promise<void> {\n const filtered = opts.tail !== undefined || opts.since !== undefined || opts.sinceClaim === true;\n if ((opts.all === true || opts.from !== undefined) && filtered) {\n throw new UsageError(say(\"task.notes_all_from\"));\n }\n if (opts.all === true && opts.from !== undefined) {\n throw new UsageError(say(\"task.notes_all_is_from\"));\n }\n // Mutex: --since and --since-claim both define a cutoff; allowing\n // both would force one to silently win, which is a footgun. The SDK\n // documents \"since wins\" for safety, but the CLI is strict so the\n // user gets feedback at the surface they typed at. (Mirrors the\n // pattern in cmdTaskUpdate where conflicting fields error rather\n // than picking one.)\n if (opts.since !== undefined && opts.sinceClaim === true) {\n throw new UsageError(say(\"task.notes_since_twice\"));\n }\n // --tail must be a positive integer. The commander parser\n // (parsePositiveNumber) already rejects 0 and negatives at the\n // parse layer, but defend here too in case a programmatic caller\n // pokes a bad value through (the SDK accepts >=0 by design).\n if (\n opts.tail !== undefined &&\n (!Number.isFinite(opts.tail) || opts.tail <= 0 || !Number.isInteger(opts.tail))\n ) {\n throw new UsageError(say(\"task.notes_tail\", opts.tail));\n }\n // --since must parse as ISO 8601. We accept anything Date.parse\n // recognises (so '2025-01-01' and full RFC3339 both work) but\n // reject typos that produce NaN (e.g. 'yesterday', 'last week').\n if (opts.since !== undefined) {\n const parsed = Date.parse(opts.since);\n if (Number.isNaN(parsed)) {\n throw new UsageError(say(\"task.notes_since\", opts.since));\n }\n }\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const task = getTask(db, localId, ws);\n if (!task) throw new TaskNotFoundError(localId, ws);\n let page: NotesPage;\n let total: number;\n const notesWire = {\n json: opts.json === true,\n wrap: (items: Record<string, unknown>[], fields: Record<string, unknown>) => ({\n items,\n count: items.length,\n ...fields,\n }),\n };\n if (opts.all === true || opts.from !== undefined) {\n const sel = selectTaskNotes(db, localId, {\n workstream: task.workstreamName,\n ...(opts.all === true ? { all: true } : {}),\n ...(opts.from !== undefined ? { from: opts.from } : {}),\n });\n total = sel.total;\n page = buildNotesPage(localId, task.workstreamName, sel.notes, {\n pinned: new Set(sel.pinned),\n total,\n fill: \"page\",\n explicit: true,\n ...notesWire,\n });\n } else if (filtered) {\n const filterOpts: { tail?: number; since?: string; sinceClaim?: boolean } = {};\n if (opts.tail !== undefined) filterOpts.tail = opts.tail;\n if (opts.since !== undefined) filterOpts.since = opts.since;\n if (opts.sinceClaim === true) filterOpts.sinceClaim = true;\n const notes = listNotes(db, localId, task.workstreamName, filterOpts);\n total = notes.length;\n page = buildNotesPage(localId, task.workstreamName, notes, {\n pinned: new Set(notes.filter((n) => PINNED_KINDS.has(n.kind)).map((n) => n.n)),\n total,\n fill: \"page\",\n explicit: true,\n ...notesWire,\n });\n } else {\n const sel = selectTaskNotes(db, localId, { workstream: task.workstreamName });\n total = sel.total;\n page = buildNotesPage(localId, task.workstreamName, sel.notes, {\n pinned: new Set(sel.pinned),\n total,\n fill: \"newest\",\n explicit: false,\n ...notesWire,\n });\n }\n if (opts.json) {\n emitJson({ items: page.items, count: page.items.length, ...pageFields(page) });\n return;\n }\n if (total === 0) {\n console.log(pc.dim(`(no notes on ${localId})`));\n return;\n }\n for (const line of page.lines) console.log(line);\n}\n\nexport async function cmdTaskUpdate(\n db: Db,\n rawId: string,\n opts: {\n title?: string;\n impact?: number;\n effortDays?: number;\n workstream?: string;\n json?: boolean;\n },\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const updateOpts: UpdateTaskOptions = {};\n if (opts.title !== undefined) updateOpts.title = opts.title;\n if (opts.impact !== undefined) updateOpts.impact = opts.impact;\n if (opts.effortDays !== undefined) updateOpts.effortDays = opts.effortDays;\n if (Object.keys(updateOpts).length === 0) {\n throw new UsageError(say(\"task.update_nothing\"), { showHelp: false });\n }\n const r = updateTask(db, localId, updateOpts, { workstream: ws });\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n if (!r.updated) {\n console.log(pc.dim(`${localId}: no fields differ from current (no-op)`));\n return;\n }\n console.log(`Updated ${pc.bold(localId)} ${pc.dim(`(${r.changedFields.join(\", \")})`)}`);\n}\n","// mu — `mu task` query verbs (read-only; no DB writes).\n//\n// list, next, owned-by.\n// Plus the `mu me tasks` / `mu me next` agent-self subcommands (also\n// read-only; they query against `resolveSelf(db)` instead of -w —\n// wired in src/cli/agents.ts via `wireSelfCommands`).\n//\n// Output is the 4.0 record form (src/cli/tasks/records.ts): one task per\n// line or one JSON item with SQL column names, every result capped on its final\n// bytes, a cut naming the exact `--from` command that resumes.\n//\n// There is no `task blocked`,\n// `task goals`, `task search` or `task ready` (the latter is\n// `task next -n 0`: \"all ready, unlimited\"). The\n// underlying SDK helpers `listBlocked` and `listGoals` survive —\n// `mu state` consumes `listBlocked`. The audit's SQL recipes for\n// the removed verbs live in docs/guide/sql.md \"Run common queries\".\n\nimport { AgentNotFoundError } from \"../../agents.js\";\nimport {\n byRoiDesc,\n checkQualifiedPrefix,\n emitJson,\n parseQualifiedRef,\n parseSortOption,\n parseStatusesOption,\n parseSubstatesOption,\n relTimeBasisForSort,\n resolveExistingWorkstream,\n resolveSelf,\n sortTasks,\n type TaskSortKey,\n UsageError,\n} from \"../../cli.js\";\nimport type { Db } from \"../../db.js\";\nimport { say } from \"../../messages.js\";\nimport { pc } from \"../../output.js\";\nimport { taskRevisions } from \"../../revision.js\";\nimport { shellWord } from \"../../shell-quote.js\";\nimport {\n agentIdByRef,\n listReady,\n listTasks,\n listTasksByOwner,\n listTasksByOwnerCrossWorkstream,\n type TaskRow,\n} from \"../../tasks.js\";\nimport { resolveMeAgent } from \"../me-identity.js\";\nimport { type TaskPageOut, taskPage } from \"./records.js\";\n\n/** Print a page: the JSON document, or the record lines. */\nfunction emitPage(out: TaskPageOut, json: boolean): void {\n if (json) {\n emitJson(out.data);\n return;\n }\n console.log(out.lines.join(\"\\n\"));\n}\n\n/** Flags that re-select the same rows, for the `next=` command of a cut. */\ntype Flags = readonly (string | undefined)[];\nconst command = (parts: readonly string[], flags: Flags, tail: readonly string[]): string =>\n [...parts, ...flags.filter((f): f is string => f !== undefined), ...tail].join(\" \");\n\n/** The one way back from a cut: the same read, `--all` (uncapped), `--json` as given. */\nconst allTail = (opts: { json?: boolean }): string[] => [\n ...(opts.json === true ? [\"--json\"] : []),\n \"--all\",\n];\n\nconst wsFlag = (ws: string): string => `-w ${shellWord(ws)}`;\n\nexport async function cmdMyTasks(\n db: Db,\n opts: { json?: boolean; includeClosed?: boolean; all?: boolean } = {},\n): Promise<void> {\n const self = resolveMeAgent(db);\n // Scope by self.workstream so a same-named worker in another\n // workstream can't pollute this list.\n const tasks = listTasksByOwner(db, self.workstreamName, self.name, {\n includeClosed: opts.includeClosed ?? false,\n });\n if (tasks.length === 0 && !opts.json) {\n console.log(pc.dim(`(${self.name} owns no tasks)`));\n return;\n }\n emitPage(\n taskPage(tasks, {\n all: opts.all === true,\n json: opts.json === true,\n next: command(\n [\"mu\", \"me\", \"tasks\"],\n [opts.includeClosed ? \"--include-closed\" : undefined],\n allTail(opts),\n ),\n }),\n opts.json === true,\n );\n}\n\nexport async function cmdMyNext(\n db: Db,\n opts: { lines?: number; json?: boolean; all?: boolean },\n): Promise<void> {\n const self = resolveMeAgent(db);\n const k = opts.lines ?? 1;\n const sorted = listReady(db, self.workstreamName).sort(byRoiDesc);\n const tasks = k === 0 ? sorted : sorted.slice(0, k);\n if (tasks.length === 0 && !opts.json) {\n console.log(pc.dim(`(no ready tasks in ${self.workstreamName})`));\n return;\n }\n emitPage(\n taskPage(tasks, {\n all: opts.all === true,\n json: opts.json === true,\n next: command([\"mu\", \"me\", \"next\", \"-n\", String(k)], [], allTail(opts)),\n }),\n opts.json === true,\n );\n}\n\n/** The agent an `--owner` / `--mine` filter names, as its real id (never matched by bare name). */\nfunction ownerFilter(\n db: Db,\n ws: string,\n opts: { owner?: string; mine?: boolean },\n): { id: number; flag: string } | undefined {\n if (opts.owner !== undefined && opts.mine === true) {\n throw new UsageError(say(\"task.list_owner_mine\"));\n }\n if (opts.mine === true) {\n const self = resolveSelf(db);\n const id = agentIdByRef(db, self.workstreamName, self.name);\n if (id === null) throw new AgentNotFoundError(self.name, self.workstreamName);\n return { id, flag: `--owner ${shellWord(`${self.workstreamName}/${self.name}`)}` };\n }\n if (opts.owner === undefined) return undefined;\n const ref = parseQualifiedRef(opts.owner);\n const agentWs =\n ref.workstream === undefined ? ws : checkQualifiedPrefix(opts.owner, ref.workstream);\n const id = agentIdByRef(db, agentWs, ref.name);\n if (id === null) throw new AgentNotFoundError(ref.name, agentWs);\n return { id, flag: `--owner ${shellWord(`${agentWs}/${ref.name}`)}` };\n}\n\nexport async function cmdTaskList(\n db: Db,\n opts: {\n workstream?: string;\n json?: boolean;\n status?: string[];\n substate?: string[];\n sort?: string;\n all?: boolean;\n owner?: string;\n mine?: boolean;\n },\n): Promise<void> {\n const workstream = await resolveExistingWorkstream(db, opts.workstream);\n const listOpts: Parameters<typeof listTasks>[2] = {};\n // --status accepts repeat OR comma-separate OR mix; parseStatusesOption\n // handles parseCsvFlag + per-element validate + dedup. Returns\n // undefined for no filter (matches today's no-flag shape).\n const statuses = parseStatusesOption(opts.status);\n if (statuses !== undefined) {\n listOpts.status = statuses;\n }\n const substates = parseSubstatesOption(opts.substate);\n if (substates !== undefined) listOpts.substate = substates;\n const owner = ownerFilter(db, workstream, opts);\n if (owner !== undefined) listOpts.ownerId = owner.id;\n // `--all` is the uncapped read: every task, whole (a list is every status already).\n // Default sort for `mu task list` is `id` (preserves prior\n // behaviour: SQL ORDER BY local_id). The other read verbs default\n // to `roi` because their primary use is \"what should I do next\".\n const sortKey: TaskSortKey = opts.sort === undefined ? \"id\" : parseSortOption(opts.sort);\n const tasks = sortTasks(listTasks(db, workstream, listOpts), sortKey);\n const flags: Flags = [\n statuses === undefined ? undefined : `--status ${statuses.join(\",\")}`,\n substates === undefined ? undefined : `--substate ${substates.join(\",\")}`,\n opts.sort === undefined ? undefined : `--sort ${opts.sort}`,\n owner?.flag,\n ];\n const head = [\"mu\", \"task\", \"list\", wsFlag(workstream)];\n if (tasks.length === 0 && opts.json !== true) {\n console.log(pc.dim(\"(no tasks)\"));\n return;\n }\n emitPage(\n taskPage(tasks, {\n all: opts.all === true,\n json: opts.json === true,\n next: command(head, flags, allTail(opts)),\n basis: relTimeBasisForSort(sortKey),\n // `revision` is what `--if <rev>` on the guarded verbs repeats.\n ...(opts.json === true ? { revisions: taskRevisions(db, workstream) } : {}),\n }),\n opts.json === true,\n );\n}\n\n// ROI = impact / effort_days. Higher first. Tasks with effortDays=0\n// (would divide by zero) sort to the top by treating their ROI as Infinity.\n//\n// `-n 0` means \"unlimited\" — the merged-in `task ready` semantics\n// Default K=1 keeps the \"what should I do right now?\" shape.\nexport async function cmdTaskNext(\n db: Db,\n opts: {\n workstream?: string;\n lines?: number;\n json?: boolean;\n sort?: string;\n all?: boolean;\n },\n): Promise<void> {\n const workstream = await resolveExistingWorkstream(db, opts.workstream);\n const k = opts.lines ?? 1;\n const sortKey: TaskSortKey = opts.sort === undefined ? \"roi\" : parseSortOption(opts.sort);\n const sorted = sortTasks(listReady(db, workstream), sortKey);\n const tasks = k === 0 ? sorted : sorted.slice(0, k);\n if (tasks.length === 0 && opts.json !== true) {\n const parked = listTasks(db, workstream, { substate: \"parked\" }).length;\n const triage = listTasks(db, workstream, { substate: \"triage\" }).length;\n if (parked === 0 && triage === 0) {\n console.log(pc.dim(\"(no ready tasks)\"));\n return;\n }\n const held = [parked > 0 ? `${parked} parked` : \"\", triage > 0 ? `${triage} in triage` : \"\"]\n .filter(Boolean)\n .join(\", \");\n const which = [triage > 0 ? \"triage\" : \"\", parked > 0 ? \"parked\" : \"\"]\n .filter(Boolean)\n .join(\",\");\n console.log(\n pc.dim(`(no ready tasks; ${held}: mu task list --substate ${which} -w ${workstream})`),\n );\n return;\n }\n const flags: Flags = [\n \"-n\",\n String(k),\n opts.sort === undefined ? undefined : `--sort ${opts.sort}`,\n ];\n emitPage(\n taskPage(tasks, {\n all: opts.all === true,\n json: opts.json === true,\n next: command([\"mu\", \"task\", \"next\", wsFlag(workstream)], flags, allTail(opts)),\n }),\n opts.json === true,\n );\n}\n\nexport async function cmdTaskOwnedBy(\n db: Db,\n agent: string,\n opts: {\n json?: boolean;\n includeClosed?: boolean;\n workstream?: string;\n all?: boolean;\n full?: boolean;\n } = {},\n): Promise<void> {\n // Default behaviour: scope to the resolved workstream (so the common\n // case 'mu task owned-by worker-1' returns only this workstream's\n // worker-1, not every workstream's). --all explicitly opts into the\n // cross-workstream view via listTasksByOwnerCrossWorkstream.\n const includeClosed = opts.includeClosed ?? false;\n const ws = opts.all ? undefined : await resolveExistingWorkstream(db, opts.workstream);\n const tasks: TaskRow[] =\n ws === undefined\n ? listTasksByOwnerCrossWorkstream(db, agent, { includeClosed })\n : listTasksByOwner(db, ws, agent, { includeClosed });\n if (tasks.length === 0 && opts.json !== true) {\n console.log(pc.dim(`(no tasks owned by ${agent})`));\n return;\n }\n const flags: Flags = [\n ws === undefined ? \"--all\" : undefined,\n includeClosed ? \"--include-closed\" : undefined,\n ];\n // Surface the workstream column when we're showing cross-workstream\n // results (--all); for the scoped (default) case the column would\n // be redundant.\n emitPage(\n taskPage(tasks, {\n all: opts.full === true,\n json: opts.json === true,\n withWorkstream: ws === undefined,\n next: command(\n [\"mu\", \"task\", \"owned-by\", shellWord(agent), ...(ws === undefined ? [] : [wsFlag(ws)])],\n flags,\n [...(opts.json === true ? [\"--json\"] : []), \"--full\"],\n ),\n }),\n opts.json === true,\n );\n}\n","// mu — `mu task auto` (explicit, host-fenced permission for `mu next`).\n//\n// Thin CLI over src/task-auto.ts: parse, resolve the workstream, check the\n// cli key resolves to a binary, call authorizeTasks, print one line.\n\nimport {\n AgentSpawnCliNotFoundError,\n checkCommandResolvable,\n envVarNameForCli,\n resolveCliCommand,\n} from \"../../agents.js\";\nimport {\n assertTaskInWorkstream,\n emitJson,\n parseCsvFlag,\n resolveEntityRef,\n resolveExistingWorkstream,\n} from \"../../cli.js\";\nimport type { Db } from \"../../db.js\";\nimport { say } from \"../../messages.js\";\nimport { pc } from \"../../output.js\";\nimport { authorizeTasks, TaskAutoArgError } from \"../../task-auto.js\";\nimport { resolveActorIdentity } from \"../../tasks.js\";\n\nexport async function cmdTaskAuto(\n db: Db,\n rawIds: readonly string[],\n opts: {\n blockersOf?: string;\n cli?: string;\n worktree?: boolean;\n max?: number;\n off?: boolean;\n workstream?: string;\n json?: boolean;\n },\n): Promise<void> {\n const off = opts.off === true;\n if (!off && (opts.cli === undefined || opts.cli === \"\")) {\n throw new TaskAutoArgError(say(\"task.auto_cli_required\"));\n }\n const cli = opts.cli ?? \"\";\n // Qualified refs carry their workstream; resolve each against the same -w.\n const ids: string[] = [];\n for (const raw of parseCsvFlag(rawIds, \"task ids\")) {\n const { name } = await resolveEntityRef(db, raw, opts, \"task\");\n assertTaskInWorkstream(db, name, opts.workstream);\n ids.push(name);\n }\n let blockersOf: string | undefined;\n if (opts.blockersOf !== undefined) {\n const { name } = await resolveEntityRef(db, opts.blockersOf, opts, \"task\");\n assertTaskInWorkstream(db, name, opts.workstream);\n blockersOf = name;\n }\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n if (!off) {\n const check = await checkCommandResolvable(resolveCliCommand(cli));\n if (!check.ok) throw new AgentSpawnCliNotFoundError(cli, check.binary, envVarNameForCli(cli));\n }\n const r = authorizeTasks(db, ids, {\n workstream: ws,\n cli,\n worktree: opts.worktree === true,\n maxRuns: opts.max ?? 1,\n ...(off ? { off } : {}),\n ...(blockersOf !== undefined ? { blockersOf } : {}),\n actor: await resolveActorIdentity(),\n });\n if (opts.json) {\n emitJson({ ids: r.ids, changed: r.changed, off });\n return;\n }\n const verb = off ? \"Revoked auto on\" : \"Authorised auto for\";\n console.log(\n `${verb} ${r.ids.length} task${r.ids.length === 1 ? \"\" : \"s\"}: ${pc.bold(r.ids.join(\", \"))}${r.changed ? \"\" : pc.dim(\" (no change)\")}`,\n );\n}\n","// mu — `mu task` ownership + synchronisation verbs (claim / release / wait).\n//\n// claim → CAS-style ownership transfer; dispatch via --for or\n// anonymous --self (owner stays NULL, actor in ops.actor).\n// release → clears owner; auto-flips IN_PROGRESS → OPEN; --reopen\n// forces OPEN from CLOSED.\n// wait → alias of `mu wait` over task refs (src/cli/wait.ts); a heartbeat\n// timeout is ok:true, timedOut, exit 0.\n\nimport { AgentNotFoundError } from \"../../agents/errors.js\";\nimport { getAgent } from \"../../agents.js\";\nimport {\n assertTaskInWorkstream,\n checkQualifiedPrefix,\n checkWorkstreamName,\n emitJson,\n parseQualifiedRef,\n resolveEntityRef,\n resolveExistingWorkstream,\n UsageError,\n} from \"../../cli.js\";\nimport { type Db, tryResolveLiveWorkstreamId, WorkstreamNotFoundError } from \"../../db.js\";\nimport { say } from \"../../messages.js\";\nimport { activeMux } from \"../../mux/detect.js\";\nimport { pc } from \"../../output.js\";\nimport { resolveWorkerIdentity } from \"../../tasks/claim.js\";\nimport { getTaskOwner } from \"../../tasks/queries.js\";\nimport { claimTask, releaseTask, resolveActorIdentity } from \"../../tasks.js\";\nimport type { WaitRef } from \"../../wait.js\";\nimport { currentCallers } from \"../../wait-callers.js\";\nimport { setNextOutcome } from \"../handle.js\";\nimport {\n parseOnStall,\n parseWaitRef,\n runWait,\n type WaitSignals,\n type WaitSpec,\n waitMode,\n} from \"../wait.js\";\nimport { agentRef, armWait, taskRef } from \"../wait-arm.js\";\n\nexport async function cmdTaskRelease(\n db: Db,\n rawId: string,\n opts: {\n reopen?: boolean;\n evidence?: string;\n workstream?: string;\n json?: boolean;\n if?: number;\n },\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const sdkOpts: Parameters<typeof releaseTask>[2] = {\n reopen: opts.reopen ?? false,\n workstream: ws,\n };\n if (opts.if !== undefined) sdkOpts.ifRevision = opts.if;\n if (opts.evidence !== undefined) sdkOpts.evidence = opts.evidence;\n if (opts.evidence) sdkOpts.author = await resolveActorIdentity();\n const r = releaseTask(db, localId, sdkOpts);\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n if (!r.changed) {\n console.log(pc.dim(`${localId} already unowned (no-op)`));\n return;\n }\n const ownerBit = r.previousOwnerName ? `was ${pc.bold(r.previousOwnerName)}` : \"was unowned\";\n const statusBit = r.previousStatus !== r.status ? ` (${r.previousStatus} → ${r.status})` : \"\";\n console.log(`Released ${pc.bold(localId)} ${pc.dim(`(${ownerBit})${statusBit}`)}`);\n if (opts.evidence) console.log(pc.dim(` evidence: ${opts.evidence}`));\n}\n\n/** Whether the active mux can type into a non-pi pane (herdr yes, tmux no). No mux: true. */\nasync function muxCanSendToPanes(): Promise<boolean> {\n try {\n return (await activeMux()).sendToPane !== undefined;\n } catch {\n return true;\n }\n}\n\nexport async function cmdClaim(\n db: Db,\n rawId: string,\n opts: {\n for?: string;\n self?: boolean;\n actor?: string;\n evidence?: string;\n workstream?: string;\n json?: boolean;\n force?: boolean;\n if?: number;\n /** After a `--for` dispatch, wait for the task (one JSON result; `data.claimed` is the claim). */\n andWait?: boolean;\n },\n sig?: WaitSignals,\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n if (opts.andWait === true && opts.for === undefined) {\n throw new UsageError(say(\"task.claim_and_wait\"));\n }\n if (opts.self === true && opts.for !== undefined) {\n throw new UsageError(say(\"task.claim_self_and_for\"));\n }\n if (\n opts.for === undefined &&\n opts.self !== true &&\n (await resolveWorkerIdentity()) === undefined\n ) {\n throw new UsageError(say(\"task.claim_no_claimer\"), { showHelp: false });\n }\n if (opts.actor !== undefined && opts.self !== true) {\n throw new UsageError(say(\"task.claim_actor\"));\n }\n // Parse `--for` for an optional qualified ref: bare `<name>`\n // resolves the agent in the task's workstream (today); qualified\n // `<workstream>/<name>` resolves the agent in its own workstream\n // and dispatches across the workstream boundary\n // (task_claim_for_cross_workstream).\n let forName: string | undefined;\n let forWorkstream: string | undefined;\n if (opts.for !== undefined) {\n const parsed = parseQualifiedRef(opts.for);\n forName = parsed.name;\n if (parsed.workstream !== undefined) {\n forWorkstream = checkQualifiedPrefix(opts.for, parsed.workstream);\n // Pre-flight: workstream must exist (typed error so the operator\n // sees the canonical exit-3 mapping instead of a bare\n // ClaimerNotRegisteredError pointing at the wrong cause).\n if (tryResolveLiveWorkstreamId(db, forWorkstream) === null) {\n throw new WorkstreamNotFoundError(forWorkstream);\n }\n // Pre-flight: agent must exist in that workstream. Without this\n // the SDK surfaces ClaimerNotRegisteredError (the bare-name\n // shape) which doesn't carry the qualifying workstream context\n // — AgentNotFoundError(name, workstream) is the right shape for\n // the cross-ws path.\n const wsId = tryResolveLiveWorkstreamId(db, forWorkstream);\n if (wsId !== null) {\n const row = db\n .prepare(\"SELECT 1 FROM agents WHERE name = ? AND workstream_id = ?\")\n .get(forName, wsId);\n if (!row) throw new AgentNotFoundError(forName, forWorkstream);\n }\n }\n }\n const sdkOpts: Parameters<typeof claimTask>[2] = { workstream: ws };\n if (forName !== undefined) sdkOpts.agentName = forName;\n if (opts.force) sdkOpts.force = true;\n if (opts.if !== undefined) sdkOpts.ifRevision = opts.if;\n if (forWorkstream !== undefined) sdkOpts.agentWorkstream = forWorkstream;\n if (opts.self) sdkOpts.self = true;\n if (opts.actor !== undefined) sdkOpts.actor = opts.actor;\n if (opts.evidence !== undefined) sdkOpts.evidence = opts.evidence;\n // `--for` dispatch: the CLAIM note is the dispatcher's, not the\n // worker's (the SDK defaults it to the claimer).\n if (opts.evidence && forName !== undefined) sdkOpts.author = await resolveActorIdentity();\n const result = await claimTask(db, localId, sdkOpts);\n // A `--for` dispatch owes a wait: the task, in ITS workstream, and the agent that now owns\n // it (read from the task's owner_id, not from the label or the task's namespace). --self\n // (owner NULL) and a worker's own claim arm nothing: the caller would wait on its own work.\n const warnings: string[] = [];\n if (opts.for !== undefined && result.ownerName !== null) {\n const o = getTaskOwner(db, localId, ws);\n const ownerRow = o === undefined ? undefined : getAgent(db, o.name, o.workstreamName);\n const armed = armWait(db, [\n taskRef(ws, localId),\n ...(ownerRow !== undefined && `${o?.workstreamName}/${o?.name}` !== currentCallers()[0]\n ? [agentRef(ownerRow)]\n : []),\n ]);\n if (armed.warning !== undefined) warnings.push(armed.warning);\n }\n if (opts.andWait === true && sig !== undefined) {\n return runWait(\n db,\n {\n refs: [taskRef(ws, localId) as WaitRef],\n mode: \"all\",\n onStall: \"exit\",\n verb: \"mu task claim --and-wait\",\n scope: ws,\n },\n sig,\n {\n extraData: {\n claimed: {\n task: localId,\n workstream: ws,\n ownerName: result.ownerName,\n previousStatus: result.previousStatus,\n status: result.status,\n },\n ...(warnings.length > 0 ? { warnings } : {}),\n },\n },\n );\n }\n if (!opts.json) for (const w of warnings) console.error(pc.yellow(`warning: ${w}`));\n // claim-before-send: a --for claim is the moment of dispatch; the owner is sent the task next.\n if (result.ownerName !== null && opts.for !== undefined) {\n setNextOutcome({\n kind: \"claimed-for\",\n task: { workstream: ws, id: localId },\n owner: { name: result.ownerName, workstream: forWorkstream ?? ws },\n muxCanSend: await muxCanSendToPanes(),\n });\n }\n if (opts.json) {\n emitJson({ ...result, ...(warnings.length > 0 ? { warnings } : {}) });\n return;\n }\n if (result.ownerName === null) {\n console.log(\n `Claimed ${pc.bold(localId)} ${pc.dim(`(--self by ${result.actorName}; ${result.previousStatus} → ${result.status}; owner=NULL)`)}`,\n );\n } else {\n console.log(\n `Claimed ${pc.bold(localId)} for ${pc.bold(result.ownerName)} ${pc.dim(`(${result.previousStatus} → ${result.status})`)}`,\n );\n }\n if (opts.evidence) console.log(pc.dim(` evidence: ${opts.evidence}`));\n}\n\n/**\n * `mu task wait <ids...>`: the same wait as `mu wait`, over `task:` refs. A bare\n * id needs -w (or the worker's injected workstream); `<ws>/<id>` carries its own.\n * One engine (src/wait.ts), one JSON result; the only thing added here is the\n * hint after a closed task: the worker's worktree commits to pick from.\n */\nexport async function cmdTaskWait(\n db: Db,\n ids: readonly string[],\n opts: {\n status?: string;\n any?: boolean;\n first?: boolean;\n all?: boolean;\n allOf?: boolean;\n firstOf?: boolean;\n timeout?: number;\n stuckAfter?: number;\n onStall?: string;\n workstream?: string;\n json?: boolean;\n },\n sig: WaitSignals,\n): Promise<void> {\n if (ids.length === 0) {\n throw new UsageError(say(\"task.wait_ids\"));\n }\n const mode = waitMode(opts);\n const onStall = parseOnStall(opts.onStall);\n // An explicit -w is validated even when every ref is qualified.\n if (opts.workstream !== undefined) checkWorkstreamName(opts.workstream);\n const refs: WaitRef[] = [];\n for (const id of ids) {\n // `task wait` takes bare or qualified task ids; the typed form is accepted too.\n refs.push(await parseWaitRef(db, id.startsWith(\"task:\") ? id : `task:${id}`, opts.workstream));\n }\n const spec: WaitSpec = {\n refs,\n mode,\n onStall,\n verb: \"mu task wait\",\n ...(opts.workstream !== undefined ? { scope: opts.workstream } : {}),\n ...(opts.status !== undefined ? { status: opts.status } : {}),\n ...(opts.stuckAfter !== undefined ? { stuckAfter: opts.stuckAfter } : {}),\n ...(opts.timeout !== undefined ? { timeout: opts.timeout } : {}),\n };\n await runWait(db, spec, sig);\n}\n","// mu — `mu task` graph-edge verbs (block / unblock / reparent / delete).\n//\n// All four mutate task_edges (block/unblock/reparent) or cascade through\n// it via FK (delete). Each is idempotent and emits typed errors that\n// `handle()` in src/cli.ts maps to exit codes.\n\nimport {\n assertTaskInWorkstream,\n emitJson,\n parseCsvFlag,\n resolveEntityRef,\n resolveExistingWorkstream,\n UsageError,\n} from \"../../cli.js\";\nimport type { Db } from \"../../db.js\";\nimport { say } from \"../../messages.js\";\nimport { pc } from \"../../output.js\";\nimport { withTaskFence } from \"../../revision.js\";\nimport { candidateTaskIds } from \"../../tasks/id.js\";\nimport { addBlockEdge, deleteTask, getTask, removeBlockEdge, reparentTask } from \"../../tasks.js\";\nimport { setNextOutcome } from \"../handle.js\";\n\n/** Canonicalise the `-b/--by` value into a non-empty blocker list.\n *\n * dogfood-block-multi: `--by` used to be single-valued while\n * `mu task add --blocked-by` was variadic + comma-aware, so the\n * natural `mu task block X --by a,b,c` failed with\n * \"no such task: a,b,c\". Both flags now funnel through the SAME\n * canonical helper (parseCsvFlag), so repeat / comma / mixed forms\n * all work and the two verbs can no longer drift apart.\n *\n * Commander hands us `string` for the legacy `<blocker>` shape and\n * `string[]` for the variadic one; accept both so a programmatic\n * caller passing the old single-string shape keeps working. */\nexport function parseByFlag(by: string | readonly string[]): string[] {\n const blockers = parseCsvFlag(typeof by === \"string\" ? [by] : by, \"-b/--by\");\n if (blockers.length === 0) {\n throw new UsageError(say(\"task.by_required\"));\n }\n // De-dupe so `--by a,a` is a single edge attempt rather than an\n // added-then-no-op pair that would read as a confusing partial.\n return [...new Set(blockers)];\n}\n\nexport async function cmdTaskBlock(\n db: Db,\n rawBlocked: string,\n opts: { by: string | readonly string[]; workstream?: string; json?: boolean; if?: number },\n): Promise<void> {\n const { name: blocked } = await resolveEntityRef(db, rawBlocked, opts, \"task\");\n assertTaskInWorkstream(db, blocked, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const blockers = parseByFlag(opts.by);\n // Sequential, fail-fast: the first bad blocker throws its typed\n // error (not-found / cycle / cross-workstream) and earlier edges\n // stay added. Same semantics as running the single-blocker form N\n // times, which is what this replaces. With --if the whole batch sits\n // behind ONE revision check in one transaction (a batch cannot\n // invalidate its own fence), so a failure rolls every edge back.\n const results = withTaskFence(db, ws, blocked, opts.if, () =>\n blockers.map((blocker) => ({\n blockerName: blocker,\n ...addBlockEdge(db, ws, blocked, blocker),\n })),\n );\n const added = results.filter((r) => r.added).length;\n if (opts.json) {\n const first = results[0];\n emitJson({\n blockedName: blocked,\n // Single-blocker callers keep the pre-existing scalar shape.\n blockerName: first !== undefined && results.length === 1 ? first.blockerName : undefined,\n blockerNames: blockers,\n results,\n added: added > 0,\n addedEdges: added,\n });\n return;\n }\n for (const r of results) {\n if (!r.added) {\n console.log(pc.dim(`${r.blockerName} → ${blocked}: edge already exists (no-op)`));\n continue;\n }\n console.log(`Added edge ${pc.bold(r.blockerName)} → ${pc.bold(blocked)}`);\n }\n}\n\nexport async function cmdTaskUnblock(\n db: Db,\n rawBlocked: string,\n opts: { by: string | readonly string[]; workstream?: string; json?: boolean; if?: number },\n): Promise<void> {\n const { name: blocked } = await resolveEntityRef(db, rawBlocked, opts, \"task\");\n assertTaskInWorkstream(db, blocked, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n // Symmetric with `block`: same --by parsing on both halves of the\n // same edge operation, so a multi-blocker block is a single\n // invocation too.\n const blockers = parseByFlag(opts.by);\n const results = withTaskFence(db, ws, blocked, opts.if, () =>\n blockers.map((blocker) => ({\n blockerName: blocker,\n ...removeBlockEdge(db, ws, blocked, blocker),\n })),\n );\n const removed = results.filter((r) => r.removed).length;\n // The no-op for an unknown id stays a no-op; it only says which ids of\n // THIS workstream the typo may have meant (read-only).\n const candidates = [\n ...new Set(\n [blocked, ...blockers]\n .filter((id) => getTask(db, id, ws) === undefined)\n .flatMap((id) => candidateTaskIds(db, ws, id)),\n ),\n ];\n if (opts.json) {\n const first = results[0];\n emitJson({\n blockedName: blocked,\n blockerName: first !== undefined && results.length === 1 ? first.blockerName : undefined,\n blockerNames: blockers,\n results,\n removed: removed > 0,\n removedEdges: removed,\n ...(candidates.length > 0 ? { candidate_ids: candidates } : {}),\n });\n return;\n }\n for (const r of results) {\n if (!r.removed) {\n console.log(pc.dim(`${r.blockerName} → ${blocked}: no such edge (no-op)`));\n continue;\n }\n console.log(`Removed edge ${pc.bold(r.blockerName)} → ${pc.bold(blocked)}`);\n }\n if (candidates.length > 0) console.log(pc.dim(` similar: ${candidates.join(\", \")}`));\n}\n\nexport async function cmdTaskReparent(\n db: Db,\n rawId: string,\n opts: { blockedBy: string[]; workstream?: string; json?: boolean; if?: number },\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n // An all-EMPTY --blocked-by '' is the documented clear-all-blockers\n // sentinel here (unlike --by, where zero blockers is meaningless),\n // so [] stays legal. A BLANK ' ' still throws from parseCsvFlag.\n const blockers = parseCsvFlag(opts.blockedBy, \"-b/--blocked-by\");\n const r = withTaskFence(db, ws, localId, opts.if, () =>\n reparentTask(db, localId, blockers, { workstream: ws }),\n );\n if (opts.json) {\n emitJson({ taskName: localId, blockerNames: blockers, ...r });\n return;\n }\n console.log(\n `Reparented ${pc.bold(localId)} ${pc.dim(`(removed ${r.removedEdges} edges, added ${r.addedEdges})`)}`,\n );\n}\n\nexport async function cmdTaskDelete(\n db: Db,\n rawId: string,\n opts: { workstream?: string; json?: boolean; yes?: boolean; if?: number } = {},\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n // Two-phase: bare = dry-run preview; --yes commits. Mirrors\n // `mu workstream teardown`. A dogfood report typed `mu task delete X --yes`\n // (mirroring workstream teardown) and got 'unknown option --yes'\n // because the verb took no confirmation flag at all; two failed\n // deletes left long-named tasks lingering until noticed.\n // --if <rev> (the preview's revision) applies the delete and refuses a\n // task that changed since; --yes still applies unfenced.\n const dryRun = opts.yes !== true && opts.if === undefined;\n const r = deleteTask(db, localId, ws, {\n dryRun,\n ...(opts.if !== undefined ? { ifRevision: opts.if } : {}),\n });\n if (r.present && r.dryRun && r.revision !== undefined) {\n setNextOutcome({\n kind: \"preview\",\n apply: [\"mu\", \"task\", \"delete\", localId, \"-w\", ws],\n revision: r.revision,\n });\n }\n\n // Missing row — idempotent no-op (same outcome whether dry-run or\n // --yes). The `present: false` discriminator keeps this distinct\n // from a dry-run that found an existing task with no edges/notes.\n if (!r.present) {\n // Read-only near ids of THIS workstream; nothing resolves through them.\n const candidates = candidateTaskIds(db, ws, localId);\n if (opts.json) {\n emitJson({\n taskName: localId,\n ...r,\n ...(candidates.length > 0 ? { candidate_ids: candidates } : {}),\n });\n return;\n }\n console.log(pc.dim(`no task named ${localId} (already deleted?)`));\n if (candidates.length > 0) console.log(pc.dim(` similar: ${candidates.join(\", \")}`));\n return;\n }\n\n // Dry-run: print the cascade preview. The task DOES exist (present\n // checked above); zero edges + zero notes is a real cascade-of-one.\n if (r.dryRun) {\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n console.log(\n r.deletedEdges === 0 && r.deletedNotes === 0\n ? `Would delete ${pc.bold(localId)} ${pc.dim(\"(no edges, no notes)\")}`\n : `Would delete ${pc.bold(localId)} ${pc.dim(`(edges: ${r.deletedEdges}, notes: ${r.deletedNotes})`)}`,\n );\n console.log(\"\");\n console.log(pc.dim(`(dry-run; rerun with --if ${r.revision} (or --yes) to actually delete)`));\n return;\n }\n\n // Commit path.\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n console.log(\n `Deleted ${pc.bold(localId)} ${pc.dim(`(edges: ${r.deletedEdges}, notes: ${r.deletedNotes})`)}`,\n );\n}\n","// mu — `mu task` lifecycle verbs (status transitions).\n//\n// close / open / park / accept / unpark. Each delegates to the SDK; changes are captured as ops\n// and optionally reported as evidence notes.\n\nimport {\n assertTaskInWorkstream,\n emitJson,\n resolveEntityRef,\n resolveExistingWorkstream,\n} from \"../../cli.js\";\nimport type { Db } from \"../../db.js\";\nimport { say } from \"../../messages.js\";\nimport { pc } from \"../../output.js\";\nimport { formatPair, type TaskPair } from \"../../tasks/status.js\";\nimport {\n acceptTask,\n CloseNeedsEvidenceError,\n type CloseSubstate,\n closeTask,\n getTask,\n getTaskEdgesWithStatus,\n openTask,\n parkTask,\n resolveActorIdentity,\n unparkTask,\n weakDecisionWarning,\n} from \"../../tasks.js\";\nimport { dirtyFiles } from \"../../vcs/git.js\";\nimport { getWorktreeFor } from \"../../worktree.js\";\nimport { UsageError } from \"../handle.js\";\n\nexport async function cmdTaskClose(\n db: Db,\n rawId: string,\n rawOpts: {\n evidence?: string;\n note?: string;\n report?: string;\n ifReady?: boolean;\n as?: string;\n why?: string;\n workstream?: string;\n json?: boolean;\n } = {},\n): Promise<void> {\n // `--note` is the guessed spelling of `--evidence`: one source only.\n if (rawOpts.note !== undefined && rawOpts.evidence !== undefined) {\n throw new UsageError(say(\"task.close_note_alias\"), { showHelp: false });\n }\n const opts = { ...rawOpts, evidence: rawOpts.evidence ?? rawOpts.note };\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const actor = await resolveActorIdentity();\n const sdkOpts: Parameters<typeof closeTask>[2] = { workstream: ws };\n if (opts.evidence !== undefined) sdkOpts.evidence = opts.evidence;\n if (opts.report !== undefined && opts.report.trim() !== \"\") {\n sdkOpts.report = opts.report;\n sdkOpts.author = actor;\n }\n if (opts.ifReady) sdkOpts.ifReady = true;\n // closeTask validates the substate (InvalidSubstateError) and the\n // required --why (SubstateReasonRequiredError) before any write; the\n // cast only narrows the type, the SDK owns the check.\n if (opts.as !== undefined) sdkOpts.as = opts.as.toLowerCase() as CloseSubstate;\n if (opts.why !== undefined) sdkOpts.why = opts.why;\n // The reason note is attributed like the evidence note.\n if (opts.why !== undefined && opts.why !== \"\") sdkOpts.author = actor;\n // mufeedback task_close_evidence_does_not_append_the: closeTask\n // auto-inserts a `CLOSE: <evidence>` note when --evidence is\n // non-empty. Resolve the actor identity once per close so the note is\n // attributed to the closing worker (mu-spawned worker via\n // MU_AGENT_NAME, adopted pane via title, otherwise $USER /\n // 'orchestrator') and so the dirty-worktree warning can inspect that\n // actor's worktree without resolving identity a second time.\n if (opts.evidence !== undefined && opts.evidence !== \"\") {\n sdkOpts.author = actor;\n }\n // Capture the owner BEFORE closeTask so we can refresh their title\n // even though closeTask doesn't return owner info. owner won't\n // change as a result of close (FK SET NULL only fires on delete).\n const taskRow = getTask(db, localId, ws);\n // A close to done needs --evidence. Refuse before any write, with one\n // line naming the flag. A no-op retry of an already-CLOSED task needs\n // none; with --if-ready the SDK decides (a skip writes nothing).\n const closeAs = sdkOpts.as ?? (taskRow?.status === \"CLOSED\" ? taskRow.substate : \"done\");\n const retry = taskRow?.status === \"CLOSED\" && taskRow.substate === closeAs;\n // The --if-ready skip (a blocker not CLOSED) is the one case left to the SDK.\n const wouldSkip =\n opts.ifReady === true &&\n taskRow !== undefined &&\n getTaskEdgesWithStatus(db, localId, ws).blockers.some((e) => e.status !== \"CLOSED\");\n if (\n taskRow &&\n !retry &&\n !wouldSkip &&\n closeAs === \"done\" &&\n (opts.evidence ?? \"\").trim() === \"\"\n ) {\n // The same typed error the SDK and `mu sql` raise: one guard, one class, one exit (2).\n throw new CloseNeedsEvidenceError(localId, ws);\n }\n // Read before the close: the warning is about the finding as it was.\n const warnings = decisionWarnings(db, localId, ws, sdkOpts.as ?? \"done\", opts.why);\n const r = closeTask(db, localId, sdkOpts);\n // --if-ready can return a CloseSkippedResult (no mutation). Branch\n // first so the typed `skipped` field stays in scope below.\n if (\"skipped\" in r) {\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n const total = r.blockingIds.length;\n const shown = r.blockingIds.slice(0, 8).join(\", \");\n const tail = total > 8 ? \", \\u2026\" : \"\";\n console.log(\n pc.dim(\n `Skipped ${pc.bold(localId)}: blocked by ${total} task(s) (${shown}${tail}); close again once they are CLOSED`,\n ),\n );\n return;\n }\n if (r.changed && r.status === \"CLOSED\") {\n const commit = await dirtyWorktreeWarning(db, actor, ws, taskRow?.title ?? localId);\n if (commit !== undefined) warnings.push(commit);\n }\n if (opts.json) {\n emitJson({ taskName: localId, ...r, warnings });\n return;\n }\n printDecisionWarnings(warnings);\n if (!r.changed) {\n console.log(pc.dim(`${localId} already CLOSED (no-op)`));\n return;\n }\n const ev = opts.evidence ? pc.dim(` evidence: ${opts.evidence}`) : \"\";\n console.log(`Closed ${pc.bold(localId)} ${pc.dim(`(${transition(r)})`)}`);\n if (ev) console.log(ev);\n if (r.unblocked.length > 0) console.log(`Unblocked: ${r.unblocked.join(\", \")}`);\n}\n\n/** The weak-decision warning for this accept / close, as a 0-or-1 list\n * (the `warnings` array in --json). Never blocks the verb. */\nfunction decisionWarnings(\n db: Db,\n localId: string,\n ws: string,\n kind: Parameters<typeof weakDecisionWarning>[3],\n reason: string | undefined,\n): string[] {\n const w = weakDecisionWarning(db, localId, ws, kind, reason);\n return w === undefined ? [] : [w];\n}\n\nfunction printDecisionWarnings(warnings: readonly string[]): void {\n for (const w of warnings) console.error(pc.yellow(`warning: ${w}`));\n}\n\n/** \"OPEN → CLOSED/wontfix\": the pair transition a lifecycle verb made. */\nfunction transition(r: {\n previousStatus: TaskPair[\"status\"];\n previousSubstate: TaskPair[\"substate\"];\n status: TaskPair[\"status\"];\n substate: TaskPair[\"substate\"];\n}): string {\n const from = formatPair({ status: r.previousStatus, substate: r.previousSubstate });\n return `${from} → ${formatPair({ status: r.status, substate: r.substate })}`;\n}\n\n/** The commit command for a dirty worktree. Picks up untracked files\n * (`git commit -am` alone would refuse with \"nothing added\"), and names\n * the path so it works from any cwd. Exported for the fast-tier test. */\nexport function commitHintCommand(worktree: string, taskTitle: string): string {\n const dir = shellSingleQuote(worktree);\n return `git -C ${dir} add -A && git -C ${dir} commit -m ${shellSingleQuote(taskTitle)}`;\n}\n\n/** The closer's worktree has uncommitted changes: a warning naming the commit. */\nasync function dirtyWorktreeWarning(\n db: Db,\n actor: string,\n workstream: string,\n taskTitle: string,\n): Promise<string | undefined> {\n if (actor.length === 0) return undefined;\n try {\n const row = getWorktreeFor(db, workstream, actor);\n if (row === undefined) return undefined;\n if ((await dirtyFiles(row.path)).length === 0) return undefined;\n return say(\"task.close_uncommitted\", row.path, commitHintCommand(row.path, taskTitle));\n } catch {\n // Best-effort: a VCS probe failure must never make\n // `mu task close` fail after the task successfully closed.\n return undefined;\n }\n}\n\nfunction shellSingleQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nexport async function cmdTaskOpen(\n db: Db,\n rawId: string,\n opts: { evidence?: string; workstream?: string; json?: boolean } = {},\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const sdkOpts: Parameters<typeof openTask>[2] = { workstream: ws };\n if (opts.evidence !== undefined) sdkOpts.evidence = opts.evidence;\n if (opts.evidence) sdkOpts.author = await resolveActorIdentity();\n const r = openTask(db, localId, sdkOpts);\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n if (!r.changed) {\n console.log(pc.dim(`${localId} already OPEN (no-op)`));\n return;\n }\n const ev = opts.evidence ? pc.dim(` evidence: ${opts.evidence}`) : \"\";\n console.log(`Reopened ${pc.bold(localId)} ${pc.dim(`(${transition(r)})`)}`);\n if (ev) console.log(ev);\n}\n\nexport async function cmdTaskPark(\n db: Db,\n rawId: string,\n opts: { why: string; evidence?: string; workstream?: string; json?: boolean },\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const sdkOpts: Parameters<typeof parkTask>[2] = {\n workstream: ws,\n why: opts.why,\n author: await resolveActorIdentity(),\n };\n if (opts.evidence !== undefined) sdkOpts.evidence = opts.evidence;\n const r = parkTask(db, localId, sdkOpts);\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n if (!r.changed) {\n console.log(pc.dim(`${localId} already OPEN/parked (no-op)`));\n } else {\n console.log(`Parked ${pc.bold(localId)} ${pc.dim(`(${transition(r)})`)}`);\n }\n}\n\nexport async function cmdTaskAccept(\n db: Db,\n rawId: string,\n opts: { evidence?: string; workstream?: string; json?: boolean } = {},\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const sdkOpts: Parameters<typeof acceptTask>[2] = { workstream: ws };\n if (opts.evidence !== undefined) sdkOpts.evidence = opts.evidence;\n if (opts.evidence) sdkOpts.author = await resolveActorIdentity();\n const warnings = decisionWarnings(db, localId, ws, \"accept\", opts.evidence);\n const r = acceptTask(db, localId, sdkOpts);\n if (opts.json) {\n emitJson({ taskName: localId, ...r, warnings });\n return;\n }\n printDecisionWarnings(warnings);\n if (!r.changed) {\n const pair = formatPair({ status: r.status, substate: r.substate });\n console.log(pc.dim(`${localId} is ${pair}, not in triage (no-op)`));\n } else {\n console.log(`Accepted ${pc.bold(localId)} ${pc.dim(`(${transition(r)})`)}`);\n }\n}\n\nexport async function cmdTaskUnpark(\n db: Db,\n rawId: string,\n opts: { evidence?: string; workstream?: string; json?: boolean } = {},\n): Promise<void> {\n const { name: localId } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, localId, opts.workstream);\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const sdkOpts: Parameters<typeof unparkTask>[2] = { workstream: ws };\n if (opts.evidence !== undefined) sdkOpts.evidence = opts.evidence;\n if (opts.evidence) sdkOpts.author = await resolveActorIdentity();\n const r = unparkTask(db, localId, sdkOpts);\n if (opts.json) {\n emitJson({ taskName: localId, ...r });\n return;\n }\n if (!r.changed) {\n const pair = formatPair({ status: r.status, substate: r.substate });\n console.log(pc.dim(`${localId} is ${pair}, not parked (no-op)`));\n } else {\n console.log(`Unparked ${pc.bold(localId)} ${pc.dim(`(${transition(r)})`)}`);\n }\n}\n","// mu — `mu task tree` verb (record / JSON dependency listing).\n//\n// Lists the OPEN blocker subtree (default) or dependent subtree (--down)\n// of a task from loadOpenTaskFrontier (src/dag.ts): open tasks expand, CLOSED\n// ones are leaves, depth and node counts are capped. One record per entry in\n// preorder (the shared task record plus `depth=`, `parent=`, and `kids=` /\n// `closed=` / `capped=` counts of what hangs below and is not listed), or one\n// JSON item per entry. Diamonds list once plus an `again` record at every\n// later sighting; the same rule stops a cycle, which sync can create\n// (`mu doctor` reports those).\n//\n// ONE way back from any cut (a page that does not fit 4 KB, a depth or node\n// cap, collapsed CLOSED neighbours, a clipped title): the same command with\n// `--all`, which walks everything (CLOSED included) and prints it whole.\n// The footer `more=N next=<that command>` is reserved before the page shrinks.\n\nimport { assertTaskInWorkstream, emitJson, resolveEntityRef } from \"../../cli.js\";\nimport {\n FRONTIER_MAX_DEPTH,\n type FrontierDirection,\n type FrontierEntry,\n loadOpenTaskFrontier,\n} from \"../../dag.js\";\nimport type { Db } from \"../../db.js\";\nimport { shellWord } from \"../../shell-quote.js\";\nimport { getTask, TaskNotFoundError } from \"../../tasks.js\";\nimport {\n escapeRecordText,\n footerLine,\n jsonDocument,\n linesBytes,\n pageRecords,\n type RecordPage,\n taskItemCut,\n taskRecordCut,\n} from \"./records.js\";\n\ninterface TreeOpts {\n /** Show dependents (what this task blocks) instead of blockers. */\n down?: boolean;\n json?: boolean;\n workstream?: string;\n /** The uncapped read: CLOSED walked too, every level and task, no paging. */\n all?: boolean;\n}\n\nexport async function cmdTaskTree(db: Db, rawId: string, opts: TreeOpts): Promise<void> {\n // resolveEntityRef parses `<workstream>/<name>` if present, else uses\n // opts.workstream. Returns the resolved (name, workstream) pair so we\n // never re-resolve downstream — the workstream is mandatory on every\n // SDK call that resolves an entity by name.\n const { name: rootId, workstream: ws } = await resolveEntityRef(db, rawId, opts, \"task\");\n assertTaskInWorkstream(db, rootId, ws);\n const root = getTask(db, rootId, ws);\n if (!root) throw new TaskNotFoundError(rootId, ws);\n const down = opts.down ?? false;\n const json = opts.json === true;\n const whole = opts.all === true;\n const direction: FrontierDirection = down ? \"dependents\" : \"blockers\";\n const { entries, againCut } = loadOpenTaskFrontier(db, ws, rootId, direction, {\n uncapped: whole,\n });\n const allCmd = `mu task tree ${shellWord(rootId)} -w ${shellWord(ws)}${down ? \" --down\" : \"\"}${json ? \" --json\" : \"\"} --all`;\n\n const counts = (e: FrontierEntry): [string, number][] =>\n (\n [\n [\"kids\", e.kids],\n [\"closed\", e.closed],\n [\"capped\", e.capCut],\n ] as [string, number][]\n ).filter(([, n]) => n > 0);\n const fields = (e: FrontierEntry): string[] => [\n `depth=${e.depth}`,\n ...(e.parent === null ? [] : [`parent=${escapeRecordText(e.parent)}`]),\n ...(e.again ? [\"again=1\"] : []),\n ...counts(e).map(([k, n]) => `${k}=${n}`),\n ];\n const render = (page: RecordPage<FrontierEntry>) => {\n let cut = 0;\n // Not listed: entries past the page, and what a cap or the CLOSED collapse left under any entry.\n const more = page.more + entries.reduce((n, e) => n + e.kids + e.closed + e.capCut, 0);\n const lines: string[] = [];\n const items: Record<string, unknown>[] = [];\n for (const e of page.shown) {\n if (json) {\n const one = taskItemCut(e.task, { whole });\n cut += one.cut;\n items.push({\n ...one.item,\n depth: e.depth,\n parent: e.parent,\n ...(e.again ? { again: true } : {}),\n ...Object.fromEntries(counts(e)),\n });\n } else {\n const one = taskRecordCut(e.task, { whole, extra: fields(e) });\n cut += one.cut;\n lines.push(one.line);\n }\n }\n const foot = footerLine({ more, cut }, allCmd);\n if (json) {\n return {\n lines,\n data: {\n direction,\n workstream: ws,\n root: rootId,\n ...(whole ? {} : { max_depth: FRONTIER_MAX_DEPTH }),\n ...(againCut > 0 ? { again_cut: againCut } : {}),\n items,\n count: items.length,\n more,\n ...(cut > 0 ? { cut } : {}),\n ...(foot === null ? {} : { retrieve: allCmd }),\n },\n };\n }\n const header = [\n \"tree\",\n escapeRecordText(rootId),\n direction,\n `entries=${entries.length}${whole ? \"\" : ` max_depth=${FRONTIER_MAX_DEPTH}`}`,\n down ? \"hint=omit --down for blockers\" : \"hint=--down for dependents\",\n ].join(\"\\t\");\n return { lines: [header, ...lines, ...(foot === null ? [] : [foot])], data: undefined };\n };\n const page: RecordPage<FrontierEntry> = whole\n ? { shown: entries, more: 0 }\n : pageRecords(entries, (p) => {\n const r = render(p);\n return json ? Buffer.byteLength(jsonDocument(r.data)) + 1 : linesBytes(r.lines);\n });\n const out = render(page);\n if (json) emitJson(out.data);\n else console.log(out.lines.join(\"\\n\"));\n}\n","// mu — `mu task` commander wiring.\n//\n// Pure glue: every `task.command(...)` definition lives here, so the\n// per-verb modules in this cluster stay focused on behaviour. Imported\n// by buildProgram() in src/cli.ts via the re-export hub at\n// src/cli/tasks.ts.\n\nimport { type Command, Option } from \"commander\";\nimport {\n handle,\n JSON_OPT,\n normalizeInheritedWorkstream,\n parseImpact,\n parseLines,\n parseNonNegativeInt,\n parsePositiveInt,\n parsePositiveNumber,\n parseSeconds,\n TASK_SORT_KEYS,\n WORKSTREAM_OPT,\n} from \"../../cli.js\";\nimport { NOTE_KINDS, type NoteKind } from \"../../db.js\";\nimport { TASK_SUBSTATES } from \"../../tasks/status.js\";\nimport { TASK_STATUS_LIST } from \"../../tasks.js\";\nimport { installWaitSignals } from \"../wait.js\";\nimport { cmdTaskAuto } from \"./auto.js\";\nimport { cmdClaim, cmdTaskRelease, cmdTaskWait } from \"./claim.js\";\nimport { cmdTaskBlock, cmdTaskDelete, cmdTaskReparent, cmdTaskUnblock } from \"./edges.js\";\nimport {\n cmdTaskAdd,\n cmdTaskNote,\n cmdTaskNotes,\n cmdTaskShow,\n cmdTaskUpdate,\n resolveNoteText,\n} from \"./edit.js\";\nimport {\n cmdTaskAccept,\n cmdTaskClose,\n cmdTaskOpen,\n cmdTaskPark,\n cmdTaskUnpark,\n} from \"./lifecycle.js\";\nimport { cmdTaskList, cmdTaskNext, cmdTaskOwnedBy } from \"./queries.js\";\nimport { cmdTaskTree } from \"./tree.js\";\n\nexport function wireTaskCommands(program: Command): void {\n const task = program.command(\"task\").description(\"Task graph commands\");\n\n const collect = (v: string, prev: string[] = []): string[] => [...prev, v];\n\n task\n .command(\"add [ids...]\")\n .description(\n \"Add tasks atomically. No id: derived from -t (cut at ~40 chars, collisions get _2…). Several ids need one -t each; --note, score and edges apply to all. --blocks <umbrella> makes the umbrella wait for them.\",\n )\n .requiredOption(\"-t, --title <title>\", \"task title (repeat: one per id)\", collect)\n .option(\n \"-i, --impact <n>\",\n \"impact 1..100 (default 50; giving -i or -e scores the task)\",\n parseImpact,\n )\n .option(\"-e, --effort-days <days>\", \"effort in days (>0; default 1)\", parsePositiveNumber)\n .option(\n \"-b, --blocked-by <ids...>\",\n \"task ids that block this one (repeat or comma-separate; or both)\",\n )\n .option(\n \"--blocks <ids...>\",\n \"umbrella ids this task blocks (repeat or comma-separate); rolls back with the task on a cycle\",\n )\n .option(\n \"--note <text>\",\n \"append an initial note (the brief) after creating the task; `-` reads it from stdin (prose: --note - <<'EOF')\",\n )\n .option(\"--note-author <name>\", \"author label for --note (default: current actor)\")\n .option(\n \"--triage\",\n \"start as OPEN/triage: a proposal (e.g. a review finding) kept out of next/claim until `mu task accept`\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (ids: string[]) {\n const opts = (this as Command).opts() as {\n title: string[];\n impact?: number;\n effortDays?: number;\n blockedBy?: string[];\n blocks?: string[];\n note?: string;\n noteAuthor?: string;\n triage?: boolean;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskAdd(db, ids, opts), this as Command)();\n });\n\n // --sort key list shared across list/next. `id` is the historical\n // default for `mu task list`; `roi` is the default for `next` (the\n // \"what should I do\" verb; `next -n 0` replaced `task ready`). The two time-based\n // keys (`recency` = updated_at DESC, `age` = created_at ASC) trigger\n // an extra `updated`/`created` column with relative timestamps so\n // the user sees the dimension they sorted by.\n const SORT_OPT_DESC = `sort key (${TASK_SORT_KEYS.join(\" | \")})`;\n const SUBSTATE_OPT_DESC = `filter by substate (${[...new Set(Object.values(TASK_SUBSTATES).flat())].join(\" | \")}; repeat or comma-separate)`;\n\n task\n .command(\"list\")\n .description(\"List every task in the current workstream (id, status, impact, effort, scored)\")\n .option(...WORKSTREAM_OPT)\n .option(\n \"--status <status...>\",\n `filter by lifecycle status (${TASK_STATUS_LIST}; case-insensitive; repeat or comma-separate; or both)`,\n )\n .option(\"--substate <substate...>\", SUBSTATE_OPT_DESC)\n .option(\"--sort <key>\", `${SORT_OPT_DESC} (default id)`)\n .option(\"--all\", \"no cap: every task, whole (a cut result names this command)\")\n .option(\"--owner <agent>\", \"only tasks this agent owns (<agent> or <workstream>/<agent>)\")\n .option(\"--mine\", \"only tasks the calling agent owns\")\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).opts() as {\n workstream?: string;\n json?: boolean;\n status?: string[];\n substate?: string[];\n sort?: string;\n all?: boolean;\n owner?: string;\n mine?: boolean;\n };\n return handle((db) => cmdTaskList(db, opts), this as Command)();\n });\n\n task\n .command(\"next\")\n .description(\n \"Show the next ready task(s) by ROI (impact / effort_days). The 'what should I do?' verb. Pass -n 0 for the unlimited 'what is doable?' shape (merged-in `task ready`).\",\n )\n .option(\n \"-n, --lines <k>\",\n \"how many top-K tasks to return (default 1; 0 = all ready)\",\n parseLines,\n )\n .option(...WORKSTREAM_OPT)\n .option(\"--all\", \"no cap: every ready task, whole (a cut result names this command)\")\n .option(\"--sort <key>\", `${SORT_OPT_DESC} (default roi)`)\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).opts() as {\n workstream?: string;\n lines?: number;\n json?: boolean;\n sort?: string;\n all?: boolean;\n };\n return handle((db) => cmdTaskNext(db, opts), this as Command)();\n });\n\n task\n .command(\"owned-by <agent>\")\n .description(\n \"List tasks owned by an agent in the current workstream; --all spans every workstream's same-named agent, --include-closed adds CLOSED ones, --full lifts the 4 KB cap.\",\n )\n .option(\n \"--include-closed\",\n \"include CLOSED tasks (closeTask preserves owner as historical record; default omits them)\",\n )\n .option(\n \"--all\",\n \"surface every workstream's same-named agent (cross-workstream view; default scopes to current workstream)\",\n )\n .option(\"--full\", \"no cap: every task, whole (a cut result names this command)\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (agent: string) {\n const opts = (this as Command).optsWithGlobals() as {\n json?: boolean;\n includeClosed?: boolean;\n all?: boolean;\n full?: boolean;\n workstream?: string | string[];\n };\n return handle(\n (db) =>\n cmdTaskOwnedBy(db, agent, {\n ...opts,\n workstream: normalizeInheritedWorkstream(opts.workstream),\n }),\n this as Command,\n )();\n });\n\n task\n .command(\"note <id> [text]\")\n .description(\n \"Append a note: <text> or -m/--message/--note/--text. Prose (an apostrophe ends '...'): pass `-` and a quoted heredoc, mu task note <id> - <<'EOF'; stdin is stored verbatim. --report files the report.\",\n )\n .option(\"-m, --message <text>\", \"the note text (alias for <text>)\")\n .option(\"--note <text>\", \"the note text (alias for <text>)\")\n .option(\"--text <text>\", \"the note text (alias for <text>)\")\n .option(\n \"--report\",\n \"file the note as the task's report (kind report, never edited; the last report wins, earlier ones stay in `mu task notes <id> --all`)\",\n )\n .addOption(\n new Option(\"--kind <kind>\", \"note kind (internal: delegates write verdicts)\")\n .choices(NOTE_KINDS)\n .hideHelp(),\n )\n .option(\"--author <name>\", \"override the auto-detected author label\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (id: string, text: string | undefined) {\n const opts = (this as Command).opts() as {\n workstream?: string;\n json?: boolean;\n author?: string;\n message?: string;\n note?: string;\n text?: string;\n report?: boolean;\n kind?: NoteKind;\n };\n // resolveNoteText throws UsageError; call it INSIDE the handle()\n // callback so the typed-error → exit-code map wraps it. A throw\n // from the .action() body itself escapes to commander's\n // parse-time catch, which is a different (and DB-close-skipping)\n // lane. Same rule every other verb's validation follows.\n return handle(\n (db) =>\n cmdTaskNote(\n db,\n id,\n resolveNoteText(text, {\n \"-m/--message\": opts.message,\n \"--note\": opts.note,\n \"--text\": opts.text,\n }),\n opts,\n ),\n this as Command,\n )();\n });\n\n task\n .command(\"show <id>\")\n .description(\n \"Show a task: one record, its edges (blockers/dependents) and the default notes view (see `task notes`), capped at 4 KB; a cut names the same command with --all (everything, whole). --note <n> prints one note whole.\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .option(\n \"--note <n>\",\n \"print note <n> of this task whole (n as shown in `task notes`)\",\n parsePositiveNumber,\n )\n .option(\"--all\", \"no cap: the task, every neighbour and every note, whole\")\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n json?: boolean;\n workstream?: string;\n note?: number;\n all?: boolean;\n };\n return handle((db) => cmdTaskShow(db, id, opts), this as Command)();\n });\n\n task\n .command(\"tree <id>\")\n .description(\n \"Open tree of a task's blockers (--down: dependents), one record per entry: open tasks expand, CLOSED are leaves, diamonds list once then `again=1`. 4 KB cap; a cut names the same command with --all.\",\n )\n .option(\"--down\", \"render dependents (what this task blocks) instead of blockers\")\n .option(\"--all\", \"no cap: every level, CLOSED tasks too, whole\")\n .option(\n \"--from <n>\",\n \"start at entry <n> (a cut result names the command)\",\n parsePositiveNumber,\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n all?: boolean;\n down?: boolean;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskTree(db, id, opts), this as Command)();\n });\n\n task\n .command(\"notes <id>\")\n .description(\n \"A task's notes, one per line (a newline inside a note prints as \\\\n): the brief, the report, every verdict, the last 3 others; `more=N next=…` names the rest. --all/--from <n> page the history; --tail, --since, --since-claim filter.\",\n )\n .option(\"--all\", \"every note, from the first (the default view leaves some out)\")\n .option(\"--from <n>\", \"every note from note <n> on\", parsePositiveNumber)\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .option(\"--tail <n>\", \"print only the last N notes (alias --last)\", parsePositiveNumber)\n .option(\"--last <n>\", \"alias for --tail\", parsePositiveNumber)\n .option(\"--since <iso>\", \"print only notes created after this ISO 8601 timestamp\")\n .option(\n \"--since-claim\",\n \"print only notes since the most recent 'task claim' event (auto-resolved)\",\n )\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n json?: boolean;\n workstream?: string;\n tail?: number;\n last?: number;\n since?: string;\n sinceClaim?: boolean;\n all?: boolean;\n from?: number;\n };\n // --last is an alias for --tail; collapse before passing to the verb.\n // If both are provided, prefer the explicit --tail.\n const tail = opts.tail ?? opts.last;\n const merged: {\n json?: boolean;\n workstream?: string;\n tail?: number;\n since?: string;\n sinceClaim?: boolean;\n all?: boolean;\n from?: number;\n } = {};\n if (opts.all !== undefined) merged.all = opts.all;\n if (opts.from !== undefined) merged.from = opts.from;\n if (opts.json !== undefined) merged.json = opts.json;\n if (opts.workstream !== undefined) merged.workstream = opts.workstream;\n if (tail !== undefined) merged.tail = tail;\n if (opts.since !== undefined) merged.since = opts.since;\n if (opts.sinceClaim !== undefined) merged.sinceClaim = opts.sinceClaim;\n return handle((db) => cmdTaskNotes(db, id, merged), this as Command)();\n });\n\n // --evidence <text> on the four lifecycle verbs records what the\n // caller relied on (test output, command exit, observed file change)\n // in the auto-emitted event payload. The verb still trusts the\n // caller; the audit trail records what they said. First inch of\n // the \"observed vs claimed state\" distinction.\n const EVIDENCE_OPT = [\n \"--evidence <text>\",\n \"record what the caller observed (e.g. 'tests pass: npm test exit 0'); appears verbatim in the event log\",\n ] as const;\n\n task\n .command(\"close <id>\")\n .description(\n 'Mark a task CLOSED (idempotent). `done` needs --evidence/--note \"<command + result>\" and closed blockers (exit 4); --report adds the report. --as <substate> needs --why. --if-ready waits for blockers.',\n )\n .option(\n \"--as <substate>\",\n `closing substate (${TASK_SUBSTATES.CLOSED.join(\" | \")}; default done)`,\n )\n .option(\n \"--why <text>\",\n \"reason, stored as a note; every --as but done needs it (done takes --evidence instead)\",\n )\n .option(\n \"--if-ready\",\n \"only close when every blocker is CLOSED; otherwise no-op + list the still-blocking ids\",\n )\n .option(\n \"--report <text>\",\n \"the worker's report, stored first as its own note (not evidence); the last report wins, earlier ones stay in `mu task notes <id> --all`\",\n )\n .option(\"--note <text>\", \"alias for --evidence\")\n .option(...WORKSTREAM_OPT)\n .option(...EVIDENCE_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n evidence?: string;\n note?: string;\n report?: string;\n as?: string;\n why?: string;\n ifReady?: boolean;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskClose(db, id, opts), this as Command)();\n });\n\n task\n .command(\"open <id>\")\n .description(\"Mark a task OPEN — e.g. to reopen something closed by mistake (idempotent)\")\n .option(...WORKSTREAM_OPT)\n .option(...EVIDENCE_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n evidence?: string;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskOpen(db, id, opts), this as Command)();\n });\n\n task\n .command(\"park <id>\")\n .description(\n \"Park an OPEN task (OPEN/parked): it leaves `next` and `claim` refuses it without --force. Dependents stay blocked. Idempotent.\",\n )\n .requiredOption(\"--why <text>\", \"why it is parked; stored as a note\")\n .option(...WORKSTREAM_OPT)\n .option(...EVIDENCE_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n why: string;\n evidence?: string;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskPark(db, id, opts), this as Command)();\n });\n\n task\n .command(\"accept <id>\")\n .description(\n \"Accept an OPEN/triage task (a proposed finding) as work: OPEN/todo, back in `next`. No-op on any other state. Decline with `close --as rejected|duplicate --why`.\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...EVIDENCE_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n evidence?: string;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskAccept(db, id, opts), this as Command)();\n });\n\n task\n .command(\"unpark <id>\")\n .description(\"Return a parked task to OPEN (back in `next`). No-op on any other state.\")\n .option(...WORKSTREAM_OPT)\n .option(...EVIDENCE_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n evidence?: string;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskUnpark(db, id, opts), this as Command)();\n });\n\n task\n .command(\"auto [ids...]\")\n .description(\n \"Authorise tasks for `mu next` on THIS machine (ready alone is never permission): stores cli key, worktree mode and run ceiling, and names this machine the task's dispatch host. --off revokes; counters stay. Refuses another host's task.\",\n )\n .option(\"--blockers-of <id>\", \"also authorise every open transitive blocker of <id> (not <id>)\")\n .option(\"--cli <key>\", \"agent CLI key to spawn (required unless --off)\")\n .option(\"--worktree\", \"give each worker its own worktree\")\n .option(\"--max <n>\", \"run ceiling per task (default 1)\", parsePositiveInt)\n .option(\"--off\", \"revoke this machine's permission (keeps runs and the replay receipt)\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (ids: string[]) {\n const opts = (this as Command).opts() as {\n blockersOf?: string;\n cli?: string;\n worktree?: boolean;\n max?: number;\n off?: boolean;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskAuto(db, ids, opts), this as Command)();\n });\n\n task\n .command(\"release <id>\")\n .description(\n \"Clear a task's owner. IN_PROGRESS auto-flips to OPEN so the task re-enters the ready set; other statuses preserved. Use --reopen to force OPEN from CLOSED. Idempotent.\",\n )\n .option(\n \"--reopen\",\n \"force status to OPEN regardless of current status (escape hatch for un-closing a CLOSED owned task in one verb)\",\n )\n .option(\n \"--if <rev>\",\n \"apply only if the task is still at this revision (from `mu task show --json` .task.revision or a preview); stale refuses with exit 4\",\n parseNonNegativeInt,\n )\n .option(...WORKSTREAM_OPT)\n .option(...EVIDENCE_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n reopen?: boolean;\n evidence?: string;\n workstream?: string;\n json?: boolean;\n if?: number;\n };\n return handle((db) => cmdTaskRelease(db, id, opts), this as Command)();\n });\n\n task\n .command(\"claim <id>\")\n .description(\n \"Claim a task. Default: the claimer is $MU_AGENT_NAME (a registered worker). --for <worker> dispatches; --self is an anonymous orchestrator claim (owner NULL).\",\n )\n .option(\n \"-f, --for <agent>\",\n \"claim on behalf of a registered worker (dispatch); accepts bare 'name' (resolves in the task's workstream) or qualified '<workstream>/<name>' for cross-workstream dispatch (e.g. 'roadmap-v0-3/worker-1')\",\n )\n .option(\n \"--self\",\n \"anonymous claim (orchestrator pattern): owner stays NULL; actor recorded in the ops log (ops.actor). Mutually exclusive with --for.\",\n )\n .option(\n \"--actor <name>\",\n \"override the actor name used for the log (only valid with --self; defaults to $MU_AGENT_NAME or $USER)\",\n )\n .option(\"--force\", \"claim even when the task is parked or in triage (OPEN/parked, OPEN/triage)\")\n .option(\n \"--and-wait\",\n \"after a --for dispatch, wait for the task (`mu wait` semantics: ONE JSON result, `data.claimed` is the claim, SIGINT/SIGTERM print a snapshot and a `resume`). Needs --for\",\n )\n .option(\n \"--if <rev>\",\n \"apply only if the task is still at this revision (from `mu task show --json` .task.revision or a preview); stale refuses with exit 4\",\n parseNonNegativeInt,\n )\n .option(...WORKSTREAM_OPT)\n .option(...EVIDENCE_OPT)\n .option(...JSON_OPT)\n .action(function (taskId: string) {\n const opts = (this as Command).opts() as {\n for?: string;\n self?: boolean;\n actor?: string;\n evidence?: string;\n workstream?: string;\n json?: boolean;\n force?: boolean;\n if?: number;\n andWait?: boolean;\n };\n const sig = opts.andWait ? installWaitSignals() : undefined;\n const run = handle((db) => cmdClaim(db, taskId, opts, sig), this as Command)();\n return sig === undefined ? run : run.finally(() => sig.dispose());\n });\n\n task\n .command(\"block <blocked>\")\n .description(\n \"Add blocking edges: --by <ids...> blocks <blocked>. Accepts repeat or comma-separated ids (same shape as `mu task add --blocked-by`). Validates same-workstream + cycle.\",\n )\n .requiredOption(\n \"-b, --by <blockers...>\",\n \"the task(s) that should block <blocked> (repeat or comma-separate)\",\n )\n .option(\n \"--if <rev>\",\n \"apply only if the task is still at this revision (from `mu task show --json` .task.revision or a preview); stale refuses with exit 4\",\n parseNonNegativeInt,\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (blocked: string) {\n const opts = (this as Command).opts() as {\n by: string | string[];\n workstream?: string;\n json?: boolean;\n if?: number;\n };\n return handle((db) => cmdTaskBlock(db, blocked, opts), this as Command)();\n });\n\n task\n .command(\"unblock <blocked>\")\n .description(\n \"Remove blocking edges (idempotent). --by accepts repeat or comma-separated ids, symmetric with `mu task block`.\",\n )\n .requiredOption(\n \"-b, --by <blockers...>\",\n \"the task(s) whose blocker edge to remove (repeat or comma-separate)\",\n )\n .option(\n \"--if <rev>\",\n \"apply only if the task is still at this revision (from `mu task show --json` .task.revision or a preview); stale refuses with exit 4\",\n parseNonNegativeInt,\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (blocked: string) {\n const opts = (this as Command).opts() as {\n by: string | string[];\n workstream?: string;\n json?: boolean;\n if?: number;\n };\n return handle((db) => cmdTaskUnblock(db, blocked, opts), this as Command)();\n });\n\n task\n .command(\"delete <id>\")\n .description(\n \"Delete a task (cascades edges + notes via FK). Two-phase: bare = dry-run preview with `rev`; --if <rev> commits (refused if the task changed since); --yes commits unfenced. Idempotent on missing.\",\n )\n .option(\"-y, --yes\", \"actually delete (without --yes prints a dry-run preview)\")\n .option(\n \"--if <rev>\",\n \"apply only if the task is still at this revision (from `mu task show --json` .task.revision or a preview); stale refuses with exit 4\",\n parseNonNegativeInt,\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n workstream?: string;\n json?: boolean;\n yes?: boolean;\n if?: number;\n };\n return handle((db) => cmdTaskDelete(db, id, opts), this as Command)();\n });\n\n task\n .command(\"update <id>\")\n .description(\n \"Update scalar fields on a task. Pass at least one of --title, --impact, --effort-days. Use close/open/release for status/owner changes.\",\n )\n .option(\"-t, --title <title>\", \"new title\")\n .option(\"-i, --impact <n>\", \"new impact 1..100\", parseImpact)\n .option(\"-e, --effort-days <days>\", \"new effort in days (>0)\", parsePositiveNumber)\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n title?: string;\n impact?: number;\n effortDays?: number;\n workstream?: string;\n json?: boolean;\n };\n return handle((db) => cmdTaskUpdate(db, id, opts), this as Command)();\n });\n\n task\n .command(\"reparent <id>\")\n .description(\n \"Atomically replace every incoming edge of <id> with the new --blocked-by list. Pass --blocked-by '' to clear all blockers.\",\n )\n .requiredOption(\n \"-b, --blocked-by <ids...>\",\n \"tasks that block <id> (repeat or comma-separate; or both; pass an empty string to clear)\",\n )\n .option(\n \"--if <rev>\",\n \"apply only if the task is still at this revision (from `mu task show --json` .task.revision or a preview); stale refuses with exit 4\",\n parseNonNegativeInt,\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (id: string) {\n const opts = (this as Command).opts() as {\n blockedBy: string[];\n workstream?: string;\n json?: boolean;\n if?: number;\n };\n return handle((db) => cmdTaskReparent(db, id, opts), this as Command)();\n });\n\n task\n .command(\"wait <ids...>\")\n .description(\n \"Alias of `mu wait` over task refs: the FIRST task to reach --status (default CLOSED), or every one with --all. Same JSON result and exits. Ids: bare with -w, or <ws>/<id>. Task AND agent refs: `mu wait task:<id> agent:<name>`.\",\n )\n .option(\n \"--status <status>\",\n `target status (${TASK_STATUS_LIST}, case-insensitive); default CLOSED`,\n )\n .option(\"--first\", \"end on the first event (the default)\")\n .option(\"--any\", \"alias for --first\")\n .option(\"--first-of\", \"alias for --first\")\n .option(\n \"--all\",\n \"end when every listed task reached the target (an owner dying or stalling still ends it early)\",\n )\n .option(\"--all-of\", \"alias for --all\")\n .option(\n \"--timeout <seconds>\",\n \"heartbeat deadline, fractions allowed (default 1500, which is also the cap; 0 = the cap)\",\n parseSeconds,\n )\n .option(\n \"--stuck-after <seconds>\",\n \"report an owner stalled after this long in needs_input (0 = never; default 120, or 5 for a pi owner read over its control socket); a stall is an event with exit 7\",\n parseSeconds,\n )\n .option(\n \"--on-stall <action>\",\n \"exit (default): a stall ends the wait; warn: flag it and keep waiting; steer: send the stalled owner one fixed reminder and keep waiting; release: free the stalled task and end the wait\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (ids: string[]) {\n const opts = (this as Command).opts() as {\n status?: string;\n any?: boolean;\n first?: boolean;\n firstOf?: boolean;\n all?: boolean;\n allOf?: boolean;\n timeout?: number;\n stuckAfter?: number;\n onStall?: string;\n workstream?: string;\n json?: boolean;\n };\n const sig = installWaitSignals();\n return handle((db) => cmdTaskWait(db, ids, opts, sig), this as Command)().finally(() =>\n sig.dispose(),\n );\n });\n}\n","// The dashboard's ONE teardown path. `withShutdown` creates it and installs the\n// process hooks BEFORE anything that can throw (the lazy ink import, the RO\n// open, render), so every exit funnels through the same idempotent `run()`:\n// SIGINT/SIGTERM/SIGHUP, an uncaught error, Ink's own exit and a boot error.\n//\n// Steps run in registration order (stop render, drain refresh + close the RO\n// connection, ...), then the final sync flush ALWAYS runs last on the writable\n// connection, even when no step was ever registered (boot failed early). The\n// flush is quiet: a stderr write would paint over the alternate screen.\n\nimport type { Db } from \"../db.js\";\nimport { ambientFlush, syncEnabled } from \"../sync.js\";\n\nexport interface Shutdown {\n /** Register a teardown step. Errors in a step never stop later steps or the flush. */\n add(step: () => void | Promise<void>): void;\n /** Run teardown once; later and concurrent calls share the first run. */\n run(): Promise<void>;\n}\n\nconst SIGNALS = [\n [\"SIGINT\", 130],\n [\"SIGTERM\", 143],\n [\"SIGHUP\", 129],\n] as const;\n\nexport function createShutdown(syncDb: Db): Shutdown {\n const steps: Array<() => void | Promise<void>> = [];\n let done: Promise<void> | null = null;\n return {\n add: (step) => void steps.push(step),\n run() {\n done ??= (async () => {\n for (const step of steps) {\n try {\n await step();\n } catch {}\n }\n if (syncEnabled()) await ambientFlush(syncDb, { quiet: true });\n })();\n return done;\n },\n };\n}\n\n/**\n * Run `body` with the shutdown and the process hooks in place; whatever way it\n * ends (return, throw, signal, uncaught error) teardown has run by then.\n */\nexport async function withShutdown(\n syncDb: Db,\n body: (shutdown: Shutdown) => Promise<void>,\n exit: (code: number) => unknown = (code) => process.exit(code),\n): Promise<void> {\n const shutdown = createShutdown(syncDb);\n const hooks: Array<[NodeJS.Signals | \"uncaughtException\", (...args: unknown[]) => void]> =\n SIGNALS.map(([sig, code]) => [sig, () => void shutdown.run().finally(() => exit(code))]);\n hooks.push([\n \"uncaughtException\",\n (err: unknown) =>\n void shutdown.run().finally(() => {\n console.error(err instanceof Error ? (err.stack ?? err.message) : String(err));\n exit(1);\n }),\n ]);\n for (const [event, fn] of hooks) process.on(event, fn);\n try {\n await body(shutdown);\n } finally {\n try {\n await shutdown.run();\n } finally {\n for (const [event, fn] of hooks) process.off(event, fn);\n }\n }\n}\n","// Bare `mu`: open the dashboard on a TTY, print help everywhere else.\n//\n// The dashboard is for a human at a terminal. A pipe, `--json`, a script or CI\n// get the same help as before, so nothing that parsed `mu` output changes.\n// The UI (ink, react) is a lazy import, paid only here.\n\nimport type { Command } from \"commander\";\nimport { defaultDbPath } from \"../db.js\";\nimport { isJsonMode } from \"../output.js\";\nimport { withShutdown } from \"./dashboard-shutdown.js\";\nimport { handle } from \"./handle.js\";\n\n/** Both ends a TTY and not `--json`. */\nexport function dashboardLaunchable(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true && !isJsonMode();\n}\n\n/** The root command's action: dashboard when launchable, else help. */\nexport function openDashboardOrHelp(program: Command): () => Promise<void> {\n // `handle` does the guards (DB inside MU_SYNC_DIR, sync/v1 dir), opens the\n // writable connection and maps typed errors. Ambient sync is the dashboard's\n // own (quiet, bounded, see tui/runtime.ts), so the generic hook is off and\n // `withShutdown` owns the final flush for every way out, from before the lazy\n // import on (a failing import or RO open still publishes this machine's ops).\n const run = handle(\n (syncDb) =>\n withShutdown(syncDb, async (shutdown) => {\n // React's development build costs ~10x per render (measured: ~4% of a core idle\n // with a ticking tool clock); the dashboard runs the production one unless the\n // caller chose otherwise. Set before the lazy import: react reads it at load.\n const key = \"NODE_ENV\";\n process.env[key] ??= \"production\";\n const { runDashboard } = await import(\"./tui/index.js\");\n const first = (program.opts() as { workstream?: string[] }).workstream?.[0];\n await runDashboard({ dbPath: defaultDbPath(), syncDb, shutdown, initialWorkstream: first });\n }),\n program,\n { ambientSync: false },\n );\n return async () => {\n if (dashboardLaunchable()) await run();\n else program.outputHelp();\n };\n}\n","// mu — `mu db backup | compact | forget`: whole-DB file commands.\n//\n// mu once had `mu db export / import / replay` — a whole-DB sync\n// mechanism with manifests, per-workstream drift detection, and\n// divergence sidecars (1500+ LOC). All three are gone: sync is ambient over\n// segments, and disaster recovery is `mu rebuild`.\n//\n// `backup` survives for the one case those verbs were actually used for\n// — \"give me one file I can scp\" — which SQLite already implements as a\n// single `VACUUM INTO`, so it has no SDK module. A backup file is a\n// convenience copy that starts going stale the moment it is written.\n//\n// `compact` and `forget` shrink mu.db. Their policy lives in the SDK\n// (src/compact.ts); this file adds the dry run, the backup beside the\n// DB, the VACUUM, and the drift check after.\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { emitJson, handle, JSON_OPT } from \"../cli.js\";\nimport {\n compact,\n type ForgetPlan,\n forget,\n listForgetCandidates,\n planCompact,\n planForget,\n} from \"../compact.js\";\nimport type { Db } from \"../db.js\";\nimport { formatBytes } from \"../disk-recon.js\";\nimport { checkDrift, DriftDetectedError } from \"../drift.js\";\nimport { isJsonMode, muTable, pc } from \"../output.js\";\nimport { BackupTargetExistsError, UsageError } from \"./handle.js\";\n\nexport function cmdDbBackup(db: Db, file: string, opts: { json?: boolean } = {}): void {\n const target = resolve(file);\n // VACUUM INTO refuses an existing target itself, but its error is a\n // raw SQLite string; a typed UsageError gets the operator an exit code\n // and a next step instead.\n if (existsSync(target)) {\n throw new BackupTargetExistsError(target);\n }\n mkdirSync(dirname(target), { recursive: true });\n db.prepare(\"VACUUM INTO ?\").run(target);\n\n if (opts.json === true) {\n emitJson({ path: target });\n return;\n }\n console.log(`Backed up to ${pc.bold(target)}`);\n console.log(pc.dim(` inspect it without touching the live DB: MU_DB_PATH=${target} mu state`));\n}\n\n/** Backup next to the DB, named so it sorts with it: `mu.db.pre-<verb>-<ts>`. */\nexport function backupBeside(db: Db, verb: string): string {\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const target = `${db.name}.pre-${verb}-${ts}`;\n db.prepare(\"VACUUM INTO ?\").run(target);\n return target;\n}\n\n/** Reclaim the freed pages, then prove the log still explains the tables. */\nexport function vacuumAndCheck(\n db: Db,\n backup: string,\n): { before: number; after: number; checkpointed: boolean } {\n // Sizes are the logical DB (page_count × page_size, read through the\n // WAL), not statSync(db.name): in WAL mode VACUUM's rewritten pages sit\n // in -wal until a checkpoint, and a concurrent reader can make that\n // checkpoint return busy, leaving the main file at its old size.\n const before = dbBytes(db);\n db.exec(\"VACUUM\");\n // Shrink the main file now when no reader pins the WAL; otherwise the\n // next checkpoint (any later mu write) does it.\n const [cp] = db.pragma(\"wal_checkpoint(TRUNCATE)\") as { busy: number }[];\n const checkpointed = cp?.busy === 0;\n const after = dbBytes(db);\n const report = checkDrift(db);\n if (!report.clean) {\n // Under --json the thrown DriftDetectedError is the one document.\n if (!isJsonMode()) {\n console.error(\n pc.red(`drift after the rewrite (${report.totalDrift}); the backup is ${backup}`),\n );\n }\n throw new DriftDetectedError(report.totalDrift, report.records);\n }\n return { before, after, checkpointed };\n}\n\nfunction dbBytes(db: Db): number {\n const pages = db.pragma(\"page_count\", { simple: true }) as number;\n const pageSize = db.pragma(\"page_size\", { simple: true }) as number;\n return pages * pageSize;\n}\n\nexport const CHECKPOINT_PENDING =\n \"another connection is reading the DB; the file shrinks on its next checkpoint\";\n\nexport function cmdDbCompact(db: Db, opts: { yes?: boolean; json?: boolean } = {}): void {\n const plan = planCompact(db);\n if (opts.yes !== true || plan.tombstones === 0) {\n if (opts.json === true) {\n emitJson({ dryRun: true, ...plan });\n return;\n }\n console.log(\n plan.tombstones === 0\n ? pc.dim(\"nothing to compact: no redundant note tombstones\")\n : `${plan.tombstones} note tombstones repeat a put already in the log (${formatBytes(plan.bytes)}). Dry run; nothing changed (--yes applies).`,\n );\n return;\n }\n const backup = backupBeside(db, \"compact\");\n compact(db);\n const size = vacuumAndCheck(db, backup);\n if (opts.json === true) {\n emitJson({ dryRun: false, ...plan, backup, ...size });\n return;\n }\n console.log(\n `Compacted ${plan.tombstones} note tombstones: ${formatBytes(size.before)} → ${formatBytes(size.after)}. Drift check clean.`,\n );\n if (!size.checkpointed) console.log(pc.dim(CHECKPOINT_PENDING));\n console.log(pc.dim(`backup: ${backup}`));\n}\n\nfunction printForgetTable(plan: ForgetPlan): void {\n const t = muTable({ head: [\"workstream\", \"torn down\", \"ops\", \"size\"].map((h) => pc.bold(h)) });\n for (const c of plan.candidates)\n t.push([c.name, c.tornDownAt.slice(0, 10), String(c.ops), formatBytes(c.bytes)]);\n console.log(t.toString());\n}\n\nexport function cmdDbForget(\n db: Db,\n names: string[],\n opts: { yes?: boolean; json?: boolean } = {},\n): void {\n const plan = planForget(db, names);\n if (plan.refused.length > 0) {\n const why = plan.refused\n .map((r) => `${r.name} (${r.why === \"live\" ? \"is live\" : \"was never torn down\"})`)\n .join(\", \");\n throw new UsageError(`cannot forget: ${why}. Only torn-down workstreams can be forgotten.`, {\n showHelp: false,\n });\n }\n const ops = plan.candidates.reduce((n, c) => n + c.ops, 0);\n const bytes = plan.candidates.reduce((n, c) => n + c.bytes, 0);\n if (opts.yes !== true) {\n if (opts.json === true) {\n emitJson({ dryRun: true, candidates: plan.candidates, ops, bytes });\n return;\n }\n printForgetTable(plan);\n console.log(\n `${ops} ops (${formatBytes(bytes)} of payload). Forgetting deletes their history. Dry run; nothing changed (--yes applies; irreversible).`,\n );\n return;\n }\n const backup = backupBeside(db, \"forget\");\n const r = forget(db, plan);\n const size = vacuumAndCheck(db, backup);\n if (opts.json === true) {\n emitJson({\n dryRun: false,\n forgotten: plan.candidates.map((c) => c.name),\n ops: r.ops,\n backup,\n ...size,\n });\n return;\n }\n console.log(\n `Forgot ${plan.candidates.length} workstream(s), ${r.ops} ops: ${formatBytes(size.before)} → ${formatBytes(size.after)}. Drift check clean.`,\n );\n if (!size.checkpointed) console.log(pc.dim(CHECKPOINT_PENDING));\n console.log(pc.dim(`backup (the only way back): ${backup}`));\n}\n\n/** Doctor's hint: the largest forgettable workstreams, or undefined when\n * they are too small to be worth a line. */\nexport function forgetHint(\n db: Db,\n): { total: number; ops: number; bytes: number; top: string[] } | undefined {\n const all = listForgetCandidates(db);\n const bytes = all.reduce((n, c) => n + c.bytes, 0);\n if (bytes < FORGET_HINT_MIN_BYTES) return undefined;\n return {\n total: all.length,\n ops: all.reduce((n, c) => n + c.ops, 0),\n bytes,\n top: all.slice(0, 3).map((c) => c.name),\n };\n}\n\n/** Below this much torn-down history, doctor says nothing. */\nconst FORGET_HINT_MIN_BYTES = 5 * 1024 * 1024;\n\nexport function wireDbCommands(program: Command): void {\n const dbCmd = program.command(\"db\").description(\"Whole-DB file commands\");\n dbCmd\n .command(\"backup <file>\")\n .description(\n \"VACUUM INTO copy of the whole DB — the 'one file I can scp' convenience. Never overwrites. Real disaster recovery is `mu rebuild`.\",\n )\n .option(...JSON_OPT)\n .action(function (file: string) {\n const opts = (this as Command).opts() as { json?: boolean };\n return handle(async (db) => cmdDbBackup(db, file, opts), this as Command)();\n });\n dbCmd\n .command(\"compact\")\n .description(\n \"Shrink mu.db: blank note tombstones that repeat a put already in the log, then VACUUM. Dry run without --yes; --yes backs up beside the DB first and runs the drift check after. Local only; sync segments are untouched.\",\n )\n .option(\"--yes\", \"apply (default: dry run)\")\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).opts() as { yes?: boolean; json?: boolean };\n return handle(async (db) => cmdDbCompact(db, opts), this as Command)();\n });\n dbCmd\n .command(\"forget <workstreams...>\")\n .description(\n \"Delete every op of torn-down workstreams to shrink mu.db. Irreversible. Dry run without --yes; --yes backs up beside the DB first, VACUUMs, and runs the drift check. List candidates: mu workstream list --torn-down.\",\n )\n .option(\"--yes\", \"apply (default: dry run)\")\n .option(...JSON_OPT)\n .action(function (names: string[]) {\n const opts = (this as Command).opts() as { yes?: boolean; json?: boolean };\n return handle(async (db) => cmdDbForget(db, names, opts), this as Command)();\n });\n}\n","// mu — disk↔DB reconciliation for `mu doctor`.\n//\n// Every other check in doctor reads the DB. These read the STATE DIR, and\n// then compare the two, because the two can disagree in both directions\n// and nothing surfaced either one:\n//\n// disk has, DB doesn't -> empty parent / residue\n// DB has, disk doesn't -> a `worktrees` row pointing at nothing\n//\n// The second direction had NO surface at all before this module: the\n// registry row reads as a healthy worktree, and a spawn that reuses the\n// name trips over it rather than at the row that lied.\n//\n// REPORT ONLY, on purpose. Each finding names its own cleanup command in\n// the remediation block and mu runs none of them: an operator or an agent\n// reading doctor's output decides. A diagnostic verb that deletes 300MB\n// of checkouts because a readdir raced a spawn is a worse bug than the\n// residue it removes.\n//\n// TIERED like the drift check. The default tier is readdir + stat, depth\n// 2 (measured ~1ms on a 5-workstream / 5196-file state dir). Recursive\n// byte accounting is `--disk` only: its cost scales with the checkout,\n// not with mu's own state, so it must not ride a reflexively-run command.\n\nimport { readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { deadStagings } from \"./agents/staging.js\";\nimport { type Db, defaultDbPath, defaultStateDir } from \"./db.js\";\nimport type { FleetHazard } from \"./fleet-hazards.js\";\nimport { listWorktrees, worktreesRoot } from \"./worktree.js\";\n\n/** A held lock dir older than this is presumed abandoned. Mirrors\n * `DEFAULT_STALE_LOCK_MS` in src/file-lock.ts — that value governs\n * whether a lock is STOLEN when contended, this one whether it is\n * REPORTED when nobody is contending it, and a lock nobody contends is\n * never stolen. Deliberately much larger: a lock 30s old is routine\n * mid-spawn, whereas one an hour old outlived its process. */\nexport const STALE_LOCK_REPORT_MS = 60 * 60 * 1000;\n\n/** Human-readable byte count. Doctor rows are narrow, so no decimals\n * above the MB mark. */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)}K`;\n if (bytes < 1024 * 1024 * 1024) return `${Math.round(bytes / 1024 / 1024)}M`;\n return `${(bytes / 1024 / 1024 / 1024).toFixed(1)}G`;\n}\n\n/** Best-effort `readdir`: an unreadable or absent dir reads as empty, so\n * a fresh install with no state dir yet reports \"ok\" rather than\n * throwing out of a diagnostic. */\nfunction dirNames(path: string): string[] {\n try {\n return readdirSync(path, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name);\n } catch {\n return [];\n }\n}\n\nfunction exists(path: string): boolean {\n try {\n statSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction sizeOf(path: string): number {\n try {\n return statSync(path).size;\n } catch {\n return 0;\n }\n}\n\n// ─── DB → disk: rows pointing at nothing ──────────────────────────────\n\nexport interface MissingWorktreeDir {\n agentName: string;\n workstreamName: string;\n path: string;\n}\n\n/**\n * `worktrees` rows whose `path` is not on disk.\n *\n * A row pointing at a deleted directory reads as a healthy worktree. The\n * usual cause is a hand-run `rm -rf` (or a `git worktree remove`) on a\n * path that `mu agent close` would have unregistered.\n */\nexport function findMissingWorktreeDirs(db: Db): MissingWorktreeDir[] {\n return listWorktrees(db)\n .filter((row) => !exists(row.path))\n .map((row) => ({\n agentName: row.agent,\n workstreamName: row.workstream,\n path: row.path,\n }));\n}\n\nexport function checkMissingWorktreeDirs(db: Db): FleetHazard {\n const missing = findMissingWorktreeDirs(db);\n if (missing.length === 0) {\n return { name: \"ws-rows\", severity: \"ok\", detail: \"every worktree row has its dir\" };\n }\n return {\n name: \"ws-rows\",\n severity: \"warn\",\n detail: `${missing.length} worktree row(s) point at a path that is gone`,\n remediation: [\n \"These worktrees rows name a directory that no longer exists:\",\n ...missing.map((m) => ` ${m.workstreamName}/${m.agentName} ${m.path}`),\n \"\",\n \"A reused agent name trips over such a row. `agent close` finds the dir\",\n \"gone, prunes git's registration and forgets the row:\",\n ...missing.map((m) => ` mu agent close ${m.agentName} -w ${m.workstreamName}`),\n ],\n };\n}\n\n/** Placeholder rows of `--worktree` spawns that died before their pane (SIGKILL, crash). */\nexport function checkDeadStagings(db: Db): FleetHazard {\n const dead = deadStagings(db);\n if (dead.length === 0)\n return { name: \"ws-staging\", severity: \"ok\", detail: \"no dead spawn stagings\" };\n return {\n name: \"ws-staging\",\n severity: \"warn\",\n detail: `${dead.length} --worktree spawn(s) died before their pane`,\n remediation: [\n \"A placeholder row (and maybe a half-made worktree) no pane ever ran in:\",\n ...dead.map((a) => ` ${a.workstreamName}/${a.name} ${a.cwd ?? \"\"}`),\n \"The next `mu agent spawn` in that workstream removes them.\",\n ],\n };\n}\n\n/**\n * `<state-dir>/worktrees/<workstream>/` dirs with no children.\n *\n * Left behind when the last worktree of a workstream is closed (close\n * removes the agent dir and its row, not the per-workstream parent).\n * Harmless — it is `severity: \"ok\"` for that reason — but reported because\n * it is the cheapest possible signal that a workstream is done with its\n * worktrees, and because an operator counting directories to work out\n * what mu still holds should not have to open each one.\n */\nexport function checkEmptyWorkstreamDirs(): FleetHazard {\n const root = worktreesRoot();\n const empty = dirNames(root).filter((name) => dirNames(join(root, name)).length === 0);\n if (empty.length === 0) {\n return { name: \"ws-empty\", severity: \"ok\", detail: \"no empty workstream dirs\" };\n }\n return {\n name: \"ws-empty\",\n severity: \"ok\",\n detail: `${empty.length} empty workstream dir(s): ${empty.slice(0, 4).join(\", \")}`,\n remediation: [\n \"These per-workstream worktree dirs hold no worktrees:\",\n ...empty.map((name) => ` ${join(root, name)}`),\n \"\",\n \"Closing an agent removes its dir and its row but not the parent,\",\n \"so this is normal residue rather than a fault. Remove if you want the\",\n \"state dir to read cleanly:\",\n ...empty.slice(0, 3).map((name) => ` rmdir ${join(root, name)}`),\n ],\n };\n}\n\n// ─── residue: files no DB row references ──────────────────────────────\n\nexport interface StrayFile {\n name: string;\n path: string;\n bytes: number;\n}\n\n/**\n * `mu.db.*` files in the state dir that are not the live WAL triple.\n *\n * Hand-made copies (`mu.db.old`), pre-bump saves (`mu.db.v9-<stamp>`),\n * the safety backups `mu db compact` / `mu db forget` / `mu delegates prune` write beside the\n * DB (`mu.db.pre-<verb>-<stamp>`, src/cli/db.ts) and abandoned `-wal` /\n * `-shm` sidecars. Nothing in mu reads them and nothing prunes them, and\n * they are the largest single category of dead bytes in a long-lived\n * state dir — 50MB on the box this check was written against.\n *\n * The live triple is excluded by exact name, so a `MU_DB_PATH` pointing\n * elsewhere simply reports the default-path copies it finds, which is\n * the honest answer.\n */\nexport function findStrayDbFiles(stateDir: string = defaultStateDir()): StrayFile[] {\n const live = new Set([\"mu.db\", \"mu.db-wal\", \"mu.db-shm\"]);\n let entries: string[];\n try {\n entries = readdirSync(stateDir, { withFileTypes: true })\n .filter((e) => e.isFile())\n .map((e) => e.name);\n } catch {\n return [];\n }\n return entries\n .filter((name) => name.startsWith(\"mu.db\") && !live.has(name))\n .map((name) => ({ name, path: join(stateDir, name), bytes: sizeOf(join(stateDir, name)) }))\n .sort((a, b) => b.bytes - a.bytes);\n}\n\nexport function checkStrayDbFiles(): FleetHazard {\n const stateDir = defaultStateDir();\n const stray = findStrayDbFiles(stateDir);\n if (stray.length === 0) {\n return { name: \"db-copies\", severity: \"ok\", detail: \"no stray DB copies\" };\n }\n const total = stray.reduce((n, f) => n + f.bytes, 0);\n return {\n name: \"db-copies\",\n severity: \"warn\",\n detail: `${stray.length} stray DB file(s), ${formatBytes(total)} — nothing reads these`,\n remediation: [\n `Files matching mu.db* in ${stateDir} that are not the live WAL triple:`,\n ...stray.map((f) => ` ${formatBytes(f.bytes).padStart(6)} ${f.name}`),\n \"\",\n `Live DB: ${defaultDbPath()}`,\n \"\",\n \"These are hand-made copies, pre-upgrade saves, and the backups\",\n \"`mu db compact` / `mu db forget` / `mu delegates prune` write first (mu.db.pre-<verb>-<time>).\",\n \"No mu code path reads them and none prunes them. Keep a pre-forget\",\n \"backup until you are sure: it is the only way back from a forget.\",\n \"Otherwise disaster recovery is the ops log, so a copy is a convenience:\",\n \" mu rebuild <file> # DR from the ops log, not from a copy\",\n \" mu db backup <file> # a fresh copy, if that is what you wanted\",\n ],\n };\n}\n\n/**\n * `<state-dir>/exports/` — residue of a verb that no longer exists.\n *\n * `mu workstream export` and its markdown bucket were deleted in 1.1.0.\n * The directory it wrote to was not, so every export any earlier version\n * ever made is still on disk with no surface in mu that names it. This\n * is the one finding here that is a defect rather than housekeeping:\n * mu removed the producer and left the output unreferenced.\n */\nexport function checkRemovedExportsDir(): FleetHazard {\n const root = join(defaultStateDir(), \"exports\");\n const entries = dirNames(root);\n if (entries.length === 0) {\n return { name: \"exports\", severity: \"ok\", detail: \"no leftover export dirs\" };\n }\n return {\n name: \"exports\",\n severity: \"warn\",\n detail: `${entries.length} export dir(s) from the removed \\`mu workstream export\\``,\n remediation: [\n `${root} holds ${entries.length} directory/ies.`,\n \"\",\n \"`mu workstream export` and its markdown bucket were removed in 1.1.0; this\",\n \"is output from a version that still had it. Nothing in mu reads or prunes\",\n \"it. Keep anything you still want, then:\",\n ` rm -rf ${root}`,\n ],\n };\n}\n\n/**\n * Lock dirs in `<state-dir>/locks/` older than STALE_LOCK_REPORT_MS.\n *\n * `withFileLock` steals a lock older than 30s, so a stale lock is not a\n * deadlock and this is not a `fail`. But it only steals when something\n * CONTENDS, and an uncontended lock dir survives forever — so an hour-old\n * lock is a crashed process's headstone, worth naming because it is\n * evidence of a spawn or flush that died mid-critical-section.\n */\nexport function checkStaleLocks(now: number = Date.now()): FleetHazard {\n const root = join(defaultStateDir(), \"locks\");\n const stale: { name: string; ageMs: number }[] = [];\n for (const name of dirNames(root)) {\n try {\n const ageMs = now - statSync(join(root, name)).mtimeMs;\n if (ageMs > STALE_LOCK_REPORT_MS) stale.push({ name, ageMs });\n } catch {\n // Vanished between readdir and stat: released, which is the\n // outcome we wanted anyway.\n }\n }\n if (stale.length === 0) {\n return { name: \"locks\", severity: \"ok\", detail: \"no stale lock dirs\" };\n }\n return {\n name: \"locks\",\n severity: \"warn\",\n detail: `${stale.length} lock dir(s) older than 1h`,\n remediation: [\n \"These advisory-lock dirs outlived the process that took them:\",\n ...stale.map((s) => ` ${s.name} (${Math.round(s.ageMs / 60000)}m old)`),\n \"\",\n \"Not a deadlock: withFileLock steals a lock older than 30s. But it only\",\n \"steals under contention, so these will sit here forever. They are evidence\",\n \"of a spawn or segment flush that died mid-critical-section.\",\n ` rm -rf ${root}/<name>`,\n ],\n };\n}\n\n// ─── --disk tier: recursive byte accounting ───────────────────────────\n\nexport interface WorktreeUsage {\n workstreamName: string;\n agentName: string;\n path: string;\n bytes: number;\n /** True iff no `worktrees` row references this path — the bytes\n * are reclaimable without closing anything mu still tracks. */\n orphan: boolean;\n}\n\n/** Recursive byte sum. Symlinks are skipped (0 bytes, never followed):\n * a Dirent for a symlink is neither a file nor a directory, so a\n * worktree symlinked into a huge tree does not report that tree's\n * bytes as mu's. */\nfunction walkBytes(path: string): number {\n let total = 0;\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = readdirSync(path, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const entry of entries) {\n const child = join(path, entry.name);\n if (entry.isDirectory()) total += walkBytes(child);\n else if (entry.isFile()) total += sizeOf(child);\n }\n return total;\n}\n\n/**\n * Per-worktree disk usage, `--disk` tier only.\n *\n * Cost scales with the size of the CHECKOUTS, not with mu's own state\n * (measured 0.25s / 574MB / 5196 files), which is why it is not in the\n * default tier: a monorepo worktree would make `mu doctor` slow enough\n * that people stop running it, and a diagnostic nobody runs reports\n * nothing.\n */\nexport function measureWorktreeUsage(db: Db): WorktreeUsage[] {\n const root = worktreesRoot();\n const registered = new Set(listWorktrees(db).map((w) => w.path));\n const usage: WorktreeUsage[] = [];\n for (const wsName of dirNames(root)) {\n const wsRoot = join(root, wsName);\n for (const agentName of dirNames(wsRoot)) {\n const path = join(wsRoot, agentName);\n usage.push({\n workstreamName: wsName,\n agentName,\n path,\n bytes: walkBytes(path),\n orphan: !registered.has(path),\n });\n }\n }\n return usage.sort((a, b) => b.bytes - a.bytes);\n}\n\n// ─── the aggregate ────────────────────────────────────────────────────\n\n/**\n * Every disk↔DB check, in display order: the two reconciliation\n * directions first (those are inconsistencies), then residue.\n *\n * Cheap enough for the default doctor: one readdir of the state dir,\n * a depth-2 readdir of `worktrees/`, one `stat` per worktree row and\n * per lock dir.\n */\nexport function checkDiskRecon(db: Db): FleetHazard[] {\n return [\n checkMissingWorktreeDirs(db),\n checkDeadStagings(db),\n checkEmptyWorkstreamDirs(),\n checkStrayDbFiles(),\n checkRemovedExportsDir(),\n checkStaleLocks(),\n ];\n}\n","// mu — `mu db query` (alias `mu sql`): the SQL escape hatch.\n//\n// Reads by default; a write needs `--write`. The single-statement path uses better-sqlite3's prepare()\n// so we can tell a read (.all() rows) from a write (.run() change count);\n// a script runs one statement at a time (runScript).\n//\n// Every write runs inside ONE op-context scope, which owns the\n// transaction (src/op-context.ts): one `sql.write` group, atomic, and\n// the context is never committed. The boundary is a POLICY, not a hunt for\n// tricks: this verb never changes the schema or the connection, so no TEMP\n// trigger, shadowing table, attached DB or PRAGMA can exist to subvert capture.\n//\n// * No DDL of any kind (CREATE/DROP/ALTER, TEMP included), no ATTACH or\n// DETACH, and only a read-only PRAGMA allowlist. Someone who needs DDL\n// uses `mu db backup` / `forget`, or opens the file with sqlite3.\n// * SQLite, never a keyword scan of the text, decides what a statement\n// does: one `EXPLAIN` per statement (checkStatement). better-sqlite3 has\n// no authorizer callback, so the listing is the authority. It names\n// transaction control (AutoCommit / Savepoint: refused, the scope owns the\n// transaction), ATTACH/DETACH (`sqlite_attach` / `sqlite_detach`\n// calls), DDL (any write to a sqlite_master root page, main or temp) and\n// every table a program writes, trigger bodies included: op_ctx /\n// op_dying / ops / schema_version / machine_identity / sync_peers are\n// refused unless a MAIN `_cap_*` trigger writes them. That is capture\n// working. Also refused: a statement's own write to sqlite_sequence, and\n// an UPDATE of id/rowid on the four guarded tables (a table-less `Delete`).\n// * The one place that reads text is the PRAGMA allowlist, because SQLite\n// applies a PRAGMA when it COMPILES it (`PRAGMA foreign_keys=OFF` flips\n// the connection before any .run()) and its listing does not name the\n// pragma. It reads only the statement's FIRST tokens (a keyword at the\n// start of a statement cannot be an identifier), before the compile.\n//\n// Opt-in: without `--write` a statement SQLite reports as not read-only\n// (`sqlite3_stmt_readonly`: INSERT, UPDATE, DELETE, REPLACE, `WITH ... INSERT`,\n// anything with RETURNING, ...) is refused before it runs, and the connection\n// runs with `query_only=ON` as a second wall. Both are SQLite's verdict, never a\n// keyword scan; the first word of the text only names the verb in the refusal.\n//\n// `--confirm-rows N` adds a safety belt on top: if the actual\n// affected-row count (FK cascades included) doesn't match N, the scope\n// throws and its ROLLBACK undoes the whole thing.\n//\n// `-w` (or a managed worker's injected workstream) installs TEMP views\n// `ready`, `blocked`, `blockers` for that workstream over the global ones\n// (installScopedViews, mu's own DDL); `main.ready` is still reachable.\n\nimport { spawn } from \"node:child_process\";\nimport type { Command } from \"commander\";\nimport {\n captureBookkeepingChanges,\n GUARD_ALREADY_OWNED,\n GUARD_HUGE_ID,\n GUARD_NEEDS_EVIDENCE,\n GUARD_NONPOSITIVE_ID,\n GUARD_OPEN_BLOCKERS,\n} from \"../capture.js\";\nimport { emitJson, handle, injectedWorkstream, parseLines } from \"../cli.js\";\nimport { type Db, defaultDbPath, resolveWorkstreamId } from \"../db.js\";\nimport { editDistance } from \"../edit-distance.js\";\nimport { currentOpContext, withOpContext } from \"../op-context.js\";\nimport { muTable, pc } from \"../output.js\";\nimport { RESULT_BYTES } from \"../output-contract.js\";\nimport { shellQuote, shellWord } from \"../shell-quote.js\";\nimport {\n CloseNeedsEvidenceError,\n TaskAlreadyOwnedError,\n TaskHasOpenBlockersError,\n} from \"../tasks.js\";\nimport { CliExitError, SqlColumnError, UsageError } from \"./handle.js\";\nimport { jsonDocument, pageRecords, type RecordPage } from \"./tasks/records.js\";\n\ntype Statement = ReturnType<Db[\"prepare\"]>;\n\nexport interface DbQueryOptions {\n /** JSON document (the default on the command line; `--table` turns it off). */\n json?: boolean;\n /** `--table`: the human table / prose instead of the JSON document. */\n table?: boolean;\n /** `--all`: every row whole, no 4 KB cap. */\n all?: boolean;\n confirmRows?: number;\n /** `--write`: allow statements that change data. Without it a write is refused. */\n write?: boolean;\n /** Scope `ready` / `blocked` / `blockers` to this workstream. Default: a\n * managed worker's own, else the global views. */\n workstream?: string;\n}\n\nexport async function cmdDbQuery(db: Db, query: string, opts: DbQueryOptions = {}): Promise<void> {\n try {\n const ws = opts.workstream ?? injectedWorkstream();\n if (ws !== undefined) installScopedViews(db, ws);\n await runQuery(db, query, opts);\n } catch (err) {\n throw teachColumnError(db, query, err);\n }\n}\n\nasync function runQuery(db: Db, query: string, opts: DbQueryOptions): Promise<void> {\n // ONE op context for the whole invocation. Without it every captured\n // row got its own random group and a null intent, so one multi-row\n // UPDATE showed up in `mu log` as N separate \"(no intent)\" actions\n // and printed the raw JSON payload. With it, the whole call is one\n // action, in one transaction.\n //\n // A plain read skips the scope: it would take the write lock (and\n // wait behind every writer) to stamp nothing.\n const trimmed = query.trim();\n const write = opts.write === true;\n let stmt: Statement | undefined;\n try {\n stmt = prepare(db, trimmed);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!/more than one statement/i.test(msg)) throw err;\n }\n if (!write || stmt?.readonly === true) {\n // No `--write`: nothing may change, so no scope; `query_only` backs up the refusal.\n withQueryOnly(db, write, () => runSql(db, trimmed, stmt, opts));\n return;\n }\n try {\n withOpContext(db, { intent: \"sql.write\", group: \"new\" }, () => runSql(db, trimmed, stmt, opts));\n } catch (err) {\n // The scope has rolled back by now. A local-write guard's RAISE (src/capture.ts)\n // becomes the same typed conflict (exit 4) the typed verbs throw.\n throw guardError(err);\n }\n}\n\n/** Run `fn` with the connection `query_only` unless `write` (SQLite then refuses any data change itself). */\nfunction withQueryOnly<T>(db: Db, write: boolean, fn: () => T): T {\n if (write) return fn();\n const before = db.pragma(\"query_only\", { simple: true });\n db.pragma(\"query_only = ON\");\n try {\n return fn();\n } finally {\n db.pragma(`query_only = ${before === 1 ? \"ON\" : \"OFF\"}`);\n }\n}\n\n/** Does the statement start with EXPLAIN? SQLite never runs an EXPLAIN's body (`stmt.readonly` says false for `EXPLAIN UPDATE`). */\nfunction isExplain(text: string): boolean {\n return tokenAt(skipLeadingTrivia(text), 0)?.text.toLowerCase() === \"explain\";\n}\n\n/** One line: the statement writes and `--write` was not given. The verb is the text's first word (for the message only; a `WITH` or other lead word is left out). */\nfunction refuseWrite(text: string): UsageError {\n const first = tokenAt(skipLeadingTrivia(text), 0)?.text.toUpperCase() ?? \"\";\n const verb = /^(INSERT|UPDATE|DELETE|REPLACE)$/.test(first) ? `${first} ` : \"\";\n return new UsageError(\n `mu sql reads by default: this ${verb}statement writes; add --write to run it`,\n { showHelp: false },\n );\n}\n\n/** The typed error for a guard's RAISE, matched by its exact message\n * (as `mapCloseGuard` in src/tasks/lifecycle.ts does); anything else unchanged. */\nfunction guardError(err: unknown): unknown {\n const msg = err instanceof Error ? err.message : \"\";\n if (msg === GUARD_NEEDS_EVIDENCE) return new CloseNeedsEvidenceError();\n if (msg === GUARD_OPEN_BLOCKERS) return new TaskHasOpenBlockersError();\n if (msg === GUARD_ALREADY_OWNED) return new TaskAlreadyOwnedError();\n if (msg === GUARD_NONPOSITIVE_ID) {\n return new UsageError(\n \"explicit non-positive ids are refused: omit the id and SQLite assigns one (rolled back)\",\n { showHelp: false },\n );\n }\n if (msg === GUARD_HUGE_ID) {\n return new UsageError(\n \"explicit ids above 2^53-1 are refused: omit the id and SQLite assigns one (rolled back)\",\n { showHelp: false },\n );\n }\n return err;\n}\n\n// ─── scoped views ─────────────────────────────────────────────────────\n\n/**\n * TEMP `ready`, `blocked` and `blockers` for workstream `ws`, shadowing\n * the global views on THIS connection only. SQLite views take no\n * parameters, so the resolved workstream id is a literal in the DDL; each\n * view keeps its global projection and its torn-down filtering because it\n * selects from `main.<view>`. No agent filter: ready and blocked tasks are\n * OPEN and so have no owner for it to match. Throws WorkstreamNotFoundError\n * (exit 3) for an unknown name.\n */\nexport function installScopedViews(db: Db, ws: string): void {\n db.exec(scopedViewsSql(resolveWorkstreamId(db, ws)));\n}\n\n/** The DDL `installScopedViews` runs; `mu db --shell` hands it to sqlite3. */\nexport function scopedViewsSql(wsId: number): string {\n const id = Math.trunc(wsId);\n if (!Number.isSafeInteger(id)) throw new Error(`not a workstream id: ${wsId}`);\n return `DROP VIEW IF EXISTS temp.ready;\nDROP VIEW IF EXISTS temp.blocked;\nDROP VIEW IF EXISTS temp.blockers;\nCREATE TEMP VIEW ready AS SELECT * FROM main.ready WHERE workstream_id = ${id};\nCREATE TEMP VIEW blocked AS SELECT * FROM main.blocked WHERE workstream_id = ${id};\nCREATE TEMP VIEW blockers AS SELECT * FROM main.blockers\n WHERE task_id IN (SELECT id FROM main.tasks WHERE workstream_id = ${id});`;\n}\n\n// ─── PRAGMA allowlist ─────────────────────────────────────────────────\n\n/** Read-only PRAGMAs that may take an argument: `PRAGMA table_info(tasks)`. */\nconst READ_PRAGMAS_WITH_ARG = new Set([\n \"table_info\",\n \"table_xinfo\",\n \"table_list\",\n \"index_list\",\n \"index_info\",\n \"index_xinfo\",\n \"foreign_key_list\",\n \"foreign_key_check\",\n \"integrity_check\",\n \"quick_check\",\n]);\n/** Read-only PRAGMAs that are only ever read bare: `PRAGMA user_version`\n * (`= 3` or `(3)` would write the file header). */\nconst READ_PRAGMAS_BARE = new Set([\n \"user_version\",\n \"foreign_keys\",\n \"busy_timeout\",\n \"database_list\",\n]);\n\ninterface Token {\n /** The word, or the unquoted text of a quoted name; the character for punctuation. */\n text: string;\n end: number;\n}\n\n/** The token at `from` (trivia already skipped), or undefined at the end. */\nfunction tokenAt(sql: string, from: number): Token | undefined {\n const c = sql[from];\n if (c === undefined) return undefined;\n if (c === \"'\" || c === '\"' || c === \"`\" || c === \"[\") {\n const closer = c === \"[\" ? \"]\" : c;\n let i = from + 1;\n let text = \"\";\n while (i < sql.length) {\n if (sql[i] === closer) {\n if (closer !== \"]\" && sql[i + 1] === closer) {\n text += closer;\n i += 2;\n continue;\n }\n break;\n }\n text += sql[i];\n i++;\n }\n return { text, end: i + 1 };\n }\n let i = from;\n while (i < sql.length && /[A-Za-z0-9_$\\u0080-\\uffff]/.test(sql[i] as string)) i++;\n return i === from ? { text: c, end: from + 1 } : { text: sql.slice(from, i), end: i };\n}\n\n/**\n * Refuse a PRAGMA that is not a read-only allowlisted one, BEFORE it is\n * compiled (compiling applies it). Looks only at the statement's first\n * tokens: an optional `EXPLAIN [QUERY PLAN]`, `PRAGMA`, `[schema.]name`, and\n * whether `=` or `(` follows. Any other statement is none of its business.\n */\nfunction guardPragma(sql: string): void {\n const word = (i: number): Token | undefined => tokenAt(sql, skipTrivia(sql, i, false));\n let tok = tokenAt(sql, skipTrivia(sql, 0, true));\n if (tok?.text.toLowerCase() === \"explain\") {\n tok = word(tok.end);\n if (tok?.text.toLowerCase() === \"query\") tok = word(word(tok.end)?.end ?? tok.end); // QUERY PLAN\n }\n if (tok?.text.toLowerCase() !== \"pragma\") return;\n let name = word(tok.end);\n let after = word(name?.end ?? tok.end);\n if (after?.text === \".\") {\n name = word(after.end);\n after = word(name?.end ?? after.end);\n }\n const lower = (name?.text ?? \"\").toLowerCase();\n const bare = after === undefined || after.text === \";\";\n const call = after?.text === \"(\";\n if (\n (bare && (READ_PRAGMAS_BARE.has(lower) || READ_PRAGMAS_WITH_ARG.has(lower))) ||\n (call && READ_PRAGMAS_WITH_ARG.has(lower))\n ) {\n return;\n }\n throw new UsageError(\n `mu db query allows only read-only PRAGMAs (${[...READ_PRAGMAS_WITH_ARG, ...READ_PRAGMAS_BARE].join(\", \")}), not PRAGMA ${name?.text ?? \"\"}; it never changes the connection or the file (use sqlite3 yourself for that)`,\n { showHelp: false },\n );\n}\n\n/** Compile `text`, after the PRAGMA allowlist. */\nfunction prepare(db: Db, text: string): Statement {\n guardPragma(text);\n return db.prepare(text);\n}\n\n// ─── what a statement does, from SQLite's own listing ─────────────────\n\nconst USER_TRANSACTION_MESSAGE = \"mu db query runs inside mu's transaction; remove BEGIN/COMMIT\";\nconst PROTECTED_TABLES = new Set([\n \"op_ctx\",\n \"op_dying\",\n \"ops\",\n \"schema_version\",\n \"machine_identity\",\n \"sync_peers\",\n]);\n/** AUTOINCREMENT counters. Protected only as a statement's own target (see firstProtectedWrite). */\nconst SEQUENCE_TABLE = \"sqlite_sequence\";\n/** Tables whose ids the capture INSERT guards check (src/capture.ts positiveIdGuard). */\nconst ID_GUARDED_TABLES = new Set([\"workstreams\", \"tasks\", \"task_notes\", \"task_edges\"]);\nconst ID_CHANGE = \"id change of \";\n\ninterface ExplainRow {\n opcode: string;\n p1: number;\n p2: number;\n p3: number;\n p4: string | null;\n p5: number;\n}\n\n/** Index past whitespace and comments from `i` (and `;` too when `semicolons`). */\nfunction skipTrivia(sql: string, from: number, semicolons: boolean): number {\n let i = from;\n while (i < sql.length) {\n const c = sql[i] as string;\n const next = sql[i + 1];\n if (/\\s/.test(c) || (semicolons && c === \";\")) i++;\n else if (c === \"-\" && next === \"-\") {\n while (i < sql.length && sql[i] !== \"\\n\") i++;\n } else if (c === \"/\" && next === \"*\") {\n const close = sql.indexOf(\"*/\", i + 2);\n i = close === -1 ? sql.length : close + 2;\n } else break;\n }\n return i;\n}\n\n/** Skip leading whitespace, `;` and comments: `prepare` accepts `; BEGIN` as one statement. */\nconst skipLeadingTrivia = (sql: string): string => sql.slice(skipTrivia(sql, 0, true));\n\n/**\n * Throw if `statement` (one compiled statement) is transaction control, DDL,\n * ATTACH/DETACH, or writes mu's bookkeeping; see the file header. Fails\n * CLOSED: if SQLite cannot list the statement, the error propagates. The one\n * exception is a statement that is itself EXPLAIN, which never runs its body.\n */\nexport function checkStatement(db: Db, statement: string): void {\n const text = skipLeadingTrivia(statement);\n let rows: ExplainRow[];\n try {\n rows = prepare(db, `EXPLAIN ${text}`).all([]) as ExplainRow[];\n } catch (err) {\n if (/^explain\\b/i.test(text)) return;\n throw err;\n }\n if (rows.some((r) => r.opcode === \"AutoCommit\" || r.opcode === \"Savepoint\")) {\n throw new UsageError(USER_TRANSACTION_MESSAGE, { showHelp: false });\n }\n if (rows.some((r) => r.opcode === \"Function\" && /^sqlite_(attach|detach)\\(/.test(r.p4 ?? \"\"))) {\n throw new UsageError(\n \"mu db query cannot ATTACH or DETACH a database: it works on this one only (open the file with sqlite3 yourself for that)\",\n { showHelp: false },\n );\n }\n const refused = firstProtectedWrite(db, rows);\n if (refused === SCHEMA) {\n throw new UsageError(\n \"mu db query cannot change the schema (no CREATE/DROP/ALTER, TEMP included): `mu db backup` first and edit a copy with sqlite3, or `mu db forget`\",\n { showHelp: false },\n );\n }\n if (refused?.startsWith(ID_CHANGE) === true) {\n throw new UsageError(\n `mu db query cannot change the id of ${refused.slice(ID_CHANGE.length)}: ids are set once at INSERT (omit the id there); to renumber, DELETE and INSERT a new row`,\n { showHelp: false },\n );\n }\n if (refused === \"sync_peers\") {\n throw new UsageError(\n \"mu db query cannot write sync_peers: those are sync watermarks, and a forged one skips peer ops for good (`mu sync --repair <peer>` re-reads a peer from the start)\",\n { showHelp: false },\n );\n }\n if (refused !== undefined) {\n throw new UsageError(\n `mu db query cannot write ${refused}: it is mu's capture bookkeeping (op_ctx, op_dying, ops, schema_version, machine_identity, sqlite_sequence)`,\n { showHelp: false },\n );\n }\n}\n\nconst SCHEMA = \"the schema\";\n\n/** The first protected thing the listing writes (a bookkeeping table's name, or SCHEMA), if any. */\nfunction firstProtectedWrite(db: Db, rows: readonly ExplainRow[]): string | undefined {\n const tableOfRoot = new Map<number, string>();\n for (const m of db\n .prepare(\"SELECT tbl_name, rootpage FROM main.sqlite_master WHERE rootpage > 0\")\n .all() as { tbl_name: string; rootpage: number }[]) {\n tableOfRoot.set(m.rootpage, m.tbl_name);\n }\n // A trigger program may write the bookkeeping only when it is a MAIN `_cap_*`\n // trigger. The policy allows no other trigger to exist; asking the main\n // schema (and not the temp one) keeps that true if one ever does.\n const capTriggers = new Set(\n (\n db\n .prepare(\n \"SELECT name FROM main.sqlite_master WHERE type = 'trigger' AND name LIKE '\\\\_cap\\\\_%' ESCAPE '\\\\'\",\n )\n .all() as { name: string }[]\n ).map((t) => t.name),\n );\n const tempTriggers = new Set(\n (\n db.prepare(\"SELECT name FROM temp.sqlite_master WHERE type = 'trigger'\").all() as {\n name: string;\n }[]\n ).map((t) => t.name),\n );\n let trusted = false; // the current program is a main capture trigger\n let mainProgram = true; // the statement's own program, not a trigger body\n let counterWrite: string | undefined; // reported last: DDL and bookkeeping win\n let sawWrite = false; // the main program already opened a write cursor\n const cursorTable = new Map<number, string>(); // main program: write cursor -> table\n for (const r of rows) {\n if (r.opcode === \"Init\") {\n const sub = r.p4 === null ? null : /^-- TRIGGER (.+)$/.exec(r.p4);\n mainProgram = sub === null;\n trusted =\n sub !== null && capTriggers.has(sub[1] as string) && !tempTriggers.has(sub[1] as string);\n continue;\n }\n // A rowid change is a Delete (no change count, no table name) of the row\n // and a re-Insert: the capture triggers only guard INSERT ids.\n if (r.opcode === \"Delete\" && mainProgram && r.p2 === 0 && r.p4 === null) {\n const table = cursorTable.get(r.p1);\n if (table !== undefined && ID_GUARDED_TABLES.has(table)) return ID_CHANGE + table;\n }\n // [root page, database index] a write opcode touches; main is database 0.\n let target: [number, number] | undefined;\n if (r.opcode === \"OpenWrite\") target = [r.p2, r.p3];\n else if (r.opcode === \"Clear\") target = [r.p1, r.p2];\n if (target === undefined) continue;\n const [root, dbIndex] = target;\n // Page 1 of ANY database is its sqlite_master: every CREATE/DROP/ALTER writes it.\n if (root === 1) return SCHEMA;\n if (dbIndex !== 0) continue;\n const name = tableOfRoot.get(root);\n if (name !== undefined && PROTECTED_TABLES.has(name) && !trusted) return name;\n // sqlite_sequence is also written by any AUTOINCREMENT insert, in the\n // main program, AFTER its own target. Only a statement whose FIRST write\n // is the counter table itself edits the counters.\n // (DDL on an AUTOINCREMENT table clears it first; report the schema write instead.)\n if (name === SEQUENCE_TABLE && mainProgram && !sawWrite) counterWrite = name;\n if (mainProgram) {\n sawWrite = true;\n // A table cursor's P4 is its column count; an index's is a key-info \"k(...)\".\n if (r.opcode === \"OpenWrite\" && name !== undefined && /^\\d+$/.test(r.p4 ?? \"\")) {\n cursorTable.set(r.p1, name);\n }\n }\n }\n return counterWrite;\n}\n\n// ─── the wrong-column hint ────────────────────────────────────────────\n\n/**\n * `no such column: x` becomes one line naming the columns of the tables the\n * query mentions, and the closest ones. SQL is never rewritten or retried.\n * Any other error comes back unchanged.\n */\nfunction teachColumnError(db: Db, query: string, err: unknown): unknown {\n const msg = err instanceof Error ? err.message : \"\";\n const m = /^no such column: (.+)$/.exec(msg);\n if (m === null) return err;\n const wanted = (m[1] as string).split(\".\").pop() as string;\n const tables = new Map<string, string[]>();\n try {\n const names = db\n .prepare(\n \"SELECT name FROM (SELECT name FROM main.sqlite_master WHERE type IN ('table','view') UNION SELECT name FROM temp.sqlite_master WHERE type = 'view') ORDER BY name\",\n )\n .all() as { name: string }[];\n const words = new Set(query.toLowerCase().match(/[a-z_][a-z0-9_]*/g) ?? []);\n for (const { name } of names) {\n if (!words.has(name.toLowerCase())) continue;\n const cols = db.prepare(\"SELECT name FROM pragma_table_info(?)\").all(name) as {\n name: string;\n }[];\n tables.set(\n name,\n cols.map((c) => c.name),\n );\n }\n } catch {\n return err;\n }\n const all = [...new Set([...tables.values()].flat())];\n const lower = wanted.toLowerCase();\n const near = all\n .filter((c) => {\n const cl = c.toLowerCase();\n return cl.includes(lower) || lower.includes(cl) || editDistance(cl, lower) <= 2;\n })\n .slice(0, 3);\n const mean = near.length > 0 ? ` (did you mean ${near.join(\", \")}?)` : \"\";\n const cols =\n tables.size === 0\n ? \"name a table to see its columns\"\n : [...tables].map(([t, cs]) => `${t}(${cs.join(\", \")})`).join(\"; \");\n return new SqlColumnError(`no such column: ${wanted}${mean}. columns: ${cols}`);\n}\n\n/**\n * Run a multi-statement script one statement at a time, checking each\n * with `checkStatement` just before it runs. SQLite, not the\n * text, decides where a statement ends: a `;` outside strings, quoted\n * identifiers and comments is only a CANDIDATE end, and \"incomplete\n * input\" from prepare() means the statement goes on (a `CREATE TRIGGER`\n * body, whose inner `;` and `END` are not statements of their own).\n * No keyword is ever inspected.\n *\n * Checking per statement, in the scope's transaction, is what makes a\n * refusal safe: statements compile against the schema the earlier ones\n * built (a trigger on a table the script just created), and a refusal\n * throws, so the scope ROLLs BACK everything that ran before it.\n */\nfunction runScript(db: Db, sql: string, write: boolean): void {\n let start = 0;\n const runOne = (text: string, stmt: Statement): void => {\n checkStatement(db, text);\n if (!write && !stmt.readonly && !isExplain(text)) throw refuseWrite(text);\n if (stmt.reader) stmt.all([]);\n else stmt.run([]);\n };\n for (const end of semicolonOffsets(sql)) {\n const text = sql.slice(start, end + 1);\n let stmt: Statement;\n try {\n stmt = prepare(db, text);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (/incomplete input/i.test(msg)) continue; // statement continues past this `;`\n if (/no statements/i.test(msg)) {\n start = end + 1;\n continue;\n }\n throw err;\n }\n runOne(text, stmt);\n start = end + 1;\n }\n const rest = sql.slice(start);\n try {\n runOne(rest, prepare(db, rest));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!/no statements/i.test(msg)) throw err;\n }\n}\n\n/** Offsets of every `;` that is not inside a string, quoted identifier or comment. */\nfunction semicolonOffsets(sql: string): number[] {\n const offsets: number[] = [];\n let i = 0;\n while (i < sql.length) {\n const c = sql[i] as string;\n const next = sql[i + 1];\n if (c === \"-\" && next === \"-\") {\n while (i < sql.length && sql[i] !== \"\\n\") i++;\n } else if (c === \"/\" && next === \"*\") {\n const close = sql.indexOf(\"*/\", i + 2);\n i = close === -1 ? sql.length : close + 2;\n } else if (c === \"'\" || c === '\"' || c === \"`\" || c === \"[\") {\n const closer = c === \"[\" ? \"]\" : c;\n i++;\n while (i < sql.length) {\n if (sql[i] === closer) {\n if (closer !== \"]\" && sql[i + 1] === closer) {\n i += 2; // doubled quote\n continue;\n }\n break;\n }\n i++;\n }\n i++;\n } else {\n if (c === \";\") offsets.push(i);\n i++;\n }\n }\n return offsets;\n}\n\nfunction runSql(db: Db, trimmed: string, stmt: Statement | undefined, opts: DbQueryOptions): void {\n // Read OR write — `mu sql` is the explicit escape hatch.\n //\n // Single-statement path uses better-sqlite3's prepare() so we can\n // distinguish read (.all() rows) from write (.run() change count).\n // Multi-statement path (runScript) runs semicolon-separated statements\n // one by one but returns nothing structured. We try prepare() first; if\n // it throws the 'more than one statement' SqliteError, we fall back.\n // This keeps the simple case fast and well-typed while making\n // multi-statement migrations / cleanup scripts a one-shot.\n // `cmdDbQuery` prepared the statement once;\n // undefined means \"more than one statement\".\n if (stmt === undefined) {\n if (opts.confirmRows !== undefined) {\n const expected = opts.confirmRows;\n const { actual } = runConfirmed(db, expected, () =>\n runScript(db, trimmed, opts.write === true),\n );\n const n = countTopLevelStatements(trimmed);\n if (opts.json) {\n emitJson({\n statements: n,\n multiStatement: true,\n confirmRows: expected,\n actualRows: actual,\n });\n return;\n }\n console.log(\n pc.dim(\n `ran ${n} statement${n === 1 ? \"\" : \"s\"} (${actual} row${actual === 1 ? \"\" : \"s\"} affected)`,\n ),\n );\n return;\n }\n runScript(db, trimmed, opts.write === true);\n const n = countTopLevelStatements(trimmed);\n if (opts.json) {\n emitJson({ statements: n, multiStatement: true });\n return;\n }\n console.log(pc.dim(`ran ${n} statement${n === 1 ? \"\" : \"s\"}`));\n return;\n }\n\n const single = stmt;\n checkStatement(db, trimmed);\n if (opts.write !== true && !single.readonly && !isExplain(trimmed)) throw refuseWrite(trimmed);\n // better-sqlite3's prepared-statement metadata is the source of truth;\n // prefix guesses miss PRAGMA reads and comment-prefixed SELECTs.\n // `readonly` (not `reader`) decides whether --confirm-rows applies:\n // `reader` is also true for `UPDATE ... RETURNING`, which IS a write.\n if (opts.confirmRows !== undefined) {\n if (single.readonly) {\n throw new UsageError(\n \"--confirm-rows is only meaningful on write statements (UPDATE / DELETE / INSERT / REPLACE)\",\n );\n }\n const expected = opts.confirmRows;\n const { result, actual } = runConfirmed(db, expected, () => single.run([]));\n if (opts.json) {\n emitJson({\n changes: result.changes,\n lastInsertRowid: Number(result.lastInsertRowid),\n confirmRows: expected,\n actualRows: actual,\n });\n return;\n }\n console.log(pc.dim(`${actual} row${actual === 1 ? \"\" : \"s\"} affected`));\n return;\n }\n if (single.reader) {\n const rows = single.all([]);\n if (opts.json) {\n // A read is paged to the result cap, with the way back. A write that\n // returns rows (UPDATE .. RETURNING) already ran and cannot be replayed\n // as a retrieval, so it prints every row, whole.\n const whole = opts.all === true || !single.readonly;\n emitJson(sqlRowsPayload(rows, whole, retrieveCommand(trimmed, opts)));\n return;\n }\n if (rows.length === 0) {\n console.log(pc.dim(\"(no rows)\"));\n return;\n }\n const first = rows[0] as Record<string, unknown>;\n const keys = Object.keys(first);\n // SQL is the escape hatch: every column is user-data of unknown\n // length. Divide the terminal width evenly across columns (subject\n // to a 12-char floor) so a single wide cell can't push the table\n // out to ~200 cols and break the TUI layout. cli-table3's\n // wordWrap:false (via muTable) truncates with … when a cell\n // exceeds its column width (tables_truncate_long_cols_audit).\n const termWidth = process.stdout.columns ?? 100;\n const padding = keys.length * 3 + 1; // 2-char cell padding + 1-char border per col\n const perCol = Math.max(12, Math.floor((termWidth - padding) / Math.max(1, keys.length)));\n const colWidths = keys.map(() => perCol);\n const table = muTable({\n head: keys.map((k) => pc.bold(k)),\n colWidths,\n style: { head: [] },\n });\n for (const row of rows) {\n const obj = row as Record<string, unknown>;\n table.push(keys.map((k) => formatCell(obj[k])));\n }\n console.log(table.toString());\n console.log(pc.dim(`(${rows.length} row${rows.length === 1 ? \"\" : \"s\"})`));\n return;\n }\n const result = single.run([]);\n if (opts.json) {\n emitJson({\n changes: result.changes,\n lastInsertRowid: Number(result.lastInsertRowid),\n });\n return;\n }\n console.log(pc.dim(`${result.changes} row${result.changes === 1 ? \"\" : \"s\"} affected`));\n}\n\n/**\n * The --confirm-rows run, shared by the single- and multi-statement\n * paths so the same statement always gets the same count. Runs `exec`\n * ONCE, with capture ON, inside the op-context scope's transaction; the\n * scope COMMITs only when the count of THAT execution equals `expected`;\n * otherwise this throws a UsageError and the scope ROLLs BACK. There is no measure-then-rerun: a nondeterministic or\n * state-dependent statement (`WHERE abs(random()) % 2 = 0`) could pick\n * different rows on a second run and commit a count nobody confirmed.\n *\n * The count is the total_changes() delta: every row the SQL changes,\n * INCLUDING rows removed by ON DELETE CASCADE (deleting a task also\n * deletes its edges and notes). That is the honest blast radius, and it\n * is the same number whether the statement runs alone or in a script.\n *\n * Capture bookkeeping is NOT counted. Each captured row change also runs\n * a capture trigger whose body is several statements (the op INSERT\n * plus the HLC clock UPDATEs), all of which total_changes() counts.\n * captureBookkeepingChanges() derives that overhead from the ops this\n * call's group wrote, and it is subtracted from the delta.\n */\nfunction runConfirmed<T>(db: Db, expected: number, exec: () => T): { result: T; actual: number } {\n const groupId = currentOpContext(db).groupId;\n const before = totalChanges(db);\n const result = exec();\n const delta = totalChanges(db) - before;\n const actual = groupId === null ? delta : delta - captureBookkeepingChanges(db, groupId);\n if (actual !== expected) {\n throw new UsageError(\n `expected ${expected} rows, would have affected ${actual} (rolled back). Re-run with --confirm-rows ${actual} if intentional.`,\n );\n }\n return { result, actual };\n}\n\nfunction totalChanges(db: Db): number {\n return (db.prepare(\"SELECT total_changes() AS n\").get() as { n: number }).n;\n}\n\n/**\n * Count top-level SQL statements in `sql`, ignoring semicolons inside\n * single-quoted strings, double-quoted identifiers, line comments\n * (`-- ...`), and block comments (`/* ... *\\/`). Used by `mu sql`'s\n * multi-statement path to report 'ran N statements'.\n *\n * Hand-rolled rather than pulling in a SQL parser — mu's escape hatch\n * is for human-typed scripts, not arbitrary SQL. The state machine\n * covers the cases we care about; pathological inputs (nested\n * comments, dollar-quoted strings, etc.) may miscount but won't crash\n * the verb (the script already ran successfully by then).\n */\nexport function countTopLevelStatements(sql: string): number {\n let count = 0;\n let inSingle = false;\n let inDouble = false;\n let inLineComment = false;\n let inBlockComment = false;\n let sawNonWs = false;\n for (let i = 0; i < sql.length; i++) {\n const c = sql[i];\n const next = sql[i + 1];\n if (inLineComment) {\n if (c === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (c === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n if (inSingle) {\n // SQL-style escaped single quote: '' inside a string\n if (c === \"'\" && next === \"'\") {\n i++;\n continue;\n }\n if (c === \"'\") inSingle = false;\n continue;\n }\n if (inDouble) {\n if (c === '\"' && next === '\"') {\n i++;\n continue;\n }\n if (c === '\"') inDouble = false;\n continue;\n }\n if (c === \"-\" && next === \"-\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (c === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n if (c === \"'\") {\n inSingle = true;\n continue;\n }\n if (c === '\"') {\n inDouble = true;\n continue;\n }\n if (c === \";\") {\n if (sawNonWs) {\n count++;\n sawNonWs = false;\n }\n continue;\n }\n if (c !== undefined && /\\S/.test(c)) sawNonWs = true;\n }\n if (sawNonWs) count++; // trailing statement without `;`\n return count;\n}\n\n/** The same read, uncapped: `mu db query '<sql>' [-w <effective ws>] --all`. */\nfunction retrieveCommand(query: string, opts: DbQueryOptions): string {\n const ws = opts.workstream ?? injectedWorkstream();\n const cmd = [\n \"mu db query\",\n shellQuote(query),\n ...(ws === undefined ? [] : [\"-w\", shellWord(ws)]),\n \"--all\",\n ].join(\" \");\n // A huge query would make the retrieval alone bust the result cap; the\n // caller has the text already, so say what to add instead of echoing it.\n return Buffer.byteLength(cmd) > RETRIEVE_MAX_BYTES ? \"re-run the same query with --all\" : cmd;\n}\n\n/** Longest retrieval command echoed back; past it the hint is generic. */\nconst RETRIEVE_MAX_BYTES = 1024;\n\n/**\n * `{items, count, more, retrieve?}`: the collection shape task lists ship, over\n * rows of any shape (row keys untouched). Cells are never cut: rows are taken\n * whole while the FINAL document (envelope included) fits RESULT_BYTES, so one\n * row bigger than that yields zero items, `more`, and the way back.\n */\nexport function sqlRowsPayload(\n rows: readonly unknown[],\n whole: boolean,\n retrieve: string,\n): { items: unknown[]; count: number; more: number; retrieve?: string } {\n const build = (page: RecordPage<unknown>): ReturnType<typeof sqlRowsPayload> => ({\n items: page.shown,\n count: page.shown.length,\n more: page.more,\n ...(page.more > 0 ? { retrieve } : {}),\n });\n const page = whole\n ? { shown: [...rows], more: 0 }\n : pageRecords(rows, (p) => Buffer.byteLength(jsonDocument(build(p))) + 1, RESULT_BYTES, 0);\n return build(page);\n}\n\nfunction formatCell(v: unknown): string {\n if (v === null || v === undefined) return pc.dim(\"null\");\n if (typeof v === \"string\") return v;\n return String(v);\n}\n\n// ─── read-only shell ──────────────────────────────────────────────────\n\n/**\n * `mu db --shell`: the sqlite3 CLI on this DB, READ-ONLY and `-safe`\n * (no `.shell`, `.system`, `.open`), with the same scoped TEMP views as a\n * query. It is its own connection, so it cannot inherit the views of the\n * in-process one: they are replayed as `-cmd`. Plain sqlite3 starts with\n * foreign_keys=0 and no capture context, which is why it never writes.\n */\nexport async function cmdDbShell(db: Db, opts: { workstream?: string } = {}): Promise<void> {\n const ws = opts.workstream ?? injectedWorkstream();\n const args = [\"-readonly\", \"-safe\"];\n if (ws !== undefined) args.push(\"-cmd\", scopedViewsSql(resolveWorkstreamId(db, ws)));\n args.push(defaultDbPath());\n const code = await new Promise<number>((resolve, reject) => {\n const child = spawn(\"sqlite3\", args, { stdio: \"inherit\" });\n child.once(\"error\", (err) =>\n reject(\n (err as NodeJS.ErrnoException).code === \"ENOENT\"\n ? new UsageError(\"sqlite3 is not on PATH: install the sqlite3 CLI (3.42 or newer)\", {\n showHelp: false,\n })\n : err,\n ),\n );\n child.once(\"close\", (c, signal) => resolve(c ?? (signal === null ? 1 : 128)));\n });\n if (code !== 0) throw new CliExitError(code);\n}\n\n// ─── commander wiring ────────────────────────────────────────────────\n//\n// wireDbQueryCommand is called by buildProgram() in src/cli.ts, after\n// wireDbCommands has made the `db` namespace. `mu sql` is the same action\n// under its old name (live hints and scripts name it).\n\nconst QUERY_HELP =\n \"Run SQL on the live DB. Reads by default; a write needs --write (one `sql.write` group).\\nRefused: BEGIN/COMMIT, DDL, ATTACH, bookkeeping writes. -w scopes views.\";\n\nfunction wireQuery(cmd: Command): void {\n cmd\n .argument(\"<query>\")\n .description(QUERY_HELP)\n // SQL line comments start with `--`; quoted queries like\n // `mu db query \"-- comment\\nSELECT 1\"` must bind that token as the\n // required <query> argument rather than as an unknown CLI option.\n .allowUnknownOption(true)\n .option(\n \"-w, --workstream <name>\",\n \"scope ready/blocked/blockers to this workstream (a spawned worker defaults to its own)\",\n )\n .option(\"--json\", \"JSON document (the default here; accepted for symmetry with other verbs)\")\n .option(\"--table\", \"print a human table / prose instead of the JSON document\")\n .option(\n \"--all\",\n \"no cap: every row, whole (a read over 4 KB says `more` and names this command)\",\n )\n .option(\"--write\", \"allow statements that change data (without it a write is refused)\")\n .option(\n \"--confirm-rows <n>\",\n \"with --write: abort if the affected-row count (ON DELETE CASCADE rows included) differs from N (rollback)\",\n parseLines,\n )\n .action(function (query: string) {\n const cmd = this as Command;\n const opts = cmd.opts() as DbQueryOptions;\n // JSON unless --table; an explicit --json wins (isJsonMode reads argv the same way).\n opts.json = opts.json === true || opts.table !== true;\n // `mu db -w a query ...`: the namespace's own -w is the same flag, in\n // another position. Honour it; two different names are a usage error.\n const outer =\n cmd.parent?.name() === \"db\"\n ? (cmd.parent.opts() as { workstream?: string }).workstream\n : undefined;\n if (outer !== undefined) {\n if (opts.workstream !== undefined && opts.workstream !== outer) {\n throw new UsageError(\n `-w/--workstream given twice (${outer} before the verb, ${opts.workstream} after); pass it once`,\n { showHelp: false },\n );\n }\n opts.workstream = outer;\n }\n // Ambient sync like every other verb: peer ops are ingested BEFORE\n // the query (so a read sees fresh state and nothing lands mid-query)\n // and this call's writes are flushed after, even when it throws.\n return handle((db) => cmdDbQuery(db, query, opts), this as Command)();\n });\n}\n\nexport function wireDbQueryCommand(program: Command): void {\n const dbCmd = program.commands.find((c) => c.name() === \"db\");\n if (dbCmd === undefined) throw new Error(\"wireDbQueryCommand: wire the db namespace first\");\n wireQuery(dbCmd.command(\"query\"));\n wireQuery(program.command(\"sql\"));\n // `db -w` belongs to `--shell` and `query`; any other subcommand takes none,\n // and commander would otherwise bind it to the namespace and drop it.\n dbCmd.hook(\"preAction\", (thisCmd, leaf) => {\n if (leaf === thisCmd || leaf.name() === \"query\") return;\n if (thisCmd.opts().workstream !== undefined) {\n throw new UsageError(`\\`db ${leaf.name()}\\` takes no -w/--workstream; drop it`, {\n showHelp: false,\n });\n }\n });\n dbCmd\n .option(\"--shell\", \"open the sqlite3 CLI on this DB, read-only\")\n .option(\n \"-w, --workstream <name>\",\n \"with --shell: scope ready/blocked/blockers to this workstream\",\n )\n .action(function () {\n const opts = (this as Command).opts() as { shell?: boolean; workstream?: string };\n if (opts.shell !== true) {\n throw new UsageError(\n \"mu db takes a subcommand (query, backup, compact, forget) or --shell\",\n );\n }\n return handle((db) => cmdDbShell(db, opts), this as Command)();\n });\n}\n","// mu — the mux-free delegate runner: one child `pi --mode rpc` for one delegate\n// call (docs/VOCABULARY.md § delegate call). No pane, no agents row, no daemon.\n//\n// `delegate_calls` and the call's task stay the authority; every state change\n// goes through the src/delegates.ts writers. This file adds the process:\n// identities derived from the call (agent name = the task id, ctl socket, log,\n// session dir) and a machine-local attempt receipt under\n// `<state dir>/delegate-process/<hash of call id>/`. The child is driven with\n// the existing ctl client, never a second command transport.\n//\n// The prompt is sent ONCE, with a stable msgId and the incarnation the\n// handshake saw. A failure before the send is a definite no: the child is\n// stopped, the receipt removed, the call `refused` (reissuable). Once the send\n// may have landed, an ambiguity finishes the call `unknown` with the evidence;\n// nothing is respawned or resent. A receipt that is already there (an earlier\n// attempt) is the same: `unknown`, never a second child.\n// Nothing here imports src/cli.ts (the CLI wiring cycle).\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { delegateOutcome } from \"./agents/delegate.js\";\nimport { resolveCliCommand } from \"./agents/spawn.js\";\nimport {\n CtlDeliveryUnknownError,\n type CtlProbe,\n ctlProbe,\n ctlRequest,\n errCode,\n} from \"./ctl/client.js\";\nimport { CTL_SOCK_ENV, ctlSocketPath } from \"./ctl/path.js\";\nimport { type Db, defaultStateDir } from \"./db.js\";\nimport {\n DelegateNotFoundError,\n type DelegateRow,\n DelegateStateError,\n delegateProcessDir,\n finishDelegate,\n getDelegateCall,\n markDelegate,\n TERMINAL_DELEGATE_STATES,\n} from \"./delegates.js\";\nimport { addWorktree, gitToplevel, headSha, owningRoot } from \"./vcs/git.js\";\nimport {\n getWorktreeAt,\n type ReleasedWorktree,\n reclaimWorktreePath,\n registerWorktree,\n releaseWorktree,\n worktreePath,\n} from \"./worktree.js\";\n\n/** Seconds to wait for an answer when the call names none (the extension's default). */\nconst DEFAULT_TIMEOUT_S = 3600;\nconst STOP_GRACE_MS = 3000;\nconst LOG_TAIL_BYTES = 2000;\n\nexport interface DelegateRunOptions {\n /** Aborting cancels: the child's turn is aborted and the call finishes `cancelled`. */\n signal?: AbortSignal;\n /** The mu pi extension to load. Default: the shipped dist/extension/mu-pi.js. */\n extension?: string;\n /** Budget for the child to serve its control socket. Default `MU_SPAWN_CTL_MS`, else 30 s. */\n startupMs?: number;\n /** Overrides the call's `keep`: false stops the child after the finish (the extension waits for the exit). */\n keep?: boolean;\n}\n\nexport interface DelegateRunResult {\n callId: string;\n /** False: the call was already finished; nothing started. */\n ran: boolean;\n state: DelegateRow[\"state\"];\n /** `done`, `empty`, `error`, `died`, `blocked`, `timeout`, `cancelled`, `unknown` (delivery), `refused` (nothing was sent). */\n outcome?: string;\n task: string;\n workstream: string;\n transport: \"process\";\n attach: null;\n pid?: number;\n logPath?: string;\n sessionFile?: string;\n sessionDir?: string;\n /** The call's own git worktree (`workspace: true`). */\n workspace?: string;\n /** What the close rule did with it; absent while the work is not clean and recorded. */\n worktree?: ReleasedWorktree | { kept: string };\n error?: string;\n /** The recorded answer, when `outcome` is `done`. */\n answer?: string;\n /** With `keep: true` after a clean finish: the live child. `stop()` closes its stdin, then its process group. */\n live?: { exited: Promise<void>; stop(): Promise<void> };\n}\n\ninterface Receipt {\n runner: number;\n pid?: number;\n phase: \"starting\" | \"spawned\" | \"sending\" | \"sent\";\n msgId: string;\n incarnation?: string;\n runs?: number;\n sock: string;\n log: string;\n sessionDir: string;\n startedAt: string;\n}\n\nconst sha = (s: string, n: number): string =>\n createHash(\"sha256\").update(s).digest(\"hex\").slice(0, n);\n\n/** Every file of one call, derived from its id and the DB's directory. */\nexport function delegateProcessPaths(\n db: Db,\n row: Pick<DelegateRow, \"callId\" | \"task\" | \"workstream\">,\n) {\n const base = dirname(db.name);\n const dir = delegateProcessDir(db.name, row.callId);\n return {\n dir,\n log: join(dir, \"pi.log\"),\n receipt: join(dir, \"receipt.json\"),\n sessionDir: join(dir, \"session\"),\n sock: ctlSocketPath(row.workstream, row.task, base),\n };\n}\n\nfunction shippedExtension(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n for (const p of [\n join(here, \"extension\", \"mu-pi.js\"),\n join(here, \"..\", \"dist\", \"extension\", \"mu-pi.js\"),\n ])\n if (existsSync(p)) return p;\n throw new Error(\n \"the mu pi extension (dist/extension/mu-pi.js) is not built: run `npm run build`\",\n );\n}\n\nconst alive = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return errCode(e) === \"EPERM\";\n }\n};\n\nfunction tail(path: string): string {\n try {\n return readFileSync(path, \"utf8\").slice(-LOG_TAIL_BYTES).trimEnd();\n } catch {\n return \"\";\n }\n}\n\n/** The call's own `git worktree`, through the same registry and close rule as an agent's. */\nasync function stageWorktree(db: Db, row: DelegateRow): Promise<string> {\n const path = worktreePath(row.workstream, row.task);\n const dir = resolve(row.request.cwd ?? process.cwd());\n const top = await gitToplevel(dir);\n if (top === undefined) throw new Error(`workspace: true needs a git repo, and ${dir} is not one`);\n const root = (await owningRoot(top)) ?? top;\n await reclaimWorktreePath(db, { agent: row.task, workstream: row.workstream, path });\n const base = await addWorktree(root, path, await headSha(top));\n const createdAt = new Date().toISOString();\n registerWorktree(db, {\n path,\n agent: row.task,\n workstream: row.workstream,\n root,\n base,\n createdAt,\n });\n return path;\n}\n\nasync function releaseWorktreeAt(\n db: Db,\n path: string,\n): Promise<ReleasedWorktree | { kept: string }> {\n try {\n const row = getWorktreeAt(db, path);\n return row ? await releaseWorktree(db, row) : { kept: \"not registered\" };\n } catch (e) {\n return { kept: e instanceof Error ? e.message : String(e) };\n }\n}\n\n/**\n * Run a `queued` or `starting` call in a child pi and finish it durably: the\n * verdict, report and close are written (by `finishDelegate`) before the\n * child's stdin is closed. Outcomes are results, not throws; a throw is a\n * caller error: no such call, or one that is running, refused or held by a\n * live runner.\n */\nexport async function runDelegateProcess(\n db: Db,\n callId: string,\n opts: DelegateRunOptions = {},\n): Promise<DelegateRunResult> {\n let row = getDelegateCall(db, callId);\n if (!row) throw new DelegateNotFoundError(callId);\n const call = row;\n const req = call.request;\n const p = delegateProcessPaths(db, call);\n const base = {\n callId,\n task: call.task,\n workstream: call.workstream,\n transport: \"process\" as const,\n attach: null,\n };\n if (TERMINAL_DELEGATE_STATES.includes(call.state))\n return { ...base, ran: false, state: call.state };\n if (call.state !== \"queued\" && call.state !== \"starting\")\n throw new DelegateStateError(callId, call.state, \"run\");\n row = call.state === \"queued\" ? markDelegate(db, callId, \"starting\") : call;\n\n const msgId = `mu-${sha(callId, 24)}`;\n const result = (outcome: string, extra: Partial<DelegateRunResult> = {}): DelegateRunResult => ({\n ...base,\n ran: true,\n outcome,\n state: getDelegateCall(db, callId)?.state ?? \"failed\",\n logPath: p.log,\n sessionDir: p.sessionDir,\n ...extra,\n });\n const unknown = (why: string): DelegateRunResult => {\n const text = `${why}. Not respawned, not resent. Receipt: ${p.receipt}. Log: ${p.log}`;\n finishDelegate(db, callId, { outcome: \"unknown\", text, author: call.caller });\n return result(\"unknown\", { error: text });\n };\n\n // The receipt is created exclusively, before anything spawns.\n mkdirSync(p.dir, { recursive: true, mode: 0o700 });\n const write = (r: Partial<Receipt>): void => {\n const cur = existsSync(p.receipt)\n ? (JSON.parse(readFileSync(p.receipt, \"utf8\")) as Partial<Receipt>)\n : {};\n writeFileSync(`${p.receipt}.tmp`, JSON.stringify({ ...cur, ...r }));\n renameSync(`${p.receipt}.tmp`, p.receipt);\n };\n try {\n writeFileSync(\n p.receipt,\n JSON.stringify({\n runner: process.pid,\n phase: \"starting\",\n msgId,\n sock: p.sock,\n log: p.log,\n sessionDir: p.sessionDir,\n startedAt: new Date().toISOString(),\n } satisfies Receipt),\n { flag: \"wx\" },\n );\n } catch (e) {\n if (errCode(e) !== \"EEXIST\") throw e;\n const old = JSON.parse(readFileSync(p.receipt, \"utf8\")) as Partial<Receipt>;\n if (old.runner !== undefined && alive(old.runner))\n throw new DelegateStateError(callId, call.state, `run (runner pid ${old.runner} holds it)`);\n return unknown(`an earlier attempt of this call left a receipt (phase ${old.phase ?? \"?\"})`);\n }\n\n let child: ChildProcess | undefined;\n let gone = false;\n let exited: Promise<void> = Promise.resolve();\n let stopping: Promise<void> | undefined;\n /** Close stdin (pi's clean shutdown); then TERM, then KILL, its own process group only. */\n const stop = (): Promise<void> => {\n stopping ??= (async () => {\n const c = child;\n if (!c || gone) return;\n c.stdin?.end();\n for (const sig of [undefined, \"SIGTERM\", \"SIGKILL\"] as const) {\n if (sig !== undefined && c.pid !== undefined)\n try {\n process.kill(-c.pid, sig);\n } catch {\n return;\n }\n await Promise.race([exited, delay(STOP_GRACE_MS)]);\n if (gone) return;\n }\n })();\n return stopping;\n };\n\n let workspace: string | undefined;\n /** A definite no (nothing was sent): stop, forget the attempt, park the call to be reissued. */\n const refuse = async (error: string): Promise<DelegateRunResult> => {\n await stop();\n rmSync(p.receipt, { force: true });\n const log = tail(p.log);\n const detail = log ? `${error}\\n\\nchild log tail:\\n${log}` : error;\n try {\n markDelegate(db, callId, \"refused\", { error: detail });\n } catch {\n // the call moved on (finished by a cancel): its state is the answer\n }\n const wt = workspace ? await releaseWorktreeAt(db, workspace) : undefined;\n return result(\"refused\", { error: detail, ...(wt ? { worktree: wt } : {}) });\n };\n const aborted = new Promise<\"cancel\">((res) => {\n if (opts.signal?.aborted) res(\"cancel\");\n opts.signal?.addEventListener(\"abort\", () => res(\"cancel\"), { once: true });\n });\n /** Abort the child's turn, finish `cancelled`, stop it. */\n const cancel = async (why: string, sent: boolean): Promise<DelegateRunResult> => {\n if (sent) await ctlRequest(p.sock, { op: \"abort\" }, { timeoutMs: 2000 }).catch(() => {});\n finishDelegate(db, callId, { outcome: \"cancelled\", text: why, author: call.caller });\n await stop();\n return result(\"cancelled\", child?.pid !== undefined ? { pid: child.pid } : {});\n };\n\n let sent = false;\n try {\n if (req.cli !== undefined && req.cli !== \"pi\")\n return await refuse(`mux-free delegates run pi only, not --cli ${req.cli}`);\n mkdirSync(dirname(p.sock), { recursive: true, mode: 0o700 });\n rmSync(p.sock, { force: true });\n if (req.workspace === true) workspace = await stageWorktree(db, call);\n const [cmd = \"pi\", ...cmdArgs] = resolveCliCommand(\"pi\").trim().split(/\\s+/);\n const logFd = openSync(p.log, \"a\");\n try {\n child = spawn(\n cmd,\n [\n ...cmdArgs,\n \"--mode\",\n \"rpc\",\n \"--extension\",\n opts.extension ?? shippedExtension(),\n \"--session-dir\",\n p.sessionDir,\n ...(req.model ? [\"--model\", req.model] : []),\n ],\n {\n cwd: workspace ?? resolve(req.cwd ?? process.cwd()),\n detached: true,\n stdio: [\"pipe\", logFd, logFd],\n env: {\n ...process.env,\n MU_MANAGED_AGENT: \"1\",\n MU_AGENT_NAME: call.task,\n MU_WORKSTREAM: call.workstream,\n [CTL_SOCK_ENV]: p.sock,\n MU_DB_PATH: resolve(db.name),\n MU_STATE_DIR: resolve(defaultStateDir()),\n },\n },\n );\n } finally {\n closeSync(logFd);\n }\n const c = child;\n const failed = await new Promise<Error | undefined>((res) => {\n c.once(\"error\", res);\n c.once(\"spawn\", () => res(undefined));\n });\n if (failed) return await refuse(`cannot start pi (${cmd}): ${failed.message}`);\n c.stdin?.on(\"error\", () => {});\n exited = new Promise<void>((res) =>\n c.once(\"exit\", () => {\n gone = true;\n res();\n }),\n );\n write({ pid: c.pid, phase: \"spawned\" });\n\n // It must serve its control socket: a trust prompt or a bad model never will.\n const budget = opts.startupMs ?? (Number(process.env.MU_SPAWN_CTL_MS) || 30_000);\n const until = Date.now() + budget;\n let probe: CtlProbe = { kind: \"missing\" };\n while (probe.kind !== \"ok\") {\n if (gone) return await refuse(`pi exited before serving its control socket`);\n if (opts.signal?.aborted) return await cancel(\"cancelled while it started\", false);\n if (Date.now() > until)\n return await refuse(`pi did not serve its control socket within ${budget}ms`);\n probe = await ctlProbe(p.sock, 1000);\n if (probe.kind !== \"ok\") await delay(50);\n }\n const inc = probe.incarnation;\n if (inc === undefined || !probe.features?.includes(\"msgId\"))\n return await refuse(\"the child's mu extension serves no msgId/incarnation: rebuild mu\");\n\n // Send once. Past this write nothing is retried.\n write({ phase: \"sending\", incarnation: inc });\n sent = true;\n let runs = 0;\n try {\n const r = await ctlRequest(p.sock, {\n op: \"send\",\n text: req.text,\n msgId,\n expectIncarnation: inc,\n });\n if (!r.ok) {\n sent = false;\n return await refuse(`the child refused the prompt: ${r.error}`);\n }\n runs = r.runs ?? 0;\n } catch (e) {\n if (!(e instanceof CtlDeliveryUnknownError)) {\n sent = false;\n return await refuse(e instanceof Error ? e.message : String(e));\n }\n const q = await ctlRequest(p.sock, { op: \"status\", msgId }, { timeoutMs: 2000 }).catch(\n () => undefined,\n );\n if (!q?.ok || !q.msg?.accepted) {\n await stop();\n return unknown(`delivery unknown: ${e.message}`);\n }\n runs = q.msg.runs ?? 0;\n }\n write({ phase: \"sent\", runs });\n markDelegate(db, callId, \"running\", { agent: call.task });\n\n const t0 = Date.now();\n const waited = ctlRequest(p.sock, {\n op: \"wait\",\n afterRuns: runs,\n timeoutMs: (req.timeoutS ?? DEFAULT_TIMEOUT_S) * 1000,\n returnOnBlocked: true,\n incarnation: inc,\n }).catch((e: unknown) => (e instanceof Error ? e : new Error(String(e))));\n const reply = await Promise.race([waited, aborted]);\n if (reply === \"cancel\") return await cancel(\"cancelled\", true);\n\n const ok = reply instanceof Error || !reply.ok ? undefined : reply;\n const timedOut = !(reply instanceof Error) && !reply.ok && reply.error === \"timeout\";\n const outcome =\n ok?.ended === \"blocked\"\n ? \"blocked\"\n : delegateOutcome(\n {\n fired: ok?.ended === \"settled\",\n dead: ok === undefined && !timedOut && (reply instanceof Error || !reply.ok),\n lastText: ok?.lastText,\n lastError: ok?.lastError,\n blocked: undefined,\n },\n timedOut,\n );\n const sessionFile = ok?.sessionFile;\n const text =\n outcome === \"done\"\n ? (ok?.lastText ?? \"\")\n : [\n reply instanceof Error ? `error: ${reply.message}` : undefined,\n ok?.lastError ? `error: ${ok.lastError}` : undefined,\n sessionFile ? `Session: ${sessionFile}` : `Session dir: ${p.sessionDir}`,\n tail(p.log) ? `Child log tail (${p.log}):\\n${tail(p.log)}` : undefined,\n ]\n .filter((v) => v !== undefined)\n .join(\"\\n\\n\");\n const fin = finishDelegate(db, callId, {\n outcome,\n text,\n elapsedMs: Date.now() - t0,\n author: call.task,\n });\n const info: Partial<DelegateRunResult> = {\n ...(c.pid !== undefined ? { pid: c.pid } : {}),\n ...(sessionFile ? { sessionFile } : {}),\n ...(workspace ? { workspace } : {}),\n ...(fin.error ? { error: fin.error } : {}),\n ...(outcome === \"done\" ? { answer: text } : {}),\n };\n const clean = fin.state === \"done\";\n if (clean && (opts.keep ?? req.keep) === true)\n return result(outcome, { ...info, live: { exited, stop } });\n // Durable first; only now does the child lose its stdin. A failed or\n // timed-out run keeps its log, session and worktree as evidence, not a process.\n if (!clean) await ctlRequest(p.sock, { op: \"abort\" }, { timeoutMs: 2000 }).catch(() => {});\n await stop();\n const wt = clean && workspace ? await releaseWorktreeAt(db, workspace) : undefined;\n return result(outcome, { ...info, ...(wt ? { worktree: wt } : {}) });\n } catch (e) {\n // A bug or a full disk: never leave the call starting or a child running.\n await stop();\n const msg = e instanceof Error ? e.message : String(e);\n if (!sent) return await refuse(msg);\n finishDelegate(db, callId, { outcome: \"error\", text: msg, author: call.caller });\n return result(\"error\", { error: msg });\n }\n}\n","// mu — `mu delegates prune`: drop old delegate tasks (docs/VOCABULARY.md § delegate prune).\n//\n// Every `mu_delegate` call and `mu next --refute` checker is a `kind=delegate`\n// task in `scratch`, with its whole brief and report. Nothing else removes them,\n// so they pile up. A prune deletes the CLOSED ones past an age whose call this\n// machine made (it holds the `delegate_calls` row; each machine prunes its own,\n// and the tombstones remove the copies on its peers):\n//\n// 1. The task rows go in ONE op group (intent `delegate.prune`). The capture\n// triggers write the tombstones, so peers drop the same rows on sync; notes,\n// the machine-local call row and receipts go with them by cascade.\n// 2. The puts of those tasks and their notes are deleted from `ops`, so mu.db\n// shrinks. The tombstones stay: a peer's older put arriving later is still dead.\n// With sync on, only PEERS' puts go: this machine's own are lines of its\n// segment, and flush regenerates a damaged or missing segment from `ops`. A\n// shorter regenerated file would sit under peers' line watermarks and they\n// would silently skip the ops that follow. Sync segments are never edited.\n//\n// Kept, and counted, so the operator sees why:\n// - a task with an edge: the edge records a dependency someone drew, and the\n// cascade would drop it;\n// - a `refute:` call whose judged task is still under `mu task auto` (enabled):\n// `mu next --refute` keys the check on the call id, and a missing call means\n// \"check owed\", so pruning it would rerun the checker.\n//\n// The verdict notes the calls wrote live on the judged tasks and stay.\n//\n// Files: each pruned call's pi session goes too, after the commit (files are not\n// in the backup, so they go only with rows that did): a pane delegate's\n// `delegate-sessions/<ws>/<task>/` and a mux-free one's `delegate-process/<hash>/`\n// (receipt, log, session). Loose `delegate-sessions/<ws>/*.jsonl` files (the\n// first layout, one folder per workstream, no call to tie them to) go by age,\n// never younger than a day (a pane may still write one), and only for this\n// DB's live workstreams (another DB beside it may own the rest).\n// A receipt of a call that still exists is never touched: it fences a resend.\n//\n// The CLI adds the dry run, the backup beside the DB, VACUUM and the drift check.\n\nimport { lstatSync, readdirSync, rmSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Db } from \"./db.js\";\nimport { delegateProcessDir, delegateSessionDir } from \"./delegates.js\";\nimport type { FleetHazard } from \"./fleet-hazards.js\";\nimport { withOpContext } from \"./op-context.js\";\nimport { localMachineId } from \"./segments.js\";\nimport { syncEnabled } from \"./sync.js\";\n\n/** Default age, in days, past which a closed delegate task is pruned. */\nexport const PRUNE_DEFAULT_DAYS = 30;\n\nexport interface PruneCandidate {\n workstream: string;\n task: string;\n callId: string;\n /** The task's `updated_at`: when it closed, for a closed delegate task. */\n closedAt: string;\n}\n\nexport interface PrunePlan {\n /** ISO time: tasks last updated before it are old. */\n cutoff: string;\n days: number;\n candidates: PruneCandidate[];\n /** Old closed delegate tasks kept, by reason. */\n kept: { edges: number; refuteTarget: number };\n /** Whether this machine's own puts are deleted too (sync off), or only peers'. */\n ownHistory: boolean;\n /** Ops the prune would delete (the puts of the candidates and their notes). */\n ops: number;\n /** Payload bytes of those ops. */\n bytes: number;\n /** The pi session files that go with the candidates, plus old loose ones. */\n files: { paths: string[]; bytes: number };\n}\n\n/** Bytes under `p` (a file or a tree; symlinks not followed); 0 when absent. */\nfunction sizeOf(p: string): number {\n let st: ReturnType<typeof lstatSync>;\n try {\n st = lstatSync(p);\n } catch {\n return 0;\n }\n if (!st.isDirectory()) return st.size;\n let n = 0;\n for (const e of readdirSync(p)) n += sizeOf(join(p, e));\n return n;\n}\n\n/** A DB with no file of its own keeps no session files beside it. */\nconst hasFileDir = (db: Db): boolean => db.name !== \"\" && db.name !== \":memory:\";\n\n/** A loose file this young may belong to a pane still writing it, whatever the age asked. */\nconst LOOSE_MIN_AGE_MS = 86_400_000;\n\n/**\n * Session files of the first layout: `delegate-sessions/<ws>/*.jsonl` last\n * written before `cutoff` (and at least a day ago), for this DB's live\n * workstreams only: another DB beside this one may own the rest.\n */\nfunction looseSessions(\n db: Db,\n cutoff: string,\n workstream: string | undefined,\n now: number,\n): string[] {\n const root = join(dirname(db.name), \"delegate-sessions\");\n const before = Math.min(Date.parse(cutoff), now - LOOSE_MIN_AGE_MS);\n const out: string[] = [];\n const wss = (\n db\n .prepare(\n \"SELECT name FROM workstreams WHERE torn_down_at IS NULL AND (? IS NULL OR name = ?)\",\n )\n .all(workstream ?? null, workstream ?? null) as { name: string }[]\n ).map((r) => r.name);\n for (const ws of wss) {\n let names: string[];\n try {\n names = readdirSync(join(root, ws));\n } catch {\n continue;\n }\n for (const f of names) {\n const p = join(root, ws, f);\n if (!f.endsWith(\".jsonl\")) continue;\n try {\n const st = lstatSync(p);\n if (st.isFile() && st.mtimeMs < before) out.push(p);\n } catch {\n // gone meanwhile\n }\n }\n }\n return out.sort();\n}\n\n/** The session directories one call may have left (either transport). */\nconst callFiles = (db: Db, c: PruneCandidate): string[] => [\n delegateSessionDir(db.name, c.workstream, c.task),\n delegateProcessDir(db.name, c.callId),\n];\n\n/** The puts of one task and its notes: key `<ws>/<id>` and `<ws>/<id>#<n>`. The\n * range outside the OR ('$' is the byte after '#') is what idx_ops_entity_key\n * seeks on (without it SQLite scans every put of the entity); the OR inside drops\n * siblings such as `<id>-2`. `@own` 1 includes this machine's puts. */\nconst TASK_PUTS_WHERE = `entity IN ('task', 'note') AND op = 'put'\n AND key >= @k AND key < @k || '$' AND (key = @k OR key >= @k || '#')\n AND (@own = 1 OR machine_id <> @me)`;\n\n/** The earliest instant a JS Date holds: a huge age means \"nothing that old\". */\nconst MIN_DATE_MS = -8.64e15;\n\ninterface Row {\n id: number;\n workstream: string;\n task: string;\n updated_at: string;\n call_id: string;\n call_state: string;\n edges: number;\n judged_auto: number;\n}\n\n/**\n * What a prune of delegate tasks closed more than `days` ago would delete,\n * optionally in one workstream (live ones only). Read-only.\n */\nexport function planDelegatePrune(\n db: Db,\n opts: { days?: number; workstream?: string; now?: number; ownHistory?: boolean } = {},\n): PrunePlan {\n const days = opts.days ?? PRUNE_DEFAULT_DAYS;\n const ownHistory = opts.ownHistory ?? !syncEnabled();\n const cutoff = new Date(\n Math.max(MIN_DATE_MS, (opts.now ?? Date.now()) - days * 86_400_000),\n ).toISOString();\n const rows = db\n .prepare(\n `SELECT t.id AS id, w.name AS workstream, t.local_id AS task, t.updated_at AS updated_at,\n d.call_id AS call_id, d.state AS call_state,\n (SELECT COUNT(*) FROM task_edges e WHERE e.from_task_id = t.id OR e.to_task_id = t.id) AS edges,\n EXISTS (SELECT 1 FROM tasks jt JOIN workstreams jw ON jw.id = jt.workstream_id\n JOIN task_auto ja ON ja.task_id = jt.id AND ja.enabled = 1\n WHERE jw.name = d.record_workstream AND jt.local_id = d.record_task) AS judged_auto\n FROM tasks t\n JOIN workstreams w ON w.id = t.workstream_id AND w.torn_down_at IS NULL\n JOIN delegate_calls d ON d.task_id = t.id\n WHERE t.kind = 'delegate' AND t.status = 'CLOSED' AND t.updated_at < ?\n AND (? IS NULL OR w.name = ?)\n ORDER BY w.name, t.updated_at, t.local_id`,\n )\n .all(cutoff, opts.workstream ?? null, opts.workstream ?? null) as Row[];\n const plan: PrunePlan = {\n cutoff,\n days,\n candidates: [],\n kept: { edges: 0, refuteTarget: 0 },\n ownHistory,\n ops: 0,\n bytes: 0,\n files: { paths: [], bytes: 0 },\n };\n const cost = db.prepare(\n `SELECT COUNT(*) AS n, COALESCE(SUM(length(payload)), 0) AS b FROM ops WHERE ${TASK_PUTS_WHERE}`,\n );\n const me = localMachineId(db);\n const own = ownHistory ? 1 : 0;\n for (const r of rows) {\n // A CLOSED task whose call is still live (a crash mid-record) is not old work.\n if (![\"done\", \"failed\", \"cancelled\"].includes(r.call_state)) continue;\n if (r.edges > 0) {\n plan.kept.edges++;\n continue;\n }\n if (r.call_id.startsWith(\"refute:\") && r.judged_auto === 1) {\n plan.kept.refuteTarget++;\n continue;\n }\n plan.candidates.push({\n workstream: r.workstream,\n task: r.task,\n callId: r.call_id,\n closedAt: r.updated_at,\n });\n const c = cost.get({ k: `${r.workstream}/${r.task}`, own, me }) as { n: number; b: number };\n plan.ops += c.n;\n plan.bytes += c.b;\n }\n if (hasFileDir(db)) {\n const paths = [\n ...plan.candidates.flatMap((c) => callFiles(db, c)).filter(exists),\n ...looseSessions(db, cutoff, opts.workstream, opts.now ?? Date.now()),\n ];\n plan.files = { paths, bytes: paths.reduce((n, p) => n + sizeOf(p), 0) };\n }\n return plan;\n}\n\nfunction exists(p: string): boolean {\n try {\n lstatSync(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Delete the plan's tasks (tombstones captured, one op group) and their puts, in\n * one transaction. Irreversible: the CLI backs up first. A task that changed\n * since the plan (reopened, no longer delegate or closed) is left alone.\n */\nexport function pruneDelegates(\n db: Db,\n plan: PrunePlan,\n): { tasks: number; ops: number; files: number } {\n let tasks = 0;\n let ops = 0;\n const pruned: PruneCandidate[] = [];\n withOpContext(db, { intent: \"delegate.prune\", actor: \"mu delegates prune\", group: \"new\" }, () =>\n db\n .transaction(() => {\n // Re-checked at delete time: the plan ran before the backup, outside this transaction.\n const del = db.prepare(\n `DELETE FROM tasks WHERE kind = 'delegate' AND status = 'CLOSED' AND updated_at < ?\n AND local_id = ? AND workstream_id = (SELECT id FROM workstreams WHERE name = ?)\n AND NOT EXISTS (SELECT 1 FROM task_edges e\n WHERE e.from_task_id = tasks.id OR e.to_task_id = tasks.id)`,\n );\n const puts = db.prepare(`DELETE FROM ops WHERE ${TASK_PUTS_WHERE}`);\n const me = localMachineId(db);\n const own = plan.ownHistory ? 1 : 0;\n // A wait's consumed-call cursor names the call; it has nothing left to hide.\n const cursor = db.prepare(\"DELETE FROM wait_cursors WHERE ref = ?\");\n for (const c of plan.candidates) {\n if (del.run(plan.cutoff, c.task, c.workstream).changes === 0) continue;\n tasks++;\n pruned.push(c);\n ops += puts.run({ k: `${c.workstream}/${c.task}`, own, me }).changes;\n cursor.run(`delegate:${c.workstream}/${c.callId}`);\n }\n })\n .immediate(),\n );\n // After the commit: only the calls whose rows are gone lose their files.\n let files = 0;\n if (hasFileDir(db)) {\n const loose = new Set(plan.files.paths);\n const go = [\n ...pruned.flatMap((c) => callFiles(db, c)),\n ...looseSessions(db, plan.cutoff, undefined, Date.now()).filter((p) => loose.has(p)),\n ];\n for (const p of go) {\n if (!exists(p)) continue;\n try {\n rmSync(p, { recursive: true, force: true });\n files++;\n } catch {\n // best-effort: a file left behind is found again by the next prune\n }\n }\n }\n return { tasks, ops, files };\n}\n\n/**\n * Doctor's housekeeping row: closed delegate tasks old enough to prune. Always\n * `ok` (a tidy-up is not a fault), with the count and the command when any.\n */\nexport function checkOldDelegates(db: Db, opts: { now?: number } = {}): FleetHazard {\n const plan = planDelegatePrune(db, opts);\n const n = plan.candidates.length;\n if (n === 0)\n return {\n name: \"delegates-old\",\n severity: \"ok\",\n detail: `no closed delegate task older than ${plan.days} days`,\n };\n return {\n name: \"delegates-old\",\n severity: \"ok\",\n detail: `${n} closed delegate task(s) older than ${plan.days} days (${plan.ops} ops)`,\n remediation: [\n \"Each holds its whole brief and report, synced to every peer. Their verdicts stay on the judged tasks.\",\n \" mu delegates prune # dry run: what goes, and what is kept\",\n \" mu delegates prune --yes # backs up beside the DB first; irreversible\",\n ],\n };\n}\n","// The one validator for a workstream name typed as scope (`-w`, a\n// `<ws>/<name>` ref prefix, a record's `workstream`). Pure and\n// dependency-free: the CLI (src/cli.ts) and the pi extension\n// (extension/delegate.ts, extension/nudge.ts) all call it, so the\n// answer to \"is this a valid scope?\" is the same everywhere.\n//\n// It never trims. Trimming turns a quoting accident (`-w ' auth'`) into\n// a different, valid workstream. Empty, blank and padded names are\n// rejected, and so is any name holding whitespace, a comma, a slash or a\n// control character (a list or a `<ws>/<name>` ref pasted as one name).\n// It does not check the rest of the name's shape or that it exists.\n\n/** Why `value` is not a usable workstream name, or undefined when it is. */\nexport function workstreamNameProblem(value: string, flag = \"-w/--workstream\"): string | undefined {\n if (value.length > 0 && value.trim().length === 0) {\n return `${flag} got a blank (whitespace-only) value ${JSON.stringify(value)}. Pass a workstream name.`;\n }\n if (value.length === 0 || value !== value.trim()) {\n return `${flag} got ${JSON.stringify(value)}: pass a bare workstream name with no surrounding whitespace.`;\n }\n if (/[\\s,/\\p{Cc}]/u.test(value)) {\n return `${flag} got ${JSON.stringify(value)}: a workstream name has no whitespace, ',' or '/'.`;\n }\n return undefined;\n}\n\n/**\n * Names from repeated / comma-separated values. A structurally empty\n * fragment (`\"a,\"`) is a comma artifact and is dropped; a fragment is\n * never trimmed, and a padded or blank one, or a lone empty value, is a\n * problem.\n */\nexport function parseWorkstreamFragments(\n values: readonly string[],\n flag = \"-w/--workstream\",\n): { names: string[] } | { problem: string } {\n const names: string[] = [];\n for (const value of values) {\n const lone = value === \"\" ? workstreamNameProblem(value, flag) : undefined;\n if (lone !== undefined) return { problem: lone };\n for (const fragment of value.split(\",\")) {\n if (fragment === \"\") continue;\n const problem = workstreamNameProblem(fragment, flag);\n if (problem !== undefined) return { problem };\n names.push(fragment);\n }\n }\n return { names };\n}\n\n/**\n * Why a qualified `<ws>/<name>` ref is unusable, or undefined (a bare ref\n * has no prefix to check). Both halves are validated and never trimmed:\n * ` own/t`, `own/ t` and `own/` are errors, not another entity.\n */\nexport function qualifiedRefProblem(raw: string): string | undefined {\n const slash = raw.indexOf(\"/\");\n if (slash === -1) return undefined;\n const flag = `qualified ref ${JSON.stringify(raw)}:`;\n const prefix = workstreamNameProblem(raw.slice(0, slash), flag);\n if (prefix !== undefined) return prefix;\n const name = raw.slice(slash + 1);\n if (name === \"\" || name !== name.trim() || /[\\s\\p{Cc}]/u.test(name)) {\n return `${flag} the name after '/' must be non-empty with no whitespace.`;\n }\n return undefined;\n}\n","// mu — `mu delegates`: delegate calls as durable tasks (src/delegates.ts).\n//\n// mu delegates [list] [--caller c] [-w ws] [--wave w] the calls and their states\n// mu delegates show <call-id> one call, with its request\n// mu delegates tally -w <ws> --wave <w> verdicts grouped per judged task\n// mu delegates register | mark | finish the writers the pi extension calls\n// mu delegates reissue <call-id> refuses: the tool's job (see cmdDelegatesReissue)\n// mu delegates prune [--older-than <days>] [--yes] drop old closed delegate tasks (src/delegate-prune.ts)\n//\n// The extension shells out to the writers (VISION § 1: the CLI is the\n// product), so a script gets exactly the same lifecycle.\n\nimport type { Command } from \"commander\";\nimport {\n CliExitError,\n emitJson,\n emitJsonCollection,\n handle,\n JSON_OPT,\n parseNonNegativeInt,\n parsePositiveNumber,\n resolveExistingWorkstream,\n UsageError,\n WORKSTREAM_OPT,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { type DelegateRunResult, runDelegateProcess } from \"../delegate-process.js\";\nimport {\n PRUNE_DEFAULT_DAYS,\n type PrunePlan,\n planDelegatePrune,\n pruneDelegates,\n} from \"../delegate-prune.js\";\nimport {\n DelegateNotFoundError,\n type DelegateRequest,\n type DelegateRow,\n finishDelegate,\n getDelegateCall,\n listDelegates,\n markDelegate,\n registerDelegateCall,\n verdictTally,\n} from \"../delegates.js\";\nimport { formatBytes } from \"../disk-recon.js\";\nimport { muTable, pc } from \"../output.js\";\nimport { qualifiedRefProblem } from \"../workstream-scope.js\";\nimport { backupBeside, CHECKPOINT_PENDING, vacuumAndCheck } from \"./db.js\";\nimport { readStdinText, STDIN_ARG } from \"./stdin.js\";\n\ninterface WsOpt {\n workstream?: string;\n json?: boolean;\n}\n\n/** Reissue is the owning pi session's: only its live runtime drains a queued call. */\nconst reissueHint = (callId: string): string => `mu_delegate_reissue { call_id: \"${callId}\" }`;\n\nconst callerFromEnv = (): string | undefined => {\n const session = process.env.PI_SESSION_ID;\n return session ? `pi:${session}` : undefined;\n};\n\nfunction renderRows(rows: readonly DelegateRow[]): string {\n const t = muTable({ head: [\"CALL\", \"TASK\", \"STATE\", \"WAVE\", \"AGENT\", \"JUDGES\", \"VERDICT\"] });\n for (const r of rows)\n t.push([\n r.callId,\n `${r.workstream}/${r.task}`,\n r.state,\n r.wave ?? \"\",\n r.agent ?? \"\",\n r.record ? `${r.record.workstream}/${r.record.task}` : \"\",\n r.verdict ?? \"\",\n ]);\n return t.toString();\n}\n\nexport async function cmdDelegatesList(\n db: Db,\n opts: WsOpt & { caller?: string; wave?: string; all?: boolean },\n): Promise<void> {\n const caller = opts.caller ?? (opts.all === true ? undefined : callerFromEnv());\n const rows = listDelegates(db, caller, opts.workstream, {\n ...(opts.wave !== undefined ? { wave: opts.wave } : {}),\n });\n if (opts.json) return emitJsonCollection(rows);\n if (rows.length === 0) {\n console.log(\n caller !== undefined && opts.caller === undefined\n ? \"no delegate calls of this caller (--all lists every caller's)\"\n : \"no delegate calls\",\n );\n return;\n }\n console.log(renderRows(rows));\n const refused = rows.filter((r) => r.state === \"refused\");\n if (refused.length > 0)\n console.log(\n pc.yellow(\n `${refused.length} refused past the cap: reissue each once in its pi session, e.g. ${reissueHint(refused[0]?.callId ?? \"\")}`,\n ),\n );\n}\n\nexport async function cmdDelegatesShow(db: Db, callId: string, opts: WsOpt): Promise<void> {\n const row = getDelegateCall(db, callId);\n if (!row) throw new DelegateNotFoundError(callId);\n if (opts.json) return emitJson({ call: row });\n console.log(renderRows([row]));\n if (row.error) console.log(pc.yellow(`error: ${row.error}`));\n console.log(pc.dim(`brief and report: mu task notes ${row.task} -w ${row.workstream}`));\n}\n\nexport async function cmdDelegatesTally(db: Db, opts: WsOpt & { wave?: string }): Promise<void> {\n if (opts.wave === undefined) throw new UsageError(\"tally needs --wave <label>\");\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const t = verdictTally(db, ws, opts.wave);\n if (opts.json) return emitJson(t);\n const table = muTable({ head: [\"FINDING\", \"CONFIRMED\", \"REFUTED\", \"UNVERIFIED\", \"PENDING\"] });\n for (const f of t.findings)\n table.push([\n f.id,\n String(f.confirmed),\n String(f.refuted),\n String(f.unverified),\n String(f.pending),\n ]);\n console.log(table.toString());\n console.log(`queued ${t.queued}, running ${t.running}, refused ${t.refused.length}`);\n if (t.refused.length > 0)\n console.log(\n pc.yellow(`reissue a refused call in its pi session: ${reissueHint(t.refused[0] ?? \"\")}`),\n );\n}\n\nexport interface RegisterOpts extends WsOpt {\n caller?: string;\n text?: string;\n label?: string;\n cli?: string;\n model?: string;\n cwd?: string;\n workspace?: boolean;\n timeout?: number;\n keep?: boolean;\n wave?: string;\n record?: string;\n state?: \"queued\" | \"starting\" | \"refused\";\n}\n\nexport async function cmdDelegatesRegister(\n db: Db,\n callId: string,\n opts: RegisterOpts,\n): Promise<void> {\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const caller = opts.caller ?? callerFromEnv();\n if (caller === undefined) throw new UsageError(\"register needs --caller <session>\");\n if (opts.text === undefined)\n throw new UsageError(\"register needs --text <prompt> (or `-` for stdin)\");\n const text = opts.text === STDIN_ARG ? await readStdinText(\"prompt\") : opts.text;\n if (text.trim() === \"\") throw new UsageError(\"the prompt is empty\", { showHelp: false });\n let record: { workstream: string; task: string } | undefined;\n if (opts.record !== undefined) {\n const problem = qualifiedRefProblem(opts.record);\n const slash = opts.record.indexOf(\"/\");\n if (problem !== undefined || slash < 0)\n throw new UsageError(problem ?? `--record needs <workstream>/<task>, got ${opts.record}`, {\n showHelp: false,\n });\n record = { workstream: opts.record.slice(0, slash), task: opts.record.slice(slash + 1) };\n }\n const request: DelegateRequest = {\n text,\n ...(opts.label !== undefined ? { label: opts.label } : {}),\n ...(opts.cli !== undefined ? { cli: opts.cli } : {}),\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),\n ...(opts.workspace === true ? { workspace: true } : {}),\n ...(opts.timeout !== undefined ? { timeoutS: opts.timeout } : {}),\n ...(opts.keep === true ? { keep: true } : {}),\n };\n const out = registerDelegateCall(db, {\n callId,\n caller,\n workstream: ws,\n request,\n ...(opts.wave !== undefined ? { wave: opts.wave } : {}),\n ...(record ? { record } : {}),\n ...(opts.state !== undefined ? { state: opts.state } : {}),\n });\n if (opts.json) return emitJson(out);\n console.log(\n `${out.created ? \"registered\" : \"already registered\"} ${callId} as ${ws}/${out.call.task} (${out.call.state})`,\n );\n}\n\nexport async function cmdDelegatesMark(\n db: Db,\n callId: string,\n to: string,\n opts: WsOpt & { agent?: string; error?: string },\n): Promise<void> {\n if (to !== \"queued\" && to !== \"starting\" && to !== \"running\" && to !== \"refused\")\n throw new UsageError(`mark takes queued | starting | running | refused, got ${to}`);\n const call = markDelegate(db, callId, to, {\n ...(opts.agent !== undefined ? { agent: opts.agent } : {}),\n ...(opts.error !== undefined ? { error: opts.error } : {}),\n });\n if (opts.json) return emitJson({ call });\n console.log(`${callId}: ${call.state}`);\n}\n\nexport async function cmdDelegatesFinish(\n db: Db,\n callId: string,\n opts: WsOpt & {\n outcome?: string;\n text?: string;\n author?: string;\n elapsedMs?: number;\n record?: boolean;\n },\n): Promise<void> {\n if (opts.outcome === undefined)\n throw new UsageError(\"finish needs --outcome <done|timeout|died|...>\");\n if (opts.author === undefined) throw new UsageError(\"finish needs --author <name>\");\n const text = opts.text === STDIN_ARG ? await readStdinText(\"answer\") : opts.text;\n const result = finishDelegate(db, callId, {\n outcome: opts.outcome,\n ...(text !== undefined ? { text } : {}),\n ...(opts.elapsedMs !== undefined ? { elapsedMs: opts.elapsedMs } : {}),\n author: opts.author,\n ...(opts.record === false ? { record: false } : {}),\n });\n if (opts.json) return emitJson(result);\n console.log(\n result.changed\n ? `${callId}: ${result.state}${result.recorded ? ` (verdict on ${result.record?.workstream}/${result.record?.task})` : \"\"}${result.error ? ` — ${result.error}` : \"\"}`\n : `${callId}: already ${result.state}; nothing written`,\n );\n}\n\n/**\n * Run one call in a child pi with no multiplexer, in the foreground, until it\n * is finished durably (SIGINT/SIGTERM cancel it). Exit 0 only for a recorded\n * answer; a refused, unknown, failed or cancelled call exits 1 and says why.\n * `keep` holds the live child (its stdin is its lifeline) until Ctrl-C.\n */\nexport async function cmdDelegatesRun(\n db: Db,\n callId: string,\n opts: WsOpt & { keep?: boolean },\n): Promise<void> {\n const ac = new AbortController();\n const onSignal = () => ac.abort();\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n let r: DelegateRunResult;\n try {\n r = await runDelegateProcess(db, callId, {\n signal: ac.signal,\n ...(opts.keep === false ? { keep: false } : {}),\n });\n const { live, ...shown } = r;\n if (opts.json) emitJson(shown);\n else {\n console.log(\n r.ran\n ? `${callId}: ${r.outcome} (${r.state}), task ${r.workstream}/${r.task}, log ${r.logPath}${r.sessionFile ? `, session ${r.sessionFile}` : \"\"}`\n : `${callId}: already ${r.state}; nothing run`,\n );\n if (r.error) console.log(pc.yellow(r.error));\n if (r.workspace) console.log(`workspace: ${r.workspace}`);\n if (live)\n console.log(pc.dim(\"keep: holding the child until Ctrl-C (its stdin is its lifeline)\"));\n }\n if (live) {\n ac.signal.addEventListener(\"abort\", () => void live.stop(), { once: true });\n await live.exited;\n }\n } finally {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n }\n if (r.ran && r.state !== \"done\") throw new CliExitError(1);\n}\n\nfunction keptLine(plan: PrunePlan): string {\n const parts = [\n plan.kept.edges > 0 ? `${plan.kept.edges} with edges` : \"\",\n plan.kept.refuteTarget > 0\n ? `${plan.kept.refuteTarget} refute checks of tasks still under mu task auto`\n : \"\",\n ].filter((p) => p !== \"\");\n return parts.length > 0 ? `kept: ${parts.join(\", \")}` : \"\";\n}\n\n/**\n * Dry run by default; `--yes` backs up beside the DB, deletes, VACUUMs and runs\n * the drift check, like `mu db forget`.\n */\nexport async function cmdDelegatesPrune(\n db: Db,\n opts: WsOpt & { olderThan?: number; yes?: boolean },\n): Promise<void> {\n if (opts.workstream !== undefined) await resolveExistingWorkstream(db, opts.workstream);\n const plan = planDelegatePrune(db, {\n ...(opts.olderThan !== undefined ? { days: opts.olderThan } : {}),\n ...(opts.workstream !== undefined ? { workstream: opts.workstream } : {}),\n });\n const n = plan.candidates.length;\n const files = plan.files.paths.length;\n const filesNote = files > 0 ? `, ${files} pi session(s) (${formatBytes(plan.files.bytes)})` : \"\";\n if (opts.yes === true && n === 0 && files === 0) {\n if (opts.json)\n return emitJson({ dryRun: false, ...plan, pruned: 0, deletedOps: 0, deletedFiles: 0 });\n console.log(pc.dim(`nothing to prune: no closed delegate task older than ${plan.days} days`));\n const kept = keptLine(plan);\n if (kept) console.log(pc.dim(kept));\n return;\n }\n if (opts.yes !== true) {\n if (opts.json) return emitJson({ dryRun: true, ...plan });\n if (n === 0 && files === 0)\n console.log(pc.dim(`nothing to prune: no closed delegate task older than ${plan.days} days`));\n else {\n const t = muTable({ head: [\"TASK\", \"CALL\", \"CLOSED\"] });\n for (const c of plan.candidates.slice(0, 20))\n t.push([`${c.workstream}/${c.task}`, c.callId, c.closedAt.slice(0, 10)]);\n console.log(t.toString());\n if (n > 20) console.log(pc.dim(`... and ${n - 20} more`));\n console.log(\n `${n} closed delegate task(s) older than ${plan.days} days: ${plan.ops} ops (${formatBytes(plan.bytes)})${filesNote}. Dry run; nothing changed (--yes applies; irreversible).`,\n );\n if (!plan.ownHistory)\n console.log(\n pc.dim(\n \"sync is on: the rows go everywhere, but this machine's own history stays (its segment is rebuilt from it)\",\n ),\n );\n }\n const kept = keptLine(plan);\n if (kept) console.log(pc.dim(kept));\n return;\n }\n if (n === 0) {\n // Only loose session files are old: no row changes, so no backup or VACUUM.\n const r = pruneDelegates(db, plan);\n if (opts.json)\n return emitJson({ dryRun: false, ...plan, pruned: 0, deletedOps: 0, deletedFiles: r.files });\n console.log(`Pruned ${r.files} pi session(s); no delegate task was old enough.`);\n return;\n }\n const backup = backupBeside(db, \"prune\");\n const r = pruneDelegates(db, plan);\n const size = vacuumAndCheck(db, backup);\n if (opts.json)\n return emitJson({\n dryRun: false,\n ...plan,\n pruned: r.tasks,\n deletedOps: r.ops,\n deletedFiles: r.files,\n backup,\n ...size,\n });\n console.log(\n `Pruned ${r.tasks} delegate task(s), ${r.ops} ops${r.files > 0 ? `, ${r.files} pi session(s)` : \"\"}: ${formatBytes(size.before)} → ${formatBytes(size.after)}. Drift check clean.`,\n );\n const kept = keptLine(plan);\n if (kept) console.log(pc.dim(kept));\n if (!size.checkpointed) console.log(pc.dim(CHECKPOINT_PENDING));\n console.log(pc.dim(`backup (the only way back): ${backup}`));\n}\n\n/**\n * Always refuses. A reissued call is `queued`, and nothing drains a durable\n * queued row except the live pi runtime that holds the queue, so a shell\n * reissue would strand it. The tool does the whole move (start or queue).\n */\nexport async function cmdDelegatesReissue(_db: Db, callId: string, _opts: WsOpt): Promise<void> {\n throw new UsageError(\n `reissue runs inside the pi session that owns the call: use ${reissueHint(callId)} there (a shell would leave it queued with nothing to start it)`,\n { showHelp: false },\n );\n}\n\nexport function wireDelegatesCommands(program: Command): void {\n const d = program\n .command(\"delegates\")\n .description(\n \"Delegate calls as tasks: list (default), show, tally a wave. Each call is a kind=delegate task with a call id and a state (queued starting running recording done failed refused cancelled); reissue with the `mu_delegate_reissue` tool.\",\n );\n d.command(\"list\", { isDefault: true })\n .description(\"List calls: of $PI_SESSION_ID's session (else every caller), or --caller, --all\")\n .option(\"--caller <id>\", \"calls of this caller (pi:<session>)\")\n .option(\"--all\", \"every caller\")\n .option(\"--wave <label>\", \"only this wave\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).optsWithGlobals() as WsOpt & {\n caller?: string;\n wave?: string;\n all?: boolean;\n };\n return handle((db) => cmdDelegatesList(db, opts), this as Command)();\n });\n d.command(\"show <call-id>\")\n .description(\"One call: state, agent, verdict, error; its brief and report are on the task\")\n .option(...JSON_OPT)\n .action(function (callId: string) {\n const opts = (this as Command).optsWithGlobals() as WsOpt;\n return handle((db) => cmdDelegatesShow(db, callId, opts), this as Command)();\n });\n d.command(\"tally\")\n .description(\n \"One wave's verdicts grouped per judged task (CONFIRMED/REFUTED/UNVERIFIED; the rest pending), with queued, running and refused counts. One result per call; a refused call is pending until reissued\",\n )\n .requiredOption(\"--wave <label>\", \"the wave label\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).optsWithGlobals() as WsOpt & { wave?: string };\n return handle((db) => cmdDelegatesTally(db, opts), this as Command)();\n });\n d.command(\"register <call-id>\")\n .description(\n \"Create a delegate call: the kind=delegate task, its brief and the call row, in one transaction. The same id with the same request is a no-op; a changed request is refused (exit 4). The record task must exist\",\n )\n .option(\"--caller <id>\", \"the calling session (default pi:$PI_SESSION_ID)\")\n .option(\"--text <prompt>\", \"the whole prompt (`-` reads stdin)\")\n .option(\"--label <label>\", \"names the delegate\")\n .option(\"--cli <key>\", \"agent cli key\")\n .option(\"--model <id>\", \"pi --model value\")\n .option(\"--cwd <dir>\", \"start directory\")\n .option(\"--workspace\", \"own git worktree\")\n .option(\"--timeout <seconds>\", \"seconds to wait for the answer\", parsePositiveNumber)\n .option(\"--keep\", \"keep the pane after it finishes\")\n .option(\"--wave <label>\", \"group this call with the others of one fan-out\")\n .option(\"--record <ws/task>\", \"write the verdict onto this task\")\n .option(\"--state <state>\", \"admission: queued (default) | starting | refused\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (callId: string) {\n const opts = (this as Command).optsWithGlobals() as RegisterOpts;\n return handle((db) => cmdDelegatesRegister(db, callId, opts), this as Command)();\n });\n d.command(\"mark <call-id> <state>\")\n .description(\n \"Admission step, as a compare-and-set, for the pi runtime that holds the queue: starting (from queued or refused), queued (from refused: only that runtime drains it), running (from starting), refused (from queued or starting)\",\n )\n .option(\"--agent <name>\", \"the agent running it (with running)\")\n .option(\"--error <text>\", \"why (with refused)\")\n .option(...JSON_OPT)\n .action(function (callId: string, state: string) {\n const opts = (this as Command).optsWithGlobals() as WsOpt & {\n agent?: string;\n error?: string;\n };\n return handle((db) => cmdDelegatesMark(db, callId, state, opts), this as Command)();\n });\n d.command(\"finish <call-id>\")\n .description(\n \"Record the answer: the verdict note on the judged task, then the delegate's report and close, in one op group. A failed record leaves the call failed with the answer kept as its report, never done. A repeat is a no-op\",\n )\n .option(\n \"--outcome <outcome>\",\n \"done, or why not: timeout, died, error, empty, blocked, cancelled\",\n )\n .option(\"--text <text>\", \"the answer, or what is known (`-` reads stdin)\")\n .option(\"--author <name>\", \"who answered (the delegate's name)\")\n .option(\"--elapsed-ms <n>\", \"how long it ran\", parseNonNegativeInt)\n .option(\"--no-record\", \"leave the judged task alone (the call never ran)\")\n .option(...JSON_OPT)\n .action(function (callId: string) {\n const opts = (this as Command).optsWithGlobals() as WsOpt & {\n outcome?: string;\n text?: string;\n author?: string;\n elapsedMs?: number;\n record?: boolean;\n };\n return handle((db) => cmdDelegatesFinish(db, callId, opts), this as Command)();\n });\n d.command(\"run <call-id>\")\n .description(\n \"Run a queued or starting call in a foreground child `pi --mode rpc`, no mux needed: send once, wait, record verdict, report and close. No pane or agent row. SIGINT cancels; an unknown delivery is never resent.\",\n )\n .option(\"--no-keep\", \"stop the child after the answer even when the call asked for keep\")\n .option(...JSON_OPT)\n .action(function (callId: string) {\n const opts = (this as Command).optsWithGlobals() as WsOpt & { keep?: boolean };\n return handle((db) => cmdDelegatesRun(db, callId, opts), this as Command)();\n });\n d.command(\"prune\")\n .description(\n `Delete this machine's closed delegate tasks older than --older-than days (default ${PRUNE_DEFAULT_DAYS}) and their pi session files; the deletion syncs. Dry run without --yes; --yes backs up, VACUUMs, checks drift`,\n )\n .option(\"--older-than <days>\", \"age in days since the task closed\", parsePositiveNumber)\n .option(\"--yes\", \"apply (default: dry run)\")\n .option(\"-w, --workstream <name>\", \"only this workstream (default: every live one)\")\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).optsWithGlobals() as WsOpt & {\n olderThan?: number;\n yes?: boolean;\n };\n return handle((db) => cmdDelegatesPrune(db, opts), this as Command)();\n });\n d.command(\"reissue <call-id>\")\n .description(\n \"Refuses: reissue a refused call with the `mu_delegate_reissue` tool in its pi session (only that runtime can start or drain it)\",\n )\n .option(...JSON_OPT)\n .action(function (callId: string) {\n const opts = (this as Command).optsWithGlobals() as WsOpt;\n return handle((db) => cmdDelegatesReissue(db, callId, opts), this as Command)();\n });\n}\n","// mu — `mu doctor` diagnostic verb (human + --json forms).\n//\n// Reports:\n// - environment: the active mux + its ambient env facts\n// - db: tables present, schema_version, integrity (--deep: quick_check), journal_mode, foreign_keys\n// - workstream: the injected worker scope, if any (never read from the session)\n// - state: per-workstream agent / task / log counts + reconcile drift\n// - disk: state-dir vs DB reconciliation (both directions) + residue\n//\n// Read-only (the reconcile pass uses mode: \"report-only\" so polling doesn't\n// race in-flight spawns; see PENDING_PANE_PREFIX).\n\nimport { dirname } from \"node:path\";\nimport { listAgents, listLiveAgents } from \"../agents.js\";\nimport { captureDoctorCheck } from \"../capture.js\";\nimport { emitJson, injectedWorkstream } from \"../cli.js\";\nimport { planCompact } from \"../compact.js\";\nimport { CURRENT_SCHEMA_VERSION, type Db, defaultDbPath, EXPECTED_TABLES } from \"../db.js\";\nimport { checkOldDelegates } from \"../delegate-prune.js\";\nimport { checkDiskRecon, formatBytes, measureWorktreeUsage } from \"../disk-recon.js\";\nimport {\n ctlExtensionDoctorCheck,\n ctlSocketsDoctorCheck,\n type DoctorCheck,\n extensionLive,\n murmurDoctorCheck,\n} from \"../doctor-summary.js\";\nimport {\n ABANDONED_IDLE_DAYS,\n checkDormantWorkstreams,\n FINISHED_IDLE_DAYS,\n findDormantWorkstreams,\n} from \"../dormant.js\";\nimport {\n checkCheapDriftInvariant,\n checkDrift,\n DriftDetectedError,\n driftRemediation,\n formatDriftRecord,\n} from \"../drift.js\";\nimport {\n checkCloseGuards,\n checkFleetHazards,\n checkOrphanedAgents,\n checkSegmentVersion,\n checkUnpublishedOps,\n type FleetHazard,\n HazardFailError,\n} from \"../fleet-hazards.js\";\nimport { activeMux, type MuxHealth, NoMultiplexerError } from \"../mux.js\";\nimport { pc } from \"../output.js\";\nimport { type EdgeCycle, findEdgeCycles } from \"../tasks/edges.js\";\nimport { summarizeWorkstream } from \"../workstream.js\";\nimport { forgetHint } from \"./db.js\";\nimport { failureWithData } from \"./handle.js\";\n\n/** Cap on the `quick_check` lines doctor prints or reports. */\nconst INTEGRITY_LINES = 10;\n\n/**\n * Page-level integrity (`PRAGMA quick_check`), deep tier only: it reads every\n * page, so the default doctor stays cheap and says so. Anything but a lone\n * \"ok\" is a failure (exit 5, row name `integrity`).\n */\nexport function checkDbIntegrity(\n db: Db,\n deep: boolean,\n): { mode: \"deep\" | \"skipped\"; ok: boolean | null; problems: string[] } {\n if (!deep) return { mode: \"skipped\", ok: null, problems: [] };\n let lines: string[];\n try {\n lines = (db.pragma(\"quick_check\") as { quick_check: string }[]).map((r) => r.quick_check);\n } catch (err) {\n // A page too damaged to read throws instead of reporting.\n lines = [err instanceof Error ? err.message : String(err)];\n }\n const ok = lines.length === 1 && lines[0] === \"ok\";\n return { mode: \"deep\", ok, problems: ok ? [] : lines.slice(0, INTEGRITY_LINES) };\n}\n\n/** Column width for the `label : value` environment block. Wide enough\n * for the longest label any backend contributes — `$HERDR_WORKSPACE_ID`\n * at 19 — so the colons stay in one column on every mux. */\nconst LABEL_WIDTH = 19;\nconst pad = (s: string): string => s.padEnd(LABEL_WIDTH);\n\n/** Where agent state comes from: herdr on herdr, murmur otherwise. A\n * live mu extension makes murmur optional for pi agents. */\nfunction agentStateCheck(health: MuxHealth | undefined, muExtLive: boolean): DoctorCheck {\n return murmurDoctorCheck(health?.name === \"herdr\" ? \"herdr\" : \"murmur\", {\n muExtOk: muExtLive,\n });\n}\n\nfunction cycleFix(c: EdgeCycle): string {\n return `mu task unblock ${c.blocked} --by ${c.blocker} -w ${c.workstream}`;\n}\n\nfunction printCheck(label: string, check: DoctorCheck): void {\n const colour = check.status === \"ok\" ? pc.green : check.status === \"warn\" ? pc.yellow : pc.red;\n const word = check.status === \"ok\" ? \"ok\" : check.status.toUpperCase();\n console.log(` ${pad(label)}: ${colour(word)} ${pc.dim(check.detail)}`);\n}\n\n/**\n * Health of the active mux, or undefined when NO backend resolves.\n * Never throws: doctor's whole job is reporting a broken substrate,\n * so `NoMultiplexerError` here is a finding, not a failure.\n */\nasync function muxHealth(): Promise<MuxHealth | undefined> {\n try {\n return await (await activeMux()).healthCheck();\n } catch {\n return undefined;\n }\n}\n\n/** No multiplexer works here (none detected, or the forced one does not\n * answer): doctor prints its whole report first, then fails with the\n * one-line install advice, exit 5. A binary with no client attached is\n * NOT this case: detached servers start on demand. */\nfunction noMuxFailure(health: MuxHealth | undefined): NoMultiplexerError | null {\n if (health?.ok === true) return null;\n return new NoMultiplexerError(health === undefined ? [\"tmux\", \"herdr\"] : [health.name]);\n}\n\n/** Render a hazard list as doctor rows plus a remediation block per\n * non-ok finding. Shared by the fleet and disk sections, which differ\n * only in what they check. Returns true iff anything needs attention. */\nfunction printHazards(hazards: readonly FleetHazard[]): boolean {\n let sawProblem = false;\n for (const hazard of hazards) {\n const colour =\n hazard.severity === \"fail\" ? pc.red : hazard.severity === \"warn\" ? pc.yellow : pc.green;\n const label = hazard.severity === \"ok\" ? \"ok\" : hazard.severity.toUpperCase();\n console.log(` ${hazard.name.padEnd(16)} : ${colour(label)} ${pc.dim(hazard.detail)}`);\n if (hazard.severity !== \"ok\") sawProblem = true;\n }\n for (const hazard of hazards) {\n if (hazard.severity === \"ok\" || hazard.remediation === undefined) continue;\n console.log(\"\");\n for (const line of hazard.remediation) console.log(` ${line}`);\n }\n return sawProblem;\n}\n\nexport async function cmdDoctor(\n db: Db,\n opts: { json?: boolean; deep?: boolean; disk?: boolean } = {},\n): Promise<void> {\n if (opts.json) {\n return cmdDoctorJson(db, opts);\n }\n console.log(pc.bold(\"mu doctor\"));\n\n // ─ Environment\n //\n // The backend reports DATA (name / version / its own env facts);\n // doctor owns every string below. A second mux with different\n // ambient vars needs no change here.\n console.log(pc.bold(\"\\nenvironment\"));\n const health = await muxHealth();\n if (health === undefined) {\n console.log(` multiplexer : ${pc.red(\"NONE\")} — install tmux ≥ 3.0`);\n } else {\n const label = pad(health.name);\n if (health.ok) console.log(` ${label}: ${pc.green(\"ok\")} (${health.version ?? \"?\"})`);\n else console.log(` ${label}: ${pc.red(\"NOT FOUND\")} — ${health.remediation}`);\n for (const fact of health.env) {\n console.log(` ${pad(fact.name)}: ${fact.value ? pc.green(fact.value) : pc.dim(\"not set\")}`);\n }\n }\n const ctlSockets = await ctlSocketsDoctorCheck(listAgents(db), { stateDir: dirname(db.name) });\n const muExt = ctlExtensionDoctorCheck(ctlSockets.agents);\n printCheck(\"agent state\", agentStateCheck(health, extensionLive(ctlSockets.agents)));\n printCheck(\"mu ext\", muExt);\n printCheck(\"ctl\", ctlSockets.check);\n\n // ─ DB + schema\n console.log(pc.bold(\"\\ndb\"));\n console.log(` path : ${pc.dim(defaultDbPath())}`);\n let integrityFailed = false;\n try {\n const tables = (\n db\n .prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name\",\n )\n .all() as { name: string }[]\n ).map((r) => r.name);\n const missing = EXPECTED_TABLES.filter((t) => !tables.includes(t));\n if (missing.length === 0) {\n console.log(` schema : ${pc.green(\"ok\")} (${EXPECTED_TABLES.length} tables)`);\n } else {\n console.log(` schema : ${pc.red(\"missing\")} — ${missing.join(\", \")}`);\n }\n // Schema version: openDb refuses any DB older or newer than\n // CURRENT_SCHEMA_VERSION (SchemaTooOldError / SchemaTooNewError,\n // exit 4; there is no migration ladder). A mismatch here means the\n // row changed after open, e.g. an external SQLite client.\n try {\n const row = db.prepare(\"SELECT version FROM schema_version WHERE id = 1\").get() as\n | { version: number }\n | undefined;\n const v = row?.version;\n if (v === undefined) {\n console.log(\n ` schema_version : ${pc.red(\"missing row\")} (expected ${CURRENT_SCHEMA_VERSION})`,\n );\n } else if (v === CURRENT_SCHEMA_VERSION) {\n console.log(` schema_version : ${pc.green(String(v))}`);\n } else if (v < CURRENT_SCHEMA_VERSION) {\n console.log(\n ` schema_version : ${pc.yellow(String(v))} (code expects ${CURRENT_SCHEMA_VERSION}; openDb refuses older DBs, so the row changed after open)`,\n );\n } else {\n console.log(\n ` schema_version : ${pc.red(String(v))} (code expects ${CURRENT_SCHEMA_VERSION}; possible downgrade or future-version DB)`,\n );\n }\n } catch {\n console.log(\n ` schema_version : ${pc.red(\"unreadable\")} (schema_version table missing or wrong shape)`,\n );\n }\n const integrity = checkDbIntegrity(db, opts.deep === true);\n if (integrity.mode === \"skipped\") {\n console.log(\n ` integrity : ${pc.dim(\"skipped (run `mu doctor --deep` for PRAGMA quick_check)\")}`,\n );\n } else if (integrity.ok) {\n console.log(` integrity : ${pc.green(\"ok\")} (quick_check)`);\n } else {\n integrityFailed = true;\n console.log(` integrity : ${pc.red(\"FAIL\")} (quick_check)`);\n for (const line of integrity.problems) console.log(` ${line}`);\n }\n const capture = captureDoctorCheck(db);\n const paint =\n capture.status === \"ok\" ? pc.green : capture.status === \"warn\" ? pc.yellow : pc.red;\n console.log(` capture : ${paint(capture.status)} (${capture.detail})`);\n const journal = db.pragma(\"journal_mode\", { simple: true });\n console.log(\n ` journal_mode : ${journal === \"wal\" ? pc.green(String(journal)) : pc.yellow(String(journal))}`,\n );\n const fk = db.pragma(\"foreign_keys\", { simple: true });\n console.log(` foreign_keys : ${fk === 1 ? pc.green(\"on\") : pc.red(`off (${fk})`)}`);\n } catch (err) {\n console.log(\n ` schema : ${pc.red(\"FAIL\")} — ${err instanceof Error ? err.message : err}`,\n );\n }\n\n // ─ Workstream (doctor is machine-wide; per-workstream stats only for a\n // managed worker's injected scope; nothing is read from the session)\n console.log(pc.bold(\"\\nworkstream\"));\n const currentWorkstream: string | null = injectedWorkstream() ?? null;\n if (currentWorkstream !== null) {\n console.log(` current : ${pc.green(currentWorkstream)}`);\n } else {\n console.log(\n ` current : ${pc.dim(\"none\")} (doctor reads the whole machine; pass nothing, or use mu state -w <name>)`,\n );\n }\n\n // ─ Per-workstream stats (current only; --all stretch)\n if (currentWorkstream) {\n const ws = currentWorkstream;\n console.log(pc.bold(`\\nstate (workstream=${ws})`));\n const summary = await summarizeWorkstream(db, { workstream: ws });\n const counts = {\n agents: summary.agentCount,\n tasks: summary.taskCount,\n ready: countReady(db, ws),\n blocked: countBlocked(db, ws),\n inProgress: countInProgressByWorkstream(db, ws),\n logs: countLogsByWorkstream(db, ws),\n };\n console.log(` agents : ${counts.agents}`);\n console.log(\n ` tasks : ${counts.tasks} (ready ${counts.ready}, blocked ${counts.blocked}, in-progress ${counts.inProgress})`,\n );\n console.log(` ops rows : ${counts.logs}`);\n\n // Reconciliation: ghost detection (DB rows with dead panes) + orphans.\n // mu doctor is diagnostic — mode: \"report-only\" so it never\n // deletes rows AND never writes to the DB / tmux titles just for\n // being polled (would race in-flight spawns; see\n // PENDING_PANE_PREFIX).\n try {\n const view = await listLiveAgents(db, { workstream: ws, mode: \"report-only\" });\n const ghosts = view.report.prunedGhosts;\n const ghostNote =\n ghosts > 0\n ? pc.yellow(\n `${ghosts} ghost pane${ghosts === 1 ? \"\" : \"s\"} would be reaped by \\`mu state\\` or \\`mu agent list\\``,\n )\n : pc.green(\"none\");\n console.log(` ghosts : ${ghostNote}`);\n const orphanColor = view.orphans.length > 0 ? pc.yellow : pc.green;\n console.log(\n ` orphan panes : ${orphanColor(String(view.orphans.length))}${view.orphans.length > 0 ? pc.dim(\" (run `mu agent list` to see them)\") : \"\"}`,\n );\n } catch (err) {\n console.log(\n ` reconcile : ${pc.dim(\"skipped\")} (${err instanceof Error ? err.message : err})`,\n );\n }\n }\n\n // ─ Mixed-fleet hazards (cheap: two path compares, one statfs, one scan)\n //\n // These run in the DEFAULT doctor because they are cheap AND\n // PREVENTABLE — each one is a condition the operator can fix before it\n // costs them data, unlike drift which is a bug report.\n console.log(pc.bold(\"\\nfleet\"));\n const fleet = [\n ...checkFleetHazards(db, { dbPath: defaultDbPath() }),\n checkSegmentVersion(db, process.env.MU_SYNC_DIR),\n checkUnpublishedOps(db, process.env.MU_SYNC_DIR),\n checkOrphanedAgents(db),\n ];\n let sawHazard = printHazards(fleet);\n\n // Sync can merge states the local close guards refuse (open blockers\n // under a done task, a close with no evidence note). Warn rows only.\n console.log(pc.bold(\"\\nclose guards\"));\n if (printHazards(checkCloseGuards(db))) sawHazard = true;\n\n // Sync can merge two valid edges into a cycle; its members block each\n // other until one closes. Report-only: the fix is an existing verb.\n console.log(pc.bold(\"\\ndag\"));\n const cycles = findEdgeCycles(db);\n if (cycles.length === 0) {\n console.log(` ${\"cycles\".padEnd(16)} : ${pc.green(\"ok\")} ${pc.dim(\"no dependency cycles\")}`);\n } else {\n sawHazard = true;\n console.log(\n ` ${\"cycles\".padEnd(16)} : ${pc.yellow(\"WARN\")} ${pc.dim(`${cycles.length} dependency cycle(s); members block each other until one closes. Applying every fix below breaks them all`)}`,\n );\n for (const c of cycles) {\n console.log(` ${c.workstream}: ${[...c.path, c.path[0]].join(\" -> \")}`);\n console.log(pc.dim(` break it: ${cycleFix(c)}`));\n }\n }\n\n // ─ Housekeeping: workstreams that look torn-down-able\n //\n // Deliberately its own section rather than a `fleet` row: fleet is\n // about a MIXED FLEET corrupting itself, and this is about a single\n // box accumulating finished work. Severity is always `ok`, so this\n // never contributes to `sawHazard` — a tidy-up opportunity is not a\n // fault, and treating it as one would make doctor cry wolf forever.\n console.log(pc.bold(\"\\nhousekeeping\"));\n const dormant = checkDormantWorkstreams(db, { currentWorkstream });\n console.log(\n ` ${dormant.name.padEnd(16)} : ${dormant.severity === \"ok\" && dormant.remediation === undefined ? pc.green(\"ok\") : pc.yellow(\"note\")} ${pc.dim(dormant.detail)}`,\n );\n // Printed directly rather than through `printHazards`, which shows a\n // remediation block only for non-`ok` findings. This finding is\n // deliberately `ok` AND has the names — which are the entire point of\n // the row — in its remediation, so routing it through that helper\n // would report a count and withhold the list.\n if (dormant.remediation !== undefined) {\n console.log(\"\");\n for (const line of dormant.remediation) console.log(` ${line}`);\n }\n const oldDelegates = checkOldDelegates(db);\n console.log(\n ` ${oldDelegates.name.padEnd(16)} : ${oldDelegates.remediation === undefined ? pc.green(\"ok\") : pc.yellow(\"note\")} ${pc.dim(oldDelegates.detail)}`,\n );\n if (oldDelegates.remediation !== undefined) {\n console.log(\"\");\n for (const line of oldDelegates.remediation) console.log(` ${line}`);\n }\n\n // ─ Disk ↔ DB reconciliation\n //\n // The only section that reads the filesystem. Default tier is readdir\n // + stat (~1ms); recursive byte accounting is --disk, because its cost\n // scales with the worktrees rather than with mu's state.\n console.log(pc.bold(\"\\ndisk\"));\n const disk = checkDiskRecon(db);\n if (printHazards(disk)) sawHazard = true;\n if (opts.disk === true) {\n const usage = measureWorktreeUsage(db);\n const total = usage.reduce((n, u) => n + u.bytes, 0);\n const reclaimable = usage.filter((u) => u.orphan).reduce((n, u) => n + u.bytes, 0);\n console.log(\n `\\n ${\"worktree bytes\".padEnd(16)} : ${formatBytes(total)} across ${usage.length} worktree(s)${\n reclaimable > 0 ? pc.yellow(` — ${formatBytes(reclaimable)} in orphan dirs`) : \"\"\n }`,\n );\n for (const u of usage) {\n const tag = u.orphan ? pc.yellow(\" orphan\") : \"\";\n console.log(\n ` ${formatBytes(u.bytes).padStart(6)} ${u.workstreamName}/${u.agentName}${tag}`,\n );\n }\n } else {\n console.log(\n pc.dim(\" (run `mu doctor --disk` for per-worktree byte usage — walks every worktree)\"),\n );\n }\n\n // ─ Ops-log drift\n //\n // TIERED ON PURPOSE. The full rebuild-and-diff is ~0.6ms per op\n // (measured: 2.2s on a 1000-task / 3461-op DB), which is too slow to\n // put in a reflexively-run command. So the default runs a ~1ms\n // invariant and points at --deep; --deep runs the real thing.\n console.log(pc.bold(\"\\nops log\"));\n if (opts.deep === true) {\n const report = checkDrift(db);\n const compared = Object.entries(report.rowsCompared)\n .map(([t, n]) => `${n} ${t}`)\n .join(\", \");\n if (report.clean) {\n console.log(\n ` drift : ${pc.green(\"ok\")} ${pc.dim(`rebuild matches live tables (${compared}, ${report.elapsedMs}ms)`)}`,\n );\n } else {\n console.log(\n ` drift : ${pc.red(\"FAIL\")} ${report.totalDrift} divergence(s) ${pc.dim(`(${report.elapsedMs}ms)`)}`,\n );\n for (const record of report.records) console.log(` ${formatDriftRecord(record)}`);\n if (report.totalDrift > report.records.length) {\n console.log(pc.dim(` … and ${report.totalDrift - report.records.length} more`));\n }\n console.log(\"\");\n for (const line of driftRemediation()) console.log(` ${line}`);\n // Non-zero exit so CI and wrapper scripts notice. Thrown last so\n // the whole report is printed first.\n throw new DriftDetectedError(report.totalDrift, report.records);\n }\n } else {\n const cheap = checkCheapDriftInvariant(db);\n if (cheap.clean) {\n console.log(\n ` drift (shallow) : ${pc.green(\"ok\")} ${pc.dim(`every live row has ops (${cheap.elapsedMs}ms) — run \\`mu doctor --deep\\` for the full rebuild diff`)}`,\n );\n } else {\n console.log(\n ` drift (shallow) : ${pc.red(\"FAIL\")} ${cheap.totalUnexplained} row(s) with NO ops explaining their existence`,\n );\n for (const row of cheap.unexplainedRows) {\n console.log(` ${row.table} ${row.key}: no op names this key`);\n }\n console.log(pc.dim(\" capture missed these rows entirely. Run `mu doctor --deep`.\"));\n console.log(\"\");\n for (const line of driftRemediation()) console.log(` ${line}`);\n throw new DriftDetectedError(cheap.totalUnexplained, []);\n }\n }\n const size = opsSizeHint(db);\n if (size) {\n console.log(` size : ${pc.yellow(\"hint\")} ${size.line}`);\n for (const c of size.commands) console.log(pc.dim(` ${c}`));\n }\n if (sawHazard) {\n console.log(\n pc.dim(\"\\nSee the fleet / disk sections above: at least one finding needs attention.\"),\n );\n }\n // A `fail` row (today: the DB inside MU_SYNC_DIR) is a hard failure,\n // not a hint, so it exits non-zero like drift. Thrown last so the\n // whole report is printed first.\n const failed = failedHazardNames([...fleet, ...disk]);\n if (integrityFailed) failed.push(\"integrity\");\n if (failed.length > 0) throw new HazardFailError(failed);\n const noMux = noMuxFailure(health);\n if (noMux !== null) throw noMux;\n}\n\n/** Names of the `fail`-severity rows, the ones that make doctor exit 5. */\nfunction failedHazardNames(hazards: readonly { name: string; severity: string }[]): string[] {\n return hazards.filter((h) => h.severity === \"fail\").map((h) => h.name);\n}\n\n/** The ops-log size hint: torn-down history worth forgetting, largest\n * first, and redundant tombstones worth compacting. Undefined when\n * neither is worth a line. */\nfunction opsSizeHint(db: Db): { line: string; commands: string[] } | undefined {\n const forgettable = forgetHint(db);\n const tomb = planCompact(db);\n const parts: string[] = [];\n const commands: string[] = [];\n if (forgettable) {\n parts.push(\n `${forgettable.total} torn-down workstreams hold ${forgettable.ops} ops (${formatBytes(forgettable.bytes)}); largest: ${forgettable.top.join(\", \")}`,\n );\n commands.push(\n \"see them: mu workstream list --torn-down\",\n `forget some: mu db forget ${forgettable.top.join(\" \")}`,\n );\n }\n if (tomb.bytes >= 1024 * 1024) {\n parts.push(`${tomb.tombstones} redundant note tombstones (${formatBytes(tomb.bytes)})`);\n commands.push(\"compact: mu db compact\");\n }\n return parts.length === 0 ? undefined : { line: parts.join(\"; \"), commands };\n}\n\n/**\n * JSON form of `mu doctor`. Same checks the human form runs, collected\n * into a single structured record for piping. Surfaces 'ok' / 'warn' /\n * 'fail' for each subsystem so callers can match on a single field.\n */\nexport async function cmdDoctorJson(\n db: Db,\n opts: { deep?: boolean; disk?: boolean } = {},\n): Promise<void> {\n // environment\n const health = await muxHealth();\n const ctlSockets = await ctlSocketsDoctorCheck(listAgents(db), { stateDir: dirname(db.name) });\n const muExt = ctlExtensionDoctorCheck(ctlSockets.agents);\n const env = {\n // `mux` is the backend-agnostic key. `tmux` is kept as an alias for\n // back-compat with scripts that grew around the pre-MuxBackend\n // shape; it reports the ACTIVE backend, whatever it is.\n mux: health ?? { name: null, ok: false, version: null },\n tmux: { ok: health?.ok ?? false, version: health?.version ?? null },\n ...Object.fromEntries(health?.env.map((f) => [f.name.replace(/^\\$/, \"\"), f.value]) ?? []),\n agentState: agentStateCheck(health, extensionLive(ctlSockets.agents)),\n ctl: { extension: muExt, sockets: ctlSockets.check, agents: ctlSockets.agents },\n };\n\n // db / schema\n let dbReport: Record<string, unknown>;\n let integrity: ReturnType<typeof checkDbIntegrity> | undefined;\n try {\n const tables = (\n db\n .prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name\",\n )\n .all() as { name: string }[]\n ).map((r) => r.name);\n const missing = EXPECTED_TABLES.filter((t) => !tables.includes(t));\n let schemaVersion: number | null = null;\n let schemaVersionStatus: \"ok\" | \"missing\" | \"stale\" | \"future\" | \"unreadable\";\n try {\n const row = db.prepare(\"SELECT version FROM schema_version WHERE id = 1\").get() as\n | { version: number }\n | undefined;\n const v = row?.version;\n if (v === undefined) schemaVersionStatus = \"missing\";\n else {\n schemaVersion = v;\n if (v === CURRENT_SCHEMA_VERSION) schemaVersionStatus = \"ok\";\n else if (v < CURRENT_SCHEMA_VERSION) schemaVersionStatus = \"stale\";\n else schemaVersionStatus = \"future\";\n }\n } catch {\n schemaVersionStatus = \"unreadable\";\n }\n const journal = db.pragma(\"journal_mode\", { simple: true });\n const fk = db.pragma(\"foreign_keys\", { simple: true });\n integrity = checkDbIntegrity(db, opts.deep === true);\n dbReport = {\n path: defaultDbPath(),\n schema: { ok: missing.length === 0, expected: EXPECTED_TABLES, missing, present: tables },\n schemaVersion: {\n value: schemaVersion,\n expected: CURRENT_SCHEMA_VERSION,\n status: schemaVersionStatus,\n },\n integrity,\n journalMode: journal,\n foreignKeys: fk === 1,\n };\n } catch (err) {\n dbReport = { error: err instanceof Error ? err.message : String(err) };\n }\n\n // workstream\n const currentWorkstream: string | null = injectedWorkstream() ?? null;\n\n // per-workstream stats (only when resolvable)\n let workstreamStats: Record<string, unknown> | null = null;\n if (currentWorkstream) {\n const ws = currentWorkstream;\n const summary = await summarizeWorkstream(db, { workstream: ws });\n const counts = {\n agents: summary.agentCount,\n tasks: summary.taskCount,\n ready: countReady(db, ws),\n blocked: countBlocked(db, ws),\n inProgress: countInProgressByWorkstream(db, ws),\n logs: countLogsByWorkstream(db, ws),\n };\n let reconcile: Record<string, unknown> | null = null;\n try {\n // mu doctor --json: report-only for the same reason as the human path.\n const view = await listLiveAgents(db, { workstream: ws, mode: \"report-only\" });\n reconcile = {\n prunedGhosts: view.report.prunedGhosts,\n orphanCount: view.orphans.length,\n };\n } catch (err) {\n reconcile = { skipped: true, reason: err instanceof Error ? err.message : String(err) };\n }\n workstreamStats = { workstreamName: ws, ...counts, reconcile };\n }\n\n // Mixed-fleet hazards: same three checks the human path runs.\n const hazards = [\n ...checkFleetHazards(db, { dbPath: defaultDbPath() }),\n checkSegmentVersion(db, process.env.MU_SYNC_DIR),\n checkUnpublishedOps(db, process.env.MU_SYNC_DIR),\n checkOrphanedAgents(db),\n ].map((h) => ({\n name: h.name,\n severity: h.severity,\n detail: h.detail,\n }));\n\n const closeGuards = checkCloseGuards(db).map((h) => ({\n name: h.name,\n severity: h.severity,\n detail: h.detail,\n remediation: h.remediation ?? [],\n }));\n const dagCycles = findEdgeCycles(db).map((c) => ({ ...c, fix: cycleFix(c) }));\n\n // Disk ↔ DB: same checks as the human path. Remediation lines ride\n // along here (unlike `fleet`, which drops them) because the whole\n // point of the section is that an agent reading --json can act on it.\n const disk = checkDiskRecon(db).map((h) => ({\n name: h.name,\n severity: h.severity,\n detail: h.detail,\n remediation: h.remediation ?? [],\n }));\n\n // Housekeeping: the dormant list, with its rows STRUCTURED rather\n // than only prose. An agent reading --json should be able to pick a\n // name without parsing the remediation block, and the `kind` field is\n // the whole finding — `finished` is safe to tear down, `abandoned`\n // needs a look first.\n const dormantHazard = checkDormantWorkstreams(db, { currentWorkstream });\n const housekeeping = {\n dormantWorkstreams: {\n name: dormantHazard.name,\n severity: dormantHazard.severity,\n detail: dormantHazard.detail,\n remediation: dormantHazard.remediation ?? [],\n workstreams: findDormantWorkstreams(db, { currentWorkstream }),\n thresholds: { finishedIdleDays: FINISHED_IDLE_DAYS, abandonedIdleDays: ABANDONED_IDLE_DAYS },\n },\n oldDelegates: (() => {\n const h = checkOldDelegates(db);\n return {\n name: h.name,\n severity: h.severity,\n detail: h.detail,\n remediation: h.remediation ?? [],\n };\n })(),\n };\n const worktreeUsage = opts.disk === true ? measureWorktreeUsage(db) : null;\n\n // Drift: shallow by default, full rebuild diff under --deep. Same\n // tiering as the human path, for the same measured reason.\n let drift: Record<string, unknown>;\n let driftFailure: DriftDetectedError | null = null;\n if (opts.deep === true) {\n const report = checkDrift(db);\n drift = {\n mode: \"deep\",\n ok: report.clean,\n totalDrift: report.totalDrift,\n records: report.records,\n rowsCompared: report.rowsCompared,\n elapsedMs: report.elapsedMs,\n };\n if (!report.clean) driftFailure = new DriftDetectedError(report.totalDrift, report.records);\n } else {\n const cheap = checkCheapDriftInvariant(db);\n drift = {\n mode: \"shallow\",\n ok: cheap.clean,\n totalUnexplained: cheap.totalUnexplained,\n unexplainedRows: cheap.unexplainedRows,\n elapsedMs: cheap.elapsedMs,\n hint: \"run `mu doctor --deep --json` for the full rebuild diff\",\n };\n if (!cheap.clean) driftFailure = new DriftDetectedError(cheap.totalUnexplained, []);\n }\n\n const report = {\n environment: env,\n db: dbReport,\n workstream: { currentName: currentWorkstream },\n state: workstreamStats,\n fleet: hazards,\n housekeeping,\n closeGuards,\n dagCycles,\n disk,\n worktreeUsage,\n drift,\n size: opsSizeHint(db) ?? null,\n remediation: drift.ok === true ? [] : driftRemediation(),\n };\n // ONE document per invocation: a clean report is the success envelope; a\n // failing one is the failure envelope with the same report in `data`, so a\n // --json consumer still gets the integrity facts beside the non-zero exit.\n const failed = failedHazardNames([...hazards, ...disk]);\n if (integrity?.ok === false) failed.push(\"integrity\");\n const failure =\n driftFailure ?? (failed.length > 0 ? new HazardFailError(failed) : noMuxFailure(health));\n if (failure !== null) throw failureWithData(failure, report);\n emitJson(report);\n}\n\n// agents/tasks counts come from summarizeWorkstream() (src/workstream.ts) —\n// it already runs the same JOIN-on-workstreams SELECTs for its summary, so\n// we don't keep a second copy of those queries here. The four helpers below\n// (in-progress / logs / ready / blocked) are doctor-only views that\n// summarizeWorkstream doesn't expose.\nfunction countInProgressByWorkstream(db: Db, workstream: string): number {\n return (\n db\n .prepare(\n `SELECT COUNT(*) AS n FROM tasks t\n JOIN workstreams ws ON ws.id = t.workstream_id\n WHERE ws.name = ? AND t.status = 'IN_PROGRESS'`,\n )\n .get(workstream) as { n: number }\n ).n;\n}\nfunction countLogsByWorkstream(db: Db, workstream: string): number {\n return (\n db\n .prepare(\n // ops.key is the natural key ('' = machine-wide), so no join.\n // The workstream's own ops have key = <ws>; its tasks, notes and\n // edges all start with '<ws>/' (src/capture.ts § Natural keys).\n // A range, not LIKE: '_' in a workstream name is a LIKE wildcard,\n // and '0' is the byte after '/'.\n \"SELECT COUNT(*) AS n FROM ops WHERE key = ? OR (key >= ? AND key < ?)\",\n )\n .get(workstream, `${workstream}/`, `${workstream}0`) as { n: number }\n ).n;\n}\nfunction countReady(db: Db, workstream: string): number {\n return (\n db\n .prepare(\n `SELECT COUNT(*) AS n FROM ready v\n JOIN workstreams ws ON ws.id = v.workstream_id\n WHERE ws.name = ?`,\n )\n .get(workstream) as { n: number }\n ).n;\n}\nfunction countBlocked(db: Db, workstream: string): number {\n return (\n db\n .prepare(\n `SELECT COUNT(*) AS n FROM blocked v\n JOIN workstreams ws ON ws.id = v.workstream_id\n WHERE ws.name = ?`,\n )\n .get(workstream) as { n: number }\n ).n;\n}\n\n// ─── commander wiring ────────────────────────────────────────────────\n//\n// wireDoctorCommand is called by buildProgram() in src/cli.ts. Wired here so\n// every per-namespace builder lives next to its cmd functions.\n\nimport type { Command } from \"commander\";\nimport { handle, JSON_OPT } from \"../cli.js\";\n\nexport function wireDoctorCommand(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"Environment + state health check\")\n .option(...JSON_OPT)\n .option(\n \"--deep\",\n \"also run PRAGMA quick_check, and rebuild the ops log into a temp DB and diff it against the live tables (slower: ~0.6ms per op)\",\n )\n .option(\n \"--disk\",\n \"also measure per-worktree disk usage (walks every worktree; the disk↔DB reconciliation itself always runs)\",\n )\n .action(function () {\n const opts = (this as Command).opts() as { json?: boolean; deep?: boolean; disk?: boolean };\n return handle((db) => cmdDoctor(db, opts), this as Command)();\n });\n}\n","// Doctor check helpers shared by `mu doctor` (src/cli/doctor.ts): the check\n// row shape, the murmur / pi-extension / ctl-socket probes and the version\n// helpers behind them.\n\nimport { accessSync, constants, existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { delimiter, dirname, join, parse } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { murmurAvailable, UNKNOWN_REASON } from \"./agent-state.js\";\nimport { type AgentRow, expectsCtl } from \"./agents.js\";\nimport { type CtlProbe, ctlProbe } from \"./ctl/client.js\";\nimport { ctlSocketPath } from \"./ctl/path.js\";\nimport { CTL_OPS } from \"./ctl/protocol.js\";\n\nexport type DoctorStatus = \"ok\" | \"warn\" | \"fail\";\n\nexport interface DoctorCheck {\n /** Short, stable identifier — the row label. */\n name: string;\n status: DoctorStatus;\n /** Free-form prose for the row's right-hand column. */\n detail: string;\n}\n\nfunction resolveExecutable(name: string): string | null {\n for (const dir of (process.env.PATH ?? \"\").split(delimiter).filter(Boolean)) {\n const candidate = join(dir, name);\n try {\n accessSync(candidate, constants.X_OK);\n return realpathSync(candidate);\n } catch {\n // Keep scanning PATH.\n }\n }\n return null;\n}\n\nfunction murmurVersion(executable: string): string | null {\n let dir = dirname(executable);\n const root = parse(dir).root;\n while (dir !== root) {\n const packagePath = join(dir, \"package.json\");\n if (existsSync(packagePath)) {\n try {\n const pkg: unknown = JSON.parse(readFileSync(packagePath, \"utf8\"));\n if (\n typeof pkg === \"object\" &&\n pkg !== null &&\n \"name\" in pkg &&\n pkg.name === \"@mu-crew/murmur\" &&\n \"version\" in pkg &&\n typeof pkg.version === \"string\"\n ) {\n return pkg.version;\n }\n } catch {\n // An unrelated or unreadable package.json does not end the walk.\n }\n }\n dir = dirname(dir);\n }\n return null;\n}\n\nfunction olderThanMurmurOne(version: string): boolean {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(version);\n return match !== null && Number(match[1]) < 1;\n}\n\n/** Detail of the murmur row when murmur is absent but pi agents are\n * covered by the mu extension's control socket. */\nexport const MURMUR_NOT_NEEDED_DETAIL =\n \"not needed for pi agents (mu extension); used for other CLIs\";\n\n/**\n * The agent-state source row. Shared by the TUI card and `mu doctor`.\n * `muExtOk`: a pi agent's live hello answered (never a file on disk), so\n * pi agents report state over their control socket and a missing murmur only affects other CLIs.\n */\nexport function murmurDoctorCheck(\n agentStateSource: \"murmur\" | \"herdr\",\n opts: { muExtOk?: boolean } = {},\n): DoctorCheck {\n if (agentStateSource === \"herdr\") {\n return { name: \"murmur\", status: \"ok\", detail: \"agent state from herdr\" };\n }\n\n const executable = resolveExecutable(\"murmur\");\n if (opts.muExtOk === true && (executable === null || !murmurAvailable())) {\n return { name: \"murmur\", status: \"ok\", detail: MURMUR_NOT_NEEDED_DETAIL };\n }\n if (executable === null) {\n return {\n name: \"murmur\",\n status: \"warn\",\n detail: `${UNKNOWN_REASON.murmurMissing}: agent state shows unknown`,\n };\n }\n if (!murmurAvailable()) {\n return {\n name: \"murmur\",\n status: \"warn\",\n detail: `${UNKNOWN_REASON.extensionMissing}: run murmur link pi`,\n };\n }\n\n const version = murmurVersion(executable);\n if (version !== null && olderThanMurmurOne(version)) {\n return {\n name: \"murmur\",\n status: \"warn\",\n detail:\n opts.muExtOk === true\n ? `murmur ${version} is older than 1.0.0; idle/stall timing unknown for non-pi CLIs (pi agents use ctl)`\n : `murmur ${version} is older than 1.0.0; @murmur_pane_since missing, idle/stall timing unknown`,\n };\n }\n return {\n name: \"murmur\",\n status: \"ok\",\n detail: version === null ? \"agent state from murmur\" : `agent state from murmur ${version}`,\n };\n}\n\n/** What to run when no live extension answers: the package is the only install path. */\nexport const INSTALL_ADVICE = \"pi install npm:@mu-crew/mu, then restart pi\";\n\n/** A pi agent answered hello: the only proof the extension is loaded. */\nexport function extensionLive(reports: readonly AgentCtlReport[]): boolean {\n return reports.some((r) => r.probe === \"ok\");\n}\n\n/**\n * The \"mu ext\" row, from the live ctl probes of the pi agents `mu doctor`\n * just asked (hello's extVersion / ops / features). Never inferred from a\n * file on disk. With no agent to ask the extension is UNKNOWN, not\n * missing, and the row stays ok: a fresh install must not warn. hello\n * cannot prove a skill was loaded, so there is no skill row.\n */\nexport function ctlExtensionDoctorCheck(reports: readonly AgentCtlReport[]): DoctorCheck {\n const live = reports.find((r) => r.probe === \"ok\");\n if (live) {\n const features = live.features?.length ? `; ${live.features.join(\", \")}` : \"\";\n const ops = live.opCount === undefined ? \"\" : `, ${live.opCount} ops`;\n return {\n name: \"mu ext\",\n status: \"ok\",\n detail: `${live.extVersion ?? \"from source\"} (ctl${ops}${features})`,\n };\n }\n if (reports.length === 0) {\n return {\n name: \"mu ext\",\n status: \"ok\",\n detail: `unknown: no pi agent running to ask (${INSTALL_ADVICE})`,\n };\n }\n return { name: \"mu ext\", status: \"warn\", detail: `no pi agent answered: ${INSTALL_ADVICE}` };\n}\n\n/** Per-agent probe budget for the doctor \"ctl\" row. */\nexport const DOCTOR_CTL_TIMEOUT_MS = 500;\n\nexport interface AgentCtlReport {\n workstream: string;\n agent: string;\n socket: string;\n probe: CtlProbe[\"kind\"];\n /** ok probes: the mu version the agent's extension was built from. */\n extVersion?: string;\n /** ok probes whose extension is older than the installed mu, or lacks ops. */\n outdated?: boolean;\n /** ok probes: how many ops hello lists. */\n opCount?: number;\n /** ok probes: the optional features hello lists. */\n features?: string[];\n /** ok probes: protocol ops (CTL_OPS) the extension's hello does not list. */\n missingOps?: string[];\n /** Outdated probes: how `/reload` reaches it. \"ctl\" when the extension\n * serves op command, else \"respawn\" (mu cannot reload it). */\n reloadVia?: \"ctl\" | \"respawn\";\n}\n\n/**\n * The installed mu version, from the package.json one directory above\n * this module (src/ in source mode, dist/ when bundled). Null if unreadable.\n */\nexport function installedMuVersion(): string | null {\n try {\n const pkgPath = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg: unknown = JSON.parse(readFileSync(pkgPath, \"utf8\"));\n const v =\n typeof pkg === \"object\" && pkg !== null ? (pkg as { version?: unknown }).version : null;\n return typeof v === \"string\" ? v : null;\n } catch {\n return null;\n }\n}\n\n/** a < b on the numeric major.minor.patch prefix; false when either is unparsable. */\nexport function versionOlder(a: string, b: string): boolean {\n const pa = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(a);\n const pb = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(b);\n if (!pa || !pb) return false;\n for (let i = 1; i <= 3; i++) {\n const d = Number(pa[i]) - Number(pb[i]);\n if (d !== 0) return d < 0;\n }\n return false;\n}\n\n/**\n * Is an ok probe's extension older than the installed mu? An extension\n * without `ops` in hello predates version reporting, so it is older. One\n * with ops but no extVersion runs from source (tests, dev): not flagged.\n * Missing ops are checked separately (`probeMissingOps`), because a pi that\n * loaded the extension before an op landed reports the SAME version.\n */\nfunction probeOutdated(probe: CtlProbe, installed: string | null): boolean {\n if (probe.kind !== \"ok\") return false;\n if (probe.ops === undefined) return true;\n if (probe.extVersion === undefined || installed === null) return false;\n return versionOlder(probe.extVersion, installed);\n}\n\n/** CTL_OPS entries an ok probe's hello does not list; [] when it predates ops. */\nfunction probeMissingOps(probe: CtlProbe): string[] {\n if (probe.kind !== \"ok\" || probe.ops === undefined) return [];\n const served = new Set<string>(probe.ops);\n return CTL_OPS.filter((op) => !served.has(op));\n}\n\n/**\n * The \"ctl\" row: probe the control socket of every agent that runs pi\n * (per `expectsCtl`, the rule send, state and abort use). `stateDir`\n * roots the derived socket path like spawn's (the DB's directory); it\n * defaults to ctlSocketPath's env-derived base. Probes run in\n * parallel, each bounded by `timeoutMs`. Async, so `mu doctor` only:\n * the TUI's per-tick summary stays synchronous and socket-free.\n */\nexport async function ctlSocketsDoctorCheck(\n agents: readonly AgentRow[],\n opts: { timeoutMs?: number; installedVersion?: string | null; stateDir?: string } = {},\n): Promise<{ check: DoctorCheck; agents: AgentCtlReport[] }> {\n const timeoutMs = opts.timeoutMs ?? DOCTOR_CTL_TIMEOUT_MS;\n const installed =\n opts.installedVersion !== undefined ? opts.installedVersion : installedMuVersion();\n const piAgents = agents\n .map((a) => ({ a, socket: ctlSocketPath(a.workstreamName, a.name, opts.stateDir) }))\n .filter(({ a, socket }) => expectsCtl(a, socket));\n const reports = await Promise.all(\n piAgents.map(async ({ a, socket }): Promise<AgentCtlReport> => {\n const probe = await ctlProbe(socket, timeoutMs);\n const older = probeOutdated(probe, installed);\n const missingOps = probeMissingOps(probe);\n return {\n workstream: a.workstreamName,\n agent: a.name,\n socket,\n probe: probe.kind,\n ...(probe.kind === \"ok\" && probe.extVersion !== undefined\n ? { extVersion: probe.extVersion }\n : {}),\n ...(probe.kind === \"ok\" && probe.ops !== undefined ? { opCount: probe.ops.length } : {}),\n ...(probe.kind === \"ok\" && probe.features !== undefined\n ? { features: probe.features }\n : {}),\n ...(older || missingOps.length > 0\n ? {\n outdated: true,\n reloadVia: probe.kind === \"ok\" && probe.ops?.includes(\"command\") ? \"ctl\" : \"respawn\",\n }\n : {}),\n ...(missingOps.length > 0 ? { missingOps } : {}),\n };\n }),\n );\n const bad = reports.filter((r) => r.probe !== \"ok\" || r.outdated);\n const describe = (r: AgentCtlReport): string => {\n const who = `${r.workstream}/${r.agent}`;\n if (!r.outdated) return `${who}: ${r.probe}`;\n if (r.missingOps && !(r.extVersion && installed && versionOlder(r.extVersion, installed)))\n return `${who}: extension lacks ops: ${r.missingOps.join(\", \")}`;\n return `${who}: extension ${r.extVersion ?? \"(unknown)\"} older than installed ${installed ?? \"mu\"}`;\n };\n let check: DoctorCheck;\n if (reports.length === 0) check = { name: \"ctl\", status: \"ok\", detail: \"no pi agents\" };\n else if (bad.length === 0) {\n check = {\n name: \"ctl\",\n status: \"ok\",\n detail: `${reports.length}/${reports.length} pi agents reachable`,\n };\n } else {\n check = {\n name: \"ctl\",\n status: \"warn\",\n detail: bad.map(describe).join(\", \"),\n };\n }\n return { check, agents: reports };\n}\n","// mu — dormant-workstream detection for `mu doctor`.\n//\n// The question this answers: \"which workstreams can I tear down?\" The\n// operator had to answer it by eye, from `mu workstream list`, which\n// prints row counts and no dates — so the two workstreams that had been\n// untouched for three months looked exactly like the one worked on an\n// hour ago. Teardown writes tombstone ops, so the\n// cost of the missing surface was not risk, it was that nobody ever\n// tore anything down and the list grew forever.\n//\n// TWO BUCKETS, NEVER ONE NUMBER\n// -----------------------------\n// \"Stale-ish and/or no open tasks\" is two different findings and\n// merging them gives actively bad advice:\n//\n// FINISHED every task CLOSED, and idle a while. Nothing is at\n// stake. Safe to tear down, and that is what the\n// remediation says.\n// ABANDONED idle for a long time WITH unclosed tasks. Tearing this\n// down discards open work. The remediation is to LOOK\n// first, and the count of what would be lost is the whole\n// point of the row.\n//\n// On the box this was written against the split is the entire value:\n// `mu` / `dash-search` / `dash-shortcuts` / `goto-murmur-dash` are\n// finished (0 unclosed), while `infer-rs` (95 days, 19 unclosed) and\n// `modelbridge` (89 days, 8 unclosed) are abandoned. One combined\n// \"dormant\" list would have invited `--empty`-style sweeping of 27 open\n// tasks.\n//\n// WHY NOT `teardown --empty`\n// --------------------------\n// That verb already exists and is deliberately narrower: ZERO tasks,\n// agents and worktrees — test litter. Every workstream here has real\n// history, so `--empty` never matches one. This check reports; it never\n// sweeps. Same posture as src/disk-recon.ts: each finding names its own\n// command and mu runs none of them.\n//\n// IDLE IS DERIVED, NOT STORED\n// ---------------------------\n// There is no `workstreams.last_activity` column and this does not add\n// one. Activity is `MAX(tasks.updated_at)`, falling back to the\n// workstream's own `created_at` when it has no tasks at all — a column\n// would be a second source of truth that can disagree with the rows it\n// summarises, which is the `provenance` reasoning in\n// docs/VOCABULARY.md applied to a cheaper case.\n\nimport type { Db } from \"./db.js\";\nimport type { FleetHazard } from \"./fleet-hazards.js\";\nimport { isScratchWorkstream } from \"./workstream.js\";\n\n/**\n * Idle threshold, in days, before a fully-closed workstream is called\n * **finished**.\n *\n * Two weeks, because the failure mode of a low value is a doctor that\n * nags about the thing you finished yesterday and will reopen tomorrow.\n * A workstream whose every task is closed is not *suspicious* — that is\n * the success state — so the row has to earn its place by the work also\n * being cold.\n */\nexport const FINISHED_IDLE_DAYS = 14;\n\n/**\n * Idle threshold, in days, before a workstream with unclosed tasks is\n * called **abandoned**.\n *\n * Deliberately much higher than FINISHED_IDLE_DAYS: open tasks mean\n * \"not done\", and a fortnight away from a project is a holiday, not\n * abandonment. 60 days is roughly \"two months of not touching it\",\n * which on the dogfood box catches the two genuinely-dead workstreams\n * and nothing that is merely paused.\n */\nexport const ABANDONED_IDLE_DAYS = 60;\n\n/** Neither threshold is an env var. They are display cutoffs on a\n * report the operator then judges — the same call\n * `PEER_STALE_MS` (src/sync.ts) makes, for the same reason: a knob\n * implies a behaviour change downstream, and nothing downstream reads\n * these. */\n\nexport interface DormantWorkstream {\n name: string;\n /** Whole days since the newest task update (or the workstream's own\n * creation, when it has no tasks). */\n idleDays: number;\n /** Tasks in the workstream, total. */\n tasks: number;\n /** Tasks not CLOSED. Zero for `finished`, non-zero for `abandoned`. */\n unclosed: number;\n /** Which bucket, and therefore which remediation applies. */\n kind: \"finished\" | \"abandoned\";\n}\n\ninterface DormantRow {\n name: string;\n tasks: number;\n unclosed: number;\n idle_days: number | null;\n}\n\n/**\n * Workstreams that look torn-down-able, newest-idle last.\n *\n * EXCLUDES:\n * - the current workstream, passed in by the caller. Telling someone\n * the thing they are working in right now is dormant is noise, and\n * the caller is the only layer that knows which it is.\n * - `scratch`, which is ephemeral BY DESIGN (see\n * `isScratchWorkstream`). Its whole contract is \"off-the-cuff\n * helpers, no ceremony\", so a report that it has been quiet for a\n * fortnight is telling the operator the feature works.\n * - workstreams with live agents or registered worktrees. Those are\n * not dormant regardless of task dates: something is running, or a\n * checkout is on disk holding uncommitted work. `mu doctor`'s disk\n * section owns the worktree story.\n *\n * One indexed GROUP BY over `tasks`; no filesystem and no mux calls, so\n * it is cheap enough for the default doctor tier.\n */\nexport function findDormantWorkstreams(\n db: Db,\n opts: { currentWorkstream?: string | null } = {},\n): DormantWorkstream[] {\n const rows = db\n .prepare(\n `SELECT w.name AS name,\n COUNT(t.id) AS tasks,\n COALESCE(SUM(t.status <> 'CLOSED'), 0) AS unclosed,\n CAST(julianday('now')\n - julianday(MAX(COALESCE(t.updated_at, w.created_at)))\n AS INTEGER) AS idle_days\n FROM workstreams w\n LEFT JOIN tasks t ON t.workstream_id = w.id\n WHERE w.torn_down_at IS NULL\n AND NOT EXISTS (SELECT 1 FROM agents a WHERE a.workstream_id = w.id)\n AND NOT EXISTS (SELECT 1 FROM worktrees v WHERE v.workstream = w.name)\n GROUP BY w.id, w.name\n ORDER BY idle_days DESC, w.name`,\n )\n .all() as DormantRow[];\n\n const dormant: DormantWorkstream[] = [];\n for (const row of rows) {\n if (row.name === opts.currentWorkstream) continue;\n if (isScratchWorkstream(row.name)) continue;\n // A workstream with no tasks at all is `teardown --empty`'s job,\n // not this one. Reporting it here would give the same row two\n // different remediations in one doctor run.\n if (row.tasks === 0) continue;\n // julianday() returns NULL on an unparsable timestamp; treat that\n // as \"cannot judge\" rather than as 0 days (which would silently\n // hide the row) or a huge number (which would invent a finding).\n if (row.idle_days === null) continue;\n const idleDays = row.idle_days;\n const kind =\n row.unclosed === 0\n ? idleDays >= FINISHED_IDLE_DAYS\n ? (\"finished\" as const)\n : null\n : idleDays >= ABANDONED_IDLE_DAYS\n ? (\"abandoned\" as const)\n : null;\n if (kind === null) continue;\n dormant.push({\n name: row.name,\n idleDays,\n tasks: row.tasks,\n unclosed: row.unclosed,\n kind,\n });\n }\n return dormant;\n}\n\n/** `95d` / `3d`. Doctor rows are narrow and the unit is always days\n * here, so this stays a suffix rather than growing a duration\n * formatter. */\nfunction days(n: number): string {\n return `${n}d`;\n}\n\n/**\n * The doctor row + remediation for both buckets.\n *\n * Severity is `ok`, never `warn`. A dormant workstream is not a fault —\n * it is a housekeeping opportunity — and `warn` would make\n * `mu doctor` print \"at least one finding needs attention\" forever on a\n * box that is working perfectly. Same choice `ws-empty` makes in\n * src/disk-recon.ts, for the same reason.\n */\nexport function checkDormantWorkstreams(\n db: Db,\n opts: { currentWorkstream?: string | null } = {},\n): FleetHazard {\n const dormant = findDormantWorkstreams(db, opts);\n if (dormant.length === 0) {\n return { name: \"ws-dormant\", severity: \"ok\", detail: \"no dormant workstreams\" };\n }\n\n const finished = dormant.filter((d) => d.kind === \"finished\");\n const abandoned = dormant.filter((d) => d.kind === \"abandoned\");\n const parts: string[] = [];\n if (finished.length > 0) parts.push(`${finished.length} finished`);\n if (abandoned.length > 0) parts.push(`${abandoned.length} with open tasks`);\n\n const remediation: string[] = [];\n if (finished.length > 0) {\n remediation.push(\n `Every task CLOSED and untouched for ${FINISHED_IDLE_DAYS}+ days — safe to tear down:`,\n ...finished.map(\n (d) => ` ${d.name.padEnd(24)} ${days(d.idleDays).padStart(5)} idle, ${d.tasks} closed`,\n ),\n \"\",\n \"Teardown is soft (rows stay, hidden); preview prints `rev=<n>`, apply with `--if <n>`.\",\n ...finished.slice(0, 3).map((d) => ` mu workstream teardown ${d.name}`),\n );\n }\n if (abandoned.length > 0) {\n if (remediation.length > 0) remediation.push(\"\");\n remediation.push(\n `Idle ${ABANDONED_IDLE_DAYS}+ days but still holding UNCLOSED tasks — look before tearing down:`,\n ...abandoned.map(\n (d) =>\n ` ${d.name.padEnd(24)} ${days(d.idleDays).padStart(5)} idle, ${d.unclosed} of ${d.tasks} unclosed`,\n ),\n \"\",\n // \"a teardown here discards open work\" was the first wording, and it\n // was wrong twice: it contradicted the `finished` block above (which\n // correctly calls teardown reversible), and \"work\" reads as \"my code\"\n // when what teardown removes here is the PLAN — task rows and notes.\n //\n // \"no checkout is touched\" is true because teardown never removes a\n // worktree (it lists them as kept). This list still EXCLUDES\n // workstreams with registered worktrees: they are live work.\n \"Hides the task rows and notes — the plan, not the code (no checkout\",\n \"is touched); reusing the name later deletes them. The risk is\",\n \"losing sight of what was left to do, so read it first:\",\n ...abandoned.slice(0, 3).map((d) => ` mu task list -w ${d.name} --status OPEN,IN_PROGRESS`),\n );\n }\n\n return {\n name: \"ws-dormant\",\n severity: \"ok\",\n detail: `${dormant.length} dormant workstream(s): ${parts.join(\", \")}`,\n remediation,\n };\n}\n","// mu — `mu host add | list | show | rm | init | check`: host profiles.\n//\n// mu stays ssh-free. These verbs store and print the user's own templates\n// (src/hosts.ts); `init --ssh` PRINTS a starter and runs nothing, and\n// `check` runs only the stored `exec` template.\n\nimport type { Command } from \"commander\";\nimport {\n emitJson,\n emitJsonCollection,\n handle,\n JSON_OPT,\n parseNonNegativeInt,\n resolveWorkstream,\n UsageError,\n WORKSTREAM_OPT,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport {\n addHost,\n checkHost,\n getHost,\n type HostChannel,\n HostCheckFailedError,\n type HostProfile,\n hostStarter,\n isValidHostName,\n listHostChannels,\n listHosts,\n removeHost,\n} from \"../hosts.js\";\nimport { isJsonMode, muTable, pc } from \"../output.js\";\nimport { shellQuote } from \"../shell-quote.js\";\nimport { failureWithData } from \"./handle.js\";\n\nfunction channelLine(c: HostChannel): string {\n const on = c.kind === \"attached\" ? `pane ${c.pane_id}` : `pid ${c.pid}`;\n return `${c.holder} (${c.kind}, ${on})`;\n}\n\nexport function cmdHostAdd(db: Db, name: string, opts: HostAddOptions): void {\n const host = addHost(db, {\n name,\n shell: opts.shell,\n exec: opts.exec,\n fetch: opts.fetch,\n repo: opts.repo ?? null,\n max_sessions: opts.maxSessions ?? null,\n });\n if (isJsonMode()) {\n emitJson({ host });\n return;\n }\n console.log(`added host ${pc.bold(host.name)}`);\n}\n\nexport function cmdHostList(db: Db): void {\n const hosts = listHosts(db);\n if (isJsonMode()) {\n emitJsonCollection(hosts);\n return;\n }\n if (hosts.length === 0) {\n console.log(\"no host profiles (mu host init prints a starter)\");\n return;\n }\n const held = new Map<string, number>();\n for (const c of listHostChannels(db)) held.set(c.host, (held.get(c.host) ?? 0) + 1);\n const t = muTable({ head: [\"HOST\", \"DEFAULT REPO\", \"CHANNELS\"] });\n for (const h of hosts) {\n t.push([h.name, h.repo ?? \"-\", `${held.get(h.name) ?? 0}/${h.max_sessions ?? \"∞\"}`]);\n }\n console.log(t.toString());\n}\n\nexport function cmdHostShow(db: Db, name: string): void {\n const host: HostProfile = getHost(db, name);\n const channels = listHostChannels(db, name);\n if (isJsonMode()) {\n emitJson({ host, channels });\n return;\n }\n console.log(\n `${pc.bold(host.name)} default repo ${host.repo ?? \"-\"} max-sessions ${host.max_sessions ?? \"none\"}`,\n );\n for (const f of [\"shell\", \"exec\", \"fetch\"] as const) console.log(` ${f.padEnd(6)} ${host[f]}`);\n console.log(\n channels.length === 0\n ? \" channels: none held\"\n : ` channels: ${channels.map(channelLine).join(\"; \")}`,\n );\n}\n\nexport function cmdHostRm(db: Db, name: string): void {\n const removed = removeHost(db, name);\n if (isJsonMode()) {\n emitJson({ host: name, removed });\n return;\n }\n console.log(removed ? `removed host ${name}` : `no host profile named ${name}`);\n}\n\n/** Print a starter. Never executes it: the user reviews, edits and pastes. */\nexport function cmdHostInit(name: string, opts: { ssh?: boolean }): void {\n if (opts.ssh !== true) {\n throw new UsageError(\"host init needs a starter kind: --ssh\");\n }\n if (!isValidHostName(name)) {\n throw new UsageError(\n `invalid host name ${JSON.stringify(name)}: lowercase letters, digits, - and _`,\n { showHelp: false },\n );\n }\n const s = hostStarter(name);\n const command = [\n `mu host add ${name}`,\n `--shell ${shellQuote(s.shell)}`,\n `--exec ${shellQuote(s.exec)}`,\n `--fetch ${shellQuote(s.fetch)}`,\n \"--max-sessions 1\",\n ].join(\" \\\\\\n \");\n if (isJsonMode()) {\n emitJson({ host: name, ...s, command });\n return;\n }\n console.log(`# Starter for ${name}. Edit it, then run it: mu runs none of this.`);\n console.log(`# ${name} is the ssh target; ~/.ssh/config decides the rest.`);\n console.log(command);\n}\n\nexport async function cmdHostCheck(\n db: Db,\n name: string,\n opts: { agent?: string; workstream?: string; root?: string },\n): Promise<void> {\n const agent =\n opts.agent === undefined\n ? undefined\n : { name: opts.agent, workstream: await resolveWorkstream(opts.workstream) };\n const report = await checkHost(db, name, {\n ...(agent !== undefined ? { agent } : {}),\n ...(opts.root !== undefined ? { root: opts.root } : {}),\n });\n if (isJsonMode()) {\n if (!report.ok) throw failureWithData(failedError(report), report);\n emitJson(report);\n return;\n }\n for (const s of report.steps) {\n const mark =\n s.ok === true ? pc.green(\"ok \") : s.ok === false ? pc.red(\"FAIL\") : pc.dim(\"skip\");\n console.log(`${mark} ${s.step.padEnd(9)} ${s.detail}`);\n }\n if (!report.ok) throw failedError(report);\n}\n\nfunction failedError(report: { host: string; steps: { step: string; ok: boolean | null }[] }) {\n return new HostCheckFailedError(\n report.host,\n report.steps.filter((s) => s.ok === false).map((s) => s.step),\n );\n}\n\nexport interface HostAddOptions {\n shell: string;\n exec: string;\n fetch: string;\n repo?: string;\n maxSessions?: number;\n}\n\nexport function wireHostCommands(program: Command): void {\n const host = program\n .command(\"host\")\n .description(\n \"Host profiles: command templates for a remote host. mu never connects and knows no ssh flags; it fills your templates and runs them with /bin/sh -c\",\n );\n host\n .command(\"add <name>\")\n .description(\n \"Store a machine-local host profile of command templates: --shell opens the pane, --exec runs one remote command, --fetch brings commits home. Placeholders {env} {cmd} {local_sock} {remote_sock} {cwd}; grammar in docs/guide/remote.md.\",\n )\n .requiredOption(\"--shell <template>\", \"pane command template (opens the remote shell)\")\n .requiredOption(\"--exec <template>\", \"template that runs one remote command ({cmd})\")\n .requiredOption(\"--fetch <template>\", \"local template that fetches commits home ({cwd})\")\n .option(\n \"--repo <path>\",\n \"default remote repo for `agent spawn --host` without --root (a profile names a machine, not a repo)\",\n )\n .option(\n \"--max-sessions <n>\",\n \"cap on channels mu holds to this host at once (panes, --exec, --fetch)\",\n parseNonNegativeInt,\n )\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as HostAddOptions;\n return handle(async (db) => cmdHostAdd(db, name, opts), this as Command)();\n });\n host\n .command(\"list\")\n .description(\"List host profiles with channels held / cap\")\n .option(...JSON_OPT)\n .action(function () {\n return handle(async (db) => cmdHostList(db), this as Command)();\n });\n host\n .command(\"show <name>\")\n .description(\"Show a profile's templates and the channels it holds, with their holders\")\n .option(...JSON_OPT)\n .action(function (name: string) {\n return handle(async (db) => cmdHostShow(db, name), this as Command)();\n });\n host\n .command(\"rm <name>\")\n .description(\"Remove a profile. Refuses while it holds a channel (close those agents first)\")\n .option(...JSON_OPT)\n .action(function (name: string) {\n return handle(async (db) => cmdHostRm(db, name), this as Command)();\n });\n host\n .command(\"init <name>\")\n .description(\n \"Print a starter `mu host add` for ssh (the socket forward, `$SHELL -ilc`, identity env inside the command) for you to edit. Prints only: mu never runs it and never connects.\",\n )\n .option(\"--ssh\", \"print the ssh starter\")\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as { ssh?: boolean };\n return handle(async () => cmdHostInit(name, opts), this as Command)();\n });\n host\n .command(\"check <name>\")\n .description(\n \"Run the profile's --exec under one channel: host answers, the repo (--root, else the default) is git, pi runs, `pi list` names mu. --agent also probes that agent's control socket. Exit 5 if a step fails; retries nothing.\",\n )\n .option(\"--agent <name>\", \"also probe this agent's control socket (the forward rides its pane)\")\n .option(\"--root <path>\", \"the remote repo the repo step checks (default: the profile's)\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).optsWithGlobals() as {\n agent?: string;\n workstream?: string;\n root?: string;\n };\n return handle((db) => cmdHostCheck(db, name, opts), this as Command)();\n });\n}\n","// mu — `mu human-needed <reason>`: the loop's one explicit stop for a human decision.\n\nimport type { Command } from \"commander\";\nimport { spawnerFromEnv } from \"../agents/spawn.js\";\nimport { emitJson, handle, JSON_OPT, resolveExistingWorkstream, WORKSTREAM_OPT } from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { recordHumanNeeded } from \"../human-needed.js\";\nimport { pc } from \"../output.js\";\n\nasync function cmdHumanNeeded(\n db: Db,\n reason: string,\n opts: { workstream?: string; json?: boolean },\n): Promise<void> {\n const ws = await resolveExistingWorkstream(db, opts.workstream);\n const r = recordHumanNeeded(db, { workstream: ws, caller: spawnerFromEnv() ?? \"\", reason });\n if (opts.json) {\n emitJson({ workstream: ws, id: r.id, changed: r.changed });\n return;\n }\n console.log(\n r.changed\n ? `Recorded human-needed ${pc.bold(r.id)} in ${ws}`\n : pc.dim(`${r.id} already records this reason (no-op)`),\n );\n}\n\nexport function wireHumanNeededCommand(program: Command): void {\n program\n .command(\"human-needed <reason>\")\n .description(\n \"Stop the loop for a human decision: record a parked `human` task with <reason>. Scoped to the caller; closes only by `mu task close`. Never recorded automatically.\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (reason: string) {\n const opts = (this as Command).opts() as { workstream?: string; json?: boolean };\n return handle((db) => cmdHumanNeeded(db, reason, opts), this as Command)();\n });\n}\n","// mu — `mu log` verb (write + read + tail).\n//\n// One verb, three modes:\n// mu log \"text\" → write\n// mu log → read latest 50\n// mu log --tail → blocking subscription (poll every 1s)\n// mu log --since <seq> → cursor read (everything after seq)\n\nimport {\n emitJson,\n emitJsonRow,\n injectedIdentity,\n injectedWorkstream,\n missingWorkstreamError,\n requireLiveWorkstream,\n resolveExistingWorkstream,\n resolveWorkstream,\n UsageError,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport {\n anyVisibleBetween,\n appendLog,\n GroupNotFoundError,\n groupIdFromPrefix,\n type ListLogsOptions,\n type LogRow,\n latestSeq,\n listLogs,\n} from \"../logs.js\";\nimport { pc } from \"../output.js\";\nimport { logOut, logPage, logReceipt } from \"./log-records.js\";\n\nexport interface LogReadOpts {\n workstream?: string;\n allWorkstreams?: boolean;\n since?: number;\n /** Cursor read of the whole log, strictly after this seq (no scope, no filter). */\n after?: number;\n /** Exact seqs, `A..B,C`: each record whole (no scope, no filter). */\n seq?: string;\n lines?: number;\n source?: string;\n /** Operator channel tag (`ops.entity`). See the log-ledger pattern. */\n kind?: string;\n /** Structured intent filter (`ops.intent`), e.g. 'task.close'. */\n intent?: string;\n /** Op-group filter (`ops.group_id`). */\n group?: string;\n json?: boolean;\n tail?: boolean;\n}\n\nexport interface LogWriteOpts {\n workstream?: string;\n as?: string;\n kind?: string;\n json?: boolean;\n}\n\n/**\n * The `mu log` verb is overloaded: with a positional <text>, write\n * an entry; without, read the log (optionally tailing).\n */\nexport async function cmdLog(\n db: Db,\n text: string | undefined,\n opts: LogReadOpts & LogWriteOpts,\n): Promise<void> {\n if (text !== undefined && text.length > 0) {\n refuseWriteWithReadFlags(text, opts);\n await cmdLogWrite(db, text, opts);\n return;\n }\n await cmdLogRead(db, opts);\n}\n\n/**\n * A write never carries a read flag. `--tail`/`--all` are booleans, so a guessed\n * `mu log --tail 20` parses 20 as the text to log: a read that writes. Refuse it\n * (nothing is written); a write is the text with no read flag.\n */\nfunction refuseWriteWithReadFlags(text: string, opts: LogReadOpts): void {\n const flag = [\n opts.tail === true && \"--tail\",\n opts.allWorkstreams === true && \"--all\",\n opts.since !== undefined && \"--since\",\n opts.after !== undefined && \"--after\",\n opts.seq !== undefined && \"--seq\",\n opts.lines !== undefined && \"-n\",\n opts.source !== undefined && \"--source\",\n opts.intent !== undefined && \"--intent\",\n opts.group !== undefined && \"--group\",\n ].find((x) => x !== false);\n if (flag === undefined) return;\n const hint = /^\\d+$/.test(text) ? `did you mean -n ${text}? ` : \"\";\n throw new UsageError(\n `${flag} reads the log but ${JSON.stringify(text)} would be written to it; ${hint}to log the text, drop ${flag}`,\n { showHelp: false },\n );\n}\n\n/**\n * Resolve who/where this log entry belongs to:\n * --as <name> explicit source; scope still comes from -w / identity\n * injected worker source = $MU_AGENT_NAME, workstream = $MU_WORKSTREAM\n * (spawn-injected; $TMUX_PANE is never consulted)\n * else source = 'user'; scope is -w, or the missing-scope error\n * An explicit `-w` always wins the workstream.\n */\nasync function resolveLogContext(\n db: Db,\n opts: {\n as?: string;\n workstream?: string;\n },\n): Promise<{ source: string; workstream: string }> {\n const identity = injectedIdentity();\n const workstream = await resolveExistingWorkstream(db, opts.workstream);\n return { source: opts.as ?? identity?.name ?? \"user\", workstream };\n}\n\nasync function cmdLogWrite(db: Db, text: string, opts: LogWriteOpts): Promise<void> {\n const ctx = await resolveLogContext(db, opts);\n const row = appendLog(db, {\n workstream: ctx.workstream,\n source: ctx.source,\n kind: opts.kind ?? \"message\",\n payload: text,\n });\n if (opts.json) {\n emitJson(logOut(row));\n return;\n }\n // The receipt is the record the log will show for this op: escaped, clipped, counted.\n for (const line of logReceipt(row)) console.log(line);\n}\n\n/** `1..5,9` → [[1,5],[9,9]]; anything else is a usage error. */\nexport function parseSeqSpec(spec: string): [number, number][] {\n const runs: [number, number][] = [];\n for (const part of spec.split(\",\")) {\n const m = /^(\\d{1,15})(?:\\.\\.(\\d{1,15}))?$/.exec(part);\n const a = m?.[1] === undefined ? Number.NaN : Number(m[1]);\n const b = m?.[2] === undefined ? a : Number(m[2]);\n if (!Number.isSafeInteger(a) || !Number.isSafeInteger(b) || a > b) {\n throw new UsageError(`--seq expects seqs like 7 or 5..9,12, got ${JSON.stringify(spec)}`, {\n showHelp: false,\n });\n }\n runs.push([a, b]);\n }\n return runs;\n}\n\n/** `--seq` and `--after` read the log by position: no scope, no filter, nothing inherited. */\nfunction refuseScopeAndFilters(opts: LogReadOpts, flag: string, allowLines: boolean): void {\n const other = [\n opts.workstream !== undefined && \"-w\",\n opts.allWorkstreams === true && \"--all\",\n opts.kind !== undefined && \"--kind\",\n opts.source !== undefined && \"--source\",\n opts.intent !== undefined && \"--intent\",\n opts.group !== undefined && \"--group\",\n opts.since !== undefined && \"--since\",\n opts.tail === true && \"--tail\",\n opts.seq !== undefined && flag !== \"--seq\" && \"--seq\",\n opts.after !== undefined && flag !== \"--after\" && \"--after\",\n !allowLines && opts.lines !== undefined && \"-n\",\n ].find((x) => x !== false);\n if (other !== undefined) {\n throw new UsageError(`${flag} reads by seq: it cannot be combined with ${other}`, {\n showHelp: false,\n });\n }\n}\n\nconst gapEmptyIn =\n (db: Db) =>\n (a: number, b: number): boolean =>\n !anyVisibleBetween(db, a + 1, b - 1);\n\nfunction printPage(page: ReturnType<typeof logPage>): void {\n if (page.data !== undefined) {\n emitJson(page.data);\n return;\n }\n for (const line of page.lines) console.log(line);\n}\n\n/** `mu log --seq A..B,C`: exactly those ops (no scope, no filter), each whole. */\nfunction cmdLogSeq(db: Db, opts: LogReadOpts): void {\n refuseScopeAndFilters(opts, \"--seq\", false);\n const rows = new Map<number, LogRow>();\n for (const [a, b] of parseSeqSpec(opts.seq ?? \"\")) {\n for (const row of listLogs(db, { since: a - 1, upTo: b })) rows.set(row.seq, row);\n }\n const sorted = [...rows.values()].sort((x, y) => x.seq - y.seq);\n const json = opts.json === true;\n if (sorted.length === 0 && !json) {\n console.log(pc.dim(\"(no log entries)\"));\n return;\n }\n printPage(logPage(sorted, { json, newest: false, whole: true, gapEmpty: gapEmptyIn(db) }));\n}\n\n/** `mu log --after S`: the whole log after S (no scope, no filter), oldest first, paged. */\nfunction cmdLogAfter(db: Db, opts: LogReadOpts): void {\n refuseScopeAndFilters(opts, \"--after\", true);\n const listOpts: ListLogsOptions = { since: opts.after ?? 0 };\n if (opts.lines !== undefined) listOpts.limit = opts.lines;\n const rows = listLogs(db, listOpts);\n const json = opts.json === true;\n if (rows.length === 0 && !json) {\n console.log(pc.dim(\"(no log entries)\"));\n return;\n }\n printPage(logPage(rows, { json, newest: false, cursor: true, gapEmpty: gapEmptyIn(db) }));\n}\n\nasync function cmdLogRead(db: Db, opts: LogReadOpts): Promise<void> {\n if (opts.seq !== undefined) return cmdLogSeq(db, opts);\n if (opts.after !== undefined) return cmdLogAfter(db, opts);\n const workstream = await logReadWorkstream(db, opts);\n const listOpts: ListLogsOptions = {};\n if (workstream !== undefined) listOpts.workstream = workstream;\n if (opts.source !== undefined) listOpts.source = opts.source;\n if (opts.kind !== undefined) listOpts.kind = opts.kind;\n if (opts.intent !== undefined) listOpts.intent = opts.intent;\n if (opts.group !== undefined) {\n // Accept an abbreviated group id (the 8-char form `mu log` prints). A\n // prefix that matches no group is an error rather than an empty\n // listing, since \"no entries\" reads as \"this group did nothing\".\n const resolved = groupIdFromPrefix(db, opts.group);\n if (resolved === null) throw new GroupNotFoundError(opts.group);\n listOpts.group = resolved;\n }\n\n if (opts.tail) {\n await cmdLogTail(db, listOpts, opts);\n return;\n }\n\n if (opts.since !== undefined) listOpts.since = opts.since;\n if (opts.lines !== undefined) listOpts.limit = opts.lines;\n // Default cap: latest 50 entries when no `since` and no `--lines`.\n if (opts.since === undefined && opts.lines === undefined) listOpts.limit = 50;\n\n const rows = listLogs(db, listOpts);\n // One record per VISIBLE op: listLogs hides the parent-row touch an\n // add-note or add-edge writes (same op group, only `updated_at`), which\n // would print as a second line for one action. Those stay in `ops`.\n const json = opts.json === true;\n if (rows.length === 0 && !json) {\n console.log(pc.dim(\"(no log entries)\"));\n return;\n }\n printPage(\n logPage(rows, { json, newest: listOpts.since === undefined, gapEmpty: gapEmptyIn(db) }),\n );\n}\n\n/**\n * Resolve the workstream filter for log reads:\n * --all → undefined (every workstream + machine-wide)\n * -w X → X\n * injected worker → its own workstream\n * none → the one-line missing-scope error (never a global read)\n */\nasync function logReadWorkstream(db: Db, opts: LogReadOpts): Promise<string | undefined> {\n if (opts.allWorkstreams) {\n if (opts.workstream !== undefined) {\n throw new UsageError(\"--all and -w/--workstream are mutually exclusive\", {\n showHelp: false,\n });\n }\n return undefined;\n }\n if (opts.workstream === undefined && injectedWorkstream() === undefined) {\n throw await missingWorkstreamError({ orAll: true });\n }\n const ws = await resolveWorkstream(opts.workstream);\n // A destroyed workstream's log stays readable (its ops outlive the row): only a name with\n // neither a row nor any history is a typo.\n const known = db\n .prepare(\n \"SELECT 1 FROM workstreams WHERE name = ? UNION ALL SELECT 1 FROM ops WHERE key = ? LIMIT 1\",\n )\n .get(ws, ws);\n if (known === undefined) requireLiveWorkstream(db, ws);\n return ws;\n}\n\n/** A tail whose output failed. `cursor` is the seq of the last row that went out: `--since` it to lose none. */\nexport class TailStopped extends Error {\n constructor(\n readonly cursor: number,\n cause: unknown,\n ) {\n super(\n `log tail stopped after seq ${cursor}: output failed; resume with --tail --since ${cursor}`,\n {\n cause,\n },\n );\n }\n}\n\n/** How a tail waits between polls; a test replaces it to drive the loop without sleeping. */\nexport type TailSleep = (ms: number, signal: AbortSignal) => Promise<void>;\n\nconst realSleep: TailSleep = (ms, signal) =>\n new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const done = (): void => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener(\"abort\", done);\n });\n\n/**\n * `--tail` is a stream, never a document: ALWAYS NDJSON, one `LogItem` per\n * line (no envelope, no header, nothing else on stdout), each line bounded\n * like a `--json` item with a `retrieve` command when it clipped something.\n * The cursor moves only AFTER a line is written, so an interrupt between two\n * rows loses none: a batch is written whole (stdout writes to a pipe or file\n * are synchronous on POSIX) before the signal is looked at, and the loop\n * RETURNS rather than calling process.exit, so Node drains stdout before the\n * process ends. SIGINT ends it with 130, SIGTERM with 143.\n */\nexport async function cmdLogTail(\n db: Db,\n baseOpts: ListLogsOptions,\n cliOpts: LogReadOpts,\n hooks: {\n signal?: AbortSignal;\n sleep?: TailSleep;\n /** Where a row goes (default: one NDJSON line on stdout); a test makes it fail or lag. */\n emit?: (row: object) => void;\n /** How a poll reads (default `listLogs`); a test records the `since` cursor each poll is given. */\n poll?: (opts: ListLogsOptions) => LogRow[];\n } = {},\n): Promise<void> {\n // If --since wasn't given, start at \"now\" so the subscriber only sees\n // NEW entries. Pass `--since 0` to replay from the beginning.\n let cursor = cliOpts.since ?? latestSeq(db);\n const emit = hooks.emit ?? emitJsonRow;\n const poll = hooks.poll ?? ((o: ListLogsOptions) => listLogs(db, o));\n const control = new AbortController();\n const signal = hooks.signal ?? control.signal;\n const sleep = hooks.sleep ?? realSleep;\n const onInt = (): void => {\n process.exitCode = 130;\n control.abort();\n };\n const onTerm = (): void => {\n process.exitCode = 143;\n control.abort();\n };\n if (hooks.signal === undefined) {\n process.once(\"SIGINT\", onInt);\n process.once(\"SIGTERM\", onTerm);\n }\n const intervalMs = defaultLogTailIntervalMs();\n try {\n while (!signal.aborted) {\n for (const row of poll({ ...baseOpts, since: cursor })) {\n try {\n emit(logOut(row));\n } catch (err) {\n throw new TailStopped(cursor, err);\n }\n cursor = row.seq;\n }\n await sleep(intervalMs, signal);\n }\n } finally {\n process.off(\"SIGINT\", onInt);\n process.off(\"SIGTERM\", onTerm);\n }\n}\n\n/** Tail interval default + safety floor. Mirrors defaultSpawnLivenessMs\n * (src/agents.ts). Naive\n * `Number(env)` was a DOS-by-typo: an env value of '' parses as 0\n * and any non-numeric value as NaN, both of which Node's setTimeout\n * treats as 1ms — hammering SQLite at ~500 Hz on the next mu log\n * --tail. Unparseable env → fall back to the no-env default of 1000ms;\n * parseable but too-low → clamp up to the 50ms floor (so a deliberate\n * `MU_LOG_TAIL_INTERVAL_MS=10` becomes 50, not 1000). */\nconst LOG_TAIL_INTERVAL_FLOOR_MS = 50;\nconst LOG_TAIL_INTERVAL_DEFAULT_MS = 1000;\nfunction defaultLogTailIntervalMs(): number {\n const raw = process.env.MU_LOG_TAIL_INTERVAL_MS;\n if (raw === undefined) return LOG_TAIL_INTERVAL_DEFAULT_MS;\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) return LOG_TAIL_INTERVAL_DEFAULT_MS;\n return Math.max(LOG_TAIL_INTERVAL_FLOOR_MS, parsed);\n}\n\n// ─── commander wiring ────────────────────────────────────────────────\n//\n// wireLogCommand is called by buildProgram() in src/cli.ts. Wired here so\n// every per-namespace builder lives next to its cmd functions.\n\nimport type { Command } from \"commander\";\nimport { handle, JSON_OPT, parseLines, parseNonNegativeInt, WORKSTREAM_OPT } from \"../cli.js\";\n\nexport function wireLogCommand(program: Command): void {\n // mu log — overloaded:\n // mu log \"text\" → write\n // mu log → read latest 50\n // mu log --tail → blocking subscription (poll every 1s)\n // mu log --since <seq> → cursor read (everything after seq)\n program\n .command(\"log [text]\")\n .description(\n \"Write a log entry (with text) or read the log (without). --tail blocks and prints new entries as they land.\",\n )\n .option(\"--as <name>\", \"override the source name (default: $MU_AGENT_NAME, else 'user')\")\n .option(\n \"--kind <kind>\",\n \"operator-chosen channel tag: sets it on write, filters to it on read (log-ledger pattern); workstream, task, edge and note are reserved\",\n )\n .option(\n \"--intent <intent>\",\n \"filter reads to one structured intent, e.g. task.close (see `mu log` output)\",\n )\n .option(\"--group <id>\", \"filter reads to one op group (every op of a single action)\")\n .option(\n \"--tail\",\n \"block and print entries as they're appended: always NDJSON, one object per line (no envelope); ctrl-c exits 130\",\n )\n .option(\n \"--since <seq>\",\n \"return entries with seq strictly greater than this (use 0 to replay everything)\",\n parseNonNegativeInt,\n )\n .option(\n \"--after <seq>\",\n \"read the whole log strictly after this seq (no scope, no filter; what a cut's `next=` names)\",\n parseNonNegativeInt,\n )\n .option(\n \"--seq <spec>\",\n \"read exactly these seqs, each record whole: 7 or 5..9,12 (no scope, no filter, nothing inherited)\",\n )\n .option(\n \"-n, --lines <n>\",\n \"cap to N entries: the latest N (default 50), or with --since the first N after the cursor (no default cap)\",\n parseLines,\n )\n .option(\"--source <name>\", \"filter by source\")\n .option(\"--all\", \"read across every workstream (and machine-wide entries)\")\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function (text: string | undefined) {\n const raw = (this as Command).opts() as {\n as?: string;\n kind?: string;\n intent?: string;\n group?: string;\n tail?: boolean;\n since?: number;\n after?: number;\n seq?: string;\n lines?: number;\n source?: string;\n all?: boolean;\n workstream?: string;\n json?: boolean;\n };\n const opts: LogReadOpts & LogWriteOpts = {};\n if (raw.as !== undefined) opts.as = raw.as;\n if (raw.kind !== undefined) opts.kind = raw.kind;\n if (raw.intent !== undefined) opts.intent = raw.intent;\n if (raw.group !== undefined) opts.group = raw.group;\n if (raw.tail !== undefined) opts.tail = raw.tail;\n if (raw.since !== undefined) opts.since = raw.since;\n if (raw.after !== undefined) opts.after = raw.after;\n if (raw.seq !== undefined) opts.seq = raw.seq;\n if (raw.lines !== undefined) opts.lines = raw.lines;\n if (raw.source !== undefined) opts.source = raw.source;\n if (raw.all !== undefined) opts.allWorkstreams = raw.all;\n if (raw.workstream !== undefined) opts.workstream = raw.workstream;\n if (raw.json !== undefined) opts.json = raw.json;\n return handle((db) => cmdLog(db, text, opts), this as Command)();\n });\n}\n","// mu — `mu next`: the executor's verb (src/next.ts).\n//\n// mu next [--dry] [--hold] [--cap N] [--refute [--refute-cli key]] [--timeout s] [--on-stall exit|warn|steer|release] [-w ws]\n//\n// stdout is ONE JSON envelope for every outcome, success or interrupted, bounded\n// to 4 KB (`moves` are cut on a record boundary with `movesCut`, never the\n// summary). SIGINT/SIGTERM are installed before the DB opens: the pass stops\n// between effects (one in flight finishes, it is journaled), the one document\n// says `interrupted`, exit 130/143. Exit: 0 done, cap reached or timed out; 1 a\n// spawn failed unsent; 6 a worker died with nothing more to do (`--hold`); 7 a\n// stall, a dialog, or this caller's human need; 130/143 a signal. Never ANSI.\n\nimport type { Command } from \"commander\";\nimport { spawnerFromEnv } from \"../agents/spawn.js\";\nimport {\n emitJson,\n handle,\n JSON_OPT,\n normalizeInheritedWorkstream,\n parsePositiveInt,\n parseSeconds,\n resolveExistingWorkstream,\n WORKSTREAM_OPT,\n} from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { type ExecuteNextOptions, executeNext, type NextMove, type NextResult } from \"../next.js\";\nimport { encodeEnvelope, okEnvelope, RESULT_BYTES } from \"../output-contract.js\";\nimport { CliExitError } from \"./handle.js\";\nimport { installWaitSignals, parseOnStall, type WaitSignals } from \"./wait.js\";\n\ninterface NextOpts {\n dry?: boolean;\n hold?: boolean;\n cap?: number;\n workers?: number;\n refute?: boolean;\n refuteCli?: string;\n timeout?: number;\n onStall?: string;\n workstream?: string | string[];\n}\n\nconst REASON_CHARS = 200;\n\n/** One move as a flat record: the reason clipped, empty fields gone. */\nfunction moveRecord(m: NextMove): Record<string, unknown> {\n const out: Record<string, unknown> = { ...m };\n if (typeof m.reason === \"string\" && m.reason.length > REASON_CHARS) {\n out.reason = `${m.reason.slice(0, REASON_CHARS)}…`;\n }\n return out;\n}\n\n/** The result document, bounded to RESULT_BYTES on its FINAL bytes. The summary is never cut; moves are, from the end. */\nexport function nextData(r: NextResult, exit: number, signal?: string): Record<string, unknown> {\n const head = {\n workstream: r.workstream,\n dry: r.dry,\n cap: r.cap,\n used: r.used,\n exit,\n ...(r.stopped !== undefined ? { stopped: r.stopped } : {}),\n ...(signal !== undefined ? { signal } : {}),\n ...(r.held !== undefined ? { held: r.held } : {}),\n ...(r.inFlight !== undefined ? { inFlight: r.inFlight } : {}),\n ...(r.human_needed !== undefined\n ? {\n human_needed: r.human_needed.map((n) => ({\n ...n,\n reason: n.reason.slice(0, REASON_CHARS),\n })),\n }\n : {}),\n };\n const records = r.moves.map((m) => JSON.stringify(moveRecord(m)));\n const build = (kept: number): Record<string, unknown> => ({\n ...head,\n moves: records.slice(0, kept).map((x) => JSON.parse(x) as unknown),\n ...(kept < records.length\n ? { movesCut: records.length - kept, retrieve: \"mu task show <id> -w <ws>; mu next --dry\" }\n : {}),\n });\n const fits = (d: Record<string, unknown>): boolean =>\n Buffer.byteLength(encodeEnvelope(okEnvelope(d))) <= RESULT_BYTES;\n let kept = records.length;\n while (kept > 0 && !fits(build(kept))) kept--;\n return build(kept);\n}\n\n/** The exit code of a finished invocation. */\nexport function nextExit(r: NextResult, signal: \"SIGINT\" | \"SIGTERM\" | undefined): number {\n if (r.stopped === \"interrupted\") return signal === \"SIGTERM\" ? 143 : 130;\n if (r.stopped === \"human\") return 7;\n if (r.stopped === \"failed\") return 1;\n return r.held?.exit ?? 0;\n}\n\nexport async function cmdNext(db: Db, o: NextOpts, sig: WaitSignals): Promise<void> {\n const scope = normalizeInheritedWorkstream(o.workstream);\n const workstream = await resolveExistingWorkstream(db, scope);\n const opts: ExecuteNextOptions = {\n workstream,\n caller: spawnerFromEnv() ?? \"\",\n signal: sig.signal,\n ...(o.dry === true ? { dry: true } : {}),\n ...(o.hold === true ? { hold: true } : {}),\n ...(o.cap !== undefined ? { cap: o.cap } : {}),\n ...(o.workers !== undefined ? { workers: o.workers } : {}),\n ...(o.refute === true ? { refute: true } : {}),\n ...(o.refuteCli !== undefined ? { refuteCli: o.refuteCli } : {}),\n ...(o.timeout !== undefined ? { timeoutMs: Math.round(o.timeout * 1000) } : {}),\n onStall: parseOnStall(o.onStall),\n };\n const result = await executeNext(db, opts);\n const which = sig.which();\n const exit = nextExit(result, which);\n emitJson(nextData(result, exit, which));\n sig.dispose();\n if (exit !== 0) throw new CliExitError(exit);\n}\n\nexport function wireNextCommand(program: Command): void {\n program\n .command(\"next\")\n .description(\n \"Do the judgement-free moves for tasks authorised HERE (`mu task auto`): recover dead or errored workers, spawn ready ones. ONE JSON result; never accepts or merges. --dry plans, --hold waits (docs/guide/dispatch.md).\",\n )\n .option(\"--dry\", \"plan only: zero writes, no mux, no ctl\")\n .option(\n \"--hold\",\n \"after the pass, wait for the first event on the in-flight workers (recovering deaths and API errors)\",\n )\n .option(\n \"--cap <n>\",\n \"effects this invocation may perform (default 5, max 100)\",\n parsePositiveInt,\n )\n .option(\n \"--workers <n>\",\n \"worker ceiling: no new pane while n workers are working (an IN_PROGRESS task or an attempt in flight); a worker whose task is CLOSED is free. Default: none\",\n parsePositiveInt,\n )\n .option(\n \"--refute\",\n \"opt in: ONE checker (a delegate in scratch) per CLOSED/done attempt of an authorised task, briefed from its pinned brief and report; its verdict is recorded on the task. Never accepts, reopens or closes. Needs a caller identity (PI_SESSION_ID or a managed agent)\",\n )\n .option(\n \"--refute-cli <key>\",\n \"--refute: the checker's cli key (default: the task's own; it must speak ctl). Choose another model family here\",\n )\n .option(\n \"--timeout <seconds>\",\n \"--hold deadline, fractions allowed (default and cap 1500; 0 = the cap)\",\n parseSeconds,\n )\n .option(\n \"--on-stall <action>\",\n \"--hold: exit (default) ends on a stalled worker; warn; steer sends it ONE reminder; release frees its task\",\n )\n .option(...WORKSTREAM_OPT)\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).optsWithGlobals() as NextOpts;\n const sig = installWaitSignals();\n const run = handle((db) => cmdNext(db, opts, sig), this as Command);\n return run().finally(() => sig.dispose());\n });\n}\n\nexport type { NextResult };\n","// mu — `mu pi migrate`: retire the pre-package `mu link pi` installs.\n//\n// Touches no DB, so it does not run through handle() (which opens the DB\n// and runs ambient sync). Report-only unless --apply; see src/pi-migrate.ts.\n\nimport type { Command } from \"commander\";\nimport { emitJson, JSON_OPT } from \"../cli.js\";\nimport { pc } from \"../output.js\";\nimport { type MigrateEntry, migratePi } from \"../pi-migrate.js\";\nimport { emitParseError, refuseDbInsideSyncDir } from \"./handle.js\";\n\nfunction line(label: string, e: MigrateEntry): string {\n if (e.moved) return `${label}: moved ${pc.bold(e.path)} -> ${e.to ?? \"?\"}`;\n const what = {\n absent: \"not present\",\n shim: \"mu-owned (not moved)\",\n foreign: \"not mu's: left alone\",\n }[e.state];\n return `${label}: ${pc.bold(e.path)} ${pc.dim(what)}`;\n}\n\nexport function wirePiCommand(program: Command): void {\n const pi = program.command(\"pi\").description(\"pi package helpers\");\n pi.command(\"migrate\")\n .description(\n \"Move the old `mu link pi` extension shim and skill symlink out of pi's discovery path (mu-owned files only; nothing is deleted). Without --apply, report only. Install the package with: pi install npm:@mu-crew/mu\",\n )\n .option(...JSON_OPT)\n .option(\"--apply\", \"move the mu-owned files aside (default: report only)\")\n .action(function () {\n const cmd = this as Command;\n try {\n refuseDbInsideSyncDir();\n const opts = cmd.opts() as { json?: boolean; apply?: boolean };\n const r = migratePi({ apply: opts.apply === true });\n if (opts.json === true) {\n emitJson(r);\n return;\n }\n console.log(line(\"extension\", r.extension));\n console.log(line(\"skill\", r.skill));\n for (const g of r.guidance) console.log(pc.dim(g));\n } catch (err) {\n process.exit(emitParseError(err, cmd));\n }\n });\n}\n","// mu — `mu rebuild <file>`: the disaster-recovery verb.\n//\n// Thin wrapper over `rebuildInto` (src/rebuild.ts). All the human-facing\n// reporting lives here, and none of it lives in the SDK, so the\n// forthcoming doctor drift check can rebuild into a temp DB and diff\n// without a human-shaped summary getting in the way.\n\nimport { type Db, defaultDbPath } from \"../db.js\";\nimport { pc } from \"../output.js\";\nimport { rebuildInto } from \"../rebuild.js\";\n\nexport interface RebuildCmdOptions {\n json?: boolean;\n force?: boolean;\n}\n\n/** The swap command, as the operator should run it. First next-step, so\n * the thing to do next is the first thing they read. */\nfunction swapCommand(targetPath: string): string {\n const live = defaultDbPath();\n return `mv ${targetPath} ${live}`;\n}\n\nexport async function cmdRebuild(\n db: Db,\n targetPath: string,\n opts: RebuildCmdOptions = {},\n): Promise<void> {\n const report = rebuildInto(db, {\n targetPath,\n ...(opts.force === true ? { force: true } : {}),\n });\n\n if (opts.json === true) {\n emitJson({\n targetPath: report.targetPath,\n machineId: report.machineId,\n opsCopied: report.opsCopied,\n opsProjected: report.opsProjected,\n opsChangedRows: report.opsChangedRows,\n logOnly: report.logOnlyByEntity,\n rebuiltRows: report.rebuiltRows,\n machineLocalLost: report.machineLocalLost,\n swapCommand: swapCommand(report.targetPath),\n });\n return;\n }\n\n console.log(`Rebuilt ${pc.bold(report.targetPath)} from ${report.opsCopied} ops`);\n const rows = report.rebuiltRows;\n const shape = [\"workstreams\", \"tasks\", \"task_edges\", \"task_notes\"]\n .map((t) => `${rows[t] ?? 0} ${t}`)\n .join(\", \");\n console.log(pc.dim(` projected ${report.opsProjected} ops -> ${shape}`));\n const logOnly = Object.entries(report.logOnlyByEntity);\n if (logOnly.length > 0) {\n console.log(\n pc.dim(\n ` copied ${logOnly.map(([e, n]) => `${n} ${e}`).join(\", \")} (log-only, no table to project into)`,\n ),\n );\n }\n console.log(pc.dim(` machine_id preserved: ${report.machineId}`));\n\n // The part an operator MUST NOT miss: their agent registry is gone.\n // Never silent — see src/rebuild.ts for why these tables cannot be\n // rebuilt and why that is correct rather than a gap.\n if (report.machineLocalLost.length > 0) {\n const lost = report.machineLocalLost.map((l) => `${l.rows} ${l.table}`).join(\", \");\n console.log(\n pc.yellow(\n ` NOT rebuilt: ${lost}. These tables have no capture triggers, so they leave no ops.`,\n ),\n );\n console.log(\n pc.dim(\n \" That is expected: pane ids and absolute worktree paths are meaningless after a rebuild.\",\n ),\n );\n console.log(pc.dim(\" Re-spawn agents once you have swapped the DB in.\"));\n }\n\n console.log(pc.dim(` swap it in: ${swapCommand(report.targetPath)}`));\n}\n\n// ─── commander wiring ────────────────────────────────────────────────\n\nimport type { Command } from \"commander\";\nimport { emitJson, handle, JSON_OPT } from \"../cli.js\";\n\nexport function wireRebuildCommand(program: Command): void {\n program\n .command(\"rebuild <file>\")\n .description(\n \"Replay the ops log into a NEW DB file (disaster recovery); prints the swap command\",\n )\n .option(...JSON_OPT)\n .option(\"--force\", \"replace <file> if it already exists (deleted first, never merged into)\")\n .action(function (file: string) {\n const opts = (this as Command).opts() as RebuildCmdOptions;\n return handle((db) => cmdRebuild(db, file, opts), this as Command)();\n });\n}\n","// mu — `mu sync`: ONE verb, whose bare form is a PEER STATUS REPORT.\n//\n// The sync itself is incidental. Every mu invocation already flushes and\n// ingests (the ambient hook in src/cli/handle.ts), so a verb that only\n// did that would exist for reassurance. What no other command answers is\n// \"who are my peers, how far behind am I, and when did I last hear from\n// them\" — so that is what the bare form prints:\n//\n// $ mu sync\n// flushed 14 ops · ingested 22 from 1 peer\n// machine last seen behind\n// devbox 2m ago 0\n// desktop 3d ago 47 ← stale\n//\n// It keeps its bare form for scripting ergonomics too: `rsync ... && mu\n// sync` reads correctly where `rsync ... && mu state` reads like an\n// accident.\n//\n// TWO FLAGS, AND ONLY TWO, because nothing else can express them:\n//\n// --from <path> a DIFFERENT READER — a peer's `mu.db` ops table via\n// SQLite rather than a JSONL segment. For an sshfs\n// mount or a copied file.\n// --repair <peer> reset that peer's watermark and re-read its segment\n// from zero. Safe because ingest is idempotent via\n// UNIQUE (machine_id, hlc).\n//\n// DELIBERATELY ABSENT: `mu peers` (folded into the bare form here), and\n// `--to <dir>` / `--from <dir>`. A one-off directory needs no flag —\n// `MU_SYNC_DIR=/mnt/usb mu state` already ingests from the USB stick\n// using the repo's existing env-var-override idiom, and adding a flag for\n// it would be a second way to say the same thing.\n//\n// ALSO ABSENT, permanently: `--push` / `--pull <host>`. mu reads and\n// writes FILES; the operator owns transport (a standing ROADMAP pledge).\n// When a peer is stale we PRINT an rsync line and let them paste it.\n//\n// This verb opts OUT of the ambient hook (`ambientSync: false`) and runs\n// the pass itself. Not to skip work — to report honest numbers. If the\n// hook ran first, its ingest would have consumed everything and the\n// report would print \"ingested 0\" immediately after doing the opposite.\n\nimport { emitJson, handle, JSON_OPT } from \"../cli.js\";\nimport type { Db } from \"../db.js\";\nimport { muTable, pc } from \"../output.js\";\nimport { type IngestResult, syncDir, syncPass } from \"../segments.js\";\nimport {\n foreignVersionMessage,\n type IngestFromDbResult,\n ingestFromDb,\n type PeerStatus,\n peerStatuses,\n repairPeer,\n} from \"../sync.js\";\nimport { relTime } from \"./format.js\";\n\nexport interface SyncCmdOptions {\n json?: boolean;\n from?: string;\n repair?: string;\n}\n\n/** Relative time, or a marker when transport never delivered anything. */\nfunction lastSeen(peer: PeerStatus): string {\n if (peer.ageMs === null) return \"—\";\n return `${relTime(peer.ageMs)} ago`;\n}\n\n/** Peer advice in prose (stale transport, a damaged segment): the data is in `peers`. */\nfunction peerAdvice(peers: readonly PeerStatus[]): string[] {\n const out: string[] = [];\n const stale = peers.filter((p) => p.stale).length;\n if (stale > 0) {\n out.push(\n `${stale} stale peer${stale === 1 ? \"\" : \"s\"}: move their segments in (Syncthing, rsync, a USB stick)`,\n );\n }\n const damaged = peers.find((p) => p.behind > 0);\n if (damaged !== undefined) {\n out.push(`re-read a damaged segment from zero: mu sync --repair ${damaged.short}`);\n }\n return out;\n}\n\nfunction renderPeerTable(peers: readonly PeerStatus[]): string {\n if (peers.length === 0) {\n return pc.dim(\" (no peers yet — drop another machine's segment in the sync dir)\");\n }\n const table = muTable({\n head: [pc.bold(\"machine\"), pc.bold(\"last seen\"), pc.bold(\"behind\"), pc.bold(\"\")],\n });\n for (const peer of peers) {\n const flags: string[] = [];\n if (peer.stale) flags.push(pc.yellow(\"← stale\"));\n if (peer.conflictCopy) flags.push(pc.dim(\"(conflict copy)\"));\n table.push([peer.short, lastSeen(peer), String(peer.behind), flags.join(\" \")]);\n }\n return table.toString();\n}\n\n/** \"ingested 22 from 2 peers\", or the honest nothing-happened form. */\nfunction describeIngest(results: readonly IngestResult[]): string {\n const total = results.reduce((sum, r) => sum + r.applied, 0);\n const from = results.filter((r) => r.applied > 0).length;\n if (total === 0) return \"ingested 0\";\n return `ingested ${total} from ${from} peer${from === 1 ? \"\" : \"s\"}`;\n}\n\nexport async function cmdSync(db: Db, opts: SyncCmdOptions = {}): Promise<void> {\n const dir = syncDir();\n\n // `--from <path>` is the one shape that works with sync unconfigured:\n // it names its source outright, so there is no dir to need.\n if (opts.from !== undefined) {\n const result = ingestFromDb(db, opts.from);\n // Flush afterwards so the ops we just took on are in our own segment\n // for any peer sharing the dir — that is how a laptop relays the\n // devserver's work to a third machine (gossip, for free).\n const flushed = dir === null ? null : await syncPass(db, dir);\n emitFrom(db, result, flushed?.flushed.appended ?? 0, dir, opts);\n return;\n }\n\n if (dir === null) {\n if (opts.json === true) {\n emitJson({\n syncDir: null,\n enabled: false,\n flushed: 0,\n ingested: [],\n peers: [],\n });\n return;\n }\n console.log(\n pc.dim(\n \"sync is off: export MU_SYNC_DIR=<folder> on every machine, then share that folder (Syncthing, rsync, a USB stick)\",\n ),\n );\n return;\n }\n\n // `--repair` is just \"reset the watermark\"; the pass below then\n // re-reads that peer's segment from zero. Resolved BEFORE the pass so a\n // bad ref errors without half-doing anything.\n const repaired = opts.repair === undefined ? null : repairPeer(db, opts.repair, dir);\n\n const pass = await syncPass(db, dir);\n const peers = peerStatuses(db, dir);\n if (pass.flushed.lockBusy === true && opts.json !== true) {\n process.stderr.write(\n \"mu: sync: own segment is locked by another mu process; local ops stay pending and the next flush appends them\\n\",\n );\n }\n\n if (opts.json === true) {\n emitJson({\n syncDir: dir,\n enabled: true,\n repaired: repaired === null ? null : repaired.machineId,\n flushed: pass.flushed.appended,\n skippedLocal: pass.flushed.skippedLocal,\n selfRepaired: pass.flushed.selfRepaired,\n lockBusy: pass.flushed.lockBusy === true,\n foreignVersionAt: pass.flushed.foreignVersionAt,\n foreignVersion: pass.flushed.foreignVersion,\n ingested: pass.ingested.map((r) => ({\n machineId: r.machineId,\n applied: r.applied,\n changed: r.changed,\n watermark: r.watermark,\n defects: r.defects,\n })),\n peers,\n });\n return;\n }\n\n if (repaired !== null) {\n console.log(pc.dim(`repaired ${repaired.short}: watermark reset, re-reading from zero`));\n }\n if (pass.flushed.selfRepaired !== null) {\n const d = pass.flushed.selfRepaired;\n console.log(\n pc.yellow(\n ` own segment was defective past line ${d.line} (${d.kind}: ${d.detail}) — truncated to the last good line and regenerated from the ops table`,\n ),\n );\n }\n if (pass.flushed.foreignVersionAt !== null) {\n console.log(pc.yellow(` ${foreignVersionMessage(pass.flushed)}`));\n }\n console.log(`flushed ${pass.flushed.appended} ops · ${describeIngest(pass.ingested)}`);\n console.log(renderPeerTable(peers));\n for (const result of pass.ingested) {\n for (const defect of result.defects) {\n console.log(\n pc.yellow(\n ` ${result.machineId.slice(0, 8)}: ${defect.kind} at line ${defect.line} — ${defect.detail}`,\n ),\n );\n }\n }\n for (const line of peerAdvice(peers)) console.log(pc.dim(line));\n}\n\nfunction emitFrom(\n db: Db,\n result: IngestFromDbResult,\n flushed: number,\n dir: string | null,\n opts: SyncCmdOptions,\n): void {\n const peers = dir === null ? [] : peerStatuses(db, dir);\n if (opts.json === true) {\n emitJson({\n from: result.path,\n read: result.read,\n changed: result.changed,\n skippedLocal: result.skippedLocal,\n flushed,\n peers,\n });\n return;\n }\n console.log(\n `read ${result.read} ops from ${pc.bold(result.path)} · ${result.changed} changed rows`,\n );\n if (result.skippedLocal > 0) {\n console.log(pc.dim(` skipped ${result.skippedLocal} machine-local ops (they never travel)`));\n }\n}\n\n// ─── commander wiring ────────────────────────────────────────────────\n\nimport type { Command } from \"commander\";\n\nexport function wireSyncCommand(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Report peer status (flush + ingest happen on every mu invocation anyway)\")\n .option(...JSON_OPT)\n .option(\"--from <path>\", \"ingest from a peer's mu.db directly (sshfs mount or copied file)\")\n .option(\"--repair <peer>\", \"reset that peer's watermark and re-read its segment from zero\")\n .action(function () {\n const opts = (this as Command).opts() as SyncCmdOptions;\n // ambientSync: false — this verb IS the pass, and running it twice\n // would print \"ingested 0\" for work the hook had just done.\n return handle((db) => cmdSync(db, opts), this as Command, { ambientSync: false })();\n });\n}\n","// mu — `mu workstream` verbs (init / list / teardown).\n//\n// A workstream = one mux session (`mu-<name>`) + every DB row tagged\n// with that name (agents / tasks / edges / notes / worktrees / logs).\n// `init` creates the session + DB row pair; `list` shows\n// every workstream on the machine; `teardown` is the symmetric inverse:\n// soft (sets torn_down_at), previewed first, applied with `--if <rev>`.\n\nimport { basename } from \"node:path\";\nimport { emitJson, parseNonNegativeInt, resolveWorkstream, UsageError } from \"../cli.js\";\nimport { type Db, tornDownAtOf } from \"../db.js\";\nimport { type AttachTarget, activeMux, attachShellLine, type MuxBackend } from \"../mux.js\";\nimport { muTable, pc } from \"../output.js\";\nimport {\n assertWorkstreamInitable,\n ensureWorkstream,\n listEmptyWorkstreams,\n listTornDownWorkstreams,\n listWorkstreams,\n previewReinit,\n reinitWorkstream,\n summarizeWorkstream,\n sweepRevision,\n teardownWorkstream,\n WorkstreamRevisionMismatchError,\n workstreamRevision,\n} from \"../workstream.js\";\nimport { setNextOutcome } from \"./handle.js\";\nimport { clipPlain, clippedRecord, type PageOut, pageOut, shrinkItem } from \"./page-records.js\";\n\nexport async function cmdInit(\n db: Db,\n name: string,\n opts: { json?: boolean; if?: number } = {},\n): Promise<void> {\n assertWorkstreamInitable(name, db);\n const sessionName = `mu-${name}`;\n // A torn-down name is reused only after a preview: init then hard-deletes\n // the old rows (one op group with the new row). Without --if it writes\n // nothing and creates no session.\n const reuse = previewReinit(db, name);\n if (reuse !== null && opts.if === undefined) {\n setNextOutcome({\n kind: \"preview\",\n apply: [\"mu\", \"workstream\", \"init\", name],\n revision: reuse.revision,\n });\n if (opts.json) {\n emitJson({\n workstreamName: name,\n created: false,\n dryRun: true,\n tornDownAt: reuse.tornDownAt,\n tasks: reuse.tasks,\n notes: reuse.notes,\n edges: reuse.edges,\n revision: reuse.revision,\n });\n return;\n }\n console.log(\n `will permanently delete torn-down ${name}: ${reuse.tasks} tasks, ${reuse.notes} notes; rev=${reuse.revision}`,\n );\n return;\n }\n if (reuse !== null && opts.if !== undefined) await reinitWorkstream(db, name, opts.if);\n const dbCreated = ensureWorkstream(db, name) || reuse !== null;\n // Load-bearing: `workstream init` IS session creation.\n const mux = await activeMux();\n // Creates the session with its placeholder `_mu` window, or repairs\n // a missing `_mu` (the operator killed it after the first spawn;\n // without it, tmux a -t mu-<ws> lands on an agent's pane instead of\n // the orchestration shell).\n const { created: sessionCreated, repaired: muWindowRepaired } =\n await mux.ensureSession(sessionName);\n const sessionAlready = !sessionCreated;\n const created = !sessionAlready || dbCreated;\n // Naming convention (docs/reference/naming.md): <project>-<purpose>,\n // so two repos never share `auth` and `workstream list` groups by project.\n const nameHint = name.includes(\"-\")\n ? undefined\n : `name workstreams <project>-<purpose> (e.g. ${projectGuess() ?? \"repo\"}-${name}); one per effort`;\n const attach = await attachLine(mux, { session: sessionName });\n if (opts.json) {\n emitJson({\n workstreamName: name,\n muxSession: sessionName,\n created,\n muxSessionAlreadyExisted: sessionAlready,\n dbRowAlreadyExisted: !dbCreated,\n muWindowRepaired,\n ...(nameHint && created ? { hint: nameHint } : {}),\n ...(attach !== undefined ? { attach } : {}),\n });\n return;\n }\n if (sessionAlready && !dbCreated) {\n const repaired = muWindowRepaired ? ` — ${pc.yellow(\"repaired missing _mu window\")}` : \"\";\n console.log(\n pc.dim(\n `workstream \"${name}\" already exists (mux session ${sessionName}, DB row registered)${repaired}`,\n ),\n );\n return;\n }\n console.log(`Created workstream ${pc.bold(name)} (mux session ${pc.bold(sessionName)})`);\n if (nameHint && created) console.log(pc.dim(`hint: ${nameHint}`));\n if (attach !== undefined) console.log(pc.dim(`attach: ${attach}`));\n}\n\n/** The attach line, or none when the backend cannot resolve the target\n * (herdr: no such workspace): it is information, never a failure. */\nasync function attachLine(mux: MuxBackend, target: AttachTarget): Promise<string | undefined> {\n try {\n return attachShellLine(await mux.attachCommands(target));\n } catch {\n return undefined;\n }\n}\n\n/** The cwd's repo or folder name, lowercased into a workstream-legal slug. */\nfunction projectGuess(): string | undefined {\n const base = basename(process.cwd())\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^[^a-z]+/, \"\")\n .replace(/-+$/, \"\");\n return base === \"\" ? undefined : base;\n}\n\n/** Rows of `workstream list` and `--torn-down`, as text records or one capped JSON page. */\nfunction emitWorkstreamPage(page: PageOut): void {\n if (page.data !== undefined) {\n emitJson(page.data);\n return;\n }\n for (const line of page.lines) console.log(line);\n}\n\n/** `item` with each named text field clipped to `scale` x its limit (cut counted); `whole` clips nothing. */\nfunction clipFields<T extends object>(\n row: T,\n limits: { [K in keyof T]?: number },\n scale: number,\n): { item: T; cut: number } {\n const item = { ...row };\n let cut = 0;\n for (const k of Object.keys(limits) as (keyof T)[]) {\n const v = item[k];\n if (typeof v !== \"string\") continue;\n const one = clipPlain(v, Math.floor((limits[k] ?? 0) * scale));\n item[k] = one.text as T[keyof T];\n cut += one.cut;\n }\n return { item, cut };\n}\n\nconst SUMMARY_LIMITS = { name: 64, muxSession: 80 };\nconst TORN_DOWN_LIMITS = { name: 64, group: 64, at: 40 };\n\nexport async function cmdWorkstreamList(\n db: Db,\n opts: { json?: boolean; tornDown?: boolean; all?: boolean } = {},\n): Promise<void> {\n const json = opts.json === true;\n const whole = opts.all === true;\n const retrieve = `mu workstream list${opts.tornDown === true ? \" --torn-down\" : \"\"} --all${json ? \" --json\" : \"\"}`;\n // `--torn-down` answers a DIFFERENT question (\"what did I remove, and\n // how do I get it back\") from the torn-down rows plus the ops log (old\n // hard teardowns), so it replaces the listing instead of adding rows to it.\n // Mixing the two would need a status column on every row to say which\n // half each came from.\n if (opts.tornDown === true) {\n const gone = listTornDownWorkstreams(db);\n if (gone.length === 0 && !json) {\n console.log(pc.dim(\"no torn-down workstreams\"));\n return;\n }\n // One record per teardown: `group` is the only actionable column\n // (`mu log --group <group>`), so it leads after the name, in full.\n emitWorkstreamPage(\n pageOut(gone, {\n json,\n whole,\n singleRetrieve: true,\n text: (r, all) =>\n clippedRecord(\n [\"torn-down\", r.name, r.group, r.at, r.kind === \"soft\" ? \"kept\" : \"deleted\"],\n `tasks=${r.tasks} edges=${r.edges} notes=${r.notes}${r.recreated ? \" recreated\" : \"\"}`,\n all,\n ),\n item: (r, all) =>\n all ? { item: r, cut: 0 } : shrinkItem((scale) => clipFields(r, TORN_DOWN_LIMITS, scale)),\n resume: () => retrieve,\n }),\n );\n return;\n }\n const summaries = await listWorkstreams(db);\n if (summaries.length === 0 && !json) {\n console.log(pc.dim(\"no workstreams found\"));\n return;\n }\n emitWorkstreamPage(\n pageOut(summaries, {\n json,\n whole,\n singleRetrieve: true,\n text: (r, all) =>\n clippedRecord(\n [\"workstream\", r.name, r.muxAlive ? \"alive\" : \"-\"],\n `agents=${r.agentCount} tasks=${r.taskCount} edges=${r.edgeCount} notes=${r.noteCount}`,\n all,\n ),\n item: (r, all) =>\n all ? { item: r, cut: 0 } : shrinkItem((scale) => clipFields(r, SUMMARY_LIMITS, scale)),\n resume: () => retrieve,\n }),\n );\n}\n\nexport async function cmdTeardown(\n db: Db,\n opts: {\n workstream?: string;\n if?: number;\n json?: boolean;\n empty?: boolean;\n },\n): Promise<void> {\n if (opts.empty) {\n await cmdTeardownEmpty(db, opts);\n return;\n }\n const workstream = await resolveWorkstream(opts.workstream);\n const summary = await summarizeWorkstream(db, { workstream });\n const tornDownAt = tornDownAtOf(db, workstream);\n const hasLocalState = summary.muxAlive || summary.agentCount > 0;\n // Already torn down with nothing local left: a no-op. A torn-down name\n // that still has agents or a session here (a peer tore it down)\n // IS worth finishing locally, so it falls through.\n // Empty-but-registered workstreams (a row in `workstreams` with no\n // agents/tasks/etc.) ARE worth tearing down — otherwise the bare\n // registry row is orphaned forever. nothingToDo is the strict\n // intersection: nothing on disk, in mux, OR in the DB.\n const nothingToDo =\n tornDownAt !== null\n ? !hasLocalState\n : !summary.muxAlive &&\n !summary.registered &&\n summary.agentCount === 0 &&\n summary.taskCount === 0 &&\n summary.noteCount === 0 &&\n summary.worktreeCount === 0;\n\n if (nothingToDo) {\n const reason =\n tornDownAt !== null ? `already torn down (at ${tornDownAt})` : \"nothing to tear down\";\n if (opts.json) {\n emitJson({ workstreamName: workstream, tornDown: false, reason, summary });\n return;\n }\n console.log(\n pc.dim(\n tornDownAt !== null\n ? `workstream \"${workstream}\" is already torn down (at ${tornDownAt}); nothing left on this machine`\n : `workstream \"${workstream}\" has no mux session and no DB rows; nothing to tear down`,\n ),\n );\n return;\n }\n\n const revision = workstreamRevision(db, workstream);\n if (opts.if === undefined) {\n setNextOutcome({\n kind: \"preview\",\n apply: [\"mu\", \"workstream\", \"teardown\", workstream],\n revision,\n });\n if (opts.json) {\n emitJson({\n workstreamName: workstream,\n tornDown: false,\n dryRun: true,\n revision,\n summary,\n });\n return;\n }\n console.log(pc.bold(`Workstream ${workstream} (mux session ${summary.muxSession})`));\n console.log(\n ` mux session : ${summary.muxAlive ? pc.yellow(\"alive (will be killed)\") : pc.dim(\"not running\")}`,\n );\n console.log(` agents : ${summary.agentCount}`);\n console.log(\n ` tasks : ${summary.taskCount} (edges: ${summary.edgeCount}, notes: ${summary.noteCount}; kept)`,\n );\n console.log(\n ` worktrees : ${summary.worktreeCount}${summary.worktreeCount > 0 ? pc.dim(\" (kept: teardown never removes one)\") : \"\"}`,\n );\n console.log(` rev=${revision}`);\n console.log(\"\");\n console.log(pc.dim(\"(preview; nothing changed. Apply with --if <rev>)\"));\n return;\n }\n\n const result = await teardownWorkstream(db, { workstream, ifRevision: opts.if });\n if (opts.json) {\n emitJson({\n workstreamName: workstream,\n tornDown: true,\n ...result,\n });\n return;\n }\n console.log(pc.bold(`Workstream ${workstream} (mux session ${summary.muxSession})`));\n console.log(\n ` mux session : ${summary.muxAlive ? pc.yellow(\"alive (will be killed)\") : pc.dim(\"not running\")}`,\n );\n console.log(` agents : ${summary.agentCount}`);\n console.log(\n ` tasks : ${summary.taskCount} (edges: ${summary.edgeCount}, notes: ${summary.noteCount}; kept)`,\n );\n console.log(` worktrees : ${summary.worktreeCount} (kept)`);\n console.log(\"\");\n console.log(\n `Tore down ${pc.bold(workstream)}: killed mux=${result.killedMux}, agents=${result.deletedAgents}; kept tasks=${result.tasks}, edges=${result.edges}, notes=${result.notes}, worktrees=${result.keptWorktrees.length}`,\n );\n if (result.orphanedAgents.length > 0) {\n console.log(\"\");\n console.log(\n pc.yellow(\n `KEPT ${result.orphanedAgents.length} agent row(s): the recorded pane is still alive (or could not be checked): ${result.orphanedAgents.map((o) => `${o.name} (${o.paneId})`).join(\", \")}`,\n ),\n );\n for (const o of result.orphanedAgents) {\n console.log(\n pc.dim(\n ` once its pane is gone, preview its close: mu agent close ${o.name} -w ${workstream}`,\n ),\n );\n }\n }\n if (result.keptWorktrees.length > 0) {\n console.log(\"\");\n console.log(pc.yellow(\"Worktrees are never removed by teardown; they are still registered:\"));\n for (const w of result.keptWorktrees) {\n console.log(\n ` - ${w.agent}: ${w.path} (preview its close: mu agent close ${w.agent} -w ${workstream})`,\n );\n }\n }\n}\n\n// ─── cmdTeardownEmpty ─────────────────────────────────────────────────\n//\n// `mu workstream teardown --empty` sweeps every workstream with no\n// user-meaningful state (zero tasks, agents, worktrees), except\n// `scratch`, whose idle session is kept alive on purpose. It never\n// sweeps an unregistered `mu-*` session: with no DB row there is no\n// evidence it is idle (see listEmptyWorkstreams); the human output\n// names them so the operator can tear one down explicitly.\n// Each workstream's teardown is its own op group\n// (`mu workstream list --torn-down` lists the groups). Without `--if` it\n// previews the set and prints the sweep revision; `--empty --if <rev>`\n// recomputes the revision (a member added, removed or changed refuses the\n// sweep), then tears each down with the revision it had in that snapshot.\n// Per-workstream teardown errors are accumulated into a `failed` array\n// so a single bad pane doesn't abort the rest of the cleanup. See\n// workstream_destroy_empty_sweep.\n\ninterface EmptyTeardownResult {\n workstreamName: string;\n killedMux: boolean;\n deletedAgents: number;\n}\n\ninterface EmptyDestroyFailure {\n workstreamName: string;\n error: string;\n}\n\n/** Read created_at for a registered workstream; the empty string when\n * the row is gone (keeps the signature total). */\nfunction workstreamCreatedAt(db: Db, name: string): string {\n const row = db.prepare(\"SELECT created_at FROM workstreams WHERE name = ?\").get(name) as\n | { created_at: string }\n | undefined;\n return row?.created_at ?? \"\";\n}\n\nasync function cmdTeardownEmpty(\n db: Db,\n opts: {\n workstream?: string;\n if?: number;\n json?: boolean;\n },\n): Promise<void> {\n // --empty is a sweep verb; -w (target a single workstream)\n // contradicts it. Fail loud with exit 2 (UsageError) so a typo\n // (`--empty -w foo`) doesn't silently sweep instead of targeting\n // `foo`.\n if (opts.workstream !== undefined) {\n throw new UsageError(\n \"--empty is mutually exclusive with a named target (positional <name> or -w/--workstream): the sweep targets every empty workstream, so naming one contradicts it\",\n );\n }\n const empties = await listEmptyWorkstreams(db);\n // One snapshot: the sweep revision is the hash of exactly these member\n // revisions, and the apply below passes each member ITS snapshot revision,\n // never a fresh one (a fresh read would bless a change made since the\n // preview).\n const snapshot = new Map(empties.map((e) => [e.name, workstreamRevision(db, e.name)]));\n const revision = sweepRevision(snapshot);\n\n if (opts.if === undefined) {\n if (empties.length > 0) {\n setNextOutcome({\n kind: \"preview\",\n apply: [\"mu\", \"workstream\", \"teardown\", \"--empty\"],\n revision,\n });\n }\n if (opts.json) {\n emitJson({ items: empties, count: empties.length, revision });\n return;\n }\n if (empties.length === 0) {\n console.log(pc.dim(\"no empty workstreams found\"));\n return;\n }\n const table = muTable({\n head: [\"workstream\", \"created_at\", \"mux\"].map((h) => pc.bold(h)),\n colWidths: [40, null, null],\n });\n for (const ws of empties) {\n const createdAt = workstreamCreatedAt(db, ws.name);\n // Em-dash if the row vanished between list and render, so the\n // column never goes visually empty (matches the mux column).\n const createdCell = createdAt === \"\" ? pc.dim(\"\\u2014\") : pc.dim(createdAt);\n table.push([ws.name, createdCell, ws.muxAlive ? pc.green(\"alive\") : pc.dim(\"\\u2014\")]);\n }\n console.log(table.toString());\n console.log(\"\");\n console.log(\n pc.dim(\n `${empties.length} empty workstream${empties.length === 1 ? \"\" : \"s\"} would be torn down (preview; rev=${revision}).`,\n ),\n );\n return;\n }\n\n // --if path: the set must be the one that was previewed.\n if (opts.if !== revision) {\n throw new WorkstreamRevisionMismatchError(\n \"(empty sweep)\",\n opts.if,\n revision,\n \"mu workstream teardown --empty\",\n );\n }\n // No-op early if there's nothing to do.\n if (empties.length === 0) {\n if (opts.json) {\n emitJson({ tornDown: 0, results: [], failed: [] });\n return;\n }\n console.log(pc.dim(\"no empty workstreams found; nothing to tear down\"));\n return;\n }\n\n const results: EmptyTeardownResult[] = [];\n const failed: EmptyDestroyFailure[] = [];\n for (const ws of empties) {\n try {\n // The member's snapshot revision, checked again inside its own\n // commit transaction: a change made while an earlier member was being\n // torn down refuses this one.\n const result = await teardownWorkstream(db, {\n workstream: ws.name,\n ifRevision: snapshot.get(ws.name) ?? 0,\n });\n results.push({\n workstreamName: ws.name,\n killedMux: result.killedMux,\n deletedAgents: result.deletedAgents,\n });\n } catch (err) {\n // Best-effort sweep: log the failure and keep going. Every\n // workstream torn down before or after this one wrote its own\n // op group, so a half-completed sweep leaves no partial state.\n failed.push({\n workstreamName: ws.name,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (opts.json) {\n emitJson({ tornDown: results.length, results, failed });\n return;\n }\n for (const r of results) {\n console.log(\n `Tore down ${pc.bold(r.workstreamName)} ${pc.dim(\n `(killedMux=${r.killedMux}, agents=${r.deletedAgents})`,\n )}`,\n );\n }\n if (failed.length > 0) {\n console.log(\"\");\n console.log(\n pc.yellow(\n `WARNING: ${failed.length} workstream${failed.length === 1 ? \"\" : \"s\"} could not be torn down cleanly:`,\n ),\n );\n for (const f of failed) {\n console.log(` - ${f.workstreamName}: ${f.error}`);\n }\n }\n console.log(\"\");\n console.log(pc.dim(`Sweep complete: tornDown=${results.length}, failed=${failed.length}.`));\n}\n\n// ─── commander wiring ────────────────────────────────────────────────\n//\n// wireWorkstreamCommands is called by buildProgram() in src/cli.ts. Wired here so\n// every per-namespace builder lives next to its cmd functions.\n\nimport type { Command } from \"commander\";\nimport { handle, JSON_OPT, WORKSTREAM_OPT } from \"../cli.js\";\n\n/** Fold an optional positional workstream name into the opts bag.\n *\n * dogfood-destroy-w-flag: `workstream init` takes its target\n * POSITIONALLY while `teardown` only took `-w`, so\n * `mu workstream teardown v2 --yes` printed help (\"too many\n * arguments\") instead of tearing down. The positional is now an\n * additive ALIAS for -w on both verbs; -w keeps working unchanged.\n * Supplying both is a usage error rather than a silent pick-one.\n *\n * Codifies the CLI's flag-vs-positional rule: the primary entity a\n * verb acts on is positional; everything else is a flag. See\n * docs/reference/naming.md. */\nexport function withPositionalWorkstream<T extends { workstream?: string }>(\n opts: T,\n name: string | undefined,\n): T {\n if (name === undefined) return opts;\n if (opts.workstream !== undefined && opts.workstream !== name) {\n throw new UsageError(\n `workstream given twice and they disagree: positional ${JSON.stringify(name)} vs -w ${JSON.stringify(opts.workstream)}; pass it once`,\n { showHelp: false },\n );\n }\n return { ...opts, workstream: name };\n}\n\nexport function wireWorkstreamCommands(program: Command): void {\n const workstream = program\n .command(\"workstream\")\n .description(\n \"Workstream-level commands. Name them <project>-<purpose> (hail-auth), one per effort; tear down when it ships. Reviews nobody will track belong in scratch delegates, not a workstream.\",\n );\n\n workstream\n .command(\"init <name>\")\n .description(\n \"Create the workstream's mux session and register it in the DB. Name it <project>-<purpose>. A torn-down name is previewed first (it permanently deletes the old rows); apply with --if <rev>.\",\n )\n .option(\"--if <rev>\", \"the revision from the preview\", parseNonNegativeInt)\n .option(...JSON_OPT)\n .action(function (name: string) {\n const opts = (this as Command).opts() as { json?: boolean; if?: number };\n return handle((db) => cmdInit(db, name, opts), this as Command)();\n });\n\n workstream\n .command(\"list\")\n .description(\"List every registered workstream on this machine\")\n .option(\n \"--torn-down\",\n \"instead list torn-down workstreams (and pre-cut-over teardowns from the ops log), with the op group id (`mu log --group <id>`)\",\n )\n .option(\"--all\", \"every workstream, uncapped (a list is capped at 4 KB; a cut names this)\")\n .option(...JSON_OPT)\n .action(function () {\n const opts = (this as Command).opts() as {\n json?: boolean;\n tornDown?: boolean;\n all?: boolean;\n };\n return handle((db) => cmdWorkstreamList(db, opts), this as Command)();\n });\n\n workstream\n .command(\"teardown [name]\")\n .description(\n \"Soft teardown: kill the mux session, delete agent rows, mark the workstream torn down (tasks, notes, worktrees stay). Without --if it previews `rev=<n>`; apply with --if <n>. --empty sweeps empty workstreams, never scratch.\",\n )\n .option(...WORKSTREAM_OPT)\n .option(\"--if <rev>\", \"apply the preview with this revision\", parseNonNegativeInt)\n .option(\n \"--empty\",\n \"sweep every empty workstream (zero tasks, agents, worktrees); never scratch; mutually exclusive with -w\",\n )\n .option(...JSON_OPT)\n .action(function (name: string | undefined) {\n const opts = (this as Command).opts() as {\n workstream?: string;\n if?: number;\n json?: boolean;\n empty?: boolean;\n };\n return handle(\n (db) => cmdTeardown(db, withPositionalWorkstream(opts, name)),\n this as Command,\n )();\n });\n}\n"],"mappings":"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","names":["readFileSync","dirname","join","fileURLToPath","process","stripVTControlCharacters","cmd","command","line","str","process","stripVTControlCharacters","command","option","path","editDistance","path","editDistance","exitCode","command","resolve","AgentNotFoundError","tail","program","program","fixedLines","wrap","page","line","tail","id","tail","page","program","tail","line","program","program","dirname","path","sizeOf","dirname","r","program","i","cols","editDistance","n","result","page","resolve","cmd","program","spawn","existsSync","mkdirSync","dirname","join","resolve","dirname","join","existsSync","path","resolve","mkdirSync","sent","spawn","readdirSync","rmSync","dirname","join","sizeOf","readdirSync","join","dirname","days","exists","rmSync","kept","r","program","dirname","existsSync","readFileSync","dirname","join","fileURLToPath","join","dirname","existsSync","readFileSync","fileURLToPath","line","dirname","reconcile","report","program","command","program","program","line","resolve","program","kept","program","program","program","line","program","line","program","tail","editDistance","dirname","fileURLToPath","join","readFileSync","program"]}
|