@testmuai/kane-cli 0.6.11 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/ChatSurface-D66CACLX.js +8 -0
  2. package/dist/{ChromeProfilePicker-54CAJDUF.js → ChromeProfilePicker-4CDSPBWL.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-TCAH4AHL.js → CliFeedbackPrompt-TLRVBA4E.js} +1 -1
  4. package/dist/{CliUploadProgress-UURZ63VQ.js → CliUploadProgress-WGGFLUSF.js} +1 -1
  5. package/dist/{ConfigView-5QGB7MUS.js → ConfigView-DBANTBXC.js} +1 -1
  6. package/dist/EvidenceViewOffer-DNCQ3A6R.js +2 -0
  7. package/dist/{FolderPicker-Y5MAYFIJ.js → FolderPicker-W7RCIFEL.js} +1 -1
  8. package/dist/{HelpView-S3GJGSCE.js → HelpView-FBCX32U7.js} +1 -1
  9. package/dist/{InfoBox-LYTNNMVJ.js → InfoBox-KK2ICVS4.js} +1 -1
  10. package/dist/{LinksBox-5MSEKNSV.js → LinksBox-KKRANMR3.js} +1 -1
  11. package/dist/{ProfilesView-LTHE5UIO.js → ProfilesView-DGPXSAQN.js} +1 -1
  12. package/dist/{ProjectPicker-XMXIGHSE.js → ProjectPicker-ESQSL4TT.js} +1 -1
  13. package/dist/{SaveSessionPrompt-VQDEA4WA.js → SaveSessionPrompt-AQGP5W6E.js} +1 -1
  14. package/dist/SingleShotApp-SMCAIKCE.js +2 -0
  15. package/dist/{SummaryBox-WWF3G263.js → SummaryBox-BFZJW2KK.js} +1 -1
  16. package/dist/TestMdRunView-FMKZJ3A3.js +2 -0
  17. package/dist/{WhoamiView-PDURYP7E.js → WhoamiView-JABY3I5Q.js} +1 -1
  18. package/dist/{auth-I4RB4KO3.js → auth-76LVI6B5.js} +1 -1
  19. package/dist/bind-AACBTSAA.js +12 -0
  20. package/dist/bootstrap-CNOZ5VRB.js +2 -0
  21. package/dist/bridge-T4HL4TG7.js +2 -0
  22. package/dist/{changelog-OKYH4F7I.js → changelog-PSWPPOAF.js} +1 -1
  23. package/dist/chat-committer-4BQBOKI4.js +2 -0
  24. package/dist/chat-controller-NNTMKEPG.js +2 -0
  25. package/dist/{chunk-NUQ423YE.js → chunk-2KBD6JZX.js} +1 -1
  26. package/dist/chunk-2SREGETM.js +4 -0
  27. package/dist/chunk-2XGDWUJ5.js +2 -0
  28. package/dist/{chunk-MJBCBQC2.js → chunk-322JEJEH.js} +1 -1
  29. package/dist/{chunk-SURF5Z7Y.js → chunk-323MLBYA.js} +1 -1
  30. package/dist/{chunk-HOQEMPMQ.js → chunk-33QXD75Y.js} +2 -2
  31. package/dist/{chunk-K7USHLVZ.js → chunk-36OC3TFE.js} +1 -1
  32. package/dist/{chunk-ZNHXIRCM.js → chunk-3FN5VJMV.js} +2 -2
  33. package/dist/chunk-3LWTUMDG.js +2 -0
  34. package/dist/chunk-3STZLM5J.js +4 -0
  35. package/dist/{chunk-KXUSG5ZI.js → chunk-4OPQJ7PE.js} +1 -1
  36. package/dist/chunk-5JTUL6XL.js +2 -0
  37. package/dist/{chunk-FMR2KPSK.js → chunk-5KFS3GAZ.js} +1 -1
  38. package/dist/{chunk-XZRIQ3GF.js → chunk-6HEGD6H2.js} +1 -1
  39. package/dist/{chunk-XWSAKVEY.js → chunk-6UJDOAYR.js} +2 -2
  40. package/dist/{chunk-QJIJC3KC.js → chunk-73C4PRYU.js} +1 -1
  41. package/dist/chunk-AAONIIQV.js +6 -0
  42. package/dist/chunk-AH7ZZIZY.js +2 -0
  43. package/dist/chunk-AM5S4KG4.js +6 -0
  44. package/dist/{chunk-7MRBMDZ5.js → chunk-APAIWBIH.js} +1 -1
  45. package/dist/{chunk-HMM5FJJO.js → chunk-BAL64WSI.js} +1 -1
  46. package/dist/chunk-BB2W35TW.js +2 -0
  47. package/dist/chunk-BQHKBOSF.js +11 -0
  48. package/dist/chunk-C4G7RVJ6.js +2 -0
  49. package/dist/{chunk-NTGYFYBP.js → chunk-CDQX6HGJ.js} +1 -1
  50. package/dist/{chunk-KSZ72BSC.js → chunk-CSQ46PJ7.js} +1 -1
  51. package/dist/chunk-DQ54MH7F.js +13 -0
  52. package/dist/{chunk-3AZTXJY4.js → chunk-DXV6MBTD.js} +1 -1
  53. package/dist/chunk-DYW5C6II.js +2 -0
  54. package/dist/{chunk-LHDNJJGE.js → chunk-F6ZOJXYU.js} +1 -1
  55. package/dist/chunk-GVIPTX6T.js +6 -0
  56. package/dist/chunk-GW5DWAXY.js +2 -0
  57. package/dist/chunk-HJERKSBK.js +349 -0
  58. package/dist/{chunk-POYZ6SAI.js → chunk-HPMS5KO6.js} +2 -2
  59. package/dist/{chunk-3RZ63RBO.js → chunk-IBNC444G.js} +1 -1
  60. package/dist/{chunk-73OQDAXF.js → chunk-IQDWBTRJ.js} +1 -1
  61. package/dist/chunk-IXVOXJP6.js +6 -0
  62. package/dist/{chunk-IQODWB32.js → chunk-JEUA4UWK.js} +1 -1
  63. package/dist/{chunk-GLA6QL3T.js → chunk-JKTFTF24.js} +1 -1
  64. package/dist/{chunk-KHJXOFDM.js → chunk-JRMDGLLT.js} +1 -1
  65. package/dist/{chunk-GIMTSDNC.js → chunk-KNDSQ4PS.js} +1 -1
  66. package/dist/chunk-KRXSXQBU.js +12 -0
  67. package/dist/{chunk-4CJ55EUY.js → chunk-KT6G7AF2.js} +1 -1
  68. package/dist/chunk-KVQOBPAZ.js +2 -0
  69. package/dist/chunk-L2TV4G56.js +4 -0
  70. package/dist/{chunk-6HYW5RFX.js → chunk-L4JIMNKW.js} +1 -1
  71. package/dist/{chunk-FSB3FTIQ.js → chunk-L7VREJTG.js} +1 -1
  72. package/dist/{chunk-MRP54NCJ.js → chunk-LQZ2BU7Q.js} +1 -1
  73. package/dist/{chunk-EAUUULJQ.js → chunk-LR5XO2KD.js} +1 -1
  74. package/dist/chunk-M7WQM4UA.js +4 -0
  75. package/dist/{chunk-KHQHVSZ6.js → chunk-NAC7SFBE.js} +1 -1
  76. package/dist/{chunk-DSOA6L73.js → chunk-NAE7MBR2.js} +3 -3
  77. package/dist/{chunk-NTNAHN25.js → chunk-NBKQT7LJ.js} +1 -1
  78. package/dist/{chunk-7NLQ3QQD.js → chunk-NJPTOKW5.js} +1 -1
  79. package/dist/{chunk-RFJAYURU.js → chunk-NOCIMJSN.js} +1 -1
  80. package/dist/chunk-NRC2G4Y5.js +5 -0
  81. package/dist/{chunk-H2W2UNTN.js → chunk-NRTHYROA.js} +1 -1
  82. package/dist/chunk-O56PUUNL.js +9 -0
  83. package/dist/chunk-OHRS3H7Z.js +5 -0
  84. package/dist/{chunk-FCHTL74E.js → chunk-PMHJRT3A.js} +1 -1
  85. package/dist/{chunk-GRB66C5S.js → chunk-QROUKGKU.js} +1 -1
  86. package/dist/{chunk-XXMNUJX4.js → chunk-R2RGSO4B.js} +1 -1
  87. package/dist/{chunk-MFOH7EYR.js → chunk-RNSSM2BK.js} +1 -1
  88. package/dist/chunk-SE6WNCYU.js +4 -0
  89. package/dist/{chunk-ICGHBZFZ.js → chunk-SRDHPKJT.js} +1 -1
  90. package/dist/chunk-SWESH2J7.js +10 -0
  91. package/dist/chunk-SY3HLQMV.js +4 -0
  92. package/dist/chunk-T63R6QT4.js +4 -0
  93. package/dist/{chunk-ZP4S5WGW.js → chunk-UBFKZEX3.js} +2 -2
  94. package/dist/chunk-UI7KULSI.js +7 -0
  95. package/dist/chunk-UPPEOQJQ.js +3 -0
  96. package/dist/chunk-URQUQWGW.js +62 -0
  97. package/dist/chunk-UX2B7L6K.js +2 -0
  98. package/dist/{chunk-XSKLH2MC.js → chunk-V36ATG7A.js} +2 -2
  99. package/dist/chunk-VGFTNLQQ.js +2 -0
  100. package/dist/{chunk-RGJIRS3B.js → chunk-W5DOU2DV.js} +1 -1
  101. package/dist/chunk-W6VD2XFO.js +19 -0
  102. package/dist/chunk-WJ5HDEVH.js +6 -0
  103. package/dist/chunk-WWNSD6FA.js +6 -0
  104. package/dist/{chunk-ZPCU6546.js → chunk-X3ICV5M5.js} +1 -1
  105. package/dist/chunk-XDHZMCTA.js +4 -0
  106. package/dist/{chunk-2WKX3RMA.js → chunk-XVDJ423L.js} +1 -1
  107. package/dist/chunk-ZLCZDAEX.js +6 -0
  108. package/dist/{chunk-NJAHRITS.js → chunk-ZM5PVRJK.js} +1 -1
  109. package/dist/committer-2EJPVVCQ.js +2 -0
  110. package/dist/{config-QISRENF5.js → config-R3GF2FZA.js} +1 -1
  111. package/dist/cover-cmd-TXICWHUU.js +3 -0
  112. package/dist/{credentials-OGLK7MPV.js → credentials-XN4ROCQ3.js} +1 -1
  113. package/dist/design-committer-BQUWD6AC.js +2 -0
  114. package/dist/docx-convert-ZBVQO2LG.js +1 -1
  115. package/dist/dossier-QZV74XOS.js +3 -0
  116. package/dist/evidence-V23FPVXQ.js +2 -0
  117. package/dist/evolve-cmd-PZCPXDMR.js +2 -0
  118. package/dist/{exit-manager-MXUD7GQ7.js → exit-manager-HNFATGSM.js} +1 -1
  119. package/dist/explain-UE4IACQH.js +2 -0
  120. package/dist/{explain-cmd-NWIYH5MI.js → explain-cmd-RZW6QJYM.js} +1 -1
  121. package/dist/{explain-cmd-DBUTPZHA.js → explain-cmd-X7JZLSZZ.js} +1 -1
  122. package/dist/extract-bind-BFY7IRL4.js +10 -0
  123. package/dist/extract-cmd-U3MGK2LP.js +6 -0
  124. package/dist/feeder-XGTFV7TZ.js +2 -0
  125. package/dist/gaps-cmd-BWCRLLBK.js +3 -0
  126. package/dist/{gate-B6C6KLFA.js → gate-YHBPWEM5.js} +1 -1
  127. package/dist/{generate-headless-TUA3HGRX.js → generate-headless-BSTDLZZY.js} +2 -2
  128. package/dist/{headless-io-PWW6YKH2.js → headless-io-BL3TEAX5.js} +1 -1
  129. package/dist/index.js +67 -68
  130. package/dist/ingest-AL6CABJT.js +2 -0
  131. package/dist/ingest-cmd-O6OWWZT4.js +2 -0
  132. package/dist/interactive-bind-43HGDF5K.js +24 -0
  133. package/dist/lifecycle-cmd-D6TVTYRK.js +2 -0
  134. package/dist/list-cmd-XCAV2FKA.js +3 -0
  135. package/dist/{list-commands-F53ZNYOZ.js → list-commands-747UTUSS.js} +1 -1
  136. package/dist/locks-cmd-QAULI5LV.js +2 -0
  137. package/dist/logical-ids-4G4FAHNJ.js +2 -0
  138. package/dist/login-flow-CV76ENHV.js +2 -0
  139. package/dist/maintenance-cmd-ZRB4NTGG.js +2 -0
  140. package/dist/next-TRSKMBO5.js +2 -0
  141. package/dist/paths-JCYX6UWL.js +2 -0
  142. package/dist/{persist-recorded-session-5ZFS5SMZ.js → persist-recorded-session-MDPWWUA7.js} +1 -1
  143. package/dist/phase-seed-52LRE3LH.js +2 -0
  144. package/dist/pipeline-LM5JAK7F.js +2 -0
  145. package/dist/readmodel-X7L7W2BA.js +2 -0
  146. package/dist/reconcile-cmd-DGCSDML6.js +2 -0
  147. package/dist/{recording-banner-ZZUF2MGT.js → recording-banner-TALO7PUR.js} +1 -1
  148. package/dist/records-5SVUXJBW.js +2 -0
  149. package/dist/{require-project-folder-NQBZFUPF.js → require-project-folder-R347LFDQ.js} +1 -1
  150. package/dist/revert-DXXYXJGN.js +2 -0
  151. package/dist/review-cmd-2QF5HTI7.js +4 -0
  152. package/dist/run-52UIBPXD.js +2 -0
  153. package/dist/run-VRVH4VO3.js +2 -0
  154. package/dist/{run-test-md-XOSCYVSS.js → run-test-md-DFNIGYB7.js} +2 -2
  155. package/dist/sessions-BLXZVK5U.js +2 -0
  156. package/dist/sessions-cmd-AQWLL5ZN.js +25 -0
  157. package/dist/{skill-installer-VYIIWAK7.js → skill-installer-ANXTCXQV.js} +1 -1
  158. package/dist/spawner-AH5FTUYU.js +2 -0
  159. package/dist/structured-answers-QHFGZPSS.js +5 -0
  160. package/dist/tcg-generate-WKCBBKI5.js +2 -0
  161. package/dist/testmd-actions-RPYG6TJG.js +2 -0
  162. package/dist/token-refresh-NIDUOTRM.js +2 -0
  163. package/dist/trust-gate-EX7R2P4Y.js +2 -0
  164. package/dist/{validate-basic-LP3S5PK7.js → validate-basic-O2DP2XJL.js} +1 -1
  165. package/dist/verdicts-TJH3O5UW.js +2 -0
  166. package/dist/{version-check-XP62HWLJ.js → version-check-RNR3JCQ5.js} +1 -1
  167. package/dist/{view-cmd-GQBFCPDL.js → view-cmd-YSEGA5PI.js} +1 -1
  168. package/dist/walk-session-HXW4OSA2.js +2 -0
  169. package/dist/with-telemetry-PNP6CAVM.js +2 -0
  170. package/package.json +6 -6
  171. package/dist/ChatSurface-TZ554O4U.js +0 -8
  172. package/dist/EvidenceViewOffer-SSAM4RRP.js +0 -2
  173. package/dist/SingleShotApp-A6PCNPLM.js +0 -2
  174. package/dist/TestMdRunView-MQ7ZPFN2.js +0 -2
  175. package/dist/bind-QJT726NE.js +0 -6
  176. package/dist/bootstrap-566PPFCC.js +0 -2
  177. package/dist/bridge-QCMEOQDD.js +0 -2
  178. package/dist/chat-committer-OS7ULZMH.js +0 -2
  179. package/dist/chat-controller-QLORQWJZ.js +0 -2
  180. package/dist/chunk-3C5GMAM4.js +0 -2
  181. package/dist/chunk-54IB6CXK.js +0 -5
  182. package/dist/chunk-54VQ46U2.js +0 -14
  183. package/dist/chunk-55Y65VPA.js +0 -347
  184. package/dist/chunk-6W6AIDLJ.js +0 -4
  185. package/dist/chunk-7E24OCGX.js +0 -2
  186. package/dist/chunk-7YPK6EDR.js +0 -4
  187. package/dist/chunk-FHKDTM5L.js +0 -6
  188. package/dist/chunk-FRBYGSGJ.js +0 -4
  189. package/dist/chunk-GG43HSU2.js +0 -3
  190. package/dist/chunk-HLRLP6TQ.js +0 -2
  191. package/dist/chunk-J2KSZUOO.js +0 -4
  192. package/dist/chunk-J44RN3FB.js +0 -2
  193. package/dist/chunk-JXKRO2ZJ.js +0 -13
  194. package/dist/chunk-M5PJQ5Y3.js +0 -6
  195. package/dist/chunk-MMPFU2YC.js +0 -2
  196. package/dist/chunk-MR7CX5VT.js +0 -9
  197. package/dist/chunk-MTNUZEO7.js +0 -12
  198. package/dist/chunk-OGWC3J3C.js +0 -4
  199. package/dist/chunk-RN4OSVTG.js +0 -6
  200. package/dist/chunk-RZJVQUBA.js +0 -61
  201. package/dist/chunk-V3UE6RJP.js +0 -2
  202. package/dist/chunk-Y5RNCJAN.js +0 -19
  203. package/dist/chunk-YSSTGJ7O.js +0 -7
  204. package/dist/chunk-Z2JSEL3I.js +0 -4
  205. package/dist/cover-cmd-SV3I23UM.js +0 -2
  206. package/dist/dossier-KJSJPWOW.js +0 -3
  207. package/dist/evidence-HDD7T7DX.js +0 -2
  208. package/dist/evolve-cmd-UE2BIMXK.js +0 -2
  209. package/dist/explain-EBVIUS2X.js +0 -2
  210. package/dist/extract-bind-6MQYKN3G.js +0 -8
  211. package/dist/extract-cmd-2RUIWFZG.js +0 -6
  212. package/dist/gaps-cmd-CKCHH3HQ.js +0 -2
  213. package/dist/ingest-FIIO67ZN.js +0 -2
  214. package/dist/ingest-cmd-CRMY46YC.js +0 -7
  215. package/dist/interactive-bind-53FCRK34.js +0 -10
  216. package/dist/lifecycle-cmd-32LG364Q.js +0 -2
  217. package/dist/list-cmd-UTZ2PQUK.js +0 -3
  218. package/dist/logical-ids-I7B3VJEH.js +0 -2
  219. package/dist/login-flow-D7KBR7XR.js +0 -2
  220. package/dist/maintenance-cmd-BZAGSYGI.js +0 -2
  221. package/dist/pipeline-MX3ZR5B3.js +0 -2
  222. package/dist/readmodel-S5RAQH3F.js +0 -2
  223. package/dist/reconcile-cmd-4377PWF5.js +0 -2
  224. package/dist/revert-RQJE56HF.js +0 -2
  225. package/dist/review-cmd-7LXGYHHQ.js +0 -4
  226. package/dist/run-2AIQUJ55.js +0 -2
  227. package/dist/run-YH5SCBYD.js +0 -2
  228. package/dist/sessions-cmd-DTQYDZNT.js +0 -23
  229. package/dist/spawner-7KXVKAD5.js +0 -2
  230. package/dist/tcg-generate-U6OCCS2E.js +0 -2
  231. package/dist/testmd-actions-RPALXRZK.js +0 -2
  232. package/dist/token-refresh-S7CYBZTE.js +0 -2
  233. package/dist/walk-session-YIKHE6PT.js +0 -2
  234. /package/dist/{chunk-BC7UVJJB.js → chunk-CH273NAE.js} +0 -0
