@iowarp/clio-coder 0.4.2 → 0.4.4
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 +98 -0
- package/CONTRIBUTING.md +86 -19
- package/README.md +35 -6
- package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
- package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
- package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
- package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
- package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
- package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
- package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
- package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
- package/dist/chunk-2DSOYNFC.js +108 -0
- package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
- package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
- package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
- package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
- package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
- package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
- package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
- package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
- package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
- package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
- package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
- package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
- package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
- package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
- package/dist/chunk-57XXR6DR.js +3763 -0
- package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
- package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
- package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
- package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
- package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
- package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
- package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
- package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
- package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
- package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
- package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
- package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
- package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
- package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
- package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
- package/dist/chunk-DQOVN6KV.js +386 -0
- package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
- package/dist/chunk-DXKJURES.js +671 -0
- package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
- package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
- package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
- package/dist/chunk-EXLD33WO.js +381 -0
- package/dist/chunk-FEAXX7B6.js +101 -0
- package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
- package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
- package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
- package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
- package/dist/chunk-GX5WYQO4.js +59 -0
- package/dist/chunk-GYV6VZOC.js +26 -0
- package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
- package/dist/chunk-I2DWJ4GM.js +390 -0
- package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
- package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
- package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
- package/dist/chunk-IRXAATOX.js +539 -0
- package/dist/chunk-IXIY2H4R.js +44 -0
- package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
- package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
- package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
- package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
- package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
- package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
- package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
- package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
- package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
- package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
- package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
- package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
- package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
- package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
- package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
- package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
- package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
- package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
- package/dist/chunk-ODGTEFFI.js +50 -0
- package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
- package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
- package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
- package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
- package/dist/chunk-R6Q67RJH.js +134 -0
- package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
- package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
- package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
- package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
- package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
- package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
- package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
- package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
- package/dist/chunk-UOIZ7DA4.js +41 -0
- package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
- package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
- package/dist/chunk-V76WTFTW.js +318 -0
- package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
- package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
- package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
- package/dist/chunk-XXYSBZIQ.js +283 -0
- package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
- package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
- package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
- package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
- package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
- package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
- package/dist/cli/index.js +42 -40
- package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
- package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
- package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
- package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
- package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
- package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
- package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
- package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
- package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
- package/dist/context-map-COB37XXN.js +505 -0
- package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
- package/dist/detail-A7JAVSIG.js +98 -0
- package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
- package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
- package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
- package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
- package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
- package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
- package/dist/evidence-4F5USFKH.js +208 -0
- package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
- package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
- package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
- package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
- package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
- package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
- package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
- package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
- package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
- package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
- package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
- package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
- package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
- package/dist/inventory-C26CFDRR.js +101 -0
- package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
- package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
- package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
- package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
- package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
- package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
- package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
- package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
- package/dist/reset-TNWTB5LU.js +343 -0
- package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
- package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
- package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
- package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
- package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
- package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
- package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
- package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
- package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
- package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
- package/dist/tasks-IPAGMEIX.js +36 -0
- package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
- package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
- package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
- package/dist/uninstall-HALS6BLF.js +407 -0
- package/dist/upgrade-MS72RJEP.js +306 -0
- package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
- package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
- package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
- package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
- package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
- package/dist/worker/entry.js +72 -68
- package/docs/README.md +3 -2
- package/docs/architecture/acp.md +17 -0
- package/docs/architecture/artifact-placement.md +1 -0
- package/docs/architecture/artifact-versions.md +2 -2
- package/docs/architecture/context-engine.md +4 -0
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +1 -1
- package/docs/architecture/middleware-and-components.md +1 -1
- package/docs/architecture/model-catalog.md +21 -10
- package/docs/architecture/observability.md +19 -2
- package/docs/architecture/prompt-envelope-and-tools.md +17 -5
- package/docs/architecture/provider-adapter-cookbook.md +63 -0
- package/docs/architecture/safety-model.md +25 -22
- package/docs/architecture/tui-design.md +1 -1
- package/docs/guide/built-in-agents.md +25 -11
- package/docs/guide/commands-and-modes.md +18 -3
- package/docs/guide/configuration-and-targets.md +100 -10
- package/docs/guide/configuration-reference.md +17 -7
- package/docs/guide/environment-variables.md +4 -2
- package/docs/guide/installation-and-lifecycle.md +37 -4
- package/docs/guide/proactive-memory.md +66 -55
- package/docs/guide/skills-marketplace.md +18 -0
- package/docs/guide/tool-usage.md +78 -3
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +40 -2
- package/docs/process/eval-runner.md +67 -3
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/evals/behavioral-model.yaml +3 -2
- package/package.json +2 -2
- package/skills/README.md +7 -5
- package/skills/coding/ast-grep/SKILL.md +101 -30
- package/skills/coding/ast-grep/evals.md +26 -0
- package/skills/coding/coding-standards/SKILL.md +47 -2
- package/skills/coding/coding-standards/evals.md +23 -0
- package/skills/coding/prototype/SKILL.md +87 -28
- package/skills/coding/prototype/evals.md +19 -0
- package/skills/coding/tdd/SKILL.md +80 -53
- package/skills/coding/tdd/evals.md +20 -0
- package/skills/context/context-handoff/SKILL.md +43 -2
- package/skills/context/context-handoff/evals.md +44 -0
- package/skills/context/context-prime/SKILL.md +45 -15
- package/skills/context/context-prime/evals.md +45 -0
- package/skills/git/branch-closeout/SKILL.md +132 -0
- package/skills/git/branch-closeout/evals.md +133 -0
- package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
- package/skills/git/file-ticket/SKILL.md +77 -63
- package/skills/git/file-ticket/assets/issue-template.md +22 -0
- package/skills/git/file-ticket/evals.md +31 -26
- package/skills/git/file-ticket/references/issue-discovery.md +49 -0
- package/skills/git/fix-issue/SKILL.md +87 -64
- package/skills/git/fix-issue/evals.md +35 -31
- package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
- package/skills/git/resolve-merge-conflicts/evals.md +52 -25
- package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
- package/skills/git/ship/SKILL.md +103 -67
- package/skills/git/ship/assets/pr-template.md +21 -0
- package/skills/git/ship/evals.md +44 -28
- package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
- package/skills/git/worktree-create/SKILL.md +80 -50
- package/skills/git/worktree-create/evals.md +40 -33
- package/skills/git/worktree-create/references/worktree-setup.md +62 -66
- package/skills/git/worktree-merge/SKILL.md +112 -65
- package/skills/git/worktree-merge/evals.md +42 -34
- package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
- package/skills/planning/archify/SKILL.md +196 -0
- package/skills/planning/archify/evals.md +65 -0
- package/skills/planning/architecture/SKILL.md +61 -12
- package/skills/planning/architecture/evals.md +65 -0
- package/skills/planning/backlog/SKILL.md +130 -14
- package/skills/planning/backlog/evals.md +142 -0
- package/skills/planning/prd/SKILL.md +47 -6
- package/skills/planning/prd/evals.md +54 -0
- package/skills/planning/product-intent/SKILL.md +57 -2
- package/skills/planning/product-intent/evals.md +70 -0
- package/skills/planning/tech-spec/SKILL.md +53 -2
- package/skills/planning/tech-spec/evals.md +73 -0
- package/skills/registry.yaml +58 -50
- package/skills/remote.yaml +13 -0
- package/skills/research/arxiv-literature/SKILL.md +76 -18
- package/skills/research/arxiv-literature/evals.md +50 -0
- package/skills/research/experiment-protocol/SKILL.md +20 -1
- package/skills/research/experiment-protocol/evals.md +23 -0
- package/skills/research/scientific-debugging/SKILL.md +24 -1
- package/skills/research/scientific-debugging/evals.md +18 -0
- package/skills/research/scientific-modernization/SKILL.md +26 -1
- package/skills/research/scientific-modernization/evals.md +27 -0
- package/skills/skill-marketplace.json +63 -28
- package/skills/workflow/cut-it/SKILL.md +64 -5
- package/skills/workflow/cut-it/evals.md +101 -0
- package/skills/workflow/design-council/SKILL.md +112 -27
- package/skills/workflow/design-council/evals.md +161 -0
- package/skills/workflow/grill-me/SKILL.md +85 -10
- package/skills/workflow/grill-me/evals.md +153 -0
- package/skills/workflow/workflow-distiller/SKILL.md +76 -17
- package/skills/workflow/workflow-distiller/evals.md +118 -0
- package/src/cli/args.ts +0 -8
- package/src/cli/configure-interop.ts +105 -13
- package/src/cli/configure-oauth.ts +57 -0
- package/src/cli/configure-onboarding.ts +980 -0
- package/src/cli/configure-target.ts +594 -0
- package/src/cli/configure.ts +1084 -529
- package/src/cli/context-map.ts +114 -0
- package/src/cli/context.ts +4 -0
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +3 -0
- package/src/cli/lifecycle-presenter.ts +436 -0
- package/src/cli/models.ts +10 -2
- package/src/cli/modes/print.ts +5 -1
- package/src/cli/reset.ts +228 -106
- package/src/cli/run.ts +7 -4
- package/src/cli/select.ts +664 -0
- package/src/cli/skills.ts +9 -2
- package/src/cli/targets.ts +3 -0
- package/src/cli/tasks.ts +84 -0
- package/src/cli/uninstall.ts +233 -165
- package/src/cli/upgrade.ts +210 -150
- package/src/cli/usage.ts +92 -27
- package/src/cli/validate-model.ts +3 -3
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +1 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/config.ts +56 -0
- package/src/core/external-diagnostic.ts +44 -0
- package/src/core/gateway-routing.ts +157 -0
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/run-overrides.ts +0 -5
- package/src/core/safe-exec.ts +17 -2
- package/src/core/skill-activation.ts +92 -2
- package/src/core/tool-names.ts +5 -2
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/agents/builtins/world-knowledge.md +31 -0
- package/src/domains/agents/catalog.ts +1 -1
- package/src/domains/agents/result-contract.ts +70 -0
- package/src/domains/context/extension.ts +31 -7
- package/src/domains/context/refresh.ts +3 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +6 -0
- package/src/domains/context/wiki/map-seed.ts +589 -0
- package/src/domains/context/wiki/plan.ts +2 -2
- package/src/domains/context/wiki/prompts.ts +43 -0
- package/src/domains/dispatch/active-route-planner.ts +4 -0
- package/src/domains/dispatch/admission.ts +29 -0
- package/src/domains/dispatch/agent-candidates.ts +10 -0
- package/src/domains/dispatch/budget-envelope.ts +86 -1
- package/src/domains/dispatch/capability-match.ts +1 -0
- package/src/domains/dispatch/capacity-lease.ts +17 -0
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +42 -8
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +184 -56
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +5 -3
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +20 -2
- package/src/domains/dispatch/worker-model-metadata.ts +38 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
- package/src/domains/eval/metrics/token-stream.ts +201 -31
- package/src/domains/eval/metrics/tracked.ts +40 -4
- package/src/domains/eval/runners/clio-run.ts +17 -11
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/eval/schema/suite.ts +28 -0
- package/src/domains/eval/schema/verdict.ts +2 -2
- package/src/domains/eval/suites/resolve.ts +13 -1
- package/src/domains/eval/suites/run.ts +24 -3
- package/src/domains/evidence/build.ts +102 -15
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/interop/registry.ts +6 -2
- package/src/domains/interop/types.ts +4 -0
- package/src/domains/lifecycle/migrations/index.ts +4 -0
- package/src/domains/memory/task-memory-policy.ts +70 -26
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +0 -1
- package/src/domains/middleware/marketplace-offer.ts +22 -35
- package/src/domains/middleware/memory-intervention.ts +127 -32
- package/src/domains/middleware/memory-step-endpoint.ts +3 -2
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/middleware/skills-reminder.ts +31 -2
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/compaction-usage.ts +118 -0
- package/src/domains/observability/contract.ts +52 -7
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +15 -6
- package/src/domains/observability/out-of-turn-usage.ts +52 -21
- package/src/domains/observability/projection.ts +394 -45
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/fragments/operating/contract.md +2 -0
- package/src/domains/prompts/fragments/wiki/page.md +8 -0
- package/src/domains/providers/contract.ts +4 -1
- package/src/domains/providers/extension.ts +40 -9
- package/src/domains/providers/model-capabilities.ts +9 -0
- package/src/domains/providers/model-discovery.ts +3 -4
- package/src/domains/providers/model-runtime-capabilities.ts +15 -5
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
- package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
- package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
- package/src/domains/providers/support.ts +11 -5
- package/src/domains/providers/target-model-cache.ts +25 -2
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/runtime-descriptor.ts +20 -1
- package/src/domains/providers/types/target-descriptor.ts +19 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/skills/install.ts +72 -7
- package/src/domains/resources/skills/loader.ts +7 -0
- package/src/domains/resources/skills/marketplace.ts +63 -11
- package/src/domains/safety/action-classifier.ts +7 -0
- package/src/domains/safety/autonomy.ts +15 -0
- package/src/domains/safety/default-path-policy.ts +2 -0
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +21 -1
- package/src/domains/safety/path-policy.ts +1 -1
- package/src/domains/safety/policy-engine.ts +60 -17
- package/src/domains/safety/protected-artifacts.ts +191 -88
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/run-effects.ts +2 -22
- package/src/domains/safety/skill-authority.ts +55 -0
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/compaction/compact.ts +72 -22
- package/src/domains/session/decision-board.ts +101 -2
- package/src/domains/session/entries.ts +50 -7
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/task-board.ts +14 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/session/usage.ts +3 -3
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +24 -6
- package/src/engine/acp/server.ts +21 -4
- package/src/engine/acp/transport.ts +53 -8
- package/src/engine/acp/types.ts +4 -0
- package/src/engine/agent.ts +13 -3
- package/src/engine/ai.ts +26 -8
- package/src/engine/antigravity/subprocess-runtime.ts +386 -120
- package/src/engine/api-registry.ts +3 -0
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/apis/openai-completions.ts +117 -14
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/external-subprocess.ts +122 -6
- package/src/entry/background-model-metadata.ts +18 -0
- package/src/entry/compaction-prompt.ts +57 -0
- package/src/entry/orchestrator.ts +416 -218
- package/src/entry/task-memory-lifecycle.ts +35 -0
- package/src/interactive/chat-loop-messages.ts +13 -4
- package/src/interactive/chat-loop.ts +65 -2
- package/src/interactive/chat-renderer.ts +1 -0
- package/src/interactive/cost-overlay.ts +26 -2
- package/src/interactive/dispatch-board.ts +46 -717
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +3 -2
- package/src/interactive/interactive-presentation.ts +55 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -2
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +2 -2
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/renderers/worker-entry.ts +32 -0
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +49 -45
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/theme/labels.ts +19 -13
- package/src/interactive/turn-context.ts +9 -5
- package/src/interactive/turn-recovery.ts +8 -0
- package/src/interactive/turn-runtime.ts +27 -11
- package/src/interactive/turn-state.ts +7 -0
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/worker-receipts.ts +1 -0
- package/src/interactive/worker-stream.ts +13 -4
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +31 -0
- package/src/tools/compete-worktrees.ts +7 -1
- package/src/tools/context/index.ts +30 -9
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +21 -0
- package/src/tools/dispatch-arguments.ts +1 -0
- package/src/tools/dispatch-event-text.ts +10 -0
- package/src/tools/dispatch-plan.ts +6 -2
- package/src/tools/dispatch-runner.ts +27 -1
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/limitation.ts +76 -0
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/registry.ts +11 -5
- package/src/tools/result-shaping.ts +17 -5
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +10 -1
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +298 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/src/tools/worker-evidence.ts +3 -1
- package/src/worker/spec-contract.ts +4 -0
- package/dist/chunk-2Z2IKEXI.js +0 -1554
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-VN3SHNBN.js +0 -313
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/reset-OAQP3W4O.js +0 -230
- package/dist/uninstall-N34PCTGJ.js +0 -331
- package/dist/upgrade-PXK3S2YM.js +0 -325
|
@@ -72,6 +72,10 @@ export function listMigrations(): ReadonlyArray<Migration> {
|
|
|
72
72
|
return REGISTRY;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
export function readMigrationManifest(stateDir: string): MigrationManifest {
|
|
76
|
+
return readManifest(manifestPath(stateDir));
|
|
77
|
+
}
|
|
78
|
+
|
|
75
79
|
function manifestPath(stateDir: string): string {
|
|
76
80
|
return join(stateDir, "migrations.json");
|
|
77
81
|
}
|
|
@@ -29,11 +29,16 @@ export interface TaskMemoryTrajectoryStep {
|
|
|
29
29
|
resultDigestProvenance: ToolResultDigestProvenance;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/** Admission changed while a client prepared; no inference request was sent. */
|
|
33
|
+
export class TaskMemoryEndpointBusyError extends Error {}
|
|
34
|
+
|
|
32
35
|
export interface TaskMemoryModelRequest {
|
|
33
36
|
systemPrompt: string;
|
|
34
37
|
userPrompt: string;
|
|
35
38
|
maxTokens: number;
|
|
36
39
|
signal: AbortSignal;
|
|
40
|
+
/** Known usage may arrive even when completion rejects or the policy has been canceled. */
|
|
41
|
+
onUsage?: (usage: TaskMemoryStepUsage) => void;
|
|
37
42
|
}
|
|
38
43
|
|
|
39
44
|
/**
|
|
@@ -116,10 +121,8 @@ export type TaskMemoryPolicyReason =
|
|
|
116
121
|
*/
|
|
117
122
|
| "timed_out"
|
|
118
123
|
/**
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* call behind the operator's own turn, or evicts the resident model to serve
|
|
122
|
-
* it; neither is a cost a background step may impose.
|
|
124
|
+
* Known occupancy exhausts the endpoint request capacity, so no step starts.
|
|
125
|
+
* A shared gateway URL alone does not establish a one-slot capacity bound.
|
|
123
126
|
*/
|
|
124
127
|
| "endpoint_busy"
|
|
125
128
|
/** The model client threw: unreachable route, auth failure, malformed request. */
|
|
@@ -139,7 +142,9 @@ export type TaskMemoryPolicyReason =
|
|
|
139
142
|
/** Rules tier: the turn ended with no repeated failure worth reporting. */
|
|
140
143
|
| "no_repeated_failure"
|
|
141
144
|
/** Rules tier: compaction reactivation found no knowledge entries to restore. */
|
|
142
|
-
| "bank_empty"
|
|
145
|
+
| "bank_empty"
|
|
146
|
+
/** The owning session/branch generation was invalidated. */
|
|
147
|
+
| "scope_changed";
|
|
143
148
|
|
|
144
149
|
/**
|
|
145
150
|
* The model's own words for one step, handed to an observer before they are
|
|
@@ -161,6 +166,12 @@ export interface TaskMemoryEnvelope {
|
|
|
161
166
|
}
|
|
162
167
|
|
|
163
168
|
export interface TaskMemoryPolicyInput {
|
|
169
|
+
/** Content authority, checked after inference and before any bank write. */
|
|
170
|
+
isCurrent?: () => boolean;
|
|
171
|
+
/** Cancellation releases policy bookkeeping even if the transport ignores abort. */
|
|
172
|
+
signal?: AbortSignal;
|
|
173
|
+
/** Reports actual provider usage, including responses arriving after cancellation/deadline. */
|
|
174
|
+
onStepUsage?: (usage: TaskMemoryStepUsage) => void;
|
|
164
175
|
task: string;
|
|
165
176
|
trajectory: ReadonlyArray<TaskMemoryTrajectoryStep>;
|
|
166
177
|
deterministicTrigger: boolean;
|
|
@@ -246,10 +257,31 @@ export async function runTaskMemoryPolicy(
|
|
|
246
257
|
const timeoutMs = positiveInteger(input.timeoutMs, TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS);
|
|
247
258
|
const timeoutMarker = Symbol("task-memory-timeout");
|
|
248
259
|
let timer: NodeJS.Timeout | undefined;
|
|
260
|
+
const cancelledMarker = Symbol("task-memory-cancelled");
|
|
261
|
+
let cancel: () => void = () => {};
|
|
262
|
+
const cancelled = new Promise<typeof cancelledMarker>((resolve) => {
|
|
263
|
+
cancel = () => {
|
|
264
|
+
controller.abort();
|
|
265
|
+
resolve(cancelledMarker);
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
input.signal?.addEventListener("abort", cancel, { once: true });
|
|
269
|
+
if (input.signal?.aborted) cancel();
|
|
249
270
|
let userPrompt = "";
|
|
250
271
|
let rawResponse = "";
|
|
251
272
|
let clientError: string | null = null;
|
|
252
273
|
let stepUsage: TaskMemoryStepUsage | null = null;
|
|
274
|
+
let usageReported = false;
|
|
275
|
+
const reportUsage = (usage: TaskMemoryStepUsage): void => {
|
|
276
|
+
if (usageReported) return;
|
|
277
|
+
usageReported = true;
|
|
278
|
+
stepUsage = usage;
|
|
279
|
+
try {
|
|
280
|
+
input.onStepUsage?.(usage);
|
|
281
|
+
} catch {
|
|
282
|
+
/* Accounting cannot steer content. */
|
|
283
|
+
}
|
|
284
|
+
};
|
|
253
285
|
// Every exit reports through here so the trace sees the same envelope the
|
|
254
286
|
// telemetry row summarizes, including the paths that used to throw away both.
|
|
255
287
|
const settle = (
|
|
@@ -263,54 +295,64 @@ export async function runTaskMemoryPolicy(
|
|
|
263
295
|
bankOperations: parts.bankOperations ?? 0,
|
|
264
296
|
droppedOperations: parts.droppedOperations ?? 0,
|
|
265
297
|
reminder: parts.reminder ?? null,
|
|
266
|
-
inputTokens: parts.inputTokens ?? 0,
|
|
267
|
-
outputTokens: parts.outputTokens ?? 0,
|
|
298
|
+
inputTokens: parts.inputTokens ?? stepUsage?.input ?? 0,
|
|
299
|
+
outputTokens: parts.outputTokens ?? stepUsage?.output ?? 0,
|
|
268
300
|
usage: stepUsage,
|
|
269
301
|
};
|
|
270
302
|
try {
|
|
271
|
-
input.
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
303
|
+
if (input.isCurrent?.() !== false)
|
|
304
|
+
input.onEnvelope?.({
|
|
305
|
+
systemPrompt: MEMORY_INTERVENTION_SYSTEM_PROMPT,
|
|
306
|
+
userPrompt,
|
|
307
|
+
response: rawResponse,
|
|
308
|
+
decision,
|
|
309
|
+
reason,
|
|
310
|
+
bankOperations: result.bankOperations,
|
|
311
|
+
droppedOperations: result.droppedOperations,
|
|
312
|
+
reminder: result.reminder,
|
|
313
|
+
error: clientError,
|
|
314
|
+
});
|
|
282
315
|
} catch {
|
|
283
316
|
// A failing observer is an operator's diagnostic, never the policy's problem.
|
|
284
317
|
}
|
|
285
318
|
return result;
|
|
286
319
|
};
|
|
287
320
|
try {
|
|
321
|
+
if (input.signal?.aborted || input.isCurrent?.() === false) return settle("silent", "scope_changed");
|
|
288
322
|
userPrompt = buildMemoryInterventionUserPrompt({
|
|
289
323
|
task: input.task.slice(0, TASK_PROMPT_MAX_CHARS),
|
|
290
324
|
bank: bank.render(input.maxTokens),
|
|
291
325
|
trajectory: renderTrajectory(input.trajectory),
|
|
292
326
|
});
|
|
293
|
-
const completion = client
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
327
|
+
const completion = client
|
|
328
|
+
.complete({
|
|
329
|
+
systemPrompt: MEMORY_INTERVENTION_SYSTEM_PROMPT,
|
|
330
|
+
userPrompt,
|
|
331
|
+
maxTokens: positiveInteger(input.modelMaxTokens, input.maxTokens),
|
|
332
|
+
signal: controller.signal,
|
|
333
|
+
onUsage: reportUsage,
|
|
334
|
+
})
|
|
335
|
+
.then((response) => {
|
|
336
|
+
if (response.usage !== undefined) reportUsage(response.usage);
|
|
337
|
+
return response;
|
|
338
|
+
});
|
|
299
339
|
const timeout = new Promise<typeof timeoutMarker>((resolve) => {
|
|
300
340
|
timer = setTimeout(() => resolve(timeoutMarker), timeoutMs);
|
|
301
341
|
});
|
|
302
|
-
const response = await Promise.race([completion, timeout]);
|
|
342
|
+
const response = await Promise.race([completion, timeout, cancelled]);
|
|
343
|
+
if (response === cancelledMarker) return settle("silent", "scope_changed");
|
|
303
344
|
if (response === timeoutMarker) {
|
|
304
345
|
controller.abort();
|
|
305
346
|
void completion.catch(() => undefined);
|
|
306
347
|
return settle("timeout", "deadline");
|
|
307
348
|
}
|
|
308
349
|
rawResponse = typeof response.text === "string" ? response.text : "";
|
|
309
|
-
stepUsage = response.usage ??
|
|
350
|
+
stepUsage = response.usage ?? stepUsage;
|
|
310
351
|
const usage = {
|
|
311
352
|
inputTokens: nonNegativeInteger(response.inputTokens ?? stepUsage?.input),
|
|
312
353
|
outputTokens: nonNegativeInteger(response.outputTokens ?? stepUsage?.output),
|
|
313
354
|
};
|
|
355
|
+
if (input.signal?.aborted || input.isCurrent?.() === false) return settle("silent", "scope_changed", usage);
|
|
314
356
|
const read = readPolicyStep(rawResponse);
|
|
315
357
|
if (!read.ok) return settle("malformed", read.reason, { ...usage, droppedOperations: read.dropped });
|
|
316
358
|
const operations = resolveOperations(bank, read.step.operations);
|
|
@@ -336,6 +378,7 @@ export async function runTaskMemoryPolicy(
|
|
|
336
378
|
bank.recordInjection(citedIds);
|
|
337
379
|
return settle("injected", "intervened", { ...counts, reminder });
|
|
338
380
|
} catch (error) {
|
|
381
|
+
if (error instanceof TaskMemoryEndpointBusyError) return settle("silent", "endpoint_busy");
|
|
339
382
|
clientError = errorMessage(error);
|
|
340
383
|
// A transport that aborted at its own deadline spent the whole budget and
|
|
341
384
|
// produced nothing. Reporting it as silence made a step that held a local
|
|
@@ -345,6 +388,7 @@ export async function runTaskMemoryPolicy(
|
|
|
345
388
|
return settle("silent", "client_error");
|
|
346
389
|
} finally {
|
|
347
390
|
if (timer !== undefined) clearTimeout(timer);
|
|
391
|
+
input.signal?.removeEventListener("abort", cancel);
|
|
348
392
|
}
|
|
349
393
|
}
|
|
350
394
|
|
|
@@ -15,7 +15,6 @@ import {
|
|
|
15
15
|
readPromotionDeclines,
|
|
16
16
|
recordPromotionNeverDecline,
|
|
17
17
|
} from "../resources/skills/promotion.js";
|
|
18
|
-
import type { AutonomyLevel } from "../safety/autonomy.js";
|
|
19
18
|
import type { MiddlewareHookRegistration } from "./runtime.js";
|
|
20
19
|
import { isSubstantiveUserTurn } from "./skills-reminder.js";
|
|
21
20
|
import { type MiddlewareEffect, type MiddlewareHookInput, metadataNumber } from "./types.js";
|
|
@@ -34,9 +33,8 @@ import { type MiddlewareEffect, type MiddlewareHookInput, metadataNumber } from
|
|
|
34
33
|
* becomes a nag. Detection is the local lexical matcher in
|
|
35
34
|
* resources/skills/promotion.ts — no request text leaves the machine.
|
|
36
35
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* autonomous) passes `assertPromotionInstallSource`, the hard runtime gate
|
|
36
|
+
* Every autonomy level requires an explicit operator answer. Each consented
|
|
37
|
+
* promotion-flow install passes `assertPromotionInstallSource`, the hard runtime gate
|
|
40
38
|
* that rejects public registries in code rather than prompt text.
|
|
41
39
|
*
|
|
42
40
|
* Coordinator-only by wiring: this registration is created in the
|
|
@@ -48,19 +46,19 @@ export const MARKETPLACE_OFFER_REGISTRATION_ID = "observer.marketplace-offer";
|
|
|
48
46
|
|
|
49
47
|
export interface MarketplaceOfferInstallResult {
|
|
50
48
|
path: string;
|
|
51
|
-
/** The source the skill was fetched from;
|
|
49
|
+
/** The source the skill was fetched from; retained with the installation result for provenance. */
|
|
52
50
|
sourceUrl: string;
|
|
53
51
|
/** Normalized content hash of what was written; the integrity record the consent overlay would have shown. */
|
|
54
52
|
installedHash: string;
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
export interface MarketplaceOfferDeps {
|
|
56
|
+
/** Whether the session can render ask_user. Defaults to interactive offers. */
|
|
57
|
+
interactive?: boolean;
|
|
58
58
|
/** Installed skill names the matcher must exclude. */
|
|
59
59
|
listInstalledSkillNames(): ReadonlyArray<string>;
|
|
60
60
|
/** The local marketplace lookup (catalog + index); already local-only. */
|
|
61
61
|
listMarketplaceEntries(): ReadonlyArray<MarketplaceSkill>;
|
|
62
|
-
/** The session's effective autonomy at evaluation time. */
|
|
63
|
-
getAutonomy(): AutonomyLevel;
|
|
64
62
|
/** Perform the install; the registration gates the source before calling. */
|
|
65
63
|
installEntry(entry: MarketplaceSkill, scope: "user" | "project"): MarketplaceOfferInstallResult;
|
|
66
64
|
/** Decline persistence; defaults to the promotion module's config-dir store. Keyed by name+version. */
|
|
@@ -84,10 +82,18 @@ export function offerBindingTag(offerTag: string): string {
|
|
|
84
82
|
return `[clio-install:${offerTag}]`;
|
|
85
83
|
}
|
|
86
84
|
|
|
85
|
+
function boundedDescription(text: string): string {
|
|
86
|
+
return text
|
|
87
|
+
.replace(/\[[^[\]]*\]/gu, " ")
|
|
88
|
+
.replace(/\s+/gu, " ")
|
|
89
|
+
.trim()
|
|
90
|
+
.slice(0, 200);
|
|
91
|
+
}
|
|
92
|
+
|
|
87
93
|
export function marketplaceOfferReminder(entry: MarketplaceSkill, offerTag: string): string {
|
|
88
94
|
return (
|
|
89
95
|
`[Marketplace] This request may need expertise no installed skill covers. The local marketplace has ` +
|
|
90
|
-
`"${entry.name}" (not installed): ${entry.description} ` +
|
|
96
|
+
`"${entry.name}" (not installed): ${boundedDescription(entry.description)} ` +
|
|
91
97
|
`First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit ` +
|
|
92
98
|
`and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") ` +
|
|
93
99
|
`whether to install ${entry.name}, offering exactly these options in this order: ` +
|
|
@@ -100,19 +106,6 @@ export function marketplaceOfferReminder(entry: MarketplaceSkill, offerTag: stri
|
|
|
100
106
|
);
|
|
101
107
|
}
|
|
102
108
|
|
|
103
|
-
export function marketplaceAutoInstallReminder(entry: MarketplaceSkill, result: MarketplaceOfferInstallResult): string {
|
|
104
|
-
// Full-auto skips the operator's yes/no, never the integrity record. The
|
|
105
|
-
// consent overlay states the source and the SHA-256 of what it writes; the
|
|
106
|
-
// autonomous path computes the same hash and must surface it here, so an
|
|
107
|
-
// install nobody was asked about is still traceable to its source and bytes.
|
|
108
|
-
return (
|
|
109
|
-
`[Marketplace] Installed skill "${entry.name}" from Clio's own local marketplace (full-auto) to ${result.path}. ` +
|
|
110
|
-
`Source ${result.sourceUrl}, sha256 ${result.installedHash}. ${entry.description} ` +
|
|
111
|
-
`It is installed but not active — activation stays operator-gated. If it fits this task, ` +
|
|
112
|
-
`suggest /skill ${entry.name} to the operator; never load it yourself.`
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
109
|
interface AnswerLike {
|
|
117
110
|
question: string;
|
|
118
111
|
answer: string;
|
|
@@ -316,20 +309,14 @@ export function createMarketplaceOfferRegistration(deps: MarketplaceOfferDeps):
|
|
|
316
309
|
const match = bestMatch(input.text ?? "");
|
|
317
310
|
if (!match) return NO_EFFECTS;
|
|
318
311
|
offeredNames.add(match.entry.name);
|
|
319
|
-
if (deps.
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
},
|
|
328
|
-
];
|
|
329
|
-
} catch {
|
|
330
|
-
// Gate refusal or install failure: fall back to the consent offer
|
|
331
|
-
// so the operator still hears about the match.
|
|
332
|
-
}
|
|
312
|
+
if (deps.interactive === false) {
|
|
313
|
+
return [
|
|
314
|
+
{
|
|
315
|
+
kind: "inject_reminder",
|
|
316
|
+
severity: "info",
|
|
317
|
+
message: `[Marketplace] Skill "${match.entry.name}" matches this request; install with clio-coder skills install ${match.entry.name}.`,
|
|
318
|
+
},
|
|
319
|
+
];
|
|
333
320
|
}
|
|
334
321
|
const tag = newOfferTag();
|
|
335
322
|
pendingOffer = { entry: match.entry, tag };
|
|
@@ -78,13 +78,13 @@ export interface MemoryInterventionDeps {
|
|
|
78
78
|
everyNTools?: number;
|
|
79
79
|
/** Lazily resolves the explicitly configured background role. Null means rules-only. */
|
|
80
80
|
getModelClient?: () => TaskMemoryModelClient | null;
|
|
81
|
+
/** One alternative route after a client error; never used after timeout, cancellation or model output. */
|
|
82
|
+
getFallbackModelClient?: () => TaskMemoryModelClient | null;
|
|
81
83
|
/** Completion budget derived from the resolved background model capability. */
|
|
82
84
|
getModelMaxTokens?: (configuredMaxTokens: number) => number;
|
|
83
85
|
/**
|
|
84
|
-
* True when
|
|
85
|
-
*
|
|
86
|
-
* own turn on a single-slot server or makes the server evict the resident
|
|
87
|
-
* model to serve it, so the boundary is skipped and the skip is recorded.
|
|
86
|
+
* True when known endpoint occupancy exhausts the resolved capacity bound.
|
|
87
|
+
* A shared gateway URL alone is not evidence that its request slots are full.
|
|
88
88
|
*/
|
|
89
89
|
backgroundEndpointBusy?: () => boolean;
|
|
90
90
|
/**
|
|
@@ -92,6 +92,8 @@ export interface MemoryInterventionDeps {
|
|
|
92
92
|
* routes it to the cost ledger; the middleware never prices anything.
|
|
93
93
|
*/
|
|
94
94
|
onStepUsage?: (usage: TaskMemoryStepUsage) => void;
|
|
95
|
+
/** Capture immutable accounting ownership at launch, before awaiting inference. */
|
|
96
|
+
captureStepUsage?: () => (usage: TaskMemoryStepUsage, isCurrent: boolean) => void;
|
|
95
97
|
/**
|
|
96
98
|
* Bank entries an llm-tier reminder cited when it reached the operator. The
|
|
97
99
|
* composition root proposes them into the durable memory store, which is what
|
|
@@ -139,6 +141,10 @@ export interface MemoryPromptedStepResult extends TaskMemoryPolicyResult {
|
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
export interface MemoryInterventionRegistration extends MiddlewareHookRegistration {
|
|
144
|
+
/** Invalidate pending content and discard all transient session/branch state. */
|
|
145
|
+
reset(): void;
|
|
146
|
+
/** Invalidate immediately without waiting for the model; refuse further work. */
|
|
147
|
+
dispose(): void;
|
|
142
148
|
evaluateAsync(
|
|
143
149
|
input: MiddlewareHookInput,
|
|
144
150
|
context?: MiddlewareHookEvaluationContext,
|
|
@@ -154,10 +160,9 @@ export interface MemoryInterventionRegistration extends MiddlewareHookRegistrati
|
|
|
154
160
|
/** True while a detached background memory step is still running. */
|
|
155
161
|
stepInFlight(): boolean;
|
|
156
162
|
/**
|
|
157
|
-
* Resolves
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
* one at all rather than starting one it will abandon.
|
|
163
|
+
* Resolves when this generation's detached policy settles. Reset/shutdown
|
|
164
|
+
* release the policy immediately; an abort-ignoring transport can still
|
|
165
|
+
* finish later, with authority only to report its originating usage.
|
|
161
166
|
*/
|
|
162
167
|
whenIdle(): Promise<void>;
|
|
163
168
|
}
|
|
@@ -167,6 +172,10 @@ export interface MemoryInterventionRegistration extends MiddlewareHookRegistrati
|
|
|
167
172
|
* emits only cited, advisory reminders through the existing visible channel.
|
|
168
173
|
*/
|
|
169
174
|
export function createMemoryInterventionRegistration(deps: MemoryInterventionDeps): MemoryInterventionRegistration {
|
|
175
|
+
let generation = 0;
|
|
176
|
+
let generationController = new AbortController();
|
|
177
|
+
let observedSessionId: string | undefined;
|
|
178
|
+
let disposed = false;
|
|
170
179
|
const pending = new Map<string, PendingToolStep>();
|
|
171
180
|
const trajectory: TrajectoryStep[] = [];
|
|
172
181
|
const failures = new Map<string, FailedAttempt>();
|
|
@@ -194,11 +203,17 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
194
203
|
let consecutiveLlmTimeouts = 0;
|
|
195
204
|
|
|
196
205
|
return {
|
|
206
|
+
reset,
|
|
207
|
+
dispose(): void {
|
|
208
|
+
disposed = true;
|
|
209
|
+
reset();
|
|
210
|
+
},
|
|
197
211
|
id: MEMORY_INTERVENTION_REGISTRATION_ID,
|
|
198
212
|
description: "maintain bounded task execution memory and selectively remind after repeated failures or compaction",
|
|
199
213
|
hooks: ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"],
|
|
200
214
|
evaluate(input): ReadonlyArray<MiddlewareEffect> {
|
|
201
|
-
|
|
215
|
+
observeSession(input);
|
|
216
|
+
if (disposed || !settings().enabled) return NO_EFFECTS;
|
|
202
217
|
try {
|
|
203
218
|
switch (input.hook) {
|
|
204
219
|
case "before_tool":
|
|
@@ -274,7 +289,8 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
274
289
|
* would have been buffered anyway.
|
|
275
290
|
*/
|
|
276
291
|
async evaluateAsync(input, context): Promise<ReadonlyArray<MiddlewareEffect>> {
|
|
277
|
-
|
|
292
|
+
observeSession(input);
|
|
293
|
+
if (disposed || !settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS;
|
|
278
294
|
const boundary = input.turnId ?? input.metadata?.userTurnId?.toString() ?? `tool-step:${toolStep}`;
|
|
279
295
|
if (boundary === lastPromptedBoundary) return NO_EFFECTS;
|
|
280
296
|
// One row rather than none, so a headless operator reading the log sees
|
|
@@ -316,6 +332,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
316
332
|
) ??
|
|
317
333
|
false);
|
|
318
334
|
rulesInjectedSincePromptedStep = false;
|
|
335
|
+
const stepGeneration = generation;
|
|
319
336
|
promptedStepInFlight = true;
|
|
320
337
|
outstandingStep = runPromptedStep({
|
|
321
338
|
deterministicTrigger: triggers.some((trigger) => trigger !== "interval"),
|
|
@@ -323,6 +340,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
323
340
|
triggerReasons: triggers,
|
|
324
341
|
})
|
|
325
342
|
.then((result) => {
|
|
343
|
+
if (stepGeneration !== generation || disposed) return;
|
|
326
344
|
// A rules-only reminder can win the visible boundary while the optional
|
|
327
345
|
// background route resolves to null. Preserve the operator-visible
|
|
328
346
|
// injected outcome instead of overwriting it with that no-client silence.
|
|
@@ -336,13 +354,13 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
336
354
|
// covers a throwing delivery sink, which must not surface anywhere.
|
|
337
355
|
})
|
|
338
356
|
.finally(() => {
|
|
339
|
-
promptedStepInFlight = false;
|
|
357
|
+
if (stepGeneration === generation) promptedStepInFlight = false;
|
|
340
358
|
});
|
|
341
359
|
return NO_EFFECTS;
|
|
342
360
|
},
|
|
343
361
|
runPromptedStep,
|
|
344
362
|
signalLoop(): void {
|
|
345
|
-
if (settings().enabled) pendingTriggers.add("loop_signal");
|
|
363
|
+
if (!disposed && settings().enabled) pendingTriggers.add("loop_signal");
|
|
346
364
|
},
|
|
347
365
|
lastDecision: () => lastDecision,
|
|
348
366
|
recentActivity: () => [...activity],
|
|
@@ -350,6 +368,43 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
350
368
|
whenIdle: () => outstandingStep,
|
|
351
369
|
};
|
|
352
370
|
|
|
371
|
+
function observeSession(input: MiddlewareHookInput): void {
|
|
372
|
+
if (input.sessionId === undefined) return;
|
|
373
|
+
if (observedSessionId !== undefined && observedSessionId !== input.sessionId) reset();
|
|
374
|
+
observedSessionId = input.sessionId;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function reset(): void {
|
|
378
|
+
generation += 1;
|
|
379
|
+
generationController.abort();
|
|
380
|
+
generationController = new AbortController();
|
|
381
|
+
deps.bank.clear();
|
|
382
|
+
pending.clear();
|
|
383
|
+
trajectory.length = 0;
|
|
384
|
+
failures.clear();
|
|
385
|
+
toolStep = 0;
|
|
386
|
+
lastTurnEndStep = 0;
|
|
387
|
+
reactivateAfterCompaction = false;
|
|
388
|
+
lastInjectedOperationFingerprint = null;
|
|
389
|
+
currentTask = "(current task unavailable)";
|
|
390
|
+
toolsSinceMemoryStep = 0;
|
|
391
|
+
consecutiveErrors = 0;
|
|
392
|
+
lastPromptedBoundary = null;
|
|
393
|
+
lastInjectedMessage = null;
|
|
394
|
+
lastDecision = null;
|
|
395
|
+
pendingTriggers.clear();
|
|
396
|
+
activity.length = 0;
|
|
397
|
+
annotatedThisTurn.clear();
|
|
398
|
+
telemetryBankSnapshot = deps.bank.snapshot();
|
|
399
|
+
promptedStepInFlight = false;
|
|
400
|
+
promptedStepTier = "rules";
|
|
401
|
+
outstandingStep = Promise.resolve();
|
|
402
|
+
rulesInjectedSincePromptedStep = false;
|
|
403
|
+
annotatedSinceTurnEnd = false;
|
|
404
|
+
consecutiveLlmTimeouts = 0;
|
|
405
|
+
observedSessionId = undefined;
|
|
406
|
+
}
|
|
407
|
+
|
|
353
408
|
function settings(): MemoryInterventionSettings {
|
|
354
409
|
const live = deps.getSettings?.();
|
|
355
410
|
return {
|
|
@@ -377,12 +432,16 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
377
432
|
effects: NO_EFFECTS,
|
|
378
433
|
});
|
|
379
434
|
const live = settings();
|
|
380
|
-
|
|
435
|
+
const stepGeneration = generation;
|
|
436
|
+
const isCurrent = () => !disposed && stepGeneration === generation;
|
|
437
|
+
const usageSink = deps.captureStepUsage?.();
|
|
438
|
+
if (disposed || !live.enabled) {
|
|
381
439
|
const result = silent("no_client");
|
|
382
440
|
lastDecision = result.decision;
|
|
383
441
|
return result;
|
|
384
442
|
}
|
|
385
443
|
const started = process.hrtime.bigint();
|
|
444
|
+
let attemptStarted = started;
|
|
386
445
|
const triggers = input.triggerReasons?.length ? input.triggerReasons : ["manual" as const];
|
|
387
446
|
let tier: TaskMemoryTelemetryTier = "rules";
|
|
388
447
|
promptedStepTier = tier;
|
|
@@ -407,17 +466,58 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
407
466
|
} else {
|
|
408
467
|
tier = "llm";
|
|
409
468
|
promptedStepTier = tier;
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
469
|
+
const runClient = (selected: TaskMemoryModelClient, timeoutMs: number) =>
|
|
470
|
+
runTaskMemoryPolicy(deps.bank, selected, {
|
|
471
|
+
isCurrent,
|
|
472
|
+
signal: generationController.signal,
|
|
473
|
+
onStepUsage: (usage) => {
|
|
474
|
+
if (usageSink) usageSink(usage, isCurrent());
|
|
475
|
+
else deps.onStepUsage?.(usage);
|
|
476
|
+
},
|
|
477
|
+
task: input.task?.trim() || currentTask,
|
|
478
|
+
trajectory: [...trajectory],
|
|
479
|
+
deterministicTrigger: input.deterministicTrigger,
|
|
480
|
+
maxTokens: live.maxTokens,
|
|
481
|
+
modelMaxTokens: positiveInteger(deps.getModelMaxTokens?.(live.maxTokens), live.maxTokens),
|
|
482
|
+
...(input.suppressIntervention === undefined ? {} : { suppressIntervention: input.suppressIntervention }),
|
|
483
|
+
previousReminder: lastInjectedMessage,
|
|
484
|
+
timeoutMs,
|
|
485
|
+
...(deps.onEnvelope === undefined ? {} : { onEnvelope: deps.onEnvelope }),
|
|
486
|
+
});
|
|
487
|
+
const remainingMs = () => Math.floor(live.timeoutMs - Number(process.hrtime.bigint() - started) / 1_000_000);
|
|
488
|
+
const initialTimeoutMs = remainingMs();
|
|
489
|
+
promptedResult =
|
|
490
|
+
initialTimeoutMs <= 0
|
|
491
|
+
? { ...silent("deadline"), decision: "timeout" }
|
|
492
|
+
: await runClient(client, initialTimeoutMs);
|
|
493
|
+
if (promptedResult.reason === "client_error" && isCurrent() && remainingMs() > 0) {
|
|
494
|
+
let fallback: TaskMemoryModelClient | null = null;
|
|
495
|
+
let fallbackReady = false;
|
|
496
|
+
try {
|
|
497
|
+
fallback = deps.getFallbackModelClient?.() ?? null;
|
|
498
|
+
fallbackReady = fallback !== null && deps.backgroundEndpointBusy?.() !== true;
|
|
499
|
+
} catch {
|
|
500
|
+
/* Fail closed and preserve the original call if routing or capacity is unreadable. */
|
|
501
|
+
}
|
|
502
|
+
const fallbackTimeoutMs = remainingMs();
|
|
503
|
+
if (fallback !== null && fallbackReady && isCurrent() && fallbackTimeoutMs > 0) {
|
|
504
|
+
// Each attempted call keeps its own telemetry and origin usage.
|
|
505
|
+
// The returned policy result describes the final attempt only.
|
|
506
|
+
emitTelemetry(
|
|
507
|
+
triggers,
|
|
508
|
+
tier,
|
|
509
|
+
promptedResult.decision,
|
|
510
|
+
promptedResult.reason,
|
|
511
|
+
0,
|
|
512
|
+
promptedResult.inputTokens,
|
|
513
|
+
promptedResult.outputTokens,
|
|
514
|
+
started,
|
|
515
|
+
{ bankOperations: promptedResult.bankOperations, droppedOperations: promptedResult.droppedOperations },
|
|
516
|
+
);
|
|
517
|
+
attemptStarted = process.hrtime.bigint();
|
|
518
|
+
promptedResult = await runClient(fallback, fallbackTimeoutMs);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
421
521
|
}
|
|
422
522
|
}
|
|
423
523
|
} catch (error) {
|
|
@@ -436,16 +536,11 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
436
536
|
error: error instanceof Error ? error.message : "resolving the background model client failed",
|
|
437
537
|
});
|
|
438
538
|
}
|
|
539
|
+
if (!isCurrent()) return { ...promptedResult, reminder: null, effects: NO_EFFECTS };
|
|
540
|
+
if (promptedResult.reason === "endpoint_busy") telemetryDecision = "dropped";
|
|
439
541
|
if (tier === "llm" && promptedResult.decision === "timeout") consecutiveLlmTimeouts += 1;
|
|
440
542
|
else if (tier === "llm" && telemetryDecision !== "dropped") consecutiveLlmTimeouts = 0;
|
|
441
543
|
lastDecision = promptedResult.decision;
|
|
442
|
-
if (promptedResult.usage !== null) {
|
|
443
|
-
try {
|
|
444
|
-
deps.onStepUsage?.(promptedResult.usage);
|
|
445
|
-
} catch {
|
|
446
|
-
// Accounting is bookkeeping. A failing sink never changes memory behavior.
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
544
|
if (promptedResult.decision === "injected") reportInjectedEntries(promptedResult.reminder);
|
|
450
545
|
emitTelemetry(
|
|
451
546
|
triggers,
|
|
@@ -455,7 +550,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
455
550
|
citedEntryCount(promptedResult.reminder),
|
|
456
551
|
promptedResult.inputTokens,
|
|
457
552
|
promptedResult.outputTokens,
|
|
458
|
-
|
|
553
|
+
attemptStarted,
|
|
459
554
|
{ bankOperations: promptedResult.bankOperations, droppedOperations: promptedResult.droppedOperations },
|
|
460
555
|
);
|
|
461
556
|
return {
|
|
@@ -50,8 +50,9 @@ export function announceMemoryStepEndpoint<Request, Response>(
|
|
|
50
50
|
const { bus, endpointKey, targetId } = deps;
|
|
51
51
|
if (endpointKey === null) return complete;
|
|
52
52
|
return async (request: Request): Promise<Response> => {
|
|
53
|
-
//
|
|
54
|
-
//
|
|
53
|
+
// The production client rechecks capacity after asynchronous preparation,
|
|
54
|
+
// immediately before calling this wrapper. Register synchronously so no
|
|
55
|
+
// local foreground launch can interleave between that check and this hold.
|
|
55
56
|
const releaseEndpointSlot = registerForegroundStream(endpointKey);
|
|
56
57
|
try {
|
|
57
58
|
return await complete(request);
|
|
@@ -110,9 +110,13 @@ export type MiddlewareDiagnostic =
|
|
|
110
110
|
export type MiddlewareDiagnosticSink = (diagnostic: MiddlewareDiagnostic) => void;
|
|
111
111
|
|
|
112
112
|
/**
|
|
113
|
-
* Default diagnostic sink
|
|
114
|
-
*
|
|
115
|
-
*
|
|
113
|
+
* Default diagnostic sink, and the one the domain loader constructs the
|
|
114
|
+
* bundle with. It writes to stderr only. The composition root
|
|
115
|
+
* (src/entry/orchestrator.ts) replaces it through setDiagnosticSink with a
|
|
116
|
+
* sink that publishes every diagnostic on the typed bus as
|
|
117
|
+
* `middleware.hookFailed`, which the interactive warn notice consumes, and
|
|
118
|
+
* that still calls this writer for non-interactive runs, which have no
|
|
119
|
+
* notice subscriber.
|
|
116
120
|
*/
|
|
117
121
|
export function writeMiddlewareDiagnosticToStderr(diagnostic: MiddlewareDiagnostic): void {
|
|
118
122
|
if (diagnostic.kind === "hook_failed") {
|