@iowarp/clio-coder 0.3.0 → 0.3.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/CHANGELOG.md +33 -0
- package/README.md +50 -53
- package/dist/acp-FPR54DGL.js +138 -0
- package/dist/{agents-Q4MYPMUW.js → agents-OGPIHPJH.js} +33 -25
- package/dist/assets/codewiki.json +1 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
- package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
- package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter.wasm +0 -0
- package/dist/{auth-O6HYIJ6J.js → auth-IC3K6NIZ.js} +22 -15
- package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
- package/dist/chunk-3I7MS7N2.js +40 -0
- package/dist/chunk-3R73A4XB.js +69 -0
- package/dist/{chunk-26BZQOAD.js → chunk-474KN5II.js} +86 -115
- package/dist/{chunk-NI4DEJMC.js → chunk-4QKXUHSR.js} +26 -3
- package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
- package/dist/{chunk-TFSSEXL6.js → chunk-673JJUWJ.js} +14 -4
- package/dist/{chunk-GNGDQYDU.js → chunk-7SS2CTV2.js} +27922 -1249
- package/dist/{chunk-7RBKDI66.js → chunk-ASND7OZK.js} +104 -12
- package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
- package/dist/{chunk-RQDWMVRB.js → chunk-BSU2YIWB.js} +9 -3
- package/dist/{chunk-CLJ5HLUD.js → chunk-C4PTHK7P.js} +24 -5
- package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
- package/dist/{chunk-BYEU76JP.js → chunk-DKGKUHFA.js} +34 -9
- package/dist/chunk-EYOKLTMF.js +170 -0
- package/dist/{chunk-PS4PFJQP.js → chunk-FCIH3BIZ.js} +15258 -14130
- package/dist/{chunk-2J63S4SF.js → chunk-FST4FYJB.js} +82 -14
- package/dist/{chunk-3DANZDGR.js → chunk-G34LV2PF.js} +34 -9
- package/dist/{chunk-BBUH4VAA.js → chunk-GAEBEQVI.js} +34 -21
- package/dist/chunk-GB6QRBXN.js +8543 -0
- package/dist/chunk-GEP36Y4X.js +12796 -0
- package/dist/{chunk-TKHQ4DGZ.js → chunk-H6F6BYOH.js} +496 -121
- package/dist/{chunk-UGYAX5YI.js → chunk-HQQID6OA.js} +10 -5
- package/dist/chunk-IHXBNWMM.js +137 -0
- package/dist/{chunk-ME6DNWIU.js → chunk-IS3ONKU3.js} +7 -1
- package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
- package/dist/chunk-K2ITRMHZ.js +642 -0
- package/dist/{chunk-KBR4MZZR.js → chunk-K5XEMXTI.js} +7 -1
- package/dist/{chunk-AMFR5YA3.js → chunk-KKNLWXI6.js} +24 -10
- package/dist/{chunk-JWHCJDCI.js → chunk-KY56HMHH.js} +145 -61
- package/dist/{chunk-E3NYWENM.js → chunk-LU4TK2PR.js} +52 -7
- package/dist/{chunk-UWIJNAOB.js → chunk-M5T5VO65.js} +109 -42
- package/dist/{chunk-JPOWPFCU.js → chunk-MAR7Y6HW.js} +38 -16
- package/dist/chunk-N6F52NLF.js +6951 -0
- package/dist/{chunk-UHTSULZS.js → chunk-NMOX6HFD.js} +20 -7
- package/dist/{chunk-WD6AJM35.js → chunk-OLBBMFRD.js} +30 -13
- package/dist/{chunk-VOO7NYPP.js → chunk-PFEFKVGL.js} +22 -6
- package/dist/{chunk-6CWDTGUC.js → chunk-PIUMUEMV.js} +7 -1
- package/dist/chunk-PV4JUBVJ.js +462 -0
- package/dist/{chunk-527KG6XR.js → chunk-Q3RUPKEJ.js} +22 -4
- package/dist/{chunk-D5YD55AR.js → chunk-Q5WJOSJ7.js} +11 -1
- package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
- package/dist/{chunk-4UQA7NCT.js → chunk-R5KLMSBV.js} +7 -2
- package/dist/{chunk-PIDUD6M2.js → chunk-RDLVBZEO.js} +11 -6
- package/dist/{chunk-O4EJEDHO.js → chunk-RPTR2H26.js} +40 -31
- package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
- package/dist/{chunk-XNISANGE.js → chunk-TEKV33Q5.js} +122 -57
- package/dist/chunk-TXOTCRLG.js +15 -0
- package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
- package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
- package/dist/{chunk-UU3R62TT.js → chunk-XYWBQRDM.js} +13 -4
- package/dist/{chunk-7BHLZB3A.js → chunk-ZPY3JZ5E.js} +32 -10
- package/dist/cli/index.js +39 -33
- package/dist/clio-BZVGEUFJ.js +58 -0
- package/dist/{components-JVHMUBEB.js → components-DMAOEKFB.js} +26 -9
- package/dist/{config-ZFCDBMDC.js → config-IRUQ7SE4.js} +42 -31
- package/dist/configure-S7S6F6CL.js +32 -0
- package/dist/{context-CDXTP2MP.js → context-3KWFLHJG.js} +17 -11
- package/dist/{context-E3KIFVXI.js → context-5RADCKTR.js} +33 -28
- package/dist/{context-clear-3F4PLXOS.js → context-clear-7TSNPAAI.js} +36 -28
- package/dist/{context-index-Q7YSYTR3.js → context-index-W4RLWOQH.js} +10 -4
- package/dist/{docs-YIETIWZI.js → docs-5AWSPS37.js} +16 -10
- package/dist/doctor-UC5NAJYQ.js +77 -0
- package/dist/{eval-B3KZZESM.js → eval-U6TJHRLX.js} +77 -24
- package/dist/{evidence-V67CHM35.js → evidence-YEGUW4L3.js} +34 -26
- package/dist/{evolve-YDZSUQYA.js → evolve-TXARCTPG.js} +39 -26
- package/dist/{extensions-SRG7XCAH.js → extensions-OZFJ3A3G.js} +13 -7
- package/dist/{fleet-CA2CRTVG.js → fleet-6G3DHNYE.js} +45 -37
- package/dist/fleet-preflight-DSNT37JK.js +23 -0
- package/dist/{init-2OZDJE2D.js → init-KZ5QTF6M.js} +42 -34
- package/dist/{memory-3PIQQAKX.js → memory-73ESV5YC.js} +35 -27
- package/dist/{models-DY35XI7Y.js → models-A4PVNWJK.js} +34 -23
- package/dist/{paths-5OMXW7Z4.js → paths-C4H6IV77.js} +12 -6
- package/dist/preload-6WVMHX3A.js +13 -0
- package/dist/{reset-PIFYNOS3.js → reset-BGW6OGMV.js} +17 -11
- package/dist/{run-3VSPP24F.js → run-YTPEYQOH.js} +60 -48
- package/dist/{share-D36RQCXM.js → share-YIFFV4NQ.js} +16 -10
- package/dist/{skills-F2MRLELY.js → skills-2V6RA3OQ.js} +18 -11
- package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-S2TVJO4F.js} +45 -36
- package/dist/{targets-DZMEZAH4.js → targets-TYXLPB23.js} +61 -59
- package/dist/{trace-7NYCUI2J.js → trace-GGOJ6Q6Z.js} +9 -3
- package/dist/{uninstall-AD3JWHBB.js → uninstall-LLLT4F4W.js} +14 -8
- package/dist/{upgrade-WYYBKGDY.js → upgrade-33G2LMM5.js} +45 -23
- package/dist/{usage-ULIDAGFF.js → usage-ZAFSXKKG.js} +35 -27
- package/dist/version-KGEG7EPO.js +21 -0
- package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-NUQCVOQ3.js} +55 -45
- package/dist/worker/entry.js +101 -43
- package/docs/README.md +12 -9
- package/docs/acp.md +28 -5
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +23 -2
- package/docs/artifact-placement.md +101 -0
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +4 -2
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +125 -41
- package/docs/configuration-and-targets.md +88 -18
- package/docs/context-engine.md +6 -2
- package/docs/development-pipeline.md +77 -0
- package/docs/documentation-coverage.md +4 -4
- package/docs/documentation-guide.md +3 -3
- package/docs/environment-variables.md +2 -1
- package/docs/eval-runner.md +3 -3
- package/docs/evals-internal.md +2 -2
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +18 -11
- package/docs/fleet-demo-runbook.md +22 -23
- package/docs/fleet-dispatch.md +111 -12
- package/docs/glossary.md +107 -15
- package/docs/html/agents_blueprint.html +3 -3
- package/docs/html/alcf_blueprint.html +3 -3
- package/docs/html/architecture_blueprint.html +3 -3
- package/docs/html/commands_blueprint.html +187 -42
- package/docs/html/configuration_blueprint.html +7 -7
- package/docs/html/context_blueprint.html +3 -3
- package/docs/html/documentation_blueprint.html +1 -1
- package/docs/html/environment_blueprint.html +3 -3
- package/docs/html/eval_blueprint.html +4 -4
- package/docs/html/evals_internal_blueprint.html +3 -3
- package/docs/html/evolution_blueprint.html +3 -3
- package/docs/html/extensions_blueprint.html +3 -3
- package/docs/html/fleet_dispatch_blueprint.html +8 -8
- package/docs/html/index.html +5 -5
- package/docs/html/lifecycle_blueprint.html +4 -4
- package/docs/html/memory_blueprint.html +3 -3
- package/docs/html/middleware_blueprint.html +3 -3
- package/docs/html/models_blueprint.html +2 -2
- package/docs/html/observability_blueprint.html +2 -2
- package/docs/html/provider_adapter_blueprint.html +3 -3
- package/docs/html/safety_blueprint.html +3 -3
- package/docs/html/skills_blueprint.html +2 -2
- package/docs/html/soak_blueprint.html +3 -3
- package/docs/html/tool_usage_blueprint.html +4 -4
- package/docs/html/tools_blueprint.html +2 -2
- package/docs/html/trace_blueprint.html +3 -3
- package/docs/html/tui_design_blueprint.html +100 -40
- package/docs/html/validation_blueprint.html +1 -1
- package/docs/html/worker_dispatch_blueprint.html +3 -3
- package/docs/installation-and-lifecycle.md +62 -11
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +2 -2
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +12 -12
- package/docs/prompt-envelope-and-tools.md +2 -2
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +4 -0
- package/docs/safety-model.md +21 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +2 -2
- package/docs/skills-marketplace.md +1 -1
- package/docs/time-conventions.md +101 -0
- package/docs/tool-usage.md +5 -4
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +83 -27
- package/docs/worker-dispatch-mechanics.md +3 -3
- package/package.json +16 -16
- package/skills/README.md +5 -6
- package/skills/git/file-ticket/SKILL.md +107 -0
- package/skills/git/file-ticket/evals.md +54 -0
- package/skills/git/fix-issue/SKILL.md +106 -0
- package/skills/git/fix-issue/evals.md +71 -0
- package/skills/git/ship/SKILL.md +92 -0
- package/skills/git/ship/evals.md +72 -0
- package/skills/skill-marketplace.json +12 -20
- package/src/cli/acp.ts +88 -0
- package/src/cli/agents.ts +60 -0
- package/src/cli/args.ts +280 -0
- package/src/cli/argv.ts +170 -0
- package/src/cli/ask.ts +34 -0
- package/src/cli/auth.ts +468 -0
- package/src/cli/bootstrap-generate.ts +498 -0
- package/src/cli/clio.ts +34 -0
- package/src/cli/components.ts +195 -0
- package/src/cli/config-inspect.ts +330 -0
- package/src/cli/config.ts +72 -0
- package/src/cli/configure-interop.ts +67 -0
- package/src/cli/configure-layout.ts +172 -0
- package/src/cli/configure.ts +1487 -0
- package/src/cli/context-clear.ts +76 -0
- package/src/cli/context-index.ts +102 -0
- package/src/cli/context.ts +316 -0
- package/src/cli/default-target.ts +63 -0
- package/src/cli/docs.ts +340 -0
- package/src/cli/doctor.ts +54 -0
- package/src/cli/eval.ts +315 -0
- package/src/cli/evidence.ts +222 -0
- package/src/cli/evolve.ts +219 -0
- package/src/cli/extensions.ts +205 -0
- package/src/cli/fleet.ts +827 -0
- package/src/cli/index.ts +309 -0
- package/src/cli/init.ts +219 -0
- package/src/cli/initial-message.ts +47 -0
- package/src/cli/internal-dispatch.ts +55 -0
- package/src/cli/memory.ts +180 -0
- package/src/cli/models.ts +257 -0
- package/src/cli/modes/json-stream.ts +85 -0
- package/src/cli/modes/jsonl.ts +9 -0
- package/src/cli/modes/print.ts +589 -0
- package/src/cli/oauth-manual-input.ts +72 -0
- package/src/cli/oauth-select.ts +36 -0
- package/src/cli/output-guard.ts +48 -0
- package/src/cli/paths.ts +44 -0
- package/src/cli/provider-target.ts +113 -0
- package/src/cli/removal.ts +72 -0
- package/src/cli/reset.ts +253 -0
- package/src/cli/run.ts +497 -0
- package/src/cli/share.ts +243 -0
- package/src/cli/shared.ts +60 -0
- package/src/cli/skills-eval.ts +1225 -0
- package/src/cli/skills.ts +470 -0
- package/src/cli/steer-channel.ts +86 -0
- package/src/cli/targets.ts +1150 -0
- package/src/cli/text-layout.ts +102 -0
- package/src/cli/trace.ts +274 -0
- package/src/cli/uninstall.ts +405 -0
- package/src/cli/upgrade.ts +270 -0
- package/src/cli/usage.ts +869 -0
- package/src/cli/validate-model.ts +28 -0
- package/src/cli/version.ts +7 -0
- package/src/cli/wiki-generate.ts +509 -0
- package/src/core/artifact-paths.ts +43 -0
- package/src/core/bash-exec.ts +242 -0
- package/src/core/boot-trace.ts +37 -0
- package/src/core/bus-events.ts +728 -0
- package/src/core/bus-trace.ts +53 -0
- package/src/core/c-header-language.ts +265 -0
- package/src/core/clio-repo.ts +78 -0
- package/src/core/config.ts +1593 -0
- package/src/core/context-floor.ts +33 -0
- package/src/core/defaults.ts +625 -0
- package/src/core/domain-loader.ts +170 -0
- package/src/core/event-bus.ts +94 -0
- package/src/core/file-references.ts +282 -0
- package/src/core/guardrails.ts +185 -0
- package/src/core/headless-permission.ts +21 -0
- package/src/core/init.ts +223 -0
- package/src/core/json-payload.ts +58 -0
- package/src/core/package-root.ts +54 -0
- package/src/core/path-canonical.ts +37 -0
- package/src/core/process-identity.ts +41 -0
- package/src/core/recent-models.ts +91 -0
- package/src/core/release.ts +2 -0
- package/src/core/residency-protection.ts +56 -0
- package/src/core/resolve-config-value.ts +88 -0
- package/src/core/response-schema.ts +279 -0
- package/src/core/run-overrides.ts +77 -0
- package/src/core/safe-exec.ts +193 -0
- package/src/core/safe-id.ts +37 -0
- package/src/core/safe-resource-write.ts +162 -0
- package/src/core/session-routing.ts +339 -0
- package/src/core/settings-layers.ts +220 -0
- package/src/core/shared-bus.ts +8 -0
- package/src/core/shell-quote.ts +26 -0
- package/src/core/skill-activation.ts +190 -0
- package/src/core/startup-timer.ts +37 -0
- package/src/core/state-file-lock.ts +207 -0
- package/src/core/termination.ts +202 -0
- package/src/core/timers.ts +38 -0
- package/src/core/tool-names.ts +65 -0
- package/src/core/verification-scripts.ts +13 -0
- package/src/core/workspace-files.ts +492 -0
- package/src/core/xdg.ts +177 -0
- package/src/domains/agents/builtins/architect.md +4 -4
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +3 -3
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +1 -1
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +172 -0
- package/src/domains/agents/contract.ts +16 -0
- package/src/domains/agents/extension.ts +110 -0
- package/src/domains/agents/fleet-commands.ts +154 -0
- package/src/domains/agents/fleet-contract.ts +797 -0
- package/src/domains/agents/frontmatter.ts +40 -0
- package/src/domains/agents/index.ts +102 -0
- package/src/domains/agents/manifest.ts +6 -0
- package/src/domains/agents/recipe-schema.ts +202 -0
- package/src/domains/agents/recipe.ts +125 -0
- package/src/domains/agents/registry.ts +111 -0
- package/src/domains/agents/result-contract.ts +1265 -0
- package/src/domains/agents/spec.ts +371 -0
- package/src/domains/agents/write-boundary.ts +109 -0
- package/src/domains/components/diff.ts +99 -0
- package/src/domains/components/hash.ts +21 -0
- package/src/domains/components/index.ts +3 -0
- package/src/domains/components/scan.ts +304 -0
- package/src/domains/components/snapshot.ts +108 -0
- package/src/domains/components/types.ts +82 -0
- package/src/domains/config/agent-namespace.ts +13 -0
- package/src/domains/config/classify.ts +94 -0
- package/src/domains/config/contract.ts +22 -0
- package/src/domains/config/extension.ts +136 -0
- package/src/domains/config/index.ts +13 -0
- package/src/domains/config/keybindings.ts +164 -0
- package/src/domains/config/manifest.ts +6 -0
- package/src/domains/config/watcher.ts +41 -0
- package/src/domains/context/adoption.ts +880 -0
- package/src/domains/context/bootstrap-prompt.ts +273 -0
- package/src/domains/context/bootstrap.ts +1409 -0
- package/src/domains/context/clear.ts +86 -0
- package/src/domains/context/clio-md.ts +327 -0
- package/src/domains/context/codewiki/cmake.ts +356 -0
- package/src/domains/context/codewiki/cooperative.ts +46 -0
- package/src/domains/context/codewiki/digest.ts +135 -0
- package/src/domains/context/codewiki/grammar-assets.ts +33 -0
- package/src/domains/context/codewiki/indexer.ts +1614 -0
- package/src/domains/context/codewiki/tree-sitter.ts +771 -0
- package/src/domains/context/contract.ts +62 -0
- package/src/domains/context/excluded-dirs.ts +1 -0
- package/src/domains/context/extension.ts +407 -0
- package/src/domains/context/fingerprint.ts +196 -0
- package/src/domains/context/index.ts +164 -0
- package/src/domains/context/init-options.ts +69 -0
- package/src/domains/context/manifest.ts +6 -0
- package/src/domains/context/operator-profile.ts +157 -0
- package/src/domains/context/project-metadata.ts +510 -0
- package/src/domains/context/project-rules.ts +227 -0
- package/src/domains/context/prompt-context.ts +62 -0
- package/src/domains/context/refresh.ts +170 -0
- package/src/domains/context/sibling-files.ts +10 -0
- package/src/domains/context/state.ts +237 -0
- package/src/domains/context/wiki/assemble.ts +303 -0
- package/src/domains/context/wiki/frontmatter.ts +210 -0
- package/src/domains/context/wiki/generate.ts +590 -0
- package/src/domains/context/wiki/layout.ts +111 -0
- package/src/domains/context/wiki/meta.ts +221 -0
- package/src/domains/context/wiki/plan-store.ts +217 -0
- package/src/domains/context/wiki/plan.ts +250 -0
- package/src/domains/context/wiki/prompts.ts +270 -0
- package/src/domains/context/wiki/staleness.ts +198 -0
- package/src/domains/dispatch/active-route-planner.ts +168 -0
- package/src/domains/dispatch/admission-queue.ts +150 -0
- package/src/domains/dispatch/admission.ts +334 -0
- package/src/domains/dispatch/agent-candidates.ts +307 -0
- package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
- package/src/domains/dispatch/agent-ledger-store.ts +257 -0
- package/src/domains/dispatch/agent-ledger.ts +212 -0
- package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
- package/src/domains/dispatch/assignment-events.ts +132 -0
- package/src/domains/dispatch/assignment-reconcile.ts +76 -0
- package/src/domains/dispatch/assignment-store.ts +162 -0
- package/src/domains/dispatch/assignment.ts +278 -0
- package/src/domains/dispatch/backoff.ts +59 -0
- package/src/domains/dispatch/batch-store.ts +134 -0
- package/src/domains/dispatch/batch-tracker.ts +66 -0
- package/src/domains/dispatch/capability-match.ts +155 -0
- package/src/domains/dispatch/capacity-lease.ts +413 -0
- package/src/domains/dispatch/code-step-store.ts +52 -0
- package/src/domains/dispatch/code-step.ts +368 -0
- package/src/domains/dispatch/contract.ts +278 -0
- package/src/domains/dispatch/dedup.ts +133 -0
- package/src/domains/dispatch/event-pump.ts +251 -0
- package/src/domains/dispatch/execution-handoff.ts +29 -0
- package/src/domains/dispatch/execution-plan.ts +328 -0
- package/src/domains/dispatch/execution-role.ts +277 -0
- package/src/domains/dispatch/execution-scheduler.ts +583 -0
- package/src/domains/dispatch/extension.ts +5869 -0
- package/src/domains/dispatch/failure-classification.ts +141 -0
- package/src/domains/dispatch/fleet-plan.ts +225 -0
- package/src/domains/dispatch/fleet-preflight.ts +394 -0
- package/src/domains/dispatch/gate-decisions.ts +1040 -0
- package/src/domains/dispatch/gate-role-prompts.ts +58 -0
- package/src/domains/dispatch/heartbeat.ts +27 -0
- package/src/domains/dispatch/index.ts +137 -0
- package/src/domains/dispatch/joint-route-adapter.ts +114 -0
- package/src/domains/dispatch/joint-route-resolver.ts +283 -0
- package/src/domains/dispatch/manifest.ts +6 -0
- package/src/domains/dispatch/orphan-recovery.ts +224 -0
- package/src/domains/dispatch/outcome.ts +109 -0
- package/src/domains/dispatch/phase-timing.ts +47 -0
- package/src/domains/dispatch/placement.ts +202 -0
- package/src/domains/dispatch/receipt-findings.ts +255 -0
- package/src/domains/dispatch/receipt-integrity.ts +378 -0
- package/src/domains/dispatch/recovery-candidates.ts +74 -0
- package/src/domains/dispatch/reproducibility.ts +48 -0
- package/src/domains/dispatch/reservation-store.ts +501 -0
- package/src/domains/dispatch/route-approval.ts +177 -0
- package/src/domains/dispatch/route-candidates.ts +57 -0
- package/src/domains/dispatch/route-decision.ts +1079 -0
- package/src/domains/dispatch/route-facts.ts +187 -0
- package/src/domains/dispatch/route-history.ts +238 -0
- package/src/domains/dispatch/route-observer.ts +488 -0
- package/src/domains/dispatch/route-policy.ts +327 -0
- package/src/domains/dispatch/route-quality.ts +256 -0
- package/src/domains/dispatch/route-readiness.ts +120 -0
- package/src/domains/dispatch/routing-intent.ts +287 -0
- package/src/domains/dispatch/run-identity.ts +56 -0
- package/src/domains/dispatch/scout-transition.ts +130 -0
- package/src/domains/dispatch/state.ts +277 -0
- package/src/domains/dispatch/tool-stats.ts +132 -0
- package/src/domains/dispatch/transport.ts +209 -0
- package/src/domains/dispatch/types.ts +785 -0
- package/src/domains/dispatch/validation-grounding.ts +154 -0
- package/src/domains/dispatch/validation.ts +721 -0
- package/src/domains/dispatch/worker-protocol.ts +275 -0
- package/src/domains/dispatch/worker-spawn.ts +566 -0
- package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
- package/src/domains/dispatch/write-boundary.ts +426 -0
- package/src/domains/eval/artifacts/redact.ts +42 -0
- package/src/domains/eval/artifacts/store.ts +173 -0
- package/src/domains/eval/compare/compare.ts +33 -0
- package/src/domains/eval/compare/gates.ts +66 -0
- package/src/domains/eval/compare/thresholds.ts +92 -0
- package/src/domains/eval/harness-metrics.ts +62 -0
- package/src/domains/eval/index.ts +66 -0
- package/src/domains/eval/metrics/chaos-stream.ts +93 -0
- package/src/domains/eval/metrics/context.ts +34 -0
- package/src/domains/eval/metrics/coverage.ts +21 -0
- package/src/domains/eval/metrics/evidence.ts +182 -0
- package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
- package/src/domains/eval/metrics/invariants.ts +736 -0
- package/src/domains/eval/metrics/latency.ts +4 -0
- package/src/domains/eval/metrics/token-stream.ts +139 -0
- package/src/domains/eval/metrics/tokens.ts +51 -0
- package/src/domains/eval/metrics/tool-calls.ts +7 -0
- package/src/domains/eval/proactive-memory.ts +279 -0
- package/src/domains/eval/provenance.ts +35 -0
- package/src/domains/eval/report.ts +234 -0
- package/src/domains/eval/reports/json.ts +5 -0
- package/src/domains/eval/reports/junit.ts +23 -0
- package/src/domains/eval/reports/markdown.ts +20 -0
- package/src/domains/eval/reports/swe-jsonl.ts +16 -0
- package/src/domains/eval/reports/text.ts +25 -0
- package/src/domains/eval/run-compare.ts +274 -0
- package/src/domains/eval/runner.ts +244 -0
- package/src/domains/eval/runners/clio-run.ts +148 -0
- package/src/domains/eval/runners/context-index.ts +56 -0
- package/src/domains/eval/runners/context-init.ts +203 -0
- package/src/domains/eval/runners/external-command.ts +350 -0
- package/src/domains/eval/runtime-paths.ts +171 -0
- package/src/domains/eval/schema/artifact.ts +75 -0
- package/src/domains/eval/schema/suite.ts +235 -0
- package/src/domains/eval/schema/validate.ts +339 -0
- package/src/domains/eval/store.ts +392 -0
- package/src/domains/eval/suites/load.ts +74 -0
- package/src/domains/eval/suites/matrix.ts +19 -0
- package/src/domains/eval/suites/resolve.ts +44 -0
- package/src/domains/eval/suites/run.ts +325 -0
- package/src/domains/eval/task-file.ts +186 -0
- package/src/domains/eval/types.ts +141 -0
- package/src/domains/eval/verifiers/command.ts +27 -0
- package/src/domains/eval/verifiers/file-exists.ts +6 -0
- package/src/domains/eval/verifiers/patch.ts +22 -0
- package/src/domains/eval/workspaces/git.ts +41 -0
- package/src/domains/eval/workspaces/local.ts +17 -0
- package/src/domains/eval/workspaces/temp-copy.ts +29 -0
- package/src/domains/evidence/build.ts +1714 -0
- package/src/domains/evidence/eval.ts +605 -0
- package/src/domains/evidence/failure-attribution.ts +54 -0
- package/src/domains/evidence/finish-contract-map.ts +42 -0
- package/src/domains/evidence/index.ts +55 -0
- package/src/domains/evidence/provenance.ts +200 -0
- package/src/domains/evidence/redact.ts +81 -0
- package/src/domains/evidence/store.ts +291 -0
- package/src/domains/evidence/types.ts +325 -0
- package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
- package/src/domains/evolution/index.ts +26 -0
- package/src/domains/evolution/manifest.ts +154 -0
- package/src/domains/evolution/validate.ts +304 -0
- package/src/domains/extensions/contract.ts +22 -0
- package/src/domains/extensions/discovery.ts +193 -0
- package/src/domains/extensions/extension.ts +46 -0
- package/src/domains/extensions/index.ts +34 -0
- package/src/domains/extensions/manager.ts +30 -0
- package/src/domains/extensions/manifest.ts +6 -0
- package/src/domains/extensions/resources.ts +38 -0
- package/src/domains/extensions/state.ts +224 -0
- package/src/domains/extensions/types.ts +83 -0
- package/src/domains/interop/consent.ts +185 -0
- package/src/domains/interop/contract.ts +29 -0
- package/src/domains/interop/detect.ts +173 -0
- package/src/domains/interop/extension.ts +59 -0
- package/src/domains/interop/index.ts +34 -0
- package/src/domains/interop/manifest.ts +6 -0
- package/src/domains/interop/registry.ts +139 -0
- package/src/domains/interop/state.ts +92 -0
- package/src/domains/interop/types.ts +109 -0
- package/src/domains/lifecycle/contract.ts +11 -0
- package/src/domains/lifecycle/doctor.ts +536 -0
- package/src/domains/lifecycle/extension.ts +23 -0
- package/src/domains/lifecycle/index.ts +21 -0
- package/src/domains/lifecycle/install-method.ts +51 -0
- package/src/domains/lifecycle/manifest.ts +6 -0
- package/src/domains/lifecycle/migrations/index.ts +94 -0
- package/src/domains/lifecycle/state.ts +93 -0
- package/src/domains/lifecycle/upgrade-notice.ts +35 -0
- package/src/domains/lifecycle/version.ts +35 -0
- package/src/domains/memory/index.ts +128 -0
- package/src/domains/memory/operations.ts +143 -0
- package/src/domains/memory/prompt-section.ts +86 -0
- package/src/domains/memory/proposal.ts +180 -0
- package/src/domains/memory/store.ts +163 -0
- package/src/domains/memory/task-bank.ts +229 -0
- package/src/domains/memory/task-memory-handoff.ts +222 -0
- package/src/domains/memory/task-memory-policy.ts +602 -0
- package/src/domains/memory/task-memory-status.ts +58 -0
- package/src/domains/memory/task-memory-telemetry.ts +346 -0
- package/src/domains/memory/task-memory-trace.ts +89 -0
- package/src/domains/memory/types.ts +74 -0
- package/src/domains/memory/validate.ts +297 -0
- package/src/domains/middleware/budget.ts +216 -0
- package/src/domains/middleware/contract.ts +35 -0
- package/src/domains/middleware/dispatch-nudge.ts +469 -0
- package/src/domains/middleware/extension.ts +129 -0
- package/src/domains/middleware/hook-receipts.ts +70 -0
- package/src/domains/middleware/hooks-io.ts +174 -0
- package/src/domains/middleware/hooks.ts +432 -0
- package/src/domains/middleware/index.ts +154 -0
- package/src/domains/middleware/manifest.ts +6 -0
- package/src/domains/middleware/memory-intervention.ts +701 -0
- package/src/domains/middleware/rules.ts +42 -0
- package/src/domains/middleware/runtime.ts +333 -0
- package/src/domains/middleware/skills-reminder.ts +187 -0
- package/src/domains/middleware/snapshot.ts +71 -0
- package/src/domains/middleware/stalled-turn.ts +71 -0
- package/src/domains/middleware/task-board-reminder.ts +87 -0
- package/src/domains/middleware/task-nudge.ts +77 -0
- package/src/domains/middleware/tool-choice-control.ts +42 -0
- package/src/domains/middleware/types.ts +131 -0
- package/src/domains/middleware/validate.ts +329 -0
- package/src/domains/observability/accountability.ts +67 -0
- package/src/domains/observability/contract.ts +168 -0
- package/src/domains/observability/cost.ts +206 -0
- package/src/domains/observability/evidence-index.ts +123 -0
- package/src/domains/observability/extension.ts +281 -0
- package/src/domains/observability/index.ts +78 -0
- package/src/domains/observability/manifest.ts +10 -0
- package/src/domains/observability/metrics.ts +37 -0
- package/src/domains/observability/projection.ts +477 -0
- package/src/domains/observability/telemetry.ts +89 -0
- package/src/domains/observability/trace-store.ts +1454 -0
- package/src/domains/prompts/compiler.ts +556 -0
- package/src/domains/prompts/contract.ts +30 -0
- package/src/domains/prompts/extension.ts +304 -0
- package/src/domains/prompts/fragment-loader.ts +139 -0
- package/src/domains/prompts/fragments/identity/clio.md +3 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +63 -0
- package/src/domains/prompts/fragments/operating/contract.md +10 -1
- package/src/domains/prompts/hash.ts +73 -0
- package/src/domains/prompts/index.ts +32 -0
- package/src/domains/prompts/manifest.ts +8 -0
- package/src/domains/prompts/memory-intervention.ts +57 -0
- package/src/domains/prompts/preload.ts +82 -0
- package/src/domains/providers/auth/api-key.ts +47 -0
- package/src/domains/providers/auth/backend-file.ts +69 -0
- package/src/domains/providers/auth/backend-memory.ts +17 -0
- package/src/domains/providers/auth/index.ts +37 -0
- package/src/domains/providers/auth/oauth.ts +36 -0
- package/src/domains/providers/auth/storage.ts +667 -0
- package/src/domains/providers/capabilities.ts +50 -0
- package/src/domains/providers/catalog.ts +162 -0
- package/src/domains/providers/contract.ts +151 -0
- package/src/domains/providers/credentials.ts +20 -0
- package/src/domains/providers/eligibility.ts +24 -0
- package/src/domains/providers/errors.ts +64 -0
- package/src/domains/providers/extension.ts +536 -0
- package/src/domains/providers/index.ts +142 -0
- package/src/domains/providers/knowledge-base-path.ts +102 -0
- package/src/domains/providers/manifest.ts +6 -0
- package/src/domains/providers/model-capabilities.ts +136 -0
- package/src/domains/providers/model-discovery.ts +144 -0
- package/src/domains/providers/model-family.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +712 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +2 -2
- package/src/domains/providers/plugins.ts +59 -0
- package/src/domains/providers/probe/fingerprint.ts +44 -0
- package/src/domains/providers/probe/http.ts +114 -0
- package/src/domains/providers/probe/reasoning.ts +111 -0
- package/src/domains/providers/registry.ts +166 -0
- package/src/domains/providers/resolver.ts +156 -0
- package/src/domains/providers/runtime-resolution.ts +720 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
- package/src/domains/providers/runtimes/builtins.ts +78 -0
- package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
- package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
- package/src/domains/providers/runtimes/claude/common.ts +55 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
- package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
- package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
- package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
- package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
- package/src/domains/providers/runtimes/cloud/google.ts +41 -0
- package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
- package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
- package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +32 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +165 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
- package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
- package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +491 -0
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
- package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
- package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
- package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
- package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
- package/src/domains/providers/runtimes/protocol/google.ts +27 -0
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
- package/src/domains/providers/support.ts +238 -0
- package/src/domains/providers/thinking-control-policy.ts +85 -0
- package/src/domains/providers/types/capability-flags.ts +114 -0
- package/src/domains/providers/types/cost-provenance.ts +7 -0
- package/src/domains/providers/types/inference.ts +41 -0
- package/src/domains/providers/types/knowledge-base.ts +156 -0
- package/src/domains/providers/types/local-model-quirks.ts +218 -0
- package/src/domains/providers/types/runtime-descriptor.ts +170 -0
- package/src/domains/providers/types/target-descriptor.ts +38 -0
- package/src/domains/resources/collision.ts +92 -0
- package/src/domains/resources/common-loader.ts +140 -0
- package/src/domains/resources/contract.ts +25 -0
- package/src/domains/resources/extension.ts +61 -0
- package/src/domains/resources/index.ts +74 -0
- package/src/domains/resources/loader.ts +86 -0
- package/src/domains/resources/manifest.ts +6 -0
- package/src/domains/resources/prompts/loader.ts +232 -0
- package/src/domains/resources/prompts/substitute.ts +65 -0
- package/src/domains/resources/skills/content-hash.ts +105 -0
- package/src/domains/resources/skills/evals.ts +175 -0
- package/src/domains/resources/skills/install.ts +410 -0
- package/src/domains/resources/skills/loader.ts +978 -0
- package/src/domains/resources/skills/marketplace.ts +255 -0
- package/src/domains/resources/skills/provenance-pin.ts +115 -0
- package/src/domains/safety/action-classifier.ts +268 -0
- package/src/domains/safety/approval-axis.ts +23 -0
- package/src/domains/safety/audit.ts +487 -0
- package/src/domains/safety/autonomy.ts +174 -0
- package/src/domains/safety/call-target.ts +59 -0
- package/src/domains/safety/contract.ts +65 -0
- package/src/domains/safety/damage-control.ts +44 -0
- package/src/domains/safety/default-path-policy.ts +117 -0
- package/src/domains/safety/extension.ts +383 -0
- package/src/domains/safety/finish-contract-registration.ts +128 -0
- package/src/domains/safety/finish-contract.ts +554 -0
- package/src/domains/safety/index.ts +44 -0
- package/src/domains/safety/loop-detector.ts +143 -0
- package/src/domains/safety/manifest.ts +6 -0
- package/src/domains/safety/path-policy.ts +164 -0
- package/src/domains/safety/policy-engine.ts +994 -0
- package/src/domains/safety/project-policy.ts +391 -0
- package/src/domains/safety/protected-artifacts-registration.ts +189 -0
- package/src/domains/safety/protected-artifacts.ts +993 -0
- package/src/domains/safety/rejection-feedback.ts +102 -0
- package/src/domains/safety/rigor.ts +72 -0
- package/src/domains/safety/rule-compiler.ts +48 -0
- package/src/domains/safety/rule-pack-loader.ts +92 -0
- package/src/domains/safety/run-effects.ts +197 -0
- package/src/domains/safety/scope.ts +61 -0
- package/src/domains/scheduling/budget.ts +35 -0
- package/src/domains/scheduling/cluster.ts +175 -0
- package/src/domains/scheduling/contract.ts +30 -0
- package/src/domains/scheduling/extension.ts +91 -0
- package/src/domains/scheduling/index.ts +12 -0
- package/src/domains/scheduling/manifest.ts +6 -0
- package/src/domains/session/archive-readers.ts +208 -0
- package/src/domains/session/checkpoint.ts +38 -0
- package/src/domains/session/compaction/auto.ts +89 -0
- package/src/domains/session/compaction/branch-summary.ts +186 -0
- package/src/domains/session/compaction/compact.ts +493 -0
- package/src/domains/session/compaction/cut-point.ts +171 -0
- package/src/domains/session/compaction/defaults.ts +34 -0
- package/src/domains/session/compaction/mask-observations.ts +265 -0
- package/src/domains/session/compaction/session-entries.ts +18 -0
- package/src/domains/session/compaction/tokens.ts +147 -0
- package/src/domains/session/context-accounting.ts +583 -0
- package/src/domains/session/context-ledger.ts +348 -0
- package/src/domains/session/contract.ts +144 -0
- package/src/domains/session/cwd-fallback.ts +65 -0
- package/src/domains/session/entries.ts +509 -0
- package/src/domains/session/extension.ts +322 -0
- package/src/domains/session/history.ts +172 -0
- package/src/domains/session/index.ts +84 -0
- package/src/domains/session/manager.ts +128 -0
- package/src/domains/session/manifest.ts +6 -0
- package/src/domains/session/migrations/index.ts +27 -0
- package/src/domains/session/prompt-manifest.ts +173 -0
- package/src/domains/session/protected-artifact-journal.ts +241 -0
- package/src/domains/session/protected-artifacts.ts +90 -0
- package/src/domains/session/retry.ts +238 -0
- package/src/domains/session/task-board.ts +375 -0
- package/src/domains/session/tree/active-path.ts +98 -0
- package/src/domains/session/tree/fork.ts +160 -0
- package/src/domains/session/tree/manager.ts +128 -0
- package/src/domains/session/tree/navigator.ts +177 -0
- package/src/domains/session/tree/preview.ts +259 -0
- package/src/domains/session/usage.ts +148 -0
- package/src/domains/session/workspace/git-probe.ts +161 -0
- package/src/domains/session/workspace/index.ts +4 -0
- package/src/domains/session/workspace/project-type.ts +217 -0
- package/src/domains/session/workspace/snapshot.ts +74 -0
- package/src/domains/share/archive.ts +684 -0
- package/src/domains/share/contract.ts +9 -0
- package/src/domains/share/extension.ts +26 -0
- package/src/domains/share/index.ts +28 -0
- package/src/domains/share/manifest.ts +6 -0
- package/src/engine/acp/adapter.ts +397 -0
- package/src/engine/acp/errors.ts +32 -0
- package/src/engine/acp/event-mapper.ts +154 -0
- package/src/engine/acp/server.ts +656 -0
- package/src/engine/acp/tool-mediator.ts +686 -0
- package/src/engine/acp/transport.ts +654 -0
- package/src/engine/acp/types.ts +170 -0
- package/src/engine/agent.ts +29 -0
- package/src/engine/ai.ts +202 -0
- package/src/engine/alcf-oauth.ts +198 -0
- package/src/engine/antigravity/subprocess-runtime.ts +205 -0
- package/src/engine/apis/degraded-inference.ts +95 -0
- package/src/engine/apis/index.ts +20 -0
- package/src/engine/apis/llamacpp-residency.ts +252 -0
- package/src/engine/apis/lmstudio-native.ts +1438 -0
- package/src/engine/apis/lmstudio-residency.ts +92 -0
- package/src/engine/apis/ollama-native.ts +507 -0
- package/src/engine/apis/openai-completions.ts +716 -0
- package/src/engine/apis/output-budget.ts +99 -0
- package/src/engine/apis/residency-lock.ts +29 -0
- package/src/engine/apis/residency.ts +640 -0
- package/src/engine/apis/resident-models.ts +42 -0
- package/src/engine/apis/sampling-overrides.ts +38 -0
- package/src/engine/apis/thinking-replay.ts +11 -0
- package/src/engine/claude/sdk-runtime.ts +685 -0
- package/src/engine/claude/session-id.ts +5 -0
- package/src/engine/claude/subprocess-runtime.ts +316 -0
- package/src/engine/claude/tool-safety.ts +400 -0
- package/src/engine/external-subprocess.ts +23 -0
- package/src/engine/harmony-response.ts +165 -0
- package/src/engine/loop-guard.ts +1127 -0
- package/src/engine/oauth.ts +192 -0
- package/src/engine/pi-mono-names.ts +13 -0
- package/src/engine/provider-payload.ts +315 -0
- package/src/engine/select-list.ts +53 -0
- package/src/engine/session.ts +834 -0
- package/src/engine/strip-tokenizer-sentinels.ts +125 -0
- package/src/engine/tui.ts +103 -0
- package/src/engine/types.ts +66 -0
- package/src/engine/worker-events.ts +100 -0
- package/src/engine/worker-runtime.ts +1022 -0
- package/src/engine/worker-tools.ts +203 -0
- package/src/entry/orchestrator.ts +1873 -0
- package/src/interactive/application-controller.ts +346 -0
- package/src/interactive/bus-notices.ts +265 -0
- package/src/interactive/chat-loop-messages.ts +626 -0
- package/src/interactive/chat-loop-policy.ts +18 -0
- package/src/interactive/chat-loop.ts +865 -0
- package/src/interactive/chat-panel.ts +1694 -0
- package/src/interactive/chat-renderer.ts +1038 -0
- package/src/interactive/clio-editor.ts +166 -0
- package/src/interactive/command-fallbacks.ts +23 -0
- package/src/interactive/command-output.ts +85 -0
- package/src/interactive/context-activity.ts +203 -0
- package/src/interactive/context-meter.ts +223 -0
- package/src/interactive/context-overlay.ts +220 -0
- package/src/interactive/cost-overlay.ts +279 -0
- package/src/interactive/dispatch-board.ts +1319 -0
- package/src/interactive/dispatch-steering.ts +86 -0
- package/src/interactive/editor-bash.ts +46 -0
- package/src/interactive/editor-steer.ts +51 -0
- package/src/interactive/editor-submit.ts +303 -0
- package/src/interactive/external-editor.ts +67 -0
- package/src/interactive/follow-up-queue-panel.ts +75 -0
- package/src/interactive/footer/dashboard.ts +534 -0
- package/src/interactive/footer/notifications.ts +275 -0
- package/src/interactive/footer/widgets.ts +1246 -0
- package/src/interactive/footer-panel.ts +187 -0
- package/src/interactive/format-time.ts +85 -0
- package/src/interactive/index.ts +11 -0
- package/src/interactive/interactive-application.ts +755 -0
- package/src/interactive/interactive-event-projection.ts +380 -0
- package/src/interactive/interactive-input-runtime.ts +261 -0
- package/src/interactive/interactive-presentation.ts +452 -0
- package/src/interactive/interactive-shell.ts +134 -0
- package/src/interactive/interactive-slash-runtime.ts +492 -0
- package/src/interactive/interactive-subscriptions.ts +111 -0
- package/src/interactive/interactive-tickers.ts +152 -0
- package/src/interactive/keybinding-manager.ts +496 -0
- package/src/interactive/layout.ts +20 -0
- package/src/interactive/leader-key.ts +143 -0
- package/src/interactive/loop-guard-interrupt.ts +101 -0
- package/src/interactive/memory-overlay.ts +280 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
- package/src/interactive/overlay-auth-lifecycle.ts +308 -0
- package/src/interactive/overlay-frame.ts +502 -0
- package/src/interactive/overlay-general-openers.ts +217 -0
- package/src/interactive/overlay-key-routing.ts +213 -0
- package/src/interactive/overlay-lifecycle.ts +413 -0
- package/src/interactive/overlay-model-selectors.ts +127 -0
- package/src/interactive/overlay-permission-lifecycle.ts +344 -0
- package/src/interactive/overlay-resource-openers.ts +112 -0
- package/src/interactive/overlay-session-lifecycle.ts +270 -0
- package/src/interactive/overlay-transitions.ts +57 -0
- package/src/interactive/overlays/agents.ts +69 -0
- package/src/interactive/overlays/ask-user.ts +921 -0
- package/src/interactive/overlays/auth-dialog.ts +221 -0
- package/src/interactive/overlays/context-reset.ts +108 -0
- package/src/interactive/overlays/cwd-fallback.ts +141 -0
- package/src/interactive/overlays/extensions.ts +54 -0
- package/src/interactive/overlays/help-reference.ts +140 -0
- package/src/interactive/overlays/interop.ts +139 -0
- package/src/interactive/overlays/keybinding-detail.ts +90 -0
- package/src/interactive/overlays/list-overlay.ts +606 -0
- package/src/interactive/overlays/message-picker.ts +155 -0
- package/src/interactive/overlays/model-selector.ts +1091 -0
- package/src/interactive/overlays/prompts.ts +72 -0
- package/src/interactive/overlays/session-selector-search.ts +31 -0
- package/src/interactive/overlays/session-selector.ts +266 -0
- package/src/interactive/overlays/settings.ts +3363 -0
- package/src/interactive/overlays/skills-hub.ts +237 -0
- package/src/interactive/overlays/tree-selector.ts +387 -0
- package/src/interactive/permission-overlay.ts +170 -0
- package/src/interactive/render-trace.ts +125 -0
- package/src/interactive/renderers/branch-summary.ts +86 -0
- package/src/interactive/renderers/code-ink.ts +420 -0
- package/src/interactive/renderers/compaction-summary.ts +112 -0
- package/src/interactive/renderers/diff.ts +126 -0
- package/src/interactive/renderers/notice.ts +28 -0
- package/src/interactive/renderers/retry-status.ts +31 -0
- package/src/interactive/renderers/structured.ts +89 -0
- package/src/interactive/renderers/tool-execution.ts +1104 -0
- package/src/interactive/renderers/worker-entry.ts +264 -0
- package/src/interactive/session-last-turn.ts +186 -0
- package/src/interactive/session-transcript.ts +105 -0
- package/src/interactive/session-usage-reseed.ts +74 -0
- package/src/interactive/slash-autocomplete.ts +364 -0
- package/src/interactive/slash-commands.ts +1319 -0
- package/src/interactive/slash-spec.ts +453 -0
- package/src/interactive/status/controller.ts +256 -0
- package/src/interactive/status/index.ts +23 -0
- package/src/interactive/status/state-machine.ts +530 -0
- package/src/interactive/status/summary.ts +170 -0
- package/src/interactive/status/types.ts +121 -0
- package/src/interactive/status/verbs.ts +163 -0
- package/src/interactive/status/watchdog.ts +24 -0
- package/src/interactive/tasks-overlay.ts +186 -0
- package/src/interactive/theme/components.ts +55 -0
- package/src/interactive/theme/glyphs.ts +70 -0
- package/src/interactive/theme/index.ts +15 -0
- package/src/interactive/theme/labels.ts +88 -0
- package/src/interactive/theme/rules.ts +138 -0
- package/src/interactive/theme/segments.ts +88 -0
- package/src/interactive/theme/tokens.ts +121 -0
- package/src/interactive/thinking-level-policy.ts +6 -0
- package/src/interactive/tool-prose-loop.ts +122 -0
- package/src/interactive/tool-prose-registration.ts +48 -0
- package/src/interactive/turn-context.ts +854 -0
- package/src/interactive/turn-middleware.ts +283 -0
- package/src/interactive/turn-persistence.ts +441 -0
- package/src/interactive/turn-queues.ts +169 -0
- package/src/interactive/turn-recovery.ts +306 -0
- package/src/interactive/turn-runtime.ts +802 -0
- package/src/interactive/turn-state.ts +123 -0
- package/src/interactive/view/artifacts.ts +1342 -0
- package/src/interactive/view/view-overlay.ts +732 -0
- package/src/interactive/welcome-dashboard.ts +536 -0
- package/src/interactive/worker-receipts.ts +94 -0
- package/src/interactive/worker-replay.ts +111 -0
- package/src/interactive/worker-share.ts +100 -0
- package/src/interactive/worker-stream.ts +442 -0
- package/src/interactive/workspace-facts.ts +141 -0
- package/src/tools/agent-tools.ts +382 -0
- package/src/tools/artifact.ts +103 -0
- package/src/tools/ask-user.ts +656 -0
- package/src/tools/bash.ts +176 -0
- package/src/tools/bootstrap.ts +474 -0
- package/src/tools/codewiki/code-nav.ts +563 -0
- package/src/tools/codewiki/shared.ts +115 -0
- package/src/tools/compete-worktrees.ts +898 -0
- package/src/tools/context/docs-engine.ts +619 -0
- package/src/tools/context/index.ts +435 -0
- package/src/tools/credential-present.ts +151 -0
- package/src/tools/dispatch-arguments.ts +228 -0
- package/src/tools/dispatch-plan.ts +741 -0
- package/src/tools/dispatch-scout.ts +461 -0
- package/src/tools/dispatch.ts +3338 -0
- package/src/tools/edit-diff.ts +534 -0
- package/src/tools/edit.ts +128 -0
- package/src/tools/executables.ts +22 -0
- package/src/tools/file-mutation-queue.ts +35 -0
- package/src/tools/find.ts +292 -0
- package/src/tools/grep.ts +495 -0
- package/src/tools/ignore-policy.ts +169 -0
- package/src/tools/ledger.ts +206 -0
- package/src/tools/ls.ts +110 -0
- package/src/tools/monitor.ts +797 -0
- package/src/tools/network-policy.ts +29 -0
- package/src/tools/observation.ts +421 -0
- package/src/tools/observers.ts +99 -0
- package/src/tools/path-utils.ts +79 -0
- package/src/tools/policy.ts +154 -0
- package/src/tools/profiles.ts +108 -0
- package/src/tools/read.ts +173 -0
- package/src/tools/registry.ts +1157 -0
- package/src/tools/result-shaping.ts +204 -0
- package/src/tools/safe-exec.ts +128 -0
- package/src/tools/spawn-hygiene.ts +182 -0
- package/src/tools/steer.ts +88 -0
- package/src/tools/string-enum.ts +15 -0
- package/src/tools/tasks.ts +168 -0
- package/src/tools/truncate-utf8.ts +17 -0
- package/src/tools/truncate.ts +202 -0
- package/src/tools/verify/frontend.ts +685 -0
- package/src/tools/verify/index.ts +66 -0
- package/src/tools/verify/scripts.ts +108 -0
- package/src/tools/web-fetch.ts +777 -0
- package/src/tools/worker-evidence.ts +215 -0
- package/src/tools/write.ts +52 -0
- package/src/utils/exif-orientation.ts +192 -0
- package/src/utils/git.ts +24 -0
- package/src/utils/image-resize.ts +148 -0
- package/src/utils/photon.ts +103 -0
- package/src/worker/control-lane.ts +22 -0
- package/src/worker/entry.ts +257 -0
- package/src/worker/event-projection.ts +56 -0
- package/src/worker/heartbeat.ts +24 -0
- package/src/worker/ledger-mirror.ts +95 -0
- package/src/worker/ndjson.ts +40 -0
- package/src/worker/protocol.ts +529 -0
- package/src/worker/resource-facts.ts +79 -0
- package/src/worker/runtime-registry.ts +12 -0
- package/src/worker/spec-contract.ts +654 -0
- package/src/worker/stdin-demux.ts +316 -0
- package/dist/acp-UMLFVA3F.js +0 -92
- package/dist/chunk-262G75JS.js +0 -35
- package/dist/chunk-5LDRNKX2.js +0 -1063
- package/dist/chunk-67MTHP2E.js +0 -135
- package/dist/chunk-GOTUR54M.js +0 -9
- package/dist/chunk-TPOCL34A.js +0 -2876
- package/dist/chunk-XV4ZJ6ZM.js +0 -3177
- package/dist/clio-KIQ5SNDS.js +0 -53
- package/dist/configure-G4E3A2PG.js +0 -27
- package/dist/doctor-M5HJJZOL.js +0 -61
- package/dist/domains/agents/builtins/architect.md +0 -33
- package/dist/domains/agents/builtins/coder.md +0 -31
- package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
- package/dist/domains/agents/builtins/debugger.md +0 -30
- package/dist/domains/agents/builtins/documenter.md +0 -31
- package/dist/domains/agents/builtins/git-master.md +0 -30
- package/dist/domains/agents/builtins/provenance.md +0 -30
- package/dist/domains/agents/builtins/researcher.md +0 -71
- package/dist/domains/agents/builtins/scout.md +0 -42
- package/dist/domains/agents/builtins/tester.md +0 -31
- package/dist/domains/agents/builtins/verifier.md +0 -30
- package/dist/domains/agents/builtins/wiki-writer.md +0 -41
- package/dist/fleet-preflight-CLIAX7YR.js +0 -21
- package/dist/preload-KZVHET2B.js +0 -11
- package/dist/version-ROZ6CZKH.js +0 -16
- package/skills/git/commit-crafting/SKILL.md +0 -79
- package/skills/git/commit-crafting/evals.md +0 -92
- package/skills/git/create-pr/SKILL.md +0 -116
- package/skills/git/create-pr/evals.md +0 -114
- package/skills/git/investigate-issue/SKILL.md +0 -139
- package/skills/git/investigate-issue/evals.md +0 -94
- package/skills/git/review-changes/SKILL.md +0 -103
- package/skills/git/review-changes/evals.md +0 -85
|
@@ -0,0 +1,797 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
import { sleep } from "../core/timers.js";
|
|
4
|
+
import { ToolNames } from "../core/tool-names.js";
|
|
5
|
+
import { renderAgentLedgerBoard } from "../domains/dispatch/agent-ledger-store.js";
|
|
6
|
+
import type { DurableAssignmentRecord } from "../domains/dispatch/assignment-store.js";
|
|
7
|
+
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
8
|
+
import { UNVERIFIABLE_RECEIPT_VERIFICATION } from "../domains/dispatch/receipt-findings.js";
|
|
9
|
+
import { type ReceiptIntegrityResult, verifyReceiptIntegrity } from "../domains/dispatch/receipt-integrity.js";
|
|
10
|
+
import {
|
|
11
|
+
isTerminalRunEnvelope,
|
|
12
|
+
type RunEnvelope,
|
|
13
|
+
type RunReceipt,
|
|
14
|
+
type RunReceiptVerification,
|
|
15
|
+
} from "../domains/dispatch/types.js";
|
|
16
|
+
import { COST_NOT_MEASURED, costAggregateForAmount, formatCostAggregate } from "../domains/observability/index.js";
|
|
17
|
+
import type { DispatchRunEventRegistry } from "./dispatch.js";
|
|
18
|
+
import type { ToolInvokeOptions, ToolResult, ToolSpec } from "./registry.js";
|
|
19
|
+
import { stringEnum } from "./string-enum.js";
|
|
20
|
+
import { truncateUtf8 } from "./truncate-utf8.js";
|
|
21
|
+
import { receiptEvidenceLabels, workerTextLabel, workerTextNonEvidenceNotices } from "./worker-evidence.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The monitor tool: read-only visibility into known synchronous and detached
|
|
25
|
+
* dispatched runs. The interactive operator/TUI can inspect an active sync
|
|
26
|
+
* run through the dispatch contract; parent-model mid-run observation requires
|
|
27
|
+
* detach because a sequential synchronous dispatch call auto-waits. mode=list
|
|
28
|
+
* enumerates known runs (this
|
|
29
|
+
* session first), status reports one run's state and progress counters, peek
|
|
30
|
+
* returns the bounded tail of a run's recent events buffered in this process,
|
|
31
|
+
* tools answers what a run executed (its tool calls with outcomes, plus the
|
|
32
|
+
* receipt's per-tool totals),
|
|
33
|
+
* receipt returns the stored receipt, wait observes one run for a bounded
|
|
34
|
+
* time until it is terminal or the timeout fires (it never cancels anything;
|
|
35
|
+
* steer action=cancel stops a run), collect is the batch barrier: a pending
|
|
36
|
+
* snapshot while runs are in flight, full results once every run is terminal.
|
|
37
|
+
* Built strictly on the dispatch domain's ledger, live snapshot, durable
|
|
38
|
+
* batch records, and integrity-verified receipts, so wait and collect work
|
|
39
|
+
* across session resume.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
const LIST_LIMIT = 20;
|
|
43
|
+
const PEEK_MAX_BYTES = 8 * 1024;
|
|
44
|
+
const RECEIPT_MAX_BYTES = 14 * 1024;
|
|
45
|
+
const WAIT_POLL_MS = 250;
|
|
46
|
+
const WAIT_DEFAULT_TIMEOUT_MS = 60_000;
|
|
47
|
+
const WAIT_MAX_TIMEOUT_MS = 10 * 60_000;
|
|
48
|
+
const COLLECT_TEXT_BYTES = 2_000;
|
|
49
|
+
const COLLECT_TIMEOUT_NOTICE = 'collect never blocks; timeout_ms is ignored — block on one run with mode="wait".';
|
|
50
|
+
|
|
51
|
+
export interface MonitorToolDeps {
|
|
52
|
+
dispatch: DispatchContract;
|
|
53
|
+
runEvents?: Pick<DispatchRunEventRegistry, "eventTail">;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function runLine(run: RunEnvelope): string {
|
|
57
|
+
const state = run.outcome ?? run.status;
|
|
58
|
+
const receipt = run.receiptPath ?? "n/a";
|
|
59
|
+
return `- ${run.id} agent=${run.agentId} state=${state} node=${run.node?.id ?? "local"} started=${run.startedAt} tokens=${run.tokenCount} receipt=${receipt}`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function listRuns(deps: MonitorToolDeps, options: ToolInvokeOptions | undefined): ToolResult {
|
|
63
|
+
let runs: ReadonlyArray<RunEnvelope>;
|
|
64
|
+
try {
|
|
65
|
+
runs = deps.dispatch.listRuns();
|
|
66
|
+
} catch (err) {
|
|
67
|
+
return { kind: "error", message: `monitor: ${err instanceof Error ? err.message : String(err)}` };
|
|
68
|
+
}
|
|
69
|
+
const sessionId = options?.sessionId ?? null;
|
|
70
|
+
const sessionRuns = sessionId !== null ? runs.filter((run) => run.sessionId === sessionId) : [];
|
|
71
|
+
const scoped = sessionRuns.length > 0 ? sessionRuns : runs;
|
|
72
|
+
const scopeNote = sessionRuns.length > 0 ? "this session" : "all sessions";
|
|
73
|
+
const shown = scoped.slice(0, LIST_LIMIT);
|
|
74
|
+
if (shown.length === 0) {
|
|
75
|
+
return { kind: "ok", output: "No dispatched runs recorded.", details: { mode: "list", runCount: 0 } };
|
|
76
|
+
}
|
|
77
|
+
const lines = [`dispatched runs (${scopeNote}, newest first, ${shown.length} of ${scoped.length}):`];
|
|
78
|
+
for (const run of shown) lines.push(runLine(run));
|
|
79
|
+
lines.push("", 'Use monitor(run_id=<id>) for state, mode="peek" for recent output, mode="receipt" for the receipt.');
|
|
80
|
+
return {
|
|
81
|
+
kind: "ok",
|
|
82
|
+
output: lines.join("\n"),
|
|
83
|
+
details: {
|
|
84
|
+
mode: "list",
|
|
85
|
+
runCount: scoped.length,
|
|
86
|
+
runs: shown.map((run) => ({ runId: run.id, agentId: run.agentId, state: run.outcome ?? run.status })),
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function runStatus(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
92
|
+
const requestedRun = deps.dispatch.getRun(runId);
|
|
93
|
+
const rootRunId = requestedRun?.lineage?.rootRunId ?? runId;
|
|
94
|
+
const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
|
|
95
|
+
const resolvedRunId = assignment?.terminalRunId ?? runId;
|
|
96
|
+
const run = deps.dispatch.getRun(resolvedRunId) ?? requestedRun;
|
|
97
|
+
if (!run && !assignment) return { kind: "error", message: `monitor: unknown run or assignment '${runId}'` };
|
|
98
|
+
if (!run) return { kind: "error", message: `monitor: assignment '${runId}' has no available attempt` };
|
|
99
|
+
const live = deps.dispatch.snapshot().running.find((entry) => entry.lineage.rootRunId === rootRunId) ?? null;
|
|
100
|
+
const reroutes =
|
|
101
|
+
run.reroutes !== undefined && run.reroutes.length > 0
|
|
102
|
+
? ` reroutes=${run.reroutes.map((hop) => `${hop.fromNode}>${hop.toNode}`).join(",")}`
|
|
103
|
+
: "";
|
|
104
|
+
const lines = [
|
|
105
|
+
...(assignment
|
|
106
|
+
? [
|
|
107
|
+
`assignment ${assignment.assignmentId} status=${assignment.status} terminal=${assignment.terminalRunId ?? "pending"}`,
|
|
108
|
+
`attempts: ${assignment.attempts.join(", ") || "none finalized"}`,
|
|
109
|
+
]
|
|
110
|
+
: []),
|
|
111
|
+
`run ${run.id} (${run.agentId})`,
|
|
112
|
+
`state: ${run.status}${run.outcome ? ` outcome=${run.outcome}` : ""}${run.outcomeDetail ? ` detail=${run.outcomeDetail}` : ""}`,
|
|
113
|
+
`target=${run.targetId} model=${run.wireModelId} runtime=${run.runtimeKind} node=${run.node?.id ?? "local"}${reroutes}`,
|
|
114
|
+
`started=${run.startedAt} ended=${run.endedAt ?? "n/a"} exit=${run.exitCode ?? "n/a"}`,
|
|
115
|
+
`tokens=${run.tokenCount} cost=${formatCostAggregate(costAggregateForAmount(run.costUsd, run.costProvenance)) ?? COST_NOT_MEASURED} receipt=${run.receiptPath ?? "n/a"}`,
|
|
116
|
+
];
|
|
117
|
+
if (live) {
|
|
118
|
+
lines.push(
|
|
119
|
+
`live: phase=${live.outcomePhase} heartbeat=${live.heartbeat} elapsed=${Math.round(live.elapsedMs / 1000)}s tokens=${live.tokens.total}`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
kind: "ok",
|
|
124
|
+
output: lines.join("\n"),
|
|
125
|
+
details: {
|
|
126
|
+
mode: "status",
|
|
127
|
+
...(assignment
|
|
128
|
+
? {
|
|
129
|
+
assignmentId: assignment.assignmentId,
|
|
130
|
+
assignmentStatus: assignment.status,
|
|
131
|
+
attemptRunIds: [...assignment.attempts],
|
|
132
|
+
terminalRunId: assignment.terminalRunId,
|
|
133
|
+
}
|
|
134
|
+
: {}),
|
|
135
|
+
runId: run.id,
|
|
136
|
+
agentId: run.agentId,
|
|
137
|
+
status: run.status,
|
|
138
|
+
outcome: run.outcome ?? null,
|
|
139
|
+
exitCode: run.exitCode,
|
|
140
|
+
tokenCount: run.tokenCount,
|
|
141
|
+
costUsd: run.costUsd,
|
|
142
|
+
costProvenance: run.costProvenance ?? "unknown",
|
|
143
|
+
receiptPath: run.receiptPath,
|
|
144
|
+
running: live !== null,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function runPeek(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
150
|
+
const run = deps.dispatch.getRun(runId);
|
|
151
|
+
const tail = deps.runEvents?.eventTail(runId) ?? null;
|
|
152
|
+
if (!tail || tail.entries.length === 0) {
|
|
153
|
+
if (!run) return { kind: "error", message: `monitor: unknown run '${runId}'` };
|
|
154
|
+
return {
|
|
155
|
+
kind: "ok",
|
|
156
|
+
output: `No buffered events for run ${runId} in this process. Use mode="receipt" for the stored receipt or mode="status" for run state.`,
|
|
157
|
+
details: { mode: "peek", runId, eventCount: 0 },
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const rendered = tail.entries.map((entry) => `${entry.at} ${entry.type}${entry.detail ? `: ${entry.detail}` : ""}`);
|
|
161
|
+
// Keep the newest events: trim from the front until the tail fits.
|
|
162
|
+
let body = rendered.join("\n");
|
|
163
|
+
let dropped = 0;
|
|
164
|
+
while (Buffer.byteLength(body, "utf8") > PEEK_MAX_BYTES && dropped < rendered.length - 1) {
|
|
165
|
+
dropped += 1;
|
|
166
|
+
body = rendered.slice(dropped).join("\n");
|
|
167
|
+
}
|
|
168
|
+
const lines = [
|
|
169
|
+
`recent events for run ${runId} (${tail.agentId}), newest last${dropped > 0 ? `, ${dropped} older omitted` : ""}:`,
|
|
170
|
+
body,
|
|
171
|
+
];
|
|
172
|
+
return {
|
|
173
|
+
kind: "ok",
|
|
174
|
+
output: lines.join("\n"),
|
|
175
|
+
details: { mode: "peek", runId, eventCount: tail.entries.length, omitted: dropped },
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const TOOLS_MAX_CALL_LINES = 60;
|
|
180
|
+
const TOOLS_MAX_BYTES = 8 * 1024;
|
|
181
|
+
const TOOLS_ARGUMENTS_CHARS = 160;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Tail event types that describe one tool call. `clio_tool_finish` is the
|
|
185
|
+
* authoritative per-call outcome (it distinguishes a permission block from a
|
|
186
|
+
* command that ran and exited nonzero); the engine's own `tool_execution_end`
|
|
187
|
+
* is kept only when the tail recorded a detail for it, since a bare type line
|
|
188
|
+
* says nothing the finish event does not.
|
|
189
|
+
*/
|
|
190
|
+
const TOOL_CALL_EVENT_TYPES: ReadonlySet<string> = new Set([
|
|
191
|
+
"clio_tool_finish",
|
|
192
|
+
"clio_permission_resolved",
|
|
193
|
+
"clio_permission_escalated",
|
|
194
|
+
]);
|
|
195
|
+
|
|
196
|
+
function toolCallLines(entries: ReadonlyArray<{ at: string; type: string; detail?: string }>): string[] {
|
|
197
|
+
const lines: string[] = [];
|
|
198
|
+
for (const entry of entries) {
|
|
199
|
+
const detailed = entry.detail !== undefined && entry.detail.length > 0;
|
|
200
|
+
if (!TOOL_CALL_EVENT_TYPES.has(entry.type) && !(entry.type === "tool_execution_end" && detailed)) continue;
|
|
201
|
+
lines.push(` ${entry.at} ${entry.type}${detailed ? `: ${entry.detail}` : ""}`);
|
|
202
|
+
}
|
|
203
|
+
return lines;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function receiptToolLines(receipt: RunReceipt): string[] {
|
|
207
|
+
const lines: string[] = [];
|
|
208
|
+
const activity = receipt.toolActivity;
|
|
209
|
+
if (activity) {
|
|
210
|
+
lines.push(
|
|
211
|
+
` totals: calls=${activity.calls} succeeded=${activity.succeeded} failed=${activity.failed} blocked=${activity.blocked} mutating_succeeded=${activity.mutatingSucceeded}`,
|
|
212
|
+
);
|
|
213
|
+
} else {
|
|
214
|
+
lines.push(` totals: calls=${receipt.toolCalls}`);
|
|
215
|
+
}
|
|
216
|
+
for (const stat of receipt.toolStats) {
|
|
217
|
+
lines.push(
|
|
218
|
+
` ${stat.tool}: count=${stat.count} ok=${stat.ok} errors=${stat.errors} blocked=${stat.blocked} total_ms=${stat.totalDurationMs}`,
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
for (const attempt of receipt.safety?.blockedAttempts ?? []) {
|
|
222
|
+
const parts = [
|
|
223
|
+
` blocked: ${attempt.tool}`,
|
|
224
|
+
attempt.actionClass !== undefined ? `class=${attempt.actionClass}` : "",
|
|
225
|
+
attempt.ruleId !== undefined ? `rule=${attempt.ruleId}` : "",
|
|
226
|
+
attempt.reasonCode !== undefined ? `reason_code=${attempt.reasonCode}` : "",
|
|
227
|
+
].filter((part) => part.length > 0);
|
|
228
|
+
lines.push(parts.join(" "));
|
|
229
|
+
}
|
|
230
|
+
for (const entry of receipt.delegation?.toolCallLog ?? []) {
|
|
231
|
+
let rendered: string;
|
|
232
|
+
try {
|
|
233
|
+
rendered = truncateUtf8(JSON.stringify(entry.arguments), TOOLS_ARGUMENTS_CHARS, "…");
|
|
234
|
+
} catch {
|
|
235
|
+
rendered = "(arguments not serializable)";
|
|
236
|
+
}
|
|
237
|
+
lines.push(` ${entry.timestamp} ${entry.tool} ${entry.decision} args=${rendered}`);
|
|
238
|
+
}
|
|
239
|
+
return lines;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* What a run actually executed, call by call. It exists because the question
|
|
244
|
+
* "did this run really run the validation it claims" had no in-session answer:
|
|
245
|
+
* an orchestrator checking a worker's claimed `npm run typecheck` had to crawl
|
|
246
|
+
* dozens of unrelated calls to find out, and the receipt's `toolCalls` is an
|
|
247
|
+
* integer (REPORT-dispatch-drive-1.md R2).
|
|
248
|
+
*
|
|
249
|
+
* Two sources, both already in this process's hands: the same bounded event
|
|
250
|
+
* tail `mode="peek"` reads, and the run's integrity-verified receipt. Neither
|
|
251
|
+
* carries a command line for an ordinary worker call, so this mode does not
|
|
252
|
+
* pretend to: it reports tool name and outcome per call, aggregates per tool,
|
|
253
|
+
* and the arguments only where the source actually recorded them, which today
|
|
254
|
+
* is the ACP delegation log. Loading the trace mirror to get argv would be a
|
|
255
|
+
* new sqlite path and is deliberately not done here.
|
|
256
|
+
*/
|
|
257
|
+
function runTools(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
258
|
+
const requestedRun = deps.dispatch.getRun(runId);
|
|
259
|
+
const rootRunId = requestedRun?.lineage?.rootRunId ?? runId;
|
|
260
|
+
const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
|
|
261
|
+
const resolvedRunId = assignment?.terminalRunId ?? runId;
|
|
262
|
+
const run = deps.dispatch.getRun(resolvedRunId) ?? requestedRun ?? null;
|
|
263
|
+
if (run === null && assignment === null) return { kind: "error", message: `monitor: unknown run '${runId}'` };
|
|
264
|
+
const tail = deps.runEvents?.eventTail(resolvedRunId) ?? null;
|
|
265
|
+
const callLines = tail ? toolCallLines(tail.entries) : [];
|
|
266
|
+
const evidence = durableRunEvidence(run);
|
|
267
|
+
const receiptLines = evidence.receipt !== null ? receiptToolLines(evidence.receipt) : [];
|
|
268
|
+
|
|
269
|
+
const lines = [`tool calls for run ${resolvedRunId}${run ? ` (${run.agentId})` : ""}:`];
|
|
270
|
+
let omitted = 0;
|
|
271
|
+
if (callLines.length > 0) {
|
|
272
|
+
// Keep the newest calls: an orchestrator asking what a run executed is
|
|
273
|
+
// usually asking about its last moves.
|
|
274
|
+
const shown = callLines.length > TOOLS_MAX_CALL_LINES ? callLines.slice(-TOOLS_MAX_CALL_LINES) : callLines;
|
|
275
|
+
omitted = callLines.length - shown.length;
|
|
276
|
+
lines.push(
|
|
277
|
+
`executed calls from this process's event buffer (newest last, ${shown.length} of ${callLines.length}${omitted > 0 ? `, ${omitted} older omitted` : ""}):`,
|
|
278
|
+
...shown,
|
|
279
|
+
);
|
|
280
|
+
} else {
|
|
281
|
+
lines.push(
|
|
282
|
+
tail === null
|
|
283
|
+
? "executed calls: no event buffer for this run in this process (it ran in another process, or its tail was evicted)."
|
|
284
|
+
: "executed calls: the event buffer holds no tool-call events for this run.",
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
if (receiptLines.length > 0) {
|
|
288
|
+
lines.push("receipt totals (integrity verified):", ...receiptLines);
|
|
289
|
+
} else if (evidence.integrityNote !== null) {
|
|
290
|
+
lines.push(`receipt totals: unavailable. ${evidence.integrityNote}`);
|
|
291
|
+
}
|
|
292
|
+
lines.push(
|
|
293
|
+
"note: the event buffer records tool name and outcome, not command arguments; absent argv is not evidence that no command ran.",
|
|
294
|
+
);
|
|
295
|
+
const body = truncateUtf8(lines.join("\n"), TOOLS_MAX_BYTES, "\n[tool list truncated]");
|
|
296
|
+
return {
|
|
297
|
+
kind: "ok",
|
|
298
|
+
output: body,
|
|
299
|
+
details: {
|
|
300
|
+
mode: "tools",
|
|
301
|
+
runId: resolvedRunId,
|
|
302
|
+
callCount: callLines.length,
|
|
303
|
+
omitted,
|
|
304
|
+
bufferAvailable: tail !== null,
|
|
305
|
+
receiptAvailable: evidence.receipt !== null,
|
|
306
|
+
...(evidence.receipt !== null
|
|
307
|
+
? {
|
|
308
|
+
toolCalls: evidence.receipt.toolCalls,
|
|
309
|
+
toolActivity: evidence.receipt.toolActivity ?? null,
|
|
310
|
+
toolStats: evidence.receipt.toolStats,
|
|
311
|
+
}
|
|
312
|
+
: {}),
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function runReceipt(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
318
|
+
const run = deps.dispatch.getRun(runId);
|
|
319
|
+
if (!run) return { kind: "error", message: `monitor: unknown run '${runId}'` };
|
|
320
|
+
if (!run.receiptPath) {
|
|
321
|
+
return {
|
|
322
|
+
kind: "error",
|
|
323
|
+
message: `monitor: run '${runId}' has no stored receipt (state=${run.outcome ?? run.status}); try mode="status" or mode="peek"`,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
let raw: string;
|
|
327
|
+
try {
|
|
328
|
+
raw = readFileSync(run.receiptPath, "utf8");
|
|
329
|
+
} catch (err) {
|
|
330
|
+
return {
|
|
331
|
+
kind: "error",
|
|
332
|
+
message: `monitor: cannot read receipt ${run.receiptPath}: ${err instanceof Error ? err.message : String(err)}`,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
const body = truncateUtf8(raw, RECEIPT_MAX_BYTES, `\n[receipt truncated; read ${run.receiptPath} for the rest]`);
|
|
336
|
+
let receipt: RunReceipt | null = null;
|
|
337
|
+
let receiptIntegrity: ReceiptIntegrityResult;
|
|
338
|
+
try {
|
|
339
|
+
receipt = JSON.parse(raw) as RunReceipt;
|
|
340
|
+
receiptIntegrity = verifyReceiptIntegrity(receipt, run);
|
|
341
|
+
} catch (err) {
|
|
342
|
+
receiptIntegrity = {
|
|
343
|
+
ok: false,
|
|
344
|
+
reason: `receipt invalid: ${err instanceof Error ? err.message : String(err)}`,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
kind: "ok",
|
|
349
|
+
output: body,
|
|
350
|
+
details: {
|
|
351
|
+
mode: "receipt",
|
|
352
|
+
runId,
|
|
353
|
+
receiptPath: run.receiptPath,
|
|
354
|
+
receiptIntegrity,
|
|
355
|
+
...(receipt !== null && receiptIntegrity.ok
|
|
356
|
+
? {
|
|
357
|
+
evidenceVerification: receipt.verification,
|
|
358
|
+
briefing: receipt.briefing ?? null,
|
|
359
|
+
projectContext: receipt.projectContext ?? null,
|
|
360
|
+
}
|
|
361
|
+
: {}),
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
interface DurableRunEvidence {
|
|
367
|
+
receipt: RunReceipt | null;
|
|
368
|
+
output: RunReceipt["output"] | null;
|
|
369
|
+
verification: RunReceiptVerification;
|
|
370
|
+
integrity: ReceiptIntegrityResult;
|
|
371
|
+
integrityNote: string | null;
|
|
372
|
+
integrityFailure: boolean;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function unavailableRunEvidence(reason: string, note: string, integrityFailure = false): DurableRunEvidence {
|
|
376
|
+
return {
|
|
377
|
+
receipt: null,
|
|
378
|
+
output: null,
|
|
379
|
+
verification: UNVERIFIABLE_RECEIPT_VERIFICATION,
|
|
380
|
+
integrity: { ok: false, reason },
|
|
381
|
+
integrityNote: note,
|
|
382
|
+
integrityFailure,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Read one terminal run's durable evidence boundary exactly once. Receipt
|
|
388
|
+
* fields and worker text become renderable only after the existing integrity
|
|
389
|
+
* check succeeds against the ledger envelope. Every failure returns unknown
|
|
390
|
+
* verification plus an explicit note; unauthenticated prose is withheld.
|
|
391
|
+
*/
|
|
392
|
+
function durableRunEvidence(run: RunEnvelope | null): DurableRunEvidence {
|
|
393
|
+
if (!run) {
|
|
394
|
+
return unavailableRunEvidence(
|
|
395
|
+
"run ledger envelope unavailable",
|
|
396
|
+
"receipt integrity unavailable: the run ledger envelope is missing; worker text cannot be authenticated.",
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
if (!run.receiptPath) {
|
|
400
|
+
return unavailableRunEvidence(
|
|
401
|
+
"receipt unavailable",
|
|
402
|
+
"receipt integrity unavailable: no stored receipt; worker text is unavailable and validation is unknown.",
|
|
403
|
+
);
|
|
404
|
+
}
|
|
405
|
+
let receipt: RunReceipt;
|
|
406
|
+
try {
|
|
407
|
+
receipt = JSON.parse(readFileSync(run.receiptPath, "utf8")) as RunReceipt;
|
|
408
|
+
} catch (err) {
|
|
409
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
410
|
+
return unavailableRunEvidence(
|
|
411
|
+
`receipt unreadable: ${detail}`,
|
|
412
|
+
`receipt integrity unavailable: cannot read or parse ${run.receiptPath} (${detail}); worker text is unavailable and validation is unknown.`,
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
let integrity: ReceiptIntegrityResult;
|
|
416
|
+
try {
|
|
417
|
+
integrity = verifyReceiptIntegrity(receipt, run);
|
|
418
|
+
} catch (err) {
|
|
419
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
420
|
+
return unavailableRunEvidence(
|
|
421
|
+
`receipt invalid: ${detail}`,
|
|
422
|
+
`receipt integrity failed: invalid receipt (${detail}); worker text is withheld as untrusted and validation is unknown.`,
|
|
423
|
+
true,
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
if (!integrity.ok) {
|
|
427
|
+
return unavailableRunEvidence(
|
|
428
|
+
integrity.reason,
|
|
429
|
+
`receipt integrity failed: ${integrity.reason}; worker text is withheld as untrusted and validation is unknown.`,
|
|
430
|
+
true,
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
return {
|
|
434
|
+
receipt,
|
|
435
|
+
output: receipt.output ?? null,
|
|
436
|
+
verification: receipt.verification,
|
|
437
|
+
integrity,
|
|
438
|
+
integrityNote: null,
|
|
439
|
+
integrityFailure: false,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Observe one run until it is terminal, the timeout fires, or the tool call
|
|
445
|
+
* is aborted. Purely a bounded observation: the run is never cancelled or
|
|
446
|
+
* otherwise affected (steer action=cancel stops a run). Elapsed time uses the
|
|
447
|
+
* monotonic clock: a wall-clock step (NTP sync, VM resume) must not shrink or
|
|
448
|
+
* inflate the timeout window.
|
|
449
|
+
*/
|
|
450
|
+
async function runWait(
|
|
451
|
+
deps: MonitorToolDeps,
|
|
452
|
+
runId: string,
|
|
453
|
+
timeoutMs: number,
|
|
454
|
+
signal: AbortSignal | undefined,
|
|
455
|
+
): Promise<ToolResult> {
|
|
456
|
+
const startedAt = performance.now();
|
|
457
|
+
let run = deps.dispatch.getRun(runId);
|
|
458
|
+
if (!run) return { kind: "error", message: `monitor: unknown run '${runId}'` };
|
|
459
|
+
const rootRunId = run.lineage?.rootRunId ?? runId;
|
|
460
|
+
let assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
|
|
461
|
+
while (assignment?.status === "running" || (assignment === null && !isTerminalRunEnvelope(run))) {
|
|
462
|
+
if (signal?.aborted) return { kind: "error", message: "monitor: wait aborted" };
|
|
463
|
+
const elapsed = Math.round(performance.now() - startedAt);
|
|
464
|
+
if (elapsed >= timeoutMs) {
|
|
465
|
+
return {
|
|
466
|
+
kind: "ok",
|
|
467
|
+
output: `wait timed out after ${timeoutMs}ms: ${assignment ? "assignment" : "run"} ${runId} is still ${assignment?.status ?? run.status} and keeps running normally. Wait again or collect later. Only steer(action="cancel") if the result is no longer needed — cancelling discards its work.`,
|
|
468
|
+
details: {
|
|
469
|
+
mode: "wait",
|
|
470
|
+
runId,
|
|
471
|
+
timedOut: true,
|
|
472
|
+
state: assignment?.status ?? run.status,
|
|
473
|
+
waitedMs: elapsed,
|
|
474
|
+
},
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
await sleep(Math.min(WAIT_POLL_MS, timeoutMs - elapsed));
|
|
478
|
+
assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
|
|
479
|
+
const resolvedRunId = assignment?.terminalRunId ?? runId;
|
|
480
|
+
run = deps.dispatch.getRun(resolvedRunId) ?? run;
|
|
481
|
+
if (!run) return { kind: "error", message: `monitor: run '${runId}' disappeared from the ledger while waiting` };
|
|
482
|
+
}
|
|
483
|
+
const status = runStatus(deps, runId);
|
|
484
|
+
if (status.kind !== "ok") return status;
|
|
485
|
+
const waitedMs = Math.round(performance.now() - startedAt);
|
|
486
|
+
return {
|
|
487
|
+
kind: "ok",
|
|
488
|
+
output: `wait complete after ${waitedMs}ms:\n${status.output}`,
|
|
489
|
+
details: { ...status.details, mode: "wait", timedOut: false, waitedMs },
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
interface CollectRow {
|
|
494
|
+
/** Terminal attempt id when known, otherwise the root run id. */
|
|
495
|
+
runId: string;
|
|
496
|
+
assignmentId: string | null;
|
|
497
|
+
attemptRunIds: ReadonlyArray<string>;
|
|
498
|
+
assignmentStatus: DurableAssignmentRecord["status"] | null;
|
|
499
|
+
agentId: string;
|
|
500
|
+
run: RunEnvelope | null;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
interface CollectedRunRow extends CollectRow {
|
|
504
|
+
evidence: DurableRunEvidence;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
function failedIntegrityReason(integrity: ReceiptIntegrityResult): string {
|
|
508
|
+
return integrity.ok ? "verification result unavailable" : integrity.reason;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
function collectRunLine(row: CollectedRunRow): string[] {
|
|
512
|
+
const run = row.run;
|
|
513
|
+
const lines = run
|
|
514
|
+
? [
|
|
515
|
+
`- ${run.id} agent=${run.agentId} state=${run.outcome ?? run.status} node=${run.node?.id ?? "local"} exit=${run.exitCode ?? "n/a"} tokens=${run.tokenCount} cost=${formatCostAggregate(costAggregateForAmount(run.costUsd, run.costProvenance)) ?? COST_NOT_MEASURED} receipt=${run.receiptPath ?? "n/a"}${run.outcomeDetail ? ` detail=${run.outcomeDetail}` : ""}`,
|
|
516
|
+
]
|
|
517
|
+
: [`- ${row.runId} agent=${row.agentId} state=missing (ledger row pruned; receipt may still exist)`];
|
|
518
|
+
if (row.assignmentId !== null) {
|
|
519
|
+
lines.unshift(
|
|
520
|
+
`- assignment=${row.assignmentId} status=${row.assignmentStatus ?? "unknown"} terminal=${row.runId}`,
|
|
521
|
+
` attempts=${row.attemptRunIds.join(",") || "none"}`,
|
|
522
|
+
);
|
|
523
|
+
}
|
|
524
|
+
if (row.evidence.receipt !== null) {
|
|
525
|
+
lines.push(
|
|
526
|
+
...receiptEvidenceLabels(row.evidence.receipt, row.evidence.verification, row.evidence.integrity).map(
|
|
527
|
+
(label) => ` ${label}`,
|
|
528
|
+
),
|
|
529
|
+
);
|
|
530
|
+
} else {
|
|
531
|
+
const reason = failedIntegrityReason(row.evidence.integrity);
|
|
532
|
+
lines.push(
|
|
533
|
+
row.evidence.integrityFailure
|
|
534
|
+
? ` RECEIPT INTEGRITY FAILED for ${row.runId} (${reason}); stored receipt fields and worker text are untrusted.`
|
|
535
|
+
: ` receipt_integrity=unavailable reason=${JSON.stringify(reason)}`,
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
if (row.evidence.integrityNote) lines.push(` ${row.evidence.integrityNote}`);
|
|
539
|
+
lines.push(` ${workerTextLabel(row.evidence.verification)}`);
|
|
540
|
+
const output = row.evidence.output;
|
|
541
|
+
if (output) {
|
|
542
|
+
const capped = truncateUtf8(output.text, COLLECT_TEXT_BYTES, "...");
|
|
543
|
+
const qualifier = output.state === "partial" ? " (partial; the run did not complete this message)" : "";
|
|
544
|
+
const truncatedNote = output.truncated ? ` (stored output truncated; full text was ${output.bytes} bytes)` : "";
|
|
545
|
+
lines.push(` agent output${qualifier}${truncatedNote}:`, ...capped.split("\n").map((line) => ` ${line}`));
|
|
546
|
+
if (row.evidence.receipt) {
|
|
547
|
+
lines.push(
|
|
548
|
+
...workerTextNonEvidenceNotices(row.evidence.receipt, row.evidence.verification, output.text).map(
|
|
549
|
+
(notice) => ` ${notice}`,
|
|
550
|
+
),
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
} else if (row.evidence.integrity.ok) {
|
|
554
|
+
lines.push(" (no assistant text captured)");
|
|
555
|
+
}
|
|
556
|
+
return lines;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
function resolveCollectRow(deps: MonitorToolDeps, originalRunId: string, agentId: string): CollectRow {
|
|
560
|
+
const original = deps.dispatch.getRun(originalRunId);
|
|
561
|
+
const rootRunId = original?.lineage?.rootRunId ?? originalRunId;
|
|
562
|
+
// The durable assignment record is written asynchronously at admission, so a
|
|
563
|
+
// collect issued in that window sees none yet and reads the attempt directly.
|
|
564
|
+
// terminalRunId is null while the assignment is still running.
|
|
565
|
+
const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
|
|
566
|
+
const runId = assignment?.terminalRunId ?? originalRunId;
|
|
567
|
+
const run = deps.dispatch.getRun(runId) ?? original;
|
|
568
|
+
return {
|
|
569
|
+
runId,
|
|
570
|
+
assignmentId: assignment?.assignmentId ?? null,
|
|
571
|
+
attemptRunIds: assignment?.attempts ?? [originalRunId],
|
|
572
|
+
assignmentStatus: assignment?.status ?? null,
|
|
573
|
+
agentId: run?.agentId ?? agentId,
|
|
574
|
+
run,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* Batch barrier over a durable batch id or an explicit run-id list. Never
|
|
580
|
+
* blocks: while any run is in flight it returns a pending snapshot; once all
|
|
581
|
+
* are terminal it returns the full results and marks the batch collected so
|
|
582
|
+
* completion nudges stop. A ledger row pruned from the bounded ring counts as
|
|
583
|
+
* terminal (it can never complete) and is reported as missing.
|
|
584
|
+
*/
|
|
585
|
+
async function runCollect(
|
|
586
|
+
deps: MonitorToolDeps,
|
|
587
|
+
batchId: string,
|
|
588
|
+
runIds: ReadonlyArray<string>,
|
|
589
|
+
timeoutWasPassed: boolean,
|
|
590
|
+
): Promise<ToolResult> {
|
|
591
|
+
let rows: CollectRow[];
|
|
592
|
+
let scope: string;
|
|
593
|
+
let ledgerId: string | null = null;
|
|
594
|
+
if (batchId.length > 0) {
|
|
595
|
+
const detached = deps.dispatch.detached;
|
|
596
|
+
if (!detached) return { kind: "error", message: "monitor: no detached batch records are available in this context" };
|
|
597
|
+
const record = detached.get(batchId);
|
|
598
|
+
if (!record) return { kind: "error", message: `monitor: unknown batch '${batchId}'` };
|
|
599
|
+
ledgerId = record.ledgerId ?? null;
|
|
600
|
+
rows = record.runs.map((entry) => resolveCollectRow(deps, entry.assignmentId, entry.agentId));
|
|
601
|
+
scope = `batch ${batchId}${record.collectedAt !== null ? " (already collected)" : ""}`;
|
|
602
|
+
} else {
|
|
603
|
+
rows = runIds.map((runId) => resolveCollectRow(deps, runId, "unknown"));
|
|
604
|
+
scope = `${rows.length} run(s)`;
|
|
605
|
+
}
|
|
606
|
+
// A durably-running assignment is never collectable: a genuinely in-flight
|
|
607
|
+
// one still has an active attempt or a queued retry, and an orphaned one is
|
|
608
|
+
// reconciled to terminal at startup. Reporting it complete while its status
|
|
609
|
+
// is still "running" would let a caller consume a non-final attempt.
|
|
610
|
+
const pending = rows.filter((row) => {
|
|
611
|
+
if (row.assignmentStatus === null) return row.run !== null && !isTerminalRunEnvelope(row.run);
|
|
612
|
+
return row.assignmentStatus === "running";
|
|
613
|
+
});
|
|
614
|
+
if (pending.length > 0) {
|
|
615
|
+
const lines = [
|
|
616
|
+
`collect pending: ${pending.length} of ${rows.length} run(s) still in flight for ${scope}`,
|
|
617
|
+
...rows.map((row) => {
|
|
618
|
+
const state = row.run === null ? "missing" : (row.run.outcome ?? row.run.status);
|
|
619
|
+
return `- ${row.assignmentId ?? row.runId} agent=${row.agentId} state=${row.assignmentStatus ?? state}`;
|
|
620
|
+
}),
|
|
621
|
+
"",
|
|
622
|
+
'Collect again later, or block on a single run with mode="wait".',
|
|
623
|
+
...(timeoutWasPassed ? ["", COLLECT_TIMEOUT_NOTICE] : []),
|
|
624
|
+
];
|
|
625
|
+
return {
|
|
626
|
+
kind: "ok",
|
|
627
|
+
output: lines.join("\n"),
|
|
628
|
+
details: {
|
|
629
|
+
mode: "collect",
|
|
630
|
+
...(batchId.length > 0 ? { batchId } : {}),
|
|
631
|
+
complete: false,
|
|
632
|
+
pendingCount: pending.length,
|
|
633
|
+
runCount: rows.length,
|
|
634
|
+
pendingRunIds: pending.map((row) => row.assignmentId ?? row.runId),
|
|
635
|
+
},
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
const failed = rows.filter(
|
|
639
|
+
(row) =>
|
|
640
|
+
row.run === null ||
|
|
641
|
+
row.run.exitCode !== 0 ||
|
|
642
|
+
(row.run.outcome !== undefined && row.run.outcome !== "succeeded" && row.run.outcome !== null),
|
|
643
|
+
);
|
|
644
|
+
const missing = rows.filter((row) => row.run === null);
|
|
645
|
+
// Every run is terminal here, so the board is what the peers finished with.
|
|
646
|
+
// It is read before the collect that closes it, and a closed board still
|
|
647
|
+
// renders, so a repeated collect answers the same way as the first.
|
|
648
|
+
const board = ledgerId === null ? null : renderAgentLedgerBoard(ledgerId);
|
|
649
|
+
// The batch is only reported collected when the durable mark actually
|
|
650
|
+
// persisted; on failure it stays open for a later collect and the result
|
|
651
|
+
// says so instead of pretending.
|
|
652
|
+
let collected = false;
|
|
653
|
+
if (batchId.length > 0) {
|
|
654
|
+
try {
|
|
655
|
+
const marked = await deps.dispatch.detached?.markCollected(batchId);
|
|
656
|
+
collected = marked !== null && marked !== undefined;
|
|
657
|
+
} catch {
|
|
658
|
+
collected = false;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
const collectedRows: CollectedRunRow[] = rows.map((row) => ({ ...row, evidence: durableRunEvidence(row.run) }));
|
|
662
|
+
const lines = [
|
|
663
|
+
`collect complete for ${scope}: total=${rows.length} failed=${failed.length}${missing.length > 0 ? ` missing=${missing.length}` : ""}`,
|
|
664
|
+
...collectedRows.flatMap((row) => collectRunLine(row)),
|
|
665
|
+
...(board !== null ? ["", board] : []),
|
|
666
|
+
...(batchId.length > 0 && !collected
|
|
667
|
+
? ["", "note: the batch record could not be marked collected; it stays open for a later collect."]
|
|
668
|
+
: []),
|
|
669
|
+
...(timeoutWasPassed ? ["", COLLECT_TIMEOUT_NOTICE] : []),
|
|
670
|
+
];
|
|
671
|
+
return {
|
|
672
|
+
kind: "ok",
|
|
673
|
+
output: lines.join("\n"),
|
|
674
|
+
details: {
|
|
675
|
+
mode: "collect",
|
|
676
|
+
...(batchId.length > 0 ? { batchId, collected } : {}),
|
|
677
|
+
...(board !== null ? { agentLedgerBoard: board } : {}),
|
|
678
|
+
complete: true,
|
|
679
|
+
runCount: rows.length,
|
|
680
|
+
failedCount: failed.length,
|
|
681
|
+
runs: collectedRows.map((row) => {
|
|
682
|
+
const output = row.evidence.output;
|
|
683
|
+
return {
|
|
684
|
+
runId: row.runId,
|
|
685
|
+
...(row.assignmentId !== null
|
|
686
|
+
? {
|
|
687
|
+
assignmentId: row.assignmentId,
|
|
688
|
+
assignmentStatus: row.assignmentStatus,
|
|
689
|
+
attemptRunIds: [...row.attemptRunIds],
|
|
690
|
+
terminalRunId: row.runId,
|
|
691
|
+
}
|
|
692
|
+
: {}),
|
|
693
|
+
agentId: row.agentId,
|
|
694
|
+
state: row.run === null ? "missing" : (row.run.outcome ?? row.run.status),
|
|
695
|
+
exitCode: row.run?.exitCode ?? null,
|
|
696
|
+
receiptPath: row.run?.receiptPath ?? null,
|
|
697
|
+
receiptIntegrity: row.evidence.integrity,
|
|
698
|
+
evidenceVerification: row.evidence.verification,
|
|
699
|
+
briefing: row.evidence.receipt?.briefing ?? null,
|
|
700
|
+
projectContext: row.evidence.receipt?.projectContext ?? null,
|
|
701
|
+
...(output ? { output: { state: output.state, bytes: output.bytes, truncated: output.truncated } } : {}),
|
|
702
|
+
};
|
|
703
|
+
}),
|
|
704
|
+
},
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
export function createMonitorTool(deps: MonitorToolDeps): ToolSpec {
|
|
709
|
+
return {
|
|
710
|
+
name: ToolNames.Monitor,
|
|
711
|
+
description:
|
|
712
|
+
"Inspect known dispatched runs. Parent-model mid-run observation requires detach:true because ordinary dispatch auto-waits. wait observes without collecting. collect is the authoritative terminal batch operation; collect detached runs before final synthesis. receipt exposes stored evidence. Receipt integrity, evidence verification, briefing provenance, and project-context provenance are separate fields.",
|
|
713
|
+
parameters: Type.Object({
|
|
714
|
+
run_id: Type.Optional(
|
|
715
|
+
Type.String({ description: "Run id from dispatch output or monitor list; omit with mode=list." }),
|
|
716
|
+
),
|
|
717
|
+
mode: Type.Optional(
|
|
718
|
+
stringEnum(
|
|
719
|
+
["status", "peek", "receipt", "list", "wait", "collect", "tools"],
|
|
720
|
+
"What to return. Defaults to status when run_id is present and list when it is absent. status, peek, receipt, tools, and wait each observe one run and require a run_id; list takes none. tools answers what a run executed: its tool calls with outcomes, plus per-tool totals from the receipt.",
|
|
721
|
+
),
|
|
722
|
+
),
|
|
723
|
+
batch_id: Type.Optional(Type.String({ description: "Detached batch id from dispatch detach:true (mode=collect)." })),
|
|
724
|
+
run_ids: Type.Optional(
|
|
725
|
+
Type.Array(Type.String(), {
|
|
726
|
+
description:
|
|
727
|
+
"Explicit run ids for mode=collect; a one-element array is also accepted by single-run modes when run_id is absent.",
|
|
728
|
+
}),
|
|
729
|
+
),
|
|
730
|
+
timeout_ms: Type.Optional(
|
|
731
|
+
Type.Number({
|
|
732
|
+
description:
|
|
733
|
+
"mode=wait: max ms to block (default 60000, capped at 600000); mode=collect never blocks and ignores this value with a notice.",
|
|
734
|
+
}),
|
|
735
|
+
),
|
|
736
|
+
}),
|
|
737
|
+
baseActionClass: "read",
|
|
738
|
+
executionMode: "parallel",
|
|
739
|
+
async run(args, options): Promise<ToolResult> {
|
|
740
|
+
const explicitRunId = typeof args.run_id === "string" ? args.run_id.trim() : "";
|
|
741
|
+
const rawRunIds = Array.isArray(args.run_ids) ? args.run_ids : null;
|
|
742
|
+
const singletonRunId = rawRunIds?.length === 1 && typeof rawRunIds[0] === "string" ? rawRunIds[0].trim() : "";
|
|
743
|
+
const runId = explicitRunId.length > 0 ? explicitRunId : singletonRunId;
|
|
744
|
+
const mode = typeof args.mode === "string" ? args.mode : runId.length > 0 ? "status" : "list";
|
|
745
|
+
if (
|
|
746
|
+
mode !== "status" &&
|
|
747
|
+
mode !== "peek" &&
|
|
748
|
+
mode !== "receipt" &&
|
|
749
|
+
mode !== "list" &&
|
|
750
|
+
mode !== "wait" &&
|
|
751
|
+
mode !== "collect" &&
|
|
752
|
+
mode !== "tools"
|
|
753
|
+
) {
|
|
754
|
+
return {
|
|
755
|
+
kind: "error",
|
|
756
|
+
message: `monitor: mode must be status, peek, receipt, list, wait, collect, or tools; got '${mode}'`,
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
if (mode === "list") return listRuns(deps, options);
|
|
760
|
+
if (mode === "collect") {
|
|
761
|
+
const batchId = typeof args.batch_id === "string" ? args.batch_id.trim() : "";
|
|
762
|
+
const runIds = rawRunIds
|
|
763
|
+
? rawRunIds.filter((entry): entry is string => typeof entry === "string" && entry.trim().length > 0)
|
|
764
|
+
: [];
|
|
765
|
+
if (batchId.length === 0 && runIds.length === 0) {
|
|
766
|
+
return { kind: "error", message: "monitor: mode=collect requires batch_id or a non-empty run_ids array" };
|
|
767
|
+
}
|
|
768
|
+
return runCollect(deps, batchId, runIds, Object.hasOwn(args, "timeout_ms"));
|
|
769
|
+
}
|
|
770
|
+
if (runId.length === 0) {
|
|
771
|
+
if (rawRunIds !== null) {
|
|
772
|
+
const entryLabel = rawRunIds.length === 1 ? "entry" : "entries";
|
|
773
|
+
return {
|
|
774
|
+
kind: "error",
|
|
775
|
+
message: `monitor: mode=${mode} observes one run; got run_ids with ${rawRunIds.length} ${entryLabel} — pass run_id=<one id>, or use mode=collect run_ids=[...] for a batch`,
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
return {
|
|
779
|
+
kind: "error",
|
|
780
|
+
message: `monitor: mode=${mode} observes one run and needs run_id; call monitor(mode="list") first to see the run ids this session knows about`,
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
if (mode === "wait") {
|
|
784
|
+
const rawTimeout = typeof args.timeout_ms === "number" && Number.isFinite(args.timeout_ms) ? args.timeout_ms : NaN;
|
|
785
|
+
const timeoutMs =
|
|
786
|
+
Number.isFinite(rawTimeout) && rawTimeout > 0
|
|
787
|
+
? Math.min(Math.floor(rawTimeout), WAIT_MAX_TIMEOUT_MS)
|
|
788
|
+
: WAIT_DEFAULT_TIMEOUT_MS;
|
|
789
|
+
return runWait(deps, runId, timeoutMs, options?.signal);
|
|
790
|
+
}
|
|
791
|
+
if (mode === "status") return runStatus(deps, runId);
|
|
792
|
+
if (mode === "peek") return runPeek(deps, runId);
|
|
793
|
+
if (mode === "tools") return runTools(deps, runId);
|
|
794
|
+
return runReceipt(deps, runId);
|
|
795
|
+
},
|
|
796
|
+
};
|
|
797
|
+
}
|