@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
|
@@ -81,7 +81,7 @@ import {
|
|
|
81
81
|
type SessionPromptCompileRecord,
|
|
82
82
|
} from "../domains/session/prompt-manifest.js";
|
|
83
83
|
import type { AgentMessage, Usage } from "../engine/types.js";
|
|
84
|
-
import type
|
|
84
|
+
import { resolveToolPromptHint, type ToolRegistry } from "../tools/registry.js";
|
|
85
85
|
import {
|
|
86
86
|
backendCacheVerdict,
|
|
87
87
|
extractUserText,
|
|
@@ -90,6 +90,7 @@ import {
|
|
|
90
90
|
toolNamesFromAgentState,
|
|
91
91
|
} from "./chat-loop-messages.js";
|
|
92
92
|
import { buildModelReplayAgentMessagesFromTurns } from "./model-session-replay.js";
|
|
93
|
+
import { attachedToolSchemasFromState, mainPromptCacheIdentity } from "./prompt-cache-identity.js";
|
|
93
94
|
import { renderCompactionSummaryLine, renderEvictionSkipLine } from "./renderers/compaction-summary.js";
|
|
94
95
|
import type { TurnMiddleware } from "./turn-middleware.js";
|
|
95
96
|
import type { AgentRuntime, ChatTurnState } from "./turn-state.js";
|
|
@@ -270,8 +271,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
270
271
|
// before the operator did.
|
|
271
272
|
let lastPrewarm: PrewarmStats | null = null;
|
|
272
273
|
// The session system prompt, compiled once per session. Recompiles happen
|
|
273
|
-
// only
|
|
274
|
-
//
|
|
274
|
+
// only when the canonical identity of every live compile input changes, or
|
|
275
|
+
// a config hot-reload invalidates compiler-owned inputs. A
|
|
275
276
|
// recompile that changes the prompt text appends a "promptRecompiled"
|
|
276
277
|
// ledger entry so a cold provider cache is always explainable.
|
|
277
278
|
let sessionPrompt: CompiledSessionPrompt | null = null;
|
|
@@ -1021,8 +1022,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1021
1022
|
|
|
1022
1023
|
/**
|
|
1023
1024
|
* Ensure the session system prompt is compiled and applied to the live
|
|
1024
|
-
* agent. Compiles only when the
|
|
1025
|
-
*
|
|
1025
|
+
* agent. Compiles only when the canonical live-input identity changes
|
|
1026
|
+
* or a config hot-reload invalidated compiler-owned inputs in the
|
|
1026
1027
|
* cache; every other submit reuses the cached prompt byte-for-byte. A
|
|
1027
1028
|
* compile whose text differs from the previous prompt queues a
|
|
1028
1029
|
* "promptRecompiled" ledger entry (written once the session exists).
|
|
@@ -1032,14 +1033,9 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1032
1033
|
const settings = deps.getSettings();
|
|
1033
1034
|
const autonomy = settings.safety.autonomy ?? "auto-edit";
|
|
1034
1035
|
const sessionId = deps.session?.current()?.id ?? "";
|
|
1035
|
-
const
|
|
1036
|
-
const key = `${agentRuntime.targetId}|${agentRuntime.wireModelId}|${autonomy}|${sessionId}|${workingContextKey}`;
|
|
1037
|
-
if (sessionPrompt && sessionPromptKey === key) {
|
|
1038
|
-
lastSystemPromptReused = true;
|
|
1039
|
-
return sessionPrompt;
|
|
1040
|
-
}
|
|
1036
|
+
const cwd = process.cwd();
|
|
1041
1037
|
const modelState = agentRuntime.agent.state.model as
|
|
1042
|
-
| (typeof agentRuntime.agent.state.model & {
|
|
1038
|
+
| (typeof agentRuntime.agent.state.model & { clioCoder?: { quirks?: LocalModelQuirks } })
|
|
1043
1039
|
| undefined;
|
|
1044
1040
|
// `Context window: N` is the window the backend will actually serve
|
|
1045
1041
|
// this session, taken from the resolution the turn already ran rather
|
|
@@ -1057,13 +1053,14 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1057
1053
|
const contextWindow = typeof resolvedWindow === "number" && resolvedWindow > 0 ? resolvedWindow : null;
|
|
1058
1054
|
const contextWindowSource: ContextWindowSource | null =
|
|
1059
1055
|
contextWindow === null ? null : windowDetails.contextWindowSource;
|
|
1060
|
-
const guidance = modelState?.
|
|
1056
|
+
const guidance = modelState?.clioCoder?.quirks?.thinking?.guidance;
|
|
1061
1057
|
// Per-tool prompt hints come from registry metadata, derived once from
|
|
1062
1058
|
// the frozen surface per compile. The compiler renders them sorted by
|
|
1063
1059
|
// tool name, so the compiled text stays byte-stable for a given surface.
|
|
1064
1060
|
const toolNames = toolNamesFromAgentState(agentRuntime.agent.state.tools);
|
|
1061
|
+
const attachedToolSchemas = attachedToolSchemasFromState(agentRuntime.agent.state.tools);
|
|
1065
1062
|
const toolPromptHints = toolNames.flatMap((name) => {
|
|
1066
|
-
const hint = deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint;
|
|
1063
|
+
const hint = resolveToolPromptHint(deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint, "session");
|
|
1067
1064
|
return hint ? [{ tool: name, hint }] : [];
|
|
1068
1065
|
});
|
|
1069
1066
|
const sessionInputs: SessionPromptInputs = {
|
|
@@ -1085,11 +1082,29 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1085
1082
|
);
|
|
1086
1083
|
}
|
|
1087
1084
|
}
|
|
1085
|
+
const key = mainPromptCacheIdentity({
|
|
1086
|
+
targetId: agentRuntime.targetId,
|
|
1087
|
+
runtimeId: agentRuntime.runtimeId,
|
|
1088
|
+
wireModelId: agentRuntime.wireModelId,
|
|
1089
|
+
autonomy,
|
|
1090
|
+
sessionId,
|
|
1091
|
+
cwd,
|
|
1092
|
+
workingContextPaths: [...sessionWorkingContextPaths],
|
|
1093
|
+
contextWindowSource,
|
|
1094
|
+
promptInputEpoch: deps.prompts.inputEpoch(),
|
|
1095
|
+
sessionInputs,
|
|
1096
|
+
attachedToolSchemas,
|
|
1097
|
+
});
|
|
1098
|
+
if (sessionPrompt && sessionPromptKey === key) {
|
|
1099
|
+
lastSystemPromptReused = true;
|
|
1100
|
+
return sessionPrompt;
|
|
1101
|
+
}
|
|
1088
1102
|
try {
|
|
1089
1103
|
const result = await deps.prompts.compileSessionPrompt({
|
|
1104
|
+
sessionId,
|
|
1090
1105
|
sessionInputs,
|
|
1091
1106
|
autonomy,
|
|
1092
|
-
cwd
|
|
1107
|
+
cwd,
|
|
1093
1108
|
workingContextPaths: [...sessionWorkingContextPaths],
|
|
1094
1109
|
});
|
|
1095
1110
|
const previousHash = sessionPromptHash ?? lastRecordedPromptHash();
|
|
@@ -52,6 +52,10 @@ export type YaziBridgeOpenResult =
|
|
|
52
52
|
|
|
53
53
|
export interface YaziBridge {
|
|
54
54
|
open(options?: { once?: boolean }): Promise<YaziBridgeOpenResult>;
|
|
55
|
+
/** Close the files pane and hand focus back to the composer; false when nothing was open. */
|
|
56
|
+
close(): Promise<boolean>;
|
|
57
|
+
/** True while the pane host still reports the files pane. */
|
|
58
|
+
isOpen(): boolean;
|
|
55
59
|
status(): Readonly<YaziBridgeStatus>;
|
|
56
60
|
dispose(): void;
|
|
57
61
|
}
|
|
@@ -312,9 +316,12 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
312
316
|
}
|
|
313
317
|
deps.setDraft(appendDraft(draft, batch.text));
|
|
314
318
|
deps.requestRender();
|
|
319
|
+
// The pick is the end of the operator's trip into the files pane, so the
|
|
320
|
+
// keyboard comes back to the composer without a click.
|
|
321
|
+
void deps.mux?.focusSelf();
|
|
315
322
|
deps.notice(
|
|
316
323
|
"info",
|
|
317
|
-
`${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the
|
|
324
|
+
`${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the files pane added to the draft`,
|
|
318
325
|
);
|
|
319
326
|
if (batch.plainPaths > 0) {
|
|
320
327
|
deps.notice(
|
|
@@ -366,6 +373,8 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
366
373
|
if (disposed || ownGeneration !== generation) return;
|
|
367
374
|
paneCwd = choice.cwd;
|
|
368
375
|
if (choice.paths.length > 0) insert(choice.paths, choice.cwd);
|
|
376
|
+
// A cancelled pick still ends the trip; the composer gets the keyboard back.
|
|
377
|
+
else void deps.mux?.focusSelf();
|
|
369
378
|
},
|
|
370
379
|
onStopped: () => {
|
|
371
380
|
if (ownGeneration !== generation) return;
|
|
@@ -379,12 +388,16 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
379
388
|
return { status: "unavailable", reason: "the file pane was closed while it was opening" };
|
|
380
389
|
}
|
|
381
390
|
active = result.session;
|
|
391
|
+
// An explicit open is a request to go and pick something, so the keyboard
|
|
392
|
+
// follows the pane. The dock tier itself never steals focus; this is the
|
|
393
|
+
// one caller entitled to ask.
|
|
394
|
+
await mux.focusPane(result.session.pane.paneId);
|
|
382
395
|
if (mode === "companion") {
|
|
383
396
|
livenessTimer = setTimeout(() => {
|
|
384
397
|
if (disposed || ownGeneration !== generation || sawLine || active === null) return;
|
|
385
398
|
const stale = active;
|
|
386
399
|
active = null;
|
|
387
|
-
deps.notice("warning", "the
|
|
400
|
+
deps.notice("warning", "the files pane did not report back in time; reopening it in pick mode");
|
|
388
401
|
void stale.close().finally(() => {
|
|
389
402
|
if (!disposed && ownGeneration === generation) void start("chooser", profileMode, dockShare);
|
|
390
403
|
});
|
|
@@ -394,16 +407,49 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
394
407
|
return { status: "opened", mode, paneId: result.session.pane.paneId, existing: false };
|
|
395
408
|
};
|
|
396
409
|
|
|
410
|
+
/**
|
|
411
|
+
* The pane host is the authority on whether the pane exists. `active` lags
|
|
412
|
+
* it by one event at most, but a caller deciding between open and close
|
|
413
|
+
* must not be told a pane is open when herdr already reported it gone.
|
|
414
|
+
*/
|
|
415
|
+
const liveSession = (): YaziSession | null => {
|
|
416
|
+
if (active === null) return null;
|
|
417
|
+
const mux = deps.mux;
|
|
418
|
+
if (mux?.available() && !mux.list().some((record) => record.ref.paneId === active?.pane.paneId)) {
|
|
419
|
+
active = null;
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
return active;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const closeActive = async (): Promise<boolean> => {
|
|
426
|
+
const session = liveSession();
|
|
427
|
+
if (session === null) return false;
|
|
428
|
+
generation += 1;
|
|
429
|
+
clearLiveness();
|
|
430
|
+
active = null;
|
|
431
|
+
await session.close();
|
|
432
|
+
// Closing the dock the operator was looking at would otherwise leave
|
|
433
|
+
// focus wherever herdr puts it after a close, which is not the composer.
|
|
434
|
+
await deps.mux?.focusSelf();
|
|
435
|
+
return true;
|
|
436
|
+
};
|
|
437
|
+
|
|
397
438
|
return {
|
|
398
439
|
async open(options = {}): Promise<YaziBridgeOpenResult> {
|
|
399
|
-
if (disposed) return { status: "unavailable", reason: "the
|
|
440
|
+
if (disposed) return { status: "unavailable", reason: "the files pane bridge is closed" };
|
|
400
441
|
const settings = deps.getSettings?.() ?? { mode: "companion", profile: "managed", followCwd: true };
|
|
401
|
-
|
|
442
|
+
const existing = liveSession();
|
|
443
|
+
if (existing) {
|
|
402
444
|
if (settings.followCwd) {
|
|
403
445
|
const cwd = deps.getCwd();
|
|
404
|
-
if (await
|
|
446
|
+
if (await existing.pushCwd(cwd)) paneCwd = cwd;
|
|
405
447
|
}
|
|
406
|
-
|
|
448
|
+
// Re-opening an open pane means "take me there": leave any zoom that
|
|
449
|
+
// hides it and put the keyboard in it.
|
|
450
|
+
await deps.mux?.unzoomSelf();
|
|
451
|
+
await deps.mux?.focusPane(existing.pane.paneId);
|
|
452
|
+
return { status: "opened", mode: existing.mode, paneId: existing.pane.paneId, existing: true };
|
|
407
453
|
}
|
|
408
454
|
const mode = options.once || settings.profile === "user" ? "chooser" : settings.mode;
|
|
409
455
|
if (!deps.mux?.available()) {
|
|
@@ -426,8 +472,16 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
426
472
|
}
|
|
427
473
|
return result;
|
|
428
474
|
}
|
|
475
|
+
await deps.mux.unzoomSelf();
|
|
429
476
|
return await start(mode, settings.profile, settings.ratio);
|
|
430
477
|
},
|
|
478
|
+
close(): Promise<boolean> {
|
|
479
|
+
if (disposed) return Promise.resolve(false);
|
|
480
|
+
return closeActive();
|
|
481
|
+
},
|
|
482
|
+
isOpen(): boolean {
|
|
483
|
+
return liveSession() !== null;
|
|
484
|
+
},
|
|
431
485
|
status(): Readonly<YaziBridgeStatus> {
|
|
432
486
|
const snapshot = active?.snapshot();
|
|
433
487
|
return {
|
package/src/tools/agent-tools.ts
CHANGED
|
@@ -296,6 +296,35 @@ function errorMessage(err: unknown): string {
|
|
|
296
296
|
return err instanceof Error ? err.message : String(err);
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
+
/**
|
|
300
|
+
* The parameter schema as the provider should see it.
|
|
301
|
+
*
|
|
302
|
+
* TypeBox 1.x annotates every schema it builds with string-keyed markers
|
|
303
|
+
* (`~unsafe` on `Type.Unsafe`, `~optional` on `Type.Optional`, and so on).
|
|
304
|
+
* Unlike the older symbol keys they survive `JSON.stringify`, so each enum
|
|
305
|
+
* field reached the model as `{"~unsafe": null, "~optional": true, ...}`:
|
|
306
|
+
* 44 junk keys on the default surface, and a small model has no way to know
|
|
307
|
+
* that `"~unsafe": null` means nothing. Validation does not need them
|
|
308
|
+
* (`Value.Check` answers identically with and without), so the copy handed
|
|
309
|
+
* to the agent loop drops every `~`-prefixed key. Symbol keys are copied
|
|
310
|
+
* through untouched because pi-ai picks its coercion path by the TypeBox
|
|
311
|
+
* kind symbol on the root schema.
|
|
312
|
+
*/
|
|
313
|
+
function wireParameterSchema<T>(schema: T): T {
|
|
314
|
+
if (Array.isArray(schema)) return schema.map((entry) => wireParameterSchema(entry)) as T;
|
|
315
|
+
if (typeof schema !== "object" || schema === null) return schema;
|
|
316
|
+
const source = schema as Record<PropertyKey, unknown>;
|
|
317
|
+
const out: Record<PropertyKey, unknown> = {};
|
|
318
|
+
for (const key of Object.keys(source)) {
|
|
319
|
+
if (key.startsWith("~")) continue;
|
|
320
|
+
out[key] = wireParameterSchema(source[key]);
|
|
321
|
+
}
|
|
322
|
+
for (const symbol of Object.getOwnPropertySymbols(source)) {
|
|
323
|
+
out[symbol] = source[symbol];
|
|
324
|
+
}
|
|
325
|
+
return out as T;
|
|
326
|
+
}
|
|
327
|
+
|
|
299
328
|
function toAgentTool(
|
|
300
329
|
spec: ToolSpec,
|
|
301
330
|
registry: ToolRegistry,
|
|
@@ -305,7 +334,7 @@ function toAgentTool(
|
|
|
305
334
|
const tool: AgentTool<TSchema> = {
|
|
306
335
|
name: spec.name,
|
|
307
336
|
description: spec.description,
|
|
308
|
-
parameters: spec.parameters,
|
|
337
|
+
parameters: wireParameterSchema(spec.parameters),
|
|
309
338
|
label: spec.metadata?.uiLabel ?? spec.name,
|
|
310
339
|
async execute(
|
|
311
340
|
toolCallId: string,
|
package/src/tools/artifact.ts
CHANGED
|
@@ -20,7 +20,7 @@ import type { ToolResult, ToolSpec } from "./registry.js";
|
|
|
20
20
|
* tree holds files a human asked for, and everything Clio generates on its own
|
|
21
21
|
* belongs in the gitignored project directory. An explicit `path` still writes
|
|
22
22
|
* wherever the caller says, inside the workspace. See core/artifact-paths.ts
|
|
23
|
-
* and docs/artifact-placement.md.
|
|
23
|
+
* and docs/architecture/artifact-placement.md.
|
|
24
24
|
*
|
|
25
25
|
* Skills are not artifacts: a skill is a SKILL.md folder written with the
|
|
26
26
|
* ordinary write tool and validated by the skills loader on load. The
|
|
@@ -83,7 +83,7 @@ async function writeTerminalArtifact(
|
|
|
83
83
|
export function createArtifactTool(deps: ArtifactToolDeps = {}): ToolSpec {
|
|
84
84
|
return {
|
|
85
85
|
name: ToolNames.Artifact,
|
|
86
|
-
description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
|
|
86
|
+
description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn, so close the task board (tasks done/block/drop) before writing it. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
|
|
87
87
|
parameters: Type.Object({
|
|
88
88
|
kind: StringEnum(ARTIFACT_KINDS, { description: "Artifact kind." }),
|
|
89
89
|
content: Type.String({ description: "Full Markdown body." }),
|
package/src/tools/ask-user.ts
CHANGED
|
@@ -92,13 +92,13 @@ export interface AskUserToolDeps {
|
|
|
92
92
|
export const askUserParameters = Type.Object({
|
|
93
93
|
action: Type.Optional(
|
|
94
94
|
StringEnum(["ask", "complete"], {
|
|
95
|
-
description: "ask presents a round of questions; complete
|
|
95
|
+
description: "ask presents a round of questions; complete records the decisions, once, before final prose.",
|
|
96
96
|
}),
|
|
97
97
|
),
|
|
98
98
|
mode: Type.Optional(
|
|
99
99
|
StringEnum(["round", "single_question"], {
|
|
100
100
|
description:
|
|
101
|
-
"
|
|
101
|
+
"round (default) accepts 1 to 4 tightly related questions; single_question accepts exactly one, for interviews.",
|
|
102
102
|
}),
|
|
103
103
|
),
|
|
104
104
|
questions: Type.Optional(
|
|
@@ -135,7 +135,7 @@ export const askUserParameters = Type.Object({
|
|
|
135
135
|
exposure: Type.Optional(
|
|
136
136
|
StringEnum(["local", "outward"], {
|
|
137
137
|
description:
|
|
138
|
-
"
|
|
138
|
+
"local (default) stays inside the workspace; outward publishes or sends something the operator cannot take back (issue, PR, comment, push, release) and parks for the operator at auto-edit.",
|
|
139
139
|
}),
|
|
140
140
|
),
|
|
141
141
|
});
|
package/src/tools/bash.ts
CHANGED
|
@@ -163,7 +163,7 @@ export const bashTool: ToolSpec = {
|
|
|
163
163
|
cwd: Type.Optional(
|
|
164
164
|
Type.String({
|
|
165
165
|
description:
|
|
166
|
-
"Omit
|
|
166
|
+
"Omit unless the command must run in a subdirectory of the workspace root, given as a relative path; outside the root is blocked.",
|
|
167
167
|
}),
|
|
168
168
|
),
|
|
169
169
|
timeout_ms: Type.Optional(Type.Number({ description: "Timeout in milliseconds." })),
|
package/src/tools/bootstrap.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { CompeteMuxWorktrees } from "./compete-worktrees.js";
|
|
|
10
10
|
import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreTools } from "./core-bootstrap.js";
|
|
11
11
|
import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
|
|
12
12
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
13
|
+
import type { DispatchSchemaComposition } from "./dispatch-schema.js";
|
|
13
14
|
import { lazyTool } from "./lazy-tool.js";
|
|
14
15
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
15
16
|
import { panesToolSurface } from "./panes-surface.js";
|
|
@@ -27,6 +28,8 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
|
27
28
|
getAutonomy?: () => AutonomyLevel;
|
|
28
29
|
getCostCeilingUsd?: () => number;
|
|
29
30
|
getWorkerRosters?: () => WorkerRosters;
|
|
31
|
+
/** Which optional `dispatch` schema blocks this session advertises; absent means every block. */
|
|
32
|
+
getDispatchSchemaComposition?: () => DispatchSchemaComposition;
|
|
30
33
|
dispatchBackground?: DispatchBackgroundRegistry;
|
|
31
34
|
/** Optional herdr worktree lifecycle for compete candidates. */
|
|
32
35
|
competeMuxWorktrees?: CompeteMuxWorktrees;
|
|
@@ -61,6 +64,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
61
64
|
...(deps.getAutonomy ? { getAutonomy: deps.getAutonomy } : {}),
|
|
62
65
|
...(deps.getCostCeilingUsd ? { getCostCeilingUsd: deps.getCostCeilingUsd } : {}),
|
|
63
66
|
...(deps.getWorkerRosters ? { getWorkerRosters: deps.getWorkerRosters } : {}),
|
|
67
|
+
...(deps.getDispatchSchemaComposition ? { getSchemaComposition: deps.getDispatchSchemaComposition } : {}),
|
|
64
68
|
...(deps.dispatchBackground ? { background: deps.dispatchBackground } : {}),
|
|
65
69
|
...(deps.competeMuxWorktrees ? { competeWorktrees: { mux: deps.competeMuxWorktrees } } : {}),
|
|
66
70
|
};
|
|
@@ -4,7 +4,13 @@ import { BASH_DEFAULT_RESULT_DISPOSITION } from "./bash.js";
|
|
|
4
4
|
import { OBSERVATION_POLICY_SLACK_BYTES, OBSERVE_SELF_CAPS } from "./observation.js";
|
|
5
5
|
import { toolPresentationPolicy } from "./presentation.js";
|
|
6
6
|
import { readMaxBytes } from "./read.js";
|
|
7
|
-
import
|
|
7
|
+
import {
|
|
8
|
+
resolveToolPromptHint,
|
|
9
|
+
type ToolMetadata,
|
|
10
|
+
type ToolPromptHintRole,
|
|
11
|
+
type ToolSourceInfo,
|
|
12
|
+
type ToolSpec,
|
|
13
|
+
} from "./registry.js";
|
|
8
14
|
|
|
9
15
|
function withSourceInfo<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
|
|
10
16
|
return { ...spec, sourceInfo };
|
|
@@ -83,7 +89,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
83
89
|
resultSizePolicy: observePolicy(OBSERVE_SELF_CAPS.codeNav, "Raise limit or use a narrower mode/query."),
|
|
84
90
|
costLatency: "local_fast",
|
|
85
91
|
promptHint:
|
|
86
|
-
"Use code_nav for
|
|
92
|
+
"Use code_nav with source=workspace (default) for project code and source=clio for Clio's shipped code map; modes: symbol, path, entries, outline, deps, dependents, wiki (workspace only).",
|
|
87
93
|
},
|
|
88
94
|
[ToolNames.Context]: {
|
|
89
95
|
objective: "Return workspace, bundled-docs, or skill context.",
|
|
@@ -94,8 +100,14 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
94
100
|
"Use a narrower query or scope to inspect omitted content.",
|
|
95
101
|
),
|
|
96
102
|
costLatency: "local_fast",
|
|
97
|
-
promptHint:
|
|
98
|
-
|
|
103
|
+
promptHint: {
|
|
104
|
+
session:
|
|
105
|
+
'On an explicit pending skill request, first load exactly that skill with context(scope="skills", name=<skill>). Follow a [Marketplace] reminder\'s exact ask_user options. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
106
|
+
worker:
|
|
107
|
+
'This worker has no operator skill-activation channel; do not load or suggest skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
108
|
+
boundWorker:
|
|
109
|
+
'Load only the harness-activated recipe-bound skills named in the persona, and only when they match the assigned task. This worker cannot install or suggest marketplace skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
110
|
+
},
|
|
99
111
|
},
|
|
100
112
|
[ToolNames.CredentialPresent]: {
|
|
101
113
|
objective: "Check whether a credential key is present without returning its value.",
|
|
@@ -135,7 +147,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
135
147
|
resultDisposition: BASH_DEFAULT_RESULT_DISPOSITION,
|
|
136
148
|
costLatency: "local_slow",
|
|
137
149
|
promptHint:
|
|
138
|
-
"
|
|
150
|
+
"bash output_policy: omit for a bounded tail; summary for noisy commands; metadata-only when only the outcome matters; full only when the output is known to fit.",
|
|
139
151
|
},
|
|
140
152
|
[ToolNames.Git]: {
|
|
141
153
|
objective: "Read-only git inspection: status, diff, or log.",
|
|
@@ -167,9 +179,8 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
167
179
|
},
|
|
168
180
|
costLatency: "local_fast",
|
|
169
181
|
promptHint:
|
|
170
|
-
'
|
|
171
|
-
|
|
172
|
-
'(what proves it works), and use "block" with a reason instead of silently stalling.',
|
|
182
|
+
'For a request with three or more distinct steps, declare the board before the first edit: tasks(action="plan") with a title and the task list. ' +
|
|
183
|
+
"start one task before working it, close it with done plus an evidence note, and block with a reason instead of stalling.",
|
|
173
184
|
},
|
|
174
185
|
[ToolNames.Ledger]: {
|
|
175
186
|
objective: "Coordinate with the peer workers of this dispatch through typed claims, findings, and reviews.",
|
|
@@ -191,9 +202,10 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
191
202
|
resultSizePolicy: summaryPolicy(
|
|
192
203
|
"Use the dispatch receipt paths or ask a narrower worker follow-up for omitted output.",
|
|
193
204
|
),
|
|
205
|
+
// No hint: the Tool Contract's inventory line already says when
|
|
206
|
+
// dispatch(list:true) is the right answer, and the Fleet section says
|
|
207
|
+
// everything else about routing.
|
|
194
208
|
costLatency: "agent",
|
|
195
|
-
promptHint:
|
|
196
|
-
"Call dispatch with list:true only when the operator asks about agents, workers, or the fleet; never use it to inventory direct tools.",
|
|
197
209
|
},
|
|
198
210
|
[ToolNames.Monitor]: {
|
|
199
211
|
objective: "Inspect dispatched runs: state, recent events, receipts.",
|
|
@@ -226,7 +238,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
226
238
|
},
|
|
227
239
|
costLatency: "local_fast",
|
|
228
240
|
promptHint:
|
|
229
|
-
'When the operator asks to see a dispatched agent ("show me the tester"), call panes
|
|
241
|
+
'When the operator asks to see a dispatched agent ("show me the tester"), call panes(action="show", target=<agent id>).',
|
|
230
242
|
},
|
|
231
243
|
// RETRIEVE: network-class.
|
|
232
244
|
[ToolNames.WebFetch]: {
|
|
@@ -252,7 +264,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
252
264
|
},
|
|
253
265
|
costLatency: "local_slow",
|
|
254
266
|
promptHint:
|
|
255
|
-
'Use ask_user only when blocked on a decision the request does not answer
|
|
267
|
+
'Use ask_user only when blocked on a decision the request does not answer, never about something the operator already stated: one question per round in interviews, up to four related questions otherwise, recommended option first, then action="complete" with the decisions before final prose.',
|
|
256
268
|
},
|
|
257
269
|
// ARTIFACT: terminal writers.
|
|
258
270
|
[ToolNames.Artifact]: {
|
|
@@ -264,15 +276,21 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
264
276
|
},
|
|
265
277
|
};
|
|
266
278
|
|
|
267
|
-
/** Canonical,
|
|
268
|
-
export function toolPromptHintsForNames(
|
|
269
|
-
|
|
279
|
+
/** Canonical, role-aware prompt hints for an already-admitted tool set. */
|
|
280
|
+
export function toolPromptHintsForNames(
|
|
281
|
+
names: ReadonlyArray<ToolName>,
|
|
282
|
+
role: ToolPromptHintRole = "session",
|
|
283
|
+
): ReadonlyArray<{ tool: string; hint: string }> {
|
|
284
|
+
const seenTools = new Set<string>();
|
|
285
|
+
const seenHints = new Set<string>();
|
|
270
286
|
const hints: Array<{ tool: string; hint: string }> = [];
|
|
271
287
|
for (const name of [...names].sort()) {
|
|
272
|
-
if (
|
|
273
|
-
|
|
274
|
-
const hint = TOOL_METADATA[name]?.promptHint
|
|
275
|
-
if (hint
|
|
288
|
+
if (seenTools.has(name)) continue;
|
|
289
|
+
seenTools.add(name);
|
|
290
|
+
const hint = resolveToolPromptHint(TOOL_METADATA[name]?.promptHint, role);
|
|
291
|
+
if (!hint || seenHints.has(hint)) continue;
|
|
292
|
+
seenHints.add(hint);
|
|
293
|
+
hints.push({ tool: name, hint });
|
|
276
294
|
}
|
|
277
295
|
return hints;
|
|
278
296
|
}
|
|
@@ -282,9 +300,21 @@ export function toolPromptHintsForNames(names: ReadonlyArray<ToolName>): Readonl
|
|
|
282
300
|
// live panel (which has no registry) answer the fold question identically.
|
|
283
301
|
function withBuiltinMetadata<T extends ToolSpec>(spec: T): T {
|
|
284
302
|
const metadata = TOOL_METADATA[spec.name];
|
|
285
|
-
return
|
|
286
|
-
|
|
287
|
-
|
|
303
|
+
if (!metadata) return spec;
|
|
304
|
+
// The read cap is a guardrail (`safety.limits.readBytesPerCall`) installed
|
|
305
|
+
// from settings after this module loads, so the table's import-time value
|
|
306
|
+
// is the default, not the operator's. Recompute the policy cap when the tool
|
|
307
|
+
// is registered; the drift check in policy.ts compares against the live cap
|
|
308
|
+
// and a settings file raising the read cap used to fail boot.
|
|
309
|
+
const resultSizePolicy =
|
|
310
|
+
spec.name === ToolNames.Read
|
|
311
|
+
? observePolicy(readMaxBytes(), metadata.resultSizePolicy?.followUpHint ?? "")
|
|
312
|
+
: metadata.resultSizePolicy;
|
|
313
|
+
return withMetadata(spec, {
|
|
314
|
+
...metadata,
|
|
315
|
+
...(resultSizePolicy ? { resultSizePolicy } : {}),
|
|
316
|
+
presentation: toolPresentationPolicy(spec.name, undefined),
|
|
317
|
+
});
|
|
288
318
|
}
|
|
289
319
|
|
|
290
320
|
export function builtin<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
|
|
@@ -12,6 +12,12 @@ export const codeNavToolSurface = {
|
|
|
12
12
|
description:
|
|
13
13
|
"Navigate the indexed codewiki: mode=symbol finds files by symbol, path finds files by glob/regex/substring, entries lists likely entry points, outline lists file symbols, deps lists imports, and dependents lists importers. mode=wiki without query lists generated Markdown wiki pages; with query it resolves a page id/title and returns its summary plus a path to open with read. For Clio's bundled product docs use context scope=docs.",
|
|
14
14
|
parameters: Type.Object({
|
|
15
|
+
source: Type.Optional(
|
|
16
|
+
StringEnum(["workspace", "clio"], {
|
|
17
|
+
description: "Code map source (default workspace).",
|
|
18
|
+
default: "workspace",
|
|
19
|
+
}),
|
|
20
|
+
),
|
|
15
21
|
mode: StringEnum(["symbol", "path", "entries", "outline", "deps", "dependents", "wiki"], {
|
|
16
22
|
description: "Lookup mode.",
|
|
17
23
|
}),
|