@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,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry settings and countdown helper (Phase 12 / Phase 22 seam).
|
|
3
|
+
*
|
|
4
|
+
* pi-agent-core surfaces provider failures as a terminal assistant message
|
|
5
|
+
* with `stopReason: "error"` + `errorMessage: <provider text>`. It does not
|
|
6
|
+
* schedule retries itself; application wrappers decide whether to treat the
|
|
7
|
+
* error as transient, wait, and call `agent.continue()`. pi-mono's
|
|
8
|
+
* coding-agent implements that in `core/agent-session.ts` via an exponential
|
|
9
|
+
* backoff, a countdown UI, and an abort handle.
|
|
10
|
+
*
|
|
11
|
+
* This module is the pure building block for the Clio equivalent. It:
|
|
12
|
+
* 1. Declares the RetrySettings shape and sensible defaults.
|
|
13
|
+
* 2. Exposes a deterministic heuristic (`isRetryableErrorMessage`) that
|
|
14
|
+
* matches the transient error strings pi-ai providers actually emit.
|
|
15
|
+
* 3. Computes the backoff delay for a given attempt (`computeRetryDelayMs`)
|
|
16
|
+
* with the cap the settings declare; callers schedule the wait.
|
|
17
|
+
* 4. Provides `createRetryCountdown` so the TUI can show seconds remaining
|
|
18
|
+
* and cancel a pending retry on `Esc` without coupling to a specific
|
|
19
|
+
* timer abstraction.
|
|
20
|
+
*
|
|
21
|
+
* No I/O, no pi-agent-core/pi-ai imports. The chat-loop wiring (which decides
|
|
22
|
+
* whether an agent_end with stopReason "error" triggers a retry) lives in
|
|
23
|
+
* `src/interactive/chat-loop.ts` and consumes this module; keeping the two
|
|
24
|
+
* split so the countdown can be exercised in unit tests without spinning up a
|
|
25
|
+
* runtime.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { performance } from "node:perf_hooks";
|
|
29
|
+
import type { RetrySettings } from "../../core/defaults.js";
|
|
30
|
+
|
|
31
|
+
export type { RetrySettings } from "../../core/defaults.js";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* User-facing retry configuration lives in core defaults so settings and the
|
|
35
|
+
* session retry helper share one structural type.
|
|
36
|
+
*/
|
|
37
|
+
export const DEFAULT_RETRY_SETTINGS: RetrySettings = {
|
|
38
|
+
enabled: true,
|
|
39
|
+
maxRetries: 3,
|
|
40
|
+
baseDelayMs: 2000,
|
|
41
|
+
maxDelayMs: 60000,
|
|
42
|
+
streamStallMs: 180000,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Pattern list built from pi-mono's `_isRetryableError` regex (agent-session.ts).
|
|
47
|
+
* Kept as a plain RegExp so the check is `O(1)` per assistant error message.
|
|
48
|
+
* The match is case-insensitive: providers phrase the same error in mixed
|
|
49
|
+
* case (Anthropic: "Overloaded", OpenRouter: "rate limited", Fireworks:
|
|
50
|
+
* "connection error"), and we want all of them classified as transient.
|
|
51
|
+
*/
|
|
52
|
+
const RETRYABLE_PATTERN =
|
|
53
|
+
/overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|timed? out|timeout|terminated|retry delay/i;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* A self-hosted server refusing a request because the model is not resident.
|
|
57
|
+
*
|
|
58
|
+
* Measured against LM Studio, which answers a request for an evicted model
|
|
59
|
+
* with `500 Internal Server Error` on the first attempt and the bare string
|
|
60
|
+
* `Model is unloaded.` on the next, while it loads. llama.cpp behind
|
|
61
|
+
* llama-swap and Ollama phrase the same condition differently, so the pattern
|
|
62
|
+
* covers the family rather than one vendor's wording.
|
|
63
|
+
*
|
|
64
|
+
* Deliberately not folded into {@link RETRYABLE_PATTERN}: this is transient in
|
|
65
|
+
* a different unit. A rate limit clears in a second or two; a 35B model loads
|
|
66
|
+
* off disk in twenty to sixty, and retrying it on a rate limit's backoff burns
|
|
67
|
+
* every attempt before the server is ready. `clio-coder run --target node-a --model
|
|
68
|
+
* example-coder-model` failed exactly this way: two attempts, six
|
|
69
|
+
* seconds, "Model is unloaded." on stdout, while the load was still running.
|
|
70
|
+
*/
|
|
71
|
+
const MODEL_LOADING_PATTERN =
|
|
72
|
+
/model is unloaded|model is (?:still )?loading|model not loaded|no model (?:is )?loaded|loading model|model_?load(?:ing)?_?in_?progress|is not loaded/i;
|
|
73
|
+
|
|
74
|
+
/** Floor for a retry that is waiting on a model load rather than on a provider. */
|
|
75
|
+
const MODEL_LOADING_MIN_DELAY_MS = 15000;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* True when the error says the target is loading the model, so the wait should
|
|
79
|
+
* be sized for disk and VRAM rather than for a provider backing off.
|
|
80
|
+
*/
|
|
81
|
+
export function isModelLoadingErrorMessage(errorMessage: string | null | undefined): boolean {
|
|
82
|
+
if (!errorMessage || errorMessage.length === 0) return false;
|
|
83
|
+
return MODEL_LOADING_PATTERN.test(errorMessage);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* True when an error message looks like a transient failure worth retrying:
|
|
88
|
+
* a provider backing off, or a self-hosted target loading the model.
|
|
89
|
+
* Context-overflow errors are intentionally excluded: those route through
|
|
90
|
+
* compaction + one-shot recovery, not this retry loop.
|
|
91
|
+
*
|
|
92
|
+
* Callers pass `assistantMessage.errorMessage` directly; an empty string
|
|
93
|
+
* returns false so a missing provider error never triggers an unnecessary
|
|
94
|
+
* retry.
|
|
95
|
+
*/
|
|
96
|
+
export function isRetryableErrorMessage(errorMessage: string | null | undefined): boolean {
|
|
97
|
+
if (!errorMessage || errorMessage.length === 0) return false;
|
|
98
|
+
return RETRYABLE_PATTERN.test(errorMessage) || MODEL_LOADING_PATTERN.test(errorMessage);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Compute the delay before attempt `attempt` (1-indexed). Matches pi-mono's
|
|
103
|
+
* formula `baseDelayMs * 2 ** (attempt - 1)`, then clamps to `maxDelayMs` so
|
|
104
|
+
* the 4th retry never stalls for minutes. Attempt < 1 is normalized to 1 so
|
|
105
|
+
* callers that miscount still get a sane first delay.
|
|
106
|
+
*/
|
|
107
|
+
export function computeRetryDelayMs(
|
|
108
|
+
attempt: number,
|
|
109
|
+
settings: RetrySettings = DEFAULT_RETRY_SETTINGS,
|
|
110
|
+
errorMessage?: string | null,
|
|
111
|
+
): number {
|
|
112
|
+
const safeAttempt = Math.max(1, Math.floor(attempt));
|
|
113
|
+
const raw = settings.baseDelayMs * 2 ** (safeAttempt - 1);
|
|
114
|
+
const base =
|
|
115
|
+
!Number.isFinite(raw) || raw <= 0 ? Math.max(0, settings.baseDelayMs) : Math.min(raw, settings.maxDelayMs);
|
|
116
|
+
// A model load does not finish faster because the retry schedule was
|
|
117
|
+
// written for a rate limit. `maxDelayMs` still caps it, so an operator who
|
|
118
|
+
// wants short waits keeps them.
|
|
119
|
+
if (!isModelLoadingErrorMessage(errorMessage)) return base;
|
|
120
|
+
return Math.min(Math.max(base, MODEL_LOADING_MIN_DELAY_MS), settings.maxDelayMs);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Runtime state for a single retry wait. `seconds` counts down from the
|
|
125
|
+
* initial delay; `done` flips true when the deadline is reached; `cancelled`
|
|
126
|
+
* flips true when a caller aborts via `cancel()` before the deadline.
|
|
127
|
+
*/
|
|
128
|
+
export interface RetryCountdownState {
|
|
129
|
+
attempt: number;
|
|
130
|
+
maxAttempts: number;
|
|
131
|
+
seconds: number;
|
|
132
|
+
done: boolean;
|
|
133
|
+
cancelled: boolean;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface RetryCountdownOptions {
|
|
137
|
+
/** 1-indexed attempt id displayed to the user, e.g. "Retrying (1/3)". */
|
|
138
|
+
attempt: number;
|
|
139
|
+
/** Upper bound displayed alongside `attempt`. */
|
|
140
|
+
maxAttempts: number;
|
|
141
|
+
/** Total wait in milliseconds. Callers usually pass `computeRetryDelayMs(attempt, settings)`. */
|
|
142
|
+
delayMs: number;
|
|
143
|
+
/** Fires on every tick with the latest state so the TUI can redraw. */
|
|
144
|
+
onTick: (state: RetryCountdownState) => void;
|
|
145
|
+
/** Fires once when the countdown reaches zero naturally. */
|
|
146
|
+
onDone: () => void;
|
|
147
|
+
/** Fires once when `cancel()` runs before the deadline. */
|
|
148
|
+
onCancel?: () => void;
|
|
149
|
+
/**
|
|
150
|
+
* Schedule a callback after `ms` milliseconds. Defaults to `setTimeout`.
|
|
151
|
+
* Tests swap this for a deterministic clock so the countdown advances
|
|
152
|
+
* without wall-clock waits.
|
|
153
|
+
*/
|
|
154
|
+
setTimer?: (cb: () => void, ms: number) => unknown;
|
|
155
|
+
/** Mirror of `clearTimeout`. Paired with `setTimer`. */
|
|
156
|
+
clearTimer?: (id: unknown) => void;
|
|
157
|
+
/**
|
|
158
|
+
* Monotonic millisecond source for the countdown. Defaults to
|
|
159
|
+
* `performance.now`: the remaining wait is a span, so a clock correction
|
|
160
|
+
* mid-countdown must not shorten or extend it.
|
|
161
|
+
*/
|
|
162
|
+
now?: () => number;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface RetryCountdownHandle {
|
|
166
|
+
/** Latest state snapshot. Useful for tests that inspect without subscribing. */
|
|
167
|
+
getState(): RetryCountdownState;
|
|
168
|
+
/** Abort the countdown before the deadline; fires `onCancel` if registered. */
|
|
169
|
+
cancel(): void;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* One-second-resolution countdown loop that drives a TUI retry indicator.
|
|
174
|
+
* The first `onTick` fires synchronously so the caller can paint an initial
|
|
175
|
+
* frame without waiting a whole second; subsequent ticks fire every 1000ms
|
|
176
|
+
* until the deadline is reached or `cancel()` is called. All state lives in
|
|
177
|
+
* the returned handle; the function itself has no module-level mutable
|
|
178
|
+
* state, which keeps parallel retry counters safe under concurrent tests.
|
|
179
|
+
*/
|
|
180
|
+
export function createRetryCountdown(options: RetryCountdownOptions): RetryCountdownHandle {
|
|
181
|
+
const setTimer = options.setTimer ?? ((cb, ms) => setTimeout(cb, ms));
|
|
182
|
+
const clearTimer = options.clearTimer ?? ((id) => clearTimeout(id as ReturnType<typeof setTimeout>));
|
|
183
|
+
const now = options.now ?? (() => performance.now());
|
|
184
|
+
|
|
185
|
+
const start = now();
|
|
186
|
+
const deadline = start + Math.max(0, options.delayMs);
|
|
187
|
+
|
|
188
|
+
const state: RetryCountdownState = {
|
|
189
|
+
attempt: options.attempt,
|
|
190
|
+
maxAttempts: options.maxAttempts,
|
|
191
|
+
seconds: Math.max(0, Math.ceil(options.delayMs / 1000)),
|
|
192
|
+
done: false,
|
|
193
|
+
cancelled: false,
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
let timer: unknown = null;
|
|
197
|
+
let settled = false;
|
|
198
|
+
|
|
199
|
+
const emit = (): void => {
|
|
200
|
+
options.onTick({ ...state });
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const schedule = (): void => {
|
|
204
|
+
if (settled) return;
|
|
205
|
+
const remaining = deadline - now();
|
|
206
|
+
if (remaining <= 0) {
|
|
207
|
+
state.seconds = 0;
|
|
208
|
+
state.done = true;
|
|
209
|
+
settled = true;
|
|
210
|
+
emit();
|
|
211
|
+
options.onDone();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
state.seconds = Math.max(0, Math.ceil(remaining / 1000));
|
|
215
|
+
emit();
|
|
216
|
+
timer = setTimer(schedule, 1000);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
schedule();
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
getState() {
|
|
223
|
+
return { ...state };
|
|
224
|
+
},
|
|
225
|
+
cancel() {
|
|
226
|
+
if (settled) return;
|
|
227
|
+
settled = true;
|
|
228
|
+
if (timer !== null) {
|
|
229
|
+
clearTimer(timer);
|
|
230
|
+
timer = null;
|
|
231
|
+
}
|
|
232
|
+
state.cancelled = true;
|
|
233
|
+
state.seconds = 0;
|
|
234
|
+
emit();
|
|
235
|
+
options.onCancel?.();
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import type { SessionEntry, TaskLedgerGoal, TaskLedgerStatus, TaskLedgerValidationEvidence } from "./entries.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The session task board: the live state behind the `tasks` tool, the footer
|
|
5
|
+
* tasks row, and the /tasks overlay. Every mutation persists a full-snapshot
|
|
6
|
+
* `taskLedger` entry (the dormant Phase 12 entry kind gains its producer
|
|
7
|
+
* here), so the board is replayable from the JSONL alone and survives
|
|
8
|
+
* resume/fork without any side-car state.
|
|
9
|
+
*
|
|
10
|
+
* Shape mapping onto TaskLedgerEntry:
|
|
11
|
+
* - the board title is the single top-level goal
|
|
12
|
+
* - tasks are subgoals with parentGoalId pointing at that goal
|
|
13
|
+
* - a completion note becomes a passed requiredValidationEvidence row,
|
|
14
|
+
* so "done" carries its receipt instead of a bare status flip
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const TASK_BOARD_GOAL_ID = "board";
|
|
18
|
+
|
|
19
|
+
export interface TaskBoardTask {
|
|
20
|
+
id: string;
|
|
21
|
+
title: string;
|
|
22
|
+
status: TaskLedgerStatus;
|
|
23
|
+
/** Block or drop reason; empty for pending/active/completed tasks. */
|
|
24
|
+
reason?: string;
|
|
25
|
+
/** Evidence note recorded when the task was completed. */
|
|
26
|
+
evidence?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface TaskBoardSnapshot {
|
|
30
|
+
title: string;
|
|
31
|
+
tasks: ReadonlyArray<TaskBoardTask>;
|
|
32
|
+
/**
|
|
33
|
+
* Dispatch runs currently in flight while this board is live, attached by
|
|
34
|
+
* the orchestrator from the dispatch bus. Process-local linkage: it is
|
|
35
|
+
* persisted on every snapshot so the JSONL records which runs served the
|
|
36
|
+
* board, but a refold after resume/fork restores it empty because those
|
|
37
|
+
* runs belong to the process that dispatched them.
|
|
38
|
+
*/
|
|
39
|
+
activeRunIds: ReadonlyArray<string>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface TaskBoardCounts {
|
|
43
|
+
total: number;
|
|
44
|
+
completed: number;
|
|
45
|
+
active: number;
|
|
46
|
+
pending: number;
|
|
47
|
+
blocked: number;
|
|
48
|
+
cancelled: number;
|
|
49
|
+
/** Tasks still owed work: pending + active. */
|
|
50
|
+
open: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export type TaskBoardMutation =
|
|
54
|
+
| { op: "plan"; title: string; tasks: ReadonlyArray<string> }
|
|
55
|
+
| { op: "add"; tasks: ReadonlyArray<string> }
|
|
56
|
+
| { op: "start"; id: string }
|
|
57
|
+
| { op: "done"; id: string; evidence: string }
|
|
58
|
+
| { op: "block"; id: string; reason: string }
|
|
59
|
+
| { op: "drop"; id: string; reason?: string };
|
|
60
|
+
|
|
61
|
+
export type TaskBoardMutationResult =
|
|
62
|
+
| { ok: true; board: TaskBoardSnapshot; notes: ReadonlyArray<string> }
|
|
63
|
+
| { ok: false; message: string };
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The fields a `taskLedger` entry carries beyond the BaseSessionEntry
|
|
67
|
+
* envelope. `appendEntry` fills turnId/timestamp; parentTurnId stays null
|
|
68
|
+
* because ledger snapshots are side-car bookkeeping (like label entries)
|
|
69
|
+
* that never project into tree.json.
|
|
70
|
+
*/
|
|
71
|
+
export interface TaskLedgerEntryFields {
|
|
72
|
+
kind: "taskLedger";
|
|
73
|
+
parentTurnId: null;
|
|
74
|
+
goals: TaskLedgerGoal[];
|
|
75
|
+
subgoals: TaskLedgerGoal[];
|
|
76
|
+
activeRunIds: string[];
|
|
77
|
+
requiredValidationEvidence: TaskLedgerValidationEvidence[];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface TaskBoardStoreDeps {
|
|
81
|
+
/**
|
|
82
|
+
* Current session id, or null when no session is bound. The store keys its
|
|
83
|
+
* in-memory board on this: a resume/fork/new-session switch invalidates the
|
|
84
|
+
* cache and the next read refolds the board from the session's entries.
|
|
85
|
+
*/
|
|
86
|
+
getSessionId?: () => string | null;
|
|
87
|
+
/** Session entries for refolding after a session switch. */
|
|
88
|
+
readEntries?: () => ReadonlyArray<unknown>;
|
|
89
|
+
/** Persist one full-snapshot taskLedger entry. Absent means in-memory only. */
|
|
90
|
+
appendEntry?: (entry: TaskLedgerEntryFields) => void;
|
|
91
|
+
now?: () => Date;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface TaskBoardStore {
|
|
95
|
+
/** Current board, refolded from the session ledger after a session switch. */
|
|
96
|
+
snapshot(): TaskBoardSnapshot | null;
|
|
97
|
+
/** Apply one mutation, persist the resulting snapshot, and return it. */
|
|
98
|
+
apply(mutation: TaskBoardMutation): TaskBoardMutationResult;
|
|
99
|
+
/** Link an in-flight dispatch run to the board; a no-op without a board. */
|
|
100
|
+
attachRun(runId: string): void;
|
|
101
|
+
/** Unlink a finished dispatch run; a no-op when it was never attached. */
|
|
102
|
+
detachRun(runId: string): void;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function taskBoardCounts(board: Pick<TaskBoardSnapshot, "tasks">): TaskBoardCounts {
|
|
106
|
+
const counts: TaskBoardCounts = {
|
|
107
|
+
total: board.tasks.length,
|
|
108
|
+
completed: 0,
|
|
109
|
+
active: 0,
|
|
110
|
+
pending: 0,
|
|
111
|
+
blocked: 0,
|
|
112
|
+
cancelled: 0,
|
|
113
|
+
open: 0,
|
|
114
|
+
};
|
|
115
|
+
for (const task of board.tasks) {
|
|
116
|
+
if (task.status === "completed") counts.completed += 1;
|
|
117
|
+
else if (task.status === "active") counts.active += 1;
|
|
118
|
+
else if (task.status === "pending") counts.pending += 1;
|
|
119
|
+
else if (task.status === "blocked") counts.blocked += 1;
|
|
120
|
+
else counts.cancelled += 1;
|
|
121
|
+
}
|
|
122
|
+
counts.open = counts.pending + counts.active;
|
|
123
|
+
return counts;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Board status for the ledger's top-level goal, derived from its tasks. */
|
|
127
|
+
function boardStatus(tasks: ReadonlyArray<TaskBoardTask>): TaskLedgerStatus {
|
|
128
|
+
const counts = taskBoardCounts({ tasks });
|
|
129
|
+
if (counts.total === 0) return "pending";
|
|
130
|
+
if (counts.active > 0) return "active";
|
|
131
|
+
if (counts.open === 0 && counts.blocked === 0) return "completed";
|
|
132
|
+
if (counts.blocked > 0 && counts.open === 0) return "blocked";
|
|
133
|
+
return "pending";
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function toTaskLedgerEntryFields(board: TaskBoardSnapshot, now: Date): TaskLedgerEntryFields {
|
|
137
|
+
const evidence: TaskLedgerValidationEvidence[] = [];
|
|
138
|
+
const subgoals: TaskLedgerGoal[] = board.tasks.map((task) => {
|
|
139
|
+
if (task.status === "completed" && task.evidence) {
|
|
140
|
+
evidence.push({
|
|
141
|
+
id: `${task.id}.evidence`,
|
|
142
|
+
description: task.evidence,
|
|
143
|
+
status: "passed",
|
|
144
|
+
observedAt: now.toISOString(),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const goal: TaskLedgerGoal = {
|
|
148
|
+
id: task.id,
|
|
149
|
+
title: task.title,
|
|
150
|
+
status: task.status,
|
|
151
|
+
parentGoalId: TASK_BOARD_GOAL_ID,
|
|
152
|
+
};
|
|
153
|
+
if (task.reason) goal.description = task.reason;
|
|
154
|
+
return goal;
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
kind: "taskLedger",
|
|
158
|
+
parentTurnId: null,
|
|
159
|
+
goals: [{ id: TASK_BOARD_GOAL_ID, title: board.title, status: boardStatus(board.tasks) }],
|
|
160
|
+
subgoals,
|
|
161
|
+
activeRunIds: [...board.activeRunIds],
|
|
162
|
+
requiredValidationEvidence: evidence,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function isTaskLedgerShaped(value: unknown): value is {
|
|
167
|
+
kind: "taskLedger";
|
|
168
|
+
goals: TaskLedgerGoal[];
|
|
169
|
+
subgoals: TaskLedgerGoal[];
|
|
170
|
+
requiredValidationEvidence: TaskLedgerValidationEvidence[];
|
|
171
|
+
} {
|
|
172
|
+
if (!value || typeof value !== "object") return false;
|
|
173
|
+
const entry = value as Partial<SessionEntry>;
|
|
174
|
+
return entry.kind === "taskLedger" && Array.isArray((entry as { goals?: unknown }).goals);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Fold a session's entries back into a board. Each taskLedger entry is a full
|
|
179
|
+
* snapshot, so the last one wins; earlier entries are history, not deltas.
|
|
180
|
+
*/
|
|
181
|
+
export function foldTaskBoard(entries: ReadonlyArray<unknown>): TaskBoardSnapshot | null {
|
|
182
|
+
let last: ReturnType<typeof toEntryView> = null;
|
|
183
|
+
for (const raw of entries) {
|
|
184
|
+
if (isTaskLedgerShaped(raw)) last = toEntryView(raw);
|
|
185
|
+
}
|
|
186
|
+
return last;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function toEntryView(entry: {
|
|
190
|
+
goals: TaskLedgerGoal[];
|
|
191
|
+
subgoals: TaskLedgerGoal[];
|
|
192
|
+
requiredValidationEvidence: TaskLedgerValidationEvidence[];
|
|
193
|
+
}): TaskBoardSnapshot | null {
|
|
194
|
+
const boardGoal = entry.goals[0];
|
|
195
|
+
if (!boardGoal) return null;
|
|
196
|
+
const evidenceByTask = new Map<string, string>();
|
|
197
|
+
for (const item of entry.requiredValidationEvidence) {
|
|
198
|
+
const taskId = item.id.endsWith(".evidence") ? item.id.slice(0, -".evidence".length) : item.id;
|
|
199
|
+
evidenceByTask.set(taskId, item.description);
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
title: boardGoal.title,
|
|
203
|
+
tasks: entry.subgoals.map((goal) => {
|
|
204
|
+
const task: TaskBoardTask = { id: goal.id, title: goal.title, status: goal.status };
|
|
205
|
+
if (goal.description) task.reason = goal.description;
|
|
206
|
+
const evidence = evidenceByTask.get(goal.id);
|
|
207
|
+
if (evidence) task.evidence = evidence;
|
|
208
|
+
return task;
|
|
209
|
+
}),
|
|
210
|
+
// Run linkage is process-live: the runs recorded in old entries ended
|
|
211
|
+
// with the process that dispatched them, so a refold starts empty and
|
|
212
|
+
// the historical linkage stays readable in the earlier entries.
|
|
213
|
+
activeRunIds: [],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function nextTaskId(tasks: ReadonlyArray<TaskBoardTask>): number {
|
|
218
|
+
let max = 0;
|
|
219
|
+
for (const task of tasks) {
|
|
220
|
+
const match = /^t(\d+)$/.exec(task.id);
|
|
221
|
+
if (match) max = Math.max(max, Number(match[1]));
|
|
222
|
+
}
|
|
223
|
+
return max + 1;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function normalizeTitles(titles: ReadonlyArray<string>): string[] {
|
|
227
|
+
return titles.map((title) => title.trim()).filter((title) => title.length > 0);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function applyMutation(
|
|
231
|
+
board: TaskBoardSnapshot | null,
|
|
232
|
+
mutation: TaskBoardMutation,
|
|
233
|
+
): { board: TaskBoardSnapshot; notes: string[] } | { error: string } {
|
|
234
|
+
if (mutation.op === "plan") {
|
|
235
|
+
const titles = normalizeTitles(mutation.tasks);
|
|
236
|
+
if (mutation.title.trim().length === 0) return { error: "plan requires a non-empty title" };
|
|
237
|
+
if (titles.length === 0) return { error: "plan requires at least one task" };
|
|
238
|
+
const notes: string[] = [];
|
|
239
|
+
if (board && taskBoardCounts(board).open > 0) {
|
|
240
|
+
notes.push(`replaced board "${board.title}" with ${taskBoardCounts(board).open} task(s) still open`);
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
board: {
|
|
244
|
+
title: mutation.title.trim(),
|
|
245
|
+
tasks: titles.map((title, index) => ({ id: `t${index + 1}`, title, status: "pending" as const })),
|
|
246
|
+
// Runs in flight outlive a board swap: they belong to the session,
|
|
247
|
+
// so the fresh board inherits the linkage until the runs finish.
|
|
248
|
+
activeRunIds: board?.activeRunIds ?? [],
|
|
249
|
+
},
|
|
250
|
+
notes,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
if (board === null) return { error: 'no task board yet; declare one with action="plan" first' };
|
|
254
|
+
if (mutation.op === "add") {
|
|
255
|
+
const titles = normalizeTitles(mutation.tasks);
|
|
256
|
+
if (titles.length === 0) return { error: "add requires at least one task" };
|
|
257
|
+
const start = nextTaskId(board.tasks);
|
|
258
|
+
const added = titles.map((title, index) => ({ id: `t${start + index}`, title, status: "pending" as const }));
|
|
259
|
+
return { board: { ...board, tasks: [...board.tasks, ...added] }, notes: [] };
|
|
260
|
+
}
|
|
261
|
+
const target = board.tasks.find((task) => task.id === mutation.id);
|
|
262
|
+
if (!target) return { error: `task ${mutation.id} not found on the board` };
|
|
263
|
+
if (mutation.op === "block" && mutation.reason.trim().length === 0) {
|
|
264
|
+
return { error: "block requires a reason so the ledger records why work stopped" };
|
|
265
|
+
}
|
|
266
|
+
// Completion is the ledger's only load-bearing claim, so it carries two
|
|
267
|
+
// structural conditions rather than a bare status flip. Evidence is
|
|
268
|
+
// mandatory: a completed row becomes a passed validation record, and a row
|
|
269
|
+
// without evidence would assert a validation that nobody performed. The
|
|
270
|
+
// task must also have been started, because work that was never entered
|
|
271
|
+
// cannot have produced a result; the honest closes for it are block and
|
|
272
|
+
// drop, which record a reason instead.
|
|
273
|
+
if (mutation.op === "done") {
|
|
274
|
+
if (mutation.evidence.trim().length === 0) {
|
|
275
|
+
return {
|
|
276
|
+
error:
|
|
277
|
+
"done requires note as the evidence that the task actually finished (the command you ran, the file:line you verified). If the work did not happen, use block with a reason or drop it.",
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
if (target.status === "pending") {
|
|
281
|
+
return {
|
|
282
|
+
error: `task ${target.id} was never started, so it cannot be completed. Start it and do the work, or record the truth with block (reason) or drop.`,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const notes: string[] = [];
|
|
287
|
+
const tasks = board.tasks.map((task): TaskBoardTask => {
|
|
288
|
+
if (task.id !== target.id) {
|
|
289
|
+
// One active task at a time: starting a task parks any other active
|
|
290
|
+
// task back to pending so the board always names the current focus.
|
|
291
|
+
if (mutation.op === "start" && task.status === "active") {
|
|
292
|
+
notes.push(`parked ${task.id} back to pending (one task active at a time)`);
|
|
293
|
+
return { ...task, status: "pending" };
|
|
294
|
+
}
|
|
295
|
+
return task;
|
|
296
|
+
}
|
|
297
|
+
return applyStatusMutation(task, mutation);
|
|
298
|
+
});
|
|
299
|
+
return { board: { ...board, tasks }, notes };
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function applyStatusMutation(
|
|
303
|
+
task: TaskBoardTask,
|
|
304
|
+
mutation: Extract<TaskBoardMutation, { op: "start" | "done" | "block" | "drop" }>,
|
|
305
|
+
): TaskBoardTask {
|
|
306
|
+
switch (mutation.op) {
|
|
307
|
+
case "start":
|
|
308
|
+
return { ...task, status: "active" };
|
|
309
|
+
case "done": {
|
|
310
|
+
const done: TaskBoardTask = { ...task, status: "completed", evidence: mutation.evidence.trim() };
|
|
311
|
+
delete done.reason;
|
|
312
|
+
return done;
|
|
313
|
+
}
|
|
314
|
+
case "block":
|
|
315
|
+
return { ...task, status: "blocked", reason: mutation.reason.trim() };
|
|
316
|
+
case "drop": {
|
|
317
|
+
const dropped: TaskBoardTask = { ...task, status: "cancelled" };
|
|
318
|
+
if (mutation.reason?.trim()) dropped.reason = mutation.reason.trim();
|
|
319
|
+
return dropped;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
export function createTaskBoardStore(deps: TaskBoardStoreDeps = {}): TaskBoardStore {
|
|
325
|
+
let cachedSessionId: string | null | undefined;
|
|
326
|
+
let board: TaskBoardSnapshot | null = null;
|
|
327
|
+
|
|
328
|
+
const syncToSession = (): void => {
|
|
329
|
+
const sessionId = deps.getSessionId?.() ?? null;
|
|
330
|
+
if (cachedSessionId === sessionId) return;
|
|
331
|
+
cachedSessionId = sessionId;
|
|
332
|
+
try {
|
|
333
|
+
board = deps.readEntries ? foldTaskBoard(deps.readEntries()) : null;
|
|
334
|
+
} catch {
|
|
335
|
+
board = null;
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
const persist = (next: TaskBoardSnapshot): void => {
|
|
340
|
+
try {
|
|
341
|
+
deps.appendEntry?.(toTaskLedgerEntryFields(next, deps.now?.() ?? new Date()));
|
|
342
|
+
} catch {
|
|
343
|
+
// Persistence is best-effort: the live board still drives the UI
|
|
344
|
+
// and the model; a failed ledger write only costs replay fidelity.
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
return {
|
|
349
|
+
snapshot(): TaskBoardSnapshot | null {
|
|
350
|
+
syncToSession();
|
|
351
|
+
return board;
|
|
352
|
+
},
|
|
353
|
+
apply(mutation: TaskBoardMutation): TaskBoardMutationResult {
|
|
354
|
+
syncToSession();
|
|
355
|
+
const result = applyMutation(board, mutation);
|
|
356
|
+
if ("error" in result) return { ok: false, message: result.error };
|
|
357
|
+
board = result.board;
|
|
358
|
+
persist(result.board);
|
|
359
|
+
return { ok: true, board: result.board, notes: result.notes };
|
|
360
|
+
},
|
|
361
|
+
attachRun(runId: string): void {
|
|
362
|
+
syncToSession();
|
|
363
|
+
// A run can only link to a live board; without one, nothing tracks it.
|
|
364
|
+
if (board === null || runId.length === 0 || board.activeRunIds.includes(runId)) return;
|
|
365
|
+
board = { ...board, activeRunIds: [...board.activeRunIds, runId] };
|
|
366
|
+
persist(board);
|
|
367
|
+
},
|
|
368
|
+
detachRun(runId: string): void {
|
|
369
|
+
syncToSession();
|
|
370
|
+
if (board === null || !board.activeRunIds.includes(runId)) return;
|
|
371
|
+
board = { ...board, activeRunIds: board.activeRunIds.filter((id) => id !== runId) };
|
|
372
|
+
persist(board);
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
}
|