@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
|
@@ -18,7 +18,12 @@ import {
|
|
|
18
18
|
import { wallTimeMetric } from "../metrics/latency.js";
|
|
19
19
|
import { tokenAccountingFrom } from "../metrics/tokens.js";
|
|
20
20
|
import { zeroToolCallMetrics } from "../metrics/tool-calls.js";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
buildEvalTrackedMetrics,
|
|
23
|
+
emptyEvalTrackedMetrics,
|
|
24
|
+
readEvalLedgerSnapshot,
|
|
25
|
+
selectEvalLedgerEntries,
|
|
26
|
+
} from "../metrics/tracked.js";
|
|
22
27
|
import {
|
|
23
28
|
type EvalServingObservation,
|
|
24
29
|
evalClioProvenance,
|
|
@@ -234,11 +239,27 @@ async function runMatrixItem(
|
|
|
234
239
|
},
|
|
235
240
|
};
|
|
236
241
|
const snapshot = await readEvalLedgerSnapshot(stateDir);
|
|
237
|
-
const
|
|
242
|
+
const selected = selectEvalLedgerEntries(snapshot.entries, runner.ledgerEntries ?? []);
|
|
243
|
+
result.artifacts.trackedMetricSources = JSON.stringify({
|
|
244
|
+
assistantCalls: selected.source,
|
|
245
|
+
sessionCalls: selected.sessionCalls,
|
|
246
|
+
streamCalls: selected.streamCalls,
|
|
247
|
+
compactions: "session",
|
|
248
|
+
});
|
|
249
|
+
if (selected.sessionCalls > 0 && selected.streamCalls > 0) {
|
|
250
|
+
// Preserve the unmerged evidence for opaque runners too. The native
|
|
251
|
+
// runner already publishes this artifact before stdout truncation.
|
|
252
|
+
result.artifacts.callLedger ??= JSON.stringify(runner.ledgerEntries);
|
|
253
|
+
if (selected.sessionCalls !== selected.streamCalls || task.runner.kind === "external-command") {
|
|
254
|
+
result.artifacts.trackedMetricWarning =
|
|
255
|
+
"Session and stream call coverage may differ; tracked metrics use session calls, not a reconciled union. " +
|
|
256
|
+
"Inspect callLedger before treating these counts as complete: no shared call identity proves overlap.";
|
|
257
|
+
}
|
|
258
|
+
}
|
|
238
259
|
result.verdict = adaptSuiteV2ResultToVerdictV1(
|
|
239
260
|
result,
|
|
240
261
|
buildEvalTrackedMetrics({
|
|
241
|
-
ledgerEntries,
|
|
262
|
+
ledgerEntries: selected.entries,
|
|
242
263
|
receipt: receipt ?? null,
|
|
243
264
|
fallbackWallClockMs: runner.wallTimeMs,
|
|
244
265
|
}),
|
|
@@ -12,6 +12,8 @@ import type {
|
|
|
12
12
|
} from "../dispatch/index.js";
|
|
13
13
|
import { type ExecutionRole, isExecutionRole, readGateDecisionArtifactsForRunIds } from "../dispatch/index.js";
|
|
14
14
|
import { detectValidationCommand } from "../safety/protected-artifacts.js";
|
|
15
|
+
import { foldDecisionBoard } from "../session/decision-board.js";
|
|
16
|
+
import { type DecisionLedgerEntry, decisionRef } from "../session/entries.js";
|
|
15
17
|
import {
|
|
16
18
|
type AuditJsonRow,
|
|
17
19
|
type BashExecutionEntry,
|
|
@@ -23,6 +25,7 @@ import {
|
|
|
23
25
|
readSessionEntriesForId,
|
|
24
26
|
type SessionEntry,
|
|
25
27
|
} from "../session/index.js";
|
|
28
|
+
import { filterEntriesToActivePath } from "../session/tree/active-path.js";
|
|
26
29
|
import { attributeEvidenceFailure } from "./failure-attribution.js";
|
|
27
30
|
import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
|
|
28
31
|
import { compareCodepoints as compareStrings } from "./ordering.js";
|
|
@@ -37,6 +40,7 @@ import {
|
|
|
37
40
|
type EvidenceAuditLinkedRow,
|
|
38
41
|
type EvidenceBuildResult,
|
|
39
42
|
type EvidenceCleanTraceRow,
|
|
43
|
+
type EvidenceDecision,
|
|
40
44
|
type EvidenceFinding,
|
|
41
45
|
type EvidenceGateDecisionsFile,
|
|
42
46
|
type EvidenceLinkConfidence,
|
|
@@ -94,6 +98,7 @@ interface LinkedSessionEntry {
|
|
|
94
98
|
}
|
|
95
99
|
|
|
96
100
|
interface SessionLinkResult {
|
|
101
|
+
decisionBoards: Map<string, DecisionLedgerEntry[]>;
|
|
97
102
|
entries: LinkedSessionEntry[];
|
|
98
103
|
attemptedSessionIds: string[];
|
|
99
104
|
missingSessionIds: string[];
|
|
@@ -163,7 +168,10 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
|
|
|
163
168
|
gateDecisions: gateDecisions.decisions,
|
|
164
169
|
validationEvidence,
|
|
165
170
|
});
|
|
166
|
-
const
|
|
171
|
+
const decisionLinks = resolveReceiptDecisions(runSources, sessionLinks);
|
|
172
|
+
const rawFindings = buildFindings(runSources, trustStatusRaw, sessionLinks, auditLinks, protectedArtifactsRaw);
|
|
173
|
+
for (const row of decisionLinks.findings)
|
|
174
|
+
rawFindings.push({ ...row, id: `finding-${String(rawFindings.length + 1).padStart(3, "0")}` });
|
|
167
175
|
// Export-boundary redaction (cold path): secret-shaped values are scrubbed
|
|
168
176
|
// from everything the bundle serializes: envelopes, receipts (including
|
|
169
177
|
// delegation toolCallLog arguments), tool-event previews, audit rows,
|
|
@@ -171,6 +179,7 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
|
|
|
171
179
|
// session files are untouched; the bundle is the boundary, and the
|
|
172
180
|
// overview's redactionCount keeps the bundle honest about its filtering.
|
|
173
181
|
const tally = createRedactionTally();
|
|
182
|
+
const findings = redactSecretsDeep(rawFindings, tally);
|
|
174
183
|
const redactedRunSources: EvidenceRunSource[] = runSources.map((item) => ({
|
|
175
184
|
...item,
|
|
176
185
|
envelope: redactSecretsDeep(item.envelope, tally),
|
|
@@ -187,18 +196,21 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
|
|
|
187
196
|
};
|
|
188
197
|
const protectedArtifacts = redactSecretsDeep(protectedArtifactsRaw, tally);
|
|
189
198
|
const trustStatus = redactSecretsDeep(trustStatusRaw, tally);
|
|
190
|
-
const overview =
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
199
|
+
const overview: EvidenceOverview = {
|
|
200
|
+
...buildOverview(
|
|
201
|
+
evidenceId,
|
|
202
|
+
source,
|
|
203
|
+
redactedRunSources,
|
|
204
|
+
findings,
|
|
205
|
+
sessionLinks,
|
|
206
|
+
redactedAuditLinks,
|
|
207
|
+
redactedToolEvents,
|
|
208
|
+
protectedArtifacts,
|
|
209
|
+
),
|
|
210
|
+
decisions: redactSecretsDeep(decisionLinks.decisions, tally),
|
|
211
|
+
};
|
|
200
212
|
const transcript = redactSecretsText(
|
|
201
|
-
renderTranscript(overview, redactedRunSources, sessionLinks, trustStatusRaw),
|
|
213
|
+
renderTranscript(overview, redactedRunSources, sessionLinks, trustStatusRaw, findings),
|
|
202
214
|
tally,
|
|
203
215
|
);
|
|
204
216
|
const finalOverview: EvidenceOverview = { ...overview, redactionCount: tally.count };
|
|
@@ -215,7 +227,17 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
|
|
|
215
227
|
protectedArtifacts,
|
|
216
228
|
transcript,
|
|
217
229
|
);
|
|
218
|
-
return {
|
|
230
|
+
return {
|
|
231
|
+
evidenceId,
|
|
232
|
+
directory,
|
|
233
|
+
overview: finalOverview,
|
|
234
|
+
findings,
|
|
235
|
+
trustStatus,
|
|
236
|
+
ungroundedClaims: runSources.reduce((total, source) => {
|
|
237
|
+
const grounding = authenticatedReceipt(source)?.validationGrounding;
|
|
238
|
+
return total + (grounding === undefined ? 0 : Math.max(0, grounding.claimed - grounding.grounded));
|
|
239
|
+
}, 0),
|
|
240
|
+
};
|
|
219
241
|
}
|
|
220
242
|
|
|
221
243
|
function buildOverview(
|
|
@@ -229,7 +251,10 @@ function buildOverview(
|
|
|
229
251
|
protectedArtifacts: EvidenceProtectedArtifactsFile,
|
|
230
252
|
): EvidenceOverview {
|
|
231
253
|
const envelopes = runSources.map((item) => item.envelope);
|
|
232
|
-
const receipts = runSources.flatMap((item) =>
|
|
254
|
+
const receipts = runSources.flatMap((item) => {
|
|
255
|
+
const receipt = authenticatedReceipt(item);
|
|
256
|
+
return receipt === null ? [] : [receipt];
|
|
257
|
+
});
|
|
233
258
|
const toolStats = receipts.flatMap((receipt) => receipt.toolStats);
|
|
234
259
|
const runIds = envelopes.map((envelope) => envelope.id).sort(compareStrings);
|
|
235
260
|
const sessionIds = uniqueStrings(
|
|
@@ -619,7 +644,7 @@ async function writeEvidenceFiles(
|
|
|
619
644
|
await writeJson(join(directory, "overview.json"), overview);
|
|
620
645
|
await writeFile(
|
|
621
646
|
join(directory, "transcript.md"),
|
|
622
|
-
transcript ?? renderTranscript(overview, runSources, sessionLinks, trustStatus),
|
|
647
|
+
transcript ?? renderTranscript(overview, runSources, sessionLinks, trustStatus, findings),
|
|
623
648
|
"utf8",
|
|
624
649
|
);
|
|
625
650
|
await writeJsonl(join(directory, "trace.raw.jsonl"), rawTraceRows(runSources));
|
|
@@ -736,6 +761,7 @@ async function linkSessionEntries(
|
|
|
736
761
|
const attemptedSessionIds = sourceSessionIds(source, runSources);
|
|
737
762
|
const windows = attributionWindows(ledger, runSources, attemptedSessionIds);
|
|
738
763
|
const result: SessionLinkResult = {
|
|
764
|
+
decisionBoards: new Map(),
|
|
739
765
|
entries: [],
|
|
740
766
|
attemptedSessionIds,
|
|
741
767
|
missingSessionIds: [],
|
|
@@ -748,6 +774,7 @@ async function linkSessionEntries(
|
|
|
748
774
|
continue;
|
|
749
775
|
}
|
|
750
776
|
result.readErrors.push(...read.errors);
|
|
777
|
+
result.decisionBoards.set(sessionId, foldDecisionBoard(filterEntriesToActivePath(read.entries, read.leafTurnId)));
|
|
751
778
|
for (const entry of read.entries) {
|
|
752
779
|
const link = linkSessionEntry(entry, windows);
|
|
753
780
|
if (source.kind === "run" && !linkCoversRun(link, source.runId)) continue;
|
|
@@ -1280,6 +1307,7 @@ function renderTranscript(
|
|
|
1280
1307
|
runSources: ReadonlyArray<EvidenceRunSource>,
|
|
1281
1308
|
sessionLinks: SessionLinkResult,
|
|
1282
1309
|
trustStatus: EvidenceTrustStatusFile,
|
|
1310
|
+
findings: ReadonlyArray<EvidenceFinding>,
|
|
1283
1311
|
): string {
|
|
1284
1312
|
const trustByRun = new Map(trustStatus.runs.map((entry) => [entry.runId, entry.status]));
|
|
1285
1313
|
const lines = [
|
|
@@ -1306,6 +1334,21 @@ function renderTranscript(
|
|
|
1306
1334
|
}
|
|
1307
1335
|
}
|
|
1308
1336
|
}
|
|
1337
|
+
const decisionFindings = findings.filter(
|
|
1338
|
+
(row) => row.tag === "context-provenance" && row.message.startsWith("Decision ref "),
|
|
1339
|
+
);
|
|
1340
|
+
if (decisionFindings.length > 0) {
|
|
1341
|
+
lines.push("", "## Decision provenance");
|
|
1342
|
+
for (const row of decisionFindings) lines.push(`- [${row.severity}] ${row.runId}: ${row.message}`);
|
|
1343
|
+
for (const decision of overview.decisions ?? []) {
|
|
1344
|
+
lines.push(
|
|
1345
|
+
`\n### ${decision.ref} (run ${decision.runId}, session ${decision.sessionId})`,
|
|
1346
|
+
"```json",
|
|
1347
|
+
JSON.stringify(decision.record, null, 2),
|
|
1348
|
+
"```",
|
|
1349
|
+
);
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1309
1352
|
if (sessionLinks.entries.length > 0) {
|
|
1310
1353
|
lines.push("", "## Linked Session Transcript");
|
|
1311
1354
|
for (const linked of sessionLinks.entries) {
|
|
@@ -1577,6 +1620,7 @@ function parseRunEnvelope(value: unknown, source: string): RunEnvelope {
|
|
|
1577
1620
|
// tampered. The validated reads below still gate the fields evidence uses.
|
|
1578
1621
|
return {
|
|
1579
1622
|
...(value as Partial<RunEnvelope>),
|
|
1623
|
+
version: 1,
|
|
1580
1624
|
id: readString(value, source, "id"),
|
|
1581
1625
|
agentId: readString(value, source, "agentId"),
|
|
1582
1626
|
executionRole: readExecutionRole(value, source),
|
|
@@ -1874,3 +1918,46 @@ function sanitizeEvidenceId(value: string): string {
|
|
|
1874
1918
|
const clean = value.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1875
1919
|
return clean.length === 0 ? "unknown" : clean;
|
|
1876
1920
|
}
|
|
1921
|
+
|
|
1922
|
+
/** Receipt refs authenticate the link, while the session ledger supplies the recorded argument. */
|
|
1923
|
+
function resolveReceiptDecisions(
|
|
1924
|
+
runSources: ReadonlyArray<EvidenceRunSource>,
|
|
1925
|
+
sessions: SessionLinkResult,
|
|
1926
|
+
): {
|
|
1927
|
+
decisions: EvidenceDecision[];
|
|
1928
|
+
findings: EvidenceFinding[];
|
|
1929
|
+
} {
|
|
1930
|
+
const decisions: EvidenceDecision[] = [];
|
|
1931
|
+
const findings: EvidenceFinding[] = [];
|
|
1932
|
+
for (const source of runSources) {
|
|
1933
|
+
const receipt = authenticatedReceipt(source);
|
|
1934
|
+
if (!receipt?.decisionRefs?.length) continue;
|
|
1935
|
+
const sessionId = receipt.sessionId;
|
|
1936
|
+
const board = sessionId === null ? [] : (sessions.decisionBoards.get(sessionId) ?? []);
|
|
1937
|
+
const records = new Map(
|
|
1938
|
+
board.flatMap((entry) =>
|
|
1939
|
+
entry.decisions.map(
|
|
1940
|
+
(record) =>
|
|
1941
|
+
[
|
|
1942
|
+
decisionRef(entry.interviewId, record.key),
|
|
1943
|
+
{ ...record, source: record.source ?? (entry.origin === "agent" ? ("agent" as const) : ("operator" as const)) },
|
|
1944
|
+
] as const,
|
|
1945
|
+
),
|
|
1946
|
+
),
|
|
1947
|
+
);
|
|
1948
|
+
for (const ref of new Set(receipt.decisionRefs)) {
|
|
1949
|
+
const record = records.get(ref);
|
|
1950
|
+
if (record && sessionId !== null) decisions.push({ runId: receipt.runId, sessionId, ref, record });
|
|
1951
|
+
findings.push(
|
|
1952
|
+
finding(
|
|
1953
|
+
findings.length,
|
|
1954
|
+
record ? "info" : "warn",
|
|
1955
|
+
"context-provenance",
|
|
1956
|
+
receipt.runId,
|
|
1957
|
+
`Decision ref ${ref} ${record ? "resolved" : "does not resolve"} on session ${sessionId ?? "(unlinked)"} active path`,
|
|
1958
|
+
),
|
|
1959
|
+
);
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
return { decisions, findings };
|
|
1963
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of one evidence bundle's trust record.
|
|
3
|
+
*
|
|
4
|
+
* `evidence inspect <id>` prints an operator record that quotes the task text,
|
|
5
|
+
* the bundle's file list, and per-finding prose. This is the same bundle read
|
|
6
|
+
* down to the one thing a GUI can carry safely and usefully: which runs the
|
|
7
|
+
* bundle covers, what verdict each run earned, and which axis produced it.
|
|
8
|
+
*
|
|
9
|
+
* Every value here comes from a closed vocabulary. The axis names, the axis
|
|
10
|
+
* states, and the verdicts are all enumerations the harness owns, so there is
|
|
11
|
+
* no free-form text on this surface at all, which is what lets it answer the
|
|
12
|
+
* question the inventory raises without reopening the boundary the inventory
|
|
13
|
+
* closed.
|
|
14
|
+
*
|
|
15
|
+
* Unlike the other fixed reads this one takes an identifier, because an
|
|
16
|
+
* operator names the bundle. The GUI host may only pass back an id it served
|
|
17
|
+
* inside its current bounded window; see `apps/workbench/artifact-allowlist.ts`.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { clioDataDir } from "../../core/xdg.js";
|
|
21
|
+
import { inspectEvidence, TRUST_STATUS_AXES, type TrustStatusAxis, type TrustVerdict, trustVerdict } from "./index.js";
|
|
22
|
+
|
|
23
|
+
export const EVIDENCE_DETAIL_MAX_RUNS = 16;
|
|
24
|
+
|
|
25
|
+
export interface EvidenceDetailRun {
|
|
26
|
+
readonly runId: string;
|
|
27
|
+
readonly verdict: TrustVerdict;
|
|
28
|
+
/** Every axis, always all six, so an absent axis is stated rather than missing. */
|
|
29
|
+
readonly axes: Readonly<Record<TrustStatusAxis, string>>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface EvidenceDetailSnapshot {
|
|
33
|
+
readonly version: 1;
|
|
34
|
+
readonly generatedAt: string;
|
|
35
|
+
readonly evidenceId: string;
|
|
36
|
+
readonly sourceKind: "run" | "session" | "eval";
|
|
37
|
+
/** False when the bundle predates the canonical trust projection. */
|
|
38
|
+
readonly canonical: boolean;
|
|
39
|
+
readonly runs: readonly EvidenceDetailRun[];
|
|
40
|
+
readonly runsTruncated: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function evidenceDetailSnapshot(
|
|
44
|
+
evidenceId: string,
|
|
45
|
+
now: () => number = Date.now,
|
|
46
|
+
dataDir: string = clioDataDir(),
|
|
47
|
+
): Promise<EvidenceDetailSnapshot> {
|
|
48
|
+
const inspected = await inspectEvidence(dataDir, evidenceId);
|
|
49
|
+
const all = inspected.trustStatus.runs;
|
|
50
|
+
const window = all.slice(0, EVIDENCE_DETAIL_MAX_RUNS);
|
|
51
|
+
return {
|
|
52
|
+
version: 1,
|
|
53
|
+
generatedAt: new Date(now()).toISOString(),
|
|
54
|
+
evidenceId: inspected.overview.evidenceId,
|
|
55
|
+
sourceKind: inspected.overview.source.kind,
|
|
56
|
+
canonical: inspected.trustStatus.projection === "canonical",
|
|
57
|
+
runs: window.map(
|
|
58
|
+
(run): EvidenceDetailRun => ({
|
|
59
|
+
runId: run.runId,
|
|
60
|
+
verdict: trustVerdict(run.status),
|
|
61
|
+
axes: Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, run.status[axis].state])) as Record<
|
|
62
|
+
TrustStatusAxis,
|
|
63
|
+
string
|
|
64
|
+
>,
|
|
65
|
+
}),
|
|
66
|
+
),
|
|
67
|
+
runsTruncated: all.length > window.length,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
@@ -9,6 +9,7 @@ import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
|
|
|
9
9
|
import { compareCodepoints as compareStrings } from "./ordering.js";
|
|
10
10
|
import { buildEvidenceTrustStatusFile } from "./run-trust.js";
|
|
11
11
|
import { evidenceDirectory, findingsFile } from "./store.js";
|
|
12
|
+
import { inspectRunReceiptTrustStatus } from "./trust-status.js";
|
|
12
13
|
import {
|
|
13
14
|
EVIDENCE_VERSION,
|
|
14
15
|
type EvidenceAuditLinkedRow,
|
|
@@ -107,7 +108,18 @@ export async function buildEvalEvidence(options: BuildEvalEvidenceOptions): Prom
|
|
|
107
108
|
gateDecisions,
|
|
108
109
|
trustStatus,
|
|
109
110
|
);
|
|
110
|
-
return {
|
|
111
|
+
return {
|
|
112
|
+
evidenceId,
|
|
113
|
+
directory,
|
|
114
|
+
overview,
|
|
115
|
+
findings,
|
|
116
|
+
trustStatus,
|
|
117
|
+
ungroundedClaims: linkedRuns.runSources.reduce((total, source) => {
|
|
118
|
+
if (!inspectRunReceiptTrustStatus(source.receipt, source.envelope).integrity.ok) return total;
|
|
119
|
+
const grounding = source.receipt?.validationGrounding;
|
|
120
|
+
return total + (grounding === undefined ? 0 : Math.max(0, grounding.claimed - grounding.grounded));
|
|
121
|
+
}, 0),
|
|
122
|
+
};
|
|
111
123
|
}
|
|
112
124
|
|
|
113
125
|
export function evalEvidenceId(evalId: string): string {
|
|
@@ -7,7 +7,7 @@ import type { EvidenceTag } from "./types.js";
|
|
|
7
7
|
*
|
|
8
8
|
* The forensic layer (`evidence/build.ts`) speaks the canonical 23-tag
|
|
9
9
|
* `EVIDENCE_TAGS` vocabulary over durable artifacts. The live layer
|
|
10
|
-
* (`safety/finish-contract.ts`) speaks a
|
|
10
|
+
* (`safety/finish-contract.ts`) speaks a 4-kind in-loop vocabulary
|
|
11
11
|
* (`FinishContractEvidenceKind`) over the last ~80 session entries. They are
|
|
12
12
|
* the same accountability concept observed at two depths.
|
|
13
13
|
*
|
|
@@ -29,11 +29,15 @@ import type { EvidenceTag } from "./types.js";
|
|
|
29
29
|
* - dispatch_receipt: a passed dispatch receipt, whose forensic concerns are
|
|
30
30
|
* `receipt-integrity` (the receipt verifies) and `session-linked` (the run
|
|
31
31
|
* is linked to its session).
|
|
32
|
+
* - limitation: a successful `limitation` tool receipt, which the forensic
|
|
33
|
+
* layer records as the `completion-evidence` info row for a run that
|
|
34
|
+
* finished limited instead of evidenced.
|
|
32
35
|
*/
|
|
33
36
|
export const FINISH_CONTRACT_EVIDENCE_TAGS: Record<FinishContractEvidenceKind, readonly EvidenceTag[]> = {
|
|
34
37
|
validation_command: ["no-validation", "proxy-validation"],
|
|
35
38
|
protected_artifact: ["protected-artifact"],
|
|
36
39
|
dispatch_receipt: ["receipt-integrity", "session-linked"],
|
|
40
|
+
limitation: ["completion-evidence"],
|
|
37
41
|
} as const;
|
|
38
42
|
|
|
39
43
|
/** The canonical tags a single live finish-contract kind projects onto. */
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of recent evidence artifacts.
|
|
3
|
+
*
|
|
4
|
+
* `evidence list` is an operator table and `evidence inspect <id>` needs an id,
|
|
5
|
+
* so neither is a transport a GUI host can invoke blind. This command accepts
|
|
6
|
+
* no identifier, path, or limit, selects a bounded newest-first window itself,
|
|
7
|
+
* and emits provenance, tags, totals, and a trust verdict.
|
|
8
|
+
*
|
|
9
|
+
* An overview carries the working directories the runs executed in, the task
|
|
10
|
+
* text the operator typed, and the file names inside the bundle. None of that
|
|
11
|
+
* appears here. What does is the shape of the artifact and how far it can be
|
|
12
|
+
* trusted, which is what an operator picks a bundle by.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { clioDataDir } from "../../core/xdg.js";
|
|
16
|
+
import { truncateToWidth } from "../../engine/tui-primitives.js";
|
|
17
|
+
import { sanitizeCallTargetText } from "../safety/call-target.js";
|
|
18
|
+
import {
|
|
19
|
+
EVIDENCE_TAGS,
|
|
20
|
+
type EvidenceOverview,
|
|
21
|
+
type EvidenceTag,
|
|
22
|
+
listEvidenceOverviews,
|
|
23
|
+
loadEvidenceTrustStatus,
|
|
24
|
+
type TrustVerdict,
|
|
25
|
+
trustVerdict,
|
|
26
|
+
} from "./index.js";
|
|
27
|
+
|
|
28
|
+
export const EVIDENCE_INVENTORY_MAX_ARTIFACTS = 12;
|
|
29
|
+
export const EVIDENCE_INVENTORY_MAX_IDS = 8;
|
|
30
|
+
|
|
31
|
+
const IDENTITY_WIDTH = 128;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Worst verdict first.
|
|
35
|
+
*
|
|
36
|
+
* An artifact covering several runs is only as trustworthy as its weakest run,
|
|
37
|
+
* so the fold takes the worst rather than the newest or the most common. A
|
|
38
|
+
* `compromised` run inside an otherwise clean bundle is the fact the operator
|
|
39
|
+
* needs, and averaging it away would be the one summary worth not printing.
|
|
40
|
+
*/
|
|
41
|
+
const VERDICT_SEVERITY: ReadonlyArray<TrustVerdict> = ["compromised", "unverified", "unknown", "grounded", "reviewed"];
|
|
42
|
+
|
|
43
|
+
export interface EvidenceInventoryArtifact {
|
|
44
|
+
readonly evidenceId: string;
|
|
45
|
+
readonly sourceKind: "run" | "session" | "eval";
|
|
46
|
+
readonly generatedAt: string;
|
|
47
|
+
readonly startedAt: string | null;
|
|
48
|
+
readonly endedAt: string | null;
|
|
49
|
+
readonly runIds: readonly string[];
|
|
50
|
+
readonly runIdsTruncated: boolean;
|
|
51
|
+
readonly agentIds: readonly string[];
|
|
52
|
+
readonly statuses: readonly string[];
|
|
53
|
+
readonly tags: readonly EvidenceTag[];
|
|
54
|
+
readonly totals: Readonly<{
|
|
55
|
+
runs: number;
|
|
56
|
+
receipts: number;
|
|
57
|
+
toolCalls: number;
|
|
58
|
+
toolErrors: number;
|
|
59
|
+
blockedToolCalls: number;
|
|
60
|
+
protectedArtifacts: number;
|
|
61
|
+
tokens: number;
|
|
62
|
+
costUsd: number;
|
|
63
|
+
wallTimeMs: number;
|
|
64
|
+
}>;
|
|
65
|
+
/** Secret-shaped values the builder replaced across the bundle's exports. */
|
|
66
|
+
readonly redactionCount: number;
|
|
67
|
+
readonly trust: Readonly<{
|
|
68
|
+
verdict: TrustVerdict;
|
|
69
|
+
/** Runs whose canonical trust status the bundle actually recorded. */
|
|
70
|
+
runsCovered: number;
|
|
71
|
+
/** True when the bundle predates the canonical trust projection. */
|
|
72
|
+
historical: boolean;
|
|
73
|
+
}>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface EvidenceInventorySnapshot {
|
|
77
|
+
readonly version: 1;
|
|
78
|
+
readonly generatedAt: string;
|
|
79
|
+
readonly artifacts: readonly EvidenceInventoryArtifact[];
|
|
80
|
+
readonly truncated: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function bounded(value: string, width: number): string {
|
|
84
|
+
const sanitized = sanitizeCallTargetText(value);
|
|
85
|
+
if (sanitized.length === 0) return "unavailable";
|
|
86
|
+
return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Distinct, sanitized, bounded, in first-seen order. */
|
|
90
|
+
function identities(values: ReadonlyArray<string>): string[] {
|
|
91
|
+
const seen: string[] = [];
|
|
92
|
+
for (const value of values) {
|
|
93
|
+
const text = bounded(value, IDENTITY_WIDTH);
|
|
94
|
+
if (!seen.includes(text)) seen.push(text);
|
|
95
|
+
if (seen.length >= EVIDENCE_INVENTORY_MAX_IDS) break;
|
|
96
|
+
}
|
|
97
|
+
return seen;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function tally(value: number | undefined): number {
|
|
101
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function amount(value: number | undefined): number {
|
|
105
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Newest generation first. An unparseable stamp sorts oldest rather than throwing. */
|
|
109
|
+
function byNewest(a: EvidenceOverview, b: EvidenceOverview): number {
|
|
110
|
+
return (Date.parse(b.generatedAt) || 0) - (Date.parse(a.generatedAt) || 0);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export async function evidenceInventorySnapshot(
|
|
114
|
+
now: () => number = Date.now,
|
|
115
|
+
dataDir: string = clioDataDir(),
|
|
116
|
+
): Promise<EvidenceInventorySnapshot> {
|
|
117
|
+
const all = (await listEvidenceOverviews(dataDir)).sort(byNewest);
|
|
118
|
+
const window = all.slice(0, EVIDENCE_INVENTORY_MAX_ARTIFACTS);
|
|
119
|
+
const artifacts: EvidenceInventoryArtifact[] = [];
|
|
120
|
+
for (const overview of window) {
|
|
121
|
+
// One unreadable trust file costs that artifact its verdict, never the
|
|
122
|
+
// whole inventory: the bundle itself is still the thing being listed.
|
|
123
|
+
let verdict: TrustVerdict = "unknown";
|
|
124
|
+
let runsCovered = 0;
|
|
125
|
+
let historical = true;
|
|
126
|
+
try {
|
|
127
|
+
const status = await loadEvidenceTrustStatus(dataDir, overview.evidenceId);
|
|
128
|
+
historical = status.projection !== "canonical";
|
|
129
|
+
runsCovered = status.runs.length;
|
|
130
|
+
const verdicts = status.runs.map((run) => trustVerdict(run.status));
|
|
131
|
+
verdict = VERDICT_SEVERITY.find((candidate) => verdicts.includes(candidate)) ?? "unknown";
|
|
132
|
+
} catch {
|
|
133
|
+
verdict = "unknown";
|
|
134
|
+
}
|
|
135
|
+
artifacts.push({
|
|
136
|
+
evidenceId: bounded(overview.evidenceId, IDENTITY_WIDTH),
|
|
137
|
+
sourceKind: overview.source.kind,
|
|
138
|
+
generatedAt: overview.generatedAt,
|
|
139
|
+
startedAt: overview.startedAt,
|
|
140
|
+
endedAt: overview.endedAt,
|
|
141
|
+
runIds: identities(overview.runIds),
|
|
142
|
+
runIdsTruncated: overview.runIds.length > EVIDENCE_INVENTORY_MAX_IDS,
|
|
143
|
+
agentIds: identities(overview.agentIds),
|
|
144
|
+
statuses: identities(overview.statuses),
|
|
145
|
+
tags: overview.tags.filter((tag) => EVIDENCE_TAGS.includes(tag)),
|
|
146
|
+
totals: {
|
|
147
|
+
runs: tally(overview.totals.runs),
|
|
148
|
+
receipts: tally(overview.totals.receipts),
|
|
149
|
+
toolCalls: tally(overview.totals.toolCalls),
|
|
150
|
+
toolErrors: tally(overview.totals.toolErrors),
|
|
151
|
+
blockedToolCalls: tally(overview.totals.blockedToolCalls),
|
|
152
|
+
protectedArtifacts: tally(overview.totals.protectedArtifacts),
|
|
153
|
+
tokens: tally(overview.totals.tokens),
|
|
154
|
+
costUsd: amount(overview.totals.costUsd),
|
|
155
|
+
wallTimeMs: tally(overview.totals.wallTimeMs),
|
|
156
|
+
},
|
|
157
|
+
redactionCount: tally(overview.redactionCount),
|
|
158
|
+
trust: { verdict, runsCovered, historical },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
version: 1,
|
|
163
|
+
generatedAt: new Date(now()).toISOString(),
|
|
164
|
+
artifacts,
|
|
165
|
+
truncated: all.length > window.length,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
@@ -2,6 +2,7 @@ import { readdir, readFile } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { assertSafeId } from "../../core/safe-id.js";
|
|
4
4
|
import { type GateDecisionArtifact, verifyGateDecisionArtifact } from "../dispatch/index.js";
|
|
5
|
+
import { isDecisionRecord } from "../session/entries.js";
|
|
5
6
|
import { compareCodepoints as compareStrings } from "./ordering.js";
|
|
6
7
|
import { hasRunProvenance, type RunProvenanceView, runProvenanceFromUnknown } from "./provenance.js";
|
|
7
8
|
import { normalizeTrustStatus } from "./trust-status.js";
|
|
@@ -230,6 +231,7 @@ function parseOverview(value: unknown, source: string): EvidenceOverview {
|
|
|
230
231
|
tags,
|
|
231
232
|
files,
|
|
232
233
|
...(redactionCount === undefined ? {} : { redactionCount }),
|
|
234
|
+
...(value.decisions === undefined ? {} : { decisions: readDecisions(value.decisions, `${source}.decisions`) }),
|
|
233
235
|
};
|
|
234
236
|
}
|
|
235
237
|
|
|
@@ -335,3 +337,17 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
335
337
|
export function findingsFile(evidenceId: string, findings: EvidenceFinding[]): EvidenceFindingsFile {
|
|
336
338
|
return { version: 1, evidenceId, findings };
|
|
337
339
|
}
|
|
340
|
+
|
|
341
|
+
function readDecisions(value: unknown, source: string): NonNullable<EvidenceOverview["decisions"]> {
|
|
342
|
+
if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
|
|
343
|
+
return value.map((entry: unknown, index) => {
|
|
344
|
+
const path = `${source}[${index}]`;
|
|
345
|
+
if (!isRecord(entry) || !isDecisionRecord(entry.record)) throw new Error(`${path}: expected recorded decision`);
|
|
346
|
+
return {
|
|
347
|
+
runId: readString(entry, path, "runId"),
|
|
348
|
+
sessionId: readString(entry, path, "sessionId"),
|
|
349
|
+
ref: readString(entry, path, "ref"),
|
|
350
|
+
record: entry.record,
|
|
351
|
+
};
|
|
352
|
+
});
|
|
353
|
+
}
|
|
@@ -2,6 +2,7 @@ import type { GateDecisionArtifact, RunEnvelope, RunReceipt, ToolCallStat } from
|
|
|
2
2
|
import type { RunPersonaOverride, RunPipelineProvenance, RunReceiptAutonomyEnforcement } from "../dispatch/types.js";
|
|
3
3
|
import type { EvalCommandPhase, EvalFailureClass, EvalRunRecord } from "../eval/index.js";
|
|
4
4
|
import type { ProtectedArtifact } from "../safety/protected-artifacts.js";
|
|
5
|
+
import type { DecisionRecord } from "../session/entries.js";
|
|
5
6
|
import type { RunEscalationCounts } from "./provenance.js";
|
|
6
7
|
import type { CanonicalTrustStatus } from "./trust-status.js";
|
|
7
8
|
|
|
@@ -81,7 +82,16 @@ export interface EvidenceTotals {
|
|
|
81
82
|
wallTimeMs: number;
|
|
82
83
|
}
|
|
83
84
|
|
|
85
|
+
export interface EvidenceDecision {
|
|
86
|
+
runId: string;
|
|
87
|
+
sessionId: string;
|
|
88
|
+
ref: string;
|
|
89
|
+
record: DecisionRecord;
|
|
90
|
+
}
|
|
91
|
+
|
|
84
92
|
export interface EvidenceOverview {
|
|
93
|
+
/** Recorded arguments resolved from authenticated receipts on the linked active session path. */
|
|
94
|
+
decisions?: EvidenceDecision[];
|
|
85
95
|
version: 1;
|
|
86
96
|
evidenceId: string;
|
|
87
97
|
source: EvidenceSource;
|
|
@@ -137,6 +147,8 @@ export interface EvidenceBuildResult {
|
|
|
137
147
|
overview: EvidenceOverview;
|
|
138
148
|
findings: EvidenceFinding[];
|
|
139
149
|
trustStatus: EvidenceTrustStatusFile;
|
|
150
|
+
/** Total claims without matching commands, from integrity-verified receipts only. */
|
|
151
|
+
ungroundedClaims: number;
|
|
140
152
|
}
|
|
141
153
|
|
|
142
154
|
export interface EvidenceInspectable {
|
|
@@ -22,6 +22,13 @@ export function extensionSnapshotFor(cwd = process.cwd()): ExtensionSnapshot {
|
|
|
22
22
|
return buildExtensionSnapshot({ cwd, generation: 0 });
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* The canonical accessor for the enabled roots of one extension resource
|
|
27
|
+
* kind. The agent registry, fleet contract, skill and common resource
|
|
28
|
+
* loaders, and the extensions contract all read through it, so each of them
|
|
29
|
+
* sees the committed snapshot for the booted cwd or the ephemeral
|
|
30
|
+
* generation-0 build otherwise. Returns a fresh array the caller may mutate.
|
|
31
|
+
*/
|
|
25
32
|
export function enabledExtensionResourceRoots(
|
|
26
33
|
kind: ExtensionResourceKind,
|
|
27
34
|
cwd = process.cwd(),
|
|
@@ -94,8 +94,10 @@ export const INTEROP_AGENT_KINDS: ReadonlyArray<InteropAgentKind> = [
|
|
|
94
94
|
id: "antigravity",
|
|
95
95
|
label: "Antigravity CLI",
|
|
96
96
|
binaryNames: ["agy"],
|
|
97
|
-
userDir: ".
|
|
98
|
-
|
|
97
|
+
userDir: ".gemini/antigravity-cli",
|
|
98
|
+
legacyUserDirs: [".antigravitycli"],
|
|
99
|
+
projectDir: ".gemini/antigravity-cli",
|
|
100
|
+
legacyProjectDirs: [".antigravitycli"],
|
|
99
101
|
instructionFiles: [],
|
|
100
102
|
},
|
|
101
103
|
{
|
|
@@ -133,7 +135,9 @@ export function foreignAgentDirs(): ReadonlyArray<string> {
|
|
|
133
135
|
const dirs: string[] = [];
|
|
134
136
|
for (const kind of INTEROP_AGENT_KINDS) {
|
|
135
137
|
dirs.push(`~/${kind.userDir}/`);
|
|
138
|
+
for (const legacy of kind.legacyUserDirs ?? []) dirs.push(`~/${legacy}/`);
|
|
136
139
|
if (kind.projectDir !== undefined) dirs.push(`${kind.projectDir}/`);
|
|
140
|
+
for (const legacy of kind.legacyProjectDirs ?? []) dirs.push(`${legacy}/`);
|
|
137
141
|
}
|
|
138
142
|
return [...new Set(dirs)];
|
|
139
143
|
}
|
|
@@ -33,8 +33,12 @@ export interface InteropAgentKind {
|
|
|
33
33
|
binaryNames: ReadonlyArray<string>;
|
|
34
34
|
/** Home-relative directory the agent owns. */
|
|
35
35
|
userDir: string;
|
|
36
|
+
/** Older home-relative roots still owned by supported installations. */
|
|
37
|
+
legacyUserDirs?: ReadonlyArray<string>;
|
|
36
38
|
/** Project-relative directory the agent owns, when it has one distinct from the repo's own. */
|
|
37
39
|
projectDir?: string;
|
|
40
|
+
/** Older project-relative roots still protected from Clio writes. */
|
|
41
|
+
legacyProjectDirs?: ReadonlyArray<string>;
|
|
38
42
|
userSkillRoot?: string;
|
|
39
43
|
projectSkillRoot?: string;
|
|
40
44
|
userPromptRoot?: string;
|