@iowarp/clio-coder 0.3.9 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +8 -16
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +8 -4
- package/src/cli/argv.ts +25 -0
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +50 -48
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/response-schema.ts +44 -4
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +24 -27
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/serving.ts +31 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +63 -11
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -7,40 +7,47 @@ import {
|
|
|
7
7
|
TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS,
|
|
8
8
|
runTaskMemoryPolicy,
|
|
9
9
|
taskMemoryBankDelta
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-I66EAJFY.js";
|
|
11
11
|
import {
|
|
12
12
|
isTerminalRunEnvelope
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-2VG7KLYV.js";
|
|
14
14
|
import {
|
|
15
15
|
taskBoardCounts
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-6DWBAZ5U.js";
|
|
17
17
|
import {
|
|
18
|
+
SKILL_INSTALL_OFFER_OPTION_NEVER,
|
|
19
|
+
SKILL_INSTALL_OFFER_OPTION_NOT_NOW,
|
|
20
|
+
SKILL_INSTALL_OFFER_OPTION_PROJECT,
|
|
21
|
+
SKILL_INSTALL_OFFER_OPTION_USER,
|
|
18
22
|
SKILL_SUGGESTION_ANCHOR,
|
|
19
23
|
SKILL_SUGGESTION_PREFIX
|
|
20
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-FSP7CMNU.js";
|
|
21
25
|
import {
|
|
22
26
|
legacyToolResultDigest,
|
|
23
27
|
sanitizeToolResultDigest
|
|
24
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-R23Z6K6I.js";
|
|
25
29
|
import {
|
|
26
30
|
ToolNames
|
|
27
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-K6BSR66V.js";
|
|
28
32
|
import {
|
|
29
33
|
registerForegroundStream
|
|
30
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-UEDMSP56.js";
|
|
31
35
|
import {
|
|
32
36
|
ceilChars
|
|
33
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-CWVRRIEI.js";
|
|
38
|
+
import {
|
|
39
|
+
BusChannels
|
|
40
|
+
} from "./chunk-HLW2MRKE.js";
|
|
34
41
|
import {
|
|
35
42
|
reportCommitAttributionDiagnostic,
|
|
36
43
|
withManagedGitCommitAttributionEnvironment
|
|
37
|
-
} from "./chunk-
|
|
38
|
-
import {
|
|
39
|
-
BusChannels
|
|
40
|
-
} from "./chunk-RKRLDWD3.js";
|
|
44
|
+
} from "./chunk-JIEGK6UF.js";
|
|
41
45
|
import {
|
|
42
46
|
require_dist
|
|
43
47
|
} from "./chunk-APJ265NV.js";
|
|
48
|
+
import {
|
|
49
|
+
clioConfigDir
|
|
50
|
+
} from "./chunk-BYP5D4HI.js";
|
|
44
51
|
import {
|
|
45
52
|
safeResourceWrite
|
|
46
53
|
} from "./chunk-WEPFGWHJ.js";
|
|
@@ -424,7 +431,7 @@ function cloneRuleDefinition(definition) {
|
|
|
424
431
|
function writeMiddlewareDiagnosticToStderr(diagnostic) {
|
|
425
432
|
if (diagnostic.kind === "hook_failed") {
|
|
426
433
|
process.stderr.write(
|
|
427
|
-
`[clio:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}
|
|
434
|
+
`[clio-coder:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}
|
|
428
435
|
`
|
|
429
436
|
);
|
|
430
437
|
return;
|
|
@@ -433,7 +440,7 @@ function writeMiddlewareDiagnosticToStderr(diagnostic) {
|
|
|
433
440
|
const stats = diagnostic.stats;
|
|
434
441
|
const trend = stats.window > 0 ? ` (slow on ${stats.overCount}/${stats.window} recent ${diagnostic.hook} calls, p95 ${stats.p95Ms.toFixed(1)}ms)` : "";
|
|
435
442
|
process.stderr.write(
|
|
436
|
-
`[clio:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ${diagnostic.elapsedMs.toFixed(1)}ms > ${diagnostic.budgetMs}ms${trend}
|
|
443
|
+
`[clio-coder:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ${diagnostic.elapsedMs.toFixed(1)}ms > ${diagnostic.budgetMs}ms${trend}
|
|
437
444
|
`
|
|
438
445
|
);
|
|
439
446
|
}
|
|
@@ -957,112 +964,112 @@ function validateMiddlewareEffect(value, source = "$") {
|
|
|
957
964
|
if (issues.length > 0 || effect === null) return { valid: false, issues };
|
|
958
965
|
return { valid: true, effect, issues: [] };
|
|
959
966
|
}
|
|
960
|
-
function readMiddlewareEffect(value,
|
|
967
|
+
function readMiddlewareEffect(value, path2, issues) {
|
|
961
968
|
if (!isRecord(value)) {
|
|
962
|
-
issues.push({ path, message: "expected middleware effect object" });
|
|
969
|
+
issues.push({ path: path2, message: "expected middleware effect object" });
|
|
963
970
|
return null;
|
|
964
971
|
}
|
|
965
972
|
const kindValue = value.kind;
|
|
966
973
|
if (typeof kindValue !== "string" || !isMiddlewareEffectKind(kindValue)) {
|
|
967
|
-
issues.push({ path: `${
|
|
974
|
+
issues.push({ path: `${path2}.kind`, message: "expected known middleware effect kind" });
|
|
968
975
|
return null;
|
|
969
976
|
}
|
|
970
977
|
switch (kindValue) {
|
|
971
978
|
case "inject_reminder":
|
|
972
|
-
return readInjectReminder(value,
|
|
979
|
+
return readInjectReminder(value, path2, issues);
|
|
973
980
|
case "annotate_tool_result":
|
|
974
|
-
return readAnnotateToolResult(value,
|
|
981
|
+
return readAnnotateToolResult(value, path2, issues);
|
|
975
982
|
case "block_tool":
|
|
976
|
-
return readBlockTool(value,
|
|
983
|
+
return readBlockTool(value, path2, issues);
|
|
977
984
|
case "protect_path":
|
|
978
|
-
return readProtectPath(value,
|
|
985
|
+
return readProtectPath(value, path2, issues);
|
|
979
986
|
case "request_continuation":
|
|
980
|
-
return readRequestContinuation(value,
|
|
987
|
+
return readRequestContinuation(value, path2, issues);
|
|
981
988
|
case "require_tool":
|
|
982
|
-
return readRequireTool(value,
|
|
989
|
+
return readRequireTool(value, path2, issues);
|
|
983
990
|
case "lock_tools":
|
|
984
|
-
rejectUnexpectedFields(value,
|
|
991
|
+
rejectUnexpectedFields(value, path2, ["kind"], issues);
|
|
985
992
|
return { kind: "lock_tools" };
|
|
986
993
|
}
|
|
987
994
|
}
|
|
988
|
-
function readRequireTool(record,
|
|
989
|
-
rejectUnexpectedFields(record,
|
|
990
|
-
const toolName = readRequiredString(record, `${
|
|
995
|
+
function readRequireTool(record, path2, issues) {
|
|
996
|
+
rejectUnexpectedFields(record, path2, ["kind", "toolName"], issues);
|
|
997
|
+
const toolName = readRequiredString(record, `${path2}.toolName`, issues);
|
|
991
998
|
return toolName === null ? null : { kind: "require_tool", toolName };
|
|
992
999
|
}
|
|
993
|
-
function readInjectReminder(record,
|
|
994
|
-
rejectUnexpectedFields(record,
|
|
995
|
-
const message = readRequiredString(record, `${
|
|
996
|
-
const severity = readOptionalString(record, `${
|
|
1000
|
+
function readInjectReminder(record, path2, issues) {
|
|
1001
|
+
rejectUnexpectedFields(record, path2, ["kind", "message", "severity"], issues);
|
|
1002
|
+
const message = readRequiredString(record, `${path2}.message`, issues);
|
|
1003
|
+
const severity = readOptionalString(record, `${path2}.severity`, issues);
|
|
997
1004
|
if (severity !== void 0 && !isMiddlewareReminderSeverity(severity)) {
|
|
998
|
-
issues.push({ path: `${
|
|
1005
|
+
issues.push({ path: `${path2}.severity`, message: "expected info, advisory, warn, or hard-block" });
|
|
999
1006
|
}
|
|
1000
1007
|
if (message === null) return null;
|
|
1001
1008
|
const effect = { kind: "inject_reminder", message };
|
|
1002
1009
|
if (severity !== void 0 && isMiddlewareReminderSeverity(severity)) effect.severity = severity;
|
|
1003
1010
|
return effect;
|
|
1004
1011
|
}
|
|
1005
|
-
function readAnnotateToolResult(record,
|
|
1006
|
-
rejectUnexpectedFields(record,
|
|
1007
|
-
const message = readRequiredString(record, `${
|
|
1008
|
-
const severity = readOptionalString(record, `${
|
|
1012
|
+
function readAnnotateToolResult(record, path2, issues) {
|
|
1013
|
+
rejectUnexpectedFields(record, path2, ["kind", "message", "severity"], issues);
|
|
1014
|
+
const message = readRequiredString(record, `${path2}.message`, issues);
|
|
1015
|
+
const severity = readOptionalString(record, `${path2}.severity`, issues);
|
|
1009
1016
|
if (severity !== void 0 && !isMiddlewareAnnotationSeverity(severity)) {
|
|
1010
|
-
issues.push({ path: `${
|
|
1017
|
+
issues.push({ path: `${path2}.severity`, message: "expected info or warn" });
|
|
1011
1018
|
}
|
|
1012
1019
|
if (message === null) return null;
|
|
1013
1020
|
const effect = { kind: "annotate_tool_result", message };
|
|
1014
1021
|
if (severity !== void 0 && isMiddlewareAnnotationSeverity(severity)) effect.severity = severity;
|
|
1015
1022
|
return effect;
|
|
1016
1023
|
}
|
|
1017
|
-
function readBlockTool(record,
|
|
1018
|
-
rejectUnexpectedFields(record,
|
|
1019
|
-
const reason = readRequiredString(record, `${
|
|
1020
|
-
const severity = readRequiredString(record, `${
|
|
1024
|
+
function readBlockTool(record, path2, issues) {
|
|
1025
|
+
rejectUnexpectedFields(record, path2, ["kind", "reason", "severity"], issues);
|
|
1026
|
+
const reason = readRequiredString(record, `${path2}.reason`, issues);
|
|
1027
|
+
const severity = readRequiredString(record, `${path2}.severity`, issues);
|
|
1021
1028
|
if (severity !== null && severity !== "hard-block") {
|
|
1022
|
-
issues.push({ path: `${
|
|
1029
|
+
issues.push({ path: `${path2}.severity`, message: "expected hard-block" });
|
|
1023
1030
|
}
|
|
1024
1031
|
if (reason === null || severity !== "hard-block") return null;
|
|
1025
1032
|
return { kind: "block_tool", reason, severity };
|
|
1026
1033
|
}
|
|
1027
|
-
function readProtectPath(record,
|
|
1028
|
-
rejectUnexpectedFields(record,
|
|
1029
|
-
const protectedPath = readRequiredString(record, `${
|
|
1030
|
-
const reason = readRequiredString(record, `${
|
|
1034
|
+
function readProtectPath(record, path2, issues) {
|
|
1035
|
+
rejectUnexpectedFields(record, path2, ["kind", "path", "reason"], issues);
|
|
1036
|
+
const protectedPath = readRequiredString(record, `${path2}.path`, issues);
|
|
1037
|
+
const reason = readRequiredString(record, `${path2}.reason`, issues);
|
|
1031
1038
|
if (protectedPath === null || reason === null) return null;
|
|
1032
1039
|
return { kind: "protect_path", path: protectedPath, reason };
|
|
1033
1040
|
}
|
|
1034
|
-
function readRequestContinuation(record,
|
|
1035
|
-
rejectUnexpectedFields(record,
|
|
1036
|
-
const message = readRequiredString(record, `${
|
|
1041
|
+
function readRequestContinuation(record, path2, issues) {
|
|
1042
|
+
rejectUnexpectedFields(record, path2, ["kind", "message"], issues);
|
|
1043
|
+
const message = readRequiredString(record, `${path2}.message`, issues);
|
|
1037
1044
|
if (message === null) return null;
|
|
1038
1045
|
return { kind: "request_continuation", message };
|
|
1039
1046
|
}
|
|
1040
|
-
function readRequiredString(record,
|
|
1041
|
-
const value = record[pathField(
|
|
1047
|
+
function readRequiredString(record, path2, issues) {
|
|
1048
|
+
const value = record[pathField(path2)];
|
|
1042
1049
|
if (typeof value !== "string" || value.trim().length === 0) {
|
|
1043
|
-
issues.push({ path, message: "expected non-empty string" });
|
|
1050
|
+
issues.push({ path: path2, message: "expected non-empty string" });
|
|
1044
1051
|
return null;
|
|
1045
1052
|
}
|
|
1046
1053
|
return value;
|
|
1047
1054
|
}
|
|
1048
|
-
function readOptionalString(record,
|
|
1049
|
-
const field = pathField(
|
|
1055
|
+
function readOptionalString(record, path2, issues) {
|
|
1056
|
+
const field = pathField(path2);
|
|
1050
1057
|
if (!Object.hasOwn(record, field)) return void 0;
|
|
1051
1058
|
const value = record[field];
|
|
1052
1059
|
if (typeof value !== "string" || value.trim().length === 0) {
|
|
1053
|
-
issues.push({ path, message: "expected non-empty string" });
|
|
1060
|
+
issues.push({ path: path2, message: "expected non-empty string" });
|
|
1054
1061
|
return void 0;
|
|
1055
1062
|
}
|
|
1056
1063
|
return value;
|
|
1057
1064
|
}
|
|
1058
|
-
function rejectUnexpectedFields(record,
|
|
1065
|
+
function rejectUnexpectedFields(record, path2, allowedFields, issues) {
|
|
1059
1066
|
const allowed = new Set(allowedFields);
|
|
1060
1067
|
for (const field of Object.keys(record).sort((a, b) => a.localeCompare(b))) {
|
|
1061
|
-
if (!allowed.has(field)) issues.push({ path: `${
|
|
1068
|
+
if (!allowed.has(field)) issues.push({ path: `${path2}.${field}`, message: "unexpected field" });
|
|
1062
1069
|
}
|
|
1063
1070
|
}
|
|
1064
|
-
function pathField(
|
|
1065
|
-
return
|
|
1071
|
+
function pathField(path2) {
|
|
1072
|
+
return path2.slice(path2.lastIndexOf(".") + 1);
|
|
1066
1073
|
}
|
|
1067
1074
|
function isRecord(value) {
|
|
1068
1075
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1383,16 +1390,425 @@ function spawnSyncCommandRunner() {
|
|
|
1383
1390
|
};
|
|
1384
1391
|
}
|
|
1385
1392
|
|
|
1393
|
+
// src/domains/middleware/skills-reminder.ts
|
|
1394
|
+
init_esm_shims();
|
|
1395
|
+
var SKILLS_REMINDER_REGISTRATION_ID = "observer.skills-reminder";
|
|
1396
|
+
function skillsReminderMessage(installed, installable = 0) {
|
|
1397
|
+
const counts = installable > 0 ? `${installed} installed, ${installable} installable from the marketplace` : `${installed} installed`;
|
|
1398
|
+
return `[Skills] ${counts}. Start this task by listing them with context(scope="skills") and checking for a match; if one matches, open your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose) and then continue the task in the same turn without the skill. Only the operator loads a skill, and a marketplace skill is offered for install when the operator runs it. If none match, do not mention skills and continue with the task.`;
|
|
1399
|
+
}
|
|
1400
|
+
var NO_EFFECTS = [];
|
|
1401
|
+
var GREETING_WORDS = /* @__PURE__ */ new Set([
|
|
1402
|
+
"hi",
|
|
1403
|
+
"hello",
|
|
1404
|
+
"hey",
|
|
1405
|
+
"heya",
|
|
1406
|
+
"hiya",
|
|
1407
|
+
"howdy",
|
|
1408
|
+
"yo",
|
|
1409
|
+
"sup",
|
|
1410
|
+
"hola",
|
|
1411
|
+
"greetings",
|
|
1412
|
+
"gm",
|
|
1413
|
+
"gn",
|
|
1414
|
+
"morning",
|
|
1415
|
+
"afternoon",
|
|
1416
|
+
"evening",
|
|
1417
|
+
"good",
|
|
1418
|
+
"day",
|
|
1419
|
+
"night",
|
|
1420
|
+
"there",
|
|
1421
|
+
"you",
|
|
1422
|
+
"clio",
|
|
1423
|
+
"thanks",
|
|
1424
|
+
"thank",
|
|
1425
|
+
"thankyou",
|
|
1426
|
+
"thx",
|
|
1427
|
+
"ty",
|
|
1428
|
+
"ok",
|
|
1429
|
+
"okay",
|
|
1430
|
+
"k",
|
|
1431
|
+
"cool",
|
|
1432
|
+
"nice",
|
|
1433
|
+
"test",
|
|
1434
|
+
"testing",
|
|
1435
|
+
"ping",
|
|
1436
|
+
"pong"
|
|
1437
|
+
]);
|
|
1438
|
+
function isSubstantiveUserTurn(text) {
|
|
1439
|
+
const normalized = (text ?? "").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, " ").replace(/\s+/g, " ").trim();
|
|
1440
|
+
if (normalized.length === 0) return false;
|
|
1441
|
+
const tokens = normalized.split(" ");
|
|
1442
|
+
if (tokens.length > 4) return true;
|
|
1443
|
+
return tokens.some((token) => !GREETING_WORDS.has(token));
|
|
1444
|
+
}
|
|
1445
|
+
function createSkillsReminderRegistration(deps) {
|
|
1446
|
+
let lastSeenSessionId;
|
|
1447
|
+
let spentForActiveSession = false;
|
|
1448
|
+
let observedFreshStart = false;
|
|
1449
|
+
let observedAnyTurn = false;
|
|
1450
|
+
return {
|
|
1451
|
+
id: SKILLS_REMINDER_REGISTRATION_ID,
|
|
1452
|
+
description: "once per session, on the first substantive turn, teaches the skill-suggestion reply protocol; keeps a turn going that stopped on the suggestion",
|
|
1453
|
+
hooks: ["turn_start", "turn_end"],
|
|
1454
|
+
evaluate(input) {
|
|
1455
|
+
if (input.hook === "turn_end") {
|
|
1456
|
+
return isSkillSuggestionWait(input) ? [{ kind: "request_continuation", message: SKILL_SUGGESTION_WAIT_CONTINUATION_MESSAGE }] : NO_EFFECTS;
|
|
1457
|
+
}
|
|
1458
|
+
const sessionId = input.sessionId ?? null;
|
|
1459
|
+
if (lastSeenSessionId === void 0) {
|
|
1460
|
+
lastSeenSessionId = sessionId;
|
|
1461
|
+
} else if (lastSeenSessionId === null && sessionId !== null) {
|
|
1462
|
+
lastSeenSessionId = sessionId;
|
|
1463
|
+
} else if (sessionId !== lastSeenSessionId) {
|
|
1464
|
+
lastSeenSessionId = sessionId;
|
|
1465
|
+
spentForActiveSession = false;
|
|
1466
|
+
observedFreshStart = false;
|
|
1467
|
+
observedAnyTurn = false;
|
|
1468
|
+
}
|
|
1469
|
+
if (spentForActiveSession) return NO_EFFECTS;
|
|
1470
|
+
const conversationMessages = metadataNumber(input, "conversationMessages");
|
|
1471
|
+
if (!observedAnyTurn) {
|
|
1472
|
+
observedAnyTurn = true;
|
|
1473
|
+
if (conversationMessages === null || conversationMessages > 0) {
|
|
1474
|
+
spentForActiveSession = true;
|
|
1475
|
+
return NO_EFFECTS;
|
|
1476
|
+
}
|
|
1477
|
+
observedFreshStart = true;
|
|
1478
|
+
}
|
|
1479
|
+
if (!observedFreshStart) {
|
|
1480
|
+
spentForActiveSession = true;
|
|
1481
|
+
return NO_EFFECTS;
|
|
1482
|
+
}
|
|
1483
|
+
if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS;
|
|
1484
|
+
spentForActiveSession = true;
|
|
1485
|
+
const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
|
|
1486
|
+
if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS;
|
|
1487
|
+
let installed = 0;
|
|
1488
|
+
let installable = 0;
|
|
1489
|
+
try {
|
|
1490
|
+
installed = deps.countModelVisibleSkills();
|
|
1491
|
+
installable = deps.countInstallableSkills?.() ?? 0;
|
|
1492
|
+
} catch {
|
|
1493
|
+
return NO_EFFECTS;
|
|
1494
|
+
}
|
|
1495
|
+
if (installed <= 0 && installable <= 0) return NO_EFFECTS;
|
|
1496
|
+
return [{ kind: "inject_reminder", severity: "info", message: skillsReminderMessage(installed, installable) }];
|
|
1497
|
+
}
|
|
1498
|
+
};
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
// src/domains/middleware/marketplace-offer.ts
|
|
1502
|
+
init_esm_shims();
|
|
1503
|
+
import { randomUUID } from "node:crypto";
|
|
1504
|
+
|
|
1505
|
+
// src/domains/resources/skills/promotion.ts
|
|
1506
|
+
init_esm_shims();
|
|
1507
|
+
import { existsSync, readFileSync as readFileSync2 } from "node:fs";
|
|
1508
|
+
import path from "node:path";
|
|
1509
|
+
var TOKEN_STOPWORDS = /* @__PURE__ */ new Set([
|
|
1510
|
+
"the",
|
|
1511
|
+
"a",
|
|
1512
|
+
"an",
|
|
1513
|
+
"and",
|
|
1514
|
+
"or",
|
|
1515
|
+
"for",
|
|
1516
|
+
"with",
|
|
1517
|
+
"this",
|
|
1518
|
+
"that",
|
|
1519
|
+
"when",
|
|
1520
|
+
"what",
|
|
1521
|
+
"how",
|
|
1522
|
+
"into",
|
|
1523
|
+
"from",
|
|
1524
|
+
"use",
|
|
1525
|
+
"used",
|
|
1526
|
+
"using",
|
|
1527
|
+
"one",
|
|
1528
|
+
"not",
|
|
1529
|
+
"skill",
|
|
1530
|
+
"skills",
|
|
1531
|
+
"clio",
|
|
1532
|
+
"please",
|
|
1533
|
+
"can",
|
|
1534
|
+
"you",
|
|
1535
|
+
"should",
|
|
1536
|
+
"would",
|
|
1537
|
+
"about",
|
|
1538
|
+
"need",
|
|
1539
|
+
"want",
|
|
1540
|
+
"help",
|
|
1541
|
+
"make",
|
|
1542
|
+
"file",
|
|
1543
|
+
"files",
|
|
1544
|
+
"code"
|
|
1545
|
+
]);
|
|
1546
|
+
function normalize(text) {
|
|
1547
|
+
return text.toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, " ").replace(/\s+/g, " ").trim();
|
|
1548
|
+
}
|
|
1549
|
+
function distinctiveTokens(text) {
|
|
1550
|
+
return new Set(
|
|
1551
|
+
normalize(text).split(" ").filter((token) => token.length >= 4 && !TOKEN_STOPWORDS.has(token))
|
|
1552
|
+
);
|
|
1553
|
+
}
|
|
1554
|
+
var TRIGGER_SCORE = 4;
|
|
1555
|
+
var TOKEN_FIRE_THRESHOLD = 3;
|
|
1556
|
+
function scorePromotionEntry(userText, entry) {
|
|
1557
|
+
const haystack = ` ${normalize(userText)} `;
|
|
1558
|
+
if (haystack.trim().length === 0) return null;
|
|
1559
|
+
for (const trigger of entry.triggers ?? []) {
|
|
1560
|
+
const phrase = normalize(trigger);
|
|
1561
|
+
if (phrase.length >= 4 && haystack.includes(` ${phrase} `)) {
|
|
1562
|
+
return { entry, score: TRIGGER_SCORE, matchedTrigger: trigger };
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
const requestTokens = distinctiveTokens(userText);
|
|
1566
|
+
if (requestTokens.size === 0) return null;
|
|
1567
|
+
const entryTokens = distinctiveTokens(`${entry.name.replace(/-/g, " ")} ${entry.description}`);
|
|
1568
|
+
let overlap = 0;
|
|
1569
|
+
for (const token of requestTokens) if (entryTokens.has(token)) overlap += 1;
|
|
1570
|
+
return overlap >= TOKEN_FIRE_THRESHOLD ? { entry, score: overlap } : null;
|
|
1571
|
+
}
|
|
1572
|
+
function matchMarketplaceSkills(userText, entries, excludedNames) {
|
|
1573
|
+
const matches = [];
|
|
1574
|
+
for (const entry of entries) {
|
|
1575
|
+
if (entry.kind !== "skill" || excludedNames.has(entry.name)) continue;
|
|
1576
|
+
const match = scorePromotionEntry(userText, entry);
|
|
1577
|
+
if (match) matches.push(match);
|
|
1578
|
+
}
|
|
1579
|
+
return matches.sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name));
|
|
1580
|
+
}
|
|
1581
|
+
var OWN_MARKETPLACE_URL_PREFIX = "https://github.com/iowarp/clio-coder/";
|
|
1582
|
+
function isOwnMarketplaceSource(entry) {
|
|
1583
|
+
const source = entry.sourceUrl.trim();
|
|
1584
|
+
if (/^(?:https?:\/\/|git@)/.test(source)) return source.startsWith(OWN_MARKETPLACE_URL_PREFIX);
|
|
1585
|
+
return entry.origin === "catalog" && path.isAbsolute(source);
|
|
1586
|
+
}
|
|
1587
|
+
function assertPromotionInstallSource(entry) {
|
|
1588
|
+
if (isOwnMarketplaceSource(entry)) return;
|
|
1589
|
+
throw new Error(
|
|
1590
|
+
`skill promotion: refusing to install "${entry.name}" from ${entry.sourceUrl}; promotion installs only from Clio's own marketplace (local catalog or ${OWN_MARKETPLACE_URL_PREFIX}). Install manually with clio-coder skills install if intended.`
|
|
1591
|
+
);
|
|
1592
|
+
}
|
|
1593
|
+
var PROMOTION_DECLINES_FILE = "skill-promotion-declines.json";
|
|
1594
|
+
function declineKey(name, version) {
|
|
1595
|
+
return `${name}@${version ?? ""}`;
|
|
1596
|
+
}
|
|
1597
|
+
function declinesPath(configDir) {
|
|
1598
|
+
return path.join(configDir ?? clioConfigDir(), PROMOTION_DECLINES_FILE);
|
|
1599
|
+
}
|
|
1600
|
+
function readPromotionDeclines(configDir) {
|
|
1601
|
+
const file = declinesPath(configDir);
|
|
1602
|
+
if (!existsSync(file)) return { never: {} };
|
|
1603
|
+
try {
|
|
1604
|
+
const parsed = JSON.parse(readFileSync2(file, "utf8"));
|
|
1605
|
+
const never = parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed.never : void 0;
|
|
1606
|
+
if (never && typeof never === "object" && !Array.isArray(never)) {
|
|
1607
|
+
const entries = Object.entries(never).filter(
|
|
1608
|
+
(pair) => typeof pair[1] === "string"
|
|
1609
|
+
);
|
|
1610
|
+
return { never: Object.fromEntries(entries) };
|
|
1611
|
+
}
|
|
1612
|
+
} catch {
|
|
1613
|
+
}
|
|
1614
|
+
return { never: {} };
|
|
1615
|
+
}
|
|
1616
|
+
function recordPromotionNeverDecline(name, version, configDir) {
|
|
1617
|
+
const store = readPromotionDeclines(configDir);
|
|
1618
|
+
store.never[declineKey(name, version)] = (/* @__PURE__ */ new Date()).toISOString();
|
|
1619
|
+
safeResourceWrite(declinesPath(configDir), `${JSON.stringify(store, null, 2)}
|
|
1620
|
+
`, { encoding: "utf8" });
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1623
|
+
// src/domains/middleware/marketplace-offer.ts
|
|
1624
|
+
var MARKETPLACE_OFFER_REGISTRATION_ID = "observer.marketplace-offer";
|
|
1625
|
+
var NO_EFFECTS2 = [];
|
|
1626
|
+
function offerBindingTag(offerTag) {
|
|
1627
|
+
return `[clio-install:${offerTag}]`;
|
|
1628
|
+
}
|
|
1629
|
+
function marketplaceOfferReminder(entry, offerTag) {
|
|
1630
|
+
return `[Marketplace] This request may need expertise no installed skill covers. The local marketplace has "${entry.name}" (not installed): ${entry.description} First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") whether to install ${entry.name}, offering exactly these options in this order: "${SKILL_INSTALL_OFFER_OPTION_PROJECT}", "${SKILL_INSTALL_OFFER_OPTION_USER}", "${SKILL_INSTALL_OFFER_OPTION_NOT_NOW}", "${SKILL_INSTALL_OFFER_OPTION_NEVER}". Include the exact tag ${offerBindingTag(offerTag)} verbatim in that question's text so the harness can bind the answer to this offer; the harness acts only on an answer carrying this tag. Then continue the task in the same turn. The harness handles the answer; never install or load a skill yourself. If it is not actually needed, do not mention it.`;
|
|
1631
|
+
}
|
|
1632
|
+
function marketplaceAutoInstallReminder(entry, result) {
|
|
1633
|
+
return `[Marketplace] Installed skill "${entry.name}" from Clio's own local marketplace (full-auto) to ${result.path}. Source ${result.sourceUrl}, sha256 ${result.installedHash}. ${entry.description} It is installed but not active \u2014 activation stays operator-gated. If it fits this task, suggest /skill ${entry.name} to the operator; never load it yourself.`;
|
|
1634
|
+
}
|
|
1635
|
+
function answersFromDetails(details) {
|
|
1636
|
+
const raw = details?.answers;
|
|
1637
|
+
if (!Array.isArray(raw)) return [];
|
|
1638
|
+
return raw.filter(
|
|
1639
|
+
(entry) => typeof entry === "object" && entry !== null && typeof entry.question === "string" && typeof entry.answer === "string"
|
|
1640
|
+
);
|
|
1641
|
+
}
|
|
1642
|
+
function chosenOfferOption(answer) {
|
|
1643
|
+
const labels = [
|
|
1644
|
+
SKILL_INSTALL_OFFER_OPTION_PROJECT,
|
|
1645
|
+
SKILL_INSTALL_OFFER_OPTION_USER,
|
|
1646
|
+
SKILL_INSTALL_OFFER_OPTION_NOT_NOW,
|
|
1647
|
+
SKILL_INSTALL_OFFER_OPTION_NEVER
|
|
1648
|
+
];
|
|
1649
|
+
for (const label of labels) {
|
|
1650
|
+
if (answer.options?.includes(label)) return label;
|
|
1651
|
+
}
|
|
1652
|
+
for (const label of labels) {
|
|
1653
|
+
if (answer.answer.includes(label)) return label;
|
|
1654
|
+
}
|
|
1655
|
+
return null;
|
|
1656
|
+
}
|
|
1657
|
+
function createMarketplaceOfferRegistration(deps) {
|
|
1658
|
+
const declines = deps.declines ?? {
|
|
1659
|
+
readNever: () => readPromotionDeclines().never,
|
|
1660
|
+
recordNever: (name, version) => recordPromotionNeverDecline(name, version)
|
|
1661
|
+
};
|
|
1662
|
+
const newOfferTag = deps.newOfferTag ?? (() => randomUUID());
|
|
1663
|
+
let lastSeenSessionId;
|
|
1664
|
+
let offeredNames = /* @__PURE__ */ new Set();
|
|
1665
|
+
let sessionDeclines = /* @__PURE__ */ new Set();
|
|
1666
|
+
let installedNamesCache = null;
|
|
1667
|
+
let marketplaceEntriesCache = null;
|
|
1668
|
+
let pendingOffer = null;
|
|
1669
|
+
const trackSession = (input) => {
|
|
1670
|
+
const sessionId = input.sessionId ?? null;
|
|
1671
|
+
if (lastSeenSessionId === void 0 || lastSeenSessionId === null && sessionId !== null) {
|
|
1672
|
+
lastSeenSessionId = sessionId;
|
|
1673
|
+
return;
|
|
1674
|
+
}
|
|
1675
|
+
if (sessionId !== lastSeenSessionId) {
|
|
1676
|
+
lastSeenSessionId = sessionId;
|
|
1677
|
+
offeredNames = /* @__PURE__ */ new Set();
|
|
1678
|
+
sessionDeclines = /* @__PURE__ */ new Set();
|
|
1679
|
+
pendingOffer = null;
|
|
1680
|
+
installedNamesCache = null;
|
|
1681
|
+
marketplaceEntriesCache = null;
|
|
1682
|
+
}
|
|
1683
|
+
};
|
|
1684
|
+
const bestMatch = (text) => {
|
|
1685
|
+
const installedWasCached = installedNamesCache !== null;
|
|
1686
|
+
let never;
|
|
1687
|
+
try {
|
|
1688
|
+
installedNamesCache ??= new Set(deps.listInstalledSkillNames());
|
|
1689
|
+
marketplaceEntriesCache ??= deps.listMarketplaceEntries();
|
|
1690
|
+
never = declines.readNever();
|
|
1691
|
+
} catch {
|
|
1692
|
+
return null;
|
|
1693
|
+
}
|
|
1694
|
+
const declinedKeys = /* @__PURE__ */ new Set([...Object.keys(never), ...sessionDeclines]);
|
|
1695
|
+
const findMatch = () => matchMarketplaceSkills(
|
|
1696
|
+
text,
|
|
1697
|
+
marketplaceEntriesCache ?? [],
|
|
1698
|
+
/* @__PURE__ */ new Set([...installedNamesCache ?? [], ...offeredNames])
|
|
1699
|
+
).find((candidate) => !declinedKeys.has(declineKey(candidate.entry.name, candidate.entry.version))) ?? null;
|
|
1700
|
+
let match = findMatch();
|
|
1701
|
+
if (match && installedWasCached) {
|
|
1702
|
+
try {
|
|
1703
|
+
installedNamesCache = new Set(deps.listInstalledSkillNames());
|
|
1704
|
+
} catch {
|
|
1705
|
+
return null;
|
|
1706
|
+
}
|
|
1707
|
+
match = findMatch();
|
|
1708
|
+
}
|
|
1709
|
+
return match;
|
|
1710
|
+
};
|
|
1711
|
+
const installGated = (entry, scope) => {
|
|
1712
|
+
assertPromotionInstallSource(entry);
|
|
1713
|
+
const result = deps.installEntry(entry, scope);
|
|
1714
|
+
installedNamesCache?.add(entry.name);
|
|
1715
|
+
return result;
|
|
1716
|
+
};
|
|
1717
|
+
const evaluateAskUserAnswers = (input) => {
|
|
1718
|
+
const offer = pendingOffer;
|
|
1719
|
+
if (!offer) return NO_EFFECTS2;
|
|
1720
|
+
const marker = offerBindingTag(offer.tag);
|
|
1721
|
+
if (input.toolResultDetails?.cancelled === true) {
|
|
1722
|
+
return NO_EFFECTS2;
|
|
1723
|
+
}
|
|
1724
|
+
for (const answer of answersFromDetails(input.toolResultDetails)) {
|
|
1725
|
+
if (!answer.question.includes(marker)) continue;
|
|
1726
|
+
const option = chosenOfferOption(answer);
|
|
1727
|
+
if (option === null) continue;
|
|
1728
|
+
pendingOffer = null;
|
|
1729
|
+
const offerKey = declineKey(offer.entry.name, offer.entry.version);
|
|
1730
|
+
if (option === SKILL_INSTALL_OFFER_OPTION_NOT_NOW) {
|
|
1731
|
+
sessionDeclines.add(offerKey);
|
|
1732
|
+
return NO_EFFECTS2;
|
|
1733
|
+
}
|
|
1734
|
+
if (option === SKILL_INSTALL_OFFER_OPTION_NEVER) {
|
|
1735
|
+
sessionDeclines.add(offerKey);
|
|
1736
|
+
try {
|
|
1737
|
+
declines.recordNever(offer.entry.name, offer.entry.version);
|
|
1738
|
+
} catch {
|
|
1739
|
+
}
|
|
1740
|
+
return NO_EFFECTS2;
|
|
1741
|
+
}
|
|
1742
|
+
const scope = option === SKILL_INSTALL_OFFER_OPTION_USER ? "user" : "project";
|
|
1743
|
+
try {
|
|
1744
|
+
const result = installGated(offer.entry, scope);
|
|
1745
|
+
return [
|
|
1746
|
+
{
|
|
1747
|
+
kind: "annotate_tool_result",
|
|
1748
|
+
severity: "info",
|
|
1749
|
+
message: `[Marketplace] Installed skill "${offer.entry.name}" (${scope} scope) to ${result.path}. It is installed but not active; the operator activates it with /skill ${offer.entry.name}.`
|
|
1750
|
+
}
|
|
1751
|
+
];
|
|
1752
|
+
} catch (error) {
|
|
1753
|
+
sessionDeclines.add(offerKey);
|
|
1754
|
+
return [
|
|
1755
|
+
{
|
|
1756
|
+
kind: "annotate_tool_result",
|
|
1757
|
+
severity: "warn",
|
|
1758
|
+
message: `[Marketplace] Install of "${offer.entry.name}" failed: ${error instanceof Error ? error.message : String(error)}. Continue the task without it.`
|
|
1759
|
+
}
|
|
1760
|
+
];
|
|
1761
|
+
}
|
|
1762
|
+
}
|
|
1763
|
+
return NO_EFFECTS2;
|
|
1764
|
+
};
|
|
1765
|
+
return {
|
|
1766
|
+
id: MARKETPLACE_OFFER_REGISTRATION_ID,
|
|
1767
|
+
description: "offers an uninstalled marketplace skill via ask_user when the request matches it; consented installs run gated to Clio's own marketplace, declines are remembered",
|
|
1768
|
+
hooks: ["turn_start", "after_tool"],
|
|
1769
|
+
evaluate(input) {
|
|
1770
|
+
trackSession(input);
|
|
1771
|
+
if (input.hook === "after_tool") {
|
|
1772
|
+
return input.toolName === ToolNames.AskUser ? evaluateAskUserAnswers(input) : NO_EFFECTS2;
|
|
1773
|
+
}
|
|
1774
|
+
if (input.hook !== "turn_start") return NO_EFFECTS2;
|
|
1775
|
+
if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS2;
|
|
1776
|
+
const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
|
|
1777
|
+
if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS2;
|
|
1778
|
+
const match = bestMatch(input.text ?? "");
|
|
1779
|
+
if (!match) return NO_EFFECTS2;
|
|
1780
|
+
offeredNames.add(match.entry.name);
|
|
1781
|
+
if (deps.getAutonomy() === "full-auto") {
|
|
1782
|
+
try {
|
|
1783
|
+
const result = installGated(match.entry, "project");
|
|
1784
|
+
return [
|
|
1785
|
+
{
|
|
1786
|
+
kind: "inject_reminder",
|
|
1787
|
+
severity: "info",
|
|
1788
|
+
message: marketplaceAutoInstallReminder(match.entry, result)
|
|
1789
|
+
}
|
|
1790
|
+
];
|
|
1791
|
+
} catch {
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
const tag = newOfferTag();
|
|
1795
|
+
pendingOffer = { entry: match.entry, tag };
|
|
1796
|
+
return [{ kind: "inject_reminder", severity: "info", message: marketplaceOfferReminder(match.entry, tag) }];
|
|
1797
|
+
}
|
|
1798
|
+
};
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1386
1801
|
// src/domains/middleware/memory-intervention.ts
|
|
1387
1802
|
init_esm_shims();
|
|
1388
1803
|
import { createHash as createHash2 } from "node:crypto";
|
|
1389
1804
|
var MEMORY_INTERVENTION_REGISTRATION_ID = "observer.memory-intervention";
|
|
1390
1805
|
var MEMORY_INTERVENTION_DEFAULT_WINDOW_STEPS = 8;
|
|
1391
|
-
var MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS =
|
|
1806
|
+
var MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS = 2e3;
|
|
1392
1807
|
var MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS = 10;
|
|
1808
|
+
var MEMORY_INTERVENTION_TIMEOUT_BACKOFF_THRESHOLD = 2;
|
|
1393
1809
|
var MEMORY_INTERVENTION_ACTIVITY_LIMIT = 20;
|
|
1394
1810
|
var CALL_DESCRIPTION_MAX_CHARS = 180;
|
|
1395
|
-
var
|
|
1811
|
+
var NO_EFFECTS3 = [];
|
|
1396
1812
|
function createMemoryInterventionRegistration(deps) {
|
|
1397
1813
|
const pending = /* @__PURE__ */ new Map();
|
|
1398
1814
|
const trajectory = [];
|
|
@@ -1416,21 +1832,22 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1416
1832
|
let outstandingStep = Promise.resolve();
|
|
1417
1833
|
let rulesInjectedSincePromptedStep = false;
|
|
1418
1834
|
let annotatedSinceTurnEnd = false;
|
|
1835
|
+
let consecutiveLlmTimeouts = 0;
|
|
1419
1836
|
return {
|
|
1420
1837
|
id: MEMORY_INTERVENTION_REGISTRATION_ID,
|
|
1421
1838
|
description: "maintain bounded task execution memory and selectively remind after repeated failures or compaction",
|
|
1422
1839
|
hooks: ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"],
|
|
1423
1840
|
evaluate(input) {
|
|
1424
|
-
if (!settings().enabled) return
|
|
1841
|
+
if (!settings().enabled) return NO_EFFECTS3;
|
|
1425
1842
|
try {
|
|
1426
1843
|
switch (input.hook) {
|
|
1427
1844
|
case "before_tool":
|
|
1428
1845
|
observeBeforeTool(input);
|
|
1429
|
-
return
|
|
1846
|
+
return NO_EFFECTS3;
|
|
1430
1847
|
case "after_tool":
|
|
1431
1848
|
return observeAfterTool(input);
|
|
1432
1849
|
case "turn_end": {
|
|
1433
|
-
if (toolStep <= lastTurnEndStep) return
|
|
1850
|
+
if (toolStep <= lastTurnEndStep) return NO_EFFECTS3;
|
|
1434
1851
|
const alreadyReported = annotatedSinceTurnEnd;
|
|
1435
1852
|
annotatedSinceTurnEnd = false;
|
|
1436
1853
|
const started = process.hrtime.bigint();
|
|
@@ -1449,9 +1866,9 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1449
1866
|
return effects;
|
|
1450
1867
|
}
|
|
1451
1868
|
case "on_compaction":
|
|
1452
|
-
if (input.metadata?.stage === "working_set_recall") return
|
|
1869
|
+
if (input.metadata?.stage === "working_set_recall") return NO_EFFECTS3;
|
|
1453
1870
|
reactivateAfterCompaction = true;
|
|
1454
|
-
return
|
|
1871
|
+
return NO_EFFECTS3;
|
|
1455
1872
|
case "turn_start": {
|
|
1456
1873
|
if (input.text?.trim()) currentTask = shortText(input.text, 2e3);
|
|
1457
1874
|
annotatedThisTurn.clear();
|
|
@@ -1474,7 +1891,7 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1474
1891
|
}
|
|
1475
1892
|
}
|
|
1476
1893
|
} catch {
|
|
1477
|
-
return
|
|
1894
|
+
return NO_EFFECTS3;
|
|
1478
1895
|
}
|
|
1479
1896
|
},
|
|
1480
1897
|
/**
|
|
@@ -1488,13 +1905,13 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1488
1905
|
* would have been buffered anyway.
|
|
1489
1906
|
*/
|
|
1490
1907
|
async evaluateAsync(input, context) {
|
|
1491
|
-
if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return
|
|
1908
|
+
if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS3;
|
|
1492
1909
|
const boundary = input.turnId ?? input.metadata?.userTurnId?.toString() ?? `tool-step:${toolStep}`;
|
|
1493
|
-
if (boundary === lastPromptedBoundary) return
|
|
1910
|
+
if (boundary === lastPromptedBoundary) return NO_EFFECTS3;
|
|
1494
1911
|
if (deps.deliversDeferredReminders === false) {
|
|
1495
1912
|
emitTelemetry([...pendingTriggers], "rules", "silent", "no_consumer", 0, 0, 0, process.hrtime.bigint());
|
|
1496
1913
|
pendingTriggers.clear();
|
|
1497
|
-
return
|
|
1914
|
+
return NO_EFFECTS3;
|
|
1498
1915
|
}
|
|
1499
1916
|
if (promptedStepInFlight) {
|
|
1500
1917
|
emitTelemetry(
|
|
@@ -1507,7 +1924,7 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1507
1924
|
0,
|
|
1508
1925
|
process.hrtime.bigint()
|
|
1509
1926
|
);
|
|
1510
|
-
return
|
|
1927
|
+
return NO_EFFECTS3;
|
|
1511
1928
|
}
|
|
1512
1929
|
lastPromptedBoundary = boundary;
|
|
1513
1930
|
const triggers = [...pendingTriggers];
|
|
@@ -1532,7 +1949,7 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1532
1949
|
}).finally(() => {
|
|
1533
1950
|
promptedStepInFlight = false;
|
|
1534
1951
|
});
|
|
1535
|
-
return
|
|
1952
|
+
return NO_EFFECTS3;
|
|
1536
1953
|
},
|
|
1537
1954
|
runPromptedStep,
|
|
1538
1955
|
signalLoop() {
|
|
@@ -1566,7 +1983,7 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1566
1983
|
inputTokens: 0,
|
|
1567
1984
|
outputTokens: 0,
|
|
1568
1985
|
usage: null,
|
|
1569
|
-
effects:
|
|
1986
|
+
effects: NO_EFFECTS3
|
|
1570
1987
|
});
|
|
1571
1988
|
const live = settings();
|
|
1572
1989
|
if (!live.enabled) {
|
|
@@ -1581,27 +1998,32 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1581
1998
|
let promptedResult;
|
|
1582
1999
|
let telemetryDecision = null;
|
|
1583
2000
|
try {
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
promptedResult = silent("no_client");
|
|
1587
|
-
} else if (deps.backgroundEndpointBusy?.() === true) {
|
|
1588
|
-
tier = "llm";
|
|
1589
|
-
promptedStepTier = tier;
|
|
1590
|
-
promptedResult = silent("endpoint_busy");
|
|
1591
|
-
telemetryDecision = "dropped";
|
|
2001
|
+
if (consecutiveLlmTimeouts >= MEMORY_INTERVENTION_TIMEOUT_BACKOFF_THRESHOLD) {
|
|
2002
|
+
promptedResult = silent("llm_timeout_backoff");
|
|
1592
2003
|
} else {
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
2004
|
+
const client = deps.getModelClient?.() ?? null;
|
|
2005
|
+
if (client === null) {
|
|
2006
|
+
promptedResult = silent("no_client");
|
|
2007
|
+
} else if (deps.backgroundEndpointBusy?.() === true) {
|
|
2008
|
+
tier = "llm";
|
|
2009
|
+
promptedStepTier = tier;
|
|
2010
|
+
promptedResult = silent("endpoint_busy");
|
|
2011
|
+
telemetryDecision = "dropped";
|
|
2012
|
+
} else {
|
|
2013
|
+
tier = "llm";
|
|
2014
|
+
promptedStepTier = tier;
|
|
2015
|
+
promptedResult = await runTaskMemoryPolicy(deps.bank, client, {
|
|
2016
|
+
task: input.task?.trim() || currentTask,
|
|
2017
|
+
trajectory: [...trajectory],
|
|
2018
|
+
deterministicTrigger: input.deterministicTrigger,
|
|
2019
|
+
maxTokens: live.maxTokens,
|
|
2020
|
+
modelMaxTokens: positiveInteger(deps.getModelMaxTokens?.(live.maxTokens), live.maxTokens),
|
|
2021
|
+
...input.suppressIntervention === void 0 ? {} : { suppressIntervention: input.suppressIntervention },
|
|
2022
|
+
previousReminder: lastInjectedMessage,
|
|
2023
|
+
timeoutMs: live.timeoutMs,
|
|
2024
|
+
...deps.onEnvelope === void 0 ? {} : { onEnvelope: deps.onEnvelope }
|
|
2025
|
+
});
|
|
2026
|
+
}
|
|
1605
2027
|
}
|
|
1606
2028
|
} catch (error) {
|
|
1607
2029
|
promptedResult = silent("client_error");
|
|
@@ -1617,6 +2039,8 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1617
2039
|
error: error instanceof Error ? error.message : "resolving the background model client failed"
|
|
1618
2040
|
});
|
|
1619
2041
|
}
|
|
2042
|
+
if (tier === "llm" && promptedResult.decision === "timeout") consecutiveLlmTimeouts += 1;
|
|
2043
|
+
else if (tier === "llm" && telemetryDecision !== "dropped") consecutiveLlmTimeouts = 0;
|
|
1620
2044
|
lastDecision = promptedResult.decision;
|
|
1621
2045
|
if (promptedResult.usage !== null) {
|
|
1622
2046
|
try {
|
|
@@ -1638,7 +2062,7 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1638
2062
|
);
|
|
1639
2063
|
return {
|
|
1640
2064
|
...promptedResult,
|
|
1641
|
-
effects: promptedResult.reminder === null ?
|
|
2065
|
+
effects: promptedResult.reminder === null ? NO_EFFECTS3 : [{ kind: "inject_reminder", message: promptedResult.reminder, severity: "advisory" }]
|
|
1642
2066
|
};
|
|
1643
2067
|
}
|
|
1644
2068
|
function emitTelemetry(triggerReasons, tier, decision, reason, citedEntries2, inputTokens, outputTokens, started, operations = { bankOperations: 0, droppedOperations: 0 }) {
|
|
@@ -1699,7 +2123,7 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1699
2123
|
}
|
|
1700
2124
|
function observeAfterTool(input) {
|
|
1701
2125
|
const fallback = prepareToolStep(input);
|
|
1702
|
-
if (fallback === null) return
|
|
2126
|
+
if (fallback === null) return NO_EFFECTS3;
|
|
1703
2127
|
const key = pendingKey(input, fallback.operationFingerprint);
|
|
1704
2128
|
const prepared = pending.get(key) ?? fallback;
|
|
1705
2129
|
pending.delete(key);
|
|
@@ -1724,22 +2148,22 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1724
2148
|
};
|
|
1725
2149
|
trajectory.push(step);
|
|
1726
2150
|
if (trajectory.length > live.windowSteps) trajectory.splice(0, trajectory.length - live.windowSteps);
|
|
1727
|
-
if (outcome !== "error") return
|
|
2151
|
+
if (outcome !== "error") return NO_EFFECTS3;
|
|
1728
2152
|
rememberFailure(step);
|
|
1729
2153
|
return annotateRepeatedFailure(step);
|
|
1730
2154
|
}
|
|
1731
2155
|
function annotateRepeatedFailure(step) {
|
|
1732
|
-
if (annotatedThisTurn.has(step.operationFingerprint)) return
|
|
2156
|
+
if (annotatedThisTurn.has(step.operationFingerprint)) return NO_EFFECTS3;
|
|
1733
2157
|
const occurrences = trajectory.filter(
|
|
1734
2158
|
(candidate) => candidate.outcome === "error" && candidate.operationFingerprint === step.operationFingerprint
|
|
1735
2159
|
).length;
|
|
1736
2160
|
const failure = failures.get(step.operationFingerprint);
|
|
1737
|
-
if (occurrences < 2 || failure === void 0) return
|
|
2161
|
+
if (occurrences < 2 || failure === void 0) return NO_EFFECTS3;
|
|
1738
2162
|
const message = boundedReminder(
|
|
1739
2163
|
`Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}. Change the approach rather than repeating it.`,
|
|
1740
2164
|
settings().maxTokens
|
|
1741
2165
|
);
|
|
1742
|
-
if (message.length === 0) return
|
|
2166
|
+
if (message.length === 0) return NO_EFFECTS3;
|
|
1743
2167
|
annotatedThisTurn.add(step.operationFingerprint);
|
|
1744
2168
|
lastInjectedOperationFingerprint = step.operationFingerprint;
|
|
1745
2169
|
lastDecision = "injected";
|
|
@@ -1793,7 +2217,7 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1793
2217
|
`Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}.`,
|
|
1794
2218
|
settings().maxTokens
|
|
1795
2219
|
);
|
|
1796
|
-
if (message.length === 0) return
|
|
2220
|
+
if (message.length === 0) return NO_EFFECTS3;
|
|
1797
2221
|
lastInjectedOperationFingerprint = step.operationFingerprint;
|
|
1798
2222
|
lastInjectedMessage = message;
|
|
1799
2223
|
lastDecision = "injected";
|
|
@@ -1802,13 +2226,13 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1802
2226
|
return [{ kind: "inject_reminder", message, severity: "advisory" }];
|
|
1803
2227
|
}
|
|
1804
2228
|
lastDecision = "silent";
|
|
1805
|
-
return
|
|
2229
|
+
return NO_EFFECTS3;
|
|
1806
2230
|
} finally {
|
|
1807
2231
|
lastTurnEndStep = toolStep;
|
|
1808
2232
|
}
|
|
1809
2233
|
}
|
|
1810
2234
|
function reactivateKnowledge() {
|
|
1811
|
-
if (!reactivateAfterCompaction) return
|
|
2235
|
+
if (!reactivateAfterCompaction) return NO_EFFECTS3;
|
|
1812
2236
|
reactivateAfterCompaction = false;
|
|
1813
2237
|
const prefix = "Memory: execution state restored after compaction:\n";
|
|
1814
2238
|
const maxTokens = settings().maxTokens;
|
|
@@ -1816,12 +2240,12 @@ function createMemoryInterventionRegistration(deps) {
|
|
|
1816
2240
|
const rendered = deps.bank.renderRestoredState(Math.max(0, maxTokens - prefixTokens));
|
|
1817
2241
|
if (rendered.length === 0) {
|
|
1818
2242
|
lastDecision = "silent";
|
|
1819
|
-
return
|
|
2243
|
+
return NO_EFFECTS3;
|
|
1820
2244
|
}
|
|
1821
2245
|
const message = boundedReminder(`${prefix}${rendered}`, maxTokens);
|
|
1822
2246
|
if (message.length === 0) {
|
|
1823
2247
|
lastDecision = "silent";
|
|
1824
|
-
return
|
|
2248
|
+
return NO_EFFECTS3;
|
|
1825
2249
|
}
|
|
1826
2250
|
const citedIds = [...message.matchAll(/\[([^\]]+)\]/gu)].map((match) => match[1]).filter((id) => id !== void 0);
|
|
1827
2251
|
deps.bank.recordInjection(citedIds);
|
|
@@ -1920,114 +2344,6 @@ function announceMemoryStepEndpoint(deps, complete) {
|
|
|
1920
2344
|
};
|
|
1921
2345
|
}
|
|
1922
2346
|
|
|
1923
|
-
// src/domains/middleware/skills-reminder.ts
|
|
1924
|
-
init_esm_shims();
|
|
1925
|
-
var SKILLS_REMINDER_REGISTRATION_ID = "observer.skills-reminder";
|
|
1926
|
-
function skillsReminderMessage(installed, installable = 0) {
|
|
1927
|
-
const counts = installable > 0 ? `${installed} installed, ${installable} installable from the marketplace` : `${installed} installed`;
|
|
1928
|
-
return `[Skills] ${counts}. Start this task by listing them with context(scope="skills") and checking for a match; if one matches, open your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose) and then continue the task in the same turn without the skill. Only the operator loads a skill, and a marketplace skill is offered for install when the operator runs it. If none match, do not mention skills and continue with the task.`;
|
|
1929
|
-
}
|
|
1930
|
-
var NO_EFFECTS2 = [];
|
|
1931
|
-
var GREETING_WORDS = /* @__PURE__ */ new Set([
|
|
1932
|
-
"hi",
|
|
1933
|
-
"hello",
|
|
1934
|
-
"hey",
|
|
1935
|
-
"heya",
|
|
1936
|
-
"hiya",
|
|
1937
|
-
"howdy",
|
|
1938
|
-
"yo",
|
|
1939
|
-
"sup",
|
|
1940
|
-
"hola",
|
|
1941
|
-
"greetings",
|
|
1942
|
-
"gm",
|
|
1943
|
-
"gn",
|
|
1944
|
-
"morning",
|
|
1945
|
-
"afternoon",
|
|
1946
|
-
"evening",
|
|
1947
|
-
"good",
|
|
1948
|
-
"day",
|
|
1949
|
-
"night",
|
|
1950
|
-
"there",
|
|
1951
|
-
"you",
|
|
1952
|
-
"clio",
|
|
1953
|
-
"thanks",
|
|
1954
|
-
"thank",
|
|
1955
|
-
"thankyou",
|
|
1956
|
-
"thx",
|
|
1957
|
-
"ty",
|
|
1958
|
-
"ok",
|
|
1959
|
-
"okay",
|
|
1960
|
-
"k",
|
|
1961
|
-
"cool",
|
|
1962
|
-
"nice",
|
|
1963
|
-
"test",
|
|
1964
|
-
"testing",
|
|
1965
|
-
"ping",
|
|
1966
|
-
"pong"
|
|
1967
|
-
]);
|
|
1968
|
-
function isSubstantiveUserTurn(text) {
|
|
1969
|
-
const normalized = (text ?? "").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, " ").replace(/\s+/g, " ").trim();
|
|
1970
|
-
if (normalized.length === 0) return false;
|
|
1971
|
-
const tokens = normalized.split(" ");
|
|
1972
|
-
if (tokens.length > 4) return true;
|
|
1973
|
-
return tokens.some((token) => !GREETING_WORDS.has(token));
|
|
1974
|
-
}
|
|
1975
|
-
function createSkillsReminderRegistration(deps) {
|
|
1976
|
-
let lastSeenSessionId;
|
|
1977
|
-
let spentForActiveSession = false;
|
|
1978
|
-
let observedFreshStart = false;
|
|
1979
|
-
let observedAnyTurn = false;
|
|
1980
|
-
return {
|
|
1981
|
-
id: SKILLS_REMINDER_REGISTRATION_ID,
|
|
1982
|
-
description: "once per session, on the first substantive turn, teaches the skill-suggestion reply protocol; keeps a turn going that stopped on the suggestion",
|
|
1983
|
-
hooks: ["turn_start", "turn_end"],
|
|
1984
|
-
evaluate(input) {
|
|
1985
|
-
if (input.hook === "turn_end") {
|
|
1986
|
-
return isSkillSuggestionWait(input) ? [{ kind: "request_continuation", message: SKILL_SUGGESTION_WAIT_CONTINUATION_MESSAGE }] : NO_EFFECTS2;
|
|
1987
|
-
}
|
|
1988
|
-
const sessionId = input.sessionId ?? null;
|
|
1989
|
-
if (lastSeenSessionId === void 0) {
|
|
1990
|
-
lastSeenSessionId = sessionId;
|
|
1991
|
-
} else if (lastSeenSessionId === null && sessionId !== null) {
|
|
1992
|
-
lastSeenSessionId = sessionId;
|
|
1993
|
-
} else if (sessionId !== lastSeenSessionId) {
|
|
1994
|
-
lastSeenSessionId = sessionId;
|
|
1995
|
-
spentForActiveSession = false;
|
|
1996
|
-
observedFreshStart = false;
|
|
1997
|
-
observedAnyTurn = false;
|
|
1998
|
-
}
|
|
1999
|
-
if (spentForActiveSession) return NO_EFFECTS2;
|
|
2000
|
-
const conversationMessages = metadataNumber(input, "conversationMessages");
|
|
2001
|
-
if (!observedAnyTurn) {
|
|
2002
|
-
observedAnyTurn = true;
|
|
2003
|
-
if (conversationMessages === null || conversationMessages > 0) {
|
|
2004
|
-
spentForActiveSession = true;
|
|
2005
|
-
return NO_EFFECTS2;
|
|
2006
|
-
}
|
|
2007
|
-
observedFreshStart = true;
|
|
2008
|
-
}
|
|
2009
|
-
if (!observedFreshStart) {
|
|
2010
|
-
spentForActiveSession = true;
|
|
2011
|
-
return NO_EFFECTS2;
|
|
2012
|
-
}
|
|
2013
|
-
if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS2;
|
|
2014
|
-
spentForActiveSession = true;
|
|
2015
|
-
const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
|
|
2016
|
-
if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS2;
|
|
2017
|
-
let installed = 0;
|
|
2018
|
-
let installable = 0;
|
|
2019
|
-
try {
|
|
2020
|
-
installed = deps.countModelVisibleSkills();
|
|
2021
|
-
installable = deps.countInstallableSkills?.() ?? 0;
|
|
2022
|
-
} catch {
|
|
2023
|
-
return NO_EFFECTS2;
|
|
2024
|
-
}
|
|
2025
|
-
if (installed <= 0 && installable <= 0) return NO_EFFECTS2;
|
|
2026
|
-
return [{ kind: "inject_reminder", severity: "info", message: skillsReminderMessage(installed, installable) }];
|
|
2027
|
-
}
|
|
2028
|
-
};
|
|
2029
|
-
}
|
|
2030
|
-
|
|
2031
2347
|
// src/domains/middleware/task-board-reminder.ts
|
|
2032
2348
|
init_esm_shims();
|
|
2033
2349
|
var TASK_BOARD_REMINDER_REGISTRATION_ID = "observer.task-board-reminder";
|
|
@@ -2054,7 +2370,7 @@ function countEnumeratedSteps(text) {
|
|
|
2054
2370
|
const bulletLines = value.split(/\r?\n/).filter((line) => /^\s*[-*]\s+\S/.test(line)).length;
|
|
2055
2371
|
return bulletLines >= 3 ? bulletLines : 0;
|
|
2056
2372
|
}
|
|
2057
|
-
var
|
|
2373
|
+
var NO_EFFECTS4 = [];
|
|
2058
2374
|
function createTaskBoardReminderRegistration() {
|
|
2059
2375
|
let lastSeenSessionId;
|
|
2060
2376
|
let spentForActiveSession = false;
|
|
@@ -2070,12 +2386,12 @@ function createTaskBoardReminderRegistration() {
|
|
|
2070
2386
|
lastSeenSessionId = sessionId;
|
|
2071
2387
|
spentForActiveSession = false;
|
|
2072
2388
|
}
|
|
2073
|
-
if (spentForActiveSession) return
|
|
2389
|
+
if (spentForActiveSession) return NO_EFFECTS4;
|
|
2074
2390
|
const steps = countEnumeratedSteps(input.text);
|
|
2075
|
-
if (steps < 3) return
|
|
2391
|
+
if (steps < 3) return NO_EFFECTS4;
|
|
2076
2392
|
spentForActiveSession = true;
|
|
2077
2393
|
const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
|
|
2078
|
-
if (pendingSkillRequests !== null && pendingSkillRequests > 0) return
|
|
2394
|
+
if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS4;
|
|
2079
2395
|
return [{ kind: "inject_reminder", severity: "info", message: taskBoardReminderMessage(steps) }];
|
|
2080
2396
|
}
|
|
2081
2397
|
};
|
|
@@ -2157,7 +2473,7 @@ var WATCHDOG_DIFF_MAX_BYTES = 12 * 1024;
|
|
|
2157
2473
|
var WATCHDOG_PATHS_MAX = 40;
|
|
2158
2474
|
var WATCHDOG_TRUNCATION_MARKER = "\n[diff truncated]";
|
|
2159
2475
|
var MUTATING_TOOL_NAMES = /* @__PURE__ */ new Set([ToolNames.Write, ToolNames.Edit, ToolNames.Artifact]);
|
|
2160
|
-
var
|
|
2476
|
+
var NO_EFFECTS5 = [];
|
|
2161
2477
|
function stringValue2(value) {
|
|
2162
2478
|
return typeof value === "string" && value.length > 0 ? value : null;
|
|
2163
2479
|
}
|
|
@@ -2165,20 +2481,20 @@ function firstPath(details) {
|
|
|
2165
2481
|
const paths = details?.paths;
|
|
2166
2482
|
if (!Array.isArray(paths)) return null;
|
|
2167
2483
|
for (const entry of paths) {
|
|
2168
|
-
const
|
|
2169
|
-
if (
|
|
2484
|
+
const path2 = stringValue2(entry);
|
|
2485
|
+
if (path2 !== null) return path2;
|
|
2170
2486
|
}
|
|
2171
2487
|
return null;
|
|
2172
2488
|
}
|
|
2173
2489
|
function coalesceTurnDiff(byPath, maxBytes = WATCHDOG_DIFF_MAX_BYTES) {
|
|
2174
2490
|
const blocks = [];
|
|
2175
2491
|
let index = 0;
|
|
2176
|
-
for (const [
|
|
2492
|
+
for (const [path2, diff] of byPath) {
|
|
2177
2493
|
if (index >= WATCHDOG_PATHS_MAX) {
|
|
2178
2494
|
blocks.push(`[${byPath.size - WATCHDOG_PATHS_MAX} more changed path(s) omitted]`);
|
|
2179
2495
|
break;
|
|
2180
2496
|
}
|
|
2181
|
-
blocks.push(`--- ${
|
|
2497
|
+
blocks.push(`--- ${path2}
|
|
2182
2498
|
${diff}`);
|
|
2183
2499
|
index += 1;
|
|
2184
2500
|
}
|
|
@@ -2270,19 +2586,19 @@ function createWatchdogRegistration(deps) {
|
|
|
2270
2586
|
const settings = active();
|
|
2271
2587
|
if (settings === null) {
|
|
2272
2588
|
if (input.hook === "turn_end") resetTurn();
|
|
2273
|
-
return
|
|
2589
|
+
return NO_EFFECTS5;
|
|
2274
2590
|
}
|
|
2275
2591
|
if (input.hook === "after_tool") {
|
|
2276
2592
|
toolCalls += 1;
|
|
2277
2593
|
recordMutation(input);
|
|
2278
2594
|
const cadence = settings.cadenceToolCalls;
|
|
2279
2595
|
if (cadence !== void 0 && cadence >= 1 && toolCalls % cadence === 0) fire("cadence");
|
|
2280
|
-
return
|
|
2596
|
+
return NO_EFFECTS5;
|
|
2281
2597
|
}
|
|
2282
|
-
if (input.hook !== "turn_end") return
|
|
2598
|
+
if (input.hook !== "turn_end") return NO_EFFECTS5;
|
|
2283
2599
|
fire("turn_end");
|
|
2284
2600
|
resetTurn();
|
|
2285
|
-
return
|
|
2601
|
+
return NO_EFFECTS5;
|
|
2286
2602
|
},
|
|
2287
2603
|
droppedTriggers: () => dropped,
|
|
2288
2604
|
runInFlight: () => inFlight,
|
|
@@ -2447,9 +2763,10 @@ export {
|
|
|
2447
2763
|
loadUserHooks,
|
|
2448
2764
|
readHookSources,
|
|
2449
2765
|
installUserHooks,
|
|
2766
|
+
createSkillsReminderRegistration,
|
|
2767
|
+
createMarketplaceOfferRegistration,
|
|
2450
2768
|
createMemoryInterventionRegistration,
|
|
2451
2769
|
announceMemoryStepEndpoint,
|
|
2452
|
-
createSkillsReminderRegistration,
|
|
2453
2770
|
createTaskBoardReminderRegistration,
|
|
2454
2771
|
createTaskNudgeRegistration,
|
|
2455
2772
|
createMiddlewareToolChoiceControl,
|
|
@@ -2458,4 +2775,4 @@ export {
|
|
|
2458
2775
|
createWatchdogRegistration,
|
|
2459
2776
|
MiddlewareDomainModule
|
|
2460
2777
|
};
|
|
2461
|
-
//# sourceMappingURL=chunk-
|
|
2778
|
+
//# sourceMappingURL=chunk-JA5QWE4Z.js.map
|