@iowarp/clio-coder 0.4.7 → 0.4.9
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +111 -0
- package/CONTRIBUTING.md +83 -74
- package/README.md +69 -47
- package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
- package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
- package/dist/assets/web-notices/hono-LICENSE +21 -0
- package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/background-BUMOBAQN.js +37 -0
- package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/chunk-2VBWFXYE.js +198 -0
- package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
- package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
- package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
- package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
- package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
- package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
- package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
- package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
- package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
- package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
- package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
- package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
- package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/chunk-7N3OLLSL.js +637 -0
- package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
- package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
- package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
- package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
- package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
- package/dist/chunk-EHZRAB4U.js +63 -0
- package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
- package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
- package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
- package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
- package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
- package/dist/chunk-G5R53COU.js +68 -0
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
- package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
- package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
- package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
- package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
- package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
- package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
- package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
- package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
- package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
- package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/chunk-MJ4QEJVT.js +185 -0
- package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
- package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
- package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
- package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
- package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
- package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
- package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
- package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
- package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
- package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
- package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
- package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/chunk-SLLG2G44.js +85 -0
- package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
- package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
- package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
- package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
- package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
- package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
- package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
- package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
- package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
- package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/chunk-XNZWWDC3.js +686 -0
- package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
- package/dist/chunk-XTQ7MEJG.js +457 -0
- package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
- package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
- package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
- package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
- package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
- package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
- package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
- package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +50 -38
- package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
- package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
- package/dist/config-P3ZQVF63.js +275 -0
- package/dist/config-graph-GKAOBAS5.js +160 -0
- package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
- package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
- package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
- package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
- package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
- package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
- package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
- package/dist/docs-ZK777W2G.js +101 -0
- package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
- package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
- package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
- package/dist/evals-L73EBHSU.js +104 -0
- package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
- package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
- package/dist/evidence-Y55WKYHH.js +246 -0
- package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
- package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
- package/dist/fleet-M4H2QBWT.js +268 -0
- package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
- package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
- package/dist/fleet-decisions-EHEY7KPU.js +52 -0
- package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
- package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
- package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
- package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
- package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
- package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
- package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
- package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
- package/dist/library-3J5IO2OJ.js +75 -0
- package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
- package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
- package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
- package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
- package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
- package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
- package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
- package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
- package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
- package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
- package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
- package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
- package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
- package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/settings-3VMBMWID.js +72 -0
- package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
- package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
- package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
- package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
- package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
- package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
- package/dist/system-3TDQRMZZ.js +116 -0
- package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
- package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
- package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
- package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
- package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
- package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
- package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
- package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
- package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
- package/dist/web/client/assets/array-BifhSqXX.js +1 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
- package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
- package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
- package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
- package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
- package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
- package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
- package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
- package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
- package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
- package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
- package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
- package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
- package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
- package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
- package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
- package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
- package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
- package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
- package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
- package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
- package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
- package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
- package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/index-Dsi52apB.css +1 -0
- package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
- package/dist/web/client/assets/init-C-OQMol4.js +1 -0
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
- package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
- package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
- package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
- package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
- package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
- package/dist/web/client/assets/path-fybaL0A-.js +1 -0
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
- package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
- package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
- package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
- package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
- package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
- package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
- package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
- package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
- package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
- package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
- package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
- package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
- package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
- package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
- package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
- package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
- package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
- package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
- package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
- package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
- package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
- package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
- package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
- package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
- package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
- package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
- package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
- package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
- package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
- package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
- package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
- package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
- package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
- package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
- package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
- package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
- package/dist/web/client/clio-coder-logo.webp +0 -0
- package/dist/web/client/icon-192.png +0 -0
- package/dist/web/client/icon-512.png +0 -0
- package/dist/web/client/index.html +6 -0
- package/dist/web/client/manifest.webmanifest +15 -0
- package/dist/web/client/offline.css +55 -0
- package/dist/web/client/offline.html +5 -0
- package/dist/web/client/offline.js +27 -0
- package/dist/web/client/sw.js +34 -0
- package/dist/web/ops-worker.js +37 -0
- package/dist/web/reads-worker.js +1726 -0
- package/dist/web/server.js +8499 -0
- package/dist/web-EMGUGGEI.js +13 -0
- package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
- package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
- package/dist/worker/entry.js +113 -99
- package/docs/README.md +28 -27
- package/docs/architecture/acp.md +5 -9
- package/docs/architecture/alcf-provider.md +0 -3
- package/docs/architecture/architecture.md +0 -3
- package/docs/architecture/artifact-placement.md +12 -4
- package/docs/architecture/artifact-versions.md +0 -3
- package/docs/architecture/capacity-and-scheduling.md +0 -3
- package/docs/architecture/context-engine.md +0 -3
- package/docs/architecture/context-working-set.md +0 -3
- package/docs/architecture/dispatch-architecture-rationale.md +0 -3
- package/docs/architecture/dispatch-typed-intent.md +0 -3
- package/docs/architecture/evidence-and-memory.md +0 -3
- package/docs/architecture/library.md +1 -3
- package/docs/architecture/middleware-and-components.md +0 -3
- package/docs/architecture/model-catalog.md +1 -4
- package/docs/architecture/observability.md +0 -3
- package/docs/architecture/pi-boundary.md +6 -9
- package/docs/architecture/prompt-envelope-and-tools.md +37 -30
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +19 -9
- package/docs/architecture/session-lifecycle.md +10 -7
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +38 -18
- package/docs/architecture/worker-context.md +1 -3
- package/docs/architecture/worker-dispatch-mechanics.md +1 -4
- package/docs/guide/authoring-plugins.md +1 -3
- package/docs/guide/built-in-agents.md +0 -3
- package/docs/guide/commands-and-modes.md +41 -25
- package/docs/guide/configuration-and-targets.md +204 -9
- package/docs/guide/configuration-reference.md +125 -17
- package/docs/guide/environment-variables.md +2 -8
- package/docs/guide/exit-codes-and-output.md +0 -3
- package/docs/guide/extensions-and-sharing.md +0 -3
- package/docs/guide/fleet-dispatch.md +3 -5
- package/docs/guide/glossary.md +1 -4
- package/docs/guide/harness-extensions.md +0 -2
- package/docs/guide/installation-and-lifecycle.md +3 -6
- package/docs/guide/interop.md +0 -2
- package/docs/guide/panes-and-files.md +0 -3
- package/docs/guide/plugins.md +0 -3
- package/docs/guide/proactive-memory.md +0 -3
- package/docs/guide/resource-library.md +1 -3
- package/docs/guide/skills-marketplace.md +0 -2
- package/docs/guide/tool-usage.md +166 -67
- package/docs/guide/troubleshooting.md +1 -4
- package/docs/history/config-knobs-audit.md +0 -3
- package/docs/history/release-cut-checklist.md +0 -3
- package/docs/process/development-pipeline.md +0 -3
- package/docs/process/documentation-coverage.md +3 -3
- package/docs/process/documentation-guide.md +16 -22
- package/docs/process/eval-runner.md +0 -3
- package/docs/process/evals-internal.md +0 -3
- package/docs/process/evolution.md +0 -3
- package/docs/process/fleet-demo-runbook.md +6 -9
- package/docs/process/git-commit-provenance.md +0 -3
- package/docs/process/performance-methodology.md +1 -4
- package/docs/process/release-cut-checklist.md +114 -221
- package/docs/process/scientific-validation.md +23 -6
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/library/registry.yaml +2 -2
- package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
- package/library/skills/meta/clio-coder-test/evals.md +16 -2
- package/library/skills/meta/clio-coder-test/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
- package/library/skills/registry.yaml +2 -2
- package/library/skills/skill-marketplace.json +1 -1
- package/package.json +13 -11
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/docs.ts +65 -328
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +17 -2
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/trace.ts +4 -65
- package/src/cli/uninstall.ts +26 -0
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/usage.ts +3 -0
- package/src/cli/verifiers.ts +1 -1
- package/src/cli/web.ts +79 -0
- package/src/core/bash-exec.ts +27 -4
- package/src/core/bus-events.ts +3 -4
- package/src/core/config.ts +73 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/domain-loader.ts +37 -28
- package/src/core/event-bus.ts +1 -1
- package/src/core/run-records.ts +438 -0
- package/src/core/safe-exec.ts +506 -56
- package/src/core/skill-activation.ts +5 -3
- package/src/core/termination.ts +16 -12
- package/src/core/tool-names.ts +33 -12
- package/src/domains/agents/contract.ts +1 -1
- package/src/domains/agents/extension.ts +18 -10
- package/src/domains/config/extension.ts +5 -4
- package/src/domains/context/clio-md.ts +1 -1
- package/src/domains/context/worker/pressure.ts +6 -2
- package/src/domains/context/working-set/path-index.ts +7 -2
- package/src/domains/dispatch/code-step.ts +7 -2
- package/src/domains/dispatch/contract.ts +7 -0
- package/src/domains/dispatch/execution-role.ts +3 -3
- package/src/domains/dispatch/execution-scheduler.ts +204 -79
- package/src/domains/dispatch/extension.ts +206 -26
- package/src/domains/dispatch/fleet-preflight.ts +18 -3
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/gate-decisions.ts +3 -3
- package/src/domains/dispatch/heartbeat.ts +1 -1
- package/src/domains/dispatch/host-verification.ts +16 -14
- package/src/domains/dispatch/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +4 -5
- package/src/domains/dispatch/types.ts +3 -1
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/extensions/operator-runtime.ts +3 -1
- package/src/domains/gateway/mcp/client.ts +923 -0
- package/src/domains/gateway/mcp/config.ts +456 -0
- package/src/domains/gateway/mcp/index.ts +88 -0
- package/src/domains/gateway/mcp/protocol.ts +273 -0
- package/src/domains/gateway/mcp/trust.ts +263 -0
- package/src/domains/lifecycle/doctor.ts +17 -3
- package/src/domains/middleware/hooks.ts +2 -2
- package/src/domains/mux/contract.ts +5 -9
- package/src/domains/mux/detect.ts +1 -1
- package/src/domains/mux/extension.ts +1 -1
- package/src/domains/mux/protocol.ts +5 -7
- package/src/domains/mux/socket-client.ts +3 -3
- package/src/domains/observability/accountability.ts +2 -2
- package/src/domains/observability/background-memory-usage.ts +3 -0
- package/src/domains/observability/compaction-usage.ts +2 -0
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/cost.ts +5 -0
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/extension.ts +1 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -0
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/observability/trace-store.ts +65 -5
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/extension.ts +4 -17
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
- package/src/domains/prompts/fragments/operating/skills.md +12 -10
- package/src/domains/providers/cache-deployment.ts +147 -0
- package/src/domains/providers/catalog.ts +12 -7
- package/src/domains/providers/extension.ts +27 -5
- package/src/domains/providers/index.ts +6 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/plugins.ts +3 -13
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
- package/src/domains/providers/types/target-descriptor.ts +17 -0
- package/src/domains/safety/action-classifier.ts +17 -1
- package/src/domains/safety/call-target.ts +14 -0
- package/src/domains/safety/contract.ts +1 -1
- package/src/domains/safety/finish-contract.ts +9 -3
- package/src/domains/safety/loop-detector.ts +1 -1
- package/src/domains/safety/policy-engine.ts +7 -0
- package/src/domains/safety/protected-artifacts.ts +3 -4
- package/src/domains/safety/rejection-feedback.ts +1 -1
- package/src/domains/safety/scope.ts +2 -3
- package/src/domains/safety/validation-contract.ts +3 -2
- package/src/domains/scheduling/budget.ts +5 -3
- package/src/domains/scheduling/contract.ts +2 -1
- package/src/domains/scheduling/extension.ts +3 -3
- package/src/domains/session/compaction/branch-summary.ts +1 -1
- package/src/domains/session/compaction/compact.ts +29 -3
- package/src/domains/session/compaction/cut-point.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +5 -10
- package/src/domains/session/contract.ts +1 -1
- package/src/domains/session/cwd-fallback.ts +2 -2
- package/src/domains/session/entries.ts +1 -0
- package/src/domains/session/handoff.ts +5 -1
- package/src/domains/session/history.ts +6 -0
- package/src/domains/session/manager.ts +14 -7
- package/src/domains/session/retry.ts +2 -1
- package/src/domains/session/session-artifacts.ts +12 -7
- package/src/domains/session/task-board.ts +2 -3
- package/src/domains/session/usage.ts +6 -7
- package/src/engine/acp/server.ts +11 -0
- package/src/engine/ai.ts +2 -0
- package/src/engine/apis/openai-completions.ts +17 -4
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- package/src/engine/provider-error-body.ts +65 -0
- package/src/engine/session.ts +118 -29
- package/src/engine/worker-runtime.ts +3 -0
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +38 -18
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +10 -12
- package/src/interactive/chat-panel.ts +23 -9
- package/src/interactive/chat-renderer.ts +33 -11
- package/src/interactive/clio-editor.ts +13 -5
- package/src/interactive/dispatch-board.ts +70 -30
- package/src/interactive/editor-submit.ts +30 -25
- package/src/interactive/footer/widgets.ts +12 -9
- package/src/interactive/interactive-presentation.ts +2 -3
- package/src/interactive/mux-bridge.ts +3 -7
- package/src/interactive/overlay-general-openers.ts +14 -7
- package/src/interactive/overlays/cwd-fallback.ts +1 -1
- package/src/interactive/overlays/library-model.ts +114 -35
- package/src/interactive/overlays/library.ts +52 -5
- package/src/interactive/overlays/list-overlay.ts +4 -1
- package/src/interactive/overlays/session-selector.ts +28 -23
- package/src/interactive/overlays/settings.ts +20 -1
- package/src/interactive/overlays/tree-selector.ts +47 -10
- package/src/interactive/panes-runtime.ts +1 -1
- package/src/interactive/prewarm.ts +11 -197
- package/src/interactive/renderers/compaction-summary.ts +1 -1
- package/src/interactive/renderers/provider-error.ts +118 -0
- package/src/interactive/renderers/retry-status.ts +59 -23
- package/src/interactive/renderers/tool-execution.ts +67 -7
- package/src/interactive/renderers/worker-answer.ts +198 -0
- package/src/interactive/renderers/worker-entry.ts +57 -163
- package/src/interactive/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- package/src/interactive/slash-commands.ts +26 -1
- package/src/interactive/slash-spec.ts +2 -2
- package/src/interactive/theme/labels.ts +66 -30
- package/src/interactive/turn-context.ts +1 -0
- package/src/interactive/turn-persistence.ts +9 -1
- package/src/interactive/turn-prewarm.ts +126 -19
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +36 -5
- package/src/interactive/view/artifacts.ts +3 -2
- package/src/interactive/view/view-overlay.ts +96 -20
- package/src/tools/agent-tools.ts +21 -7
- package/src/tools/artifact.ts +16 -8
- package/src/tools/bash.ts +90 -11
- package/src/tools/bootstrap.ts +42 -4
- package/src/tools/builtin-tool-catalog.ts +80 -11
- package/src/tools/context/index.ts +27 -31
- package/src/tools/context/library.ts +3 -1
- package/src/tools/context/surface.ts +12 -26
- package/src/tools/core-bootstrap.ts +72 -1
- package/src/tools/data/csv.ts +1189 -0
- package/src/tools/data/index.ts +308 -0
- package/src/tools/data/json.ts +1799 -0
- package/src/tools/data/jsonl.ts +561 -0
- package/src/tools/data/shared.ts +452 -0
- package/src/tools/edit-diff.ts +0 -7
- package/src/tools/edit.ts +115 -18
- package/src/tools/file-mutation-queue.ts +114 -4
- package/src/tools/find.ts +108 -29
- package/src/tools/gateway/caps.ts +11 -0
- package/src/tools/gateway/clio-context-surface.ts +41 -0
- package/src/tools/gateway/clio-context-tools.ts +77 -0
- package/src/tools/gateway/data-surface.ts +138 -0
- package/src/tools/gateway/data-tool.ts +201 -0
- package/src/tools/gateway/index.ts +342 -0
- package/src/tools/gateway/mcp-capabilities.ts +469 -0
- package/src/tools/grep.ts +88 -33
- package/src/tools/harness-extensions.ts +3 -0
- package/src/tools/ignore-policy.ts +7 -5
- package/src/tools/ls.ts +111 -20
- package/src/tools/policy.ts +35 -13
- package/src/tools/presentation.ts +6 -0
- package/src/tools/read.ts +634 -156
- package/src/tools/registry.ts +106 -8
- package/src/tools/run-script.ts +997 -0
- package/src/tools/spawn-hygiene.ts +157 -5
- package/src/tools/surface.ts +163 -0
- package/src/tools/verify/authoring.ts +8 -3
- package/src/tools/verify/catalog.ts +14 -1
- package/src/tools/verify/numeric.ts +367 -59
- package/src/tools/verify/perf.ts +171 -9
- package/src/tools/verify/scripts.ts +178 -26
- package/src/tools/web-fetch-surface.ts +22 -0
- package/src/tools/web-fetch.ts +26 -1
- package/src/tools/write.ts +45 -19
- package/src/worker/spec-contract.ts +27 -0
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-HRAKUPIH.js +0 -57
- package/dist/docs-BL7ROUFN.js +0 -292
|
@@ -21,7 +21,7 @@ import { BusChannels, type DispatchCompletedPayload, type DispatchRunIdentity }
|
|
|
21
21
|
import { DEFAULT_SETTINGS, type DelegationToolGovernance } from "../../core/defaults.js";
|
|
22
22
|
import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
|
|
23
23
|
import { gatewayRoutingObservationFromRecord } from "../../core/gateway-routing.js";
|
|
24
|
-
import { GUARDRAIL_DEFAULTS } from "../../core/guardrails.js";
|
|
24
|
+
import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../../core/guardrails.js";
|
|
25
25
|
import { readClioVersion, readPiMonoVersion } from "../../core/package-root.js";
|
|
26
26
|
import { canonicalizeExistingPath } from "../../core/path-canonical.js";
|
|
27
27
|
import { protectedResidencyModels } from "../../core/residency-protection.js";
|
|
@@ -46,6 +46,7 @@ import { WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH } from "../../engine/worker-runti
|
|
|
46
46
|
import { toolPromptHintsForNames } from "../../tools/builtin-tool-catalog.js";
|
|
47
47
|
import { networkToolsDisabled } from "../../tools/network-policy.js";
|
|
48
48
|
import { applyToolProfile, assertToolProfileEnforceable, type ToolProfileName } from "../../tools/profiles.js";
|
|
49
|
+
import { withGatewayForCapabilities } from "../../tools/surface.js";
|
|
49
50
|
import {
|
|
50
51
|
applyTaskWorktree,
|
|
51
52
|
cleanupTaskWorktree,
|
|
@@ -325,7 +326,10 @@ interface RunTokenMeter {
|
|
|
325
326
|
outputTokens: number;
|
|
326
327
|
cacheReadTokens: number;
|
|
327
328
|
cacheWriteTokens: number;
|
|
329
|
+
cacheWrite1hTokens?: number;
|
|
328
330
|
reasoningTokens: number;
|
|
331
|
+
/** Native calls are priced individually by the SDK, including cache TTLs and context tiers. */
|
|
332
|
+
costUsd?: number;
|
|
329
333
|
}
|
|
330
334
|
|
|
331
335
|
interface ActiveRun {
|
|
@@ -458,6 +462,7 @@ function sealRouteDecision(draft: RunReceiptDraft, decision: RouteDecisionV1): R
|
|
|
458
462
|
export const UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD = 1;
|
|
459
463
|
|
|
460
464
|
function calculateUsageCostUsd(meter: RunTokenMeter, pricing: EffectivePricing["rates"]): number {
|
|
465
|
+
if (meter.costUsd !== undefined) return meter.costUsd;
|
|
461
466
|
if (pricing === null) return 0;
|
|
462
467
|
return (
|
|
463
468
|
(meter.inputTokens * pricing.input +
|
|
@@ -468,6 +473,39 @@ function calculateUsageCostUsd(meter: RunTokenMeter, pricing: EffectivePricing["
|
|
|
468
473
|
);
|
|
469
474
|
}
|
|
470
475
|
|
|
476
|
+
function accumulateNativeUsage(
|
|
477
|
+
meter: RunTokenMeter,
|
|
478
|
+
usage: Record<string, unknown>,
|
|
479
|
+
pricing: EffectivePricing["rates"],
|
|
480
|
+
): void {
|
|
481
|
+
const count = (value: unknown): number =>
|
|
482
|
+
typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
483
|
+
const call: RunTokenMeter = {
|
|
484
|
+
inputTokens: count(usage.input),
|
|
485
|
+
outputTokens: count(usage.output),
|
|
486
|
+
cacheReadTokens: count(usage.cacheRead),
|
|
487
|
+
cacheWriteTokens: count(usage.cacheWrite),
|
|
488
|
+
reasoningTokens: extractReasoningTokenCount(usage),
|
|
489
|
+
};
|
|
490
|
+
const reported = isRecord(usage.cost) ? usage.cost.total : undefined;
|
|
491
|
+
// An SDK total is already priced with per-call tiers, service tier
|
|
492
|
+
// and cache-write lifetime. Never reprice it from an aggregate token count.
|
|
493
|
+
// Retain the target-rate fallback only for workers that omit calculated
|
|
494
|
+
// cost. Zero remains zero; its provenance still comes from the target.
|
|
495
|
+
const callCost =
|
|
496
|
+
typeof reported === "number" && Number.isFinite(reported) && reported >= 0
|
|
497
|
+
? reported
|
|
498
|
+
: calculateUsageCostUsd(call, pricing);
|
|
499
|
+
meter.costUsd = (meter.costUsd ?? 0) + callCost;
|
|
500
|
+
meter.inputTokens += call.inputTokens;
|
|
501
|
+
meter.outputTokens += call.outputTokens;
|
|
502
|
+
meter.cacheReadTokens += call.cacheReadTokens;
|
|
503
|
+
meter.cacheWriteTokens += call.cacheWriteTokens;
|
|
504
|
+
if (typeof usage.cacheWrite1h === "number" && usage.cacheWrite1h >= 0 && usage.cacheWrite1h <= call.cacheWriteTokens)
|
|
505
|
+
meter.cacheWrite1hTokens = (meter.cacheWrite1hTokens ?? 0) + usage.cacheWrite1h;
|
|
506
|
+
meter.reasoningTokens += call.reasoningTokens;
|
|
507
|
+
}
|
|
508
|
+
|
|
471
509
|
/**
|
|
472
510
|
* Output-token figure the admission estimate prices a route against. Settings
|
|
473
511
|
* always carry `defaults.maxTokens`; the fallback covers the callers that
|
|
@@ -1655,12 +1693,19 @@ function effectiveToolNames(
|
|
|
1655
1693
|
(tool): tool is ToolName =>
|
|
1656
1694
|
(isBuiltinToolName(tool) || harnessTools.has(tool)) &&
|
|
1657
1695
|
tool !== ToolNames.AskUser &&
|
|
1658
|
-
!(networkStripped && tool === ToolNames.WebFetch) &&
|
|
1696
|
+
!(networkStripped && (tool === ToolNames.WebFetch || tool === ToolNames.WebRead)) &&
|
|
1659
1697
|
!denied.has(tool) &&
|
|
1660
1698
|
!(writeConfined && WRITE_ROOT_REFUSED_TOOLS.has(tool)) &&
|
|
1661
1699
|
(target.runtime.id !== "claude-sdk" || isClaudeCanonicalTool(tool)),
|
|
1662
1700
|
);
|
|
1663
|
-
|
|
1701
|
+
// A native worker reaches a gateway-placed capability (git, web_fetch, an
|
|
1702
|
+
// extension command) through the attached `gateway` tool, so the admitted
|
|
1703
|
+
// list gains `gateway` whenever it names one. The worker's own narrowing
|
|
1704
|
+
// (tools/agent-tools.ts effectiveToolNames) applies the same rule, which is
|
|
1705
|
+
// what keeps the approved tool signature equal to the attested one.
|
|
1706
|
+
const mediated = target.runtime.kind === "http" && target.runtime.id !== "claude-sdk";
|
|
1707
|
+
const surface = mediated ? withGatewayForCapabilities(names) : [...new Set(names)];
|
|
1708
|
+
return surface.sort();
|
|
1664
1709
|
}
|
|
1665
1710
|
|
|
1666
1711
|
/**
|
|
@@ -1679,13 +1724,23 @@ function assertPostRuntimeToolCompatibility(
|
|
|
1679
1724
|
spec: ReturnType<typeof normalizeAgentSpec>,
|
|
1680
1725
|
effectiveTools: ReadonlyArray<ToolName>,
|
|
1681
1726
|
target: ResolvedTarget,
|
|
1727
|
+
writeConfined: boolean,
|
|
1682
1728
|
): void {
|
|
1683
1729
|
const compatibility = resolveAgentToolCompatibility(spec, effectiveTools, {
|
|
1684
1730
|
mediatesDispatch: WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH,
|
|
1685
1731
|
});
|
|
1686
1732
|
if (compatibility.compatible) return;
|
|
1733
|
+
// Name the narrowing that removed the tool: blaming the runtime sends the
|
|
1734
|
+
// caller to another model when its own write roots caused the refusal.
|
|
1735
|
+
const confined = writeConfined
|
|
1736
|
+
? compatibility.missingRequired.filter((tool) => WRITE_ROOT_REFUSED_TOOLS.has(tool))
|
|
1737
|
+
: [];
|
|
1738
|
+
const cause =
|
|
1739
|
+
confined.length > 0
|
|
1740
|
+
? `; declared write roots remove ${confined.join(", ")}, so omit write roots (use autonomy: "read-only" or worktree: true) for this agent`
|
|
1741
|
+
: "";
|
|
1687
1742
|
throw new Error(
|
|
1688
|
-
`dispatch: admission denied: agent '${agentId}' is incompatible with runtime '${target.runtime.id}' after tool narrowing; missing required tools: ${compatibility.missingRequired.join(", ")}`,
|
|
1743
|
+
`dispatch: admission denied: agent '${agentId}' is incompatible with runtime '${target.runtime.id}' after tool narrowing; missing required tools: ${compatibility.missingRequired.join(", ")}${cause}`,
|
|
1689
1744
|
);
|
|
1690
1745
|
}
|
|
1691
1746
|
|
|
@@ -2838,11 +2893,30 @@ export function createDispatchBundle(
|
|
|
2838
2893
|
rootRunId: string;
|
|
2839
2894
|
terminalCandidate: RunReceipt;
|
|
2840
2895
|
timer: ReturnType<typeof setTimeout>;
|
|
2896
|
+
settleCanceled: () => void;
|
|
2841
2897
|
}
|
|
2842
2898
|
const retryQueue = new Map<string, RetryQueueEntry>();
|
|
2843
2899
|
const retryBackoff = new Map<string, BackoffState>();
|
|
2844
2900
|
const retryReasons = new Map<string, string>();
|
|
2845
2901
|
const assignmentRootsByAttempt = new Map<string, string>();
|
|
2902
|
+
// Fleet lineage is shared ancestry, not control ownership. Keep each
|
|
2903
|
+
// member's retry chain distinct without changing persisted lineage.
|
|
2904
|
+
const controlRootsByAttempt = new Map<string, string>();
|
|
2905
|
+
const controlAttempts = new Map<string, { lineage: RunLineage; reservation: DispatchRequest["reservation"] }>();
|
|
2906
|
+
const canceledControlRoots = new Set<string>();
|
|
2907
|
+
const memberWork = new Map<string, Set<Promise<unknown>>>();
|
|
2908
|
+
function trackMemberWork(runId: string, operation: Promise<unknown>): void {
|
|
2909
|
+
const root = controlRootsByAttempt.get(runId) ?? runId;
|
|
2910
|
+
const work = memberWork.get(root) ?? new Set<Promise<unknown>>();
|
|
2911
|
+
memberWork.set(root, work);
|
|
2912
|
+
work.add(operation);
|
|
2913
|
+
const settled = (): void => {
|
|
2914
|
+
work.delete(operation);
|
|
2915
|
+
if (work.size === 0) memberWork.delete(root);
|
|
2916
|
+
};
|
|
2917
|
+
operation.then(settled, settled);
|
|
2918
|
+
}
|
|
2919
|
+
|
|
2846
2920
|
const assignments = new AssignmentRegistry({
|
|
2847
2921
|
onStreamError: (error) => reportDispatchDiagnostic("assignment event stream", error),
|
|
2848
2922
|
});
|
|
@@ -2874,6 +2948,20 @@ export function createDispatchBundle(
|
|
|
2874
2948
|
function lineageFor(req: DispatchRequest, runId: string): RunLineage {
|
|
2875
2949
|
const lineage = req.lineage ? { ...req.lineage } : { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
|
|
2876
2950
|
assignmentRootsByAttempt.set(runId, lineage.rootRunId);
|
|
2951
|
+
const parent = lineage.parentRunId === null ? undefined : controlAttempts.get(lineage.parentRunId);
|
|
2952
|
+
// Repair ordinals and fleet ancestry do not establish a retry. Only a
|
|
2953
|
+
// known consecutive attempt of the same reservation member can do so.
|
|
2954
|
+
const continuesParent =
|
|
2955
|
+
parent !== undefined &&
|
|
2956
|
+
parent.lineage.rootRunId === lineage.rootRunId &&
|
|
2957
|
+
parent.lineage.depth === lineage.depth &&
|
|
2958
|
+
parent.lineage.attempt + 1 === lineage.attempt &&
|
|
2959
|
+
parent.reservation?.ownerId === req.reservation?.ownerId &&
|
|
2960
|
+
parent.reservation?.memberId === req.reservation?.memberId;
|
|
2961
|
+
const priorControl =
|
|
2962
|
+
continuesParent && lineage.parentRunId !== null ? controlRootsByAttempt.get(lineage.parentRunId) : undefined;
|
|
2963
|
+
controlRootsByAttempt.set(runId, priorControl ?? runId);
|
|
2964
|
+
controlAttempts.set(runId, { lineage, reservation: req.reservation });
|
|
2877
2965
|
return lineage;
|
|
2878
2966
|
}
|
|
2879
2967
|
|
|
@@ -2940,7 +3028,8 @@ export function createDispatchBundle(
|
|
|
2940
3028
|
|
|
2941
3029
|
/** A reserved plan member owns its retry chain independently of the shared fleet root assignment. */
|
|
2942
3030
|
function retryChainIsLive(run: ActiveRun): boolean {
|
|
2943
|
-
if (run.aborted)
|
|
3031
|
+
if (run.aborted || canceledControlRoots.has(controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId))
|
|
3032
|
+
return false;
|
|
2944
3033
|
const reservation = run.req.reservation;
|
|
2945
3034
|
if (reservation === undefined) return assignments.get(run.lineage.rootRunId)?.status === "running";
|
|
2946
3035
|
try {
|
|
@@ -3024,9 +3113,18 @@ export function createDispatchBundle(
|
|
|
3024
3113
|
const attempt = run.lineage.attempt + 1;
|
|
3025
3114
|
const reason = detail !== null ? `${outcome}: ${detail}` : outcome;
|
|
3026
3115
|
const dueAt = now() + delayMs;
|
|
3116
|
+
let settleCanceled!: () => void;
|
|
3117
|
+
let rejectContinuation!: (error: unknown) => void;
|
|
3118
|
+
const continuation = new Promise<void>((resolve, reject) => {
|
|
3119
|
+
settleCanceled = resolve;
|
|
3120
|
+
rejectContinuation = reject;
|
|
3121
|
+
});
|
|
3122
|
+
trackMemberWork(run.runId, continuation);
|
|
3027
3123
|
const timer = setTimeout(() => {
|
|
3028
3124
|
retryQueue.delete(run.runId);
|
|
3029
|
-
|
|
3125
|
+
// Ownership starts at scheduling, covering admission before a handle
|
|
3126
|
+
// exists and terminal receipt work after the handle arrives.
|
|
3127
|
+
executeRetry(run, attempt, reason, decision).then(settleCanceled, rejectContinuation);
|
|
3030
3128
|
}, delayMs);
|
|
3031
3129
|
retryQueue.set(run.runId, {
|
|
3032
3130
|
runId: run.runId,
|
|
@@ -3039,6 +3137,7 @@ export function createDispatchBundle(
|
|
|
3039
3137
|
rootRunId,
|
|
3040
3138
|
terminalCandidate: receipt,
|
|
3041
3139
|
timer,
|
|
3140
|
+
settleCanceled,
|
|
3042
3141
|
});
|
|
3043
3142
|
context.bus.emit(BusChannels.DispatchProgress, {
|
|
3044
3143
|
runId: run.runId,
|
|
@@ -3139,6 +3238,7 @@ export function createDispatchBundle(
|
|
|
3139
3238
|
// the worktree it created). A retry shares the assignment lineage but
|
|
3140
3239
|
// must receive its own ledger/run identity.
|
|
3141
3240
|
delete retryReq.runIdHint;
|
|
3241
|
+
let terminal: Promise<RunReceipt> | undefined;
|
|
3142
3242
|
const reasonKey = retryReasonKey(run.lineage.rootRunId, attempt);
|
|
3143
3243
|
retryReasons.set(reasonKey, reason);
|
|
3144
3244
|
try {
|
|
@@ -3204,6 +3304,10 @@ export function createDispatchBundle(
|
|
|
3204
3304
|
if (decision.excludedRouteParts.includes("runtime")) delete retryReq.workerRuntime;
|
|
3205
3305
|
}
|
|
3206
3306
|
const handle = await dispatch(retryReq, undefined, run.hostRun === undefined ? undefined : { hostRun: run.hostRun });
|
|
3307
|
+
// Cancellation can arrive while retry admission is awaiting a handle.
|
|
3308
|
+
if (canceledControlRoots.has(controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId)) {
|
|
3309
|
+
contract.abort(handle.runId);
|
|
3310
|
+
}
|
|
3207
3311
|
// The assignment folds every attempt into one stream with a reset marker.
|
|
3208
3312
|
const marker: AssignmentAttemptStartEvent = {
|
|
3209
3313
|
type: "attempt_start",
|
|
@@ -3225,6 +3329,7 @@ export function createDispatchBundle(
|
|
|
3225
3329
|
runtimeKind: run.runtimeKind,
|
|
3226
3330
|
event: marker,
|
|
3227
3331
|
});
|
|
3332
|
+
terminal = handle.finalPromise;
|
|
3228
3333
|
handle.finalPromise.catch((error) => {
|
|
3229
3334
|
assignments.reject(asAssignmentId(run.lineage.rootRunId), error);
|
|
3230
3335
|
reportDispatchDiagnostic(`finalize retry run ${handle.runId}`, error);
|
|
@@ -3257,6 +3362,7 @@ export function createDispatchBundle(
|
|
|
3257
3362
|
outcomeDetail: denial,
|
|
3258
3363
|
});
|
|
3259
3364
|
}
|
|
3365
|
+
await terminal;
|
|
3260
3366
|
}
|
|
3261
3367
|
|
|
3262
3368
|
function requireLedger(): Ledger {
|
|
@@ -3647,7 +3753,7 @@ export function createDispatchBundle(
|
|
|
3647
3753
|
),
|
|
3648
3754
|
req,
|
|
3649
3755
|
);
|
|
3650
|
-
assertPostRuntimeToolCompatibility(req.agentId, spec, effectiveTools, target);
|
|
3756
|
+
assertPostRuntimeToolCompatibility(req.agentId, spec, effectiveTools, target, pathScope.writeBoundaries.length > 0);
|
|
3651
3757
|
const effectiveAdmission: DispatchAdmissionStage = {
|
|
3652
3758
|
...admission,
|
|
3653
3759
|
allowedTools: effectiveTools,
|
|
@@ -3952,7 +4058,13 @@ export function createDispatchBundle(
|
|
|
3952
4058
|
}
|
|
3953
4059
|
timing.workerSpawnedAt = new Date(now()).toISOString();
|
|
3954
4060
|
|
|
3955
|
-
const tokenMeter = {
|
|
4061
|
+
const tokenMeter: RunTokenMeter = {
|
|
4062
|
+
inputTokens: 0,
|
|
4063
|
+
outputTokens: 0,
|
|
4064
|
+
cacheReadTokens: 0,
|
|
4065
|
+
cacheWriteTokens: 0,
|
|
4066
|
+
reasoningTokens: 0,
|
|
4067
|
+
};
|
|
3956
4068
|
const safetyDecisionCounts = { allowed: 0, blocked: 0, permissionRequested: 0 };
|
|
3957
4069
|
const blockedAttempts: SafetyBlockedAttempt[] = [];
|
|
3958
4070
|
const toolStats = new Map<string, ToolCallStat>();
|
|
@@ -4341,6 +4453,7 @@ export function createDispatchBundle(
|
|
|
4341
4453
|
outputTokenCount: tokenMeter.outputTokens,
|
|
4342
4454
|
cacheReadTokenCount: tokenMeter.cacheReadTokens,
|
|
4343
4455
|
cacheWriteTokenCount: tokenMeter.cacheWriteTokens,
|
|
4456
|
+
...(tokenMeter.cacheWrite1hTokens === undefined ? {} : { cacheWrite1hTokenCount: tokenMeter.cacheWrite1hTokens }),
|
|
4344
4457
|
reasoningTokenCount: tokenMeter.reasoningTokens,
|
|
4345
4458
|
...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
|
|
4346
4459
|
...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
|
|
@@ -4427,6 +4540,7 @@ export function createDispatchBundle(
|
|
|
4427
4540
|
outputTokenCount: receipt.outputTokenCount ?? 0,
|
|
4428
4541
|
cacheReadTokenCount: receipt.cacheReadTokenCount ?? 0,
|
|
4429
4542
|
cacheWriteTokenCount: receipt.cacheWriteTokenCount ?? 0,
|
|
4543
|
+
...(receipt.cacheWrite1hTokenCount === undefined ? {} : { cacheWrite1hTokenCount: receipt.cacheWrite1hTokenCount }),
|
|
4430
4544
|
reasoningTokenCount: receipt.reasoningTokenCount ?? 0,
|
|
4431
4545
|
staticShellHash: receipt.staticShellHash ?? null,
|
|
4432
4546
|
sessionShellHash: receipt.sessionShellHash ?? null,
|
|
@@ -4552,6 +4666,9 @@ export function createDispatchBundle(
|
|
|
4552
4666
|
dynamicHash: receiptDraft.dynamicHash ?? null,
|
|
4553
4667
|
cacheReadTokenCount: receiptDraft.cacheReadTokenCount ?? 0,
|
|
4554
4668
|
cacheWriteTokenCount: receiptDraft.cacheWriteTokenCount ?? 0,
|
|
4669
|
+
...(receiptDraft.cacheWrite1hTokenCount === undefined
|
|
4670
|
+
? {}
|
|
4671
|
+
: { cacheWrite1hTokenCount: receiptDraft.cacheWrite1hTokenCount }),
|
|
4555
4672
|
reasoningTokenCount: receiptDraft.reasoningTokenCount ?? 0,
|
|
4556
4673
|
heartbeatAt: heartbeatIso(acp.heartbeatAt),
|
|
4557
4674
|
};
|
|
@@ -4838,7 +4955,13 @@ export function createDispatchBundle(
|
|
|
4838
4955
|
throw error;
|
|
4839
4956
|
}
|
|
4840
4957
|
})();
|
|
4841
|
-
const tokenMeter = {
|
|
4958
|
+
const tokenMeter: RunTokenMeter = {
|
|
4959
|
+
inputTokens: 0,
|
|
4960
|
+
outputTokens: 0,
|
|
4961
|
+
cacheReadTokens: 0,
|
|
4962
|
+
cacheWriteTokens: 0,
|
|
4963
|
+
reasoningTokens: 0,
|
|
4964
|
+
};
|
|
4842
4965
|
const safetyDecisionCounts = { allowed: 0, blocked: 0, permissionRequested: 0 };
|
|
4843
4966
|
const escalationCounts = { requested: 0, approved: 0, denied: 0, timedOut: 0 };
|
|
4844
4967
|
const blockedAttempts: SafetyBlockedAttempt[] = [];
|
|
@@ -5118,11 +5241,7 @@ export function createDispatchBundle(
|
|
|
5118
5241
|
}
|
|
5119
5242
|
if (event.type === "message_end" && event.message?.role === "assistant" && isRecord(event.message.usage)) {
|
|
5120
5243
|
const u = event.message.usage;
|
|
5121
|
-
tokenMeter
|
|
5122
|
-
tokenMeter.outputTokens += typeof u.output === "number" ? u.output : 0;
|
|
5123
|
-
tokenMeter.cacheReadTokens += typeof u.cacheRead === "number" ? u.cacheRead : 0;
|
|
5124
|
-
tokenMeter.cacheWriteTokens += typeof u.cacheWrite === "number" ? u.cacheWrite : 0;
|
|
5125
|
-
tokenMeter.reasoningTokens += extractReasoningTokenCount(u);
|
|
5244
|
+
accumulateNativeUsage(tokenMeter, u, lifecycle.target.effectivePricing.rates);
|
|
5126
5245
|
const requestedModelId = readStringOrNull(event.message.model);
|
|
5127
5246
|
const responseModelIdObservation = responseModelIdObservationFromRecord(event.message, "not-observed");
|
|
5128
5247
|
const differingResponseModelId = readStringOrNull(event.message.responseModel);
|
|
@@ -5552,11 +5671,15 @@ export function createDispatchBundle(
|
|
|
5552
5671
|
outputTokenCount: tokenMeter.outputTokens,
|
|
5553
5672
|
cacheReadTokenCount: tokenMeter.cacheReadTokens,
|
|
5554
5673
|
cacheWriteTokenCount: tokenMeter.cacheWriteTokens,
|
|
5674
|
+
...(tokenMeter.cacheWrite1hTokens === undefined ? {} : { cacheWrite1hTokenCount: tokenMeter.cacheWrite1hTokens }),
|
|
5555
5675
|
reasoningTokenCount: tokenMeter.reasoningTokens,
|
|
5556
5676
|
...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
|
|
5557
5677
|
...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
|
|
5558
5678
|
costUsd,
|
|
5559
|
-
costProvenance:
|
|
5679
|
+
costProvenance:
|
|
5680
|
+
lifecycle.target.effectivePricing.provenance === "unknown" && costUsd > 0
|
|
5681
|
+
? "estimated"
|
|
5682
|
+
: lifecycle.target.effectivePricing.provenance,
|
|
5560
5683
|
compiledPromptHash: lifecycle.compiledPromptHash,
|
|
5561
5684
|
staticCompositionHash: lifecycle.staticCompositionHash,
|
|
5562
5685
|
staticShellHash: lifecycle.staticCompositionHash,
|
|
@@ -5646,6 +5769,7 @@ export function createDispatchBundle(
|
|
|
5646
5769
|
outputTokenCount: receipt.outputTokenCount ?? 0,
|
|
5647
5770
|
cacheReadTokenCount: receipt.cacheReadTokenCount ?? 0,
|
|
5648
5771
|
cacheWriteTokenCount: receipt.cacheWriteTokenCount ?? 0,
|
|
5772
|
+
...(receipt.cacheWrite1hTokenCount === undefined ? {} : { cacheWrite1hTokenCount: receipt.cacheWrite1hTokenCount }),
|
|
5649
5773
|
reasoningTokenCount: receipt.reasoningTokenCount ?? 0,
|
|
5650
5774
|
staticShellHash: receipt.staticShellHash ?? null,
|
|
5651
5775
|
sessionShellHash: receipt.sessionShellHash ?? null,
|
|
@@ -5769,6 +5893,7 @@ export function createDispatchBundle(
|
|
|
5769
5893
|
cwd: lifecycle.cwd,
|
|
5770
5894
|
networkAllowed:
|
|
5771
5895
|
lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
|
|
5896
|
+
lifecycle.admission.allowedTools.includes(ToolNames.WebRead) ||
|
|
5772
5897
|
lifecycle.target.runtime.externalAgentLoop?.network === "externally-governed-unobserved",
|
|
5773
5898
|
observedRunEffects,
|
|
5774
5899
|
filesystem: nodeResultContractFilesystem(),
|
|
@@ -5891,6 +6016,9 @@ export function createDispatchBundle(
|
|
|
5891
6016
|
...(receiptDraft.cacheReadTokenCount !== undefined
|
|
5892
6017
|
? { cacheReadTokenCount: receiptDraft.cacheReadTokenCount }
|
|
5893
6018
|
: {}),
|
|
6019
|
+
...(receiptDraft.cacheWrite1hTokenCount === undefined
|
|
6020
|
+
? {}
|
|
6021
|
+
: { cacheWrite1hTokenCount: receiptDraft.cacheWrite1hTokenCount }),
|
|
5894
6022
|
...(receiptDraft.cacheWriteTokenCount !== undefined
|
|
5895
6023
|
? { cacheWriteTokenCount: receiptDraft.cacheWriteTokenCount }
|
|
5896
6024
|
: {}),
|
|
@@ -6110,7 +6238,11 @@ export function createDispatchBundle(
|
|
|
6110
6238
|
}
|
|
6111
6239
|
// Requests carrying lineage are internal attempts (retry or nested
|
|
6112
6240
|
// orchestration) and retain the per-attempt handle contract.
|
|
6113
|
-
if (req.lineage)
|
|
6241
|
+
if (req.lineage) {
|
|
6242
|
+
const finalPromise = handle.finalPromise.finally(() => writerLease?.release());
|
|
6243
|
+
trackMemberWork(handle.runId, finalPromise);
|
|
6244
|
+
return { ...handle, finalPromise };
|
|
6245
|
+
}
|
|
6114
6246
|
|
|
6115
6247
|
const assignment = assignments.open(handle.runId, assignmentPolicyFor(handle.effectiveRequest));
|
|
6116
6248
|
persistAssignment(registerAssignment(assignment.id), `${assignment.id}:open`);
|
|
@@ -6212,7 +6344,13 @@ export function createDispatchBundle(
|
|
|
6212
6344
|
),
|
|
6213
6345
|
req,
|
|
6214
6346
|
);
|
|
6215
|
-
assertPostRuntimeToolCompatibility(
|
|
6347
|
+
assertPostRuntimeToolCompatibility(
|
|
6348
|
+
req.agentId,
|
|
6349
|
+
agentSpec,
|
|
6350
|
+
effectiveTools,
|
|
6351
|
+
target,
|
|
6352
|
+
pathScope.writeBoundaries.length > 0,
|
|
6353
|
+
);
|
|
6216
6354
|
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
|
|
6217
6355
|
assertResponseSchemaEnforceable(target.runtime, target.modelCapabilities, req.responseSchema, effectiveTools.length);
|
|
6218
6356
|
assertWriteRootsEnforceable(target.runtime, pathScope.writeBoundaries);
|
|
@@ -6672,7 +6810,11 @@ export function createDispatchBundle(
|
|
|
6672
6810
|
// No in-memory executor survives a process restart, so every active
|
|
6673
6811
|
// side-store lease from an earlier bundle is orphaned and must expire.
|
|
6674
6812
|
cleanupDispatchReservations({ startup: true, nowMs: now() });
|
|
6675
|
-
ledger = openLedger(
|
|
6813
|
+
ledger = openLedger({
|
|
6814
|
+
get maxRuns() {
|
|
6815
|
+
return getEffectiveSettings()?.fleet?.history?.maxRuns ?? resolveGuardrail("maxDispatchRuns");
|
|
6816
|
+
},
|
|
6817
|
+
});
|
|
6676
6818
|
// Symphony P10: restart recovery from durable artifacts. Adopt
|
|
6677
6819
|
// receipts whose ledger rows were lost to a crash between
|
|
6678
6820
|
// recordReceipt() and persist(); quarantine tampered ones.
|
|
@@ -6802,6 +6944,7 @@ export function createDispatchBundle(
|
|
|
6802
6944
|
const meter = run.meter;
|
|
6803
6945
|
const totalTokens = meter.inputTokens + meter.outputTokens + meter.cacheReadTokens + meter.cacheWriteTokens;
|
|
6804
6946
|
const costUsd = calculateUsageCostUsd(meter, run.pricing);
|
|
6947
|
+
const costProvenance = run.costProvenance === "unknown" && costUsd > 0 ? "estimated" : run.costProvenance;
|
|
6805
6948
|
const startedMs = Date.parse(run.startedAt);
|
|
6806
6949
|
const elapsedMs = Number.isFinite(startedMs) ? Math.max(0, tickNow - startedMs) : 0;
|
|
6807
6950
|
const timing = deriveRunPhaseDurations(run.timing, run.startedAt, new Date(tickNow).toISOString());
|
|
@@ -6819,14 +6962,14 @@ export function createDispatchBundle(
|
|
|
6819
6962
|
timing,
|
|
6820
6963
|
tokens: { input: meter.inputTokens, output: meter.outputTokens, total: totalTokens },
|
|
6821
6964
|
costUsd,
|
|
6822
|
-
costProvenance
|
|
6965
|
+
costProvenance,
|
|
6823
6966
|
node: run.node !== null ? { ...run.node } : null,
|
|
6824
6967
|
});
|
|
6825
6968
|
totals.inputTokens += meter.inputTokens;
|
|
6826
6969
|
totals.outputTokens += meter.outputTokens;
|
|
6827
6970
|
totals.totalTokens += totalTokens;
|
|
6828
6971
|
totals.costUsd += costUsd;
|
|
6829
|
-
costAmounts.push({ usd: costUsd, provenance:
|
|
6972
|
+
costAmounts.push({ usd: costUsd, provenance: costProvenance });
|
|
6830
6973
|
totals.runtimeSeconds += elapsedMs / 1000;
|
|
6831
6974
|
}
|
|
6832
6975
|
const retrying = [...retryQueue.values()].map((entry) => ({
|
|
@@ -6864,6 +7007,7 @@ export function createDispatchBundle(
|
|
|
6864
7007
|
function settleQueuedAssignmentsForShutdown(): void {
|
|
6865
7008
|
for (const [finishedRunId, entry] of retryQueue) {
|
|
6866
7009
|
clearTimeout(entry.timer);
|
|
7010
|
+
entry.settleCanceled();
|
|
6867
7011
|
if (assignments.get(entry.rootRunId)?.status === "running") {
|
|
6868
7012
|
settleAssignmentDurably(asAssignmentId(entry.rootRunId), entry.terminalCandidate, "canceled");
|
|
6869
7013
|
}
|
|
@@ -6909,11 +7053,28 @@ export function createDispatchBundle(
|
|
|
6909
7053
|
return stored?.assignmentId ?? ledger?.get(id)?.lineage?.rootRunId ?? id;
|
|
6910
7054
|
}
|
|
6911
7055
|
|
|
7056
|
+
function controlRootFor(id: string): string {
|
|
7057
|
+
const exact = controlRootsByAttempt.get(id);
|
|
7058
|
+
if (exact !== undefined) return exact;
|
|
7059
|
+
const roots = new Set<string>();
|
|
7060
|
+
for (const [attempt, root] of assignmentRootsByAttempt) {
|
|
7061
|
+
if (root === id) roots.add(controlRootsByAttempt.get(attempt) ?? root);
|
|
7062
|
+
}
|
|
7063
|
+
if (roots.size > 1) {
|
|
7064
|
+
throw new Error(`dispatch: '${id}' names multiple fleet members; use a concrete member or assignment id`);
|
|
7065
|
+
}
|
|
7066
|
+
return roots.values().next().value ?? assignmentRootFor(id);
|
|
7067
|
+
}
|
|
7068
|
+
|
|
6912
7069
|
function currentAssignmentRun(id: string): ActiveRun | null {
|
|
6913
|
-
|
|
7070
|
+
// An exact live attempt is authoritative even if a sibling has a higher
|
|
7071
|
+
// attempt ordinal. Completed IDs may follow only their own retry chain.
|
|
7072
|
+
const exact = active.get(id);
|
|
7073
|
+
if (exact !== undefined) return exact;
|
|
7074
|
+
const rootRunId = controlRootFor(id);
|
|
6914
7075
|
let current: ActiveRun | null = null;
|
|
6915
7076
|
for (const run of active.values()) {
|
|
6916
|
-
if (run.lineage.rootRunId !== rootRunId) continue;
|
|
7077
|
+
if ((controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId) !== rootRunId) continue;
|
|
6917
7078
|
if (current === null || run.lineage.attempt > current.lineage.attempt) current = run;
|
|
6918
7079
|
}
|
|
6919
7080
|
return current;
|
|
@@ -6967,8 +7128,25 @@ export function createDispatchBundle(
|
|
|
6967
7128
|
await Promise.allSettled([...assignmentWrites]);
|
|
6968
7129
|
},
|
|
6969
7130
|
},
|
|
7131
|
+
async drainMember(runId) {
|
|
7132
|
+
const root = controlRootFor(runId);
|
|
7133
|
+
const errors: unknown[] = [];
|
|
7134
|
+
while (true) {
|
|
7135
|
+
const pending = [...(memberWork.get(root) ?? [])];
|
|
7136
|
+
const live = currentAssignmentRun(runId);
|
|
7137
|
+
if (live !== null) pending.push(live.finalPromise);
|
|
7138
|
+
if (pending.length === 0) break;
|
|
7139
|
+
for (const result of await Promise.allSettled(pending)) {
|
|
7140
|
+
if (result.status === "rejected" && !errors.includes(result.reason)) errors.push(result.reason);
|
|
7141
|
+
}
|
|
7142
|
+
}
|
|
7143
|
+
if (errors.length === 1) throw errors[0];
|
|
7144
|
+
if (errors.length > 1) throw new AggregateError(errors, "dispatch member drain failed", { cause: errors[0] });
|
|
7145
|
+
},
|
|
6970
7146
|
abort(runId, reason) {
|
|
6971
|
-
const rootRunId =
|
|
7147
|
+
const rootRunId = controlRootFor(runId);
|
|
7148
|
+
const run = currentAssignmentRun(runId);
|
|
7149
|
+
canceledControlRoots.add(rootRunId);
|
|
6972
7150
|
const queued = pendingCapacity.get(rootRunId);
|
|
6973
7151
|
if (queued !== undefined && capacityAdmission.cancel(rootRunId)) {
|
|
6974
7152
|
persistAssignment(cancelStoredAssignment(rootRunId), `${rootRunId}:cancel-queued`);
|
|
@@ -6986,10 +7164,13 @@ export function createDispatchBundle(
|
|
|
6986
7164
|
persistAssignment(cancelStoredAssignment(rootRunId), `${rootRunId}:cancel`);
|
|
6987
7165
|
}
|
|
6988
7166
|
for (const [finishedRunId, retry] of retryQueue) {
|
|
6989
|
-
if (retry.rootRunId !== rootRunId) continue;
|
|
7167
|
+
if ((controlRootsByAttempt.get(finishedRunId) ?? retry.rootRunId) !== rootRunId) continue;
|
|
6990
7168
|
clearTimeout(retry.timer);
|
|
7169
|
+
retry.settleCanceled();
|
|
6991
7170
|
retryQueue.delete(finishedRunId);
|
|
6992
|
-
|
|
7171
|
+
if (retry.rootRunId === rootRunId) {
|
|
7172
|
+
settleAssignmentDurably(asAssignmentId(rootRunId), retry.terminalCandidate, "canceled");
|
|
7173
|
+
}
|
|
6993
7174
|
context.bus.emit(BusChannels.RunAborted, {
|
|
6994
7175
|
source: "dispatch_abort",
|
|
6995
7176
|
runId: finishedRunId,
|
|
@@ -7004,7 +7185,6 @@ export function createDispatchBundle(
|
|
|
7004
7185
|
event: { type: "retry_canceled", attempt: retry.attempt },
|
|
7005
7186
|
});
|
|
7006
7187
|
}
|
|
7007
|
-
const run = currentAssignmentRun(rootRunId);
|
|
7008
7188
|
if (!run) return;
|
|
7009
7189
|
emitRunAborted(run, "dispatch_abort");
|
|
7010
7190
|
run.aborted = true;
|
|
@@ -18,6 +18,7 @@ import { performance } from "node:perf_hooks";
|
|
|
18
18
|
import { readClioVersion } from "../../core/package-root.js";
|
|
19
19
|
import { shellQuote } from "../../core/shell-quote.js";
|
|
20
20
|
import { clioStateDir } from "../../core/xdg.js";
|
|
21
|
+
import { atomicWrite } from "../../engine/session.js";
|
|
21
22
|
import {
|
|
22
23
|
evaluateRouteFacts,
|
|
23
24
|
type FactState,
|
|
@@ -91,6 +92,20 @@ export function readFleetPreflightRecords(): FleetPreflightRecord[] {
|
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Upsert records keyed by (nodeId, projectRoot). Only `clio-coder doctor --fix`
|
|
97
|
+
* writes: plain doctor stays observation-only, and dispatch admission fails
|
|
98
|
+
* closed on a node that has no stored passing record.
|
|
99
|
+
*/
|
|
100
|
+
export function recordFleetPreflight(records: ReadonlyArray<FleetPreflightRecord>): void {
|
|
101
|
+
const merged = new Map<string, FleetPreflightRecord>();
|
|
102
|
+
for (const record of [...readFleetPreflightRecords(), ...records]) {
|
|
103
|
+
merged.set(`${record.nodeId}\0${record.projectRoot}`, record);
|
|
104
|
+
}
|
|
105
|
+
const file: FleetPreflightStoreFile = { version: 2, records: [...merged.values()] };
|
|
106
|
+
atomicWrite(storePath(), JSON.stringify(file, null, 2));
|
|
107
|
+
}
|
|
108
|
+
|
|
94
109
|
export interface FleetPreflightVerdict {
|
|
95
110
|
ok: boolean;
|
|
96
111
|
reason: string | null;
|
|
@@ -110,19 +125,19 @@ export function fleetPreflightVerdict(
|
|
|
110
125
|
if (!record) {
|
|
111
126
|
return {
|
|
112
127
|
ok: false,
|
|
113
|
-
reason: `node '${node.id}' has not passed the fleet preflight for ${projectRoot}; run 'clio-coder doctor'`,
|
|
128
|
+
reason: `node '${node.id}' has not passed the fleet preflight for ${projectRoot}; run 'clio-coder doctor --fix'`,
|
|
114
129
|
};
|
|
115
130
|
}
|
|
116
131
|
if (record.host !== node.host) {
|
|
117
132
|
return {
|
|
118
133
|
ok: false,
|
|
119
|
-
reason: `node '${node.id}' preflight was recorded for host '${record.host}' but the node now points at '${node.host}'; run 'clio-coder doctor'`,
|
|
134
|
+
reason: `node '${node.id}' preflight was recorded for host '${record.host}' but the node now points at '${node.host}'; run 'clio-coder doctor --fix'`,
|
|
120
135
|
};
|
|
121
136
|
}
|
|
122
137
|
if (record.localVersion !== readClioVersion()) {
|
|
123
138
|
return {
|
|
124
139
|
ok: false,
|
|
125
|
-
reason: `node '${node.id}' preflight predates a local clio-coder upgrade (${record.localVersion} -> ${readClioVersion()}); run 'clio-coder doctor'`,
|
|
140
|
+
reason: `node '${node.id}' preflight predates a local clio-coder upgrade (${record.localVersion} -> ${readClioVersion()}); run 'clio-coder doctor --fix'`,
|
|
126
141
|
};
|
|
127
142
|
}
|
|
128
143
|
if (!record.ok) {
|
|
@@ -788,6 +788,7 @@ export async function executeFleetRun(input: ExecuteFleetRunInput): Promise<Flee
|
|
|
788
788
|
beginWriteBoundary: (window, stepIds) => boundaryEnforcer.begin(window, stepIds),
|
|
789
789
|
verifyWriteBoundary: (window, stepIds) => boundaryEnforcer.verify(window, stepIds),
|
|
790
790
|
cancel: (assignmentId) => dispatch.abort(assignmentId),
|
|
791
|
+
drainMember: (assignmentId) => dispatch.drainMember?.(assignmentId) ?? Promise.resolve(),
|
|
791
792
|
release: (ownerId) => {
|
|
792
793
|
if (ownerId === NO_WORKER_RESERVATION) return;
|
|
793
794
|
dispatch.reservations?.release(ownerId);
|
|
@@ -75,7 +75,7 @@ export interface GateDecisionArtifact {
|
|
|
75
75
|
* prose line. Two schemas exist because the two topologies ask different
|
|
76
76
|
* questions:
|
|
77
77
|
*
|
|
78
|
-
* - Review asks "does this work pass?", which is exactly the
|
|
78
|
+
* - Review asks "does this work pass?", which is exactly the
|
|
79
79
|
* `verifier-report` contract. There is deliberately no `revise` verdict:
|
|
80
80
|
* whether a failure is worth another cycle is the coordinator's bounded
|
|
81
81
|
* continuation policy, not a decision the reviewed model gets to author.
|
|
@@ -96,7 +96,7 @@ export interface CompeteGateResult {
|
|
|
96
96
|
|
|
97
97
|
export type GateResultParse<T> = { ok: true; result: T } | { ok: false; reason: string };
|
|
98
98
|
|
|
99
|
-
/** Parse a reviewer answer under the
|
|
99
|
+
/** Parse a reviewer answer under the verifier-report contract. */
|
|
100
100
|
function parseReviewGateResult(output: string): GateResultParse<ReviewGateResult> {
|
|
101
101
|
const result = parseVerifierResult(output);
|
|
102
102
|
return result === null
|
|
@@ -128,7 +128,7 @@ export interface ReviewGateDecision {
|
|
|
128
128
|
/**
|
|
129
129
|
* Apply the coordinator's review policy to one reviewer answer.
|
|
130
130
|
*
|
|
131
|
-
* The reviewer answers pass or fail under its
|
|
131
|
+
* The reviewer answers pass or fail under its verifier-report contract and nothing
|
|
132
132
|
* else. `revise` is this function's bounded continuation decision: a failure
|
|
133
133
|
* with cycles left earns another builder attempt, the same failure at the bound
|
|
134
134
|
* is simply the terminal fail, and an answer that does not satisfy the contract
|