@@ -0,0 +1,12 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as Ht}from"./chunk-UPPEOQJQ.js";import{f as Qt}from"./chunk-36OC3TFE.js";import{a as ot,c as Kt,e as Jt,f as Ie,g as Xt,h as sr}from"./chunk-O56PUUNL.js";import{a as Oe,b as jt,c as Bt,d as Ft,e as qt}from"./chunk-NRC2G4Y5.js";import{a as zt,b as Zt,c as er,d as tr,e as at,f as rr}from"./chunk-2XGDWUJ5.js";import{a as Gt}from"./chunk-L2TV4G56.js";import{a as Wt,b as Vt}from"./chunk-JFAFKHDX.js";import{c as Lt}from"./chunk-5KFS3GAZ.js";import{d as It}from"./chunk-UX2B7L6K.js";import{a as Ae}from"./chunk-XDHZMCTA.js";import{a as Mt,e as Nt}from"./chunk-AAONIIQV.js";import{b as Ut}from"./chunk-YKTYVJBN.js";import{a as Yt}from"./chunk-CVOGP253.js";import{c as Ot}from"./chunk-SE6WNCYU.js";import{a as fe,b as nt}from"./chunk-DNNZ353O.js";import{b as it}from"./chunk-GVIPTX6T.js";import{a as he}from"./chunk-NVGBE2DR.js";import{a as z}from"./chunk-GW5DWAXY.js";import{j as ge,n as st}from"./chunk-3STZLM5J.js";import{f as At}from"./chunk-M7WQM4UA.js";import{e as rt}from"./chunk-WWNSD6FA.js";import{b as Tt}from"./chunk-IAHKTEET.js";import{d as ne}from"./chunk-5YPBPZUR.js";import{a as Pt}from"./chunk-5EOX4MEY.js";import{appendFileSync as vr,mkdirSync as ct,rmdirSync as wr,writeFileSync as dt}from"fs";import{dirname as dr,extname as br,join as ee}from"path";var W=class extends Error{code;constructor(e,c){super(`${e}: ${c}`),this.name="ProposalAdapterError",this.code=e}};function nr(r){return r.version===2}var ir=8;function xr(r){let e=/^extract@(\d+)$/.exec(r??"");return e?Number.parseInt(e[1],10):null}var yr=r=>typeof r=="object"&&r!==null&&"op"in r;function Me(r,e,c){return{anchor:r.anchor,quote:r.quote,...c||r.source_id!==e?{source_id:r.source_id}:{}}}function or(r,e,c={}){let l=xr(c.templateVersion),f=l!==null&&l>=5,_=l!==null&&l<5;if(!f&&r.read_basis.length!==1)throw new W("READ_BASIS_COUNT",`read_basis must have exactly 1 element, got ${r.read_basis.length}`);if(r.read_basis.length===0)throw new W("READ_BASIS_COUNT","read_basis must not be empty");let h=r.read_basis[0],$=r.read_basis.length>1,g=r.use_cases.map(i=>{if(_&&i.cite.length!==1)throw new W("CITE_COUNT",`${i.temp_ref}: cite must have exactly 1 element, got ${i.cite.length}`);if(i.cite.length<1||i.cite.length>ir)throw new W("CITE_COUNT",`${i.temp_ref}: 1..${ir} cites allowed, got ${i.cite.length}`);let k=(n,D)=>{if(!f&&n!==h.source_id)throw new W("SOURCE_MISMATCH",`${D}: cite source ${n} != read_basis source ${h.source_id} (single-source)`)};k(i.cite[0].source_id,i.temp_ref);let O=i.cite.map(n=>(k(n.source_id,i.temp_ref),Me(n,h.source_id,f&&($||n.source_id!==h.source_id)))),A=(i.updated?.criteria??[]).some(yr);if(!f&&A)throw new W("CRITERIA_OPS_UNSUPPORTED",`${i.temp_ref}: op-union updated.criteria (keep/set/remove) needs an extract@5+ binding \u2014 this session is bound to ${c.templateVersion??"an unversioned template"}`);return{temp_ref:i.temp_ref,title:i.title,...i.description!==void 0?{description:i.description}:{},...i.summary!==void 0?{summary:i.summary}:{},...i.actors!==void 0?{actors:i.actors}:{},...i.value!==void 0?{value:i.value}:{},risk:i.risk,cite:O[0],...O.length>1?{cites:O}:{},...i.criteria!=null&&i.criteria.length>0?{criteria:i.criteria.map((n,D)=>(k(n.cite.source_id,`${i.temp_ref}.criteria[${D}]`),{text:n.text,cite:Me(n.cite,h.source_id,f&&n.cite.source_id!==h.source_id)}))}:{},depends_on_hint:i.depends_on_hint,matches_existing:i.matches_existing,...i.conflicts_with!=null?{conflicts_with:i.conflicts_with}:{},...i.changed?{changed:!0}:{},...i.updated!=null?{updated:{...i.updated.title!=null?{title:i.updated.title}:{},...i.updated.description!=null?{description:i.updated.description}:{},...i.updated.summary!=null?{summary:i.updated.summary}:{},...i.updated.actors!=null?{actors:i.updated.actors}:{},...i.updated.value!=null?{value:i.updated.value}:{},...i.updated.risk!=null?{risk:i.updated.risk}:{},...i.updated.criteria!=null?{criteria:A?i.updated.criteria.map(n=>n.op==="set"?{op:"set",text:n.text,cite:Me(n.cite,h.source_id,f&&n.cite.source_id!==h.source_id)}:n.op==="keep"?{op:"keep",ref:n.ref,text:n.text}:{op:"remove",ref:n.ref,text:n.text,reason:n.reason}):i.updated.criteria.map((n,D)=>(k(n.cite.source_id,`${i.temp_ref}.updated.criteria[${D}]`),{text:n.text,cite:Me(n.cite,h.source_id,f&&n.cite.source_id!==h.source_id)}))}:{}}}:{},...i.change_note!=null?{change_note:i.change_note}:{}}});return{version:1,read_basis:e,source:{source_id:h.source_id,source_cid:h.source_cid},use_cases:g,...$?{sources:r.read_basis.map(i=>({source_id:i.source_id,source_cid:i.source_cid}))}:{},...r.extraction_of!=null&&r.extraction_of.length>0?{extraction_claims:r.extraction_of.map(i=>({source_id:i.source_id,completeness:i.completeness}))}:{}}}function ar(r){let{contextDir:e,graph:c}=r,l=r.maxDigestBytes??4096,f={},_=[];for(let[g,i]of c.heads){if(f[g]=i,typeof i!="string")continue;let k=c.mediaOf(i),O=c.getNode(i)?.content?.blob;if(typeof O=="string")if(k.format==="image")_.push({source_id:g,cid:i,format:"image",blobRef:{path:he(e,O),cid:O}});else{let A=fe(e,c,i)?.toString("utf8")??"";_.push({source_id:g,cid:i,format:k.format,text:A})}}_.sort((g,i)=>g.source_id<i.source_id?-1:1);let h=[];for(let g of c.byLabel(ne.STYLENOTE).sort((i,k)=>i.cid<k.cid?-1:1))c.superseded.has(g.cid)||h.push(`\u2022 ${String(g.content.statement)} [${String(g.content.learned_from_kind)}]`);let $="";for(let g of h){if(Buffer.byteLength($+g+`
3
+ `,"utf8")>l)break;$+=g+`
4
+ `}return{read_basis:f,sources:_,styleNoteDigest:$}}function cr(r,e){let c=ar({contextDir:r,graph:e}).styleNoteDigest;return c.length>0?c:void 0}function ur(r,e,c,l,f){let _=null,h=()=>_??=f&&Object.keys(f).length>0?Promise.resolve(f):It().catch(()=>({}));return{contextDir:r,rootSid:e,locks:rt(r,e),probe:l??Ht(r,{resolveAlias:async $=>jt($,{env:process.env,auth:await h()}),embed:async($,g)=>Bt($,g,{env:process.env,auth:await h()}),readVector:($,g)=>Ft(r,$,g),writeVector:($,g,i)=>qt(r,$,g,i)}),...c?.length?{reservedEventIds:c}:{}}}function lr(r,e){let c=[],l=[];for(let f of r.use_cases){let _=f.matches_existing;_?.cid&&e.hasNode(_.cid)?c.push({ref:_.cid,expectedTip:e.tipOf(_.cid)}):l.push({tempRef:f.temp_ref,title:String(f.title??""),probeText:String(f.title??"")})}return{verb:"extract",ucTargets:c,newBuCandidates:l,sourcePins:[{source_id:r.source.source_id,source_cid:r.source.source_cid}],readBasis:r.read_basis??null}}function kr(r,e){let c=(r.images??[]).filter(l=>l.delivery==="selected");if(c.length!==0)return c.map(l=>({ref:l.ref,...l.page!==void 0?{page:l.page}:{},...l.loc!==void 0?{loc:l.loc}:{},media_type:l.media_type,blob_ref:{path:he(e,l.blob),cid:l.blob}}))}function Sr(r){return r.length>8&&r[0]===137&&r[1]===80&&r[2]===78&&r[3]===71?"image/png":r.length>3&&r[0]===255&&r[1]===216&&r[2]===255?"image/jpeg":r.length>12&&r.toString("ascii",0,4)==="RIFF"&&r.toString("ascii",8,12)==="WEBP"?"image/webp":null}function Ne(r){return r.toISOString().replace(/[-:]/g,"").slice(0,15)}function mr(r){return r.startsWith("su-conv-")?`conv-${Tt(Buffer.from(r,"utf8")).slice(0,8)}`:r}function fr(r){return r.source_id.startsWith("su-conv-")?"the conversation":r.source_id}function $r(r,e,c){return`reading ${fr(r)}${c>1?` (source ${e} of ${c})`:""}`}function pe(r){return r.toLowerCase().trim().replace(/\s+/g," ")}function gr(r,e){let c=new Map,l=new Map,f=new Map;for(let{cid:h,content:$}of e.byLabel(ne.USECASE)){if(e.superseded.has(h))continue;(e.trust.get(h)==="archived"?f:l).set(pe(String($.title??"")),h)}let _=h=>e.trust.get(h)==="archived"?{cid:h,archived:!0,reason:e.archivedReason.get(h)}:{cid:h};for(let h of r.use_cases){if(h.matches_existing){let i=h.matches_existing.cid;if(e.superseded.has(i)){let k=e.tipOf(i);i=e.superseded.has(k)?null:k}if(i!==null){c.set(h.temp_ref,_(i));continue}}let $=l.get(pe(h.title));if($){c.set(h.temp_ref,{cid:$});continue}let g=f.get(pe(h.title));g&&c.set(h.temp_ref,_(g))}return c}var hr=/^(\S+)\.criteria\[(\d+)\]/;function Cr(r,e,c){if(e.length===0||!e.every(f=>hr.test(f.detail)))return!1;let l=new Map;for(let f of e){let _=hr.exec(f.detail),h=l.get(_[1])??new Set;h.add(Number(_[2])),l.set(_[1],h)}for(let f of r.use_cases){let _=l.get(f.temp_ref);_?.size&&(f.criteria=(f.criteria??[]).filter((h,$)=>!_.has($)),c(`${f.temp_ref}: dropped ${_.size} criteria with unverifiable cites \u2014 committed without them (criteria are hints, not oracles)`))}return!0}async function ut(r,e,c,l,f=()=>{},_,h){let $=(g,i)=>f(g,i,r.session_id);return Jt(r,e,c,l,f,{async onProposalEvent(g){let i=g,k=null,O=null;if(nr(i))try{k=or(i,r.read_basis,{templateVersion:h?.()??null}),$("adapter",{ok:!0,use_cases:k.use_cases.length})}catch(A){O=A instanceof W?A.message:String(A),$("adapter",{ok:!1,error:O})}else k=i;return k&&k.use_cases.length===0&&e.out("warning: the agent proposed ZERO use-cases for this source"),k&&_&&await _(k),{proposal:k,error:O}}})}var Rr=new Set(["agent","ci","override"]);async function ws(r,e){let c=`ext-${Ne(e.now?.()??new Date)}-lk${Math.random().toString(36).slice(2,8)}`,f=rt(e.contextDir,c,e.now?{now:e.now}:void 0).tryAcquire([{kind:"extract"}],{hold:"session",verb:"extract"});if("contended"in f){let _=f.contended.holder,h=`another extraction is running on this context${_?` (pid ${_.pid})`:""} \u2014 retry when it finishes`;return e.out(h),e.emit?.({type:"error",message:h,code:"EXTRACT_LOCKED"}),2}try{return await Dr(r,e)}finally{f.release()}}async function Dr(r,e){let c=r.mode??"interactive";if(r.trust==="hold"&&c==="interactive")return e.out("error: --trust hold only applies to headless runs \u2014 in interactive chat you review items in-session anyway; use --mode agent to hold everything for review"),e.emit?.({type:"error",message:"error: --trust hold only applies to headless runs \u2014 use --mode agent",code:"TRUST_USAGE"}),2;if(c==="interactive"){if(!e.isTTY)return e.out("extract: --mode interactive needs a TTY (use --mode agent|ci|override headless)"),2}else if(!Rr.has(c))return e.out(`extract: unknown mode "${c}" \u2014 interactive | agent | ci | override`),2;if(r.trust!==void 0){if(c==="ci")return e.out("error: --trust is not available under --mode ci (ci is fail-closed \u2014 no trust dials)"),e.emit?.({type:"error",message:"error: --trust is not available under --mode ci",code:"TRUST_UNDER_CI"}),2;if(r.trust!=="auto"&&r.trust!=="hold")return e.out(`error: --trust must be auto | hold, got '${r.trust}'`),e.emit?.({type:"error",message:`error: --trust must be auto | hold, got '${r.trust}'`,code:"TRUST_USAGE"}),2}let l=e.telemetry?.enabled?e.telemetry:void 0,f=Ne(e.now?.()??new Date),_=l?Pt(l.ids.context_instance_id??null,"extract",l.ids.session_id):ee(e.contextDir,"logs",`extract-${f}.log`);ct(dr(_),{recursive:!0});let h=`run-${f}-${Math.random().toString(36).slice(2,8)}`,$=a=>a==="error"||a==="failed_proposal"?"error":a==="repair_respawn"?"warn":"info",g=(a,u,s)=>{try{vr(_,JSON.stringify({ts:new Date().toISOString(),level:$(a),run_id:h,...l?{user_session_id:l.ids.session_id}:{},...s?{session_id:s}:{},kind:a,data:u})+`
5
+ `)}catch{}l?.wireTrace(a,u,s)};e.out(`trace: ${ot(_)}`),l&&e.out(l.banner()),e.emit?.({type:"run_start",mode:c,trace:_});let i=Ut();if(i&&e.out(i),e.preflightTurn){let a=await e.preflightTurn();if(g("preflight",a),!a.ok)return e.out(a.message??"error: turn-endpoint preflight failed"),e.emit?.({type:"error",message:a.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),2}let k=z(e.contextDir),O=cr(e.contextDir,k),A=r.sources?.length?r.sources:r.source?[r.source]:[];if(A.length>0){if(r.resume){let a="error: --source cannot be combined with --resume (the resumed session already has its scope)";return e.out(a),e.emit?.({type:"error",message:a,code:"SOURCE_WITH_RESUME"}),2}for(let a of A){let u=k.heads.get(a);if(typeof u!="string"){let s=u===null?`error: --source ${a} was ingested but is retired \u2014 re-ingest it to extract again`:`error: --source ${a} is not an ingested source (kane-cli context list shows them)`;return e.out(s),e.emit?.({type:"error",message:s,code:"SOURCE_UNKNOWN"}),2}}}let n=null,D=null;if(r.resume){try{{let d=await rr(e.contextDir,r.resume,k,{verb:"extract",deps:{onWarn:b=>e.out(`note: ${b}`)}});{let b=Object.keys(d.handle.state.read_basis??{});if(b.length>1){let N=`error: session ${r.resume} spans ${b.length} sources \u2014 multi-source resume isn't supported yet; committed work is preserved (re-run kane-cli context extract for anything remaining)`;return e.out(N),e.emit?.({type:"error",message:N,code:"MULTI_SOURCE_RESUME"}),d.handle.release(),2}D=d,g("resume_kind",{kind:d.view.pointer===null?"bare-base":d.view.pointer.at==="final"?"pause":"crash"}),n={handle:d.handle,represent:d.represent,questions:d.questions,staleBasis:d.drift.map(N=>N.subject)}}}}catch(d){let b=d instanceof Error?d.message:String(d);return e.out(`error: ${b}`),e.emit?.({type:"error",message:`error: ${b}`,...d instanceof at?{code:d.code}:{}}),d instanceof at?2:1}let a=D?null:zt(n.handle.state.verb,"extract",r.resume);if(a)return e.out(a.message),e.emit?.({type:"error",message:a.message,code:a.code}),n.handle.release(),2;let u=n.handle.state.change_basis;if(u&&(k.heads.get(u.source_id)??null)!==u.new_head){let d=`error: ${u.source_id} moved while this reconcile extraction was paused \u2014 its recorded change context no longer matches; re-run kane-cli maintain reconcile against the current file (session ${r.resume} is defunct and can be ignored)`;return e.out(d),e.emit?.({type:"error",message:d,code:"CHANGE_BASIS_MOVED"}),n.handle.release(),2}if(D&&D.view.pointer!==null&&D.drift.length>0){if(!await e.confirmStale(`changed since the pause: ${D.drift.map(b=>b.subject).join(", ")} \u2014 re-ground and continue against the current versions?`)){let b=`resume aborted: the context moved since the pause (${D.drift.map(N=>N.subject).join(", ")}) \u2014 session ${r.resume} is preserved`;return e.out(b),e.emit?.({type:"error",message:b,code:"RESUME_DRIFT"}),n.handle.release(),2}}else n.staleBasis.length>0&&e.out(`note: changed since the pause: ${n.staleBasis.join(", ")} \u2014 re-presented items may be stale`);let s=[...new Set([...n.handle.state.held_receipts??[],...D?.view.kane?.held_receipts??[]])];if(s.length>0)if(e.chat?.holdReceipt)for(let d of s)e.chat.holdReceipt(d);else e={...e,initialMessage:[s.join(`
6
+
7
+ `),e.initialMessage].filter(Boolean).join(`
8
+
9
+ `)};n.handle.state.assumed.length>0&&e.out(`note: ${n.handle.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${r.resume} lists them`)}let lt=k.extractedSourceCids,oe=!!(r.force||n?.handle.state.force),K=[],X=[],_e=A.length>0?new Set(A):null;for(let[a,u]of k.heads.entries())if(u!=null&&!(_e&&!_e.has(a))){if(!_e&&!n&&a.startsWith("su-conv-")){e.out(`skipped ${a} \u2014 conversation source; extract it explicitly with --source ${a}`),X.push({source_id:a,reason:"conversation"});continue}if(n){let s=a in n.handle.state.read_basis,d=n.handle.state.corpus_cursor.remaining.includes(a);if(!s&&!d)continue;if(d&&!oe&&lt.has(u)){e.out(`${a} already extracted \u2014 skipped (--force re-runs it)`),X.push({source_id:a,reason:"cached"});continue}}else if(!oe&&lt.has(u)){e.out(`${a} already extracted \u2014 skipped (--force re-runs it)`),X.push({source_id:a,reason:"cached"});continue}K.push({source_id:a,cid:u})}let pr=a=>{let u=Qt(e.contextDir,a);u&&e.out(`note: a reconcile plan for ${a} is pending (${u.pending} item(s)) \u2014 resume with \`kane-cli maintain reconcile --apply ${u.path}\``)};for(let a of X)a.reason==="cached"&&pr(a.source_id);if(e.emit?.({type:"corpus",sources:K,skipped:X}),K.length===0){if(n){let s=`error: resumed session's paused source (${Object.keys(n.handle.state.read_basis).join(", ")||"unknown"}) is no longer in the corpus \u2014 restore/re-ingest it and re-run --resume ${r.resume}, or discard with: kane-cli context sessions clean ${r.resume}`;return e.out(s),e.emit?.({type:"error",message:s,code:"SOURCE_MISSING"}),n.handle.release(),2}let a=X.length>0&&X.every(u=>u.reason==="conversation");return e.out(_e?`extract: nothing to do \u2014 ${A.join(", ")} ${A.length===1?"is":"are all"} already extracted at the current snapshot (--force to re-run)`:a?"extract: nothing to do \u2014 only conversation sources here (extract one explicitly with --source <id>)":"extract: nothing to do \u2014 every ingested source is already extracted"),0}let Y=!r.plan&&c!=="ci",xe=e.now?.()??new Date,ye=r.resume??`ext-${Ne(xe)}-${mr(K[0].source_id)}`,P=null,ve=!1;Y&&!n&&(P=it(e.contextDir,{sid:ye,mode:"agent",created_at:xe.toISOString(),expires_at:new Date(xe.getTime()+1440*60*1e3).toISOString(),agent_state:{schema:2,items:[],provider_state:""},pending:{questions:[],proposals:[]},assumed:[],read_basis:{[K[0].source_id]:K[0].cid},corpus_cursor:{remaining:K.slice(1).map(a=>a.source_id)},conv_source:"",verb:"extract",...oe?{force:!0}:{},...r.changeContext?{change_basis:{source_id:r.changeContext.source_id,new_head:r.changeContext.new_head}}:{},...l?{user_session_id:l.ids.session_id}:{}}));let mt=D?D.represent.map(a=>a.event_id).filter(a=>typeof a=="string"):[],y=n?.handle??P,gt=!1,ht=()=>{try{wr(ee(e.contextDir,"sessions"))}catch{}},ft=()=>{if(P){try{P.complete()}catch{P.release()}P=null,y=null,ht()}},we=new Map;if(n&&n.questions.length>0&&!r.message&&!r.withSource){e.out(`re-presenting ${n.questions.length} unanswered question(s) from the paused session`);let a=await e.ask(n.questions.map(Zt));if(Array.isArray(a))for(let u of a)we.set(u.id,u)}let be=e.by??{kind:"human",id:"owner"},J=c==="interactive"&&!r.plan&&!!e.chat,He=0,pt=0,ke=!1,Se=0,Ue=()=>{ke||(ke=!0,e.out("note: duplicate detection is running in a reduced mode this run \u2014 new items will be held for your review instead of committed"),l?.event("ASR_EMBED_DEGRADED",{}),e.emit?.({type:"degraded",reason:"embed_fallback"}))},je=null,$e=()=>y??P,Be=(a,u,s)=>{let d=$e();if(!d)return;let b=u.map(v=>({label:"usecase",content:{title:v.title,...v.summary!==void 0?{summary:v.summary}:{},...v.risk!==void 0?{risk:v.risk}:{},derived:!0,_held:{source_id:a.source_id,source_cid:a.cid,anchor:v.cite?.anchor??"L1-L1",quote:v.cite?.quote??""}},rationale:`held (${s==="degraded"?"embed degraded \u2014 lexical dedup only":"--trust hold"}): ${a.source_id} @ ${a.cid.slice(0,19)} ${v.cite?.anchor??""}`,edges:[],tempRef:v.temp_ref})),N=d.state.pending;d.save({pending:{questions:N.questions,proposals:[...N.proposals,...b]}}),Se+=b.length,je=d.state.sid,e.out(`held: ${b.length} item(s) from ${a.source_id} \u2014 ${s==="degraded"?"duplicate detection was reduced this run":"--trust hold"}; nothing committed for this source (review them at resume)`),e.emit?.({type:"held",source_id:a.source_id,count:b.length,reason:s==="degraded"?"embed_degraded":"trust_hold"})},U=[],_t=!1,I=[...K];try{let a=u=>{let s=y;if(!s)return;let d=s.state.ingest_schedule??[];if(!d.some(v=>v.status==="pending"))return;let b=z(e.contextDir),N=d.map(v=>v.status!=="pending"?v:(b.heads.get(v.source_id)??null)!==v.cid?(e.out(`note: ${v.source_id} changed after it was added \u2014 skipping its extraction this run; re-run kane-cli context extract to pick up the newer version`),{...v,status:"skipped",note:"head moved since landing"}):b.extractedSourceCids.has(v.cid)||I.some(F=>F.source_id===v.source_id&&F.cid===v.cid)?{...v,status:"done"}:I.some(F=>F.source_id===v.source_id)?(e.out(`note: an older version of ${v.source_id} is already queued this run \u2014 the newly landed version is not extracted; re-run kane-cli context extract to pick it up`),{...v,status:"skipped",note:"an older version of the source was already queued this run"}):(I.push({source_id:v.source_id,cid:v.cid}),e.out(`queued ${v.source_id} for extraction in this run (landed mid-run)`),{...v,status:"done"}));s.save({ingest_schedule:N,corpus_cursor:{remaining:I.slice(u+1).map(v=>v.source_id)}})};for(let u=0;u<I.length;a(u),u++){let s=I[u],d=z(e.contextDir),b={current:d};e.chat?.attachOnCommitted?.(t=>{b.current=t});let N=d.getNode(s.cid),v=String(N?.content.blob??""),Ce=fe(e.contextDir,d,s.cid);if(!Ce){e.out(`error: ${s.source_id}: its stored content is missing \u2014 re-ingest the file (kane-cli context ingest <file>) [BLOB_MISSING]`),e.emit?.({type:"error",source_id:s.source_id,message:`error: ${s.source_id}: blob ${v} missing from .context/blobs`,code:"BLOB_MISSING"}),U.push(s.source_id);continue}let F=d.mediaOf(s.cid),Fe=F.media_type.startsWith("image/");if(!Fe){let t=Sr(Ce);if(t){e.out(`skipping ${s.source_id}: binary ${t} ingested before image support \u2014 re-ingest it (kane-cli context ingest) to extract from it`),e.emit?.({type:"source_skipped",source_id:s.source_id,reason:"binary_pre_media"});continue}}let xt=Fe?`0001| (image source ${s.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:nt(Ce),Re=(t,o)=>{let m=new Map;m.set(s.source_id,{media:F,numberedText:xt});for(let p of o.sources??[]){if(m.has(p.source_id))continue;let E=fe(e.contextDir,t,p.source_cid);if(!E)continue;let S=t.mediaOf(p.source_cid),R=S.media_type.startsWith("image/")?`0001| (image source ${p.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:nt(E);m.set(p.source_id,{media:S,numberedText:R})}return m},yt=Ne(e.now?.()??new Date),ae=`${yt}-${s.source_id}`,ce=!!(n&&s.source_id in n.handle.state.read_basis),De=y?ye:`ext-${yt}-${mr(s.source_id)}`,qe=I.slice(u+1).map(t=>t.source_id);y&&Y&&!ce&&y.save({read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:qe}});let Q="";if(J){let t=Lt({contextDir:e.contextDir,graph:z(e.contextDir),sessionStamp:De,by:be});t.errors===null||t.errors[0]?.code==="CONV_SOURCE_EXISTS"?(Q=t.sourceId,e.chat.attachConversationSource?.(Q),b.current=z(e.contextDir)):e.out(`warning: notes you add in chat can't be saved to the context this session (${t.errors[0]?.detail})`)}let vt={type:"run_config",version:1,session_id:De,mode:c,source:{source_id:s.source_id,source_cid:s.cid,kind:Ot.has(F.format)?F.format:br(s.source_id)||"md",numbered_text:xt,...(()=>{let t=kr(F,e.contextDir);return t?{images:t}:{}})()},existing_use_cases:d.byLabel(ne.USECASE).filter(({cid:t})=>d.trust.get(t)!=="archived"&&!d.superseded.has(t)).map(({cid:t,content:o})=>({id:t,title:String(o.title??""),summary:String(o.summary??"")})),read_basis:b.current.latestHash,max_free_text_rounds:Kt,graph_reads:!0,verb:"extract",...O!==void 0?{style_note_digest:O}:{},...r.changeContext&&r.changeContext.source_id===s.source_id?{change_context:r.changeContext}:{},topology:Yt(),...J?{chat:!0}:{},...Fe?{image_sources:[{source_id:s.source_id,source_cid:s.cid,media_type:F.media_type,blob_ref:{path:he(e.contextDir,v),cid:v}}]}:{},...n&&!D&&s.source_id in n.handle.state.read_basis?{resume:{agent_state:n.handle.state.agent_state}}:{},...Y&&y?{checkpoints:!0}:{}},C=D&&ce?{...D.spawnConfig,mode:c}:vt;if(Y&&y&&!gt){gt=!0;let{resume:t,...o}=vt;Nt(e.contextDir,ye,{schema:Mt,kind:"base",sid:ye,verb:"extract",mode:c,created_at:xe.toISOString(),run_config:o,conv_source:Q||y.state.conv_source||"",store_watermark:At(e.contextDir)})}let wt=D&&ce?0:y?.state.checkpoint?.seq??0,de={current:null};if(C.resume&&"schema"in C.resume){let t=C.resume.binding?.template_version;typeof t=="string"&&(de.current=t)}let Le=Y&&y?tr({contextDir:e.contextDir,handle:y,seqBase:()=>wt,peekHeldReceipts:()=>e.chat?.peekHeldReceipts?.()??[],readBasis:()=>({[s.source_id]:s.cid}),corpusCursor:()=>({remaining:qe}),onSoftCap:t=>e.out(t),onStat:t=>g("ckpt_stat",t,C.session_id),...e.now?{now:e.now}:{}}):void 0,te=Le?{...Le,persist:t=>{let o=t.binding?.template_version;return typeof o=="string"&&o&&(de.current=o),Le.persist(t)}}:void 0;J||e.out(n&&s.source_id in n.handle.state.read_basis?`resuming: ${s.source_id} (session ${r.resume})`:`extracting: ${s.source_id} @ ${s.cid.slice(0,19)}`),e.emit?.({type:"source_start",source_id:s.source_id,cid:s.cid,index:u+1,total:I.length,resumed:!!(n&&s.source_id in n.handle.state.read_basis)}),e.chat?.ledger?.({kind:"banner",text:$r(s,u+1,I.length)}),e.chat?.setWorking?.(`Reading ${fr(s)}\u2026`);let Ge=new Map;g("spawn",{source_id:s.source_id,source_cid:s.cid,resume:!!n,chat:J},C.session_id);let bt=!1,kt=!1,We=!1,St=async t=>{let o=z(e.contextDir),m=ge(t,Re(o,t),o);if(g("kane_validate",{errors:m.map(x=>x.code)},C.session_id),m.length>0){if(e.nested){e.chat?.ledger?.({kind:"commit",ok:!1,line:"proposal failed validation \u2014 nothing landed",warnings:m.map(x=>`${x.code}: ${x.detail}`)}),kt=!0;return}e.chat.submit("[auto-repair] the proposal failed validation: "+m.map(x=>`${x.code}: ${x.detail}`).join("; ")+" \u2014 please re-finalize with these fixed.");return}let p=z(e.contextDir),E=gr(t,p),S=ee(e.contextDir,"proposals",ae);ct(S,{recursive:!0}),dt(ee(S,"proposal.json"),JSON.stringify(t,null,2)+`
10
+ `);let R=new Map(t.use_cases.map(x=>[x.temp_ref,{resolution:"skipped"}])),ue=ur(e.contextDir,C.session_id,mt,e.probe,e.auth),B=await Oe(ue,lr(t,p),x=>{if(x.degradedProbe&&$e()!==null&&t.use_cases.some(le=>le.matches_existing==null))return{result:{degradedHold:!0},record:null};let L=st({contextDir:e.contextDir,graph:x.graph,proposal:t,proposalId:ae,verdicts:R,by:{kind:"ai",id:"extract-agent"},autoName:!0,allowStaleBasis:!0,eventIds:x.eventIds("extract",1),...Y?{sid:x.sid}:{},probeHits:x.probeHits});return L.errors!==null?{errors:L.errors}:{result:L,record:L.record}}),tt=B.ok&&"result"in B?B.result:null;if(tt!==null&&"degradedHold"in tt){Ue(),Be(s,t.use_cases,"degraded"),We=!0,e.chat.ledger?.({kind:"commit",ok:!1,line:`held ${t.use_cases.length} item(s) for review \u2014 semantic dedup ran degraded (embeddings unavailable); nothing saved this turn`});return}let Z=tt??{record:null,errors:B.ok?null:B.kind==="validation"?B.errors:[{code:B.kind==="contended"?B.err.code:"UNSETTLED",detail:B.kind==="contended"?`held by ${B.err.holder?.owner_sid??"another session"}`:"concurrent activity kept moving the store"}]};if(Z.errors){e.chat.ledger?.({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:Z.errors.map(x=>`${x.code}: ${x.detail}`)});return}bt=!0,Z.record?.event_ids?.length&&y?.markApplied(Z.record.event_ids);{let x=Z.record.review.filter(L=>L.kind==="pending_update");x.length>0&&(e.out(`${x.length} update(s) held for review`),e.emit?.({type:"update_held",count:x.length,targets:x.map(L=>L.id)}),e.chat?.ledger?.({kind:"commit",ok:!0,line:`${x.length} update(s) held for review`}))}let se=Z.record.nodes.length;He+=se;let ie=t.use_cases.length-se;{let x=z(e.contextDir),L=new Map;for(let{cid:M,content:G}of x.byLabel(ne.USECASE))x.superseded.has(M)||L.set(pe(String(G.title??"")),M);let le=[];for(let M of t.use_cases){let G=null;if(M.matches_existing?.cid&&x.hasNode(M.matches_existing.cid)){let me=x.tipOf(M.matches_existing.cid);G=x.superseded.has(me)?null:me}G=G??L.get(pe(M.title))??null,G&&le.push({ref:M.temp_ref,cid:G,...x.displayNameOf(G)?{id:x.displayNameOf(G)}:{}})}le.length>0&&e.chat.registerAliases?.(le),b.current=x;let Dt=M=>{for(let[G,me]of x.names)if(me===M&&!x.superseded.has(me))return G},Et=Gt({verb:"extract",commitN:1,phase:"proposal",committed:Z.record.nodes.map(M=>({cid:M.cid,...Dt(M.cid)?{logical_id:Dt(M.cid)}:{}})),reused:ie},x);e.emit?.(Et.event),e.chat.holdReceipt?.(Et.text)}g("commit",{derived:se,evidence_matched:ie,chat:!0},C.session_id),e.chat.ledger?.({kind:"commit",ok:!0,line:se===0&&ie>0?`all ${ie} matched existing \u2014 nothing new to save`:`saved ${se} use-case${se===1?"":"s"} as drafts`+(ie>0?` \xB7 ${ie} matched existing`:"")})},Ve=!!(n&&s.source_id in n.handle.state.read_basis),j=Ve&&we.size>0?{...e,ask:async t=>t.every(o=>we.has(o.id))?(n.handle.markApplied(t.map(o=>`resolveq:${r.resume}:${o.id}`)),e.out(`answered ${t.length} re-asked question(s) from the held resume answers`),t.map(o=>we.get(o.id))):e.ask(t)}:e;Ve&&r.message&&(j={...j,initialMessage:r.message}),j={...j,onEmbedDegraded:Ue};let re,ze;if(y){let t=y,o=j.ask,m=Xt({contextDir:e.contextDir,cwd:dr(e.contextDir),handle:t,note:p=>e.chat?e.chat.note(p):e.out(p),schedule:r.trust!=="hold",...r.trust==="hold"?{scheduleRefused:"this run holds items for review, so its extraction is not scheduled \u2014 kane-cli context extract runs it after the review"}:{},graphSlot:b,...e.now?{now:e.now}:{}});if(j={...j,ask:async p=>{let E=await o(p);if(Array.isArray(E)){let S=E.filter(R=>{if(R.free_text==null||R.free_text.trim()==="")return!1;let ue=p.find(B=>B.id===R.id);return R.selected_index!=null&&ue?.options[R.selected_index]?.input===!0}).map(R=>R.free_text.trim());if(S.length>0){let R=t.state.ingest_registry;for(let ue of S)R=Ie(R,ue,e.now?.()??new Date);t.save({ingest_registry:R})}}return E},ingest:m},Ve&&r.withSource){let p=(t.state.pending?.proposals??[]).filter(R=>R.content?._held!=null).length;if(r.trust==="hold"||p>0){let R=p>0?`error: --with-source can't add a source to a session holding ${p} item(s) for review \u2014 resume without --with-source to finish the review first, then land it with kane-cli context ingest [HOLD_MULTI_SOURCE]`:"error: --with-source is not available with --trust hold \u2014 held work from a multi-source run can't be resumed yet; drop --trust hold, or land the source separately with kane-cli context ingest [HOLD_MULTI_SOURCE]";return e.out(R),e.emit?.({type:"error",code:"HOLD_MULTI_SOURCE",message:R}),2}let E=r.withSource;t.save({ingest_registry:Ie(t.state.ingest_registry,E,e.now?.()??new Date)});let S=await m({id:`withsource-${t.state.sid}`,ref:E,purpose:null});if(!S.ok)return e.out(`error: --with-source: ${S.error.message}`),e.emit?.({type:"error",code:S.error.code,message:`--with-source: ${S.error.message}`}),2;j={...j,pendingDeferral:{ingested:{source_id:S.result.source_id,cid:S.result.cid}}}}ze=()=>{if(!e.chat?.attachIngest)return;let p=e.chat;re=p.attachIngest(async E=>{try{t.save({ingest_registry:Ie(t.state.ingest_registry,E,e.now?.()??new Date)});let S=await m({id:`attach-${t.state.sid}-${(t.state.ingest_registry??[]).length}`,ref:E,purpose:null});return S.ok?(p.deferBatch({source_id:S.result.source_id,cid:S.result.cid}),{ok:!0}):{ok:!1,error:S.error.message}}catch(S){return{ok:!1,error:S instanceof Error?S.message:String(S)}}})},ze()}let w;try{w=await ut(C,{...j,graphSlot:b,...te?{checkpoint:te}:{}},Ge,d,g,J?St:void 0,()=>de.current)}catch(t){if(t instanceof Ae)return re?.(),e.chat?.setWorking?.(null),e.out(`error: ${t.message}`),e.emit?.({type:"error",code:"PAIR_MISMATCH",message:t.message}),2;throw t}if(re?.(),e.chat?.setWorking?.(null),w.errorCode==="binding_mismatch"&&D&&ce){let t=await e.ask([{id:"binding-mismatch",text:"this session's saved conversation is no longer accepted by the service \u2014 start the conversation fresh (committed work is kept), or stop and keep the session?",risk:"high",rationale:"the service refused the saved conversation on the first turn after resume",options:[{label:"start fresh",detail:"continue with a fresh conversation \u2014 earlier answers may be re-asked"},{label:"stop",detail:"stop here; the session stays resumable"}],recommended_index:1,allow_free_text:!1}]);if((Array.isArray(t)?t.find(p=>p.id==="binding-mismatch"):void 0)?.selected_index!==0){let p=`resume abandoned: binding mismatch on session ${De} \u2014 the session is preserved`;return e.out(p),e.emit?.({type:"error",message:p,code:"BINDING_MISMATCH"}),2}g("binding_migrate",{sid:De},C.session_id),ze?.();let m=C.resume&&"schema"in C.resume?{...C.resume,binding:{}}:void 0;try{w=await ut({...C,...m?{resume:m}:{}},{...j,graphSlot:b,...te?{checkpoint:te}:{}},Ge,d,g,J?St:void 0,()=>de.current)}catch(p){if(p instanceof Ae)return re?.(),e.chat?.setWorking?.(null),e.out(`error: ${p.message}`),e.emit?.({type:"error",code:"PAIR_MISMATCH",message:p.message}),2;throw re?.(),p}re?.(),e.chat?.setWorking?.(null)}if(w.error){let t=w.error.startsWith("proposal failed validation after repair:");t&&g("agent_error_detail",{error:w.error},C.session_id);let o=t?`error: the agent could not produce a valid proposal for ${s.source_id} \u2014 re-run kane-cli context extract to retry`:`error: agent failed for ${s.source_id}: ${w.error}`;e.out(o),e.emit?.({type:"error",source_id:s.source_id,message:o}),U.push(s.source_id);continue}if(w.highRisk)return e.out(`error: ${w.highRisk.length} high-risk decision${w.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),e.emit?.({type:"error",source_id:s.source_id,message:`error: high-risk question(s) in ci mode (fail-closed): ${w.highRisk.map(t=>t.id).join(", ")}`,code:"HIGH_RISK_CI"}),1;if(w.paused){let t=I.slice(u+1).map(E=>E.source_id),o=n?.handle??P,m=o??it(e.contextDir,{sid:C.session_id,mode:"agent",created_at:(e.now?.()??new Date).toISOString(),expires_at:new Date((e.now?.()??new Date).getTime()+1440*60*1e3).toISOString(),agent_state:w.paused.agent_state,pending:{questions:[],proposals:[]},assumed:[],read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:t},conv_source:Q,verb:"extract",...oe?{force:!0}:{},...r.changeContext?{change_basis:{source_id:r.changeContext.source_id,new_head:r.changeContext.new_head}}:{},...l?{user_session_id:l.ids.session_id}:{}});ve=!0;try{Q&&m.state.conv_source!==Q&&m.save({conv_source:Q});let E=e.chat?.drainHeldReceipts?.()??[];(E.length>0||(m.state.held_receipts?.length??0)>0)&&m.save({held_receipts:E}),o&&m.save({read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:t},...oe&&!m.state.force?{force:!0}:{},...l&&m.state.user_session_id!==l.ids.session_id?{user_session_id:l.ids.session_id}:{}}),er(m,w.paused)}catch(E){let S=m.state.checkpoint,R=`error: couldn't persist the pause for session ${m.state.sid}`+(S?` \u2014 last durable checkpoint: seq ${S.seq} @ ${S.ts}`:" \u2014 no durable checkpoint exists")+` (${E instanceof Error?E.message:String(E)})`;return e.out(R),e.emit?.({type:"error",message:R,code:"PAUSE_PERSIST_FAILED",sid:m.state.sid}),1}g("session_paused",{sid:m.state.sid},C.session_id);let p=`kane-cli context extract --resume ${m.state.sid} --mode ${c}`;return e.out(`paused: session ${m.state.sid} saved \u2014 resume with: ${p}`),e.emit?.({type:"session_paused",sid:m.state.sid,source_id:s.source_id,mode:c,resume:p,expires_at:m.state.expires_at,pending_questions:w.paused.pending.questions}),e.chat?.ledger?.({kind:"pause",sid:m.state.sid,expires_at:m.state.expires_at,resume:p,messageForm:`${p} --message "<your words>"`}),3}if(w.crashed){let t=y?.state.checkpoint;if(y&&t){let o=`kane-cli context extract --resume ${y.state.sid} --mode ${c}`;try{y.save({read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:qe}})}catch{}return g("agent_crashed_resumable",{sid:y.state.sid,seq:t.seq},C.session_id),e.out(`agent crashed \u2014 session ${y.state.sid} is resumable at checkpoint seq ${t.seq} (at most the in-flight turn lost); resume with: ${o}`),e.emit?.({type:"session_paused",sid:y.state.sid,source_id:s.source_id,mode:c,resume:o,expires_at:y.state.expires_at,crashed:!0}),e.chat?.ledger?.({kind:"pause",sid:y.state.sid,expires_at:y.state.expires_at,resume:o,messageForm:`${o} --message "<your words>"`}),ve=!0,y.release(),3}e.out(`error: agent crashed for ${s.source_id} with no durable checkpoint`),e.emit?.({type:"error",source_id:s.source_id,message:`error: agent crashed for ${s.source_id} with no durable checkpoint`,code:"AGENT_CRASHED"}),U.push(s.source_id);continue}if(J){if(pt+=w.assumedDefaults??0,w.error||kt)return 1;if(!bt&&!We){let t=I.length-u-1;e.out(`done \u2014 nothing committed for ${s.source_id} (no finalize before the session ended)`+(t>0?`; stopping here \u2014 ${t} remaining source(s) not extracted (re-run kane-cli context extract to continue)`:""));{let o=(y?.state.ingest_schedule??[]).filter(m=>m.status==="pending");o.length>0&&e.out(`note: ${o.length} source(s) landed this session (${o.map(m=>m.source_id).join(", ")}) were not extracted \u2014 the session ended first; kane-cli context extract runs them`)}return n&&s.source_id in n.handle.state.read_basis&&(n.handle.complete(),n=null,y=null),ft(),0}n&&s.source_id in n.handle.state.read_basis&&!We&&(a(u),n.handle.complete(),n=null,y=null);continue}if(!w.proposal){e.out(`error: agent ended without a proposal for ${s.source_id}`),e.emit?.({type:"error",source_id:s.source_id,message:`error: agent ended without a proposal for ${s.source_id}`}),U.push(s.source_id);continue}let q=ge(w.proposal,Re(d,w.proposal),d);if(g("kane_validate",{errors:q.map(t=>t.code)},C.session_id),q.length>0&&Cr(w.proposal,q,t=>e.out(t))&&(g("criteria_dropped",{source_id:s.source_id},C.session_id),q=ge(w.proposal,Re(d,w.proposal),d)),q.length>0){e.out("the agent's proposal didn't validate \u2014 retrying once"),e.emit?.({type:"validate_failed",source_id:s.source_id,codes:q.map(t=>t.code),repairing:!0}),g("repair_respawn",{source_id:s.source_id},C.session_id),D&&ce||(wt=y?.state.checkpoint?.seq??0);try{w=await ut(C,{...j,graphSlot:b,...te?{checkpoint:te}:{}},Ge,d,g,void 0,()=>de.current)}catch(t){if(t instanceof Ae)return e.out(`error: ${t.message}`),e.emit?.({type:"error",code:"PAIR_MISMATCH",message:t.message}),2;throw t}if(w.error||!w.proposal){e.out(`error: repair run failed for ${s.source_id}`),e.emit?.({type:"error",source_id:s.source_id,message:`error: repair run failed for ${s.source_id}`}),U.push(s.source_id);continue}if(q=ge(w.proposal,Re(d,w.proposal),d),q.length>0){e.out("details (agent-facing):");for(let t of q)e.out(` ${t.detail}`);e.emit?.({type:"validate_failed",source_id:s.source_id,codes:q.map(t=>t.code),repairing:!1}),e.emit?.({type:"error",source_id:s.source_id,message:`error: proposal failed validation after repair (${q.map(t=>t.code).join(", ")})`}),U.push(s.source_id);continue}}let T=w.proposal,Ee=gr(T,d),Ke=ee(e.contextDir,"proposals",ae);if(ct(Ke,{recursive:!0}),dt(ee(Ke,"proposal.json"),JSON.stringify(T,null,2)+`
11
+ `),r.plan){e.out(`plan: ${T.use_cases.length} use-case(s) proposed from ${s.source_id} (nothing committed)`);for(let t of T.use_cases){let o=Ee.get(t.temp_ref),m=o?o.archived?` \u2248 matches ARCHIVED ${o.cid.slice(0,19)}${o.reason?` \u2014 previously rejected: "${o.reason}"`:" \u2014 previously rejected"}`:` \u2248 matches ${o.cid.slice(0,19)}`:"";e.out(` [${t.risk}] ${t.title} \u2014 cite ${t.cite.anchor}${m}`)}e.emit?.({type:"plan",source_id:s.source_id,use_cases:T.use_cases.map(t=>{let o=Ee.get(t.temp_ref);return{risk:t.risk,title:t.title,anchor:t.cite.anchor,...o?{match:o.cid,match_archived:!!o.archived}:{}}})}),w.assumedDefaults&&e.out(`assumed: ${w.assumedDefaults} default(s) auto-taken (assumed)`);continue}for(let t of T.use_cases){if(!t.conflicts_with?.length)continue;let o=t.conflicts_with.filter(p=>d.resolve(p)!==null),m=t.conflicts_with.filter(p=>d.resolve(p)===null);m.length>0&&(e.out(`note: ${t.temp_ref}: dropped unresolvable conflict hint(s): ${m.join(", ")}`),t.conflicts_with=o.length>0?o:void 0)}g("review_start",{use_cases:T.use_cases.length,flags:Ee.size},C.session_id);let Pe=await e.review(T.use_cases,Ee);if(g("review_verdicts",[...Pe.entries()].map(([t,o])=>({ref:t,resolution:o.resolution})),C.session_id),dt(ee(Ke,"review.json"),JSON.stringify(T.use_cases.map(t=>{let o=Pe.get(t.temp_ref)??{resolution:"skipped"};return{id:t.temp_ref,kind:"review-item",resolution:o.resolution,edit:o.edit??null,reason:o.reason??null,...o.supersedeTarget?{supersede_target:o.supersedeTarget}:{},by:be}}),null,2)+`
12
+ `),(ke||r.trust==="hold")&&$e()&&T.use_cases.some(t=>t.matches_existing==null)){Be(s,T.use_cases,ke?"degraded":"trust_hold");continue}let $t=ur(e.contextDir,C.session_id,mt,e.probe,e.auth),Ct=t=>{if(t.degradedProbe&&$e()!==null&&T.use_cases.some(m=>m.matches_existing==null))return{result:{degradedHold:!0},record:null};let o=st({contextDir:e.contextDir,graph:t.graph,proposal:T,proposalId:ae,verdicts:Pe,by:be,autoName:!0,allowStaleBasis:!0,eventIds:t.eventIds("extract",1),...Y?{sid:t.sid}:{},probeHits:t.probeHits});return o.errors!==null?{errors:o.errors}:{result:o,record:o.record}},Rt=lr(T,d),H=await Oe($t,Rt,Ct);if(!H.ok&&H.kind==="drifted"){if(!await e.confirmStale(`the context changed while you reviewed (${H.asks.map(o=>o.detail).join("; ")}) \u2014 commit against the new head anyway?`)){e.out("aborted: proposal not committed"),e.emit?.({type:"error",source_id:s.source_id,message:"aborted: proposal not committed",code:"STALE_BASIS"}),U.push(s.source_id);continue}H=await Oe($t,{...Rt,sourcePins:[]},Ct)}let Je=H.ok&&"result"in H?H.result:null;if(Je!==null&&"degradedHold"in Je){Ue(),Be(s,T.use_cases,"degraded");continue}let Te=Je??(H.ok?{record:null,errors:null}:{record:null,errors:H.kind==="validation"?H.errors:H.kind==="contended"?[{code:H.err.code,detail:`a use-case this proposal touches is held by ${H.err.holder?.owner_sid??"another session"} \u2014 try again when it frees`}]:[{code:"UNSETTLED",detail:"concurrent activity kept moving the store \u2014 retry when quieter"}]});if(Te.errors){for(let t of Te.errors)e.out(` ${t.detail}`);e.emit?.({type:"error",source_id:s.source_id,message:`error: commit failed: ${Te.errors.map(t=>`${t.code}: ${t.detail}`).join("; ")}`}),U.push(s.source_id);continue}let _r=new Date().toISOString();for(let t of T.use_cases){let o=Pe.get(t.temp_ref)??{resolution:"skipped"};for(let m of Vt({ts:_r,command:"context extract",id:t.temp_ref,by:be},o.resolution))Wt(e.contextDir,m)}let V=Te.record;V.event_ids?.length&&y?.markApplied(V.event_ids);let Xe=new Map(V.review.map(t=>[t.id,t.resolution])),Ye=[...Xe.values()].filter(t=>t==="approved"||t==="edited").length,Qe=[...Xe.values()].filter(t=>t==="rejected").length,Ze=V.nodes.filter(t=>!Xe.has(t.cid)).length,et=V.supersessions.filter(t=>t.kind==="node"&&t.new!==t.old).length;g("commit",{trusted:Ye,derived:Ze,archived:Qe},C.session_id),e.out(`committed: ${Ye} trusted, ${Ze} derived (awaiting review), ${Qe} archived`+(et>0?`, ${et} superseded`:""));{let t=V.review.filter(o=>o.kind==="pending_update");t.length>0&&(e.out(`${t.length} update(s) held for review`),e.emit?.({type:"update_held",count:t.length,targets:t.map(o=>o.id)}))}w.assumedDefaults&&e.out(`assumed: ${w.assumedDefaults} default(s) auto-taken (assumed)`),e.emit?.({type:"commit",source_id:s.source_id,proposal_id:ae,trusted:Ye,derived:Ze,archived:Qe,superseded:et,assumed:w.assumedDefaults??0,evidence_matched:Math.max(0,T.use_cases.length-V.nodes.length),minted:V.nodes.map(t=>{let o=V.names?.find(m=>m.cid===t.cid)?.slug;return{cid:t.cid,...o?{logical_id:o}:{}}})}),n&&s.source_id in n.handle.state.read_basis&&(a(u),n.handle.complete(),e.out(`session ${r.resume} complete`),e.emit?.({type:"session_complete",sid:r.resume,source_id:s.source_id}),l?.event("ASR_SESSION_COMPLETE",{}),n=null,y=null)}if(y){let u=y.state.ingest_schedule??[];u.some(s=>s.status==="pending")&&y.save({ingest_schedule:u.map(s=>s.status==="pending"?{...s,status:"skipped",note:"run ended before its turn \u2014 kane-cli context extract runs it"}:s)})}_t=!0}finally{if(n?.handle.release(),P&&!ve&&!_t){let a=P.state.checkpoint;if(a){let u=`kane-cli context extract --resume ${P.state.sid} --mode ${c}`;e.out(`session ${P.state.sid} kept its last checkpoint (seq ${a.seq}, ${a.ts}) \u2014 resume with: ${u}`),P.release()}else{try{P.complete()}catch{P.release()}ht()}P=null}}if(J){let a=e.chat?.state.ledger.filter(d=>d.kind==="answer"&&d.receipt.form==="assumed").length??0,u=pt+a,s=e.chat?.state.credits?.total;e.chat?.ledger?.({kind:"summary",lines:[`saved ${He} use-case${He===1?"":"s"} across ${I.length} source${I.length===1?"":"s"}`,...u>0?[`${u} assumed default(s)`]:[],...s!==void 0?[`credits used: ${s.toFixed(1)}`]:[],`trace: ${ot(_)}`]})}if(r.plan||sr(e.contextDir),Se>0&&(P||je)){ve=!0;let a=P?.state.sid??je,u=`kane-cli context extract --resume ${a} --mode ${c}`;return e.out(`paused: ${Se} held item(s) await review \u2014 resume with: ${u}`),e.emit?.({type:"session_paused",sid:a,resume:u,held:Se}),P?.release(),3}return U.length>0&&e.out(`${U.length} of ${I.length} source(s) failed \u2014 re-run kane-cli context extract to retry (${U.join(", ")})`),ft(),U.length>0?1:0}export{ur as a,kr as b,mr as c,fr as d,$r as e,gr as f,ws as g};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as n}from"./chunk-RZ4F3BHX.js";import{a as c}from"./chunk-KHJXOFDM.js";import{v as s,w as a}from"./chunk-MMPFU2YC.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
2
+ import{a as n}from"./chunk-RZ4F3BHX.js";import{a as c}from"./chunk-JRMDGLLT.js";import{v as s,w as a}from"./chunk-C4G7RVJ6.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as _e}from"./chunk-AM5S4KG4.js";import{a as le,b as pe,d as me,e as he}from"./chunk-BB2W35TW.js";import{a as ge}from"./chunk-DNNZ353O.js";import{c as de,e as ae,l as fe,w as ue}from"./chunk-3STZLM5J.js";import{a as oe,b as Y}from"./chunk-L4JIMNKW.js";import{f as re,i as ce}from"./chunk-M7WQM4UA.js";import{d as g,e as p,f as ne,g as se,h as ie}from"./chunk-5YPBPZUR.js";var x=i=>({record:null,errors:i,minted:{},logicalIds:{},superseded:[],warnings:[],finalizedTests:{}});function D(i){return i.toLowerCase().trim().replace(/\s+/g," ")}function $e(i,I){let t=i.resolve(I);if(!t||i.nodeLabel.get(t.cid)!==g.USECASE||t.superseded)return[];let m=new Set;for(let{cid:f}of i.byLabel(g.SCENARIO))if(!i.superseded.has(f)&&i.edgesFrom(f).some(k=>k.type===p.BELONGS_TO&&i.tipOf(k.dst)===t.cid)){m.add(f);for(let k of i.edgesInto(f))k.type!==p.AUTOMATES||i.superseded.has(k.src)||m.add(k.src)}return[...m]}function De(i){let{contextDir:I,graph:t,sections:m,by:f}=i,k=i.engine??"design@1",K=re(I);if(t.latestHash!==K)return x([{code:"STALE_BASIS",detail:`graph opened at ${String(t.latestHash)} but chain head is ${String(K)} \u2014 re-open and retry`}]);let L=t.resolve(i.ucRef);if(!L||t.nodeLabel.get(L.cid)!==g.USECASE||L.superseded)return x([{code:"UNKNOWN_UC",detail:`${i.ucRef} is not a live use-case`}]);let E=L.cid,_=[],J=/^design@(\d+)$/.exec(i.templateVersion??""),be=J!==null&&Number.parseInt(J[1],10)>=3,W=new Map,Ee=(e,s)=>{let n=W.get(e.source_cid);if(n===void 0){let o=ge(i.contextDir,t,e.source_cid);n=o?_e(o.toString("utf8")):null,W.set(e.source_cid,n)}if(n===null)return _.push({code:"CITE_UNVERIFIED",detail:`${s}: source ${e.source_id} (${e.source_cid.slice(0,19)}) has no citable text to verify against`}),!1;let c=de(t.mediaOf(e.source_cid),e,n);if(c.length>0){for(let o of c)_.push({code:"CITE_UNVERIFIED",detail:`${s}: ${o.code}: ${o.detail}`});return!1}return!0},T=[],F=[],C=[],j=[],q=[],S={},N={},G={},R=[],P=[],Q=new Set,X=[],B=new Set,A=new Set,M=[];{let e=i.forceScope??(i.force?$e(t,i.ucRef):[]),s=new Set;i.sections.scenarios?.length&&s.add(g.SCENARIO),i.sections.tests?.length&&s.add(g.TEST);for(let n of e)t.superseded.has(n)||(s.has(t.nodeLabel.get(n)??"")?A.add(n):M.push(n))}let w=new Set,V=e=>!t.superseded.has(e)&&(!A.has(e)||w.has(e)),v=(e,s,n)=>{if(S[e])return S[e];let c=t.resolve(e),o=c?V(c.cid)?c.cid:t.tipOf(c.cid):null;return!c||!o||!V(o)?(_.push({code:"UNKNOWN_REF",detail:`${s}: '${e}' is neither in this payload nor a live committed node`}),null):n&&t.nodeLabel.get(o)!==n?(_.push({code:"ILLEGAL_EDGE",detail:`${s}: '${e}' is a ${t.nodeLabel.get(o)}, expected ${n}`}),null):o},Se=(e,s,n,c)=>{if(t.nameOf.has(s)){N[c]=t.nameOf.get(s);return}let o=ue(e,h=>Q.has(h),t.names.keys());o!==null&&(Q.add(o),j.push({cid:s,slug:o,by:f}),N[c]=o)},U=(e,s,n,c)=>{for(let h of ne(e,n))_.push({code:h.code,detail:`${s}: ${h.detail}`});let o=oe(e,n);return t.hasNode(o)&&!t.superseded.has(o)?(A.has(o)&&w.add(o),S[s]=o,o):(T.push({cid:o,label:e,content:n}),S[s]=o,Se(e,o,c,s),o)},$=(e,s,n,c,o)=>{let h=Y(e,s,n,c);if(t.edgesFrom(s).some(r=>r.ecid===h&&!t.superseded.has(r.ecid))){e===p.AUTOMATES&&B.add(n);return}let O=t.nodeLabel.get(s)??T.find(r=>r.cid===s)?.label??"(unknown)",u=t.nodeLabel.get(n)??T.find(r=>r.cid===n)?.label??"(unknown)";for(let r of ie(e,O,u,c))_.push({code:r.code,detail:`${o}: ${r.detail}`});let l=ae(t,e,s,n,X);if(l){_.push({code:l.code,detail:`${o}: ${l.detail}`});return}if(e===p.AUTOMATES){if(B.has(n)){_.push({code:"CARDINALITY_VIOLATION",detail:`${o}: two automates onto ${n} in one record (strict 1:1)`});return}if(B.add(n),!A.has(n)||w.has(n)){let r=b=>A.has(b)&&!w.has(b);if(t.edgesFrom(s).some(b=>b.type===p.AUTOMATES&&b.dst!==n&&!t.superseded.has(b.dst)&&!r(b.dst))&&t.hasNode(s)){_.push({code:"CARDINALITY_VIOLATION",detail:`${o}: automates from ${s} already has a live edge \u2014 supersede it first`});return}if(t.edgesInto(n).some(b=>b.type===p.AUTOMATES&&b.src!==s&&!t.superseded.has(b.src)&&!r(b.src))){_.push({code:"CARDINALITY_VIOLATION",detail:`${o}: automates onto ${n} already has a live edge \u2014 strict 1:1, supersede it first`});return}}}F.push({ecid:Y(e,s,n,c),type:e,src:s,dst:n,props:c}),X.push({src:s,dst:n,type:e})},z=new Set;for(let e of m.gaps??[]){let s=e.temp_ref??e.ref??"gap",n=e.question;if(!n||typeof n!="object"||!n.header||!Array.isArray(n.options)||n.options.length===0||!Number.isInteger(n.recommended_index)){_.push({code:"GAP_QUESTION_INCOMPLETE",detail:`${s}: design gaps carry a full ranked question object (header/options/recommended_index)`});continue}e.kind==="budget-evicted"&&e.ref&&z.add(e.ref);let c={kind:e.kind,question:n,derived:!0,uc:E,...e.risk?{risk:e.risk}:{},...e.risk_rationale?{risk_rationale:e.risk_rationale}:{},...e.text?{text:e.text}:{},...e.ref?{ref:e.ref}:{}};U(g.GAP,s,c,String(n.header))}let Z=new Map;for(let{cid:e,content:s}of t.byLabel(g.SCENARIO))V(e)&&t.edgesFrom(e).some(n=>n.type===p.BELONGS_TO&&t.tipOf(n.dst)===E)&&Z.set(D(String(s.title??"")),e);for(let e of m.scenarios??[]){let s=Z.get(D(e.title));if(s){_.push({code:"DUPLICATE_SCENARIO",detail:`${e.temp_ref}: '${e.title}' duplicates live scenario ${t.nameOf.get(s)??s} \u2014 exercise/link it instead (reuse before minting)`});continue}let n={title:e.title,intent:e.intent,case_type:e.case_type,derived:!0,...e.technique_notes?{technique_notes:e.technique_notes}:{},...e.description?{description:e.description}:{},...e.parameters?{parameters:e.parameters}:{},...e.tags?{tags:e.tags}:{}};U(g.SCENARIO,e.temp_ref,n,e.title)}for(let e of m.scenarios??[]){let s=S[e.temp_ref];if(s){$(p.BELONGS_TO,s,E,{},e.temp_ref);for(let n of e.depends_on??[]){let c=v(n,`${e.temp_ref}.depends_on`,g.SCENARIO);c&&$(p.DEPENDS_ON,s,c,{},`${e.temp_ref}.depends_on`)}}}for(let e of m.acs??[]){let s={text:e.text,kind:e.kind,risk:e.risk,derived:!0,...e.expected_answer?{expected_answer:e.expected_answer}:{},...e.measurable!==void 0?{measurable:e.measurable}:{}},n=U(g.AC,e.temp_ref,s,e.text);if(!n)continue;let c=e.scope?.type==="scenario"&&e.scope.ref?v(e.scope.ref,`${e.temp_ref}.scope`,g.SCENARIO):E;c&&!t.edgesFrom(n).some(o=>o.type===p.SCOPED_TO&&!t.superseded.has(o.ecid))&&$(p.SCOPED_TO,n,c,{},`${e.temp_ref}.scope`);for(let o of e.cites??[]){if(be&&!Ee(o,`${e.temp_ref}.cite`))continue;let h={source_id:o.source_id,source_cid:o.source_cid,anchor:o.anchor,...o.quote?{quote:o.quote}:{}};$(p.DERIVES,o.source_cid,n,h,`${e.temp_ref}.cite`)}}for(let e of m.exercises??[]){let s=v(e.scenario,"exercises.scenario",g.SCENARIO),n=v(e.ac,"exercises.ac",g.AC);s&&n&&$(p.EXERCISES,s,n,{},`exercises ${e.scenario}\u2192${e.ac}`)}for(let e of m.scoped_to_repoints??[]){let s=v(e.ac,"scoped_to_repoints.ac",g.AC),n=v(e.to,"scoped_to_repoints.to");if(!s||!n)continue;let c=t.edgesFrom(s).find(o=>o.type===p.SCOPED_TO&&!t.superseded.has(o.ecid));c&&C.push({kind:"edge",ecid:c.ecid,reason:`re-scoped to ${e.to} by ${f.id}`,by:f}),$(p.SCOPED_TO,s,n,{},`scoped_to_repoints ${e.ac}`)}let ee=new Map;if(i.finalizeTestBody)for(let[e,s]of t.nameOf)ee.set(t.tipOf(e),s);let te=e=>t.nameOf.get(e)??ee.get(t.tipOf(e))??null,ye=e=>{let s=S[e];if(s)return N[e]??te(s);if(t.names.has(e))return t.resolve(e)?e:null;let n=t.resolve(e);return n?te(t.tipOf(n.cid)):null};for(let e of m.tests??[]){for(let u of e.reuses??[])z.has(u)&&_.push({code:"REUSES_EVICTED",detail:`${e.temp_ref}: reuses '${u}' which was budget-evicted \u2014 drop the edge; the dependent gap names the missing @import`});let s=e.test_md_blob,n=e.definitionId,c=e.objectives_blob;if(i.finalizeTestBody){let u;try{u=i.finalizeTestBody({temp_ref:e.temp_ref,test_md_blob:e.test_md_blob,verifies:e.verifies,reuses:e.reuses??[]},ye)}catch(l){return x([{code:"FINALIZE_BODY",detail:`${e.temp_ref}: ${l instanceof Error?l.message:String(l)}`}])}u&&(s=u.test_md_blob,n=u.definitionId,c=u.objectives_blob??c,G[e.temp_ref]=n)}let o={title:e.title,check:e.check,definitionId:n,derived:!0,...e.config?{config:e.config}:{},...s?{test_md_blob:s}:{},...c?{objectives_blob:c}:{},...e.surface_required!==void 0?{surface_required:e.surface_required}:{}},h=U(g.TEST,e.temp_ref,o,e.title);if(!h)continue;let O=v(e.automates,`${e.temp_ref}.automates`,g.SCENARIO);O&&$(p.AUTOMATES,h,O,{},`${e.temp_ref}.automates`);for(let u of e.verifies){let l=v(u,`${e.temp_ref}.verifies`,g.AC);l&&$(p.VERIFIES,h,l,{},`${e.temp_ref}.verifies`)}for(let u of e.reuses??[]){if(z.has(u))continue;let l=v(u,`${e.temp_ref}.reuses`,g.TEST);l&&$(p.REUSES,h,l,{},`${e.temp_ref}.reuses`)}for(let u of e.verifies){let l=S[u]??t.resolve(u)?.cid;l&&(t.trust.get(l)??"derived")==="derived"&&!T.some(r=>r.cid===l)?R.push(`${e.temp_ref}: verifies ${u} which is still DERIVED (unapproved) \u2014 committed anyway; approve it in chat or via review`):l&&S[u]===l&&(m.acs??[]).some(r=>r.temp_ref===u)&&R.push(`${e.temp_ref}: verifies ${u} minted in this same record (unapproved) \u2014 committed anyway; approve it in chat`)}if(e.verifies.length>1){let u=e.check?.verified_against;R.push(`${e.temp_ref}: verifies ${e.verifies.length} ACs but machine-asserts only 1 (check.verified_against=${u!=null?String(u):"?"}) \u2014 the rest ride prose only`)}}let H=[];{let e=(r,d)=>`${r??""}\0${D(String(d??""))}`,s=(r,d)=>i.reason?`${i.reason} \u2014 evolve by ${f.id}${d?` (${d})`:""}`:r,n=new Map;for(let r of T){if(r.label!==g.SCENARIO&&r.label!==g.TEST)continue;let d=e(r.label,r.content.title);n.set(d,[...n.get(d)??[],r.cid])}let c=new Map;for(let r of A){if(w.has(r))continue;let d=e(t.nodeLabel.get(r),t.getNode(r)?.content.title);c.set(d,[...c.get(d)??[],r])}for(let[r,d]of c){let a=n.get(r)??[],b=d.length===1&&a.length===1;for(let y of d)b?(C.push({kind:"node",old:y,new:a[0],reason:s(`--force redesign of ${i.ucRef} by ${f.id} (title-matched successor)`,"title-matched successor"),by:f}),H.push({old:y,next:a[0]})):C.push({kind:"node",old:y,new:null,reason:s(`--force redesign of ${i.ucRef} by ${f.id}`),by:f}),P.push(y)}let o=r=>t.edgesFrom(r).some(d=>d.type!==p.SCOPED_TO?!1:d.dst===E||t.tipOf(d.dst)===E?!0:t.nodeLabel.get(d.dst)===g.SCENARIO&&t.edgesFrom(d.dst).some(a=>a.type===p.BELONGS_TO&&t.tipOf(a.dst)===E)),h=new Map;for(let{cid:r,content:d}of t.byLabel(g.AC)){if(t.superseded.has(r)||!o(r))continue;let a=D(String(d.text??""));h.set(a,[...h.get(a)??[],r])}let O=new Map;for(let r of T){if(r.label!==g.AC)continue;let d=D(String(r.content.text??""));O.set(d,[...O.get(d)??[],r.cid])}for(let[r,d]of h){let a=O.get(r)??[];d.length!==1||a.length!==1||(C.push({kind:"node",old:d[0],new:a[0],reason:s(`AC re-emitted with changed content by ${f.id} (text-matched successor)`,"AC text-matched successor"),by:f}),H.push({old:d[0],next:a[0]}),P.push(d[0]))}let u=new Set(P),l=new Set;for(let r of C)r.kind==="edge"&&l.add(r.ecid);for(let{old:r,next:d}of H)for(let a of t.edgesInto(r))se(a.type)?.pin?.comparesTo!=="dst_tip"||t.superseded.has(a.src)||u.has(a.src)||l.has(a.ecid)||(C.push({kind:"edge",ecid:a.ecid,reason:`re-blessed onto ${d} (redirect successor of ${r}) by ${f.id}`,by:f}),l.add(a.ecid),F.some(y=>y.type===a.type&&y.src===a.src&&y.dst===d)||t.edgesFrom(a.src).some(y=>y.type===a.type&&y.dst===d))||a.type===p.AUTOMATES&&B.has(d)||$(a.type,a.src,d,a.props,`rebless ${a.type} from ${t.nameOf.get(a.src)??a.src}`)}if(_.length>0)return x(_);if(T.length===0&&F.length===0&&C.length===0&&q.length===0)return Object.keys(S).length>0?(R.push("everything in this phase is already current \u2014 nothing re-committed"),{record:null,errors:null,minted:S,logicalIds:N,superseded:[],warnings:R,finalizedTests:G,...i.force||i.forceScope?{forceScopeRemaining:M}:{}}):x([{code:"EMPTY_DESIGN",detail:"finalize_design produced nothing to commit"}]);if(i.generationTicket){let e=me(t,i.generationTicket);if(e!==null)return x([e])}return{record:ce(I,{ts:new Date().toISOString(),proposal_id:null,nodes:T,edges:F,review:[],supersessions:C,source_head_moves:{},...j.length>0?{names:j}:{},...(()=>{for(let e of m.judgements??[]){let s=e.target?S[e.target]??t.resolve(e.target)?.cid??E:E;q.push({about:s,rationale:`[${e.kind}] ${e.rationale}`,by:f})}return q.length>0?{judgements:q}:{}})(),design_of:{uc_cid:E,engine:k},...i.generationTicket?{design_generation:he(i.generationTicket,E,f)}:{},...i.eventIds&&i.eventIds.length>0?{event_ids:i.eventIds}:i.sid?{event_ids:fe(t,i.sid,"design",1)}:{},...i.sid?{sid:i.sid}:{},...i.phase?{design_phase:{uc_root:le(t,E),generation:i.generationTicket?.next_gen??pe(t,i.ucRef)?.gen??1,phase:i.phase,completeness:i.phaseCompleteness??"complete"}}:{}},{expectPrev:t.latestHash}).record,errors:null,minted:S,logicalIds:N,superseded:P,warnings:R,finalizedTests:G,...i.force||i.forceScope?{forceScopeRemaining:M}:{}}}function Le(i,I){let t=[];for(let m of i){let f=m.design_phase;!f||typeof f!="object"||f.uc_root===I&&(typeof f.phase!="string"||typeof f.generation!="number"||t.push({phase:f.phase,generation:f.generation,seq:m.seq,completeness:f.completeness==="partial"?"partial":"complete"}))}return t.sort((m,f)=>m.seq-f.seq)}export{$e as a,De as b,Le as c};
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ function g(e,n){return e.byLabel(n).filter(({cid:i})=>!e.superseded.has(i)&&e.trust.get(i)!=="archived")}function f(e,n,i){return e.displayNameOf(n)??String(i.title??i.text??n)}function v(e,n){let i=g(e,"scenario");if(n){let t=e.resolve(n);if(t){let o=new Set([t.cid,t.tip,e.tipOf(t.cid)]);i=i.filter(({cid:c})=>e.edgesFrom(c).some(l=>l.type==="belongs_to"&&(o.has(l.dst)||o.has(e.tipOf(l.dst)))))}}let r=new Set;for(let{cid:t}of i)r.add(t),r.add(e.tipOf(t));let m=g(e,"test").filter(({cid:t})=>!n||e.edgesFrom(t).some(o=>o.type==="automates"&&(r.has(o.dst)||r.has(e.tipOf(o.dst))))),s=new Set;for(let t of m)for(let o of e.edgesFrom(t.cid))o.type==="automates"&&s.add(e.tipOf(o.dst));let a=i.filter(({cid:t})=>!s.has(t)&&!s.has(e.tipOf(t))).map(({cid:t,content:o})=>f(e,t,o));return{live_scenarios:i.length,live_tests:m.length,missing:a}}function d(e){return e.length<=12?e.join(", "):`${e.slice(0,12).join(", ")} +${e.length-12} more`}function u(e,n){let i=e.committed.length===0?"committed: nothing new":`committed: ${d(e.committed.map(c=>c.temp_ref?`${c.temp_ref} \u2192 ${c.logical_id??c.cid}`:c.logical_id??c.cid))}`,r=[];e.reused&&r.push(`reused: ${e.reused}`),e.rejected?.length&&r.push(`rejected: ${d(e.rejected.map(c=>`${c.ref} (${c.reason})`))}`),e.warnings?.length&&r.push(`warnings: ${d(e.warnings)}`);let m=[`RECEIPT (commit ${e.commitN}, ${e.phase})`,i,...r],s,a;if(e.verb==="design")s=v(n,e.ucRef),m.push(`parity: ${s.live_scenarios} scenario(s) live \xB7 ${s.live_tests} test(s) live`+(s.missing.length?` \xB7 missing tests: ${d(s.missing)}`:"")),a=s.missing.length>0?`next: emit tests for the ${s.missing.length} scenario(s) listed \u2014 1:1, strict. Never re-emit committed items; reference them by the ids above.`:"next: every live scenario has a test. Address open gaps, or finish.";else{let c=g(n,"usecase").length;m.push(`parity: ${c} use-case(s) live`),a="next: refine via chat ops using the ids above. Never re-emit committed items."}m.push(a);let t=m.join(`
3
+ `);for(;Buffer.byteLength(t,"utf8")>6e3;)t=t.slice(0,Math.floor(t.length*.9))+"\u2026";let o={type:"receipt",verb:e.verb,commit_n:e.commitN,phase:e.phase,committed:e.committed,reused:e.reused??0,rejected:e.rejected??[],warnings:e.warnings??[],...s?{parity:{live_scenarios:s.live_scenarios,live_tests:s.live_tests,missing:s.missing}}:{},next:a};return{text:t,event:o}}function p(e,n,i){try{let r=e.design_of?"design":e.proposal_id!==null?"proposal":e.conv?"chat":"commit",m=e.nodes.map(a=>{let t=n.displayNameOf(a.cid);return{cid:a.cid,...t!==null?{logical_id:t}:{}}}),s=u({verb:i.verb,commitN:i.commitN,phase:r,committed:m,...i.ucRef?{ucRef:i.ucRef}:{}},n);return{text:s.text+`
4
+ (recomputed against the current graph)`,event:{...s.event,recomputed_at_resume:!0}}}catch{let r=e.event_ids?.[0]??`seq ${e.seq}`,m=e.review[0]?.by?.id??e.sid??"unknown",s=`commit ${r} by ${m} at ${e.ts} \u2014 details unavailable (graph moved since)`;return{text:s,event:{type:"receipt",verb:i.verb,commit_n:i.commitN,phase:"recovered",recomputed_at_resume:!0,degraded:!0,message:s}}}}export{u as a,p as b};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{i as s,j as e}from"./chunk-5YPBPZUR.js";import{a as t,b as i}from"./chunk-IAHKTEET.js";function a(r,n){return"sha256:"+i(Buffer.from("assurance."+r+"\0"+t(s(r,n)),"utf8"))}function f(r,n,o,u){return"sha256:"+i(Buffer.from("assurance.edge\0"+t({type:r,src:n,dst:o,props:e(r,u)}),"utf8"))}function d(r,n){return{source_id:r,blob:n}}function p(r){return{...r,derived:!0}}export{a,f as b,d as c,p as d};
2
+ import{a as t,b as i}from"./chunk-IAHKTEET.js";import{i as s,j as e}from"./chunk-5YPBPZUR.js";function a(r,n){return"sha256:"+i(Buffer.from("assurance."+r+"\0"+t(s(r,n)),"utf8"))}function f(r,n,o,u){return"sha256:"+i(Buffer.from("assurance.edge\0"+t({type:r,src:n,dst:o,props:e(r,u)}),"utf8"))}function d(r,n){return{source_id:r,blob:n}}function p(r){return{...r,derived:!0}}export{a,f as b,d as c,p as d};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as m}from"./chunk-KXUSG5ZI.js";import{y as t}from"./chunk-MMPFU2YC.js";import{a as p}from"./chunk-HCBYKLMW.js";import{a,b as r,i as u}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as n}from"./chunk-UR6MHSHU.js";var c=n(b(),1);var e=n(p(),1);function R({onSubmit:l}){let[o,f]=(0,c.useState)(0),s=(0,c.useRef)(!1);return u((x,i)=>{s.current||(i.leftArrow||i.rightArrow?f(d=>d===0?1:0):i.return?(s.current=!0,l(o===0?"positive":"negative")):i.escape&&(s.current=!0,l(null)))}),(0,e.jsxs)(a,{flexDirection:"column",marginTop:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(r,{color:t.secondary,children:"Rate this session: "}),(0,e.jsx)(r,{color:o===0?t.orange:t.dim,children:o===0?"[ \u{1F44D} ]":" \u{1F44D} "}),(0,e.jsx)(r,{children:" "}),(0,e.jsx)(r,{color:o===1?t.orange:t.dim,children:o===1?"[ \u{1F44E} ]":" \u{1F44E} "})]}),(0,e.jsx)(m,{bindings:[{keys:"\u2190/\u2192",label:"select"},{keys:"\u21B5",label:"submit"}],escBackLabel:"skip"})]})}export{R as a};
2
+ import{a as m}from"./chunk-4OPQJ7PE.js";import{y as t}from"./chunk-C4G7RVJ6.js";import{a as p}from"./chunk-HCBYKLMW.js";import{a,b as r,i as u}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as n}from"./chunk-UR6MHSHU.js";var c=n(b(),1);var e=n(p(),1);function R({onSubmit:l}){let[o,f]=(0,c.useState)(0),s=(0,c.useRef)(!1);return u((x,i)=>{s.current||(i.leftArrow||i.rightArrow?f(d=>d===0?1:0):i.return?(s.current=!0,l(o===0?"positive":"negative")):i.escape&&(s.current=!0,l(null)))}),(0,e.jsxs)(a,{flexDirection:"column",marginTop:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(r,{color:t.secondary,children:"Rate this session: "}),(0,e.jsx)(r,{color:o===0?t.orange:t.dim,children:o===0?"[ \u{1F44D} ]":" \u{1F44D} "}),(0,e.jsx)(r,{children:" "}),(0,e.jsx)(r,{color:o===1?t.orange:t.dim,children:o===1?"[ \u{1F44E} ]":" \u{1F44E} "})]}),(0,e.jsx)(m,{bindings:[{keys:"\u2190/\u2192",label:"select"},{keys:"\u21B5",label:"submit"}],escBackLabel:"skip"})]})}export{R as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as f}from"./chunk-XXMNUJX4.js";import{y as t}from"./chunk-MMPFU2YC.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as r,b as n}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var c=p(B(),1);var e=p(x(),1);function v(){return[{name:"convert",label:"Converting session data",status:"pending"},{name:"zip",label:"Compressing artifacts",status:"pending"},{name:"presign",label:"Requesting upload URLs",status:"pending"},{name:"upload",label:"Uploading to KaneAI",status:"pending"},{name:"atomic_replace",label:"Replacing local output",status:"pending"},{name:"commit_lock",label:"Committing to TMS",status:"pending"},{name:"finalize",label:"Finalizing test case",status:"pending"},{name:"code_export",label:"Downloading test code",status:"pending"}]}function U(s,o,d,a){return s.map(l=>l.name===o?{...l,status:d,detail:a}:l)}function R(s){let o=s/1e3;if(o<60)return`${o.toFixed(1)}s`;let d=Math.floor(o/60),a=Math.round(o%60);return`${d}m ${a}s`}function D(s){let[o,d]=(0,c.useState)(0),a=c.default.useRef(Date.now());return(0,c.useEffect)(()=>{if(!s)return;a.current=Date.now();let l=setInterval(()=>{d(Date.now()-a.current)},100);return()=>clearInterval(l)},[s]),o}function h({steps:s,status:o,testUrl:d,error:a}){let l=D(o==="uploading");return o==="uploading"?(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.orange,children:"\u2601 "}),(0,e.jsx)(n,{color:t.orange,bold:!0,children:"Saving to KaneAI"}),(0,e.jsxs)(n,{color:t.dim,children:[" ",R(l)]})]}),(0,e.jsx)(r,{flexDirection:"column",marginTop:1,children:s.filter(i=>i.status!=="skipped").map((i,S,T)=>{let b=S===T.length-1?"\u2514\u2500":"\u251C\u2500",u=i.status==="done",m=i.status==="running",g=i.status==="failed";return(0,e.jsxs)(r,{children:[(0,e.jsxs)(n,{color:t.dim,children:[" ",b," "]}),(0,e.jsx)(r,{width:3,children:m?(0,e.jsx)(f,{}):u?(0,e.jsx)(n,{color:t.green,children:"\u2713"}):g?(0,e.jsx)(n,{color:t.red,children:"\u2717"}):(0,e.jsx)(n,{color:t.muted,children:"\u25CB"})}),(0,e.jsx)(n,{color:u?t.dim:m?void 0:g?t.red:t.muted,children:i.label}),i.detail&&(0,e.jsxs)(n,{color:t.dim,children:[" ",i.detail]})]},i.name)})}),(0,e.jsx)(r,{marginTop:1,children:(0,e.jsx)(n,{color:t.muted,children:" press Ctrl+C twice to force exit"})})]}):o==="success"?(0,e.jsx)(e.Fragment,{}):(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.red,children:"\u2601 "}),(0,e.jsx)(n,{color:t.red,bold:!0,children:"Save failed"})]}),a&&(0,e.jsxs)(r,{marginTop:0,children:[(0,e.jsx)(n,{color:t.dim,children:" "}),(0,e.jsx)(n,{color:t.dim,children:a})]})]})}export{v as a,U as b,h as c};
2
+ import{a as f}from"./chunk-R2RGSO4B.js";import{y as t}from"./chunk-C4G7RVJ6.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as r,b as n}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var c=p(B(),1);var e=p(x(),1);function v(){return[{name:"convert",label:"Converting session data",status:"pending"},{name:"zip",label:"Compressing artifacts",status:"pending"},{name:"presign",label:"Requesting upload URLs",status:"pending"},{name:"upload",label:"Uploading to KaneAI",status:"pending"},{name:"atomic_replace",label:"Replacing local output",status:"pending"},{name:"commit_lock",label:"Committing to TMS",status:"pending"},{name:"finalize",label:"Finalizing test case",status:"pending"},{name:"code_export",label:"Downloading test code",status:"pending"}]}function U(s,o,d,a){return s.map(l=>l.name===o?{...l,status:d,detail:a}:l)}function R(s){let o=s/1e3;if(o<60)return`${o.toFixed(1)}s`;let d=Math.floor(o/60),a=Math.round(o%60);return`${d}m ${a}s`}function D(s){let[o,d]=(0,c.useState)(0),a=c.default.useRef(Date.now());return(0,c.useEffect)(()=>{if(!s)return;a.current=Date.now();let l=setInterval(()=>{d(Date.now()-a.current)},100);return()=>clearInterval(l)},[s]),o}function h({steps:s,status:o,testUrl:d,error:a}){let l=D(o==="uploading");return o==="uploading"?(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.orange,children:"\u2601 "}),(0,e.jsx)(n,{color:t.orange,bold:!0,children:"Saving to KaneAI"}),(0,e.jsxs)(n,{color:t.dim,children:[" ",R(l)]})]}),(0,e.jsx)(r,{flexDirection:"column",marginTop:1,children:s.filter(i=>i.status!=="skipped").map((i,S,T)=>{let b=S===T.length-1?"\u2514\u2500":"\u251C\u2500",u=i.status==="done",m=i.status==="running",g=i.status==="failed";return(0,e.jsxs)(r,{children:[(0,e.jsxs)(n,{color:t.dim,children:[" ",b," "]}),(0,e.jsx)(r,{width:3,children:m?(0,e.jsx)(f,{}):u?(0,e.jsx)(n,{color:t.green,children:"\u2713"}):g?(0,e.jsx)(n,{color:t.red,children:"\u2717"}):(0,e.jsx)(n,{color:t.muted,children:"\u25CB"})}),(0,e.jsx)(n,{color:u?t.dim:m?void 0:g?t.red:t.muted,children:i.label}),i.detail&&(0,e.jsxs)(n,{color:t.dim,children:[" ",i.detail]})]},i.name)})}),(0,e.jsx)(r,{marginTop:1,children:(0,e.jsx)(n,{color:t.muted,children:" press Ctrl+C twice to force exit"})})]}):o==="success"?(0,e.jsx)(e.Fragment,{}):(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.red,children:"\u2601 "}),(0,e.jsx)(n,{color:t.red,bold:!0,children:"Save failed"})]}),a&&(0,e.jsxs)(r,{marginTop:0,children:[(0,e.jsx)(n,{color:t.dim,children:" "}),(0,e.jsx)(n,{color:t.dim,children:a})]})]})}export{v as a,U as b,h as c};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as b}from"./chunk-KXUSG5ZI.js";import{n as d,y as o}from"./chunk-MMPFU2YC.js";import{a as L}from"./chunk-HCBYKLMW.js";import{a as u,b as c,i as A}from"./chunk-C44QQJR4.js";import{a as D}from"./chunk-6YGTRKDT.js";import{e as h}from"./chunk-UR6MHSHU.js";var x=h(D(),1);import{readdirSync as N,mkdirSync as B,statSync as k}from"fs";import{join as P}from"path";var r=h(L(),1);function O(n){try{return N(n).filter(l=>{try{return k(P(n,l)).isDirectory()}catch{return!1}})}catch{return[]}}function E(n,l,f,v){return{name:n,path:l,label:n,isActive:v}}function H({currentPath:n,onSelect:l,onCancel:f}){let s=O(d).map(i=>{let e=P(d,i);return E(i,e,n,e===n)}),p=!n,R=s.length+2,[a,C]=(0,x.useState)(()=>{if(p)return 0;let i=s.findIndex(e=>e.isActive);return i>=0?i+1:0}),[T,I]=(0,x.useState)(!1),[S,g]=(0,x.useState)("");return A((i,e)=>{if(T){if(e.escape){I(!1),g("");return}if(e.return){let t=S.trim();if(t){let m=P(d,t);B(m,{recursive:!0}),l(m),f()}return}if(e.backspace||e.delete){g(t=>t.slice(0,-1));return}i&&!e.ctrl&&!e.meta&&g(t=>t+i);return}if(e.escape){f();return}if(e.upArrow){C(t=>Math.max(0,t-1));return}if(e.downArrow){C(t=>Math.min(R-1,t+1));return}if(e.return){if(a===0){p||l(""),f();return}if(a===s.length+1){B(d,{recursive:!0}),I(!0),g("");return}let t=s[a-1];t&&!t.isActive&&l(t.path),f();return}}),T?(0,r.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,r.jsx)(c,{color:o.orange,bold:!0,children:"Chrome Profile \u203A New"}),(0,r.jsxs)(u,{marginTop:1,children:[(0,r.jsx)(c,{color:o.secondary,children:"Name: "}),(0,r.jsx)(c,{children:S}),(0,r.jsx)(c,{color:o.dim,children:"\u2588"})]}),(0,r.jsx)(b,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:"back"})]}):(0,r.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,r.jsx)(c,{color:o.orange,bold:!0,children:"Chrome Profile"}),(0,r.jsxs)(u,{flexDirection:"column",marginTop:1,children:[(0,r.jsxs)(c,{color:p?o.green:a===0?o.orange:o.dim,children:[a===0?"\u276F ":" ","Use temporary (no profile)",p?" \u25CF active":""]}),s.map((i,e)=>{let m=e+1===a,w=m?"\u276F ":" ",y=i.isActive?o.green:m?o.orange:void 0;return(0,r.jsxs)(c,{color:y,children:[w,i.label,i.isActive?" \u25CF active":""]},i.name)}),(0,r.jsxs)(c,{color:a===s.length+1?o.orange:o.dim,children:[a===s.length+1?"\u276F ":" ","+ Create new"]})]}),(0,r.jsx)(b,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}export{O as a,E as b,H as c};
2
+ import{a as b}from"./chunk-4OPQJ7PE.js";import{n as d,y as o}from"./chunk-C4G7RVJ6.js";import{a as L}from"./chunk-HCBYKLMW.js";import{a as u,b as c,i as A}from"./chunk-C44QQJR4.js";import{a as D}from"./chunk-6YGTRKDT.js";import{e as h}from"./chunk-UR6MHSHU.js";var x=h(D(),1);import{readdirSync as N,mkdirSync as B,statSync as k}from"fs";import{join as P}from"path";var r=h(L(),1);function O(n){try{return N(n).filter(l=>{try{return k(P(n,l)).isDirectory()}catch{return!1}})}catch{return[]}}function E(n,l,f,v){return{name:n,path:l,label:n,isActive:v}}function H({currentPath:n,onSelect:l,onCancel:f}){let s=O(d).map(i=>{let e=P(d,i);return E(i,e,n,e===n)}),p=!n,R=s.length+2,[a,C]=(0,x.useState)(()=>{if(p)return 0;let i=s.findIndex(e=>e.isActive);return i>=0?i+1:0}),[T,I]=(0,x.useState)(!1),[S,g]=(0,x.useState)("");return A((i,e)=>{if(T){if(e.escape){I(!1),g("");return}if(e.return){let t=S.trim();if(t){let m=P(d,t);B(m,{recursive:!0}),l(m),f()}return}if(e.backspace||e.delete){g(t=>t.slice(0,-1));return}i&&!e.ctrl&&!e.meta&&g(t=>t+i);return}if(e.escape){f();return}if(e.upArrow){C(t=>Math.max(0,t-1));return}if(e.downArrow){C(t=>Math.min(R-1,t+1));return}if(e.return){if(a===0){p||l(""),f();return}if(a===s.length+1){B(d,{recursive:!0}),I(!0),g("");return}let t=s[a-1];t&&!t.isActive&&l(t.path),f();return}}),T?(0,r.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,r.jsx)(c,{color:o.orange,bold:!0,children:"Chrome Profile \u203A New"}),(0,r.jsxs)(u,{marginTop:1,children:[(0,r.jsx)(c,{color:o.secondary,children:"Name: "}),(0,r.jsx)(c,{children:S}),(0,r.jsx)(c,{color:o.dim,children:"\u2588"})]}),(0,r.jsx)(b,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:"back"})]}):(0,r.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,r.jsx)(c,{color:o.orange,bold:!0,children:"Chrome Profile"}),(0,r.jsxs)(u,{flexDirection:"column",marginTop:1,children:[(0,r.jsxs)(c,{color:p?o.green:a===0?o.orange:o.dim,children:[a===0?"\u276F ":" ","Use temporary (no profile)",p?" \u25CF active":""]}),s.map((i,e)=>{let m=e+1===a,w=m?"\u276F ":" ",y=i.isActive?o.green:m?o.orange:void 0;return(0,r.jsxs)(c,{color:y,children:[w,i.label,i.isActive?" \u25CF active":""]},i.name)}),(0,r.jsxs)(c,{color:a===s.length+1?o.orange:o.dim,children:[a===s.length+1?"\u276F ":" ","+ Create new"]})]}),(0,r.jsx)(b,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}export{O as a,E as b,H as c};
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as O}from"./chunk-WWNSD6FA.js";import{a as E,b as N}from"./chunk-IAHKTEET.js";import{a as $}from"./chunk-5YPBPZUR.js";import{closeSync as S,existsSync as F,fsyncSync as k,mkdirSync as P,openSync as q,readFileSync as p,readdirSync as T,renameSync as R,rmSync as v,writeFileSync as A}from"fs";import{join as u}from"path";var i=class extends Error{};function _(e,t){if(e.schema_version!==void 0&&e.schema_version!==$)throw new i(`record ${t} is stamped ${e.schema_version}, this build reads ${$} \u2014 migrate explicitly`);if(e.parents!==void 0&&!(e.prev_hash===null?e.parents.length===0:e.parents.length===1&&e.parents[0]===e.prev_hash))throw new i(`record ${t}: parents does not mirror prev_hash \u2014 multi-parent records need a DAG-aware reader`)}var C=class extends i{},b=class extends i{code="CONTEXT_APPEND_BUSY"};function I(e,t){P(e,{recursive:!0});let r=u(e,".lock"),c=Date.now()+(t?t.deadlineMs:2e3);for(;;)try{let o=q(r,"wx");return A(o,`${process.pid}
3
+ `),S(o),()=>{try{v(r)}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;if(t){let n=null,a=null;try{a=p(r,"utf8");let h=Number.parseInt(a.trim(),10);n=Number.isInteger(h)?h:null}catch{a=null}if(a!==null&&(n===null||!O(n))){let h=`${r}.break-${process.pid}-${Date.now()}`;try{R(r,h);let s=null;try{s=p(h,"utf8")}catch{s=null}if(s===null||s===a)v(h,{force:!0});else try{R(h,r)}catch{v(h,{force:!0})}}catch(s){if(s.code!=="ENOENT")throw s}continue}if(Date.now()>c)throw new b(`.context append is busy: ${r} held by live pid ${String(n)} past the deadline`);Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,25+Math.floor(Math.random()*50));continue}if(Date.now()>c)throw new i(`.context is locked by another process \u2014 remove ${r} if that process is gone`);Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,25)}}var j=/^\d{6}-[0-9a-f]{12}\.json$/,f=e=>u(e,"commits");function w(e){return"sha256:"+N(Buffer.from(E(e),"utf8"))}function y(e){let t=f(e);return F(t)?T(t).filter(r=>j.test(r)).sort():[]}function H(e){let t=y(e),r=[],c=[],o=null;return t.forEach((n,a)=>{let h=p(u(f(e),n),"utf8"),s;try{s=JSON.parse(h)}catch(d){throw new i(`corrupt commit record ${n}: ${String(d)}`)}if(s.seq!==a+1)throw new i(`sequence gap: expected seq ${a+1}, ${n} has ${s.seq}`);if(s.prev_hash!==o)throw new i(`broken chain at ${n}: prev_hash ${String(s.prev_hash)} != ${String(o)}`);_(s,n);let m=w(s),l=n.slice(7,19);if(!m.slice(7).startsWith(l))throw new i(`tampered record ${n}: content hash ${m} does not match filename`);r.push(s),c.push(m),o=m}),{records:r,hashes:c}}function J(e){let t=y(e);if(t.length===0)return null;let r=t[t.length-1],c=p(u(f(e),r),"utf8"),o;try{o=JSON.parse(c)}catch(a){throw new i(`corrupt tail record ${r}: ${String(a)}`)}_(o,r);let n=w(o);if(!n.slice(7).startsWith(r.slice(7,19)))throw new i(`tampered tail record ${r}: content hash ${n} does not match filename`);if(o.seq!==t.length)throw new i(`sequence gap at tail: ${t.length} record files but tail seq is ${o.seq}`);return{seq:o.seq,hash:n}}function U(e){return J(e)?.hash??null}function B(e,t,r){let c=y(e);if(c.length<t)throw new i(`derived state is ahead of the record log (applied seq ${t}, ${c.length} records) \u2014 run kane-cli context rebuild`);let o=[],n=[],a=r;for(let h=t;h<c.length;h++){let s=c[h],m=p(u(f(e),s),"utf8"),l;try{l=JSON.parse(m)}catch(g){throw new i(`corrupt commit record ${s}: ${String(g)}`)}if(l.seq!==h+1)throw new i(`sequence gap: expected seq ${h+1}, ${s} has ${l.seq}`);if(l.prev_hash!==a)throw new i(`broken chain at ${s}: prev_hash ${String(l.prev_hash)} != ${String(a)}`);_(l,s);let d=w(l);if(!d.slice(7).startsWith(s.slice(7,19)))throw new i(`tampered record ${s}: content hash ${d} does not match filename`);o.push(l),n.push(d),a=d}return{records:o,hashes:n}}function V(e,t){if(t.seq===0){if(t.hash!==null)throw new i("watermark not in chain: seq 0 cannot carry a hash");return H(e)}let r=y(e);if(r.length<t.seq)throw new i(`watermark not in chain: seq ${t.seq} is beyond the ${r.length}-record chain`);let c=r[t.seq-1],o;try{o=JSON.parse(p(u(f(e),c),"utf8"))}catch(a){throw new i(`watermark record ${c} unreadable: ${String(a)}`)}let n=w(o);if(n!==t.hash)throw new i(`watermark not in chain: seq ${t.seq} hashes ${n}, watermark claims ${String(t.hash)}`);return B(e,t.seq,t.hash)}function Y(e,t,r){let c=I(e,r.busyRetry);try{return M(e,t,r)}finally{c()}}function K(e,t){let r=I(e);try{return M(e,t,{})}finally{r()}}function M(e,t,r){let c=J(e),o=(c?.seq??0)+1,n=c?.hash??null;if(r.expectPrev!==void 0&&r.expectPrev!==n)throw new C(`concurrent append detected: validated against ${String(r.expectPrev)} but the chain head is ${String(n)} \u2014 re-open and retry`);let a={seq:o,prev_hash:n,...t,schema_version:$,parents:n===null?[]:[n]},h=w(a),s=f(e);P(s,{recursive:!0});let m=`${String(o).padStart(6,"0")}-${h.slice(7,19)}.json`,l=u(s,m),d=l+".tmp",g=q(d,"w");try{A(g,JSON.stringify(a)+`
4
+ `),k(g)}finally{S(g)}R(d,l);try{let x=q(s,"r");k(x),S(x)}catch{}return{seq:o,hash:h,file:l,record:a}}export{i as a,C as b,b as c,H as d,J as e,U as f,B as g,V as h,Y as i,K as j};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as M,b as B,c as oe,d as A}from"./chunk-2YQ6TW77.js";import{a as F}from"./chunk-WAOCHXJ5.js";import{b as z}from"./chunk-CJJXT5DO.js";import{a as U}from"./chunk-2WVKOZ6W.js";import{a as j}from"./chunk-NLCCBXXV.js";import{a as O}from"./chunk-RZ4F3BHX.js";import{e as se}from"./chunk-UR6MHSHU.js";import{readFileSync as te,existsSync as C,readdirSync as Re,mkdirSync as D,writeFileSync as x}from"fs";import{readFile as ie,unlink as Ae}from"fs/promises";import{join as E}from"path";import{randomUUID as P}from"crypto";var re="/home/kaneai/Downloads";function N(t){return`${re}/${t}`}function $(t){return"FILE__"+t.replace(/[^A-Za-z0-9]/g,"_")}function S(t){let e=t?.media;return!e||!e.name||!e.media_url?null:{media_id:e.media_id??"",name:e.name,media_url:e.media_url,type:e.type??"doc"}}function K(t){return t?t.includes(`
2
+ import{a as M,b as B,c as oe,d as A}from"./chunk-2YQ6TW77.js";import{b as z}from"./chunk-CJJXT5DO.js";import{a as F}from"./chunk-WAOCHXJ5.js";import{a as U}from"./chunk-2WVKOZ6W.js";import{a as j}from"./chunk-NLCCBXXV.js";import{a as O}from"./chunk-RZ4F3BHX.js";import{e as se}from"./chunk-UR6MHSHU.js";import{readFileSync as te,existsSync as C,readdirSync as Re,mkdirSync as D,writeFileSync as x}from"fs";import{readFile as ie,unlink as Ae}from"fs/promises";import{join as E}from"path";import{randomUUID as P}from"crypto";var re="/home/kaneai/Downloads";function N(t){return`${re}/${t}`}function $(t){return"FILE__"+t.replace(/[^A-Za-z0-9]/g,"_")}function S(t){let e=t?.media;return!e||!e.name||!e.media_url?null:{media_id:e.media_id??"",name:e.name,media_url:e.media_url,type:e.type??"doc"}}function K(t){return t?t.includes(`
3
3
  `)?t.split(`
4
4
  `).map(e=>e.trim()).filter(Boolean):t.split(". ").map(e=>e.trim()).filter(Boolean).map(e=>e.endsWith(".")?e:e+"."):[]}function L(t,e){return!t||!e?t:t.replace(/\{\{(.+?)\}\}/g,(i,n)=>{let s=e[n];return s?s.value:i}).replace(/\$\{(.+?)\}/g,(i,n)=>{let s=e[n];return s?s.value:i})}var ae={click:"CLICK",double_click:"CLICK",type:"TYPE",fill:"TYPE",select:"SELECT",hover:"HOVER",drag:"DRAG_DROP",upload_files:"UPLOAD_FILE",navigate:"OPEN",go_back:"NAVIGATE",go_forward:"NAVIGATE",refresh:"REFRESH",press_key:"SENDKEYS",scroll:"SCROLL_PIXELS",scroll_into_view:"SCROLL_UNTIL_ELEMENT",wait:"WAIT",wait_until:"WAIT_UNTIL",wait_for_load:"WAIT_FOR_LOAD",switch_tab:"SWITCH_TAB",new_tab:"NEW_TAB",close_tab:"CLOSE_TAB",api:"API",evaluate_js:"EVALUATE_JS",vision_query:"VISION_QUERY",textual_query:"TEXTUAL_QUERY",get_url:"GET_URL",get_title:"GET_TITLE",assert:"ASSERTION",math:"MATHEMATICAL_OPERATION",set_cookies:"SET_COOKIES",delete_cookies:"DELETE_COOKIES",clear_cookies:"CLEAR_COOKIES",set_local_storage:"SET_LOCAL_STORAGE",delete_local_storage:"DELETE_LOCAL_STORAGE",clear_local_storage:"CLEAR_LOCAL_STORAGE",set_clipboard:"SET_CLIPBOARD",paste_clipboard:"PASTE_CLIPBOARD",clear_clipboard:"CLEAR_CLIPBOARD"},G={literal:"SET_VARIABLE",condition:"SET_VARIABLE",visual:"VISION_QUERY",dom:"TEXTUAL_QUERY",url:"GET_URL",title:"GET_TITLE",devtool_network:"DEVTOOLS_NETWORK_QUERY",devtool_console:"DEVTOOLS_CONSOLE_QUERY",devtool_cookies:"DEVTOOLS_COOKIES_QUERY",devtool_storage:"DEVTOOLS_STORAGE_QUERY",devtool_performance:"DEVTOOLS_PERFORMANCE",api_response:"API_CALLS_QUERY",textual_visual:"TEXTUAL_ANALYZER"},le=new Set(["CLICK","TYPE","FILL","HOVER","SCROLL_UNTIL_ELEMENT","UPLOAD_FILE","VISION_QUERY","DRAG_DROP","SELECT"]);function X(t,e){if(t==="analyze"){let n=e?.action_params?.analyzer_type??"";return G[n]}let i=ae[t];return i||console.warn(`[migrator] UNKNOWN action_type "${t}" \u2014 falling back to "${t.toUpperCase()}"; explicit mapping required`),i??t.toUpperCase()}function Y(t,e){if(!t||!e)return"";try{let i=new Date(t);return isNaN(i.getTime())?"":new Date(i.getTime()+e).toISOString()}catch{return""}}function H(t){try{return JSON.parse(t.output_value??"{}")}catch{return{}}}function ce(t){let e=t.output_variable??"";if(!e)return"[]";let n={...H(t)};return delete n.body,JSON.stringify([{name:e,unique_key:(t.action_id??"").replace(/-/g,"").slice(0,8)||P().replace(/-/g,"").slice(0,8),value:n,variable_description:"API Response"}])}function ue(t,e,i){let n=t.action_params??{},s=le.has(e)?"Vision Agent":"Operation Agent",a={operation_type:e};if(e==="OPEN"&&(a.url=n.url??""),e==="SET_VARIABLE"&&(a.variable_name=t.output_variable??n.key??"",a.variable_value=t.output_value??""),e==="UPLOAD_FILE"){let f=S(n);f&&(a.value=N(f.name))}let o={},l={},r=t.action_instruction??"",c=n.text??"",u=n.url??"",p=[["intent",r],["value",c],["url",u]];for(let[f,h]of Object.entries(i)){let b=String(h);if(f.startsWith("secrets."))for(let[I,v]of p)v.includes(b)&&(l[I]=f);for(let[I,v]of p)v.includes(b)&&!(I in o)&&(o[I]=v)}let _=t.action_type,d={operation:t.action_instruction??"",agent:s,operation_dict:a,reasoning:_==="analyze"?n.query??"":t.intent??t.action_instruction??"",variable:o,secrets:l,params:{}};_==="analyze"&&typeof n.code=="string"&&n.code&&(d.code=n.code),_==="analyze"&&typeof n.code_js=="string"&&n.code_js&&(d.code_js=n.code_js),_==="analyze"&&typeof n.condition_expression=="string"&&n.condition_expression&&(d.condition_expression=n.condition_expression),n.uses_websocket===!0&&(d.uses_websocket=!0),n.uses_sse===!0&&(d.uses_sse=!0),_==="analyze"&&n.analyzer_type==="textual_visual"&&(typeof n.wrapped_js=="string"&&(d.wrapped_js=n.wrapped_js),Array.isArray(n.locators)&&(d.locators=n.locators),typeof n.operator=="string"&&(d.operator=n.operator),Array.isArray(n.transforms)&&(d.transforms=n.transforms),typeof n.query=="string"&&(d.query=n.query),typeof n.expected_value=="string"&&(d.expected_value=n.expected_value),typeof n.needs_unit_conversion=="boolean"&&(d.needs_unit_conversion=n.needs_unit_conversion),typeof n.condition=="string"&&(d.condition=n.condition));let m={set_cookies:"cookies",set_clipboard:"text",delete_cookies:"names",set_local_storage:"items",delete_local_storage:"keys"}[_];return m&&n[m]!==void 0&&(d[m]=n[m]),_==="set_clipboard"&&typeof n.html=="string"&&n.html&&(d.html=n.html),d}function de(t){let e=t.assertion_tree??{};if(typeof e.passed=="boolean")return e.passed;let i=e.sub_results??[];return i.length===0?e.status==="passed":(e.composite_operator??"and")==="or"?i.some(s=>s.passed===!0):i.every(s=>s.passed===!0)}function W(t){return t.map(e=>({description:e.description??"",store_key:e.store_key??"",expected_value:e.expected??"",extracted_value:e.extracted_value??"",operator:e.operator??"equals",transforms:e.transforms??[]}))}function _e(t){let e=t.assertion_tree??{},i=e.sub_results??[],n=W(i);return{operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[],sub_results:i,sub_checks:n,composite_operator:e.composite_operator??"and",verification:e.verification??"",claim:e.description??""}}function pe(t){let i=(t.action_params??{}).assertion_tree??{},n=i.sub_results??[],s=W(n);return[{operation:t.action_instruction??"",agent:"Operation Agent",operation_dict:{operation_type:"ASSERTION",assertion_tree:{sub_results:n,sub_checks:s,composite_operator:i.composite_operator??"and",verification:"",claim:i.description??t.action_instruction??"",operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[]}},variable:{},secrets:{},params:{}}]}function ge(t,e,i,n){let s=t.visual_data;if(!s||s.x==null||s.y==null)return null;let a=e?`${e}/test_screenshots`:"";return{x:s.x,y:s.y,confidence:0,bbox:s.bbox??null,bbox_source:s.bbox?"accessibility_tree":"fallback",viewport_width:s.viewport_width??1280,viewport_height:s.viewport_height??800,scale_factor:null,raw_image_url:a?`${a}/untagged_screenshot/${i}.${n?.get(i)??"png"}`:"",raw_image_sas_url:"",annotated_image_url:"",annotated_image_sas_url:""}}function fe(t){if(!t)return"";let e=t;return typeof t=="object"&&!Array.isArray(t)&&Array.isArray(t.frameInfo)&&(e=t.frameInfo),!Array.isArray(e)||e.length===0?"":JSON.stringify(e)}function V(t,e={},i="",n){let s=t.action_type,a=X(s,t),o=t.action_params??{},l=t.coordinates??null,r=t.selectors??null,c=!!(r&&r.length>0),u=t.timestamp??"",p=t.duration_ms??0,_=t.variables_used??{},d=t.action_id??P(),g=P(),m=Y(u,p),f="",h="";if(s==="navigate")h=o.url??"",f=h;else if(s==="type"||s==="fill")f=o.text??"";else if(s==="press_key")f=o.key??"";else if(s==="wait")f=String(o.ms??o.timeout_ms??"");else if(s==="evaluate_js")f=o.script??"";else if(s==="upload_files"){let y=S(o);y&&(f=N(y.name))}else s==="analyze"&&a==="SET_VARIABLE"&&(f=t.output_value??"");let b="";s==="go_back"?b="back":s==="go_forward"&&(b="forward");let I=L(f,e),v=L(h,e),k=L(t.action_instruction??"",e),R=ue(t,a,_);return{operation_id:d,instruction_id:g,instruction:k,intent:k,operation_start:u,operation_end:m,status:t.status??"",command:a,name:"",target:"",value:I,message:"",operation_dict:"",frame:fe(t.frame_info),error_message:t.error??"",code_snippet:"",sub_instruction_obj:JSON.stringify(R),test_id:"",test_version:"",action:"",string_to_float:!1,feedback_msg:"",time_taken:"",create_time_stamp:"",update_time_stamp:"",locator_variable:"",locator_variable_name:"",image_url:i?`${i}/test_screenshots/untagged_screenshot/${d}.${n?.get(d)??"png"}`:"",alternative_xpaths:[],attribute:"",value_description:"",url:v,navigation_direction:b,tagified_image_url:"",query_variable_name:t.output_variable??"",query_variable_value:t.output_value??"",query_variable_type:"",expected_value:"",queried_value:"",operator:"",assertion_status:a==="ASSERTION"?de(o):"",query_info_dict:{},query_content_confidence:"none",debugging_logs:[],locator_index:0,query_html:"",user_variables:"[]",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,tab_index:String(o.tab_index??""),tab_identifier:String(o.tab_identifier??""),scroll_value:o.amount??1,scroll_direction:o.direction??"",mi_scroll_payload:{},sleep_duration:0,app_id:"",manual_interaction_tag:"",string_to_float_list:[],js_snippet:s==="evaluate_js"?o.script??"":"",code_error:"",hide:!1,dismiss_dialog:!1,use_v2_mobile_tagging:!1,multiple_inputs:!1,dialog_action:"",dialog_type:"",is_coordinates_used_for_interaction:l!==null&&!c,element_coordinates_ratio:[],element_bounds_ratio:[],x_coord:c?null:l?.x??null,y_coord:c?null:l?.y??null,target_x_coord:o.target_x??null,target_y_coord:o.target_y??null,source_description:o.source_description??null,target_description:o.target_description??null,use_coordinates:l!==null&&!c,kaneaiMobileTaggingImageLimit:1,clicks_order_code:"se_js_ac",selector:c?r.map(y=>({type:y.isXPath?"xpath":"css",...y})):"",selector_target:"",math_result_variable_name:"",math_result_variable_value:"",expression_tree:a==="ASSERTION"?_e(o):o.expression_tree??{},assertion_tree:o.assertion_tree??{},assertion_tree_simplified:{},network_throttle:{},is_mobile_offline:!1,autoheal:!1,db_query:"",db_details:{},db_query_decoded:"",is_global_variable:!1,is_global_variable_persist:!1,global_variable_id:"",wait_for_element_timeout:0,failure_condition:a==="ASSERTION"?"Fail test immediately":"",screenshot_command:"",smartui_contents:{},smartui_results:{},result_type:"",result_hint:"",drag_offset:{},start_coordinates:o.source_coordinates?{x:o.source_coordinates[0],y:o.source_coordinates[1]}:{},end_coordinates:o.target_coordinates?{x:o.target_coordinates[0],y:o.target_coordinates[1]}:{},element_rect:null,is_canvas:!1,until_condition:"",until_max_retries:0,until_settle_ms:0,api_data:s==="api"?{request:t.action_params?.api_data?.request??{}}:{},output_variables:s==="api"?t.output_variable?{[t.output_variable]:null}:{}:t.output_variable?{[t.output_variable]:t.output_value??""}:{},visual_context:ge(t,i,d,n),reasoning:s==="analyze"?o.query??"":t.intent??t.action_instruction??""}}function q(t,e,i={}){let n=t.action_type,s=X(n,t),a=t.timestamp??"",o=t.duration_ms??0,l=Y(a,o),r=s==="ASSERTION"||s==="MATHEMATICAL_OPERATION";return{instruction_id:e.instruction_id,instruction_class:r?"non_driver_action":"driver_action",module_id:"",instruction:L(t.action_instruction??"",i),command:s,error:null,parent_instruction_id:"",classification_layer_resp:s==="ASSERTION"?pe(t):[],classification_error:{},operations:[e],status:t.status??"",start_timestamp:a,end_timestamp:l,type:"agent_generated",tags:[],html_paths:[],optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,content_type:n==="api"?"api":n==="analyze"&&t.action_params?.analyzer_type==="api_response"?"api_calls_query":n==="analyze"&&t.action_params?.analyzer_type?.startsWith("devtool_")?t.action_params.analyzer_type.replace("devtool_","devtools_"):"instruction",js_snippet:n==="evaluate_js"?t.action_params?.script??"":"",user_variables:n==="api"?ce(t):"[]",api_data:n==="api"?{request:t.action_params?.api_data?.request??{},response:H(t)}:{},params_used:!1,hard_assertion:s==="ASSERTION"?t.action_params?.failure_condition==="hard":!1,expected_outcome:"",module_execution_index:0,module_version:null,network_throttle:{},isEdited:!1,use_query_assertion_v2:!1,db_query:"",db_details:{},network_assertion_content:{},screenshot_command:"",smartui_contents:{},generative_id:"",plan_id:"",generative_objective:"",error_message:"",error_code:"",reason:"",title:"",used_variables:[],reasoning:n==="analyze"?t.action_params?.query??"":t.intent??t.action_instruction??""}}function me(t,e=[]){let i=t.action_params??{},n=i.branches??[],s=i.winning_index??-1,a=i.sub_results??[],o={};for(let r of a){let c=r.sub_results;if(c)for(let u of c){let p=u.store_key;p&&(o[p]=u)}}let l=n.map((r,c)=>{let u=c===s,p=(r.sub_checks??[]).map(_=>{let d=o[_.store_key];return{description:_.description,store_key:_.store_key,expected_value:_.expected_value,stored_value:d?.extracted_value??_.stored_value,operator:_.operator??d?.operator??"equals",transforms:_.transforms??d?.transforms??[]}});if(p.length===0&&r.condition&&a.length>0){let d=a.find(g=>g.branch_index===c)?.sub_results??[];d.length>0&&(p=d.map(g=>({description:g.description??r.condition,store_key:g.store_key??"",expected_value:g.expected??"true",stored_value:g.extracted_value??void 0,operator:g.operator??"equals",transforms:g.transforms??[]})))}return{branch_index:c,condition:r.condition??null,branch_type:r.branch_type??"sub_objective",passed:u,sub_objective:null,custom_event:r.custom_event??null,children:u?e:[],sub_checks:r.condition?p:[],composite_operator:r.composite_operator??"and"}});return{content_type:"conditional_block",instruction_id:`if_else_${P().slice(0,8)}`,instruction:t.action_instruction??"",instruction_class:"driver_action",command:"",status:t.status??"success",resolved_branch_index:s,branches:l,generative_id:"",generative_objective:"",variables_used:{},classification_layer_resp:[],classification_error:{},used_variables:[],user_variables:"[]",module_id:"",module_execution_index:0,module_version:"",plan_id:"",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,error:null,error_message:"",error_code:"",reason:"",start_timestamp:t.timestamp??"",end_timestamp:"",type:"agent_generated",hook:null,hook_type:null,evaluation_context:{},query_variables:{}}}function J(t,e,i){for(let n of t)n.content_type==="instruction"&&"generative_id"in n&&(n.generative_id=e,n.generative_objective=i)}function w(t,e={},i="",n,s){let a=[],o=0;for(;o<t.length;){let l=t[o],r=l.action_type;if(!s?.keepFailedActions&&l.status==="error"&&r!=="assert"&&r!=="if_else"&&r!=="child_agent_start"&&r!=="child_agent_end"&&!(l.until_condition&&!l.error)){o+=1;continue}if(r==="analyze"&&!G[l.action_params?.analyzer_type??""]){o+=1;continue}if(r==="child_agent_start"){let c=l.action_params?.child_id??"",u=l.action_params?.objective??"",p=[];o+=1;let _=1,d="error",g;for(;o<t.length&&_>0;){let R=t[o],y=R.action_type;if(y==="child_agent_start")_+=1;else if(y==="child_agent_end"&&(_-=1,_===0)){d=R.status??"success",g=R,o+=1;break}_>0&&p.push(R),o+=1}let m=w(p,e,i,n);J(m,c,u);let f=g?.action_params?.result_code??null,h=g?.action_params?.reason_code??null,b=g?.action_params?.error_message??null,I=g?.action_params?.summary??null,v=g?.action_params?.one_liner??null,k=d==="error";a.push({content_type:"generative_block",instruction_id:`generative_block_${c}`,generative_id:c,objective:u,status:d,children:m,error_message:k?b??null:null,error_code:k?h??null:null,result_code:f??null,bifurcation_context:[],approach_reason:K(I),one_liner:v??null});continue}else if(r==="child_agent_end"){o+=1;continue}else if(r==="if_else"){o+=1;let c=[];for(;o<t.length&&t[o].action_type==="child_agent_start";){let u=t[o],p=u.action_params?.child_id??"",_=u.action_params?.objective??"",d=[];o+=1;let g=1,m="error";for(;o<t.length&&g>0;){let h=t[o];if(h.action_type==="child_agent_start")g+=1;else if(h.action_type==="child_agent_end"&&(g-=1,g===0)){m=h.status??"success",o+=1;break}g>0&&d.push(h),o+=1}let f=w(d,e,i,n);c.push(...f)}a.push(me(l,c));continue}else if(r==="query_tool"){o+=1;continue}else if(l.until_condition){let c=V(l,e,i,n),u=q(l,c,e),p=typeof l.until_condition_met=="boolean"?l.until_condition_met:l.status==="success";a.push({content_type:"until_block",instruction_id:`until_${P().slice(0,8)}`,condition:l.until_condition,max_retries:l.until_max_retries??10,settle_ms:l.until_settle_ms??500,current_count:0,condition_met:p,children:[u],generative_id:"",generative_objective:"",variables_used:{},status:l.status??"success"})}else{let c=V(l,e,i,n),u=q(l,c,e);a.push(u)}o+=1}return a}function T(t,e={},i="",n,s){let a=[];for(let o of t){let l=w(o.records,e,i,n,s);if(l.length===0)continue;let r=P().replace(/-/g,"");J(l,r,o.objective);let c=l.some(d=>"status"in d&&typeof d.status=="string"?d.status==="error"||d.status==="failed":!1),u=o.resultCode?parseInt(o.resultCode,10):null,p=u!==null&&!isNaN(u)&&u>=200,_=c||p?"error":"success";a.push({content_type:"generative_block",instruction_id:`generative_block_${r}`,generative_id:r,objective:o.objective,status:_,children:l,error_message:_==="error"?o.errorMessage??null:null,error_code:_==="error"?o.reasonCode??null:null,result_code:o.resultCode??null,bifurcation_context:[],approach_reason:K(o.summary),one_liner:o.oneLiner??null})}return{instructions:a}}var Z=se(oe(),1);import{createWriteStream as he}from"fs";import{readFile as Ee}from"fs/promises";import{join as be,basename as Ie}from"path";import{tmpdir as ve}from"os";var ye=["**/screenshots/**","**/annotated/**","**/tcg/**","**/bifurcation/**"];async function Q(t){let e=be(ve(),`${Ie(t)}_artifacts.zip`);return new Promise((i,n)=>{let s=he(e),a=(0,Z.default)("zip",{zlib:{level:6}});s.on("close",()=>i(e)),a.on("error",n),a.pipe(s),a.glob("**/*",{cwd:t,ignore:ye}),a.finalize()})}async function ee(t){return Ee(t)}async function Pe(t,e){return ie(z(t,e))}function ke(t){return{key:"artifacts",content_type:"application/zip",filename:`${t}.evidence`}}var ne=class{config;controller;testId;constructor(e){this.config=e,this.controller=new F(e.controllerBaseUrl,e.auth),this.testId=e.testId}log(e,i,n,s){this.config.log?.(e,i,n,s)}async execute(){let{onProgress:e}=this.config;try{if(!this.testId)return this.log("error","PIPELINE_ABORT","No test_id available"),{success:!1,testId:null,error:"No test_id available"};let i=this.config.evidence,n=null;if(this.config.shouldUploadArtifacts!==!1){e("convert","running");let l=this.collectNdjsonPerRun(),r=l.reduce((m,f)=>m+f.records.length,0);this.log("info","PIPELINE_CONVERT","Collected NDJSON records",{total_records:r,run_groups:l.length});let c=this.config.variables??{};this.log("info","PIPELINE_CONVERT_VARS","Variables for template resolution",{keys:Object.keys(c)});let{instructions:u}=l.length>0?T(l,c,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap):{instructions:[]};this.log("info","PIPELINE_CONVERT_INSTRUCTIONS","Auteur instructions produced",{count:u.length});let p=this.buildExecutionEnvelope(u),_=Buffer.from(JSON.stringify(p));this.log("info","PIPELINE_CONVERT_BLOB","Blob created",{size_kb:+(_.length/1024).toFixed(1)});let d=E(this.config.sessionDir,"execution.json");x(d,JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_LOCAL_SAVE","Execution blob saved locally",{path:d});let g=i?.packTestDir??this.config.evidenceRead?.packTestDir;if(g){let m=E(g,"auteur");D(m,{recursive:!0}),x(E(m,"execution.json"),JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack",{path:E(m,"execution.json")})}if(e("convert","done"),i)n=_;else{e("zip","running"),this.log("info","PIPELINE_ZIP_START","Zipping session",{session_dir:this.config.sessionDir});let m=null,f;try{m=await Q(this.config.sessionDir),f=await ee(m),this.log("info","PIPELINE_ZIP_DONE","Zip complete",{size_mb:+(f.length/1024/1024).toFixed(1),path:m}),e("zip","done",`${(f.length/1024/1024).toFixed(1)}MB`)}finally{m&&await Ae(m).catch(()=>{})}e("presign","running"),this.log("info","PIPELINE_PRESIGN_START","Requesting presigned URLs",{url:`${this.config.controllerBaseUrl}/upload/presign`,test_id:this.testId,session_id:this.config.sessionId});let h=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"artifacts",content_type:"application/zip",filename:`${this.config.sessionId}_artifacts.zip`},{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:h.urls.artifacts?.blob_url,blob_url:h.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading artifacts and blob",{artifact_size_mb:+(f.length/1024/1024).toFixed(1),blob_size_kb:+(_.length/1024).toFixed(1)}),await Promise.all([A(h.urls.artifacts.upload_url,f,"application/zip"),A(h.urls.blob.upload_url,_,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}}else{let l=this.collectNdjsonPerRun(),r=this.config.variables??{},{instructions:c}=l.length>0?T(l,r,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{keepFailedActions:!0}):{instructions:[]},u=this.buildExecutionEnvelope(c),p=E(this.config.sessionDir,"execution.json");x(p,JSON.stringify(u,null,2)),this.log("info","PIPELINE_LOCAL_SAVE","Execution blob saved locally (no upload)",{path:p});let _=this.config.evidence?.packTestDir??this.config.evidenceRead?.packTestDir;if(_){let d=E(_,"auteur");D(d,{recursive:!0});let g=this.readAuthoredExecution();x(E(d,"execution.json"),g??JSON.stringify(u,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack (gated)",{path:E(d,"execution.json"),source:g?"authored":"run_envelope"})}e("convert","skipped"),e("zip","skipped"),e("presign","skipped"),e("upload","skipped"),this.log("info","PIPELINE_UPLOAD_SKIPPED","Upload steps skipped (gate disabled)")}if(this.config.shouldReplaceLocalOutput&&this.config.onAtomicReplace){e("atomic_replace","running");try{await this.config.onAtomicReplace(),this.log("info","PIPELINE_ATOMIC_REPLACE_OK","Local output replaced"),e("atomic_replace","done")}catch(l){let r=l instanceof Error?l.message:String(l);throw this.log("error","PIPELINE_ATOMIC_REPLACE_FAILED","Atomic-replace failed",{error:r}),e("atomic_replace","failed",r),l}}else e("atomic_replace","skipped");let s,a;if(this.config.shouldCommit&&!this.config.isFirstRun&&this.config.onCommitLock){e("commit_lock","running");let l=await this.config.onCommitLock();if(l.ok)s=l.testcaseId,this.log("info","PIPELINE_COMMIT_LOCK_OK","Commit lock acquired",{testcase_id:s??"none"}),e("commit_lock","done");else return this.log("error","PIPELINE_COMMIT_LOCK_FAILED","Commit lock failed",{reason:l.reason,message:l.message}),e("commit_lock","failed",`${l.reason??"unknown"}: ${l.message??""}`),{success:!1,testId:this.testId,error:`commit-lock failed: ${l.reason??"unknown"}`}}else e("commit_lock","skipped");if(this.config.isFirstRun&&!this.config.skipTmsFinalize){e("finalize","running"),this.log("info","PIPELINE_FINALIZE_START","Finalizing test (first-run)",{test_id:this.testId,commit_id:this.config.commitId});let l=new U(this.config.tmsBaseUrl,this.config.tmsUsername,this.config.tmsAccessKey),r=this.config.runObjectives&&this.config.runObjectives.length>0?this.config.runObjectives:[this.config.firstObjective];if(s=(await l.endTest(this.testId,{commit_id:this.config.commitId,time_taken:Math.round(this.config.totalDuration),steps_count:this.config.totalSteps,commit_message:this.config.firstObjective.slice(0,255),objectives:r})).testcase_id||void 0,this.log("info","PIPELINE_FINALIZE_OK","Test finalized",{testcase_id:s??"none"}),this.config.onFinalizeSuccess)try{await this.config.onFinalizeSuccess(s)}catch(u){this.log("warn","PIPELINE_FINALIZE_META_FAILED","Meta-rewrite after endTest failed",{error:String(u)})}e("finalize","done")}else e("finalize","skipped"),this.log("info","PIPELINE_FINALIZE_SKIPPED","Finalize skipped (evolve flow or first-run disabled)");if(s&&this.config.shareApiBaseUrl)try{a=await this.generateShareLink(s),this.log("info","PIPELINE_SHARE_OK","Share link generated",{share_id:a})}catch(l){this.log("warn","PIPELINE_SHARE_FAILED","Share link failed",{error:String(l)})}if(i&&n){let l=null;e("zip","running");try{await i.sealFn({testcaseId:s,shareId:a}),l=i.sealedPackPath?await ie(i.sealedPackPath):await Pe(i.executionId,i.cwd),this.log("info","PIPELINE_EVIDENCE_SEALED","Evidence pack sealed",{execution_id:i.executionId}),this.log("info","PIPELINE_PACK_READ","Sealed pack read",{size_mb:+(l.length/1024/1024).toFixed(1)})}catch(r){let c=r instanceof Error?r.message:String(r);this.log("warn","PIPELINE_EVIDENCE_UPLOAD_SKIPPED","Evidence seal/read failed \u2014 uploading blob only",{execution_id:i.executionId,error:c})}if(l){e("zip","done",`${(l.length/1024/1024).toFixed(1)}MB`),e("presign","running");let r=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[ke(i.executionId),{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:r.urls.artifacts?.blob_url,blob_url:r.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading pack and blob",{artifact_size_mb:+(l.length/1024/1024).toFixed(1),blob_size_kb:+(n.length/1024).toFixed(1)}),await Promise.all([A(r.urls.artifacts.upload_url,l,"application/zip"),A(r.urls.blob.upload_url,n,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}else{e("zip","skipped"),e("presign","running");let r=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading blob only (evidence skipped)",{blob_size_kb:+(n.length/1024).toFixed(1)}),await A(r.urls.blob.upload_url,n,"application/json"),this.log("info","PIPELINE_UPLOAD_OK","Blob upload complete (pack skipped)"),e("upload","done")}}let o;if(this.config.codeExport?.enabled&&s){let l=!1;try{await this.triggerCodeExport(s),this.log("info","PIPELINE_CODE_EXPORT_START","Code export triggered"),l=!0}catch(r){let c=r instanceof Error?r.message:String(r);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export trigger failed; skipping poll",{error:c}),e("code_export","failed",`trigger failed: ${c}`)}if(l){e("code_export","running","Waiting for code generation\u2026");try{o=await this.pollAndDownloadCode(s,e),this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:o}),e("code_export","done",o)}catch(r){let c=r instanceof Error?r.message:String(r);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:c}),e("code_export","failed",c)}}}else e("code_export","skipped");return this.log("info","PIPELINE_COMPLETE","Pipeline complete"),{success:!0,testId:this.testId,testcaseId:s,shareId:a,codeExportDir:o}}catch(i){return{success:!1,testId:this.testId,error:i instanceof Error?i.message:String(i)}}}async runCodeExport(e,i){let n=i??this.config.onProgress,s=!1;try{await this.triggerCodeExport(e),this.log("info","PIPELINE_CODE_EXPORT_TRIGGER","Code export triggered",{testcase_id:e}),s=!0}catch(a){let o=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_TRIGGER_FAILED","Code export trigger failed; skipping poll",{error:o}),n("code_export","failed",`trigger failed: ${o}`)}if(s){n("code_export","running","Waiting for code generation\u2026");try{let a=await this.pollAndDownloadCode(e,n);return this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:a}),n("code_export","done",a),a}catch(a){let o=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:o}),n("code_export","failed",o);return}}}collectNdjsonPerRun(){let e=[],i=this.config.runObjectives??[],n=this.config.runMetadata??[],s=this.config.evidence??this.config.evidenceRead;for(let a=0;a<this.config.runDirs.length;a++){let o=this.config.runDirs[a],l=i[a]||this.config.firstObjective,r=n[a],c=s?this.readNdjsonFromFile(E(s.packTestDir,"logs",`${s.runIndices?.[a]??a}-actions.ndjson`)):this.readNdjsonFromDir(o);c.length>0&&e.push({objective:l,records:c,resultCode:r?.resultCode,reasonCode:r?.reasonCode,errorMessage:r?.errorMessage,summary:r?.summary,oneLiner:r?.oneLiner})}if(e.length===0){let a=E(this.config.sessionDir,"runs");if(C(a))try{let l=Re(a,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>r.name).sort();for(let r of l){let c=E(a,r),u=this.readNdjsonFromDir(c);u.length>0&&e.push({objective:this.config.firstObjective,records:u})}}catch{}}return e}readNdjsonFromDir(e){let i=[E(e,"run-test","actions.ndjson"),E(e,"actions.ndjson")];for(let n of i)if(C(n))return this.readNdjsonFromFile(n);return[]}readNdjsonFromFile(e){let i=[];if(!C(e))return i;this.log("debug","PIPELINE_COLLECT_READ","Reading NDJSON file",{path:e});let n=te(e,"utf-8");for(let s of n.split(`
5
5
  `)){let a=s.trim();if(a)try{i.push(JSON.parse(a))}catch{}}return i}async generateShareLink(e){let i=`${this.config.shareApiBaseUrl}/lshs/api/v1.0/share-item/generate-sharable-link`;this.log("info","PIPELINE_SHARE_START","Requesting share link",{url:i,testcase_id:e});let n={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({entityIds:[e],entityType:"Test Case Details",expiresAt:7})},s=!!this.config.authResolver;this.log("debug","PIPELINE_SHARE_AUTH","Share link auth config",{resolver:s,fallback_auth_type:typeof this.config.auth=="string"?"bearer":"basic",tms_user:this.config.tmsUsername});let a=s?await this.config.authResolver.fetch(i,n):await O(i,{...n,headers:{...n.headers,Authorization:this.buildAuthHeader()}});if(!a.ok)throw new Error(`Share link API failed: ${a.status} ${await a.text()}`);let o=await a.json();if(!o.shareId)throw new Error("Share link API returned no shareId");return o.shareId}async triggerCodeExport(e){if(!this.config.codeExport)throw new Error("triggerCodeExport called without resolved codeExport config");let{url:i,body:n}=M({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e,codeExport:this.config.codeExport});this.log("info","PIPELINE_CODE_EXPORT_POST","Triggering code export",{url:i});let s={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(n)},a=this.config.authResolver?await this.config.authResolver.fetch(i,s):await O(i,{...s,headers:{...s.headers,Authorization:this.buildAuthHeader()}});if(!a.ok)throw new Error(`Code export failed: ${a.status} ${await a.text()}`)}async pollAndDownloadCode(e,i){let n=B({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e}),s=this.config.exitTimeoutMs??3e5,a=5e3,o=Date.now()+s;this.log("info","PIPELINE_CODE_EXPORT_POLL","Polling for code export",{url:n,timeout_ms:s});let l=(r,c)=>this.config.authResolver?this.config.authResolver.fetch(r,c):O(r,{...c,headers:{...c?.headers,Authorization:this.buildAuthHeader()}});for(;Date.now()<o;){let r=await l(n,{method:"GET",headers:{Accept:"application/json"}});if(!r.ok){let d=await r.text().catch(()=>"");throw this.log("warn","PIPELINE_CODE_EXPORT_POLL_FAILED","Code export poll non-200; skipping",{status:r.status,body:d.slice(0,200)}),new Error(`code export poll skipped: HTTP ${r.status}`)}let u=(await r.json()).data?.find(d=>d.code_name==="kane-cli-trigger");if(!u){this.log("debug","PIPELINE_CODE_EXPORT_WAITING","No kane-cli-trigger entry yet"),i("code_export","running","Waiting for code generation\u2026"),await this.sleep(a);continue}let p=u.status.toLowerCase();if(p==="in progress"||p==="in_progress"||p==="pending"){this.log("debug","PIPELINE_CODE_EXPORT_IN_PROGRESS","Code export in progress",{status:u.status}),i("code_export","running","Generating code\u2026"),await this.sleep(a);continue}if(!u.url||u.url.length===0)throw new Error(`Code export status=${u.status} but no files returned`);let _=this.config.codeExportDir??E(this.config.sessionDir,"code-export");D(_,{recursive:!0}),this.log("info","PIPELINE_CODE_EXPORT_DOWNLOAD","Downloading code files",{file_count:u.url.length,dir:_}),i("code_export","running",`Downloading ${u.url.length} files\u2026`);for(let d of u.url){let g=E(_,d.file_name),m=await O(d.file_url);if(!m.ok){this.log("warn","PIPELINE_CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:d.file_name,status:m.status});continue}let f=await m.text();x(g,f,"utf-8"),this.log("info","PIPELINE_CODE_EXPORT_FILE_SAVED","File saved",{file_name:d.file_name,size_bytes:f.length})}return _}throw new Error("Code export timed out")}sleep(e){return new Promise(i=>setTimeout(i,e))}buildAuthHeader(){return typeof this.config.auth=="string"?`Bearer ${this.config.auth}`:j(this.config.auth.username,this.config.auth.accessKey)}readAuthoredExecution(){let e=this.config.authoredExecutionPath;if(!e)return null;try{let i=te(e,"utf8");return JSON.parse(i),i}catch{return this.log("warn","PIPELINE_AUTHORED_BLOB_UNREADABLE","Authored execution.json missing/unreadable \u2014 pack gets this run's envelope",{path:e}),null}}buildExecutionEnvelope(e){let i=this.config.runStatuses.every(r=>r==="passed")?"success":"error",n=this.config.variableIds??{},s=[];if(this.config.variables)for(let[r,c]of Object.entries(this.config.variables)){if(c.secret)continue;let u=r.startsWith("global.")?r.slice(7):r;s.push({id:n[u]??0,name:u,value:c.value,session_value:c.value,is_persist:!1,environment_id:0,environment_name:"No Env"})}let a=[],o=[],l=new Set;for(let r of this.collectNdjsonPerRun())for(let c of r.records)if(c.output_variable&&c.output_value!=null&&a.push({name:c.output_variable,value:String(c.output_value),value_type:"test_level",variable_description:"ANALYZE result"}),c.action_type==="upload_files"){let u=S(c.action_params);if(u){let p=u.media_id||u.media_url;if(!l.has(p)){l.add(p),o.push({media_url:u.media_url,media_id:u.media_id,name:u.name,type:u.type});let _=N(u.name);a.push({name:$(u.name),value:_,value_type:"string",variable_description:`variable for ${_}`})}}}return{test_id:this.testId,version:"v4",auto_heal_version:this.config.apMode==="v2"?"AH2":"",session_id:this.config.sessionId,org_id:String(this.config.orgId),user_id:String(this.config.userId),url:this.config.firstUrl??"",start_timestamp:this.config.startedAt,end_timestamp:this.config.endedAt,status:i,commit_id:this.config.commitId,instructions:e,modules:[],uploaded_files:o,test_params:[],test_level_variables:JSON.stringify(a),test_global_variables:s,max_network_wait:0,wait_buffer:0,network_throttle:{},secrets:this.config.secrets??[],totp:[],environment_id:0,environment:"",mobile_browser:!1,native_popups:[],smartui:{},module_index:0}}};export{Pe as a,ke as b,ne as c};