@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,346 @@
|
|
|
1
|
+
import type { ClioKeybinding } from "../domains/config/keybindings.js";
|
|
2
|
+
import { isKeyRelease, matchesKey } from "../engine/tui.js";
|
|
3
|
+
import type { LeaderKeyController } from "./leader-key.js";
|
|
4
|
+
import { isEscapeKey, type OverlayState, overlayOwnsInput } from "./overlay-lifecycle.js";
|
|
5
|
+
|
|
6
|
+
export const APPLICATION_DOUBLE_TAP_MS = 500;
|
|
7
|
+
|
|
8
|
+
const CLOSED_ACTION_ORDER = [
|
|
9
|
+
"clio.notifications.dismiss",
|
|
10
|
+
"clio.tool.expand",
|
|
11
|
+
"clio.tool.expandAll",
|
|
12
|
+
"clio.tool.liveOutput",
|
|
13
|
+
"clio.editor.external",
|
|
14
|
+
"clio.message.followUp",
|
|
15
|
+
"clio.message.dequeue",
|
|
16
|
+
"clio.thinking.expand",
|
|
17
|
+
"clio.thinking.expandAll",
|
|
18
|
+
] as const satisfies ReadonlyArray<ClioKeybinding>;
|
|
19
|
+
|
|
20
|
+
const GLOBAL_ACTION_ORDER = [
|
|
21
|
+
"clio.status.toggle",
|
|
22
|
+
"clio.thinking.cycle",
|
|
23
|
+
"clio.session.tree",
|
|
24
|
+
"clio.dispatchBoard.toggle",
|
|
25
|
+
"clio.dispatch.background",
|
|
26
|
+
"clio.model.select",
|
|
27
|
+
// Backward stays ahead of forward so prefix-overlapping user bindings keep
|
|
28
|
+
// the same more-specific-first behavior as the original input listener.
|
|
29
|
+
"clio.model.cycleBackward",
|
|
30
|
+
"clio.model.cycleForward",
|
|
31
|
+
"clio.exit",
|
|
32
|
+
] as const satisfies ReadonlyArray<ClioKeybinding>;
|
|
33
|
+
|
|
34
|
+
export type CtrlCAction = "cancel-stream" | "close-overlay" | "clear-editor" | "arm-shutdown" | "shutdown";
|
|
35
|
+
|
|
36
|
+
export interface CtrlCActionState {
|
|
37
|
+
overlayState: OverlayState;
|
|
38
|
+
streaming: boolean;
|
|
39
|
+
editorText: string;
|
|
40
|
+
lastCtrlCAt: number;
|
|
41
|
+
now: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function resolveApplicationCtrlCAction(state: CtrlCActionState): CtrlCAction {
|
|
45
|
+
if (state.overlayState !== "closed") return "close-overlay";
|
|
46
|
+
if (state.lastCtrlCAt > 0 && state.now - state.lastCtrlCAt <= APPLICATION_DOUBLE_TAP_MS) return "shutdown";
|
|
47
|
+
if (state.streaming) return "cancel-stream";
|
|
48
|
+
if (state.editorText.length > 0) return "clear-editor";
|
|
49
|
+
return "arm-shutdown";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface ApplicationClock {
|
|
53
|
+
now(): number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ApplicationSignalCoordinator {
|
|
57
|
+
/**
|
|
58
|
+
* Take SIGINT from whatever armed it before this controller existed and
|
|
59
|
+
* return the call that gives it back.
|
|
60
|
+
*/
|
|
61
|
+
takeInterruptOwnership(): () => void;
|
|
62
|
+
on(signal: "SIGINT", listener: () => void): void;
|
|
63
|
+
off(signal: "SIGINT", listener: () => void): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface ApplicationIntervalHandle {
|
|
67
|
+
unref?(): void;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ApplicationIntervalCoordinator {
|
|
71
|
+
setInterval(callback: () => void, delayMs: number): ApplicationIntervalHandle;
|
|
72
|
+
clearInterval(handle: ApplicationIntervalHandle): void;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface ApplicationControllerDeps {
|
|
76
|
+
clock: ApplicationClock;
|
|
77
|
+
signals: ApplicationSignalCoordinator;
|
|
78
|
+
intervals: ApplicationIntervalCoordinator;
|
|
79
|
+
intervalsToClear: ReadonlyArray<ApplicationIntervalHandle>;
|
|
80
|
+
leaderKeys: LeaderKeyController;
|
|
81
|
+
getOverlayState: () => OverlayState;
|
|
82
|
+
routeOverlayKey: (data: string) => boolean;
|
|
83
|
+
matchesAction: (data: string, id: ClioKeybinding) => boolean;
|
|
84
|
+
dispatchAction: (id: ClioKeybinding) => boolean;
|
|
85
|
+
cancelActiveEditorBash: () => boolean;
|
|
86
|
+
isStreaming: () => boolean;
|
|
87
|
+
cancelActiveRun: () => void;
|
|
88
|
+
getEditorText: () => string;
|
|
89
|
+
clearEditor: () => void;
|
|
90
|
+
requestRender: () => void;
|
|
91
|
+
closeOverlay: () => void;
|
|
92
|
+
listNotifications: () => ReadonlyArray<{ id: string }>;
|
|
93
|
+
dismissNotification: (id: string) => void;
|
|
94
|
+
dismissAllNotifications: () => void;
|
|
95
|
+
toggleLastToolExpanded: () => boolean;
|
|
96
|
+
toggleAllToolsExpanded: () => boolean;
|
|
97
|
+
toggleLastThinking: () => boolean;
|
|
98
|
+
toggleAllThinking: () => boolean;
|
|
99
|
+
shutdownDisposers: ReadonlyArray<() => void>;
|
|
100
|
+
stopUi: () => void;
|
|
101
|
+
cancelParkedCalls: (reason: string) => void;
|
|
102
|
+
onShutdown: () => Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Report a teardown step that failed. Deliberately not the UI notice channel:
|
|
105
|
+
* interactive teardown disposes that before the application's own shutdown
|
|
106
|
+
* runs, so a notice raised here would have nowhere to land.
|
|
107
|
+
*/
|
|
108
|
+
reportShutdownFailure: (step: string, error: unknown) => void;
|
|
109
|
+
/**
|
|
110
|
+
* Register a terminal teardown to run on shutdown paths that never reach
|
|
111
|
+
* this controller.
|
|
112
|
+
*
|
|
113
|
+
* `/quit` and Ctrl+C both come through here and stop the terminal on the
|
|
114
|
+
* way out. A signal does not: SIGTERM goes straight to the termination
|
|
115
|
+
* coordinator, which runs its hooks and calls process.exit with the TUI
|
|
116
|
+
* still owning the screen. Measured on a pty, `kill -TERM` left the cursor
|
|
117
|
+
* hidden, the last private-mode sequence on the wire being `?25l`, where
|
|
118
|
+
* `/quit` on the same build ended with `?25h`.
|
|
119
|
+
*/
|
|
120
|
+
registerTerminalTeardown?: (teardown: () => void) => void;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type ApplicationInputResult = { consume: true } | undefined;
|
|
124
|
+
|
|
125
|
+
export interface ApplicationController {
|
|
126
|
+
run: Promise<number>;
|
|
127
|
+
handleInput(data: string): ApplicationInputResult;
|
|
128
|
+
handleCtrlC(): void;
|
|
129
|
+
dismissNotifications(): void;
|
|
130
|
+
toggleToolExpansion(): void;
|
|
131
|
+
toggleThinkingExpansion(): void;
|
|
132
|
+
shutdown(): Promise<void>;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Own the final application boundary: input precedence, double-tap clocks,
|
|
137
|
+
* SIGINT, and the one ordered path that releases process-level resources.
|
|
138
|
+
*/
|
|
139
|
+
export function createApplicationController(deps: ApplicationControllerDeps): ApplicationController {
|
|
140
|
+
let resolveRun: (code: number) => void = () => {};
|
|
141
|
+
const run = new Promise<number>((resolve) => {
|
|
142
|
+
resolveRun = resolve;
|
|
143
|
+
});
|
|
144
|
+
const keepAlive = deps.intervals.setInterval(() => {}, 1 << 30);
|
|
145
|
+
let shuttingDown = false;
|
|
146
|
+
let lastCtrlCAt = 0;
|
|
147
|
+
let lastNotificationDismissAt = 0;
|
|
148
|
+
let lastToolExpandAt = 0;
|
|
149
|
+
let lastThinkingExpandAt = 0;
|
|
150
|
+
|
|
151
|
+
const isDoubleTap = (lastAt: number, now: number): boolean => lastAt > 0 && now - lastAt <= APPLICATION_DOUBLE_TAP_MS;
|
|
152
|
+
|
|
153
|
+
/** Teardown steps that threw, held until the terminal is safe to write past. */
|
|
154
|
+
const failures: Array<{ step: string; error: unknown }> = [];
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Release one process-level resource. A step that throws has left a resource
|
|
158
|
+
* either already released or beyond this boundary's reach; either way the
|
|
159
|
+
* remaining steps still have to run. The terminal is the common case, since
|
|
160
|
+
* it can close before shutdown begins and stopping it twice is harmless.
|
|
161
|
+
* Continuing is not the same as calling it a success, so the failure is kept.
|
|
162
|
+
*/
|
|
163
|
+
const release = (step: string, action: () => void): void => {
|
|
164
|
+
try {
|
|
165
|
+
action();
|
|
166
|
+
} catch (error) {
|
|
167
|
+
failures.push({ step, error });
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Hand the collected failures to the diagnostic. Draining means a second call
|
|
173
|
+
* cannot repeat what the first already reported.
|
|
174
|
+
*/
|
|
175
|
+
const reportFailures = (): void => {
|
|
176
|
+
for (const failure of failures.splice(0)) {
|
|
177
|
+
try {
|
|
178
|
+
deps.reportShutdownFailure(failure.step, failure.error);
|
|
179
|
+
} catch {
|
|
180
|
+
// A diagnostic that cannot report has nowhere left to report to.
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const shutdown = async (): Promise<void> => {
|
|
186
|
+
if (shuttingDown) return;
|
|
187
|
+
shuttingDown = true;
|
|
188
|
+
let failed = false;
|
|
189
|
+
// The signal path calls this without awaiting it, so a failing step must
|
|
190
|
+
// not escape as an unhandled rejection, and `run` has to settle either
|
|
191
|
+
// way or the process hangs with nothing left to resolve it.
|
|
192
|
+
try {
|
|
193
|
+
release("signal handoff", () => deps.signals.off("SIGINT", handleCtrlC));
|
|
194
|
+
// Ownership goes back before teardown runs, so an interrupt during a
|
|
195
|
+
// slow release still reaches a handler that exits the process.
|
|
196
|
+
release("signal handoff", () => restoreInterruptOwner());
|
|
197
|
+
release("keep-alive interval", () => deps.intervals.clearInterval(keepAlive));
|
|
198
|
+
for (const interval of deps.intervalsToClear) {
|
|
199
|
+
release("owned interval", () => deps.intervals.clearInterval(interval));
|
|
200
|
+
}
|
|
201
|
+
for (const dispose of deps.shutdownDisposers) release("shutdown disposer", dispose);
|
|
202
|
+
release("terminal stop", () => deps.stopUi());
|
|
203
|
+
release("parked calls", () => deps.cancelParkedCalls("Clio Coder shutting down"));
|
|
204
|
+
// Reported here rather than as each step fails: the terminal is down by
|
|
205
|
+
// now, so a diagnostic cannot land on top of a TUI still painting. It
|
|
206
|
+
// also has to precede onShutdown, which exits the process.
|
|
207
|
+
failed = failures.length > 0;
|
|
208
|
+
reportFailures();
|
|
209
|
+
await deps.onShutdown();
|
|
210
|
+
} catch (error) {
|
|
211
|
+
failed = true;
|
|
212
|
+
failures.push({ step: "application shutdown", error });
|
|
213
|
+
reportFailures();
|
|
214
|
+
} finally {
|
|
215
|
+
// Nothing reads this code today, which is exactly why it should not
|
|
216
|
+
// claim a clean teardown that did not happen.
|
|
217
|
+
resolveRun(failed ? 1 : 0);
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
const handleCtrlC = (): void => {
|
|
222
|
+
const action = resolveApplicationCtrlCAction({
|
|
223
|
+
overlayState: deps.getOverlayState(),
|
|
224
|
+
streaming: deps.isStreaming(),
|
|
225
|
+
editorText: deps.getEditorText(),
|
|
226
|
+
lastCtrlCAt,
|
|
227
|
+
now: deps.clock.now(),
|
|
228
|
+
});
|
|
229
|
+
if (action === "shutdown") {
|
|
230
|
+
lastCtrlCAt = 0;
|
|
231
|
+
void shutdown();
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// Preserve the original second clock read. Production uses Date.now for
|
|
235
|
+
// both, while tests can expose ordering at millisecond boundaries.
|
|
236
|
+
lastCtrlCAt = deps.clock.now();
|
|
237
|
+
if (action === "cancel-stream") {
|
|
238
|
+
// A press that cancelled a run is not intent to quit, so it must not
|
|
239
|
+
// arm the shutdown clock. Leaving it armed meant the natural gesture
|
|
240
|
+
// of pressing again when the first press looked like it did nothing
|
|
241
|
+
// killed the application mid-turn, with the last frame still reading
|
|
242
|
+
// `writing` and no word about the session being saved. Quitting still
|
|
243
|
+
// works: once the run is cancelled, two presses inside the window do
|
|
244
|
+
// what they have always done.
|
|
245
|
+
lastCtrlCAt = 0;
|
|
246
|
+
deps.cancelActiveRun();
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (action === "close-overlay") {
|
|
250
|
+
lastCtrlCAt = 0;
|
|
251
|
+
deps.closeOverlay();
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (action === "clear-editor") {
|
|
255
|
+
deps.clearEditor();
|
|
256
|
+
deps.requestRender();
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
const dismissNotifications = (): void => {
|
|
261
|
+
const now = deps.clock.now();
|
|
262
|
+
const doubleTap = isDoubleTap(lastNotificationDismissAt, now);
|
|
263
|
+
lastNotificationDismissAt = now;
|
|
264
|
+
if (doubleTap) {
|
|
265
|
+
deps.dismissAllNotifications();
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const first = deps.listNotifications()[0];
|
|
269
|
+
if (first) deps.dismissNotification(first.id);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
const toggleToolExpansion = (): void => {
|
|
273
|
+
const now = deps.clock.now();
|
|
274
|
+
const doubleTap = isDoubleTap(lastToolExpandAt, now);
|
|
275
|
+
lastToolExpandAt = now;
|
|
276
|
+
const changed = doubleTap ? deps.toggleAllToolsExpanded() : deps.toggleLastToolExpanded();
|
|
277
|
+
if (changed) deps.requestRender();
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const toggleThinkingExpansion = (): void => {
|
|
281
|
+
const now = deps.clock.now();
|
|
282
|
+
const doubleTap = isDoubleTap(lastThinkingExpandAt, now);
|
|
283
|
+
lastThinkingExpandAt = now;
|
|
284
|
+
const changed = doubleTap ? deps.toggleAllThinking() : deps.toggleLastThinking();
|
|
285
|
+
if (changed) deps.requestRender();
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
const handleInput = (data: string): ApplicationInputResult => {
|
|
289
|
+
const initialOverlayState = deps.getOverlayState();
|
|
290
|
+
if (overlayOwnsInput(initialOverlayState) && deps.leaderKeys.isPending()) deps.leaderKeys.reset();
|
|
291
|
+
if (!overlayOwnsInput(initialOverlayState) && deps.leaderKeys.isPending() && deps.leaderKeys.route(data)) {
|
|
292
|
+
return { consume: true };
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (matchesKey(data, "ctrl+c") && !isKeyRelease(data)) {
|
|
296
|
+
handleCtrlC();
|
|
297
|
+
return { consume: true };
|
|
298
|
+
}
|
|
299
|
+
if (deps.routeOverlayKey(data)) return { consume: true };
|
|
300
|
+
if (overlayOwnsInput(deps.getOverlayState())) return undefined;
|
|
301
|
+
if (deps.getOverlayState() === "closed" && deps.leaderKeys.route(data)) return { consume: true };
|
|
302
|
+
if (isEscapeKey(data) && deps.cancelActiveEditorBash()) return { consume: true };
|
|
303
|
+
if (isEscapeKey(data) && deps.isStreaming()) {
|
|
304
|
+
deps.cancelActiveRun();
|
|
305
|
+
return { consume: true };
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (deps.getOverlayState() === "closed" && !isKeyRelease(data)) {
|
|
309
|
+
for (const id of CLOSED_ACTION_ORDER) {
|
|
310
|
+
if (!deps.matchesAction(data, id)) continue;
|
|
311
|
+
deps.dispatchAction(id);
|
|
312
|
+
return { consume: true };
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
for (const id of GLOBAL_ACTION_ORDER) {
|
|
316
|
+
if (!deps.matchesAction(data, id)) continue;
|
|
317
|
+
return deps.dispatchAction(id) ? { consume: true } : undefined;
|
|
318
|
+
}
|
|
319
|
+
return undefined;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
// One owner holds SIGINT at a time. Boot arms process termination first and
|
|
323
|
+
// Node runs listeners in registration order, so this controller only sees the
|
|
324
|
+
// first press if the previous owner hands it over. Everything else on the
|
|
325
|
+
// signal stays put: clearing it wholesale would disarm handlers this process
|
|
326
|
+
// never installed, including an embedder's.
|
|
327
|
+
const restoreInterruptOwner = deps.signals.takeInterruptOwnership();
|
|
328
|
+
deps.signals.on("SIGINT", handleCtrlC);
|
|
329
|
+
// Every exit gives the terminal back, including the ones that never reach
|
|
330
|
+
// this controller. Stopping an already-stopped terminal is a no-op, so the
|
|
331
|
+
// ordinary path running both is harmless.
|
|
332
|
+
deps.registerTerminalTeardown?.(() => {
|
|
333
|
+
release("terminal stop", () => deps.stopUi());
|
|
334
|
+
reportFailures();
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
return {
|
|
338
|
+
run,
|
|
339
|
+
handleInput,
|
|
340
|
+
handleCtrlC,
|
|
341
|
+
dismissNotifications,
|
|
342
|
+
toggleToolExpansion,
|
|
343
|
+
toggleThinkingExpansion,
|
|
344
|
+
shutdown,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload→notice formatters for bus channels the interactive layer renders
|
|
3
|
+
* as operator notices. Validation lives here so malformed payloads are
|
|
4
|
+
* dropped in one place and the index.ts subscribers stay wiring-only.
|
|
5
|
+
* Returning null means "ignore the event".
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
BudgetAlertPayload,
|
|
10
|
+
MiddlewareHookFailedPayload,
|
|
11
|
+
PermissionRequestedPayload,
|
|
12
|
+
SafetyBlockedPayload,
|
|
13
|
+
} from "../core/bus-events.js";
|
|
14
|
+
import type { SafetyDecision } from "../domains/safety/contract.js";
|
|
15
|
+
import { askAxis } from "./permission-overlay.js";
|
|
16
|
+
|
|
17
|
+
export interface BusNotice {
|
|
18
|
+
level: "warn" | "error";
|
|
19
|
+
text: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface MiddlewareHookFailedNoticeOptions {
|
|
23
|
+
noteBudgetWarningSuppression?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isBudgetAlertPayload(value: unknown): value is BudgetAlertPayload {
|
|
27
|
+
if (!value || typeof value !== "object") return false;
|
|
28
|
+
const p = value as Record<string, unknown>;
|
|
29
|
+
if (p.level !== "at" && p.level !== "over") return false;
|
|
30
|
+
if (typeof p.currentUsd !== "number" || !Number.isFinite(p.currentUsd)) return false;
|
|
31
|
+
if (typeof p.ceilingUsd !== "number" || !Number.isFinite(p.ceilingUsd)) return false;
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function budgetAlertNotice(payload: unknown): BusNotice | null {
|
|
36
|
+
if (!isBudgetAlertPayload(payload)) return null;
|
|
37
|
+
const spend = `$${payload.currentUsd.toFixed(2)} of $${payload.ceilingUsd.toFixed(2)} ceiling`;
|
|
38
|
+
if (payload.level === "over") {
|
|
39
|
+
return {
|
|
40
|
+
level: "error",
|
|
41
|
+
text: `[budget] session spend ${spend} exceeded. New dispatches are denied at admission; raise budget.sessionCeilingUsd or wind down.`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return { level: "warn", text: `[budget] session spend ${spend} reached. New dispatches are denied at admission.` };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Restart-required settings changed under a running session. The level is
|
|
49
|
+
* always a warning; only the text varies, so this returns the text or null.
|
|
50
|
+
*/
|
|
51
|
+
export function restartRequiredNotice(payload: unknown): string | null {
|
|
52
|
+
const diff = (payload as { diff?: { restartRequired?: unknown } } | null | undefined)?.diff;
|
|
53
|
+
const raw = diff?.restartRequired;
|
|
54
|
+
if (!Array.isArray(raw)) return null;
|
|
55
|
+
const paths = raw.filter((p): p is string => typeof p === "string" && p.length > 0);
|
|
56
|
+
if (paths.length === 0) return null;
|
|
57
|
+
const label = paths.length === 1 ? "setting" : "settings";
|
|
58
|
+
return `[config] ${label} ${paths.join(", ")} changed; restart Clio to apply.`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function isSafetyBlockedPayload(value: unknown): value is SafetyBlockedPayload {
|
|
62
|
+
if (!value || typeof value !== "object") return false;
|
|
63
|
+
const p = value as Record<string, unknown>;
|
|
64
|
+
if (typeof p.tool !== "string" || p.tool.length === 0) return false;
|
|
65
|
+
if (typeof p.actionClass !== "string" || p.actionClass.length === 0) return false;
|
|
66
|
+
if (p.ruleId !== undefined && typeof p.ruleId !== "string") return false;
|
|
67
|
+
if (typeof p.policySource !== "string" || p.policySource.length === 0) return false;
|
|
68
|
+
if (typeof p.reasonCode !== "string" || p.reasonCode.length === 0) return false;
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isMiddlewareHookFailedPayload(value: unknown): value is MiddlewareHookFailedPayload {
|
|
73
|
+
if (!value || typeof value !== "object") return false;
|
|
74
|
+
const p = value as Record<string, unknown>;
|
|
75
|
+
if (p.kind !== "hook_failed" && p.kind !== "budget_exceeded") return false;
|
|
76
|
+
if (typeof p.registrationId !== "string" || p.registrationId.length === 0) return false;
|
|
77
|
+
if (typeof p.hook !== "string" || p.hook.length === 0) return false;
|
|
78
|
+
if (p.message !== undefined && typeof p.message !== "string") return false;
|
|
79
|
+
if (p.elapsedMs !== undefined && typeof p.elapsedMs !== "number") return false;
|
|
80
|
+
if (p.budgetMs !== undefined && typeof p.budgetMs !== "number") return false;
|
|
81
|
+
if (p.steadyStateWarn !== undefined && typeof p.steadyStateWarn !== "boolean") return false;
|
|
82
|
+
if (p.p95Ms !== undefined && typeof p.p95Ms !== "number") return false;
|
|
83
|
+
if (p.overCount !== undefined && typeof p.overCount !== "number") return false;
|
|
84
|
+
if (p.windowSamples !== undefined && typeof p.windowSamples !== "number") return false;
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function isWorkerEscalationPayload(value: unknown): value is PermissionRequestedPayload {
|
|
89
|
+
if (!value || typeof value !== "object") return false;
|
|
90
|
+
const p = value as Record<string, unknown>;
|
|
91
|
+
if (typeof p.requestId !== "string" || p.requestId.length === 0) return false;
|
|
92
|
+
if (typeof p.tool !== "string" || p.tool.length === 0) return false;
|
|
93
|
+
if (typeof p.actionClass !== "string" || p.actionClass.length === 0) return false;
|
|
94
|
+
if (p.origin !== undefined) {
|
|
95
|
+
if (typeof p.origin !== "string" || !p.origin.startsWith("worker:")) return false;
|
|
96
|
+
} else if (typeof p.requestedBy !== "string" || p.requestedBy.length === 0) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (p.agentId !== undefined && typeof p.agentId !== "string") return false;
|
|
100
|
+
if (p.axis !== undefined && typeof p.axis !== "string") return false;
|
|
101
|
+
if (p.ruleId !== undefined && typeof p.ruleId !== "string") return false;
|
|
102
|
+
if (p.reasonCode !== undefined && typeof p.reasonCode !== "string") return false;
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function workerRunId(payload: PermissionRequestedPayload): string {
|
|
107
|
+
if (payload.origin?.startsWith("worker:")) return payload.origin.slice("worker:".length);
|
|
108
|
+
return payload.requestedBy ?? "worker";
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function workerEscalationAxis(
|
|
112
|
+
payload: PermissionRequestedPayload,
|
|
113
|
+
): { kind: "net"; ruleId: string } | { kind: "autonomy"; level: string } | null {
|
|
114
|
+
if (payload.axis?.startsWith("net:")) {
|
|
115
|
+
const ruleId = payload.axis.slice("net:".length);
|
|
116
|
+
return ruleId.length > 0 ? { kind: "net", ruleId } : null;
|
|
117
|
+
}
|
|
118
|
+
if (payload.axis?.startsWith("autonomy:")) {
|
|
119
|
+
const level = payload.axis.slice("autonomy:".length);
|
|
120
|
+
return level.length > 0 ? { kind: "autonomy", level } : null;
|
|
121
|
+
}
|
|
122
|
+
if (payload.ruleId !== undefined && payload.ruleId.length > 0) {
|
|
123
|
+
return { kind: "net", ruleId: payload.ruleId };
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function middlewareBudgetWarningKey(payload: unknown): string | null {
|
|
129
|
+
if (!isMiddlewareHookFailedPayload(payload)) return null;
|
|
130
|
+
if (payload.kind !== "budget_exceeded") return null;
|
|
131
|
+
return `${payload.registrationId}\u0000${payload.hook}`;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A middleware hook registration threw (its effects were discarded) or
|
|
136
|
+
* overran the soft budget (its effects still applied). The turn proceeded
|
|
137
|
+
* either way; this warn notice is the operator's only interactive signal
|
|
138
|
+
* that a guard or assessor is misbehaving.
|
|
139
|
+
*/
|
|
140
|
+
export function middlewareHookFailedNotice(
|
|
141
|
+
payload: unknown,
|
|
142
|
+
options: MiddlewareHookFailedNoticeOptions = {},
|
|
143
|
+
): BusNotice | null {
|
|
144
|
+
if (!isMiddlewareHookFailedPayload(payload)) return null;
|
|
145
|
+
if (payload.kind === "hook_failed") {
|
|
146
|
+
const detail = payload.message !== undefined && payload.message.length > 0 ? `: ${payload.message}` : "";
|
|
147
|
+
return {
|
|
148
|
+
level: "warn",
|
|
149
|
+
text: `[middleware] hook '${payload.registrationId}' failed on ${payload.hook}${detail}. Its effects were skipped; the turn continued.`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const elapsed = payload.elapsedMs !== undefined ? `${payload.elapsedMs.toFixed(1)}ms` : "unknown";
|
|
153
|
+
const budget = payload.budgetMs !== undefined ? `${payload.budgetMs}ms` : "budget";
|
|
154
|
+
const trend =
|
|
155
|
+
payload.overCount !== undefined && payload.windowSamples !== undefined && payload.windowSamples > 0
|
|
156
|
+
? ` slow on ${payload.overCount} of the last ${payload.windowSamples} ${payload.hook} calls${
|
|
157
|
+
payload.p95Ms !== undefined ? `, p95 ${payload.p95Ms.toFixed(1)}ms` : ""
|
|
158
|
+
};`
|
|
159
|
+
: ";";
|
|
160
|
+
const suffix = options.noteBudgetWarningSuppression ? " further budget warnings for this hook suppressed" : "";
|
|
161
|
+
return {
|
|
162
|
+
level: "warn",
|
|
163
|
+
text:
|
|
164
|
+
`[middleware] hook '${payload.registrationId}' consistently exceeds its soft budget on ${payload.hook} (${elapsed} > ${budget})${trend}${suffix}`.trimEnd(),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Interactive-notice gate. Only steady-state slowness surfaces to the operator.
|
|
170
|
+
* Notice gating relies on `steadyStateWarn`; a false value suppresses a lone
|
|
171
|
+
* post-warmup spike that still rides the bus for telemetry. The warning set
|
|
172
|
+
* ensures each registration and hook pair is shown only once.
|
|
173
|
+
*/
|
|
174
|
+
export function middlewareHookFailedSessionNotice(payload: unknown, seenBudgetWarnings: Set<string>): BusNotice | null {
|
|
175
|
+
if (
|
|
176
|
+
isMiddlewareHookFailedPayload(payload) &&
|
|
177
|
+
payload.kind === "budget_exceeded" &&
|
|
178
|
+
payload.steadyStateWarn === false
|
|
179
|
+
) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
const key = middlewareBudgetWarningKey(payload);
|
|
183
|
+
if (key !== null) {
|
|
184
|
+
if (seenBudgetWarnings.has(key)) return null;
|
|
185
|
+
seenBudgetWarnings.add(key);
|
|
186
|
+
}
|
|
187
|
+
return middlewareHookFailedNotice(payload, { noteBudgetWarningSuppression: key !== null });
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* A tool call parked for one-shot approval (sd-01 §3.3). The text names the
|
|
192
|
+
* axis that produced the ask: a safety-net rail asks at every level, while an
|
|
193
|
+
* autonomy ask exists only because of the current level and can be widened in
|
|
194
|
+
* .clio-coder/safety.yaml when it is an execute action.
|
|
195
|
+
*/
|
|
196
|
+
export function approvalParkedNotice(tool: string, decision: SafetyDecision, autonomy: string): BusNotice {
|
|
197
|
+
const actionClass = decision.classification.actionClass;
|
|
198
|
+
const axis = askAxis(decision);
|
|
199
|
+
if (axis.kind === "net") {
|
|
200
|
+
return {
|
|
201
|
+
level: "warn",
|
|
202
|
+
text: `[approval] ${tool} parked (${actionClass}): safety-net rail ${axis.ruleId} asks for confirmation. Approve once, or Esc to deny this call.`,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const widen =
|
|
206
|
+
actionClass === "execute"
|
|
207
|
+
? " Approve once, or add it to .clio-coder/safety.yaml commands."
|
|
208
|
+
: " Approve once, or Esc to deny this call.";
|
|
209
|
+
return {
|
|
210
|
+
level: "warn",
|
|
211
|
+
text: `[approval] ${tool} parked (${actionClass}): asks at autonomy ${autonomy}.${widen}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function workerEscalationNotice(payload: unknown): BusNotice | null {
|
|
216
|
+
if (!isWorkerEscalationPayload(payload)) return null;
|
|
217
|
+
const axis = workerEscalationAxis(payload);
|
|
218
|
+
if (axis === null) return null;
|
|
219
|
+
const agentId = payload.agentId ?? "worker";
|
|
220
|
+
const runId = workerRunId(payload);
|
|
221
|
+
if (axis.kind === "net") {
|
|
222
|
+
return {
|
|
223
|
+
level: "warn",
|
|
224
|
+
text: `[approval] worker ${agentId} (run ${runId}) asks to run ${payload.tool} (${payload.actionClass}): safety-net rail ${axis.ruleId} asks for confirmation. Approve once, or Esc to deny this call.`,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
level: "warn",
|
|
229
|
+
text: `[approval] worker ${agentId} (run ${runId}) asks to run ${payload.tool} (${payload.actionClass}): asks at autonomy ${axis.level}. Approve once, or Esc to deny this call.`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The autonomy mapping auto-denied a call (deny dispositions; today only the
|
|
235
|
+
* read-only level). The transcript shows the rejection the model received;
|
|
236
|
+
* this notice names the level so the operator knows the dial, not a safety
|
|
237
|
+
* rail, refused the action.
|
|
238
|
+
*/
|
|
239
|
+
export function autonomyDeniedNotice(decision: SafetyDecision, level: string): BusNotice {
|
|
240
|
+
const actionClass = decision.classification.actionClass;
|
|
241
|
+
return {
|
|
242
|
+
level: "warn",
|
|
243
|
+
text: `[autonomy] denied ${actionClass} (${level}): Clio proposes changes at this level.`,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The transcript already shows the rejection text the model received
|
|
249
|
+
* (rejection.short names the tool and action class), so this notice aims at
|
|
250
|
+
* the policy dimension the transcript omits: which rule fired and from which
|
|
251
|
+
* policy source. The closing sentence states that these gates are
|
|
252
|
+
* level-independent, so the notice never reads as a contradiction of the
|
|
253
|
+
* autonomy level shown in the dashboards (sd-01).
|
|
254
|
+
*/
|
|
255
|
+
export function safetyBlockedNotice(payload: unknown): BusNotice | null {
|
|
256
|
+
if (!isSafetyBlockedPayload(payload)) return null;
|
|
257
|
+
const rule =
|
|
258
|
+
payload.ruleId !== undefined && payload.ruleId !== payload.reasonCode
|
|
259
|
+
? `rule ${payload.ruleId} (${payload.reasonCode})`
|
|
260
|
+
: payload.reasonCode;
|
|
261
|
+
return {
|
|
262
|
+
level: "warn",
|
|
263
|
+
text: `[safety-net] blocked ${payload.tool} (${payload.actionClass}): ${rule} via ${payload.policySource}. This gate applies at every autonomy level.`,
|
|
264
|
+
};
|
|
265
|
+
}
|