@iowarp/clio-coder 0.4.4 → 0.4.6
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 +116 -2
- package/CONTRIBUTING.md +39 -24
- package/NOTICE +16 -0
- package/README.md +343 -403
- package/dist/{acp-WNAYYF4F.js → acp-UVEVWSDL.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-VWY37DTK.js} +78 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-PCV2XQDV.js} +38 -38
- package/dist/builtins-PD652MTK.js +22 -0
- package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NRO2BJRH.js → chunk-24T2YZ7A.js} +10686 -4464
- package/dist/{chunk-Y55JBDO5.js → chunk-2AKYFREM.js} +38 -23
- package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
- package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
- package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
- package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
- package/dist/{chunk-UXCU4E3T.js → chunk-3BJGMT2D.js} +35 -14
- package/dist/{chunk-5ICU3EUH.js → chunk-3HQVBIKD.js} +5 -5
- package/dist/{chunk-GWZNEVM2.js → chunk-3JLFK5MW.js} +9 -9
- package/dist/{chunk-XXYSBZIQ.js → chunk-3O2ZAUGQ.js} +4 -4
- package/dist/{chunk-GX5WYQO4.js → chunk-3QKXHCGS.js} +8 -8
- package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-OEJSLEPW.js → chunk-3WBALRQH.js} +337 -337
- package/dist/{chunk-ELWDPP3Y.js → chunk-4DU2TVI4.js} +8 -8
- package/dist/{chunk-JSD46VO2.js → chunk-4U4TKZFR.js} +43 -36
- package/dist/{chunk-FEAXX7B6.js → chunk-4VMV6OS6.js} +4 -4
- package/dist/{chunk-2ZSONWVL.js → chunk-536HXRFE.js} +13 -13
- package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
- package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
- package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-Q4WO54TA.js → chunk-5QRX7SLS.js} +11 -11
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-DT3LWJOB.js → chunk-6HAO6X5B.js} +24 -6
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-K6T2ZAMZ.js → chunk-6OII3LOK.js} +6 -6
- package/dist/{chunk-36CT5VVL.js → chunk-6RYDAVQT.js} +138 -89
- package/dist/{chunk-I7XBWTYH.js → chunk-6VRRJT7L.js} +5 -5
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-NAI6ZFCY.js → chunk-7JSSKXG2.js} +122 -11
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-IXIY2H4R.js → chunk-ACCKVSHU.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-B3MOMLJ4.js} +12 -12
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
- package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-23L32XTI.js → chunk-BLTEAUCB.js} +68 -39
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-XULDXHTN.js → chunk-BT7HGDOX.js} +105 -53
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
- package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
- package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
- package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
- package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
- package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-6UINWWS6.js → chunk-DXLUVUD4.js} +16 -16
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-E7RF4KBO.js} +5 -5
- package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
- package/dist/chunk-ECOMVOHP.js +139 -0
- package/dist/chunk-EFSEIZE6.js +56 -0
- package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/chunk-EM2WNQS2.js +93 -0
- package/dist/{chunk-57XXR6DR.js → chunk-F5Z7EWMN.js} +967 -246
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
- package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
- package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
- package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-EXLD33WO.js → chunk-GLYBJ4RQ.js} +24 -9
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-FFUPXJC4.js → chunk-HPTJF6DG.js} +32 -56
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-CUSRQKPU.js → chunk-HZ2T2YED.js} +299 -89
- package/dist/{chunk-YD5GIKET.js → chunk-HZFBVU5X.js} +49 -580
- package/dist/{chunk-6QOTUPRG.js → chunk-I2K2NCZQ.js} +65 -17
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-I2DWJ4GM.js → chunk-IGLVVNEG.js} +54 -42
- package/dist/{chunk-6Q3CYFD3.js → chunk-IKRWLEDA.js} +186 -35
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-2DSOYNFC.js → chunk-JMPL7NUB.js} +7 -7
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-KAFMW7WM.js} +72 -81
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
- package/dist/chunk-KPRLAMP4.js +32 -0
- package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
- package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- package/dist/{chunk-JQLNNIKT.js → chunk-LIN2K3EL.js} +6 -6
- package/dist/{chunk-2STGEDFV.js → chunk-LK2FN5JY.js} +2 -2
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
- package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
- package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
- package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
- package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4WR7VSYB.js → chunk-N2OKBREN.js} +23 -9
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/{chunk-4M6Z5QVF.js → chunk-NNWJYUNO.js} +11 -11
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- package/dist/{chunk-75W7L2E2.js → chunk-P5JMBPDJ.js} +1052 -171
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-S6PYF2XF.js → chunk-P6M7RKMI.js} +4 -4
- package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
- package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
- package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-DXKJURES.js → chunk-PZN2LQY6.js} +14 -11
- package/dist/{chunk-N56KALIC.js → chunk-Q7NNUHQV.js} +62 -35
- package/dist/{chunk-RQCKCSRL.js → chunk-QCOV5DFY.js} +22 -22
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-NEKRRTYW.js → chunk-QJMRYTCX.js} +8 -8
- package/dist/{chunk-YNFKXPEC.js → chunk-QNWRHOMF.js} +35 -66
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-72YIHOZQ.js → chunk-QXFBABFJ.js} +10 -10
- package/dist/chunk-R2CT5YDO.js +66 -0
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/{chunk-IGLP3ODT.js → chunk-RGZNQ5CT.js} +15 -15
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
- package/dist/{chunk-UEPWCCTY.js → chunk-SXQKNKRA.js} +12 -12
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-5636DCO5.js → chunk-TJFDL26W.js} +59 -12
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-7UGL4MB5.js → chunk-VAHLPXPY.js} +10 -10
- package/dist/{chunk-25QBEXRS.js → chunk-VANN3GDP.js} +7 -26
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-QUFRYSWI.js → chunk-VHMX7SXF.js} +129 -48
- package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
- package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
- package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
- package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
- package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-USR47QNF.js → chunk-WKUYQBCG.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-WNGF5AJX.js} +36 -22
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/{chunk-6OSVSQL5.js → chunk-WV6TDAPN.js} +41 -23
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-2ASED4PZ.js → chunk-X3BI7HTV.js} +26 -26
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-RZDWV63N.js → chunk-XWMSPJYN.js} +6 -6
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-6PAZTBPA.js → chunk-YPRSNUTC.js} +15 -6
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-LTIKRKFL.js → chunk-ZS43Y2FT.js} +4 -4
- package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
- package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
- package/dist/cli/index.js +44 -44
- package/dist/clio-QQCMTUZE.js +26 -0
- package/dist/{code-nav-IJR2DBPR.js → code-nav-GUPM6766.js} +48 -32
- package/dist/codewiki/build-worker.js +76 -29
- package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
- package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
- package/dist/{config-IUA6OYNS.js → config-IIM7YOD3.js} +211 -124
- package/dist/configure-4ZM5HWJX.js +73 -0
- package/dist/{context-BOYF5EJM.js → context-44BZLJ3J.js} +62 -31
- package/dist/{context-4MPR7WKB.js → context-AIDVQKMW.js} +126 -121
- package/dist/{context-2DKHWH2T.js → context-OL5P3HEP.js} +92 -62
- package/dist/context-clear-OQV76MYP.js +184 -0
- package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
- package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
- package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-ZUW3EGLS.js} +32 -31
- package/dist/detail-UXPWRANG.js +115 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-P3ZW6G77.js} +192 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-JJVGPZWT.js} +59 -58
- package/dist/{eval-OQOQUDHK.js → eval-V2RTN3UH.js} +476 -170
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-35PYWGSO.js +225 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-CIGGKI6J.js} +111 -94
- package/dist/{evolve-GSS52E5J.js → evolve-33SM3NJP.js} +108 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-LFO7SIPC.js} +147 -146
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-RLK72GU3.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-JZIBCGMW.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-2L5YGGZJ.js} +108 -91
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
- package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-LIAVKDUU.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-JIK3OQZR.js} +106 -89
- package/dist/fleet-view-IWHYGQKK.js +118 -0
- package/dist/{init-PXEXQSBF.js → init-NJEDOTQW.js} +124 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-RVCAYECG.js} +25 -25
- package/dist/inventory-74UL7UHU.js +118 -0
- package/dist/{library-B2W4N74O.js → library-CTKZA7K3.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-I76I5VUH.js} +108 -93
- package/dist/{models-GERTU3YI.js → models-D4YDIQZQ.js} +64 -62
- package/dist/{monitor-CPNIUULB.js → monitor-NKVD55HX.js} +137 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-I6OATVPK.js} +1715 -1687
- package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
- package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
- package/dist/preload-EJAWJEIO.js +116 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-4XMQKDNZ.js} +22 -20
- package/dist/{resources-4PXNMD5G.js → resources-TVYVXK3Q.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-OWQNNSJU.js} +164 -157
- package/dist/{share-2NWMJJEE.js → share-NPZZMUXG.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-OXFEAWMT.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-J5TCKSJA.js} +128 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-7II4DM57.js} +41 -40
- package/dist/slash-commands-MDSDSWYF.js +92 -0
- package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-OMH2XCSN.js → targets-KILZEOCE.js} +161 -94
- package/dist/tasks-R6P6OV22.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-LZCG2KN3.js} +12 -11
- package/dist/tools-6OCQ6SVB.js +28 -0
- package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
- package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
- package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
- package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
- package/dist/{upgrade-MS72RJEP.js → upgrade-D2OZH6IQ.js} +42 -41
- package/dist/{usage-NHG6MCJM.js → usage-PIASNUS4.js} +137 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-LTHUY2PX.js} +28 -27
- package/dist/verify-HYF7KBVE.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-RK7JQ5NP.js +615 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +108 -95
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +7 -6
- package/docs/architecture/acp.md +10 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/context-engine.md +45 -60
- package/docs/architecture/context-working-set.md +7 -9
- package/docs/architecture/dispatch-architecture-rationale.md +1 -1
- package/docs/architecture/evidence-and-memory.md +10 -0
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +7 -7
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +45 -30
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +75 -61
- package/docs/guide/configuration-and-targets.md +126 -26
- package/docs/guide/configuration-reference.md +22 -7
- package/docs/guide/environment-variables.md +6 -2
- package/docs/guide/fleet-dispatch.md +13 -6
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +79 -20
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +9 -2
- package/docs/process/development-pipeline.md +11 -11
- package/docs/process/documentation-coverage.md +1 -1
- package/docs/process/documentation-guide.md +2 -2
- package/docs/process/eval-runner.md +15 -0
- package/docs/process/evals-internal.md +1 -1
- package/docs/process/release-cut-checklist.md +24 -12
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-model-negative-control.yaml +1 -0
- package/evals/behavioral-model.yaml +266 -1
- package/evals/fixtures/docs-retrieval.json +102 -0
- package/evals/fixtures/scalar-decision.json +17 -0
- package/evals/fixtures/scout-citation-pipeline.json +55 -0
- package/evals/fixtures/source-explanation.json +74 -0
- package/evals/fixtures/tool-arguments.json +18 -0
- package/evals/fixtures/tool-surface/read.txt +4 -0
- package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
- package/evals/no-edit-memory-grader.mjs +149 -0
- package/evals/scalar-decision-grader.py +41 -0
- package/evals/scalar-decision-machinery.ts +145 -0
- package/evals/source-explanation-grader.mjs +118 -0
- package/evals/tool-surface-grader.mjs +53 -0
- package/evals/tool-surface-model.yaml +274 -0
- package/package.json +14 -14
- package/skills/README.md +6 -6
- package/skills/registry.yaml +1 -1
- package/skills/skill-marketplace.json +1 -1
- package/src/cli/ask.ts +10 -10
- package/src/cli/bootstrap-generate.ts +6 -0
- package/src/cli/config-inspect.ts +24 -7
- package/src/cli/config-trust.ts +62 -0
- package/src/cli/config.ts +8 -0
- package/src/cli/configure-editor.ts +51 -0
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure-oauth.ts +1 -1
- package/src/cli/configure-onboarding.ts +232 -96
- package/src/cli/configure-prompts.ts +76 -0
- package/src/cli/configure-quick.ts +274 -0
- package/src/cli/configure-target.ts +14 -2
- package/src/cli/configure.ts +413 -174
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/eval.ts +17 -3
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/oauth-manual-input.ts +1 -1
- package/src/cli/reset.ts +2 -0
- package/src/cli/run.ts +16 -14
- package/src/cli/select.ts +35 -4
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +83 -31
- package/src/cli/tasks.ts +10 -1
- package/src/cli/upgrade.ts +11 -8
- package/src/cli/usage.ts +24 -0
- package/src/cli/wiki-generate.ts +239 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/config.ts +39 -15
- package/src/core/defaults.ts +38 -15
- package/src/{interactive → core}/external-editor.ts +4 -4
- package/src/core/file-references.ts +11 -1
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/settings-layers.ts +21 -5
- package/src/core/termination.ts +26 -9
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/coder.md +4 -2
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +7 -4
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/result-contract.ts +199 -26
- package/src/domains/config/classify.ts +1 -1
- package/src/domains/config/keybindings.ts +3 -31
- package/src/domains/context/bootstrap-prompt.ts +11 -9
- package/src/domains/context/bootstrap.ts +74 -39
- package/src/domains/context/clio-md.ts +88 -26
- package/src/domains/context/codewiki/build-operation.ts +121 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
- package/src/domains/context/codewiki/build-worker.ts +3 -35
- package/src/domains/context/codewiki/coordinator.ts +36 -6
- package/src/domains/context/codewiki/indexer.ts +59 -19
- package/src/domains/context/contract.ts +6 -2
- package/src/domains/context/extension.ts +72 -10
- package/src/domains/context/fingerprint.ts +39 -34
- package/src/domains/context/index.ts +7 -1
- package/src/domains/context/prompt-context.ts +55 -14
- package/src/domains/context/refresh.ts +9 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/generate.ts +201 -67
- package/src/domains/context/wiki/meta.ts +10 -2
- package/src/domains/context/wiki/plan-store.ts +70 -14
- package/src/domains/context/wiki/plan.ts +71 -14
- package/src/domains/context/wiki/prompts.ts +42 -1
- package/src/domains/context/wiki/source-content.ts +106 -0
- package/src/domains/context/wiki/staleness.ts +33 -22
- package/src/domains/context/working-set/contract.ts +8 -2
- package/src/domains/context/working-set/engine.ts +17 -4
- package/src/domains/context/working-set/fold.ts +15 -2
- package/src/domains/context/working-set/marker.ts +2 -1
- package/src/domains/context/working-set/project.ts +18 -7
- package/src/domains/context/working-set/recall.ts +82 -56
- package/src/domains/dispatch/active-route-planner.ts +6 -3
- package/src/domains/dispatch/admission-queue.ts +19 -7
- package/src/domains/dispatch/admission.ts +3 -3
- package/src/domains/dispatch/budget-envelope.ts +47 -82
- package/src/domains/dispatch/capacity-lease.ts +57 -19
- package/src/domains/dispatch/contract.ts +10 -2
- package/src/domains/dispatch/event-pump.ts +28 -7
- package/src/domains/dispatch/execution-role.ts +49 -2
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +190 -105
- package/src/domains/dispatch/fleet-run.ts +20 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/reservation-store.ts +8 -34
- package/src/domains/dispatch/route-approval.ts +3 -3
- package/src/domains/dispatch/route-observer.ts +4 -2
- package/src/domains/dispatch/route-quality.ts +6 -1
- package/src/domains/dispatch/types.ts +4 -3
- package/src/domains/dispatch/worker-spawn.ts +58 -21
- package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
- package/src/domains/eval/compare/behavioral.ts +81 -14
- package/src/domains/eval/compare/compare.ts +15 -5
- package/src/domains/eval/compare/envelope.ts +12 -5
- package/src/domains/eval/metrics/context.ts +24 -1
- package/src/domains/eval/metrics/tracked.ts +4 -28
- package/src/domains/eval/reports/comparison.ts +9 -9
- package/src/domains/eval/runners/clio-run.ts +5 -1
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +1 -0
- package/src/domains/eval/suites/run.ts +189 -13
- package/src/domains/eval/verifiers/integrity.ts +39 -0
- package/src/domains/eval/verifiers/patch.ts +58 -2
- package/src/domains/eval/workspaces/temp-copy.ts +3 -0
- package/src/domains/evidence/build.ts +4 -2
- package/src/domains/interop/registry.ts +2 -2
- package/src/domains/middleware/hooks-io.ts +45 -26
- package/src/domains/middleware/hooks.ts +6 -0
- package/src/domains/middleware/injection-screen.ts +23 -0
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/stalled-turn.ts +18 -3
- package/src/domains/middleware/task-board-reminder.ts +4 -2
- package/src/domains/middleware/task-nudge.ts +4 -1
- package/src/domains/mux/contract.ts +34 -1
- package/src/domains/mux/dock-controller.ts +8 -1
- package/src/domains/mux/index.ts +1 -0
- package/src/domains/mux/socket-client.ts +13 -3
- package/src/domains/observability/contract.ts +2 -2
- package/src/domains/observability/projection.ts +30 -9
- package/src/domains/prompts/compiler.ts +10 -2
- package/src/domains/prompts/contract.ts +7 -4
- package/src/domains/prompts/extension.ts +28 -64
- package/src/domains/prompts/fragments/identity/clio.md +23 -0
- package/src/domains/prompts/fragments/operating/contract.md +10 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +28 -15
- package/src/domains/prompts/fragments/wiki/plan.md +4 -4
- package/src/domains/prompts/preload-prefix.ts +31 -0
- package/src/domains/prompts/preload.ts +135 -61
- package/src/domains/providers/auth/backend-file.ts +15 -11
- package/src/domains/providers/auth/storage.ts +3 -5
- package/src/domains/providers/catalog.ts +18 -3
- package/src/domains/providers/probe/fingerprint.ts +13 -6
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +9 -0
- package/src/domains/safety/autonomy.ts +10 -1
- package/src/domains/safety/contract.ts +5 -1
- package/src/domains/safety/default-path-policy.ts +11 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/policy-engine.ts +189 -32
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/compaction/compact.ts +384 -21
- package/src/domains/session/compaction/cut-point.ts +42 -5
- package/src/domains/session/compaction/tokens.ts +9 -1
- package/src/domains/session/decision-board.ts +43 -33
- package/src/domains/session/entries.ts +169 -4
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +21 -3
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/engine/acp/adapter.ts +44 -12
- package/src/engine/acp/server.ts +1 -0
- package/src/engine/acp/transport.ts +2 -1
- package/src/engine/acp/types.ts +6 -1
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/openai-completions.ts +13 -6
- package/src/engine/apis/output-budget.ts +26 -10
- package/src/engine/claude/sdk-runtime.ts +4 -3
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +14 -3
- package/src/engine/loop-guard.ts +19 -2
- package/src/engine/provider-diagnostics.ts +129 -0
- package/src/engine/provider-payload.ts +3 -1
- package/src/engine/worker-runtime.ts +13 -2
- package/src/engine/worker-tools.ts +5 -1
- package/src/entry/extension-reload.ts +1 -0
- package/src/entry/orchestrator.ts +53 -15
- package/src/interactive/application-controller.ts +1 -31
- package/src/interactive/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-panel.ts +163 -637
- package/src/interactive/chat-renderer.ts +73 -30
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +18 -5
- package/src/interactive/editor-submit.ts +21 -31
- package/src/interactive/footer/dashboard.ts +8 -3
- package/src/interactive/footer/widgets.ts +50 -91
- package/src/interactive/interactive-application.ts +24 -44
- package/src/interactive/interactive-event-projection.ts +9 -45
- package/src/interactive/interactive-input-runtime.ts +3 -28
- package/src/interactive/interactive-presentation.ts +45 -16
- package/src/interactive/interactive-slash-runtime.ts +5 -40
- package/src/interactive/layout.ts +31 -5
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +5 -1
- package/src/interactive/overlay-lifecycle.ts +1 -0
- package/src/interactive/overlay-session-lifecycle.ts +7 -1
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/settings.ts +9 -8
- package/src/interactive/renderers/preview.ts +16 -0
- package/src/interactive/renderers/tool-execution.ts +84 -161
- package/src/interactive/renderers/worker-entry.ts +74 -43
- package/src/interactive/slash-autocomplete.ts +1 -6
- package/src/interactive/slash-commands.ts +16 -46
- package/src/interactive/status/controller.ts +0 -5
- package/src/interactive/status/state-machine.ts +44 -26
- package/src/interactive/status/types.ts +3 -0
- package/src/interactive/status/verbs.ts +13 -12
- package/src/interactive/transcript-detail.ts +50 -112
- package/src/interactive/turn-context.ts +221 -53
- package/src/interactive/turn-middleware.ts +3 -1
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-runtime.ts +11 -2
- package/src/interactive/turn-state.ts +10 -9
- package/src/interactive/view/artifacts.ts +4 -0
- package/src/interactive/view/view-overlay.ts +44 -34
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +7 -7
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +9 -2
- package/src/tools/codewiki/code-nav.ts +4 -10
- package/src/tools/compete-judge-task.ts +71 -0
- package/src/tools/compete-worktrees.ts +34 -0
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/decide.ts +1 -1
- package/src/tools/dispatch-admission.ts +12 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +7 -7
- package/src/tools/dispatch-runner.ts +48 -32
- package/src/tools/dispatch-schema.ts +30 -23
- package/src/tools/dispatch-scout-admission.ts +10 -44
- package/src/tools/dispatch-scout.ts +2 -3
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/ls.ts +7 -1
- package/src/tools/monitor.ts +26 -11
- package/src/tools/network-policy.ts +11 -24
- package/src/tools/observation.ts +39 -2
- package/src/tools/presentation.ts +1 -1
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +110 -2
- package/src/tools/tasks.ts +33 -7
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/numeric.ts +10 -5
- package/src/tools/web-fetch-network.ts +179 -0
- package/src/tools/web-fetch-surface.ts +2 -1
- package/src/tools/web-fetch.ts +15 -13
- package/src/tools/worker-evidence.ts +27 -0
- package/src/worker/spec-contract.ts +12 -8
- package/dist/builtins-WGALA46I.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-EL24TAU4.js +0 -1560
- package/dist/chunk-IZXGRF7P.js +0 -4048
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-ODGTEFFI.js +0 -50
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-V6HJFQZE.js +0 -228
- package/dist/clio-QLICPCF5.js +0 -25
- package/dist/configure-VEPX4NMX.js +0 -55
- package/dist/context-clear-S4ZJCQUX.js +0 -182
- package/dist/detail-A7JAVSIG.js +0 -98
- package/dist/evidence-4F5USFKH.js +0 -208
- package/dist/fleet-view-MN2VG4MR.js +0 -101
- package/dist/inventory-C26CFDRR.js +0 -101
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-ZXPJD64J.js +0 -92
- package/dist/tasks-IPAGMEIX.js +0 -36
- package/dist/tools-EFFEAIDP.js +0 -28
- package/dist/verify-FWYGPKMR.js +0 -29
- package/dist/wiki-generate-743CIGJW.js +0 -476
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import type { AskUserToolPolicy } from "../../tools/registry.js";
|
|
3
3
|
import type { AutonomyExposure } from "../safety/autonomy.js";
|
|
4
|
-
import { type DecisionLedgerEntry, type DecisionRecord, decisionRef } from "./entries.js";
|
|
4
|
+
import { type DecisionLedgerEntry, type DecisionRecord, type DecisionSource, decisionRef } from "./entries.js";
|
|
5
5
|
|
|
6
6
|
export interface DecisionLedgerEntryFields {
|
|
7
7
|
kind: "decisionLedger";
|
|
@@ -187,6 +187,46 @@ export function createDecisionBoardStore(deps: DecisionBoardStoreDeps = {}): Dec
|
|
|
187
187
|
dirty = true;
|
|
188
188
|
};
|
|
189
189
|
|
|
190
|
+
const revise = (
|
|
191
|
+
interviewId: string,
|
|
192
|
+
key: string,
|
|
193
|
+
revisionSource: DecisionSource,
|
|
194
|
+
correction?: string,
|
|
195
|
+
): DecisionLedgerEntryFields => {
|
|
196
|
+
syncToSession();
|
|
197
|
+
const interview = interviews.find((candidate) => candidate.interviewId === interviewId);
|
|
198
|
+
if (!interview) throw new Error(`decision board: interview ${interviewId} was not found on the active branch`);
|
|
199
|
+
const selected = interview.decisions.find((decision) => decision.key === key);
|
|
200
|
+
if (!selected) throw new Error(`decision board: decision ${key} was not found in interview ${interviewId}`);
|
|
201
|
+
const revisedAt = (deps.now?.() ?? new Date()).toISOString();
|
|
202
|
+
const normalizedCorrection = correction?.trim();
|
|
203
|
+
const entries = deps.readEntries?.() ?? [];
|
|
204
|
+
const parentTurnId = deps.getActiveLeafTurnId?.() ?? activeLeafFromEntries(entries);
|
|
205
|
+
if (!parentTurnId) throw new Error("decision board: no active branch leaf is available for the revision");
|
|
206
|
+
const revision: DecisionLedgerEntryFields = {
|
|
207
|
+
kind: "decisionLedger",
|
|
208
|
+
parentTurnId,
|
|
209
|
+
...(interview.origin !== undefined ? { origin: interview.origin } : {}),
|
|
210
|
+
interviewId: interview.interviewId,
|
|
211
|
+
interviewStatus: interview.interviewStatus,
|
|
212
|
+
startedAt: interview.startedAt,
|
|
213
|
+
endedAt: interview.endedAt,
|
|
214
|
+
roundCount: interview.roundCount,
|
|
215
|
+
...(interview.summary ? { summary: interview.summary } : {}),
|
|
216
|
+
...(interview.transcriptPath ? { transcriptPath: interview.transcriptPath } : {}),
|
|
217
|
+
...(interview.exposure ? { exposure: interview.exposure } : {}),
|
|
218
|
+
decisions: interview.decisions.map((decision) => {
|
|
219
|
+
if (decision.key !== selected.key) return { ...decision };
|
|
220
|
+
const next: DecisionRecord = { ...decision, status: "superseded", revisedAt, revisionSource };
|
|
221
|
+
if (normalizedCorrection) next.correction = normalizedCorrection;
|
|
222
|
+
else delete next.correction;
|
|
223
|
+
return next;
|
|
224
|
+
}),
|
|
225
|
+
};
|
|
226
|
+
append(revision);
|
|
227
|
+
return revision;
|
|
228
|
+
};
|
|
229
|
+
|
|
190
230
|
const store: DecisionBoardStore = {
|
|
191
231
|
snapshot(): ReadonlyArray<DecisionLedgerEntry> {
|
|
192
232
|
syncToSession();
|
|
@@ -212,7 +252,7 @@ export function createDecisionBoardStore(deps: DecisionBoardStoreDeps = {}): Dec
|
|
|
212
252
|
superseded = { interviewId: interview.interviewId, key: prior.key };
|
|
213
253
|
break;
|
|
214
254
|
}
|
|
215
|
-
if (superseded !== null)
|
|
255
|
+
if (superseded !== null) revise(superseded.interviewId, superseded.key, "agent", input.rationale);
|
|
216
256
|
const now = (deps.now?.() ?? new Date()).toISOString();
|
|
217
257
|
const entries = deps.readEntries?.() ?? [];
|
|
218
258
|
const parentTurnId = deps.getActiveLeafTurnId?.() ?? activeLeafFromEntries(entries);
|
|
@@ -244,37 +284,7 @@ export function createDecisionBoardStore(deps: DecisionBoardStoreDeps = {}): Dec
|
|
|
244
284
|
return { entry, superseded };
|
|
245
285
|
},
|
|
246
286
|
supersede(interviewId: string, key: string, correction?: string): DecisionLedgerEntryFields {
|
|
247
|
-
|
|
248
|
-
const interview = interviews.find((candidate) => candidate.interviewId === interviewId);
|
|
249
|
-
if (!interview) throw new Error(`decision board: interview ${interviewId} was not found on the active branch`);
|
|
250
|
-
const selected = interview.decisions.find((decision) => decision.key === key);
|
|
251
|
-
if (!selected) throw new Error(`decision board: decision ${key} was not found in interview ${interviewId}`);
|
|
252
|
-
const revisedAt = (deps.now?.() ?? new Date()).toISOString();
|
|
253
|
-
const normalizedCorrection = correction?.trim();
|
|
254
|
-
const entries = deps.readEntries?.() ?? [];
|
|
255
|
-
const parentTurnId = deps.getActiveLeafTurnId?.() ?? activeLeafFromEntries(entries);
|
|
256
|
-
if (!parentTurnId) throw new Error("decision board: no active branch leaf is available for the revision");
|
|
257
|
-
const revision: DecisionLedgerEntryFields = {
|
|
258
|
-
kind: "decisionLedger",
|
|
259
|
-
parentTurnId,
|
|
260
|
-
interviewId: interview.interviewId,
|
|
261
|
-
interviewStatus: interview.interviewStatus,
|
|
262
|
-
startedAt: interview.startedAt,
|
|
263
|
-
endedAt: interview.endedAt,
|
|
264
|
-
roundCount: interview.roundCount,
|
|
265
|
-
...(interview.summary ? { summary: interview.summary } : {}),
|
|
266
|
-
...(interview.transcriptPath ? { transcriptPath: interview.transcriptPath } : {}),
|
|
267
|
-
...(interview.exposure ? { exposure: interview.exposure } : {}),
|
|
268
|
-
decisions: interview.decisions.map((decision) => {
|
|
269
|
-
if (decision.key !== selected.key) return { ...decision };
|
|
270
|
-
const next: DecisionRecord = { ...decision, status: "superseded", revisedAt };
|
|
271
|
-
if (normalizedCorrection) next.correction = normalizedCorrection;
|
|
272
|
-
else delete next.correction;
|
|
273
|
-
return next;
|
|
274
|
-
}),
|
|
275
|
-
};
|
|
276
|
-
append(revision);
|
|
277
|
-
return revision;
|
|
287
|
+
return revise(interviewId, key, "operator", correction);
|
|
278
288
|
},
|
|
279
289
|
invalidate(): void {
|
|
280
290
|
dirty = true;
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
* evidence builders but has no in-tree producer.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { createHash } from "node:crypto";
|
|
18
|
+
|
|
19
|
+
import { isSkillActivation, type PendingSkillToolPolicy, type SkillActivation } from "../../core/skill-activation.js";
|
|
18
20
|
import type { ClioTurnRecord } from "../../engine/session.js";
|
|
19
21
|
import { AUTONOMY_EXPOSURES, type AutonomyExposure } from "../safety/autonomy.js";
|
|
20
22
|
|
|
@@ -119,8 +121,159 @@ export interface CompactionUsage {
|
|
|
119
121
|
apiCalls: number;
|
|
120
122
|
}
|
|
121
123
|
|
|
124
|
+
/** Exact historical skill context, independent of generated checkpoint prose. */
|
|
125
|
+
export interface PreservedSkillContext {
|
|
126
|
+
activationRef: string;
|
|
127
|
+
requestRef: string;
|
|
128
|
+
callRef: string;
|
|
129
|
+
resultRef: string;
|
|
130
|
+
activation: SkillActivation;
|
|
131
|
+
requestText: string;
|
|
132
|
+
content: Array<{ type: "text"; text: string }>;
|
|
133
|
+
/** Hash of the captured rendered text blocks, not the raw SKILL.md hash. */
|
|
134
|
+
contentHash: string;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface SkillContextCheckpoint {
|
|
138
|
+
version: 1;
|
|
139
|
+
skills: PreservedSkillContext[];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export const SKILL_CONTEXT_STATE = "skillContextState";
|
|
143
|
+
export interface SkillContextState {
|
|
144
|
+
version: 1;
|
|
145
|
+
/** Empty is an explicit off/replacement; absence is unknown legacy state. */
|
|
146
|
+
activationRefs: string[];
|
|
147
|
+
unknown?: true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function skillContextContentHash(content: PreservedSkillContext["content"]): string {
|
|
151
|
+
return createHash("sha256").update(JSON.stringify(content)).digest("hex");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function isSkillContextState(value: unknown): value is SkillContextState {
|
|
155
|
+
return (
|
|
156
|
+
isRecord(value) &&
|
|
157
|
+
value.version === 1 &&
|
|
158
|
+
(value.unknown === undefined || value.unknown === true) &&
|
|
159
|
+
Array.isArray(value.activationRefs) &&
|
|
160
|
+
value.activationRefs.every((ref) => typeof ref === "string")
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Ledger validation is structural; bad evidence must not make the session unreadable. */
|
|
165
|
+
function isSkillContextCheckpoint(value: unknown): value is SkillContextCheckpoint {
|
|
166
|
+
return (
|
|
167
|
+
isRecord(value) &&
|
|
168
|
+
value.version === 1 &&
|
|
169
|
+
Array.isArray(value.skills) &&
|
|
170
|
+
value.skills.every(
|
|
171
|
+
(skill: unknown) =>
|
|
172
|
+
isRecord(skill) &&
|
|
173
|
+
[skill.activationRef, skill.requestRef, skill.callRef, skill.resultRef, skill.requestText, skill.contentHash].every(
|
|
174
|
+
isString,
|
|
175
|
+
) &&
|
|
176
|
+
isSkillActivation(skill.activation) &&
|
|
177
|
+
Array.isArray(skill.content) &&
|
|
178
|
+
skill.content.every((block: unknown) => isRecord(block) && block.type === "text" && typeof block.text === "string"),
|
|
179
|
+
)
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function verifiedSkillContextCheckpoint(value: unknown): value is SkillContextCheckpoint {
|
|
184
|
+
if (!isSkillContextCheckpoint(value)) return false;
|
|
185
|
+
const refs = new Set<string>();
|
|
186
|
+
const names = new Set<string>();
|
|
187
|
+
return value.skills.every((skill) => {
|
|
188
|
+
const activation = skill.activation;
|
|
189
|
+
if (
|
|
190
|
+
![skill.activationRef, skill.requestRef, skill.callRef, skill.resultRef].every((ref) => ref.length > 0) ||
|
|
191
|
+
activation.runId !== undefined ||
|
|
192
|
+
activation.triggeredBy !== "tool" ||
|
|
193
|
+
activation.turnId !== skill.requestRef ||
|
|
194
|
+
!activation.name ||
|
|
195
|
+
!activation.filePath ||
|
|
196
|
+
!activation.source ||
|
|
197
|
+
!activation.sourceOrigin ||
|
|
198
|
+
!/^[a-f0-9]{64}$/.test(activation.hash) ||
|
|
199
|
+
(activation.drift !== undefined && activation.drift !== "match") ||
|
|
200
|
+
skill.content.length === 0 ||
|
|
201
|
+
skill.content.every((block) => block.text.length === 0) ||
|
|
202
|
+
skill.contentHash !== skillContextContentHash(skill.content) ||
|
|
203
|
+
refs.has(skill.activationRef) ||
|
|
204
|
+
names.has(activation.name)
|
|
205
|
+
)
|
|
206
|
+
return false;
|
|
207
|
+
refs.add(skill.activationRef);
|
|
208
|
+
names.add(activation.name);
|
|
209
|
+
return true;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export interface PreservedUserContext {
|
|
214
|
+
turnId: string;
|
|
215
|
+
text: string;
|
|
216
|
+
}
|
|
217
|
+
function isPreservedUserContext(value: unknown): value is PreservedUserContext {
|
|
218
|
+
return isRecord(value) && isString(value.turnId) && isString(value.text);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Undefined means no live policy; null explicitly forbids reuse during an uncertain replacement. */
|
|
222
|
+
export function mainSkillContextState(
|
|
223
|
+
entries: ReadonlyArray<SessionEntry>,
|
|
224
|
+
policy: PendingSkillToolPolicy | undefined,
|
|
225
|
+
): SkillContextState | null | undefined {
|
|
226
|
+
if (!policy) return latestSkillContextState(entries);
|
|
227
|
+
// A cold turn may grant optional model activation without selecting or
|
|
228
|
+
// replacing any skill. Keep the recorded selection, including explicit off.
|
|
229
|
+
// This preserves historical content; it does not reconstruct tool authority.
|
|
230
|
+
if (
|
|
231
|
+
policy.modelActivation === true &&
|
|
232
|
+
policy.carriedSurface !== true &&
|
|
233
|
+
policy.requests.length === 0 &&
|
|
234
|
+
policy.loadedSkillNames.size === 0 &&
|
|
235
|
+
policy.loadedSkillPolicies.size === 0
|
|
236
|
+
)
|
|
237
|
+
return latestSkillContextState(entries);
|
|
238
|
+
if (policy.requests.some((request) => !policy.loadedSkillNames.has(request.name))) return null;
|
|
239
|
+
const names = [...policy.loadedSkillNames];
|
|
240
|
+
if (names.length === 0) return null;
|
|
241
|
+
const activationRefs: string[] = [];
|
|
242
|
+
for (const name of names) {
|
|
243
|
+
const entry = [...entries]
|
|
244
|
+
.reverse()
|
|
245
|
+
.find(
|
|
246
|
+
(candidate) =>
|
|
247
|
+
candidate.kind === "skillActivation" &&
|
|
248
|
+
candidate.activation.runId === undefined &&
|
|
249
|
+
candidate.activation.name === name,
|
|
250
|
+
);
|
|
251
|
+
if (!entry) return null;
|
|
252
|
+
activationRefs.push(entry.turnId);
|
|
253
|
+
}
|
|
254
|
+
return { version: 1, activationRefs };
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/** Caller supplies an already selected branch. Never infer active skills from audit metadata. */
|
|
258
|
+
export function latestSkillContextState(entries: ReadonlyArray<SessionEntry>): SkillContextState | undefined {
|
|
259
|
+
for (let index = entries.length - 1; index >= 0; index--) {
|
|
260
|
+
const entry = entries[index];
|
|
261
|
+
if (entry?.kind === "custom" && entry.customType === SKILL_CONTEXT_STATE) {
|
|
262
|
+
return isSkillContextState(entry.data) ? entry.data : undefined;
|
|
263
|
+
}
|
|
264
|
+
if (entry?.kind === "compactionSummary" && entry.skillContext !== undefined) {
|
|
265
|
+
return verifiedSkillContextCheckpoint(entry.skillContext)
|
|
266
|
+
? { version: 1, activationRefs: entry.skillContext.skills.map((skill) => skill.activationRef) }
|
|
267
|
+
: undefined;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
|
|
122
273
|
export interface CompactionSummaryEntry extends BaseSessionEntry {
|
|
123
274
|
kind: "compactionSummary";
|
|
275
|
+
skillContext?: SkillContextCheckpoint;
|
|
276
|
+
userContext?: PreservedUserContext;
|
|
124
277
|
summary: string;
|
|
125
278
|
tokensBefore: number;
|
|
126
279
|
firstKeptTurnId: string;
|
|
@@ -232,6 +385,8 @@ export interface DecisionRecord {
|
|
|
232
385
|
status: DecisionStatus;
|
|
233
386
|
decidedAt: string;
|
|
234
387
|
revisedAt?: string;
|
|
388
|
+
/** Who made this revision, independently of the original decision source. Absent on legacy revisions. */
|
|
389
|
+
revisionSource?: DecisionSource;
|
|
235
390
|
correction?: string;
|
|
236
391
|
source?: DecisionSource;
|
|
237
392
|
/** Options considered and not taken. Only agent decisions carry these. */
|
|
@@ -350,6 +505,8 @@ export interface WorkingSetRef {
|
|
|
350
505
|
}
|
|
351
506
|
|
|
352
507
|
export interface EvictedItem {
|
|
508
|
+
/** Stable session-local recall alias; absent on legacy ledger records. */
|
|
509
|
+
alias?: string;
|
|
353
510
|
ref: WorkingSetRef;
|
|
354
511
|
reason: EvictionReason;
|
|
355
512
|
/** Estimated tokens the projection removes for this item (marker cost already subtracted). */
|
|
@@ -542,12 +699,13 @@ export function isDecisionRecord(value: unknown): value is DecisionRecord {
|
|
|
542
699
|
if (!isString(value.value) || !isOneOf(value.status, DECISION_STATUSES) || !isString(value.decidedAt)) return false;
|
|
543
700
|
if (!isOptionalString(value.label) || !isOptionalString(value.source_question)) return false;
|
|
544
701
|
if (value.source !== undefined && !isOneOf(value.source, ["operator", "agent"])) return false;
|
|
702
|
+
if (value.revisionSource !== undefined && !isOneOf(value.revisionSource, ["operator", "agent"])) return false;
|
|
545
703
|
if (value.alternatives !== undefined && !isStringArray(value.alternatives)) return false;
|
|
546
704
|
if (!isOptionalString(value.rationale)) return false;
|
|
547
705
|
if (!isOptionalString(value.revisedAt) || !isOptionalString(value.correction)) return false;
|
|
548
706
|
return value.status === "superseded"
|
|
549
707
|
? isString(value.revisedAt)
|
|
550
|
-
: value.revisedAt === undefined && value.correction === undefined;
|
|
708
|
+
: value.revisedAt === undefined && value.revisionSource === undefined && value.correction === undefined;
|
|
551
709
|
}
|
|
552
710
|
|
|
553
711
|
function isOptionalCompactionUsage(value: unknown): boolean {
|
|
@@ -605,6 +763,7 @@ function isEvictedItem(value: unknown): value is EvictedItem {
|
|
|
605
763
|
isOneOf(value.reason, EVICTION_REASONS) &&
|
|
606
764
|
isNumber(value.tokensFreed) &&
|
|
607
765
|
isString(value.marker) &&
|
|
766
|
+
(value.alias === undefined || (typeof value.alias === "string" && /^r[1-9]\d*$/.test(value.alias))) &&
|
|
608
767
|
isOptionalString(value.by)
|
|
609
768
|
);
|
|
610
769
|
}
|
|
@@ -628,7 +787,11 @@ export function isSessionEntry(value: unknown): value is SessionEntry {
|
|
|
628
787
|
isOptionalBoolean(v.excludeFromContext)
|
|
629
788
|
);
|
|
630
789
|
case "custom":
|
|
631
|
-
return
|
|
790
|
+
return (
|
|
791
|
+
isString(v.customType) &&
|
|
792
|
+
isOptionalBoolean(v.display) &&
|
|
793
|
+
(v.customType !== SKILL_CONTEXT_STATE || isSkillContextState(v.data))
|
|
794
|
+
);
|
|
632
795
|
case "modelChange":
|
|
633
796
|
return isString(v.provider) && isString(v.modelId) && isOptionalString(v.target);
|
|
634
797
|
case "thinkingLevelChange":
|
|
@@ -648,7 +811,9 @@ export function isSessionEntry(value: unknown): value is SessionEntry {
|
|
|
648
811
|
(v.trigger === undefined || isOneOf(v.trigger, COMPACTION_TRIGGERS)) &&
|
|
649
812
|
isOptionalNumber(v.tokensAfter) &&
|
|
650
813
|
isOptionalNumber(v.messagesSummarized) &&
|
|
651
|
-
isOptionalBoolean(v.isSplitTurn)
|
|
814
|
+
isOptionalBoolean(v.isSplitTurn) &&
|
|
815
|
+
(v.skillContext === undefined || isSkillContextCheckpoint(v.skillContext)) &&
|
|
816
|
+
(v.userContext === undefined || isPreservedUserContext(v.userContext))
|
|
652
817
|
);
|
|
653
818
|
case "sessionInfo":
|
|
654
819
|
return isOptionalString(v.name) && isOptionalString(v.targetTurnId) && isOptionalString(v.label);
|
|
@@ -115,15 +115,54 @@ function isPromptManifestFragment(value: unknown): value is PromptManifestFragme
|
|
|
115
115
|
);
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
/** Validate additive accounting when present, while accepting historical manifests. */
|
|
119
|
+
export function isProjectPreloadClass(value: unknown): value is ProjectPreloadClass {
|
|
120
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
|
|
121
|
+
const row = value as Record<string, unknown>;
|
|
122
|
+
const integer = (item: unknown): item is number => typeof item === "number" && Number.isInteger(item) && item >= 0;
|
|
123
|
+
const optionalInteger = (item: unknown): boolean => item === undefined || integer(item);
|
|
124
|
+
const range = (item: unknown): boolean =>
|
|
125
|
+
item === null ||
|
|
126
|
+
(Array.isArray(item) &&
|
|
127
|
+
item.length === 2 &&
|
|
128
|
+
integer(item[0]) &&
|
|
129
|
+
item[0] >= 1 &&
|
|
130
|
+
integer(item[1]) &&
|
|
131
|
+
item[1] >= item[0]);
|
|
120
132
|
return (
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
(
|
|
125
|
-
typeof
|
|
126
|
-
typeof
|
|
133
|
+
typeof row.mode === "string" &&
|
|
134
|
+
["full", "partial", "synopsis", "none"].includes(row.mode) &&
|
|
135
|
+
integer(row.chars) &&
|
|
136
|
+
integer(row.lines) &&
|
|
137
|
+
(row.reason === null || (typeof row.reason === "string" && ["size", "lines", "no-clio-md"].includes(row.reason))) &&
|
|
138
|
+
typeof row.nearLimit === "boolean" &&
|
|
139
|
+
typeof row.label === "string" &&
|
|
140
|
+
optionalInteger(row.includedChars) &&
|
|
141
|
+
optionalInteger(row.includedLines) &&
|
|
142
|
+
optionalInteger(row.omittedSupportFragments) &&
|
|
143
|
+
(row.providerSupportsTools === undefined ||
|
|
144
|
+
row.providerSupportsTools === null ||
|
|
145
|
+
typeof row.providerSupportsTools === "boolean") &&
|
|
146
|
+
(row.sources === undefined ||
|
|
147
|
+
(Array.isArray(row.sources) &&
|
|
148
|
+
row.sources.every((source: unknown) => {
|
|
149
|
+
if (source === null || typeof source !== "object" || Array.isArray(source)) return false;
|
|
150
|
+
const s = source as Record<string, unknown>;
|
|
151
|
+
return (
|
|
152
|
+
typeof s.path === "string" &&
|
|
153
|
+
typeof s.contentHash === "string" &&
|
|
154
|
+
/^[a-f0-9]{64}$/.test(s.contentHash) &&
|
|
155
|
+
integer(s.availableChars) &&
|
|
156
|
+
integer(s.availableLines) &&
|
|
157
|
+
integer(s.includedChars) &&
|
|
158
|
+
integer(s.includedLines) &&
|
|
159
|
+
s.includedChars <= s.availableChars &&
|
|
160
|
+
s.includedLines <= s.availableLines &&
|
|
161
|
+
range(s.includedRange) &&
|
|
162
|
+
range(s.omittedRange) &&
|
|
163
|
+
(s.omissionReason === null || s.omissionReason === "budget")
|
|
164
|
+
);
|
|
165
|
+
})))
|
|
127
166
|
);
|
|
128
167
|
}
|
|
129
168
|
|
|
@@ -29,6 +29,7 @@ export interface TaskBoardTask {
|
|
|
29
29
|
status: TaskLedgerStatus;
|
|
30
30
|
origin?: "agent" | "user";
|
|
31
31
|
userTaskId?: string;
|
|
32
|
+
/** Operator requirements are declarations, not projected verifier execution results. */
|
|
32
33
|
requiredValidationEvidence?: TaskLedgerValidationEvidence[];
|
|
33
34
|
/** Block or drop reason; empty for pending/active/completed tasks. */
|
|
34
35
|
reason?: string;
|
|
@@ -286,6 +287,23 @@ export function foldSessionTaskHistory(entries: ReadonlyArray<unknown>): Session
|
|
|
286
287
|
.map(({ lastIndex: _lastIndex, tasks, ...board }) => ({ ...board, tasks: [...tasks.values()] }));
|
|
287
288
|
}
|
|
288
289
|
|
|
290
|
+
function acceptanceRequirementDescription(check: string): string {
|
|
291
|
+
return `Operator acceptance requirement: ${check} (declaration only; see verification receipts for execution status)`;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Old pickup snapshots used pending for declarations; preserve any actual observations. */
|
|
295
|
+
function acceptanceRequirement(item: TaskLedgerValidationEvidence): TaskLedgerValidationEvidence {
|
|
296
|
+
if (
|
|
297
|
+
item.status === "pending" &&
|
|
298
|
+
item.command &&
|
|
299
|
+
item.description === `Operator acceptance: ${item.command}` &&
|
|
300
|
+
item.observedAt === undefined
|
|
301
|
+
) {
|
|
302
|
+
return { ...item, status: "required", description: acceptanceRequirementDescription(item.command) };
|
|
303
|
+
}
|
|
304
|
+
return { ...item };
|
|
305
|
+
}
|
|
306
|
+
|
|
289
307
|
function toEntryView(entry: {
|
|
290
308
|
boardId?: string;
|
|
291
309
|
goals: TaskLedgerGoal[];
|
|
@@ -311,7 +329,7 @@ function toEntryView(entry: {
|
|
|
311
329
|
};
|
|
312
330
|
if (goal.userTaskId) task.userTaskId = goal.userTaskId;
|
|
313
331
|
const required = entry.requiredValidationEvidence.filter((item) => item.id.startsWith(`${goal.id}.acceptance.`));
|
|
314
|
-
if (required.length > 0) task.requiredValidationEvidence = required.map(
|
|
332
|
+
if (required.length > 0) task.requiredValidationEvidence = required.map(acceptanceRequirement);
|
|
315
333
|
if (goal.description) task.reason = goal.description;
|
|
316
334
|
const evidence = evidenceByTask.get(goal.id);
|
|
317
335
|
if (evidence) task.evidence = evidence;
|
|
@@ -397,9 +415,9 @@ function applyMutation(
|
|
|
397
415
|
if (mutation.verification && mutation.verification.length > 0) {
|
|
398
416
|
picked.requiredValidationEvidence = mutation.verification.map((item, index) => ({
|
|
399
417
|
id: `${picked.id}.acceptance.${index}`,
|
|
400
|
-
description:
|
|
418
|
+
description: acceptanceRequirementDescription(item.check),
|
|
401
419
|
command: item.check,
|
|
402
|
-
status: "
|
|
420
|
+
status: "required",
|
|
403
421
|
notes: `timeoutMs=${item.timeoutMs}`,
|
|
404
422
|
}));
|
|
405
423
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { UserTask } from "./store.js";
|
|
2
|
+
|
|
3
|
+
/** The operator-authored pickup turn shared by CLI, slash, and overlay handoffs. */
|
|
4
|
+
export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "note" | "acceptance">): string {
|
|
5
|
+
const note = task.note ? ` ${task.note}.` : "";
|
|
6
|
+
const acceptance = task.acceptance ? ` Acceptance: ${JSON.stringify(task.acceptance)}.` : "";
|
|
7
|
+
return (
|
|
8
|
+
`Operator task ${task.id}: ${task.title}.${note}${acceptance} ` +
|
|
9
|
+
`Before working this task, call tasks action="pick" id="${task.id}" and confirm its durable session/board link. ` +
|
|
10
|
+
"Use the returned linked tN for start and done; do not replace the pickup with a self-created plan or pick unrelated inbox tasks. " +
|
|
11
|
+
"Respect the task's authorized scope, including proposal-only limits. If pickup fails, report the actual state and stop this task's work. " +
|
|
12
|
+
"After work and required verification, call tasks done on that linked tN with concrete evidence, then tasks list. " +
|
|
13
|
+
`Claim ${task.id} completed only if the linked board row is completed and the durable operator task is done with the same session/board link. ` +
|
|
14
|
+
"Report the IDs, actual state, and verification results or limitations; an unpicked or still-handed task is not done."
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
type DelegationAgentConfig,
|
|
6
6
|
} from "../../core/defaults.js";
|
|
7
7
|
import type { HeartbeatStamp } from "../../domains/dispatch/heartbeat.js";
|
|
8
|
+
import { resolveCostProvenance } from "../../domains/providers/types/cost-provenance.js";
|
|
8
9
|
import type { AutonomyLevel } from "../../domains/safety/autonomy.js";
|
|
9
10
|
import type { SafetyContract } from "../../domains/safety/contract.js";
|
|
10
11
|
import type { AgentEvent } from "../types.js";
|
|
@@ -136,6 +137,7 @@ function flattenPrompt(input: AcpDelegationRunInput): string {
|
|
|
136
137
|
|
|
137
138
|
export function emptyUsage(): AcpDelegationUsage {
|
|
138
139
|
return {
|
|
140
|
+
tokensReported: false,
|
|
139
141
|
inputTokens: 0,
|
|
140
142
|
outputTokens: 0,
|
|
141
143
|
cacheReadTokens: 0,
|
|
@@ -150,14 +152,33 @@ function finite(value: unknown): number {
|
|
|
150
152
|
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
|
|
151
153
|
}
|
|
152
154
|
|
|
153
|
-
/**
|
|
154
|
-
function
|
|
155
|
-
|
|
156
|
-
return isRecord(cost) ? finite(cost.total) : 0;
|
|
155
|
+
/** Presence matters: an explicit zero must not fall back to another observation. */
|
|
156
|
+
function nonnegative(value: unknown): number | undefined {
|
|
157
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
157
158
|
}
|
|
158
159
|
|
|
159
160
|
export function mergeUsage(into: AcpDelegationUsage, raw: unknown): void {
|
|
160
161
|
if (!isRecord(raw)) return;
|
|
162
|
+
const tokensReported = [
|
|
163
|
+
raw.input,
|
|
164
|
+
raw.inputTokens,
|
|
165
|
+
raw.input_tokens,
|
|
166
|
+
raw.output,
|
|
167
|
+
raw.outputTokens,
|
|
168
|
+
raw.output_tokens,
|
|
169
|
+
raw.cacheRead,
|
|
170
|
+
raw.cacheReadTokens,
|
|
171
|
+
raw.cache_read_tokens,
|
|
172
|
+
raw.cacheWrite,
|
|
173
|
+
raw.cacheWriteTokens,
|
|
174
|
+
raw.cache_write_tokens,
|
|
175
|
+
raw.reasoning,
|
|
176
|
+
raw.reasoningTokens,
|
|
177
|
+
raw.reasoning_tokens,
|
|
178
|
+
raw.totalTokens,
|
|
179
|
+
raw.total_tokens,
|
|
180
|
+
].some((value) => nonnegative(value) !== undefined);
|
|
181
|
+
into.tokensReported ||= tokensReported;
|
|
161
182
|
const input = finite(raw.input) + finite(raw.inputTokens) + finite(raw.input_tokens);
|
|
162
183
|
const output = finite(raw.output) + finite(raw.outputTokens) + finite(raw.output_tokens);
|
|
163
184
|
const cacheRead = finite(raw.cacheRead) + finite(raw.cacheReadTokens) + finite(raw.cache_read_tokens);
|
|
@@ -167,12 +188,23 @@ export function mergeUsage(into: AcpDelegationUsage, raw: unknown): void {
|
|
|
167
188
|
into.cacheReadTokens += cacheRead;
|
|
168
189
|
into.cacheWriteTokens += cacheWrite;
|
|
169
190
|
into.reasoningTokens += finite(raw.reasoning) + finite(raw.reasoningTokens) + finite(raw.reasoning_tokens);
|
|
170
|
-
//
|
|
191
|
+
// Prefer the peer's explicit total, including zero,
|
|
171
192
|
// otherwise sum the four billed categories (reasoning excluded, since a peer
|
|
172
193
|
// that reports it separately still counts it inside output).
|
|
173
|
-
const explicitTotal =
|
|
174
|
-
into.totalTokens += explicitTotal
|
|
175
|
-
|
|
194
|
+
const explicitTotal = nonnegative(raw.totalTokens) ?? nonnegative(raw.total_tokens);
|
|
195
|
+
into.totalTokens += explicitTotal ?? input + output + cacheRead + cacheWrite;
|
|
196
|
+
// Clio metadata uses costUsd; legacy message usage uses cost.total. These
|
|
197
|
+
// are alternate representations of one amount, never additive sources.
|
|
198
|
+
const cost = (isRecord(raw.cost) ? nonnegative(raw.cost.total) : undefined) ?? nonnegative(raw.costUsd);
|
|
199
|
+
into.costUsd += cost ?? 0;
|
|
200
|
+
if (tokensReported || cost !== undefined) {
|
|
201
|
+
const provenance = cost === undefined ? "unknown" : resolveCostProvenance(raw.costProvenance, "unknown");
|
|
202
|
+
const previous = into.costProvenance;
|
|
203
|
+
if (previous === undefined || previous === provenance) into.costProvenance = provenance;
|
|
204
|
+
else if (previous === "unknown" || provenance === "unknown") into.costProvenance = "unknown";
|
|
205
|
+
else if (previous === "estimated" || provenance === "estimated") into.costProvenance = "estimated";
|
|
206
|
+
else into.costProvenance = "known";
|
|
207
|
+
}
|
|
176
208
|
}
|
|
177
209
|
|
|
178
210
|
function errorMessage(value: unknown): string {
|
|
@@ -195,9 +227,9 @@ function errorEvents(messageText: string): AgentEvent[] {
|
|
|
195
227
|
}
|
|
196
228
|
|
|
197
229
|
export function startAcpDelegationRun(input: AcpDelegationRunInput): AcpDelegationRunHandle {
|
|
198
|
-
//
|
|
199
|
-
//
|
|
200
|
-
//
|
|
230
|
+
// Connection faults stay bounded. Elapsed turn time is not a progress signal;
|
|
231
|
+
// only an explicit positive timeout stops a healthy turn. Dispatch owns its
|
|
232
|
+
// event-inactivity watchdog and cancellation/process cleanup.
|
|
201
233
|
const connectTimeoutMs = input.agent.connectTimeoutMs ?? DEFAULT_DELEGATION_CONNECT_TIMEOUT_MS;
|
|
202
234
|
const turnTimeoutMs = input.agent.turnTimeoutMs ?? DEFAULT_DELEGATION_TURN_TIMEOUT_MS;
|
|
203
235
|
const now = input.now ?? Date.now;
|
|
@@ -322,7 +354,7 @@ export function startAcpDelegationRun(input: AcpDelegationRunInput): AcpDelegati
|
|
|
322
354
|
sessionId,
|
|
323
355
|
prompt: [{ type: "text", text: flattenPrompt(input) }],
|
|
324
356
|
},
|
|
325
|
-
turnTimeoutMs,
|
|
357
|
+
turnTimeoutMs === 0 ? undefined : turnTimeoutMs,
|
|
326
358
|
);
|
|
327
359
|
// ACP v1 has no usage field on PromptResponse. Clio servers report it in
|
|
328
360
|
// _meta; other agents (Copilot/Codex/OpenCode) report nothing here, so usage
|
package/src/engine/acp/server.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
reportCommitAttributionDiagnostic,
|
|
7
7
|
withManagedGitCommitAttributionEnvironment,
|
|
8
8
|
} from "../../core/git-commit-attribution.js";
|
|
9
|
+
import { buildSafeToolEnv } from "../../core/safe-exec.js";
|
|
9
10
|
import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
|
|
10
11
|
import {
|
|
11
12
|
ACP_INTERNAL_ERROR_MESSAGE,
|
|
@@ -207,7 +208,7 @@ class StdioJsonRpcTransport implements AcpJsonRpcTransport {
|
|
|
207
208
|
this.childClosePromise = new Promise((resolve) => {
|
|
208
209
|
this.resolveChildClose = resolve;
|
|
209
210
|
});
|
|
210
|
-
const childEnvironment = options.env
|
|
211
|
+
const childEnvironment = buildSafeToolEnv(options.env);
|
|
211
212
|
// A delegated external harness authors its own commits. Clio only
|
|
212
213
|
// assisted by delegating, so no Co-authored-by is claimed for it.
|
|
213
214
|
const attribution = withManagedGitCommitAttributionEnvironment(childEnvironment, {
|
package/src/engine/acp/types.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CostProvenance } from "../../domains/providers/types/cost-provenance.js";
|
|
1
2
|
import type { AgentMessage } from "../types.js";
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -189,6 +190,8 @@ export interface AcpPromptResponse {
|
|
|
189
190
|
}
|
|
190
191
|
|
|
191
192
|
export interface AcpDelegationUsage {
|
|
193
|
+
/** A valid peer token field was present, including an explicit zero. */
|
|
194
|
+
tokensReported: boolean;
|
|
192
195
|
inputTokens: number;
|
|
193
196
|
outputTokens: number;
|
|
194
197
|
cacheReadTokens: number;
|
|
@@ -196,8 +199,10 @@ export interface AcpDelegationUsage {
|
|
|
196
199
|
reasoningTokens: number;
|
|
197
200
|
/** Peer-reported total when present, otherwise input+output+cacheRead+cacheWrite, matching the ACP server side. */
|
|
198
201
|
totalTokens: number;
|
|
199
|
-
/** Sum of
|
|
202
|
+
/** Sum of peer cost.total (legacy) or costUsd (Clio metadata); never re-priced. */
|
|
200
203
|
costUsd: number;
|
|
204
|
+
/** Absent until usage is reported; missing or unsupported pricing provenance stays unknown. */
|
|
205
|
+
costProvenance?: CostProvenance;
|
|
201
206
|
}
|
|
202
207
|
|
|
203
208
|
export interface AcpDelegationResult {
|