@iowarp/clio-coder 0.4.1 → 0.4.2
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 +92 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +404 -472
- package/SECURITY.md +2 -1
- package/dist/{acp-ZILU3AUO.js → acp-TMDQZDIG.js} +7 -7
- package/dist/{agents-HYWGBGQR.js → agents-5N5NG3XG.js} +28 -28
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-N3QT7CBO.js → auth-Z5CCBXKQ.js} +8 -9
- package/dist/{builtins-UJLMOVOV.js → builtins-K6TNDT24.js} +4 -4
- package/dist/{chunk-GVQJ5CCZ.js → chunk-2HFQNRV3.js} +7 -7
- package/dist/{chunk-QMXC4JB7.js → chunk-2NHR3NAY.js} +163 -1401
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-Y45G3AXC.js → chunk-2Z2IKEXI.js} +6 -10
- package/dist/{chunk-EIMVLWB3.js → chunk-34BHNEE3.js} +7 -3
- package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/{chunk-AP73CFDC.js → chunk-3KIPBMUA.js} +2 -2
- package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
- package/dist/{chunk-VEGN6WIQ.js → chunk-462T4EGZ.js} +2 -2
- package/dist/{chunk-AFKWHWXF.js → chunk-4JDLP6ZS.js} +33 -16
- package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
- package/dist/{chunk-AKB4GYDL.js → chunk-54ODD65L.js} +5 -5
- package/dist/{chunk-BBTJOK6Y.js → chunk-5KW52TEP.js} +3 -3
- package/dist/{chunk-6CCS4G3W.js → chunk-5PFYMY2V.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-7OBGU7UB.js → chunk-7BHIY2MW.js} +7 -13
- package/dist/{chunk-3QSOM6PA.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-6NJQITNH.js → chunk-B74PXLU7.js} +6 -3
- package/dist/{chunk-R23Z6K6I.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-R32CLGZ6.js → chunk-BO7Y52RY.js} +81 -20
- package/dist/{chunk-UEDMSP56.js → chunk-BYMNWQ7O.js} +123 -148
- package/dist/{chunk-ZJLUDYFY.js → chunk-CRFOIAX3.js} +4 -4
- package/dist/{chunk-2NM363SV.js → chunk-CYZW7JHJ.js} +7 -7
- package/dist/{chunk-6HMJX2VU.js → chunk-DYHAXKHD.js} +38 -10
- package/dist/{chunk-THYWACCR.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-FYUN5KZ3.js → chunk-DZEK6CJN.js} +17 -17
- package/dist/{chunk-3I5NY75V.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-VKFQTNDV.js → chunk-F2I26BDK.js} +4 -4
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-IXJT6DCX.js → chunk-FVDGR2ZL.js} +3 -3
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-7EPLI7VL.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/{chunk-E67WX76H.js → chunk-HKMD33FO.js} +29 -80
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-UAPGZHYC.js → chunk-I64IFBLB.js} +9 -2
- package/dist/{chunk-XKA2ICR3.js → chunk-I66ZTYNP.js} +440 -175
- package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-PVAMAVBB.js → chunk-IDNA72AH.js} +102 -2
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-2VG7KLYV.js → chunk-IKSLQ4XV.js} +5460 -3241
- package/dist/{chunk-QKIFBZKT.js → chunk-IMXMHHMQ.js} +166 -25
- package/dist/{chunk-74YWRRU5.js → chunk-JBCS7CRR.js} +2 -2
- package/dist/{chunk-BDPT6GTK.js → chunk-JWJGP5DQ.js} +2 -2
- package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-ABLSQ6JX.js → chunk-LJID3DYZ.js} +7 -1
- package/dist/{chunk-VKRH2TCS.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-6I5ILFOF.js → chunk-M2WXEHER.js} +2 -2
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-N5UK64DP.js → chunk-MCMZMDAC.js} +2 -2
- package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
- package/dist/{chunk-HUAS7ITX.js → chunk-O3YUNJZ2.js} +13 -21
- package/dist/{chunk-MA3H6DM5.js → chunk-P75RZCJW.js} +25 -3
- package/dist/{chunk-IG7BCQBA.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-6DWBAZ5U.js → chunk-Q4XWMHX6.js} +4 -6
- package/dist/{chunk-OJTRZGR3.js → chunk-QQLGQY2A.js} +8 -8
- package/dist/{chunk-J4HBWF6Y.js → chunk-RLYRBIYQ.js} +115 -20
- package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
- package/dist/{chunk-C537JADH.js → chunk-SSEYRH53.js} +6 -7
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-MOPSG2X7.js → chunk-TPEQIQIE.js} +6 -6
- package/dist/{chunk-JA5QWE4Z.js → chunk-UBRFI4HS.js} +1879 -1650
- package/dist/{chunk-BTGG6BG2.js → chunk-UH347SHR.js} +154 -15
- package/dist/{chunk-5YHDIDBP.js → chunk-UH632ZYL.js} +2 -2
- package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
- package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
- package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
- package/dist/{chunk-UXN6JT4W.js → chunk-W4YEMFBX.js} +2 -2
- package/dist/{chunk-TD3PGPQA.js → chunk-W6NIE6OW.js} +2 -2
- package/dist/{chunk-TVH4ONAM.js → chunk-X7IARSHT.js} +3 -3
- package/dist/{chunk-PJJ6MY27.js → chunk-XE3PCIXH.js} +3 -3
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-SCYB3HA4.js → chunk-XOXV5GKE.js} +51 -16
- package/dist/{chunk-QTFGO774.js → chunk-XQRY4DTA.js} +24 -11
- package/dist/{chunk-BJGUKIG4.js → chunk-YJISEZKC.js} +2 -2
- package/dist/{chunk-GPPB3JBE.js → chunk-ZGNYYXQ6.js} +2 -2
- package/dist/{chunk-SINK3QR6.js → chunk-ZNT2M6TG.js} +7 -7
- package/dist/{chunk-7RY5VZPH.js → chunk-ZW4HH5JJ.js} +6 -6
- package/dist/cli/index.js +33 -32
- package/dist/{clio-IT3G3VQH.js → clio-7VB377CC.js} +7 -7
- package/dist/{code-nav-RK6S7F6E.js → code-nav-YVLCYA7V.js} +85 -17
- package/dist/{config-3QZRWZJF.js → config-4HVOS65E.js} +88 -43
- package/dist/{configure-FL7Y3KJF.js → configure-PIWO7B24.js} +10 -10
- package/dist/{context-5HE7ODYK.js → context-IYEHL3WQ.js} +33 -31
- package/dist/{context-XNHL75JV.js → context-KQYIWPWT.js} +47 -34
- package/dist/{context-KYQFRVDC.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-N545L53A.js → context-clear-G4OGZJDS.js} +33 -31
- package/dist/{context-working-set-QHKXSV2F.js → context-working-set-BWLF6LJP.js} +7 -7
- package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-2QQAITS3.js} +38 -38
- package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
- package/dist/{doctor-ZGPEGHIP.js → doctor-LHBD36VU.js} +23 -22
- package/dist/{eval-GXLL44RD.js → eval-C45FYRJ6.js} +21 -20
- package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-6DEJPLBF.js} +2 -2
- package/dist/{evidence-HWLBRH3Q.js → evidence-6SHONYAF.js} +30 -28
- package/dist/{evolve-FTZBMNVW.js → evolve-KRKMV72X.js} +30 -28
- package/dist/{extensions-VHRBEID7.js → extensions-KPZ2UHBB.js} +5 -3
- package/dist/{fleet-CKZHJWZJ.js → fleet-IVTCKDHT.js} +62 -61
- package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-EDWL3IT7.js} +5 -5
- package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-YP3YEFGK.js} +4 -4
- package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-ZFWKHY2M.js} +16 -14
- package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-FVUNCBML.js} +31 -29
- package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-UN5XED4R.js} +2 -2
- package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-XOWC4HSX.js} +17 -15
- package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-UN3SODEL.js} +30 -28
- package/dist/{fleet-view-WAMJYNDT.js → fleet-view-TWHJKCN6.js} +31 -29
- package/dist/{init-5XQRBOFV.js → init-T2QORQ3Y.js} +50 -49
- package/dist/{interop-34TVO25M.js → interop-IN5I2A66.js} +5 -5
- package/dist/{library-3QY6KF57.js → library-LSCATDLZ.js} +15 -13
- package/dist/{memory-L4UTIIIW.js → memory-HYOKAGGJ.js} +31 -29
- package/dist/{models-ZVX3QOWE.js → models-2GPMFYCM.js} +22 -21
- package/dist/{monitor-CEKVSYTS.js → monitor-E4ASVUJH.js} +34 -32
- package/dist/{orchestrator-77BAP6BC.js → orchestrator-DDMPR3PY.js} +984 -583
- package/dist/{panes-7STHOAUJ.js → panes-E3RUXOW5.js} +4 -4
- package/dist/{panes-SHAUIRXY.js → panes-IXKLOKA2.js} +23 -8
- package/dist/{reset-EOLM7GVE.js → reset-OAQP3W4O.js} +4 -4
- package/dist/{resources-74GKTLSF.js → resources-OTRSN34L.js} +15 -13
- package/dist/{run-HBAUJNNZ.js → run-5DEYH5QK.js} +60 -59
- package/dist/{share-G3APVLVP.js → share-IHWTLO3M.js} +19 -15
- package/dist/{skills-35HHUKCR.js → skills-IYMXMKW4.js} +17 -15
- package/dist/{skills-eval-QN4HSHDC.js → skills-eval-DROHSJAR.js} +36 -36
- package/dist/{skills-inventory-J357J34F.js → skills-inventory-D7X4L4ZX.js} +15 -13
- package/dist/{slash-commands-JZZCQA32.js → slash-commands-QBM7UZ3B.js} +21 -18
- package/dist/{steer-XAVHJM22.js → steer-Z5DO23FJ.js} +2 -2
- package/dist/{targets-DSM6CY3M.js → targets-P2FUC4IL.js} +25 -28
- package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-YREJ3JX2.js} +5 -5
- package/dist/{tools-MKNWVPBH.js → tools-5B7RO6MV.js} +4 -4
- package/dist/{trace-ECQ7TIYZ.js → trace-YMGMUM6A.js} +55 -7
- package/dist/{upgrade-H7TOM7YL.js → upgrade-PXK3S2YM.js} +11 -9
- package/dist/{usage-X52N3IDJ.js → usage-ME5MPXGX.js} +36 -34
- package/dist/{verifiers-EJTVVSMA.js → verifiers-BVZ7IWOO.js} +5 -5
- package/dist/{verify-YJL6XET2.js → verify-5K7ZKQFC.js} +4 -4
- package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
- package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-F5W5QTYY.js} +48 -47
- package/dist/{with-panes-OBOBFIIR.js → with-panes-BYOJCLAM.js} +51 -255
- package/dist/worker/entry.js +45 -30
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +50 -34
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +65 -60
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +227 -289
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -28
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +44 -13
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
- package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +2 -2
- package/package.json +9 -7
- package/skills/README.md +46 -37
- package/skills/coding/ast-grep/SKILL.md +2 -2
- package/skills/coding/coding-standards/SKILL.md +2 -2
- package/skills/coding/prototype/SKILL.md +2 -2
- package/skills/coding/tdd/SKILL.md +2 -2
- package/skills/context/context-handoff/SKILL.md +2 -2
- package/skills/context/context-prime/SKILL.md +2 -2
- package/skills/git/file-ticket/SKILL.md +2 -2
- package/skills/git/fix-issue/SKILL.md +3 -3
- package/skills/git/resolve-merge-conflicts/SKILL.md +2 -2
- package/skills/git/ship/SKILL.md +2 -2
- package/skills/git/worktree-create/SKILL.md +2 -2
- package/skills/git/worktree-merge/SKILL.md +2 -2
- package/skills/meta/clio-coder-dev/SKILL.md +9 -5
- package/skills/meta/clio-coder-dev/evals.md +3 -2
- package/skills/meta/clio-coder-test/SKILL.md +102 -95
- package/skills/meta/clio-coder-test/evals.md +9 -4
- package/skills/meta/clio-coder-test/references/harness.md +100 -124
- package/skills/meta/clio-coder-test/references/test-map.md +77 -50
- package/skills/meta/credentials/SKILL.md +2 -2
- package/skills/meta/find-skills/SKILL.md +2 -2
- package/skills/meta/herdr/SKILL.md +2 -2
- package/skills/meta/skill-craft/SKILL.md +22 -16
- package/skills/planning/architecture/SKILL.md +2 -2
- package/skills/planning/backlog/SKILL.md +2 -2
- package/skills/planning/prd/SKILL.md +2 -2
- package/skills/planning/product-intent/SKILL.md +2 -2
- package/skills/planning/tech-spec/SKILL.md +2 -2
- package/skills/registry.yaml +62 -62
- package/skills/research/arxiv-literature/SKILL.md +2 -2
- package/skills/research/experiment-protocol/SKILL.md +2 -2
- package/skills/research/scientific-debugging/SKILL.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +2 -2
- package/skills/skill-marketplace.json +62 -62
- package/skills/workflow/cut-it/SKILL.md +2 -2
- package/skills/workflow/design-council/SKILL.md +2 -2
- package/skills/workflow/grill-me/SKILL.md +2 -2
- package/skills/workflow/workflow-distiller/SKILL.md +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/bootstrap-generate.ts +1 -1
- package/src/cli/config-inspect.ts +65 -12
- package/src/cli/configure.ts +0 -4
- package/src/cli/docs.ts +22 -14
- package/src/cli/doctor-naming.ts +5 -5
- package/src/cli/doctor-toolchain.ts +3 -3
- package/src/cli/eval.ts +1 -2
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet.ts +1 -1
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/panes.ts +19 -5
- package/src/cli/run.ts +2 -2
- package/src/cli/share.ts +5 -1
- package/src/cli/skills-eval.ts +3 -3
- package/src/cli/targets.ts +2 -6
- package/src/cli/trace.ts +55 -4
- package/src/cli/wiki-generate.ts +1 -1
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +131 -86
- package/src/core/bus-events.ts +51 -6
- package/src/core/config.ts +5 -1
- package/src/core/defaults.ts +7 -4
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/guardrails.ts +10 -49
- package/src/core/prompt-hint.ts +9 -0
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- 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 +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +12 -14
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +23 -1
- package/src/domains/config/keybindings.ts +8 -0
- package/src/domains/context/extension.ts +0 -3
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/extension.ts +105 -22
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/path-scope.ts +235 -24
- package/src/domains/dispatch/run-event-journal.ts +4 -15
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/transport.ts +45 -21
- package/src/domains/dispatch/types.ts +55 -3
- package/src/domains/eval/artifacts/store.ts +5 -0
- package/src/domains/eval/store.ts +8 -1
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/index.ts +2 -0
- package/src/domains/lifecycle/naming-resources.ts +19 -4
- package/src/domains/lifecycle/naming-yazi.ts +10 -5
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +28 -4
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +28 -0
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +38 -0
- package/src/domains/mux/detect.ts +6 -13
- package/src/domains/mux/index.ts +1 -1
- package/src/domains/mux/operations.ts +44 -5
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/session.ts +53 -4
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +11 -3
- package/src/domains/observability/projection.ts +14 -90
- package/src/domains/observability/trace-store.ts +43 -7
- package/src/domains/prompts/compiler.ts +73 -53
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +97 -9
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +10 -24
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +85 -21
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +669 -104
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/local-model-quirks.ts +85 -37
- package/src/domains/resources/skills/loader.ts +16 -19
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +164 -7
- package/src/engine/acp/server.ts +62 -9
- package/src/engine/apis/llamacpp-residency.ts +3 -4
- package/src/engine/apis/lmstudio.ts +3 -3
- package/src/engine/apis/ollama-native.ts +6 -6
- package/src/engine/apis/openai-completions.ts +28 -25
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +8 -27
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -12
- package/src/engine/worker-runtime.ts +40 -11
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +59 -35
- package/src/interactive/application-controller.ts +2 -1
- package/src/interactive/bus-notices.ts +8 -1
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +10 -1
- package/src/interactive/chat-panel.ts +36 -13
- package/src/interactive/chat-renderer.ts +71 -7
- package/src/interactive/dispatch-board.ts +6 -11
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/interactive-application.ts +39 -4
- package/src/interactive/interactive-input-runtime.ts +4 -0
- package/src/interactive/interactive-presentation.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +2 -0
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/settings.ts +27 -16
- package/src/interactive/panes-runtime.ts +111 -35
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/slash-commands.ts +129 -14
- package/src/interactive/stream-pacing-policy.ts +0 -23
- package/src/interactive/turn-context.ts +30 -15
- package/src/interactive/yazi-bridge.ts +60 -6
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +29 -12
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-arguments.ts +5 -1
- package/src/tools/dispatch-plan.ts +48 -4
- package/src/tools/dispatch-run-events.ts +1 -1
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/observation.ts +4 -5
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/dist/chunk-5QIAJV2D.js +0 -48
- package/dist/chunk-JZWT5J3Y.js +0 -814
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-WR6U3OVP.js +0 -45
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/time-conventions.md +0 -101
|
@@ -126,19 +126,12 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
|
|
|
126
126
|
return { detection: none("panes are turned off"), client: null };
|
|
127
127
|
}
|
|
128
128
|
if (enabled === "embedded") {
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
detection: none(
|
|
136
|
-
"embedded mode is not implemented yet; it ships in phase 5, so this session has no panes at all. Set panes.enabled=auto for guest mode inside a herdr session.",
|
|
137
|
-
[],
|
|
138
|
-
true,
|
|
139
|
-
),
|
|
140
|
-
client: null,
|
|
141
|
-
};
|
|
129
|
+
// Embedded mode (Clio owning the pane host) is not implemented yet. An
|
|
130
|
+
// operator who picked it wanted panes, so the rung degrades to guest
|
|
131
|
+
// detection instead of refusing everything; the notice below says which
|
|
132
|
+
// mode actually runs. When the guest ladder also fails, that failure is
|
|
133
|
+
// reported on its own terms.
|
|
134
|
+
log("info", "interface.panes.enabled=embedded is not implemented yet; detecting a guest pane host instead");
|
|
142
135
|
}
|
|
143
136
|
if (env.HERDR_ENV !== "1") {
|
|
144
137
|
return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
|
package/src/domains/mux/index.ts
CHANGED
|
@@ -14,13 +14,19 @@
|
|
|
14
14
|
* shell-escape territory (spec 4.8, and the risk register's "tool misuse" row).
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Utility pane presets, in the order `/panes open` lists them.
|
|
19
|
+
*
|
|
20
|
+
* The files preset is a Clio Coder surface named for what it does; yazi is
|
|
21
|
+
* the engine behind it and shows up only in the install command, because
|
|
22
|
+
* that is the registry id an operator types.
|
|
23
|
+
*/
|
|
18
24
|
export const PANES_PRESETS = [
|
|
19
25
|
{
|
|
20
|
-
id: "
|
|
26
|
+
id: "files",
|
|
21
27
|
/** Probed through the toolchain resolution ladder before the pane is split. */
|
|
22
28
|
binary: "yazi",
|
|
23
|
-
summary: "file
|
|
29
|
+
summary: "file view rooted at the workspace; picks land in the composer",
|
|
24
30
|
/** Printed verbatim when the probe finds nothing. */
|
|
25
31
|
installHint: "clio-coder tools install yazi",
|
|
26
32
|
},
|
|
@@ -42,10 +48,23 @@ export type PanesPresetId = (typeof PANES_PRESETS)[number]["id"];
|
|
|
42
48
|
|
|
43
49
|
export const PANES_PRESET_IDS: ReadonlyArray<PanesPresetId> = PANES_PRESETS.map((preset) => preset.id);
|
|
44
50
|
|
|
45
|
-
|
|
51
|
+
function isPanesPresetId(value: string): value is PanesPresetId {
|
|
46
52
|
return PANES_PRESETS.some((preset) => preset.id === value);
|
|
47
53
|
}
|
|
48
54
|
|
|
55
|
+
/**
|
|
56
|
+
* Retired preset spellings that still parse. The files preset shipped as
|
|
57
|
+
* `yazi` in 0.4.0 and 0.4.1, so an operator's muscle memory and any script
|
|
58
|
+
* that says `/panes open yazi` keeps working and lands on the same pane.
|
|
59
|
+
*/
|
|
60
|
+
export const PANES_PRESET_ALIASES: Readonly<Record<string, PanesPresetId>> = { yazi: "files" };
|
|
61
|
+
|
|
62
|
+
/** The canonical preset id for an operator-typed name, or null when it is not a preset. */
|
|
63
|
+
export function resolvePanesPresetId(value: string): PanesPresetId | null {
|
|
64
|
+
if (isPanesPresetId(value)) return value;
|
|
65
|
+
return PANES_PRESET_ALIASES[value] ?? null;
|
|
66
|
+
}
|
|
67
|
+
|
|
49
68
|
/** One pane Clio owns, flattened for display. */
|
|
50
69
|
export interface PanesInventoryEntry {
|
|
51
70
|
paneId: string;
|
|
@@ -135,7 +154,8 @@ export interface PanesWatchController {
|
|
|
135
154
|
}
|
|
136
155
|
|
|
137
156
|
export type PanesOpenResult =
|
|
138
|
-
|
|
157
|
+
/** `existing` is true when the preset already had a live pane and it was focused instead of split again. */
|
|
158
|
+
| { status: "opened"; label: string; paneId: string | null; existing?: boolean }
|
|
139
159
|
| { status: "missing-binary"; preset: string; binary: string; installHint: string; detail: string }
|
|
140
160
|
| { status: "refused"; reason: string }
|
|
141
161
|
| { status: "unavailable"; reason: string };
|
|
@@ -166,9 +186,21 @@ export interface PanesYaziController {
|
|
|
166
186
|
| { status: "profile-error"; reason: string }
|
|
167
187
|
| { status: "unavailable"; reason: string }
|
|
168
188
|
>;
|
|
189
|
+
/** Close the files pane if it is open; false when nothing was open. */
|
|
190
|
+
close(): Promise<boolean>;
|
|
191
|
+
/** True while a files pane the host still reports is open. */
|
|
192
|
+
isOpen(): boolean;
|
|
169
193
|
status(): Readonly<PanesYaziStatus>;
|
|
170
194
|
}
|
|
171
195
|
|
|
196
|
+
/** What `/files` and the files keybinding settle to. */
|
|
197
|
+
export type PanesFilesResult =
|
|
198
|
+
| { status: "opened"; paneId: string | null; existing: boolean }
|
|
199
|
+
| { status: "closed" }
|
|
200
|
+
| { status: "missing-binary"; binary: string; installHint: string; detail: string }
|
|
201
|
+
| { status: "refused"; reason: string }
|
|
202
|
+
| { status: "unavailable"; reason: string };
|
|
203
|
+
|
|
172
204
|
/**
|
|
173
205
|
* The operations both callers drive. The tool sees a narrower door: its schema
|
|
174
206
|
* has no argv field at all, and `open` refuses one even if a caller fabricates
|
|
@@ -185,6 +217,13 @@ export interface PanesOperations {
|
|
|
185
217
|
*/
|
|
186
218
|
zoom(target: string): Promise<PanesZoomResult>;
|
|
187
219
|
close(target: string): Promise<PanesCloseResult>;
|
|
220
|
+
/**
|
|
221
|
+
* The files pane as one operator verb. `toggle` opens it when closed and
|
|
222
|
+
* closes it when open, which is what a keybinding needs; `open` and
|
|
223
|
+
* `close` are the explicit halves; `pick` borrows the pane for one
|
|
224
|
+
* selection and closes it afterwards.
|
|
225
|
+
*/
|
|
226
|
+
files(action: "toggle" | "open" | "close" | "pick"): Promise<PanesFilesResult>;
|
|
188
227
|
/** Bind the composer-facing Yazi bridge without rebuilding this shared object. */
|
|
189
228
|
attachYazi(controller: PanesYaziController): () => void;
|
|
190
229
|
/** Bind the workers-view watch controller; `show` routes runs through it. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
|
|
6
6
|
import { clioCacheDir } from "../../../core/xdg.js";
|
|
@@ -107,6 +107,37 @@ function readOptional(path: string): string {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
/** Transport files older than this are leftovers of a process that never reached its cleanup. */
|
|
111
|
+
export const YAZI_STALE_TRANSPORT_MS = 24 * 60 * 60 * 1000;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Drop transport files no live session can own. A crash, a kill, or a
|
|
115
|
+
* release before cleanup existed leaves `.stream`, `.chooser`, and `.cwd`
|
|
116
|
+
* files behind; a day is long past any pane's life, so anything older goes.
|
|
117
|
+
*/
|
|
118
|
+
export function sweepStaleTransportFiles(sessionsDir: string, now: number = Date.now()): number {
|
|
119
|
+
let removed = 0;
|
|
120
|
+
let entries: string[];
|
|
121
|
+
try {
|
|
122
|
+
entries = readdirSync(sessionsDir);
|
|
123
|
+
} catch {
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
for (const name of entries) {
|
|
127
|
+
if (!/\.(stream|chooser|cwd)$/u.test(name)) continue;
|
|
128
|
+
const path = join(sessionsDir, name);
|
|
129
|
+
try {
|
|
130
|
+
if (now - statSync(path).mtimeMs > YAZI_STALE_TRANSPORT_MS) {
|
|
131
|
+
rmSync(path, { force: true });
|
|
132
|
+
removed += 1;
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
// A file that vanished between readdir and stat was someone else's to remove.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return removed;
|
|
139
|
+
}
|
|
140
|
+
|
|
110
141
|
/** Open one mux-hosted Yazi process and own its DDS or chooser-file transport. */
|
|
111
142
|
export async function createYaziSession(options: YaziSessionOptions): Promise<YaziSessionOpenResult> {
|
|
112
143
|
const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
|
|
@@ -125,6 +156,7 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
125
156
|
const sessionId = options.sessionId ?? randomUUID();
|
|
126
157
|
const sessionsDir = join(cacheDir, "yazi", "sessions");
|
|
127
158
|
mkdirSync(sessionsDir, { recursive: true });
|
|
159
|
+
sweepStaleTransportFiles(sessionsDir);
|
|
128
160
|
const managedProfile =
|
|
129
161
|
options.profileMode === "managed"
|
|
130
162
|
? (options.ensureProfile ?? ensureYaziProfile)({
|
|
@@ -163,10 +195,19 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
163
195
|
argv = [binaries.yaziPath, options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath];
|
|
164
196
|
}
|
|
165
197
|
|
|
198
|
+
// Transport files are per session and worthless once it ends: a pick has
|
|
199
|
+
// already been consumed by the bridge, and a chooser file has been read.
|
|
200
|
+
// Removing them here is what keeps `<cache>/yazi/sessions` from growing by
|
|
201
|
+
// three files per open for the life of the install.
|
|
202
|
+
const removeTransportFiles = (): void => {
|
|
203
|
+
for (const path of [streamPath, chooserPath, cwdPath]) rmSync(path, { force: true });
|
|
204
|
+
};
|
|
205
|
+
|
|
166
206
|
const pane = await options.mux.openUtilityPane({
|
|
167
207
|
argv,
|
|
168
208
|
cwd: options.cwd,
|
|
169
|
-
label: "
|
|
209
|
+
label: "files",
|
|
210
|
+
title: "files",
|
|
170
211
|
// The files dock: split down from the anchor at the configured share.
|
|
171
212
|
// Degrades to a plain split inside the contract when the layout tier is
|
|
172
213
|
// absent.
|
|
@@ -174,7 +215,10 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
174
215
|
...(Object.keys(env).length > 0 ? { env } : {}),
|
|
175
216
|
...(stdoutPath ? { stdoutPath } : {}),
|
|
176
217
|
});
|
|
177
|
-
if (!pane)
|
|
218
|
+
if (!pane) {
|
|
219
|
+
removeTransportFiles();
|
|
220
|
+
return { status: "unavailable", reason: "the pane host refused to open the files pane" };
|
|
221
|
+
}
|
|
178
222
|
|
|
179
223
|
let paneCwd = options.cwd;
|
|
180
224
|
let instanceId: string | null = null;
|
|
@@ -188,6 +232,7 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
188
232
|
if (chooserTimer) clearInterval(chooserTimer);
|
|
189
233
|
chooserTimer = null;
|
|
190
234
|
options.onStopped?.(reason);
|
|
235
|
+
removeTransportFiles();
|
|
191
236
|
};
|
|
192
237
|
|
|
193
238
|
if (options.mode === "companion") {
|
|
@@ -204,7 +249,11 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
204
249
|
options.onEvent(event);
|
|
205
250
|
},
|
|
206
251
|
});
|
|
207
|
-
void stream.done.then((reason) =>
|
|
252
|
+
void stream.done.then((reason) => {
|
|
253
|
+
// A stream that ended on its own means the pane is gone or the file
|
|
254
|
+
// was lost; either way the session is over and says so.
|
|
255
|
+
stop(reason);
|
|
256
|
+
});
|
|
208
257
|
} else {
|
|
209
258
|
const pollChooser = (): void => {
|
|
210
259
|
if (stopped || alive()) return;
|
|
@@ -1,30 +1,130 @@
|
|
|
1
1
|
import { tokenHex } from "../../../core/theme-token-hex.js";
|
|
2
2
|
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Render the Clio overlay on Yazi's pinned preset theme.
|
|
5
|
+
*
|
|
6
|
+
* Every color comes from Clio's own token palette (`core/theme-token-hex.ts`),
|
|
7
|
+
* read when the managed profile is generated, which happens on the open that
|
|
8
|
+
* finds no current profile. The profile stamp carries this file's output hash,
|
|
9
|
+
* so a palette change regenerates the profile on the next open rather than
|
|
10
|
+
* leaving a pane in last release's colors. Only keys Yazi 26.8 documents are
|
|
11
|
+
* set; the rest of the preset stays, because a wrong key here is rejected by
|
|
12
|
+
* the validation open in `profile.ts` and would leave the operator with no
|
|
13
|
+
* files pane at all.
|
|
14
|
+
*/
|
|
4
15
|
export function renderYaziTheme(): string {
|
|
5
|
-
|
|
16
|
+
const accent = tokenHex("accent");
|
|
17
|
+
const action = tokenHex("action");
|
|
18
|
+
const success = tokenHex("success");
|
|
19
|
+
const warning = tokenHex("warning");
|
|
20
|
+
const error = tokenHex("error");
|
|
21
|
+
const info = tokenHex("info");
|
|
22
|
+
const dim = tokenHex("dim");
|
|
23
|
+
const muted = tokenHex("muted");
|
|
24
|
+
const frame = tokenHex("frame");
|
|
25
|
+
const frameStrong = tokenHex("frameStrong");
|
|
26
|
+
return `# Generated by Clio Coder from its theme tokens. Changes are replaced when the managed profile regenerates.
|
|
6
27
|
|
|
7
28
|
[mgr]
|
|
8
|
-
cwd = { fg = "${
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
29
|
+
cwd = { fg = "${accent}" }
|
|
30
|
+
hovered = { reversed = true }
|
|
31
|
+
preview_hovered = { underline = true }
|
|
32
|
+
find_keyword = { fg = "${warning}", bold = true }
|
|
33
|
+
find_position = { fg = "${action}", italic = true }
|
|
34
|
+
marker_selected = { fg = "${success}", bg = "${success}" }
|
|
35
|
+
marker_copied = { fg = "${accent}", bg = "${accent}" }
|
|
36
|
+
marker_cut = { fg = "${error}", bg = "${error}" }
|
|
37
|
+
marker_marked = { fg = "${info}", bg = "${info}" }
|
|
38
|
+
count_copied = { fg = "${accent}", bg = "${frame}" }
|
|
39
|
+
count_cut = { fg = "${error}", bg = "${frame}" }
|
|
40
|
+
count_selected = { fg = "${success}", bg = "${frame}" }
|
|
41
|
+
border_style = { fg = "${frame}" }
|
|
42
|
+
syntect_theme = ""
|
|
14
43
|
|
|
15
44
|
[mode]
|
|
16
|
-
normal_main = { bg = "${
|
|
17
|
-
normal_alt = { fg = "${
|
|
18
|
-
select_main = { bg = "${
|
|
19
|
-
select_alt = { fg = "${
|
|
20
|
-
unset_main = { bg = "${
|
|
21
|
-
unset_alt = { fg = "${
|
|
45
|
+
normal_main = { bg = "${accent}", bold = true }
|
|
46
|
+
normal_alt = { fg = "${accent}" }
|
|
47
|
+
select_main = { bg = "${action}", bold = true }
|
|
48
|
+
select_alt = { fg = "${action}" }
|
|
49
|
+
unset_main = { bg = "${error}", bold = true }
|
|
50
|
+
unset_alt = { fg = "${error}" }
|
|
22
51
|
|
|
23
52
|
[tabs]
|
|
24
|
-
active = { bg = "${
|
|
25
|
-
inactive = { fg = "${
|
|
53
|
+
active = { bg = "${accent}", bold = true }
|
|
54
|
+
inactive = { fg = "${accent}" }
|
|
26
55
|
|
|
27
56
|
[status]
|
|
28
|
-
|
|
57
|
+
perm_type = { fg = "${accent}" }
|
|
58
|
+
perm_read = { fg = "${warning}" }
|
|
59
|
+
perm_write = { fg = "${error}" }
|
|
60
|
+
perm_exec = { fg = "${success}" }
|
|
61
|
+
perm_sep = { fg = "${dim}" }
|
|
62
|
+
progress_label = { bold = true }
|
|
63
|
+
progress_normal = { fg = "${accent}" }
|
|
64
|
+
progress_error = { fg = "${error}" }
|
|
65
|
+
|
|
66
|
+
[which]
|
|
67
|
+
cols = 3
|
|
68
|
+
mask = { bg = "${frame}" }
|
|
69
|
+
cand = { fg = "${accent}" }
|
|
70
|
+
rest = { fg = "${muted}" }
|
|
71
|
+
desc = { fg = "${action}" }
|
|
72
|
+
separator_style = { fg = "${dim}" }
|
|
73
|
+
|
|
74
|
+
[confirm]
|
|
75
|
+
border = { fg = "${frameStrong}" }
|
|
76
|
+
title = { fg = "${accent}" }
|
|
77
|
+
btn_yes = { reversed = true }
|
|
78
|
+
btn_no = {}
|
|
79
|
+
|
|
80
|
+
[pick]
|
|
81
|
+
border = { fg = "${frameStrong}" }
|
|
82
|
+
active = { fg = "${action}", bold = true }
|
|
83
|
+
|
|
84
|
+
[input]
|
|
85
|
+
border = { fg = "${frameStrong}" }
|
|
86
|
+
title = { fg = "${accent}" }
|
|
87
|
+
selected = { reversed = true }
|
|
88
|
+
|
|
89
|
+
[cmp]
|
|
90
|
+
border = { fg = "${frameStrong}" }
|
|
91
|
+
active = { reversed = true }
|
|
92
|
+
|
|
93
|
+
[tasks]
|
|
94
|
+
border = { fg = "${frameStrong}" }
|
|
95
|
+
title = { fg = "${accent}" }
|
|
96
|
+
hovered = { fg = "${action}", underline = true }
|
|
97
|
+
|
|
98
|
+
[help]
|
|
99
|
+
on = { fg = "${accent}" }
|
|
100
|
+
run = { fg = "${action}" }
|
|
101
|
+
footer = { fg = "${muted}" }
|
|
102
|
+
|
|
103
|
+
[notify]
|
|
104
|
+
title_info = { fg = "${info}" }
|
|
105
|
+
title_warn = { fg = "${warning}" }
|
|
106
|
+
title_error = { fg = "${error}" }
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The same palette as a herdr `[theme.custom]` block.
|
|
112
|
+
*
|
|
113
|
+
* herdr themes its chrome (sidebar, tab bar, borders, agent rows) from its own
|
|
114
|
+
* config.toml and has no per-pane styling on the wire, so Clio cannot color
|
|
115
|
+
* the panes it opens. What it can do is hand the operator the block that makes
|
|
116
|
+
* herdr's chrome match Clio, to paste into herdr's config; Clio never writes
|
|
117
|
+
* another program's configuration itself.
|
|
118
|
+
*/
|
|
119
|
+
export function renderHerdrThemeBlock(): string {
|
|
120
|
+
return `# Clio Coder theme tokens for herdr. Paste into ~/.config/herdr/config.toml, then run \`herdr server reload-config\`.
|
|
121
|
+
[theme.custom]
|
|
122
|
+
accent = "${tokenHex("accent")}"
|
|
123
|
+
green = "${tokenHex("success")}"
|
|
124
|
+
blue = "${tokenHex("info")}"
|
|
125
|
+
red = "${tokenHex("error")}"
|
|
126
|
+
yellow = "${tokenHex("warning")}"
|
|
127
|
+
selection_bg = "${tokenHex("frame")}"
|
|
128
|
+
active_row_bg = "${tokenHex("frame")}"
|
|
29
129
|
`;
|
|
30
130
|
}
|
|
@@ -18,25 +18,24 @@ export interface TokenThroughputSnapshot {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* One bounded, product-facing observability event
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
21
|
+
* One bounded, product-facing observability event: an evidence build that
|
|
22
|
+
* failed for a run, read by the Dispatch Board to explain why a run has no
|
|
23
|
+
* evidence bundle. This used to also carry runtime/middleware/safety/loop/
|
|
24
|
+
* tool-budget/context/budget notices classified off the same bus channels the
|
|
25
|
+
* interactive layer's own notice pipeline (bus-notices.ts and
|
|
26
|
+
* interactive-event-projection.ts) classifies independently for the toast
|
|
27
|
+
* surface a session actually shows; those seven kinds had no reader of their
|
|
28
|
+
* own here and were removed rather than kept as an unread second opinion.
|
|
29
|
+
* `message` is a short rendered line and `ref` links back to the run.
|
|
26
30
|
*/
|
|
27
31
|
export interface ObservabilityNotice {
|
|
28
32
|
id: string;
|
|
29
33
|
at: number;
|
|
30
|
-
kind: "
|
|
34
|
+
kind: "evidence";
|
|
31
35
|
level: "info" | "warning" | "error";
|
|
32
36
|
message: string;
|
|
33
37
|
ref?: {
|
|
34
38
|
runId?: string;
|
|
35
|
-
agentId?: string;
|
|
36
|
-
targetId?: string;
|
|
37
|
-
modelId?: string;
|
|
38
|
-
evidenceId?: string;
|
|
39
|
-
tool?: string;
|
|
40
39
|
};
|
|
41
40
|
}
|
|
42
41
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Observability domain wire-up. Listens to dispatch + safety bus channels and
|
|
3
|
-
* folds payloads into telemetry/cost trackers.
|
|
4
|
-
*
|
|
3
|
+
* folds payloads into telemetry/cost trackers. Other domains read the snapshot
|
|
4
|
+
* through the contract; the one thing it emits is
|
|
5
|
+
* `accountability.evidenceReady`, once per run whose evidence bundle landed.
|
|
5
6
|
*/
|
|
6
7
|
|
|
7
8
|
import { BusChannels, type DispatchCompletedPayload } from "../../core/bus-events.js";
|
|
@@ -171,7 +172,14 @@ export function createObservabilityBundle(
|
|
|
171
172
|
const trackBuild = (runId: string, succeeded: boolean, attempt: number | undefined): void => {
|
|
172
173
|
projection.evidenceBuildStarted(runId);
|
|
173
174
|
const build = buildAndIndexEvidence(runId, succeeded, attempt, {
|
|
174
|
-
onReady: (id, evidence) =>
|
|
175
|
+
onReady: (id, evidence) => {
|
|
176
|
+
projection.evidenceBuildSucceeded(id, evidence);
|
|
177
|
+
// The same fact, once, for listeners outside this closure (the ACP
|
|
178
|
+
// server forwards it as the opt-in `accountability.evidenceReady`
|
|
179
|
+
// kind). The payload spreads the evidence object the projection just
|
|
180
|
+
// received rather than rebuilding it, so the two cannot drift.
|
|
181
|
+
context.bus.emit(BusChannels.AccountabilityEvidenceReady, { runId: id, ...evidence });
|
|
182
|
+
},
|
|
175
183
|
onFailed: (id, message) => projection.evidenceBuildFailed(id, message),
|
|
176
184
|
});
|
|
177
185
|
pendingBuilds.add(build);
|
|
@@ -17,8 +17,10 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { BusChannels } from "../../core/bus-events.js";
|
|
20
|
+
import { resolveDispatchFailureStatus } from "../../core/dispatch-outcome.js";
|
|
20
21
|
import type { SafeEventBus } from "../../core/event-bus.js";
|
|
21
22
|
import type { TargetStatus } from "../providers/contract.js";
|
|
23
|
+
import { resolveCostProvenance } from "../providers/types/cost-provenance.js";
|
|
22
24
|
import type { AccountabilitySummary } from "./accountability.js";
|
|
23
25
|
import type {
|
|
24
26
|
ObservabilityNotice,
|
|
@@ -94,17 +96,6 @@ function resolveHeartbeat(status: unknown): ObservabilityRunSummary["status"] |
|
|
|
94
96
|
return null;
|
|
95
97
|
}
|
|
96
98
|
|
|
97
|
-
/** Map a DispatchFailed outcome/reason to a summary status, mirroring the board. */
|
|
98
|
-
function resolveFailedStatus(reason: unknown): ObservabilityRunSummary["status"] {
|
|
99
|
-
if (reason === "dead" || reason === "stalled") return "dead";
|
|
100
|
-
if (reason === "interrupted" || reason === "canceled") return "aborted";
|
|
101
|
-
return "failed";
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function normalizeLevel(value: unknown): ObservabilityNotice["level"] {
|
|
105
|
-
return value === "error" || value === "warning" || value === "info" ? value : "info";
|
|
106
|
-
}
|
|
107
|
-
|
|
108
99
|
/** Build a notice ref from candidate parts, dropping anything non-string/empty. */
|
|
109
100
|
function makeRef(parts: Record<string, unknown>): ObservabilityNotice["ref"] | undefined {
|
|
110
101
|
const ref: Record<string, string> = {};
|
|
@@ -216,22 +207,20 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
|
|
|
216
207
|
if (typeof id.runtimeKind === "string" && id.runtimeKind.length > 0) summary.runtimeKind = id.runtimeKind;
|
|
217
208
|
}
|
|
218
209
|
|
|
210
|
+
// num()'s Number.isFinite check matters here specifically: a NaN or
|
|
211
|
+
// Infinity costUsd/tokenCount from a payload used to pass the bare
|
|
212
|
+
// `typeof === "number"` check this function had instead, so the projection
|
|
213
|
+
// could corrupt a run's running total on a malformed terminal payload while
|
|
214
|
+
// the dispatch board's parseFiniteNumber (an identical check) rejected it.
|
|
219
215
|
function applyTerminalTokens(summary: ObservabilityRunSummary, payload: Record<string, unknown>): void {
|
|
220
|
-
|
|
216
|
+
summary.tokens.total = num(payload.tokenCount, summary.tokens.total);
|
|
221
217
|
if (typeof payload.inputTokenCount === "number") {
|
|
222
|
-
summary.tokens.input = payload.inputTokenCount + num(payload.cacheReadTokenCount, 0);
|
|
223
|
-
}
|
|
224
|
-
if (typeof payload.outputTokenCount === "number") summary.tokens.output = payload.outputTokenCount;
|
|
225
|
-
if (typeof payload.reasoningTokenCount === "number") summary.tokens.reasoning = payload.reasoningTokenCount;
|
|
226
|
-
if (typeof payload.costUsd === "number") summary.costUsd = payload.costUsd;
|
|
227
|
-
if (
|
|
228
|
-
payload.costProvenance === "known" ||
|
|
229
|
-
payload.costProvenance === "known_free" ||
|
|
230
|
-
payload.costProvenance === "estimated" ||
|
|
231
|
-
payload.costProvenance === "unknown"
|
|
232
|
-
) {
|
|
233
|
-
summary.costProvenance = payload.costProvenance;
|
|
218
|
+
summary.tokens.input = num(payload.inputTokenCount, summary.tokens.input) + num(payload.cacheReadTokenCount, 0);
|
|
234
219
|
}
|
|
220
|
+
summary.tokens.output = num(payload.outputTokenCount, summary.tokens.output);
|
|
221
|
+
summary.tokens.reasoning = num(payload.reasoningTokenCount, summary.tokens.reasoning);
|
|
222
|
+
summary.costUsd = num(payload.costUsd, summary.costUsd);
|
|
223
|
+
summary.costProvenance = resolveCostProvenance(payload.costProvenance, summary.costProvenance);
|
|
235
224
|
}
|
|
236
225
|
|
|
237
226
|
function pushNotice(
|
|
@@ -337,7 +326,7 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
|
|
|
337
326
|
const now = Date.now();
|
|
338
327
|
const summary = runs.get(runId) ?? emptyRun(runId, now);
|
|
339
328
|
applyIdentity(summary, payload);
|
|
340
|
-
summary.status =
|
|
329
|
+
summary.status = resolveDispatchFailureStatus(payload.reason);
|
|
341
330
|
summary.updatedAtMs = now;
|
|
342
331
|
summary.finishedAtMs = now;
|
|
343
332
|
summary.durationMs = num(payload.durationMs, Math.max(0, now - summary.startedAtMs));
|
|
@@ -355,71 +344,6 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
|
|
|
355
344
|
providerHealth.set(payload.id, payload.status as TargetStatus);
|
|
356
345
|
markChanged();
|
|
357
346
|
}),
|
|
358
|
-
bus.on(BusChannels.RuntimeNotice, (raw: unknown) => {
|
|
359
|
-
const payload = (raw ?? {}) as Record<string, unknown>;
|
|
360
|
-
pushNotice(
|
|
361
|
-
"runtime",
|
|
362
|
-
normalizeLevel(payload.level),
|
|
363
|
-
str(payload.message, "runtime notice"),
|
|
364
|
-
makeRef({ targetId: payload.targetId, modelId: payload.model }),
|
|
365
|
-
);
|
|
366
|
-
}),
|
|
367
|
-
bus.on(BusChannels.MiddlewareHookFailed, (raw: unknown) => {
|
|
368
|
-
const payload = (raw ?? {}) as Record<string, unknown>;
|
|
369
|
-
const kind = payload.kind;
|
|
370
|
-
// Mirror the interactive notice policy: every crashed hook surfaces, but
|
|
371
|
-
// a budget overrun only surfaces once it is steady-state slowness.
|
|
372
|
-
if (kind === "budget_exceeded" && payload.steadyStateWarn !== true) return;
|
|
373
|
-
const hook = str(payload.hook, "hook");
|
|
374
|
-
const message =
|
|
375
|
-
typeof payload.message === "string" && payload.message.length > 0
|
|
376
|
-
? payload.message
|
|
377
|
-
: kind === "budget_exceeded"
|
|
378
|
-
? `middleware hook ${hook} exceeded ${num(payload.budgetMs, 0)}ms budget`
|
|
379
|
-
: `middleware hook ${hook} failed`;
|
|
380
|
-
pushNotice("middleware", kind === "budget_exceeded" ? "warning" : "error", message);
|
|
381
|
-
}),
|
|
382
|
-
bus.on(BusChannels.SafetyBlocked, (raw: unknown) => {
|
|
383
|
-
const payload = (raw ?? {}) as Record<string, unknown>;
|
|
384
|
-
const tool = str(payload.tool, "tool");
|
|
385
|
-
const rejection = (payload.rejection ?? {}) as { short?: unknown };
|
|
386
|
-
const short = str(rejection.short, `${str(payload.actionClass, "action")} blocked`);
|
|
387
|
-
pushNotice("safety", "warning", `${tool}: ${short}`, makeRef({ tool: payload.tool }));
|
|
388
|
-
}),
|
|
389
|
-
bus.on(BusChannels.LoopBlocked, (raw: unknown) => {
|
|
390
|
-
const payload = (raw ?? {}) as Record<string, unknown>;
|
|
391
|
-
const tool = str(payload.tool, "tool");
|
|
392
|
-
pushNotice(
|
|
393
|
-
"loop",
|
|
394
|
-
payload.interrupted === true ? "error" : "warning",
|
|
395
|
-
`loop guard blocked repeated ${tool} (${num(payload.repeatCount, 0)}x)`,
|
|
396
|
-
makeRef({ tool: payload.tool }),
|
|
397
|
-
);
|
|
398
|
-
}),
|
|
399
|
-
bus.on(BusChannels.ToolBudgetExceeded, (raw: unknown) => {
|
|
400
|
-
const payload = (raw ?? {}) as Record<string, unknown>;
|
|
401
|
-
const tool = str(payload.tool, "tool");
|
|
402
|
-
pushNotice(
|
|
403
|
-
"tool-budget",
|
|
404
|
-
payload.interrupted === true ? "error" : "warning",
|
|
405
|
-
`tool-call budget reached on ${tool} (${num(payload.callsThisTurn, 0)} calls)`,
|
|
406
|
-
makeRef({ tool: payload.tool }),
|
|
407
|
-
);
|
|
408
|
-
}),
|
|
409
|
-
bus.on(BusChannels.ContextPruned, (raw: unknown) => {
|
|
410
|
-
const payload = (raw ?? {}) as Record<string, unknown>;
|
|
411
|
-
const reclaimed = Math.max(0, num(payload.tokensBefore, 0) - num(payload.tokensAfter, 0));
|
|
412
|
-
pushNotice("context", "info", `context pruned ${reclaimed} tokens (${str(payload.stage, "prune")})`);
|
|
413
|
-
}),
|
|
414
|
-
bus.on(BusChannels.BudgetAlert, (raw: unknown) => {
|
|
415
|
-
const payload = (raw ?? {}) as Record<string, unknown>;
|
|
416
|
-
const over = payload.level === "over";
|
|
417
|
-
pushNotice(
|
|
418
|
-
"budget",
|
|
419
|
-
over ? "error" : "warning",
|
|
420
|
-
`session cost $${num(payload.currentUsd, 0).toFixed(2)} ${over ? "over" : "at"} $${num(payload.ceilingUsd, 0).toFixed(2)} ceiling`,
|
|
421
|
-
);
|
|
422
|
-
}),
|
|
423
347
|
];
|
|
424
348
|
|
|
425
349
|
return {
|