@testmuai/kane-cli 0.7.0 → 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 (230) hide show
  1. package/dist/ChatSurface-D66CACLX.js +8 -0
  2. package/dist/{ChromeProfilePicker-DK2A3NYY.js → ChromeProfilePicker-4CDSPBWL.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-D5QDOBE2.js → CliFeedbackPrompt-TLRVBA4E.js} +1 -1
  4. package/dist/{CliUploadProgress-AIZL7N6Z.js → CliUploadProgress-WGGFLUSF.js} +1 -1
  5. package/dist/{ConfigView-SDBCTYUU.js → ConfigView-DBANTBXC.js} +1 -1
  6. package/dist/EvidenceViewOffer-DNCQ3A6R.js +2 -0
  7. package/dist/{FolderPicker-IVBHPPMW.js → FolderPicker-W7RCIFEL.js} +1 -1
  8. package/dist/{HelpView-YYYX4RKI.js → HelpView-FBCX32U7.js} +1 -1
  9. package/dist/{InfoBox-MQV3XBT4.js → InfoBox-KK2ICVS4.js} +1 -1
  10. package/dist/{LinksBox-NCFNBUMW.js → LinksBox-KKRANMR3.js} +1 -1
  11. package/dist/{ProfilesView-6GXF6CP2.js → ProfilesView-DGPXSAQN.js} +1 -1
  12. package/dist/{ProjectPicker-W6XDGNDJ.js → ProjectPicker-ESQSL4TT.js} +1 -1
  13. package/dist/{SaveSessionPrompt-QF3P7ERS.js → SaveSessionPrompt-AQGP5W6E.js} +1 -1
  14. package/dist/SingleShotApp-SMCAIKCE.js +2 -0
  15. package/dist/{SummaryBox-4SZI4XSO.js → SummaryBox-BFZJW2KK.js} +1 -1
  16. package/dist/TestMdRunView-FMKZJ3A3.js +2 -0
  17. package/dist/{WhoamiView-N3HAJ3TN.js → WhoamiView-JABY3I5Q.js} +1 -1
  18. package/dist/{auth-RXNBQZI2.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-MI3IPBJS.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-GQ3NCBYR.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-DFDDUMG5.js → chunk-322JEJEH.js} +1 -1
  29. package/dist/{chunk-4BAMZSFU.js → chunk-323MLBYA.js} +1 -1
  30. package/dist/{chunk-VYMCE7UR.js → chunk-33QXD75Y.js} +2 -2
  31. package/dist/{chunk-K7USHLVZ.js → chunk-36OC3TFE.js} +1 -1
  32. package/dist/{chunk-4SJC64KQ.js → chunk-3FN5VJMV.js} +1 -1
  33. package/dist/chunk-3LWTUMDG.js +2 -0
  34. package/dist/chunk-3STZLM5J.js +4 -0
  35. package/dist/{chunk-4GLYNAK7.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-EN7NW7DU.js → chunk-6HEGD6H2.js} +1 -1
  39. package/dist/{chunk-AV6E6WLY.js → chunk-6UJDOAYR.js} +2 -2
  40. package/dist/{chunk-5WE4DHXL.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-J3EMJ7US.js → chunk-APAIWBIH.js} +1 -1
  45. package/dist/{chunk-XIXR63FI.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-B4LLKQTK.js → chunk-C4G7RVJ6.js} +1 -1
  49. package/dist/{chunk-YHQFYZJ5.js → chunk-CDQX6HGJ.js} +1 -1
  50. package/dist/{chunk-XLKRV2JH.js → chunk-CSQ46PJ7.js} +1 -1
  51. package/dist/chunk-DQ54MH7F.js +13 -0
  52. package/dist/{chunk-T7ZPMTGS.js → chunk-DXV6MBTD.js} +1 -1
  53. package/dist/chunk-DYW5C6II.js +2 -0
  54. package/dist/{chunk-WREVEATJ.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-AYY7RYMK.js → chunk-HPMS5KO6.js} +2 -2
  59. package/dist/{chunk-3RZ63RBO.js → chunk-IBNC444G.js} +1 -1
  60. package/dist/{chunk-WTXHOWUP.js → chunk-IQDWBTRJ.js} +1 -1
  61. package/dist/{chunk-5YHVK2EO.js → chunk-IXVOXJP6.js} +1 -1
  62. package/dist/{chunk-IQODWB32.js → chunk-JEUA4UWK.js} +1 -1
  63. package/dist/{chunk-CH3VWCRZ.js → chunk-JKTFTF24.js} +1 -1
  64. package/dist/{chunk-A2IQRVPR.js → chunk-JRMDGLLT.js} +1 -1
  65. package/dist/{chunk-RQYS3KGU.js → chunk-KNDSQ4PS.js} +1 -1
  66. package/dist/chunk-KRXSXQBU.js +12 -0
  67. package/dist/{chunk-NR23HZU4.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-X5P2T7MA.js → chunk-L7VREJTG.js} +1 -1
  72. package/dist/{chunk-QQUZF2DZ.js → chunk-LQZ2BU7Q.js} +1 -1
  73. package/dist/{chunk-MTHCUBDF.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-CSGQIY7X.js → chunk-NAE7MBR2.js} +3 -3
  77. package/dist/{chunk-LGVHW4ZA.js → chunk-NBKQT7LJ.js} +1 -1
  78. package/dist/{chunk-RODHDQU3.js → chunk-NJPTOKW5.js} +1 -1
  79. package/dist/{chunk-44IWSV6L.js → chunk-NOCIMJSN.js} +1 -1
  80. package/dist/chunk-NRC2G4Y5.js +5 -0
  81. package/dist/{chunk-67SSEGDO.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-AIMINJVP.js → chunk-R2RGSO4B.js} +1 -1
  87. package/dist/{chunk-77WMTCUQ.js → chunk-RNSSM2BK.js} +1 -1
  88. package/dist/chunk-SE6WNCYU.js +4 -0
  89. package/dist/{chunk-KCBS57IF.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-SBZWFULF.js → chunk-UBFKZEX3.js} +1 -1
  94. package/dist/{chunk-E5PWL3BG.js → chunk-UI7KULSI.js} +1 -1
  95. package/dist/chunk-UPPEOQJQ.js +3 -0
  96. package/dist/{chunk-QBCS57EO.js → chunk-URQUQWGW.js} +3 -3
  97. package/dist/chunk-UX2B7L6K.js +2 -0
  98. package/dist/{chunk-K4VIM4RM.js → chunk-V36ATG7A.js} +2 -2
  99. package/dist/chunk-VGFTNLQQ.js +2 -0
  100. package/dist/{chunk-VJFFMOUA.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-MV4UYTZT.js → chunk-X3ICV5M5.js} +1 -1
  105. package/dist/chunk-XDHZMCTA.js +4 -0
  106. package/dist/{chunk-BCH3JCND.js → chunk-XVDJ423L.js} +1 -1
  107. package/dist/chunk-ZLCZDAEX.js +6 -0
  108. package/dist/{chunk-HOOXUO3X.js → chunk-ZM5PVRJK.js} +1 -1
  109. package/dist/committer-2EJPVVCQ.js +2 -0
  110. package/dist/{config-5GOFF5F4.js → config-R3GF2FZA.js} +1 -1
  111. package/dist/cover-cmd-TXICWHUU.js +3 -0
  112. package/dist/{credentials-GXDXVMXW.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-LZ4HRSQ4.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 +61 -62
  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-WIVODSEL.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-J6Z2SCTT.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-IRFMIZSJ.js → recording-banner-TALO7PUR.js} +1 -1
  148. package/dist/records-5SVUXJBW.js +2 -0
  149. package/dist/{require-project-folder-XSBJGIVF.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-QCERS7FQ.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-WAVEVCSG.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-IJKKRQRU.js → validate-basic-O2DP2XJL.js} +1 -1
  165. package/dist/verdicts-TJH3O5UW.js +2 -0
  166. package/dist/{version-check-O5GYZYTP.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-PMEOJBZG.js +0 -8
  172. package/dist/EvidenceViewOffer-EOKJE2B6.js +0 -2
  173. package/dist/SingleShotApp-T673X7BS.js +0 -2
  174. package/dist/TestMdRunView-SNYEO6CS.js +0 -2
  175. package/dist/bind-NSGW5BBZ.js +0 -6
  176. package/dist/bootstrap-RPT3JOGD.js +0 -2
  177. package/dist/bridge-BTSWCJ3B.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-3CJIMPQK.js +0 -14
  182. package/dist/chunk-4XSW6WZD.js +0 -5
  183. package/dist/chunk-6W6AIDLJ.js +0 -4
  184. package/dist/chunk-7E24OCGX.js +0 -2
  185. package/dist/chunk-7YPK6EDR.js +0 -4
  186. package/dist/chunk-DGIPQINV.js +0 -12
  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-J2KSZUOO.js +0 -4
  191. package/dist/chunk-J44RN3FB.js +0 -2
  192. package/dist/chunk-JSF5JYZC.js +0 -9
  193. package/dist/chunk-MAO5BAQI.js +0 -347
  194. package/dist/chunk-N4LMQR7C.js +0 -6
  195. package/dist/chunk-RCTM7NGT.js +0 -2
  196. package/dist/chunk-RN4OSVTG.js +0 -6
  197. package/dist/chunk-UXPQRALY.js +0 -13
  198. package/dist/chunk-V3UE6RJP.js +0 -2
  199. package/dist/chunk-Y5RNCJAN.js +0 -19
  200. package/dist/chunk-Z2JSEL3I.js +0 -4
  201. package/dist/cover-cmd-SV3I23UM.js +0 -2
  202. package/dist/dossier-KJSJPWOW.js +0 -3
  203. package/dist/evidence-VDNZ3K23.js +0 -2
  204. package/dist/evolve-cmd-BLSVVW4I.js +0 -2
  205. package/dist/explain-EBVIUS2X.js +0 -2
  206. package/dist/extract-bind-3SWPBZX6.js +0 -8
  207. package/dist/extract-cmd-HEX7F4IS.js +0 -6
  208. package/dist/gaps-cmd-CKCHH3HQ.js +0 -2
  209. package/dist/ingest-FIIO67ZN.js +0 -2
  210. package/dist/ingest-cmd-KRPZVB7W.js +0 -7
  211. package/dist/interactive-bind-PTAZVCE7.js +0 -10
  212. package/dist/lifecycle-cmd-32LG364Q.js +0 -2
  213. package/dist/list-cmd-UTZ2PQUK.js +0 -3
  214. package/dist/logical-ids-I7B3VJEH.js +0 -2
  215. package/dist/login-flow-GX7CTVWN.js +0 -2
  216. package/dist/maintenance-cmd-BZAGSYGI.js +0 -2
  217. package/dist/pipeline-HT7FCEXA.js +0 -2
  218. package/dist/readmodel-S5RAQH3F.js +0 -2
  219. package/dist/reconcile-cmd-2VHBKFA5.js +0 -2
  220. package/dist/revert-RQJE56HF.js +0 -2
  221. package/dist/review-cmd-7LXGYHHQ.js +0 -4
  222. package/dist/run-4LTYFTF2.js +0 -2
  223. package/dist/run-YGJZ2SXX.js +0 -2
  224. package/dist/sessions-cmd-DTQYDZNT.js +0 -23
  225. package/dist/spawner-YNYB4Z7K.js +0 -2
  226. package/dist/tcg-generate-D35EMRMQ.js +0 -2
  227. package/dist/testmd-actions-NB5Z6QJ3.js +0 -2
  228. package/dist/token-refresh-OY3WLAKD.js +0 -2
  229. package/dist/walk-session-OPAEV4WR.js +0 -2
  230. /package/dist/{chunk-BC7UVJJB.js → chunk-CH273NAE.js} +0 -0
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as le}from"./chunk-SWESH2J7.js";import{a as X,c as z,d as se}from"./chunk-3LWTUMDG.js";import{c as ae}from"./chunk-AH7ZZIZY.js";import"./chunk-QROUKGKU.js";import"./chunk-OHRS3H7Z.js";import"./chunk-AM5S4KG4.js";import"./chunk-5JTUL6XL.js";import{b as Q,c as oe,d as ie}from"./chunk-W5DOU2DV.js";import{a as U}from"./chunk-JEUA4UWK.js";import"./chunk-JFAFKHDX.js";import"./chunk-AAONIIQV.js";import"./chunk-ZLCZDAEX.js";import"./chunk-DNNZ353O.js";import"./chunk-QM4S2APK.js";import"./chunk-NVGBE2DR.js";import"./chunk-CH273NAE.js";import{a as _}from"./chunk-GW5DWAXY.js";import{b as ne}from"./chunk-T63R6QT4.js";import"./chunk-3STZLM5J.js";import"./chunk-L4JIMNKW.js";import{i as re}from"./chunk-M7WQM4UA.js";import"./chunk-WWNSD6FA.js";import"./chunk-IAHKTEET.js";import"./chunk-5YPBPZUR.js";import{a as G}from"./chunk-YCCUBQY4.js";import{y as l}from"./chunk-C4G7RVJ6.js";import{a as j}from"./chunk-HCBYKLMW.js";import{a as $,b as s,k as H}from"./chunk-C44QQJR4.js";import{a as xe}from"./chunk-6YGTRKDT.js";import{e as V}from"./chunk-UR6MHSHU.js";var S=V(xe(),1);function ce(e,v,R){let{ref:A,reason:d,by:y}=R;if(!d||d.trim().length===0)return{record:null,errors:[{code:"REASON_REQUIRED",detail:"archiving a node needs a reason \u2014 it becomes the tombstone's provenance"}]};let x=v.resolve(A);if(!x)return{record:null,errors:[{code:"UNKNOWN_REF",detail:`no node '${A}' in the graph`}]};let r=v.tipOf(x.cid);if(v.superseded.has(r))return{record:null,errors:[{code:"ALREADY_ARCHIVED",detail:`${A} is already superseded at its tip (${r.slice(0,19)}\u2026)`}]};let o=re(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[{kind:"node",old:r,new:null,reason:d,by:y}],source_head_moves:{}},{expectPrev:v.latestHash});return ne(e),{record:o.record,errors:null}}function de(e){let v=e.by??{kind:"human",id:process.env.USER??"operator"},R=e.mode==="interactive"?"override":e.mode,A={out:()=>{},err:()=>{},isTTY:!1,confirm:async()=>!0},d={applied:0,committed:0,retired:0,skipped:0,deferred:0,failed:0},y=new Map;for(let r of e.planRows)if(r.held_ref&&e.held){let o=e.held.rows.find(a=>a.temp_ref===r.held_ref);if(!o)continue;let k={kind:o.kind,ref:o.temp_ref,title:o.title,why:o.why,origin:"content-change",...r.impact?{impact:r.impact}:{}};y.set(k.ref,{card:k,source:"held",heldRef:o.temp_ref})}else if(r.kind==="MODIFY"){let o={kind:"MODIFY",ref:r.ref,title:r.ref,why:`${r.reason}: ${r.provenance}`,origin:r.origin??"structural-stale",...r.impact?{impact:r.impact}:{}};y.set(o.ref,{card:o,source:"row",row:r})}else if(r.kind==="ADD"){let o={kind:"ADD",ref:r.ref,title:r.ref,why:r.reason,origin:r.origin??"content-change"};y.set(o.ref,{card:o,source:"row",row:r})}for(let r of e.archive){if(r.kind!=="ARCHIVE")continue;let o={kind:"ARCHIVE",ref:r.ref,title:r.ref,why:r.why,provenance:r.why,...r.impact?{impact:r.impact}:{}};y.set(o.ref,{card:o,source:"archive",row:r})}for(let r of e.reviewFeeder?.()??[]){if(y.has(r.ref))continue;let o={kind:r.kind==="MODIFY_HELD"?"MODIFY":r.kind,ref:r.ref,title:r.title,why:r.why,...r.impact?{impact:r.impact}:{},...r.pair?{pair:r.pair}:{},...r.held?{held:!0}:{},...r.kind==="MODIFY_HELD"?{heldPayload:!0}:{}};y.set(o.ref,{card:o,source:"review",reviewCard:r})}let x=r=>(d.failed++,{outcome:"failed",detail:r});return{cards:()=>[...y.values()].map(r=>r.card),async submit(r,o){let k=y.get(r);if(!k)return x(`no card ${r}`);if(k.source==="review"){if(k.reviewCard.kind==="PAIR"&&o.v==="approve")return x(`${r} is a PAIR card \u2014 approve is not in its grammar (merge / keep both / defer); words ride a defer note`);let{submitReview:c}=await import("./verdicts-TJH3O5UW.js"),w=o.v==="approve"?{v:"approve"}:o.v==="archive"?{v:"archive",because:o.because??""}:o.v==="skip"&&k.reviewCard.kind==="MODIFY_HELD"?{v:"keep_current"}:o.v==="defer"||o.v==="skip"?{v:"defer"}:o.v==="merge"?{v:"merge"}:{v:"keep_both"},b=await c({contextDir:e.contextDir,signals:i=>e.signals({ref:i.ref,verdict:i.verdict,...i.reason?{reason:i.reason}:{}})},k.reviewCard,w,v);return b.outcome==="failed"?(d.failed++,b):b.outcome==="deferred"?(d.deferred++,o.v==="defer"&&o.note?(e.signals({ref:r,verdict:"deferred-with-note",reason:o.note}),{...b,detail:`steering noted: "${o.note}" \u2014 decide ${k.reviewCard.kind==="PAIR"?"merge / keep both":"the verdict"} when it re-offers`}):b):b.outcome==="retired"?(d.retired++,b):b.outcome==="committed"?(d.committed++,b):(d.applied++,b)}if(o.v==="merge"||o.v==="keep_both")return x(`${r} is a ${k.card.kind} card \u2014 ${o.v} applies to review cards only`);if(o.v==="skip")return d.skipped++,e.signals({ref:r,verdict:"gap-dismissed"}),{outcome:"skipped"};if(o.v==="defer")return d.deferred++,o.note?(e.signals({ref:r,verdict:"deferred-with-note",reason:o.note}),{outcome:"deferred",detail:`steering noted: "${o.note}"`}):{outcome:"deferred"};if(o.v==="archive"){if(k.source!=="archive")return x(`${r} is not an ARCHIVE card`);let c=_(e.contextDir),w=c.resolve(k.row.ref);if(w&&c.superseded.has(c.tipOf(w.cid)))return d.skipped++,{outcome:"skipped",detail:"already retired \u2014 nothing to do"};let b=ce(e.contextDir,_(e.contextDir),{ref:k.row.ref,reason:`reconcile retire: ${k.row.why}`,by:v});return b.errors?x(b.errors.map(i=>`${i.code}: ${i.detail}`).join("; ")):(d.retired++,e.signals({ref:r,verdict:"gap-resolved-archive",reason:k.row.why}),{outcome:"retired"})}if(k.source==="archive")return x(`${r} takes archive/skip/defer, not approve`);if(k.source==="held"){let c=le(e.contextDir,e.held,k.heldRef,v,o.edits);if(!c.ok)return x(c.message);if(c.kind==="ADD"){let w=await e.runDesign(c.ref,{yes:!0,mode:R,...o.steering?{because:o.steering}:{}});return w!==0?(d.failed++,{outcome:"failed",landed:!0,detail:`committed ${c.ref}, but its design run exited ${w} \u2014 finish with kane-cli design tests --use-case ${c.ref}`}):(d.applied++,e.signals({ref:r,verdict:"gap-resolved-create",...o.steering?{reason:o.steering}:{}}),{outcome:"applied",detail:c.ref})}if(o.steering){let w=_(e.contextDir),b=X(w,c.ref);if(!b.ok)return d.committed++,{outcome:"committed",detail:`committed ${c.ref}, but steering could not resolve it (${b.message}) \u2014 steer via kane-cli maintain evolve ${c.ref}`};let i=await z(e.contextDir,b.target,{yes:!0,mode:R,because:o.steering},A,e.runDesign,"batch");if(i.outcome==="no-design"){let u=await e.runDesign(b.target.seamRef,{yes:!0,mode:R,because:o.steering});return u!==0?(d.failed++,{outcome:"failed",landed:!0,detail:`committed ${c.ref}, but its steered design run exited ${u} \u2014 finish with kane-cli design tests --use-case ${b.target.seamRef}`}):(d.applied++,e.signals({ref:r,verdict:"gap-resolved-create",reason:o.steering}),{outcome:"applied",detail:c.ref})}return i.outcome==="failed"||i.outcome==="paused"?(d.failed++,{outcome:"failed",landed:!0,detail:`committed ${c.ref}, but the steering evolve ${i.outcome} (exit ${i.code}) \u2014 finish with kane-cli maintain evolve ${c.ref}`}):i.outcome==="declined"?(d.committed++,{outcome:"committed",detail:`committed ${c.ref} \u2014 the steering evolve was declined; re-run kane-cli maintain evolve ${c.ref}`}):(d.applied++,e.signals({ref:r,verdict:"gap-resolved-evolve",reason:o.steering}),{outcome:"applied",detail:c.ref})}return d.committed++,e.signals({ref:r,verdict:"gap-resolved-evolve"}),{outcome:"committed",detail:c.ref}}let a=_(e.contextDir),g=X(a,k.row.ref);if(!g.ok)return x(g.message);if(k.card.kind==="ADD"){let c=await e.runDesign(g.target.seamRef,{yes:!0,mode:R});return c!==0?x(`design run exited ${c}`):(d.applied++,e.signals({ref:r,verdict:"gap-resolved-create"}),{outcome:"applied"})}let C=await z(e.contextDir,g.target,{yes:!0,mode:R,...o.steering?{because:o.steering}:{}},A,e.runDesign,"batch");return C.outcome==="evolved"?(d.applied++,e.signals({ref:r,verdict:"gap-resolved-evolve",...o.steering?{reason:o.steering}:{}}),{outcome:"applied"}):C.outcome==="failed"||C.outcome==="paused"?x(`evolve ${C.outcome} (exit ${C.code})`):(d.skipped++,{outcome:"skipped",detail:C.outcome})},summary:()=>({...d})}}var f=V(j(),1);function L(e){return e.kind==="REVIEW"?[{v:"approve",label:"approve",detail:"mark it reviewed and trusted"},{v:"archive",label:"archive",detail:"reject it \u2014 asks for a reason; impact shown above"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="PAIR"?[{v:"merge",label:"merge",detail:"duplicate \u2014 fold into the older item (it stays unreviewed)"},{v:"keep_both",label:"keep both",detail:"genuinely distinct \u2014 promote both"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="ARCHIVE"?[{v:"archive",label:"retire",detail:"hidden from now on; history is kept and it can be reverted"},{v:"skip",label:"skip",detail:"keep it \u2014 decided, never re-offered"},{v:"defer",label:"defer",detail:"not now \u2014 the plan re-offers it"}]:e.heldPayload?[{v:"approve",label:"approve update",detail:"commit the held payload \u2014 impact preview above"},{v:"skip",label:"keep current",detail:"drop the held payload (the owner's disk state stays untouched)"},{v:"defer",label:"defer",detail:"not now \u2014 stays held"}]:[{v:"approve",label:"approve",detail:e.kind==="ADD"?"commit + design it":"commit the updated version (old\u2192new redirect)"},{v:"skip",label:e.origin==="content-change"?"reject":"skip",detail:e.origin==="content-change"?"drop the staged proposal \u2014 nothing committed":"leave it as is"},{v:"defer",label:"defer",detail:"not now \u2014 the plan keeps it staged"}]}function Y(e){return e.kind==="ARCHIVE"?null:L(e).length}var ye={ADD:{color:l.green??"green"},MODIFY:{color:"yellow"},ARCHIVE:{color:l.red},REVIEW:{color:"cyan"},PAIR:{color:"magenta"}},Re=60,$e=100;function ue({card:e,position:v,sel:R=0,focused:A=!1,freeText:d=null,editorIntent:y="steer"}){let{stdout:x}=H(),r=x?.columns??80,o=r<Re,k=Math.min(r-1,$e),a=L(e),g=Y(e),C=ye[e.kind],c=E=>A&&R===E?(0,f.jsx)(s,{color:l.assuranceAccent,children:"\u276F"}):" ",w=e.impact,b=w&&"stale_refs"in w&&w.stale_refs.length>0?`${e.kind==="ARCHIVE"?"retiring leaves":"approving marks"} ${w.stale_refs.length} item(s) stale`+((w.direct_refs?.length??0)>0?` \u2014 ${w.direct_refs.length} directly touched: ${w.direct_refs.join(", ")}`:""):w&&"design_children"in w?`${e.kind==="REVIEW"?"archiving drops":"merging folds"} ${w.design_children} design child(ren)`:null,i=`? reconcile \u2014 item ${v.n} of ${v.of}`,u=g!==null?"\u2191\u2193 \xB7 \u23CE select \xB7 1-9 \xB7 type = adjust \xB7 esc \xB7 nothing to undo":"\u2191\u2193 \xB7 \u23CE select \xB7 1-9 \xB7 esc \xB7 nothing to undo",I=(0,f.jsxs)($,{flexDirection:"column",children:[(0,f.jsx)($,{paddingLeft:2,children:(0,f.jsxs)(s,{bold:!0,children:[(0,f.jsx)(s,{color:C.color,children:`[${e.kind}]`}),` ${U(e.title)}`]})}),(0,f.jsx)($,{paddingLeft:2,children:(0,f.jsx)(s,{color:l.muted,children:e.why})}),b?(0,f.jsx)($,{paddingLeft:2,children:(0,f.jsx)(s,{color:l.muted,children:`impact: ${b}`})}):null,e.kind==="ARCHIVE"&&e.provenance&&e.provenance!==e.why?(0,f.jsx)($,{paddingLeft:2,children:(0,f.jsx)(s,{color:l.muted,children:e.provenance})}):null,(0,f.jsx)(s,{children:" "}),a.map((E,T)=>(0,f.jsxs)(s,{children:[c(T),` ${T+1}. ${E.label}`,(0,f.jsx)(s,{color:l.dim,children:` \u2014 ${E.detail}`})]},`o-${T}`)),g!==null||d&&y==="because"?d?(0,f.jsxs)($,{flexDirection:"column",children:[(0,f.jsxs)($,{children:[(0,f.jsxs)(s,{children:[(0,f.jsx)(s,{color:l.assuranceAccent,children:"\u276F"})," ",(0,f.jsx)(s,{color:l.dim,children:"\u270E "})]}),(0,f.jsx)(G,{value:d.value,onChange:d.onChange,onSubmit:d.onSubmit,onCancel:d.onCancel,placeholder:y==="because"?"why archive it?":"say what to adjust"})]}),(0,f.jsx)(s,{color:l.muted,children:y==="because"?" submits as: archive \xB7 your reason goes on the record":e.kind==="PAIR"?" submits as: defer \xB7 your note parks with the card (it re-offers)":" submits as: approve \xB7 your words steer the re-design"})]}):g!==null?(0,f.jsxs)(s,{children:[c(g)," ",(0,f.jsx)(s,{color:l.dim,children:e.kind==="PAIR"?"\u270E defer with a note \u2014 say what you noticed":"\u270E approve with changes \u2014 say what to adjust"})]}):null:null]});if(o)return(0,f.jsxs)($,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,f.jsx)(s,{bold:!0,color:l.assuranceAccent,children:i}),I,(0,f.jsx)(s,{color:l.muted,children:u})]});let D=Math.max(2,k-(3+i.length+1)),W=Math.max(2,k-(3+u.length+1));return(0,f.jsxs)($,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,f.jsxs)(s,{color:l.assuranceAccent,children:["\u2500\u2500 ",(0,f.jsx)(s,{bold:!0,children:i}),` ${"\u2500".repeat(D)}`]}),(0,f.jsx)(s,{children:" "}),I,(0,f.jsx)(s,{children:" "}),(0,f.jsxs)(s,{color:l.assuranceAccent,children:["\u2500\u2500 ",(0,f.jsx)(s,{color:l.muted,children:u}),` ${"\u2500".repeat(W)}`]})]})}var B=V(j(),1);function K({mark:e,markColor:v,color:R,indent:A=2,reserve:d=0,children:y}){let{stdout:x}=H(),r=(x?.columns??80)-d,o=A+e.length+1;return(0,B.jsxs)($,{children:[(0,B.jsx)($,{width:o,flexShrink:0,children:(0,B.jsx)(s,{color:v,children:`${" ".repeat(A)}${e}`})}),(0,B.jsx)($,{width:Math.max(20,r-o),children:(0,B.jsx)(s,{color:R,children:y})})]})}var p=V(j(),1);function me(e){return e.landed?"committed":e.outcome}var Ce={applied:{mark:"\u2714",color:"green"},committed:{mark:"\u2714",color:"green"},retired:{mark:"\u2714",color:"green"},skipped:{mark:"\xB7",color:"dim"},deferred:{mark:"\u2013",color:"dim"},failed:{mark:"\u2717",color:"red"}},q=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function De(e){return e.v==="archive"?"Retiring\u2026":e.v==="approve"&&e.steering?"Approving with your changes \u2014 committing, then re-designing\u2026":"Applying \u2014 committing\u2026"}function Te({controller:e,cards:v,note:R,markOutcome:A,routeChat:d,listEvolveTargets:y,barSubject:x,onFinish:r,onCtrlC:o,pauseRef:k}){let[a,g]=(0,S.useState)(v.length>0?{at:"card",idx:0,sel:0,editor:null}:{at:"done-panel",sel:0}),C=(0,S.useRef)(0),c=(0,S.useRef)(a);c.current=a;let w=(0,S.useRef)([]),[b,i]=(0,S.useState)(0),u=a.at==="busy"||a.at==="evolving";(0,S.useEffect)(()=>{if(!u)return;let t=setInterval(()=>i(n=>n+1),120);return()=>clearInterval(t)},[u]);let I=(0,S.useRef)(!1),D=()=>{R((0,p.jsx)(s,{color:l.dim,children:"walk paused \u2014 every verdict so far is committed; re-run the same command to continue"})),r(3)},W=()=>{if(I.current)return;I.current=!0;let t=c.current;if(t.at==="busy"||t.at==="evolving"){R((0,p.jsx)(s,{color:l.dim,children:"finishing the current item, then pausing\u2026"}));return}if(t.at==="done-panel"||t.at==="picker"||t.at==="why"||t.at==="view"){r(C.current);return}D()};k&&(k.current=W);let E=a.at==="card"||a.at==="busy"?v[a.idx]:null,T=()=>[{key:"finish",label:"finish"},...y?[{key:"evolve",label:"evolve another use-case\u2026"}]:[],...w.current.length>0?[{key:"view",label:"view what changed"}]:[]],P=()=>{let t=y?.()??[];if(t.length===0){R((0,p.jsx)(s,{color:l.dim,children:"nothing is stale \u2014 no evolve targets right now"})),g({at:"done-panel",sel:0});return}g({at:"picker",items:t,sel:0})},M=t=>{let n=t+1;if(n<v.length)g({at:"card",idx:n,sel:0,editor:null});else{let m=e.summary();R((0,p.jsx)(s,{color:l.dim,children:`reconcile walk: ${m.applied} applied, ${m.committed} committed, ${m.retired} retired, ${m.skipped} skipped, ${m.deferred} deferred`+(m.failed>0?`, ${m.failed} failed`:"")})),g({at:"done-panel",sel:0})}},N=(0,S.useRef)(!1),O=(t,n)=>{if(N.current)return;N.current=!0;let m=v[t];g({at:"busy",idx:t,label:De(n),startedAt:Date.now()}),e.submit(m.ref,n).catch(h=>({outcome:"failed",detail:h instanceof Error?h.message:String(h)})).then(h=>{let F=Ce[h.outcome]??{mark:"\xB7",color:"dim"},be=h.outcome!=="failed"&&h.outcome!=="skipped"&&h.outcome!=="deferred"&&m.impact&&"stale_refs"in m.impact&&m.impact.stale_refs.length>0?` \xB7 ${m.impact.stale_refs.length} item(s) now stale`:"",te=`${h.outcome} [${m.kind}] ${U(m.title)}${h.detail?` \u2014 ${U(h.detail)}`:""}${be}`;if(w.current.push({mark:F.mark,color:F.color,line:te}),R((0,p.jsx)(K,{mark:F.mark,markColor:F.color==="green"?l.green:F.color==="red"?l.red:l.dim,color:F.color==="dim"?l.dim:void 0,children:te})),h.outcome==="failed"&&(C.current=C.current===0?1:C.current),A(m.ref,me(h)),N.current=!1,I.current){D();return}M(t)})},pe=(t,n)=>{g({at:"evolving",title:t.title,startedAt:Date.now()}),d(`${t.key} ${n}`).catch(m=>`\u2717 evolve failed: ${m instanceof Error?m.message:String(m)}`).then(m=>{let h=m.startsWith("\u2713");if(w.current.push({mark:h?"\u2714":"\u2717",color:h?"green":"red",line:m.replace(/^[✓✗]\s*/,"")}),R((0,p.jsx)(K,{mark:h?"\u2714":"\u2717",markColor:h?l.green:l.red,children:m.replace(/^[✓✗]\s*/,"")})),I.current){r(C.current);return}g({at:"done-panel",sel:0})})},fe=(0,S.useMemo)(()=>({isFocused:()=>{let t=c.current;return t.at==="card"&&t.editor===null||t.at==="done-panel"||t.at==="picker"||t.at==="view"},onMove:t=>{g(n=>{if(n.at==="card"){let m=v[n.idx],h=Y(m)??L(m).length-1;return{...n,sel:Math.max(0,Math.min(h,n.sel+t))}}return n.at==="done-panel"?{...n,sel:Math.max(0,Math.min(T().length-1,n.sel+t))}:n.at==="picker"?{...n,sel:Math.max(0,Math.min(n.items.length-1,n.sel+t))}:n})},onSelect:()=>{let t=c.current;if(t.at==="card"){let n=v[t.idx],m=Y(n);if(m!==null&&t.sel===m){g({...t,editor:"",editorIntent:"steer"});return}let h=L(n)[t.sel];if(h?.v==="archive"&&n.kind==="REVIEW"){g({...t,editor:"",editorIntent:"because"});return}h&&O(t.idx,{v:h.v});return}if(t.at==="done-panel"){let n=T()[t.sel];n?.key==="finish"?r(C.current):n?.key==="evolve"?P():n?.key==="view"&&g({at:"view"});return}if(t.at==="picker"){let n=t.items[t.sel];n&&g({at:"why",item:n,text:""});return}},onDigit:t=>{let n=c.current;if(n.at==="card"){let m=v[n.idx],h=L(m)[t-1];if(h?.v==="archive"&&m.kind==="REVIEW"){g({...n,editor:"",editorIntent:"because"});return}h&&O(n.idx,{v:h.v});return}n.at==="done-panel"&&t-1<T().length&&g({...n,sel:t-1}),n.at==="picker"&&t-1<n.items.length&&g({...n,sel:t-1})},onType:t=>{g(n=>n.at!=="card"||Y(v[n.idx])===null?n:{...n,editor:(n.editor??"")+t,editorIntent:n.editorIntent??"steer"})},isMulti:()=>!1,onSpace:()=>{},onBack:()=>{let t=c.current;(t.at==="picker"||t.at==="view")&&g({at:"done-panel",sel:0})}}),[v]);(0,S.useEffect)(()=>{a.at==="done"&&r(C.current)},[a.at]);let ge=a.at==="card"||a.at==="done-panel"||a.at==="picker"||a.at==="why"||a.at==="view",ve=a.at==="card"||a.at==="busy"?`${x?`${x} \xB7 `:""}item ${a.idx+1} of ${v.length}`:x,J=t=>Math.floor((Date.now()-t)/1e3),{stdout:he}=H(),Z=Math.min((he?.columns??80)-1,100),ee=`view \xB7 this run's changes \xB7 ${w.current.length}`,ke=Math.max(2,Z-(3+ee.length+1)),we=Math.max(2,Z-12);return(0,p.jsxs)($,{flexDirection:"column",children:[(0,p.jsx)(ie,{onToggleThinking:()=>{},onCtrlC:()=>{o(),W()},panel:fe}),a.at==="card"&&E?(0,p.jsx)(ue,{card:E,position:{n:a.idx+1,of:v.length},sel:a.sel,focused:a.editor===null,editorIntent:a.editorIntent??"steer",freeText:a.editor!==null?{value:a.editor,onChange:t=>g(n=>n.at==="card"?{...n,editor:t}:n),onSubmit:t=>{let n=c.current;if(n.at!=="card")return;let m=t.trim();if(!m){g({...n,editor:null,editorIntent:void 0});return}let h=v[n.idx];n.editorIntent==="because"?O(n.idx,{v:"archive",because:m}):h.kind==="PAIR"?O(n.idx,{v:"defer",note:m}):O(n.idx,{v:"approve",steering:m})},onCancel:()=>g(t=>t.at==="card"?{...t,editor:null,editorIntent:void 0}:t)}:null}):null,a.at==="busy"?(0,p.jsxs)(s,{color:l.assuranceAccent,children:[`${q[b%q.length]} ${a.label} `,(0,p.jsx)(s,{color:l.dim,children:`(${J(a.startedAt)}s)`})]}):null,a.at==="evolving"?(0,p.jsxs)(s,{color:l.assuranceAccent,children:[`${q[b%q.length]} Evolving ${a.title}\u2026 `,(0,p.jsx)(s,{color:l.dim,children:`(${J(a.startedAt)}s)`})]}):null,a.at==="done-panel"?(0,p.jsx)(Q,{headline:(()=>{let t=e.summary();return`reconcile done \u2014 ${t.applied+t.committed} applied \xB7 ${t.retired} retired \xB7 ${t.skipped} skipped \xB7 ${t.deferred} deferred${t.failed>0?` \xB7 ${t.failed} failed`:""}`})(),rows:T(),sel:a.sel,focused:!0,legend:"\u2191\u2193 \xB7 \u23CE select"}):null,a.at==="picker"?(0,p.jsx)(Q,{ask:!0,headline:"evolve which use-case?",rows:a.items.map(t=>({key:t.key,label:t.title,detail:t.badge})),sel:a.sel,focused:!0,legend:"\u2191\u2193 \xB7 \u23CE select \xB7 esc back"}):null,a.at==="why"?(0,p.jsxs)($,{flexDirection:"column",borderStyle:"round",borderColor:l.assuranceAccent,paddingX:1,children:[(0,p.jsxs)($,{children:[(0,p.jsxs)(s,{children:[(0,p.jsx)(s,{color:l.assuranceAccent,children:"\u25B8"})," ",(0,p.jsx)(s,{color:l.dim,children:"\u270E "})]}),(0,p.jsx)(G,{value:a.text,onChange:t=>g(n=>n.at==="why"?{...n,text:t}:n),onSubmit:t=>{let n=c.current;n.at==="why"&&(t.trim()?pe(n.item,t.trim()):g({at:"picker",items:[n.item],sel:0}))},onCancel:()=>{c.current.at==="why"&&P()},placeholder:`what should change about ${a.item.title}?`})]}),(0,p.jsx)(s,{color:l.muted,children:" \u23CE submit \xB7 esc back"})]}):null,a.at==="view"?(0,p.jsxs)($,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,p.jsxs)(s,{color:l.assuranceAccent,children:["\u2500\u2500 ",(0,p.jsx)(s,{bold:!0,children:ee}),` ${"\u2500".repeat(ke)}`]}),(0,p.jsx)(s,{children:" "}),w.current.map((t,n)=>(0,p.jsx)(K,{mark:t.mark,markColor:t.color==="green"?l.green:t.color==="red"?l.red:l.dim,color:t.color==="dim"?l.dim:void 0,indent:0,reserve:0,children:t.line},`vc-${n}`)),(0,p.jsx)(s,{children:" "}),(0,p.jsxs)(s,{color:l.assuranceAccent,children:["\u2500\u2500 ",(0,p.jsx)(s,{color:l.muted,children:"esc back"}),` ${"\u2500".repeat(we)}`]})]}):null,(0,p.jsx)(oe,{verb:"maintain",subject:ve,state:ge?"idle":void 0,hints:"ctrl+c exit"})]})}async function nt(e){let v={current:null},R=i=>{v.current?.append(i)},A=null,d=async(i,u)=>{let[{runDesign:I},{resolveAgentAuthEnv:D},{runAgent:W},{preflightTurn:E}]=await Promise.all([import("./run-52UIBPXD.js"),import("./spawner-AH5FTUYU.js"),import("./bridge-T4HL4TG7.js"),import("./turn-preflight-JGYT7LXP.js")]);A??=await D();let T=A;return I({useCase:i,force:!0,mode:u.mode??"override",...u.because?{because:u.because}:{},...u.changeDelta!==void 0?{changeDelta:u.changeDelta}:{},...u.priorDesign!==void 0?{priorDesign:u.priorDesign}:{}},{contextDir:e.dir,agent:W,preflightTurn:()=>E(T),ask:async()=>[],out:()=>{},progress:()=>{},isTTY:!1,auth:T})},y=e.runDesign??d,x=de({contextDir:e.dir,held:e.held,archive:e.archive,planRows:e.rows,runDesign:y,mode:"interactive",signals:e.signals,reviewFeeder:()=>{try{return ae({contextDir:e.dir},_(e.dir))}catch{return[]}}}),r=new Set(e.rows.filter(i=>i.applied!==void 0).map(i=>i.held_ref??i.ref)),o=x.cards().filter(i=>!r.has(i.ref)&&!(i.kind==="ARCHIVE"&&e.archiveState?.[i.ref]!==void 0)),k=i=>e.rows.findIndex(u=>(u.held_ref??u.ref)===i),a=(i,u)=>{try{if(o.find(W=>W.ref===i)?.kind==="ARCHIVE"){u==="retired"?e.markA?.(i,"retired"):u==="skipped"&&e.markA?.(i,"skipped");return}let D=k(i);if(D<0)return;u==="applied"||u==="committed"?e.mark?.(D,"approved"):u==="skipped"&&e.mark?.(D,"skipped")}catch{}},g=async i=>{let[{openGraph:u},{resolveParentUc:I,evolveOneUc:D}]=await Promise.all([import("./readmodel-X7L7W2BA.js"),import("./evolve-cmd-PZCPXDMR.js")]),[W,...E]=i.split(/\s+/),T=u(e.dir),P=I(T,W);if(!P.ok)return`couldn't resolve '${W}' \u2014 start with a use-case id (uc-\u2026): ${P.message}`;if(E.length===0)return`say what to change: \`${W} <your words>\` \u2014 the words become the redesign's change delta`;let M=E.join(" "),N={out:()=>{},err:()=>{},isTTY:!1,confirm:async()=>!0},O=await D(e.dir,P.target,{yes:!0,mode:"override",because:M},N,y,"batch");return O.outcome==="evolved"?(e.signals({ref:P.target.display,verdict:"gap-resolved-evolve",reason:M}),`\u2713 redesigned ${P.target.display} \u2014 "${M}"`):`\u2717 evolve ${O.outcome} for ${P.target.display} (exit ${O.code})`},C=e.listEvolveTargets??(()=>{let i=_(e.dir);return se(i).targets.map(u=>({key:u.display,title:u.display,badge:"stale"}))});if(e.script){let i=0;for(let u of o){let I=await e.script(u),D=await x.submit(u.ref,I);D.outcome==="failed"&&i===0&&(i=1),a(u.ref,me(D))}return i}let[{render:c},{ScrollbackProvider:w},{ScrollbackTap:b}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./scrollback-JLPJR25X.js"),import("./ScrollbackTap-Q3IOKNMS.js")]);return new Promise(i=>{let u=!1,I=M=>{u||(u=!0,(async()=>{process.removeListener("SIGINT",T),await v.current?.flush();try{P.unmount()}catch{}i(M)})())},D=0,W={current:null},E=()=>{if(D+=1,D>=2){process.removeListener("SIGINT",T);try{P.unmount()}catch{}i(130)}},T=()=>{E(),W.current?.()};process.on("SIGINT",T);let P=c((0,p.jsxs)(w,{children:[(0,p.jsx)(b,{into:v}),(0,p.jsx)(Te,{controller:x,cards:o,note:R,markOutcome:a,routeChat:g,listEvolveTargets:C,barSubject:e.barSubject,onFinish:I,onCtrlC:E,pauseRef:W})]}),{exitOnCtrlC:!1})})}export{Te as WalkSessionSurface,me as outcomeToMark,nt as runWalkSession};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a}from"./chunk-2SREGETM.js";import"./chunk-IQDWBTRJ.js";import"./chunk-GVIPTX6T.js";import"./chunk-BKM2LWU2.js";import"./chunk-2XMJ6YAE.js";import"./chunk-W6VD2XFO.js";import"./chunk-5EOX4MEY.js";import"./chunk-RZ4F3BHX.js";import"./chunk-C4G7RVJ6.js";import"./chunk-UR6MHSHU.js";export{a as withTelemetry};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testmuai/kane-cli",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "KaneAI Terminal UI — browser automation testing agent",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -34,11 +34,11 @@
34
34
  "ws": "^8.20.0"
35
35
  },
36
36
  "optionalDependencies": {
37
- "@testmuai/kane-cli-darwin-arm64": "0.7.0",
38
- "@testmuai/kane-cli-darwin-x64": "0.7.0",
39
- "@testmuai/kane-cli-linux-x64": "0.7.0",
40
- "@testmuai/kane-cli-linux-arm64": "0.7.0",
41
- "@testmuai/kane-cli-win-x64": "0.7.0",
37
+ "@testmuai/kane-cli-darwin-arm64": "0.7.1",
38
+ "@testmuai/kane-cli-darwin-x64": "0.7.1",
39
+ "@testmuai/kane-cli-linux-x64": "0.7.1",
40
+ "@testmuai/kane-cli-linux-arm64": "0.7.1",
41
+ "@testmuai/kane-cli-win-x64": "0.7.1",
42
42
  "@testmuai/kane-cli-node-darwin-arm64": "24.18.0",
43
43
  "@testmuai/kane-cli-node-darwin-x64": "24.18.0",
44
44
  "@testmuai/kane-cli-node-linux-x64": "24.18.0",
@@ -1,8 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as Lt,b as ae,c as Ot,d as Je}from"./chunk-VJFFMOUA.js";import{a as _t}from"./chunk-IQODWB32.js";import{a as Ae}from"./chunk-7YPK6EDR.js";import{b as Dt,c as Mt}from"./chunk-GG43HSU2.js";import"./chunk-FMR2KPSK.js";import{a as Bt,b as At,c as Et}from"./chunk-67SSEGDO.js";import{a as St}from"./chunk-5Y2G4NC7.js";import"./chunk-NVGBE2DR.js";import"./chunk-6W6AIDLJ.js";import"./chunk-6HYW5RFX.js";import"./chunk-J2KSZUOO.js";import"./chunk-5YPBPZUR.js";import"./chunk-IAHKTEET.js";import{a as Ct}from"./chunk-YCCUBQY4.js";import{a as It}from"./chunk-5WE4DHXL.js";import{b as Rt}from"./chunk-DFS4RMVP.js";import{y as r}from"./chunk-B4LLKQTK.js";import{a as V}from"./chunk-HCBYKLMW.js";import{a as S,b as n,k as Be}from"./chunk-C44QQJR4.js";import{a as Cn}from"./chunk-6YGTRKDT.js";import{e as U}from"./chunk-UR6MHSHU.js";var k=U(Cn(),1);var c=U(V(),1),Bn=60,An=100;function Ye(e,s){let i=e.options.length,a=i,d=e.multi_select?a++:null,g=e.allow_free_text?a++:null,u=s?a++:null;return{optionCount:i,doneIdx:d,freeIdx:g,batchIdx:u,maxSel:a-1}}var En="\xA0",Dn={high:{text:`\u203C${En}high`,color:r.red},med:{text:"med",color:"yellow"},low:{text:"low",color:r.dim}};function Mn(e){let s=(e.header??e.text.split(/\s+/).slice(0,3).join(" ")).trim();return s.length>16?`${s.slice(0,15)}\u2026`:s}function Ln(e,s,i){let a=m=>e[m].length+6,d=a(s),g=s,u=s;for(;;){let m=u+1<e.length?a(u+1):1/0,h=g-1>=0?a(g-1):1/0;if(m===1/0&&h===1/0)break;if(m<=h){if(d+m>i)break;d+=m,u+=1}else{if(d+h>i)break;d+=h,g-=1}}return{lo:g,hi:u}}function Pt({batch:e,qView:s,sel:i=0,focused:a=!1,freeText:d=null,multiSelFor:g}){let{stdout:u}=Be(),m=u?.columns??80,h=m<Bn,I=Math.min(m-1,An),f=Math.max(0,Math.min(e.questions.length-1,s??(e.cursor<0?0:e.cursor))),p=e.questions[f],L=e.resolution[f],A=e.resolution.filter(F=>!F).length,w=e.questions.length-A,R=Ae(e),C=Ye(p,R!==""),v=g?g(f):[],E=Dn[p.risk],x=F=>a&&i===F?(0,c.jsx)(n,{color:r.assuranceAccent,children:"\u276F"}):" ",N=`? the agent needs ${A===1?"one answer":`${A} answers`}`,_=e.questions.length>1?` \xB7 ${f+1} of ${e.questions.length} \xB7 ${w} answered`:"",q=(0,c.jsxs)(S,{flexDirection:"column",children:[(0,c.jsx)(S,{paddingLeft:2,children:(0,c.jsxs)(n,{bold:!0,children:[p.text,E?(0,c.jsx)(n,{color:E.color,bold:!1,children:` ${E.text}`}):null]})}),(0,c.jsx)(S,{paddingLeft:2,children:(0,c.jsx)(n,{color:r.dim,children:p.rationale})}),(0,c.jsx)(n,{children:" "}),p.options.map((F,O)=>{let H=a&&i===O;return(0,c.jsxs)(S,{flexDirection:"column",children:[(0,c.jsxs)(n,{children:[x(O)," ",p.multi_select?(0,c.jsx)(n,{color:v.includes(O)?r.green:r.dim,children:v.includes(O)?"[x] ":"[ ] "}):null,(0,c.jsx)(n,{color:H?r.assuranceAccent:void 0,children:`${O+1}. ${F.label}`}),O===p.recommended_index?(0,c.jsx)(n,{color:r.dim,children:" (recommended)"}):null,L?.selected_index===O?(0,c.jsx)(n,{color:r.dim,children:" (current)"}):null]}),F.detail?(0,c.jsx)(S,{paddingLeft:5,children:(0,c.jsx)(n,{color:r.dim,children:F.detail})}):null]},`o-${O}`)}),p.multi_select&&C.doneIdx!=null?(0,c.jsxs)(n,{children:[x(C.doneIdx)," ",(0,c.jsx)(n,{color:r.green,children:"\u2714"}),(0,c.jsx)(n,{color:a&&i===C.doneIdx?r.assuranceAccent:void 0,children:" done \u2014 confirm selection"})]}):null,p.allow_free_text?(0,c.jsx)(n,{children:" "}):null,p.allow_free_text?d?(0,c.jsxs)(S,{children:[(0,c.jsxs)(n,{children:[(0,c.jsx)(n,{color:r.assuranceAccent,children:"\u276F"})," ",(0,c.jsx)(n,{color:r.dim,children:"\u270E "})]}),(0,c.jsx)(Ct,{value:d.value,onChange:d.onChange,onSubmit:d.onSubmit,onCancel:d.onCancel,placeholder:"Tell me what to do"})]}):(0,c.jsxs)(n,{children:[C.freeIdx!=null?x(C.freeIdx):" "," ",(0,c.jsx)(n,{color:a&&C.freeIdx!=null&&i===C.freeIdx?r.assuranceAccent:r.dim,children:"\u270E Tell me what to do"})]}):null]}),de=R!==""?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n,{children:" "}),(0,c.jsxs)(n,{children:[a&&C.batchIdx!=null&&i===C.batchIdx?(0,c.jsx)(n,{color:r.assuranceAccent,children:"\u276F"}):" "," ",(0,c.jsx)(n,{color:r.assuranceAccent,children:"\xBB"}),(0,c.jsx)(n,{bold:!0,color:a&&C.batchIdx!=null&&i===C.batchIdx?r.assuranceAccent:void 0,children:" Go with recommendations"}),A>=5?(0,c.jsx)(n,{color:r.dim,children:` \u2014 resolves all ${A} open`}):null,(0,c.jsx)(n,{color:r.dim,children:" (tab)"})]})]}):null;if(h)return(0,c.jsxs)(S,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,c.jsx)(n,{color:r.assuranceAccent,bold:!0,children:N}),e.questions.length>1?(0,c.jsx)(n,{color:r.dim,children:_.replace(/^ · /,"")}):null,(0,c.jsx)(n,{children:" "}),q,de,(0,c.jsx)(S,{paddingLeft:2,children:(0,c.jsx)(n,{color:r.muted,children:"\u2191\u2193 \u23CE \xB7 \u2190 \u2192 questions \xB7 esc back"})})]});let _e=`\u2500\u2500 ${N}${_} `,Oe=Math.max(2,I-_e.length),me="\u2191\u2193 select \xB7 \u23CE confirm \xB7 \u2190 \u2192 questions \xB7 type = your words \xB7 esc back",ge=`\u2500\u2500 ${me} `,te=Math.max(2,I-ge.length),K=e.questions.map(F=>Mn(F)),D=e.questions.length>1?Ln(K,f,I-8):null;return(0,c.jsxs)(S,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,c.jsxs)(n,{color:r.assuranceAccent,children:["\u2500\u2500 ",(0,c.jsx)(n,{bold:!0,children:N}),_?(0,c.jsx)(n,{color:r.dim,children:_}):null,` ${"\u2500".repeat(Oe)}`]}),D?(0,c.jsx)(S,{marginTop:1,children:(0,c.jsxs)(n,{children:[D.lo>0?(0,c.jsx)(n,{color:r.dim,children:"\u25C0 "}):" ",e.questions.slice(D.lo,D.hi+1).map((F,O)=>{let H=D.lo+O,we=O>0?" ":"";return H===f?(0,c.jsxs)(n,{children:[we,(0,c.jsx)(n,{backgroundColor:r.assuranceAccent,color:"#0d1117",bold:!0,children:` ${K[H]} `})]},F.id):(0,c.jsxs)(n,{children:[we,e.resolution[H]?(0,c.jsxs)(n,{children:[(0,c.jsx)(n,{color:r.green,children:"\u2713 "}),(0,c.jsx)(n,{color:r.dim,children:K[H]})]}):(0,c.jsx)(n,{color:r.dim,children:`\u25CB ${K[H]}`})]},F.id)}),D.hi<e.questions.length-1?(0,c.jsx)(n,{color:r.dim,children:" \u25B6"}):null]})}):null,(0,c.jsx)(n,{children:" "}),q,de,(0,c.jsx)(n,{children:" "}),(0,c.jsxs)(n,{color:r.assuranceAccent,children:["\u2500\u2500 ",(0,c.jsx)(n,{color:r.muted,children:me}),` ${"\u2500".repeat(te)}`]})]})}var M=U(V(),1),qt={high:0,med:1,low:2},_n={high:r.red,med:"yellow",low:r.dim};function On(e){return e.map((s,i)=>({r:s,i})).sort((s,i)=>(qt[s.r.risk??"zz"]??3)-(qt[i.r.risk??"zz"]??3)||s.i-i.i).map(({r:s})=>s)}var ne=(e,s)=>e.length<=s?e:s<=1?"\u2026":`${e.slice(0,s-1)}\u2026`,Ee=(e,s)=>e+" ".repeat(Math.max(0,s-e.length));function Ft({rows:e,width:s=120,badgeHeader:i="risk"}){if(e.length===0)return null;let a=On(e),d=v=>v.staged||!v.id?"(staged)":_t(v.id),g=Math.max(2,...a.map(v=>d(v).length)),u=Math.max(i.length,...a.map(v=>(v.badge??"").length)),m=s>=96&&a.some(v=>v.summary),I=s-(m?13:10)-g-u,f=Math.max(...a.map(v=>Math.max(v.title.length,(v.marker??"").length)),5),p=Math.max(5,m?Math.min(f,Math.max(16,Math.floor(I*.5))):Math.min(f,I)),L=m?Math.max(7,I-p):0,A=(v,E,x,N)=>v+N.map(_=>`\u2500${"\u2500".repeat(_.length)}\u2500`).join(E)+x,w=(v,E,x,N)=>[Ee(ne(v,g),g),Ee(ne(E,p),p),Ee(ne(x,u),u),...m?[Ee(ne(N,L),L)]:[]],R=w("id","title",i,"summary"),C=[];C.push((0,M.jsx)(n,{color:r.dim,children:A("\u250C","\u252C","\u2510",R)},"t")),C.push((0,M.jsxs)(n,{children:[R.map((v,E)=>(0,M.jsxs)(n,{children:[(0,M.jsx)(n,{color:r.dim,children:E===0?"\u2502 ":" \u2502 "}),(0,M.jsx)(n,{bold:!0,children:v})]},E)),(0,M.jsx)(n,{color:r.dim,children:" \u2502"})]},"h")),C.push((0,M.jsx)(n,{color:r.dim,children:A("\u251C","\u253C","\u2524",R)},"m"));for(let[v,E]of a.entries()){let x=w(d(E),ne(E.title,p),ne(E.badge??"",u),ne(E.summary??"",L)),N=E.badgeColor??_n[E.badge??""]??r.dim;if(C.push((0,M.jsxs)(n,{children:[(0,M.jsx)(n,{color:r.dim,children:"\u2502 "}),(0,M.jsx)(n,{color:r.assuranceAccent,children:x[0]}),(0,M.jsx)(n,{color:r.dim,children:" \u2502 "}),x[1],(0,M.jsx)(n,{color:r.dim,children:" \u2502 "}),(0,M.jsx)(n,{color:N,children:x[2]}),m?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(n,{color:r.dim,children:" \u2502 "}),x[3]]}):null,(0,M.jsx)(n,{color:r.dim,children:" \u2502"})]},`r-${v}`)),E.marker){let _=w("",ne(E.marker,p),"","");C.push((0,M.jsx)(n,{color:r.dim,children:`\u2502 ${_.join(" \u2502 ")} \u2502`},`mk-${v}`))}}return C.push((0,M.jsx)(n,{color:r.dim,children:A("\u2514","\u2534","\u2518",R)},"b")),(0,M.jsx)(M.Fragment,{children:C})}var Pn={"use-case":"use-cases",ac:"ACs",scenario:"scenarios",test:"tests",gap:"gaps"},ee=e=>Pn[e]??`${e}s`,Nt=e=>e==="ac"?"AC":e==="use-case"?"use-case":e,Ze=e=>e.kind??"use-case",Wt=e=>`${Ze(e)}:${e.temp_ref}`;function jt(e){let s=e,i=s.badge??e.risk??null,a=s.why??e.summary??e.description??null;return JSON.stringify([e.title,i,a,s.extra??null,e.depends_on_hint??null])}function Ut(e){return e.filter(s=>s.role==="agent"&&typeof s.turnIndex=="number"&&Array.isArray(s.items)&&s.items.length>0)}function se(e){let s=new Map,i=1;for(let g of Ut(e)){let u=new Set;for(let m of g.items){let h=Wt(m);if(u.has(h))continue;u.add(h);let I=s.get(h);s.set(h,{num:I?.num??i++,ref:m.temp_ref,kind:Ze(m),item:m,turnIndex:g.turnIndex,fingerprint:jt(m)})}}let a=[...s.values()].sort((g,u)=>g.num-u.num),d=[];for(let g of a){let u=d.find(m=>m.kind===g.kind);u?u.count++:d.push({kind:g.kind,label:ee(g.kind),count:1})}return{entries:a,byRef:s,counts:d}}function Vt(e,s){let a=Ut(e).find(w=>w.turnIndex===s);if(!a)return null;let d=e.filter(w=>w.role!=="agent"||typeof w.turnIndex!="number"||w.turnIndex<=s),g=se(d),u=se(e.filter(w=>w.role!=="agent"||typeof w.turnIndex!="number"||w.turnIndex<s)),m=[],h=new Map,I=new Map,f=new Map,p=new Set;for(let w of a.items){let R=Wt(w);if(p.has(R))continue;p.add(R);let C=u.byRef.get(R),v=w.changed===!0,E=g.byRef.get(R).num,x=Ze(w);if(C&&!v&&C.fingerprint===jt(w)){h.set(x,(h.get(x)??0)+1);continue}let N=!!C||v,_=N?f:I;_.set(x,(_.get(x)??0)+1),m.push({item:w,num:E,updated:N})}let L=[...h.entries()].map(([w,R])=>({label:ee(w),count:R})),A=[...[...I.entries()].map(([w,R])=>`${R} new ${R===1?Nt(w):ee(w)}`),...[...f.entries()].map(([w,R])=>`${R} updated ${R===1?Nt(w):ee(w)}`)].join(" \xB7 ");return{fresh:m,unchanged:L,headerStats:A}}function et(e,s){let i=e.entries.filter(g=>g.turnIndex===s);if(i.length===0)return e;let a=new Map(i.map(g=>[g.ref,g])),d=[];for(let g of i){let u=d.find(m=>m.kind===g.kind);u?u.count+=1:d.push({kind:g.kind,label:ee(g.kind),count:1})}return{entries:i,byRef:a,counts:d}}var b=U(V(),1);function qn(e){let s=e.form==="assumed"?" (flagged)":e.form==="deferred"?"":" (you)",i=e.note?` \u2014 ${e.note}`:"";return e.form==="deferred"?`\u21B3 deferred q${e.qNum} ${e.stub}${i}`:e.form==="changed"?`\u21B3 changed q${e.qNum} ${e.stub}: ${e.prev??"?"} \u2192 ${e.choice??"?"}${s}${i}`:`\u21B3 ${e.form} q${e.qNum} ${e.stub}: ${e.choice??"?"}${s}${i}`}var Fn=Math.min(process.stdout?.columns??100,120)-2;function Kt({block:e,annotations:s}){switch(e.kind){case"banner":return(0,b.jsx)(S,{marginTop:1,children:(0,b.jsx)(n,{color:r.dim,children:` \u2500\u2500 ${e.text} \u2500\u2500`})});case"user":return(0,b.jsxs)(S,{marginTop:1,children:[(0,b.jsx)(n,{color:r.orange,children:"\u276F "}),(0,b.jsx)(n,{children:e.text})]});case"note":return(0,b.jsx)(n,{color:r.dim,children:` ${e.text}`});case"agent":return(0,b.jsx)(S,{marginTop:1,children:(0,b.jsx)(At,{text:e.text,accent:r.assuranceAccent})});case"thinking":return(0,b.jsx)(S,{marginTop:1,children:(0,b.jsx)(n,{color:r.dim,children:` thought for ${(e.tookMs/1e3).toFixed(1)}s`})});case"tool":return(0,b.jsx)(n,{color:r.dim,children:` ${Dt({name:e.name,status:e.status==="ok"?"done":e.status,detail:e.detail})}`});case"usage":return(0,b.jsx)(n,{color:r.dim,children:` \xB7 ${e.credits.toFixed(1)} credits \u2014 total ${e.total.toFixed(1)}`});case"turn":{let i=s??null,a=i?i.fresh:e.items.map((f,p)=>({item:f,num:p+1,updated:!1})),d={usecase:"risk","use-case":"risk",ac:"check",scenario:"kind",test:"check",gap:"severity",stylenote:"kind"},g=f=>f.kind??"use-case",u=new Map;for(let f of a){let p=f.item,L=g(f.item),A=p.risk==="high"||p.risk==="med"||p.risk==="low"?p.risk:void 0,w={id:p.logical_id??"",staged:!p.logical_id,title:p.title,badge:p.badge??p.risk??"",summary:p.why??p.summary??p.description??"",...A?{risk:A}:{},...f.updated?{marker:"\u21B3 changed"}:{}},R=u.get(L)??[];R.push(w),u.set(L,R)}let m=a.some(f=>!!f.item.kind),h=(i?.unchanged??[]).reduce((f,p)=>f+p.count,0),I=i?.headerStats?` \u2014 ${i.headerStats}${h>0?` (${h} unchanged)`:""}`:"";return(0,b.jsxs)(S,{flexDirection:"column",marginLeft:2,children:[(0,b.jsxs)(n,{bold:!0,children:[m?"design":e.heading,I?(0,b.jsx)(n,{bold:!1,color:r.dim,children:I}):null]}),[...u.entries()].map(([f,p])=>(0,b.jsxs)(S,{flexDirection:"column",children:[u.size>1?(0,b.jsx)(n,{color:r.dim,children:`${ee(f)} \xB7 ${p.length}`}):null,(0,b.jsx)(Ft,{rows:p,width:Fn,badgeHeader:d[f]??"info"})]},f)),i&&i.unchanged.length>0&&(0,b.jsx)(n,{color:r.dim,children:` \u22EE unchanged: ${i.unchanged.map(f=>`${f.count} ${f.label}`).join(" \xB7 ")}`})]})}case"answer":return(0,b.jsx)(n,{color:r.dim,children:qn(e.receipt)});case"continued":return(0,b.jsx)(n,{color:r.dim,children:"\u21B3 continued"});case"commit":return(0,b.jsxs)(S,{flexDirection:"column",children:[(0,b.jsx)(n,{color:e.ok?r.green:r.red,children:` ${e.ok?"\u2714":"\u2717"} ${e.line}`}),(e.warnings??[]).map((i,a)=>(0,b.jsx)(n,{color:r.dim,children:` \u26A0 ${i}`},`w-${a}`))]});case"error":return(0,b.jsxs)(It,{variant:"error",paddingX:1,children:[(0,b.jsx)(n,{color:r.red,children:e.title}),e.detail.map((i,a)=>(0,b.jsx)(n,{color:r.dim,children:i},`d-${a}`))]});case"interrupted":return(0,b.jsxs)(S,{flexDirection:"column",children:[(0,b.jsx)(n,{color:r.red,children:"interrupted \u2014 session not saved"}),e.detail?(0,b.jsx)(n,{color:r.dim,children:e.detail}):null]});case"pause":return(0,b.jsxs)(S,{flexDirection:"column",children:[(0,b.jsx)(n,{children:`paused: session ${e.sid} saved`}),e.expires_at?(0,b.jsx)(n,{color:r.dim,children:`expires: ${e.expires_at}`}):null,(0,b.jsx)(n,{children:`resume: ${e.resume}`}),e.messageForm?(0,b.jsx)(n,{children:`or say something on the way in: ${e.messageForm}`}):null]});case"summary":return(0,b.jsxs)(S,{flexDirection:"column",children:[(0,b.jsx)(n,{bold:!0,children:"session summary"}),e.lines.map((i,a)=>(0,b.jsx)(n,{children:` ${i}`},`s-${a}`))]})}}var ue=U(V(),1);function Qt({item:e}){return(0,ue.jsxs)(S,{flexDirection:"column",marginLeft:2,children:[(e.cite??[]).map((s,i)=>(0,ue.jsx)(n,{dimColor:!0,children:`cite ${s.anchor??"conv"} \u2014 "${s.quote??""}"`},`cite-${i}`)),(e.depends_on_hint??[]).length>0&&(0,ue.jsx)(n,{dimColor:!0,children:`depends on: ${(e.depends_on_hint??[]).join(", ")}`}),Object.entries(e.extra??{}).map(([s,i])=>(0,ue.jsx)(n,{dimColor:!0,children:`${s}: ${i}`},`extra-${s}`))]})}var $=U(V(),1),tt=(e,s)=>Math.max(0,Math.min(s,e));function Me(e,s,i){switch(s.type){case"move":return e.level==="detail"?{...e,scroll:Math.max(0,(e.scroll??0)+s.delta)}:{...e,cursor:tt(e.cursor+s.delta,Math.max(0,i-1))};case"enter":return e.level==="list"?{...e,level:"detail",scroll:0}:e;case"back":return e.level==="detail"?{...e,level:"list",scroll:0}:null}}var Xt={"use-case":"use-cases",ac:"acs",scenario:"scenarios",test:"tests",gap:"gaps"};function zt(e,s){if(e.level==="detail")return{level:"detail",cursor:tt(e.num-1,Math.max(0,s.entries.length-1))};if(e.section){let i=s.entries.findIndex(a=>Xt[a.kind]===e.section);if(i>=0)return{level:"list",cursor:i}}return{level:"list",cursor:0}}function Nn(e){let s=[];for(let i of e.entries){let a=s.find(d=>d.kind===i.kind);a?a.entries.push(i):s.push({kind:i.kind,entries:[i]})}return s}var Ht=3;function Wn({items:e,cursor:s,verb:i,more:a}){let d=`view \xB7 ${i} so far \xB7 ${e.counts.map(u=>`${u.count} ${u.count===1?u.label.replace(/s$/,""):u.label}`).join(" \xB7 ")}`,g=e.entries[s];return(0,$.jsxs)(S,{flexDirection:"column",borderStyle:"round",borderColor:r.dim,paddingX:1,children:[(0,$.jsx)(n,{bold:!0,children:d}),Nn(e).map(({kind:u,entries:m})=>{let h=g?.kind===u,I=h?m.findIndex(A=>A.ref===g.ref):-1,f=h?tt(I-1,Math.max(0,m.length-Ht)):0,p=m.slice(f,f+(h?Ht:1)),L=m.length-p.length;return(0,$.jsxs)(S,{flexDirection:"column",children:[(0,$.jsx)(n,{color:r.dim,children:`${Xt[u]??ee(u)} \xB7 ${m.length}`}),p.map(A=>{let w=h&&A.ref===g.ref,R=A.item.badge;return(0,$.jsxs)(n,{children:[(0,$.jsx)(n,{color:r.assuranceAccent,children:w?"\u203A ":" "}),(0,$.jsx)(n,{children:`${A.num} \xB7 ${A.item.title}`}),R?(0,$.jsx)(n,{color:r.dim,children:` \xB7 ${R}`}):null]},`${A.kind}:${A.ref}`)}),L>0&&(0,$.jsx)(n,{color:r.dim,children:` \u22EE ${L} more`})]},u)}),a?(0,$.jsxs)(n,{children:[(0,$.jsx)(n,{color:r.assuranceAccent,children:s===e.entries.length?"\u203A ":" "}),(0,$.jsx)(n,{color:r.dim,children:`\u22EF show all \u2014 ${a.hidden} more from earlier turns`})]}):null,(0,$.jsx)(n,{color:r.dim,children:"\u2191\u2193 move \xB7 \u21B5 detail \xB7 esc back"})]})}var De=14;function jn({items:e,cursor:s,explain:i,grandTotal:a,dossier:d,scroll:g=0}){let u=e.entries[s];if(!u)return(0,$.jsx)(n,{color:r.dim,children:"nothing to show"});if(d){let h=Math.max(0,Math.min(g,Math.max(0,d.lines.length-De))),I=d.lines.slice(h,h+De);return(0,$.jsxs)(S,{flexDirection:"column",borderStyle:"round",borderColor:r.dim,paddingX:1,children:[(0,$.jsxs)(n,{bold:!0,children:[`view \xB7 ${d.id}`,d.id.toLowerCase()!==d.rawId?(0,$.jsx)(n,{bold:!1,color:r.dim,children:` \xB7 ${d.rawId}`}):null]}),(0,$.jsx)(n,{bold:!0,children:d.title}),h>0?(0,$.jsx)(n,{color:r.muted,children:`\u22EE ${h} above`}):null,I.map((f,p)=>(0,$.jsx)(n,{color:f.dim?r.dim:void 0,children:f.text},`dl-${p}`)),d.lines.length>h+De?(0,$.jsx)(n,{color:r.muted,children:`\u22EE ${d.lines.length-h-De} more`}):null,(0,$.jsx)(n,{color:r.dim,children:"\u2191\u2193 scroll \xB7 esc back"})]})}let m=u.item;return(0,$.jsxs)(S,{flexDirection:"column",borderStyle:"round",borderColor:r.dim,paddingX:1,children:[(0,$.jsx)(n,{bold:!0,children:`view \xB7 ${u.kind} ${u.num} of ${a??e.entries.length}`}),(0,$.jsx)(n,{children:u.item.title}),m.badge?(0,$.jsx)(n,{color:r.dim,children:`kind: ${m.badge}`}):null,m.why?(0,$.jsx)(n,{color:r.dim,children:m.why}):null,(0,$.jsx)(Qt,{item:u.item}),i?.map((h,I)=>(0,$.jsx)(n,{color:r.dim,children:h},`ex-${I}`)),(0,$.jsx)(n,{color:r.dim,children:"view-only \u2014 approvals happen in chat"}),(0,$.jsx)(n,{color:r.dim,children:"\u2191\u2193 prev/next \xB7 esc back to list"})]})}function Gt({items:e,state:s,verb:i,more:a,explain:d,grandTotal:g,dossier:u=null}){return s.level==="list"?(0,$.jsx)(Wn,{items:e,cursor:s.cursor,verb:i,more:a}):(0,$.jsx)(jn,{items:e,cursor:s.cursor,explain:d,grandTotal:g,dossier:u,scroll:s.scroll??0})}var Un={"use-cases":"use-cases",usecases:"use-cases","use-case":"use-cases",acs:"acs",ac:"acs",scenarios:"scenarios",scenario:"scenarios",tests:"tests",test:"tests",gaps:"gaps",gap:"gaps"};function Jt(e){let s=(e??"").trim().toLowerCase();if(!s)return{level:"list"};if(/^\d+$/.test(s)){let a=parseInt(s,10);return a>=1?{level:"detail",num:a}:{error:"items are numbered from 1 \u2014 /view 1"}}let i=Un[s];return i?{level:"list",section:i}:{error:"try /view, /view <number>, or /view acs|scenarios|tests"}}var B=U(V(),1),Vn=6,Yt=12;function Kn(e,s,i){let a=Math.max(20,s),d=[];for(let u of e.split(`
3
- `)){if(u.length<=a){d.push(u);continue}let m="";for(let h of u.split(" "))m&&m.length+1+h.length>a?(d.push(m),m=h):m=m?`${m} ${h}`:h;d.push(m)}let g=Math.max(0,d.length-i);return{body:d.slice(-i).join(`
4
- `),hidden:g}}var Le=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function Zt(e){let s={key:"redesign",label:"re-design from scratch",detail:"replaces the current design"},i={key:"keep",label:"keep the existing design",detail:"back to the list"};return e.designed==="stale"?[{...s,detail:"the use-case changed since it was designed"},i]:[i,s]}function _r({controller:e,verb:s="extract",onCtrlC:i,chain:a=null,inspect:d=null}){let[,g]=(0,k.useState)(0),[u,m]=(0,k.useState)(!1),[h,I]=(0,k.useState)(null),[f,p]=(0,k.useState)(null),L=(0,k.useRef)(null),[A,w]=(0,k.useState)(null),R=(0,k.useRef)(null),C=t=>{R.current=t,w(t)},v=t=>{L.current=t,p(t),t===null&&C(null)},E=(0,k.useRef)([]),[x,N]=(0,k.useState)(null),_=(0,k.useRef)(null),q=t=>{_.current=t,N(t)},de=Rt(),{stdout:_e}=Be(),Oe=_e?.columns??80,me=(0,k.useRef)(0),ge=(0,k.useRef)(0);(0,k.useEffect)(()=>{let t=()=>{let o=e.state.ledger;for(let y=me.current;y<o.length;y++){let T=o[y],P=T.kind==="turn"?Vt(e.state.turns,T.turnIndex):void 0;de.append((0,B.jsx)(Kt,{block:T,annotations:P},`lg-${y}`))}me.current=o.length};t();let l=e.subscribe(()=>{t();let o=e.state;L.current&&(o.pending||o.status==="pausing")&&(v(null),o.pending&&I("questions arrived \u2014 back to chat")),g(y=>y+1)});return g(o=>o+1),l},[e,de]);let{thinking:te,status:K,pending:D,confirm:F,ledger:O,activeTurn:H,stream:we,notice:$e}=e.state,nt=(we?.text??"").trimEnd(),rt=nt.length>0,en=u&&(te.liveThinking.length>0||te.thinkingLog.length>0),tn=Kn(te.liveThinking||te.thinkingLog.map(t=>t.text).join(`
5
- `),Oe-6,Yt),st=rt?nt.split(`
6
- `).slice(-Vn):[];H&&(ge.current=H.turnIndex);let nn=D?D.resolution.filter(t=>!t).length:0,it;for(let t=O.length-1;t>=0;t--){if(E.current.some(o=>o.end!=null&&t>=o.start&&t<o.end))continue;let l=O[t];if(l.kind==="banner"&&!l.text.startsWith("kane")){it=l.text;break}}let fe=te.activity[te.activity.length-1],Pe=fe?fe.status==="decision"?fe.label:Mt({name:fe.name,status:fe.status}):void 0,ot=K==="streaming"||K==="working",[lt,rn]=(0,k.useState)(0);St(()=>rn(t=>t+1),ot||x?.kind==="running"?120:null);let sn=e.state.busySince?Math.floor((Date.now()-e.state.busySince)/1e3):0,on=rt?"Writing\u2026":Pe?`${Pe.charAt(0).toUpperCase()}${Pe.slice(1)}\u2026`:e.state.workingLabel??(s==="design"?"Designing\u2026":"Thinking\u2026"),ln=e.state.turns.some(t=>t.role==="agent"),[cn,an]=(0,k.useState)(0),[un,dn]=(0,k.useState)(!1),[ct,mn]=(0,k.useState)(null),pe=(0,k.useRef)(0),at=(0,k.useRef)(!1),ut=(0,k.useRef)(null),he=t=>{pe.current=t,an(t)},dt=t=>{at.current=t,dn(t)},ie=t=>{ut.current=t,mn(t)},[qe,gn]=(0,k.useState)(0),Q=(0,k.useRef)(0),xe=t=>{Q.current=t,gn(t)},mt=D?D.questions[0]?.id??"b":null;(0,k.useEffect)(()=>{D&&xe(D.cursor<0?0:D.cursor)},[mt,D?.cursor]);let Fe=()=>{let t=z.current;if(!t)return;let l=t.questions.length;for(let o=1;o<=l;o++){let y=(Q.current+o)%l;if(!t.resolution[y]){xe(y);return}}},gt=D?D.questions[Math.max(0,Math.min(D.questions.length-1,qe))]:void 0,X=(0,k.useRef)(gt);X.current=gt;let z=(0,k.useRef)(D);z.current=D;let fn=D?`${mt}:${qe}`:null;(0,k.useEffect)(()=>{if(ie(null),X.current){dt(!0);let t=z.current?.resolution[Q.current]?.selected_index;he(t??X.current.recommended_index??0)}else dt(!1)},[fn]);let ve=t=>{let l=z.current;return Ye(t,l?Ae(l)!=="":!1)},pn={isFocused:()=>at.current&&X.current!=null&&ut.current==null||_.current!=null&&_.current.kind!=="running"||G.current&&$t.current==null,onMove:t=>{let l=X.current;if(l){he(Math.max(0,Math.min(ve(l).maxSel,pe.current+t)));return}let o=_.current;if(o?.kind==="picker"){q({...o,sel:Math.max(0,Math.min(o.items.length-1,o.sel+t))});return}if(o?.kind==="ask"||o?.kind==="confirm"||o?.kind==="failed"){let y=(o.kind==="ask"?Ie.current.length:o.kind==="failed"?Re.current.length:2)-1;q({...o,sel:Math.max(0,Math.min(y,o.sel+t))});return}o&&!G.current||G.current&&le(Math.max(0,Math.min(Te.current.length-1,ze.current+t)))},onSelect:()=>{let t=X.current,l=z.current;if(!t||!l){let T=_.current;if(T?.kind==="picker"){let W=T.items[T.sel];W&&(W.designed?q({kind:"confirm",item:W,sel:0}):Ke(W,!1));return}if(T?.kind==="confirm"){Zt(T.item)[T.sel]?.key==="redesign"?Ke(T.item,!0):Ve();return}if(T?.kind==="ask"){let W=Ie.current[T.sel]?.key;W==="another"?Ve():W==="view"?Ge(""):q(null);return}if(T?.kind==="failed"){let W=Re.current[T.sel]?.key;W==="retry"?Ke(T.item,T.force):W==="view"?Ge(""):q(null);return}if(T&&!G.current||!G.current)return;switch(Te.current[ze.current]?.key){case"finish":e.completeSession();return;case"continue":e.continueParked();return;case"design-chain":Ve();return;case"view":Ge("",ge.current);return;case"free":ce("");return}return}let o=ve(t),y=pe.current;if(o.batchIdx!=null&&y===o.batchIdx){e.goWithRecommendations();return}if(o.freeIdx!=null&&y===o.freeIdx){ie("");return}if(o.doneIdx!=null&&y===o.doneIdx){e.confirmMulti(Q.current),Fe();return}if(t.multi_select){e.toggleOption(Q.current,y);return}e.submitAnswer(Q.current,y),Fe()},onLeft:()=>{z.current&&xe(Math.max(0,Q.current-1))},onRight:()=>{let t=z.current;t&&xe(Math.min(t.questions.length-1,Q.current+1))},onDigit:t=>{let l=X.current;if(l){t-1<l.options.length&&he(t-1);return}let o=_.current;if(o?.kind==="picker"){t-1<o.items.length&&q({...o,sel:t-1});return}if(o?.kind==="ask"){t-1<Ie.current.length&&q({...o,sel:t-1});return}if(o?.kind==="failed"){t-1<Re.current.length&&q({...o,sel:t-1});return}if(o?.kind==="confirm"){t-1<2&&q({...o,sel:t-1});return}if(!(o&&!G.current)&&G.current){let y=Te.current,T=0;for(let P=0;P<y.length;P++)if(!y[P].free&&(T+=1,T===t)){le(P);return}}},isMulti:()=>{let t=X.current;return!!t?.multi_select&&pe.current<(t?.options.length??0)},onSpace:()=>{z.current&&e.toggleOption(Q.current,pe.current)},onTab:()=>{let t=X.current;if(!t)return;let l=ve(t);l.batchIdx!=null&&he(l.batchIdx)},onType:t=>{let l=X.current;if(l){if(!l.allow_free_text)return;let o=ve(l);he(o.freeIdx??0),ie(t);return}if(!(_.current&&!G.current)&&G.current){let o=Lt(Te.current);if(o==null)return;le(o),ce(t)}},onBack:()=>{let t=_.current;if(t&&t.kind!=="running"){q(null);return}let l=z.current;if(l){for(let o=Q.current-1;o>=0;o--)if(l.resolution[o]){xe(o);return}}}},hn=ct!=null?{value:ct,onChange:t=>ie(t),onSubmit:t=>{ie(null),t.trim()&&z.current&&(e.submitFreeText(Q.current,t),Fe())},onCancel:()=>ie(null)}:null,ft=i??(()=>e.requestPause()),re=e.state.checkpoint,ke=x?.kind==="running"&&K==="idle",be=K==="idle"&&ln&&!D&&!f&&(!x||ke),G=(0,k.useRef)(!1);G.current=be;let J=se(e.state.turns).entries.length,ye,Y;for(let t=O.length-1;t>=0;t--){if(E.current.some(o=>o.end!=null&&t>=o.start&&t<o.end))continue;let l=O[t];if(!ye&&l.kind==="commit"&&l.ok&&(ye=l.line),!Y&&l.kind==="banner"&&l.text.startsWith("designing: ")&&(Y=l.text.slice(11)),ye&&Y)break}let Ne;for(let t=O.length-1;t>=0;t--){let l=O[t];if(l.kind==="user")break;if(l.kind==="commit"&&l.ok&&/\bapplied\b/.test(l.line)){Ne=l.line;break}}let Z=Y?{"acceptance criteria":"scenarios",scenarios:"acceptance criteria + exercises","acceptance criteria + exercises":"tests + gaps"}[Y]:void 0,pt={"acceptance criteria":"the promises every path of this use-case must keep",scenarios:"the concrete user journeys that exercise those promises","acceptance criteria + exercises":"the wiring pass \u2014 per-journey checks, tied to the promises each journey exercises","tests + gaps":"runnable browser tests \u2014 anything unautomatable is recorded as a gap"},ht=Y?pt[Y]:void 0,xt=Z?pt[Z]:void 0,xn="phases: acceptance criteria \u2192 scenarios \u2192 wiring \u2192 tests \xB7 stop anytime with finish",kn=(()=>{for(let t=O.length-1;t>=0;t--){let l=O[t];if(l.kind==="agent")return l.text}return null})(),oe=/\?\s*$/.test((kn??"").trimEnd()),kt=s==="design"&&!re&&(oe||Z!==void 0),bt=Y==="tests + gaps",Se=x?.kind==="running"?x.title:"the design",yt=!!e.state.error&&!e.senderAlive(),bn=F?"the agent needs a clarification before it can apply that":ke&&!re?oe?`${Se} \u2014 the agent asked a question`:Ne?`${Se} \u2014 ${Ne}`:bt?`${Se} \u2014 design complete`:`${Se} \u2014 the agent is waiting on you`:re?Y?`${Y} done${Z?` \u2014 next: ${Z}`:""}`:ye??"phase done":yt?"the agent stopped \u2014 the session is view-only":kt?oe?"the agent asked a question \u2014 answer or continue":`design incomplete \u2014 ${Z} not started`:ye??"waiting on you",We=F?[{key:"free",label:"clarify \u2014 type which one you meant",free:!0}]:ke&&!re?bt&&!oe?[{key:"finish",label:"finish this design"},...J>0?[{key:"view",label:"view what's saved"}]:[],{key:"free",label:"reply \u2014 tell the agent what to change",free:!0}]:[{key:"continue",label:oe?"continue \u2014 go with your suggestion":"continue designing"},...J>0?[{key:"view",label:"view what's saved"}]:[],{key:"finish",label:"finish this design"},{key:"free",label:"reply \u2014 tell the agent what to change",free:!0}]:re?[{key:"continue",label:Z?`continue to ${Z}`:"continue"},...J>0?[{key:"view",label:"view what's saved"}]:[],{key:"finish",label:"finish here"},{key:"free",label:"adjust \u2014 tell me what to change",free:!0}]:yt?[...J>0?[{key:"view",label:"view what's saved"}]:[],{key:"free",label:"tell me what to change",free:!0}]:kt?[{key:"continue",label:oe?"continue \u2014 go with your suggestion":`continue \u2014 ${Z} next`},...J>0?[{key:"view",label:"view the design"}]:[],{key:"finish",label:"finish anyway"},{key:"free",label:"reply \u2014 answer and continue",free:!0}]:[{key:"finish",label:s==="design"?"finish":"looks good \u2014 finish the session"},...a?[{key:"design-chain",label:"design tests for a use-case\u2026"}]:[],...J>0?[{key:"view",label:s==="design"?"view the design":`view the ${J} draft${J===1?"":"s"}`}]:[],{key:"free",label:s==="design"?"keep adjusting \u2014 tell me what to change":"tell me what to change",free:!0}],je=[{key:"another",label:"design another use-case\u2026"},...J>0?[{key:"view",label:"view what was designed"}]:[],{key:"back",label:"done \u2014 back"}],Ie=(0,k.useRef)(je);Ie.current=je;let Ue=[{key:"retry",label:"try again"},...J>0?[{key:"view",label:"view what's saved"}]:[],{key:"back",label:"back"}],Re=(0,k.useRef)(Ue);Re.current=Ue;let Ve=()=>{let t=a?.listUcs()??[];if(t.length===0){I("no use-cases to design yet");return}q({kind:"picker",items:t,sel:0})},Ke=(t,l)=>{let o={start:e.state.ledger.length,end:null};E.current.push(o);let y=()=>{o.end=e.state.ledger.length};q({kind:"running",title:t.title,item:t,force:l,startedAt:Date.now()}),a.runDesignChild(t.key,l).then(T=>{y(),T===0?(e.ledger({kind:"commit",ok:!0,line:`designed ${t.title}`}),q({kind:"ask",title:t.title,sel:0})):(e.ledger({kind:"commit",ok:!1,line:`design for ${t.title} failed \u2014 child exited ${T}`}),q({kind:"failed",item:t,force:l,detail:`child exited ${T}`,sel:0}))}).catch(T=>{y();let P=T instanceof Error?T.message:String(T);e.ledger({kind:"commit",ok:!1,line:`design for ${t.title} failed \u2014 ${P}`}),q({kind:"failed",item:t,force:l,detail:P,sel:0})})},Te=(0,k.useRef)(We);Te.current=We;let Qe=be&&re&&ht!==void 0,He=E.current.find(t=>t.end==null)?.start??"top",Tt=(0,k.useRef)(new Set),[yn,wt]=(0,k.useState)(!1);(0,k.useEffect)(()=>{Qe?Tt.current.has(He)||(Tt.current.add(He),wt(!0)):wt(!1)},[Qe,He]);let Tn=Qe?[...yn?[xn]:[],`${ht}${xt?` \xB7 next: ${xt}`:""}`]:[],[wn,$n]=(0,k.useState)(0),[Xe,vn]=(0,k.useState)(null),ze=(0,k.useRef)(0),$t=(0,k.useRef)(null),le=t=>{ze.current=t,$n(t)},ce=t=>{$t.current=t,vn(t)},Sn=`${be}:${re}:${ge.current}`;(0,k.useEffect)(()=>{le(0),ce(null)},[Sn]);let In=Xe!=null?{value:Xe,onChange:t=>ce(t),onSubmit:t=>{ce(null),le(0);let l=t.trim();l&&(I(null),e.submit(l))},onCancel:()=>{ce(null),le(0)}}:null,Ge=(t,l)=>{if(/^(uc|sc|ac|t|gap|sty)-\d+$/i.test(t.trim())){let P=t.trim().toLowerCase(),Ce=se(e.state.turns).entries.findIndex(j=>(j.item.logical_id??"").toLowerCase()===P);if(Ce<0){I(`${t.trim().toUpperCase()} isn't in this session's items \u2014 view lists what this session minted`);return}v({level:"detail",cursor:Ce,scroll:0}),C(null);return}let o=Jt(t);if("error"in o){I(o.error);return}let y=se(e.state.turns);if(y.entries.length===0){I("nothing proposed yet \u2014 the first turn is still coming");return}if(o.level==="detail"&&o.num>y.entries.length){I(`no item ${o.num} \u2014 the set has ${y.entries.length} item${y.entries.length===1?"":"s"}`);return}let T=l!=null?et(y,l):y;v(zt(o,T)),C(l!=null&&T.entries.length<y.entries.length?l:null)},vt=(0,B.jsx)(Ot,{verb:s,subject:it,pendingCount:nn,creditsTotal:e.state.credits?.total,state:ke?"waiting on you":D||be||f||x&&x.kind!=="running"?"idle":void 0});if(f){let t=se(e.state.turns),l=A!=null?et(t,A):t,o=t.entries.length-l.entries.length,y=f.level==="list"&&o>0,T=l.entries.length+(y?1:0),P=l.entries[f.cursor],W=f.level==="detail"&&P?e.explainLines(P.item.slug??P.item.temp_ref):null,Ce=f.level==="detail"&&P&&d?d(P.item.logical_id??e.aliasOf(P.item.temp_ref)??P.item.temp_ref):null;return(0,B.jsxs)(S,{flexDirection:"column",children:[(0,B.jsx)(Je,{onToggleThinking:()=>m(j=>!j),onCtrlC:ft,explorer:{isOpen:()=>L.current!==null,onMove:j=>v(L.current&&Me(L.current,{type:"move",delta:j},T)),onEnter:()=>{let j=L.current;if(j){if(j.level==="list"&&y&&j.cursor===l.entries.length){C(null);return}v(Me(j,{type:"enter"},T))}},onBack:()=>{v(L.current&&Me(L.current,{type:"back"},T)),setTimeout(()=>g(j=>j+1),0)}}}),(0,B.jsx)(Gt,{items:l,state:f,verb:s,more:y?{hidden:o}:null,explain:W,grandTotal:t.entries.length,dossier:Ce}),($e??h)&&($e??h).split(`
7
- `).map((j,Rn)=>(0,B.jsx)(n,{color:r.orange,children:j},`nt-${Rn}`)),vt]})}return(0,B.jsxs)(S,{flexDirection:"column",children:[(0,B.jsx)(Je,{onToggleThinking:()=>m(t=>!t),onCtrlC:ft,panel:pn}),en&&(0,B.jsx)(Et,{thinking:tn.body,expanded:!0,thinkingDone:K!=="streaming",maxLines:Yt+1}),st.length>0&&(0,B.jsx)(S,{flexDirection:"column",children:st.map((t,l)=>(0,B.jsx)(n,{children:Bt(t).map((o,y)=>(0,B.jsx)(n,{bold:o.bold,italic:o.italic,color:o.code?r.dim:void 0,children:o.text},y))},`st-${l}`))}),D&&(0,B.jsx)(Pt,{batch:D,qView:qe,sel:cn,focused:un,freeText:hn,multiSelFor:t=>e.multiSelection(t)}),F&&(0,B.jsx)(n,{color:"yellow",children:F.prompt}),($e??h)&&($e??h).split(`
8
- `).map((t,l)=>(0,B.jsx)(n,{color:r.orange,children:t},`nt-${l}`)),ot&&!D&&(0,B.jsxs)(n,{color:r.assuranceAccent,children:[`${Le[lt%Le.length]} ${on} `,(0,B.jsx)(n,{color:r.dim,children:`(${sn}s)`})]}),be&&(0,B.jsx)(ae,{headline:bn,rows:We,sel:wn,focused:Xe==null,legend:"\u2191\u2193 \xB7 \u23CE select \xB7 type = your own words",freeText:In,sublines:Tn}),x?.kind==="picker"&&(0,B.jsx)(ae,{ask:!0,headline:"design tests for which use-case?",rows:x.items.map(t=>({key:t.key,label:t.title,detail:t.badge})),sel:x.sel,focused:!0,legend:"\u2191\u2193 \xB7 \u23CE select \xB7 esc back"}),x?.kind==="confirm"&&(0,B.jsx)(ae,{ask:!0,headline:`${x.item.title} is already designed${x.item.designed==="stale"?" \u2014 and the use-case has changed since":""}`,rows:Zt(x.item).map(t=>({key:t.key,label:t.label,detail:t.detail})),sel:x.sel,focused:!0,legend:"\u2191\u2193 \xB7 \u23CE select \xB7 esc back"}),x?.kind==="running"&&!ke&&(0,B.jsxs)(n,{color:r.assuranceAccent,children:[`${Le[lt%Le.length]} Designing ${x.title}\u2026 `,(0,B.jsx)(n,{color:r.dim,children:`(${Math.floor((Date.now()-x.startedAt)/1e3)}s)`})]}),x?.kind==="ask"&&(0,B.jsx)(ae,{headline:`designed ${x.title}`,rows:je,sel:x.sel,focused:!0,legend:"\u2191\u2193 \xB7 \u23CE select \xB7 esc back"}),x?.kind==="failed"&&(0,B.jsx)(ae,{headline:`design failed \u2014 ${x.item.title} (${x.detail})`,rows:Ue,sel:x.sel,focused:!0,legend:"\u2191\u2193 \xB7 \u23CE select \xB7 esc back"}),K==="pausing"&&(0,B.jsx)(n,{color:r.dim,children:"pausing \u2014 saving session\u2026 (ctrl+c again = force quit)"}),vt]})}export{_r as ChatSurface,Kn as tailVisualRows};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-GQ3NCBYR.js";import"./chunk-RFHMDQXZ.js";import"./chunk-UXPQRALY.js";import"./chunk-FCMLIK7P.js";import"./chunk-CJJXT5DO.js";import"./chunk-QM4S2APK.js";import"./chunk-ZPDM6FO7.js";import"./chunk-BC7UVJJB.js";import"./chunk-NVGBE2DR.js";import"./chunk-EHN5HTUD.js";import"./chunk-L5LI2JF4.js";import"./chunk-7E24OCGX.js";import"./chunk-FRBYGSGJ.js";import"./chunk-6W6AIDLJ.js";import"./chunk-6HYW5RFX.js";import"./chunk-J2KSZUOO.js";import"./chunk-5YPBPZUR.js";import"./chunk-IAHKTEET.js";import"./chunk-Y5RNCJAN.js";import"./chunk-5EOX4MEY.js";import"./chunk-A2IQRVPR.js";import"./chunk-B4LLKQTK.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as EvidenceViewOffer};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-KCBS57IF.js";import"./chunk-77WMTCUQ.js";import"./chunk-4SJC64KQ.js";import"./chunk-TDPWFYTJ.js";import"./chunk-T7ZPMTGS.js";import"./chunk-NR23HZU4.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-L5LI2JF4.js";import"./chunk-CH3VWCRZ.js";import"./chunk-4BAMZSFU.js";import"./chunk-YCCUBQY4.js";import"./chunk-RQYS3KGU.js";import"./chunk-Y5RNCJAN.js";import"./chunk-5EOX4MEY.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-A2IQRVPR.js";import"./chunk-VE3SUJMA.js";import"./chunk-WREVEATJ.js";import"./chunk-4GLYNAK7.js";import"./chunk-B4LLKQTK.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{g as a}from"./chunk-LGVHW4ZA.js";import"./chunk-5YHVK2EO.js";import"./chunk-E5PWL3BG.js";import"./chunk-TDPWFYTJ.js";import"./chunk-T7ZPMTGS.js";import"./chunk-AIMINJVP.js";import"./chunk-5Y2G4NC7.js";import"./chunk-Y5RNCJAN.js";import"./chunk-5EOX4MEY.js";import"./chunk-A2IQRVPR.js";import"./chunk-J3EMJ7US.js";import"./chunk-5WE4DHXL.js";import"./chunk-DFS4RMVP.js";import"./chunk-B4LLKQTK.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as TestMdRunView};
@@ -1,6 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as w}from"./chunk-MAO5BAQI.js";import"./chunk-3RZ63RBO.js";import"./chunk-KHU7C6EE.js";import"./chunk-JSF5JYZC.js";import"./chunk-J44RN3FB.js";import"./chunk-JFAFKHDX.js";import"./chunk-YKTYVJBN.js";import"./chunk-CVOGP253.js";import"./chunk-427OQS2N.js";import"./chunk-3C5GMAM4.js";import"./chunk-GG43HSU2.js";import"./chunk-FMR2KPSK.js";import"./chunk-DNNZ353O.js";import"./chunk-FHKDTM5L.js";import"./chunk-ZPDM6FO7.js";import{a as u}from"./chunk-BC7UVJJB.js";import"./chunk-NVGBE2DR.js";import"./chunk-L5LI2JF4.js";import"./chunk-7E24OCGX.js";import"./chunk-FRBYGSGJ.js";import"./chunk-6W6AIDLJ.js";import"./chunk-6HYW5RFX.js";import"./chunk-J2KSZUOO.js";import"./chunk-5YPBPZUR.js";import"./chunk-IAHKTEET.js";import"./chunk-5EOX4MEY.js";import"./chunk-B4LLKQTK.js";import"./chunk-UR6MHSHU.js";import{existsSync as y}from"fs";var O=new Set(["interactive","agent","ci","override"]);function C(e){return e.mode!=null&&!O.has(e.mode)?{error:`design: --mode must be interactive | agent | ci | override, got '${e.mode}'`}:e.strength!=null&&e.strength!=="pairwise"&&e.strength!=="3-wise"?{error:`design: --strength must be pairwise | 3-wise, got '${e.strength}'`}:e.max!=null&&(!Number.isInteger(e.max)||e.max<1)?{error:"design: --max must be a positive integer"}:!e.useCase&&!e.resume?{error:"design: --use-case is required (or --resume <sid> \u2014 the session remembers its use-case)"}:{useCase:e.useCase,max:e.max,strength:e.strength,mode:e.mode,force:e.force,resume:e.resume,plan:e.plan,message:e.message,because:e.because,changeDelta:e.changeDelta,priorDesign:e.priorDesign}}async function _(e){let g=async(r,n)=>{if(process.stderr.write(r+`
3
- `),e.mode!=="agent")return 2;let{makeHeadlessIO:i,agentRefusal:o}=await import("./headless-io-PWW6YKH2.js");return o(i("ndjson","design"),r,n)},m=C(e);if("error"in m)return g(m.error);let a=m;{let{validateResumeMessage:r}=await import("./headless-io-PWW6YKH2.js"),n=r(a,"design");if(n)return g(n)}if(!y(u(process.cwd())))return g("error: no context store here (run `kane-cli context ingest` + `kane-cli context extract` first)","NO_STORE");let t=null;try{if(!a.mode&&!process.stdin.isTTY)return process.stderr.write(`design: no TTY \u2014 pass an explicit --mode agent|ci|override to run headless
4
- `),2;let r=a.mode??"interactive";if(r==="interactive"){if(!process.stdin.isTTY||!process.stdout.isTTY)return process.stderr.write(`design: --mode interactive needs a TTY on stdin and stdout (use --mode agent|ci|override headless)
5
- `),2;let{bindDesignInteractive:s}=await import("./interactive-bind-PTAZVCE7.js");return await s(a)}let{resolveAgentAuthEnv:n}=await import("./spawner-YNYB4Z7K.js"),{runAgent:i}=await import("./bridge-BTSWCJ3B.js"),{preflightTurn:o}=await import("./turn-preflight-JGYT7LXP.js"),{makeInterruptGuard:h}=await import("./interrupt-guard-UREUWNRL.js"),{baseUrlAdvisory:v}=await import("./turn-preflight-JGYT7LXP.js"),{makeHeadlessIO:T,resolveEncoding:x,guardedChannels:D}=await import("./headless-io-PWW6YKH2.js");t=T(x(r),"design");let{telemetryBootstrap:b,telemetryEnvName:E}=await import("./bootstrap-RPT3JOGD.js"),c=b({verb:"design",mode:r,contextRoot:u(process.cwd()),env:E(),resumeSid:a.resume,write:!0,longSession:!0}),l={...await n(),...c.spawnEnv()},p=v();p&&t.out(p);let d=h(i,s=>t.out(s)),f=D(t,()=>d.interrupted(),/^error: (design agent failed|the design agent ended)/);try{let s=await w({...a,mode:r},{contextDir:u(process.cwd()),agent:d.agent,preflightTurn:()=>o(l),ask:async()=>[],out:f.out,emit:f.emit,progress:t.progress,isTTY:!1,auth:l,telemetry:c});return d.interrupted()&&s!==3?(t.out("interrupted \u2014 no session saved"),await c.end({exit_code:130}),t.done(130)):(s===1&&t.out(c.supportFooter()),await c.end({exit_code:s}),t.done(s))}finally{d.dispose()}}catch(r){let n=r instanceof Error?r.message:String(r);t?.event({type:"error",message:`error: design failed: ${n}`});let i=t?o=>t.out(o):o=>process.stderr.write(o+`
6
- `);return i(`error: design failed: ${n}`),(process.env.ASSURANCE_LOG_LEVEL??"").toLowerCase()==="debug"&&r instanceof Error&&r.stack&&i(r.stack),i("hint: per-run trace logs live under .context/logs/ (design-*.log)"),t?t.done(1):1}}export{_ as designTestsCommand};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b}from"./chunk-WTXHOWUP.js";import"./chunk-FHKDTM5L.js";import"./chunk-2XMJ6YAE.js";import"./chunk-BKM2LWU2.js";import"./chunk-Y5RNCJAN.js";import"./chunk-5EOX4MEY.js";import"./chunk-RZ4F3BHX.js";import"./chunk-B4LLKQTK.js";import"./chunk-UR6MHSHU.js";export{b as telemetryBootstrap,a as telemetryEnvName};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-N4LMQR7C.js";import"./chunk-RCTM7NGT.js";import"./chunk-UR6MHSHU.js";export{a as runAgent};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as V,c as te}from"./chunk-JFAFKHDX.js";import{a as ne}from"./chunk-427OQS2N.js";import{a as w,b as ee}from"./chunk-FMR2KPSK.js";import{d as Z}from"./chunk-NVGBE2DR.js";import{a as X}from"./chunk-7E24OCGX.js";import"./chunk-FRBYGSGJ.js";import{c as Y,d as z,n as Q}from"./chunk-6W6AIDLJ.js";import{a as j,b as F}from"./chunk-6HYW5RFX.js";import{c as J,e as W}from"./chunk-J2KSZUOO.js";import{e as L,f as A,g as P,h as x}from"./chunk-5YPBPZUR.js";import"./chunk-IAHKTEET.js";import"./chunk-UR6MHSHU.js";var de=new Set(["approve","edit","reject"]);function ye(k){let{contextDir:f,graph:s,ops:oe,by:l}=k,N=k.mintable??ne(),T=J(f);if(s.latestHash!==T)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(s.latestHash)} but chain head is ${String(T)} \u2014 re-open and retry`}]};let C=[],h=[],M=new Set;for(let e of oe){if(s.appliedEvents.has(e.eventId)||M.has(e.eventId)){C.push(e.eventId);continue}M.add(e.eventId),h.push(e)}if(h.length===0)return{record:null,errors:null,applied:[],skipped:C,minted:[],staleDelta:[]};let o=[],$=[],y=[],m=[],I=[],O=[],_=[...k.judgements??[]],D=[],q=new Map,B=new Set,G=[],b=new Set,se=new Set(N),H=new Set;for(let e of h){if(!de.has(e.kind))continue;let n=e.target,t=s.resolve(n)?.cid??n;H.has(t)&&o.push({code:"MULTIPLE_TERMINAL_OPS",detail:`${n} has more than one terminal op in this turn \u2014 normalize latest-wins first`}),H.add(t)}let E=(e,n,t)=>{let i=s.resolve(n);if(!i)return o.push({code:"UNKNOWN_NODE",detail:`${e}: ${n} names nothing in the graph`}),null;let p=s.tipOf(i.cid);return p!==t||s.superseded.has(t)?(o.push({code:"EXPECTED_CID_MOVED",detail:`${e}: ${n} moved or was archived since it was displayed`,data:{tip:p}}),null):t};for(let e of h)if(e.kind==="approve"){let n=E("approve",e.target,e.expectedCid);n&&m.push({id:n,kind:"review-item",resolution:"approved",edit:null,reason:null,by:l})}else if(e.kind==="reject"){let n=E("reject",e.target,e.expectedCid);if(!n)continue;if(m.push({id:n,kind:"review-item",resolution:"rejected",edit:null,reason:e.reason,by:l}),e.redirectTo!==void 0){let t=s.resolve(e.redirectTo);if(!t||t.superseded){o.push({code:"UNKNOWN_NODE",detail:`reject.redirectTo: ${e.redirectTo} is not a live node`});continue}I.push({kind:"node",old:n,new:t.cid,reason:e.reason,by:l})}}else if(e.kind==="edit"){let n=E("edit",e.target,e.expectedCid);if(!n)continue;let t=s.getNode(n);if(!t){o.push({code:"UNKNOWN_NODE",detail:`edit: ${e.target} node file unreadable`});continue}let i={...t.content};for(let[c,u]of Object.entries(e.edit))u!==void 0&&(i[c]=u);if(typeof i.title=="string"&&!i.title.trim()){o.push({code:"EMPTY_TITLE",detail:`edit: ${e.target} edited title is empty`});continue}let p=A(t.label,i);if(p.length>0){for(let c of p)o.push({code:c.code,detail:`edit ${e.target}: ${c.detail}`});continue}let d=j(t.label,i);if(d===n){m.push({id:n,kind:"review-item",resolution:"approved",edit:null,reason:null,by:l});continue}$.push({cid:d,label:t.label,content:i}),I.push({kind:"node",old:n,new:d,reason:e.reason??"edited in chat",by:l}),m.push({id:d,kind:"review-item",resolution:"edited",edit:{...e.edit},reason:null,by:l})}else if(e.kind==="enhance"){if(!E("enhance",e.target,e.expectedCid))continue;for(let t of e.edges){let i=s.nodeLabel.get(t.src)??"(unknown)",p=s.nodeLabel.get(t.dst)??"(unknown)";for(let r of x(t.type,i,p,t.props))o.push({code:r.code,detail:`enhance ${e.target}: ${r.detail}`});let d=F(t.type,t.src,t.dst,t.props);if(s.edgesFrom(t.src).some(r=>r.ecid===d)||y.some(r=>r.ecid===d))continue;let c=Y(s,t.type,t.src,t.dst,G);c&&o.push(c);let u=z(s,t.type,t.src,t.dst);u&&o.push(u);let a=P(t.type)?.cardinality;if(a==="one-live-per-src"||a==="one-live-per-src-and-dst"){let r=`${t.type}|${t.src}`;b.has(r)&&o.push({code:"CARDINALITY_VIOLATION",detail:`${t.type} from ${t.src}: two one-live edges in one turn`}),b.add(r)}if(a==="one-live-per-src-and-dst"){let r=`${t.type}|dst|${t.dst}`;b.has(r)&&o.push({code:"CARDINALITY_VIOLATION",detail:`${t.type} onto ${t.dst}: two one-live edges in one turn (strict 1:1)`}),b.add(r)}y.push({ecid:d,type:t.type,src:t.src,dst:t.dst,props:t.props}),G.push({src:t.src,dst:t.dst,type:t.type})}}else if(e.kind==="add"){if(!se.has(e.label)){o.push({code:"GATED_LABEL",detail:`add: ${e.label} is not mintable in v1 (gate: ${N.join("|")})`,data:{gate:[...N]}});continue}let n=s.heads.get(e.convSourceId),t=s.convChains.get(e.convSourceId);if(typeof n!="string"||!t){o.push({code:"CONV_SOURCE_MISSING",detail:`add: ${e.convSourceId} is not a live conversation source`});continue}let i=s.getNode(n)?.content?.blob,p=typeof i=="string"?Z(f,i)?.toString("utf8")??"":"",d=ee(p,e.cite.turn);if(d===null){o.push({code:"BAD_ANCHOR",detail:`add: ${w(e.cite.turn)} does not resolve in ${e.convSourceId}`});continue}if(!d.includes(e.cite.quote)){o.push({code:"QUOTE_MISMATCH",detail:`add: quote is not verbatim within ${w(e.cite.turn)}`});continue}let c={...e.content,derived:!0},u=A(e.label,c);if(u.length>0){for(let g of u)o.push({code:g.code,detail:`add: ${g.detail}`});continue}let a=j(e.label,c),r={source_id:e.convSourceId,source_cid:n,anchor:w(e.cite.turn),quote:e.cite.quote};for(let g of x(L.DERIVES,"source",e.label,r))o.push({code:g.code,detail:`add: ${g.detail}`});$.push({cid:a,label:e.label,content:c}),y.push({ecid:F("DERIVES",n,a,r),type:L.DERIVES,src:n,dst:a,props:r}),e.rationale&&_.push({about:a,rationale:e.rationale,by:l});let v=Q(e.label,g=>B.has(g),s.names.keys());v!==null&&(B.add(v),O.push({cid:a,slug:v,by:l})),D.push({cid:a,...v!==null?{slug:v}:{}}),q.set(e.eventId,a)}if(o.length)return{record:null,errors:o};let U=new Date().toISOString();for(let e of h){if(e.kind==="add"){let n=q.get(e.eventId);n&&V(f,{ts:U,command:"extract-chat",id:n,verdict:"add",polarity:"preference",tag:e.label,by:l,event_id:e.eventId,target:n});continue}for(let n of te(e,{ts:U,command:"extract-chat",by:l}))V(f,n)}let K=h.map(e=>e.eventId).sort(),re=W(f,{ts:new Date().toISOString(),proposal_id:null,nodes:$,edges:y,review:m,supersessions:I,...O.length>0?{names:O}:{},..._.length>0?{judgements:_}:{},event_ids:K,source_head_moves:{}},{expectPrev:T}),R=X(f),S=new Set;for(let e of I)if(e.kind==="node"){S.add(e.old);for(let n of R.edgesInto(e.old))S.add(n.src)}for(let e of D)S.add(e.cid);let ie=[...S].map(e=>({cid:e,state:R.stale(R.tipOf(e))})).filter(e=>e.state!=="fresh");return{record:re.record,errors:null,applied:K,skipped:C,minted:D,staleDelta:ie}}export{ye as commitChatTurn};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b,c}from"./chunk-7YPK6EDR.js";import"./chunk-GG43HSU2.js";import"./chunk-FMR2KPSK.js";import"./chunk-NVGBE2DR.js";import"./chunk-6HYW5RFX.js";import"./chunk-J2KSZUOO.js";import"./chunk-5YPBPZUR.js";import"./chunk-IAHKTEET.js";import"./chunk-UR6MHSHU.js";export{c as makeChatController,b as questionStub,a as recommendationPicks};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as g}from"./chunk-5YPBPZUR.js";function $(s,n){let t=null;for(let[i,e]of s.designOf)i!==n&&s.tipOf(i)!==n||(t==null||e.seq>t.seq)&&(t={...e,designed_at_cid:i});return t}function v(s,n){let t=new Map;for(let[c,o]of s.superseded)o!=null&&t.set(o,c);let i=[n],e=n;for(;t.has(e);)e=t.get(e),i.unshift(e);return i}function h(s,n,t){let i=s.resolve(n);if(!i){let r=[...s.names.keys()].filter(m=>m.startsWith("uc-")).sort().slice(0,6);return{ok:!1,code:2,message:`unknown use-case '${n}' \u2014 no live node by that logical id or cid${r.length?` (known: ${r.join(", ")})`:""}`}}let e=i.tip;if(s.superseded.has(e)&&s.superseded.get(e)===null)return{ok:!1,code:2,message:`use-case '${n}' was removed (tombstoned) \u2014 nothing to design`};let c=s.nodeLabel.get(e);if(c!==g.USECASE)return{ok:!1,code:2,message:`'${n}' is a ${c??"missing node"}, not a use-case \u2014 design runs per use-case`};let o=s.nameOf.get(e)??s.nameOf.get(i.cid)??e.slice(0,19);if(s.trust.get(e)==="archived"){let r=s.archivedReason.get(e);return{ok:!1,code:2,message:`use-case '${o}' is archived${r?` (${r})`:""} \u2014 design runs only over live use-cases`}}let d=$(s,e);if(d==null||t)return{ok:!0};let a=v(s,e),l=a.length;if(d.designed_at_cid===e)return{ok:!1,code:2,message:`'${o}' is already designed @ v${l} \u2014 current; use --force to redesign`};let u=a.indexOf(d.designed_at_cid),f=u>=0?`v${u+1}`:"an earlier version";return{ok:!1,code:2,message:`'${o}' was designed @ ${f} \u2014 the use-case is now @ v${l} (STALE); use --force to redesign`}}export{$ as a,h as b};
@@ -1,14 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as j}from"./chunk-4XSW6WZD.js";import{a as U}from"./chunk-DNNZ353O.js";import{d as F}from"./chunk-QM4S2APK.js";import{a as x}from"./chunk-7E24OCGX.js";import{a as D,b as M,e as G,f as N}from"./chunk-6W6AIDLJ.js";import{b as V}from"./chunk-J2KSZUOO.js";import{d as b,e as $,g as P}from"./chunk-5YPBPZUR.js";function W(e,n,t,i,o){let d=t.rows.filter(p=>{let u=i.get(p.temp_ref);return u!==void 0&&u!=="reject"});if(d.length===0)return{record:null,errors:null};let s={version:1,read_basis:n.latestHash,source:{source_id:t.source_id,source_cid:n.heads.get(t.source_id)??""},use_cases:d.map(p=>p.uc)},g=new Map;for(let p of d){let u=i.get(p.temp_ref);typeof u=="object"?g.set(p.temp_ref,{resolution:"edited",edit:u.edited}):g.set(p.temp_ref,{resolution:p.uc.matches_existing&&p.uc.changed?"edited":"approved"})}let l=ee(s,n,t.staged_source_cid);if(l.errors!==null)return{record:null,errors:l.errors};let r=l.proposal,f=s.source.source_cid?L(e,n,s.source.source_cid):null;if(f!==null){r=Z(r,f);let p=G(r,z(f),n);if(p.length>0)return{record:null,errors:[{code:"HELD_CITES_STALE",detail:"the source moved after this plan staged \u2014 its quotes no longer verify against the current head; re-run kane-cli maintain reconcile to re-stage"},...p]}}let m=`held-${(n.latestHash??"root").slice(-12)}-${d.length}`;return N({contextDir:e,graph:n,proposal:r,proposalId:m,verdicts:g,by:o,autoName:!0})}function z(e){return e.replace(/\n$/,"").split(`
3
- `).map((t,i)=>`${String(i+1).padStart(4,"0")}| ${t}`).join(`
4
- `)}function Z(e,n){let t=n.replace(/\n$/,""),i=z(n),o=d=>{if(!d?.quote)return d;let s=M(i,d.anchor);if(s!==null&&s.includes(d.quote))return d;let g=t.indexOf(d.quote);if(g===-1||t.indexOf(d.quote,g+1)!==-1)return d;let l=t.slice(0,g).split(`
5
- `).length,r=l+d.quote.replace(/\n$/,"").split(`
6
- `).length-1;return{...d,anchor:`L${l}-L${r}`}};return{...e,use_cases:e.use_cases.map(d=>({...d,cite:o(d.cite)??d.cite,...d.criteria?{criteria:d.criteria.map(s=>({...s,cite:o(s.cite)??s.cite}))}:{},...d.updated?.criteria?{updated:{...d.updated,criteria:d.updated.criteria.map(s=>({...s,cite:o(s.cite)??s.cite}))}}:{}}))}}function ee(e,n,t){let i=[],o=n.mediaOf(e.source.source_cid).images??[],d=t!==void 0?n.mediaOf(t).images??[]:null,s=(l,r)=>{let f=l?D(l.anchor):null;if(!l||f?.kind!=="img-part")return l;if(d===null)return i.push({code:"HELD_CITES_STALE",detail:`${r}: this plan predates image-part staging \u2014 ${l.anchor} cannot be verified against the version it staged under; re-run kane-cli maintain reconcile to re-stage`}),l;let m=d.find(c=>c.ref===f.ref)?.blob;if(m===void 0)return i.push({code:"HELD_CITES_STALE",detail:`${r}: ${l.anchor} names no decodable image of the staged version \u2014 re-run kane-cli maintain reconcile to re-stage`}),l;if(o.some(c=>c.ref===f.ref&&c.blob===m))return l;let p=o.filter(c=>c.blob===m),u=p.filter(c=>c.delivery==="selected");if(u.length===1)return{...l,anchor:`img#${u[0].ref}`};if(p.length===1)return{...l,anchor:`img#${p[0].ref}`};if(p.length===0){let c=d.find(h=>h.ref===f.ref)?.appearance;if(c!==void 0){let h=o.filter(v=>v.appearance===c),E=h.filter(v=>v.delivery==="selected");if(E.length===1)return{...l,anchor:`img#${E[0].ref}`};if(h.length===1)return{...l,anchor:`img#${h[0].ref}`}}}return i.push({code:"HELD_CITES_STALE",detail:`${r}: the image behind ${l.anchor} is ${p.length===0?"no longer in":"ambiguous in"} the current head \u2014 re-run kane-cli maintain reconcile to re-stage`}),l};return{proposal:{...e,use_cases:e.use_cases.map(l=>({...l,cite:s(l.cite,l.temp_ref)??l.cite,...l.criteria?{criteria:l.criteria.map(r=>({...r,cite:s(r.cite,l.temp_ref)??r.cite}))}:{},...l.updated?.criteria?{updated:{...l.updated,criteria:l.updated.criteria.map(r=>({...r,cite:s(r.cite,l.temp_ref)??r.cite}))}}:{}}))},errors:i.length>0?i:null}}function J(e,n,t=[]){let i=j(e,n),o=new Set,d=[],s=f=>{!f||o.has(f)||(o.add(f),d.push(y(e,f)))};for(let f of i.pairs)s(f.scenario),s(f.test);for(let[f,m]of i.verifies){s(f);for(let p of m)s(p)}if(t.length===0)return{stale_refs:d};let g=f=>`${String(f.props.source_id)}\0${String(f.props.anchor)}`,l=new Set;for(let{cid:f}of e.byLabel(b.USECASE))if(e.tipOf(f)===n)for(let m of e.edgesInto(f)){if(m.type!==$.DERIVES)continue;let p=m.props.claim;typeof p=="string"&&t.includes(p)&&l.add(g(m))}if(l.size===0)return{stale_refs:d};let r=new Set;for(let[f,m]of i.verifies)if(e.edgesInto(f).some(u=>u.type===$.DERIVES&&l.has(g(u)))){r.add(y(e,f));for(let u of m)r.add(y(e,u))}return{stale_refs:d,...r.size>0?{direct_refs:[...r]}:{}}}var B="this release plans changes only \u2014 blast-radius impact and drift meaning-checks are not measured, and REMOVE rows are never executed automatically",te="suite untouched; graph updated";function T(e,n){return!e.superseded.has(n)&&e.trust.get(n)!=="archived"}function y(e,n,t=new Set){let i=e.nameOf.get(n);if(i!==void 0)return i;if(t.has(n))return n;t.add(n);for(let[o,d]of e.superseded){if(d!==n)continue;let s=y(e,o,t);if(s!==o)return s}return n}function C(e){return String(e).slice(0,19)}function A(e,n,t){let i=e.edgesFrom(n).find(o=>o.type===t);return i?e.tipOf(i.dst):null}function Y(e,n){let t=e.nodeLabel.get(n);if(t===b.USECASE)return n;if(t===b.SCENARIO)return A(e,n,$.BELONGS_TO);if(t===b.AC){let i=A(e,n,$.SCOPED_TO);return i?e.nodeLabel.get(i)===b.USECASE?i:A(e,i,$.BELONGS_TO):null}if(t===b.TEST){let i=A(e,n,$.AUTOMATES);return i?A(e,i,$.BELONGS_TO):null}return null}function q(e,n){let t=[],i=new Map;for(let o of e.derivesInto(n))i.set(String(o.props.source_id),o);for(let[o,d]of i){let s=e.heads.get(o);if(s==null){t.push(`DERIVES pin ${o} @ ${C(d.props.source_cid)} \u2014 source retired`);continue}if(s!==d.props.source_cid){let g=e.convChains.get(o)?.chain;if(g&&g.includes(String(d.props.source_cid)))continue;t.push(`DERIVES pin ${o} @ ${C(d.props.source_cid)} \u2014 source head moved to ${C(s)}`)}}for(let o of e.edgesFrom(n))P(o.type)?.pin?.comparesTo==="dst_tip"&&e.superseded.has(o.dst)&&t.push(`${o.type} pin \u2192 ${y(e,o.dst)} \u2014 target superseded`);return t.join("; ")||"structural pin broken"}var ne=new Set([b.USECASE,b.SCENARIO,b.AC,b.TEST]);function O(e,n){return e.ref<n.ref?-1:e.ref>n.ref?1:0}function L(e,n,t){let i=U(e,n,t);return i===null?null:i.toString("utf8")}function re(e,n,t,i,o){let d=t.props.quote;if(typeof d=="string"&&d.length>0)return i.includes(d);let s=String(t.props.source_cid);o.has(s)||o.set(s,L(e,n,s));let g=o.get(s);if(g===null)return!1;let l=M(g,String(t.props.anchor));return l===null?!1:l.split(`
7
- `).some(r=>r.trim().length>0&&i.includes(r.trim()))}function se(e,n,t){let i=D(String(n.props.anchor));if(i?.kind!=="img-part")return!1;let d=(e.mediaOf(String(n.props.source_cid)).images??[]).find(r=>r.ref===i.ref),s=d?.blob;if(s===void 0)return!1;let g=e.mediaOf(t).images??[];if(g.some(r=>r.blob===s))return!0;let l=d?.appearance;return l!==void 0&&g.filter(r=>r.appearance===l).length===1}var K=128*1024,X=64*1024;function oe(e,n){let t=e.split(`
8
- `),i=n.split(`
9
- `),o=0;for(;o<t.length&&o<i.length&&t[o]===i[o];)o++;let d=t.length,s=i.length;for(;d>o&&s>o&&t[d-1]===i[s-1];)d--,s--;if(d===o&&s===o)return"";let g=t.slice(o,d),l=i.slice(o,s),f=ie(g,l,2e3),m=[];if(f===null)m.push(`@@ old L${o+1}-L${d} \u2192 new L${o+1}-L${s} @@`,...g.map(p=>`- ${p}`),...l.map(p=>`+ ${p}`));else{let p=f.map((c,h)=>c.op==="="?-1:h).filter(c=>c>=0),u=0;for(;u<p.length;){let c=u;for(;c+1<p.length&&p[c+1]-p[c]<=3;)c++;let h=Math.max(p[u]-1,0),E=Math.min(p[c]+1,f.length-1),v=f.slice(h,E+1),S=o+(v[0].ai??0)+1,w=o+(v[0].bi??0)+1,a=v.filter(R=>R.op!=="+").length,_=v.filter(R=>R.op!=="-").length;m.push(`@@ old L${S}-L${S+Math.max(a-1,0)} \u2192 new L${w}-L${w+Math.max(_-1,0)} @@`);for(let R of v)m.push(R.op==="="?` ${R.line}`:`${R.op} ${R.line}`);u=c+1}}return m.join(`
10
- `)}function ie(e,n,t){let i=e.length,o=n.length,d=Math.min(i+o,t),s=new Map([[1,0]]),g=[],l=!1;for(let p=0;p<=d&&!l;p++){g.push(new Map(s));for(let u=-p;u<=p;u+=2){let c=u===-p||u!==p&&(s.get(u-1)??0)<(s.get(u+1)??0)?s.get(u+1)??0:(s.get(u-1)??0)+1,h=c-u;for(;c<i&&h<o&&e[c]===n[h];)c++,h++;if(s.set(u,c),c>=i&&h>=o){l=!0;break}}}if(!l)return null;let r=i,f=o,m=[];for(let p=g.length-1;p>0;p--){let u=g[p],c=r-f,h=c===-p||c!==p&&(u.get(c-1)??0)<(u.get(c+1)??0)?c+1:c-1,E=u.get(h)??0,v=E-h;for(;r>E&&f>v;)m.push({op:"=",line:e[r-1],ai:r-1,bi:f-1}),r--,f--;p>0&&(r===E?(m.push({op:"+",line:n[f-1],ai:r,bi:f-1}),f--):(m.push({op:"-",line:e[r-1],ai:r-1,bi:f}),r--))}for(;r>0&&f>0;)m.push({op:"=",line:e[r-1],ai:r-1,bi:f-1}),r--,f--;for(;r>0;)m.push({op:"-",line:e[r-1],ai:r-1,bi:0}),r--;for(;f>0;)m.push({op:"+",line:n[f-1],ai:0,bi:f-1}),f--;return m.reverse()}function ce(e){let n=Buffer.byteLength(e,"utf8");if(n<=K+X)return{diff:e,truncated:!1};let t=Buffer.from(e,"utf8"),i=K;for(;i>0&&(t[i]&192)===128;)i--;let o=n-X;for(;o<n&&(t[o]&192)===128;)o++;let d=t.subarray(0,i).toString("utf8"),s=t.subarray(o).toString("utf8");return{diff:`${d}
11
- \u2026 [diff truncated: ${n-i-(n-o)} bytes omitted] \u2026
12
- ${s}`,truncated:!0}}function ae(e,n){let t=x(e),i=t.heads.get(n);if(typeof i!="string")return null;let o=[];for(let u of V(e).records){let c=u.source_head_moves?.[n];c!==void 0&&c!==o[o.length-1]&&o.push(c)}let d=o.lastIndexOf(i),s=d>0?o[d-1]:null;if(typeof s!="string"||s===i)return null;let g=L(e,t,s),l=L(e,t,i);if(g===null||l===null)return null;let{diff:r,truncated:f}=ce(oe(g,l)),m=new Set,p=[];for(let u of t.edgesFrom(s))u.type!==$.DERIVES||t.nodeLabel.get(u.dst)!==b.USECASE||m.has(u.dst)||(m.add(u.dst),p.push({id:u.dst,title:String(t.getNode(u.dst)?.content.title??"")}));return{source_id:n,old_head:s,new_head:i,diff:r,...f?{truncated:!0}:{},prior_ucs:p}}function de(e,n,t){let i=e.getNode(n)?.content??{},o=e.getNode(t)?.content??{},s=[...new Set([...Object.keys(i),...Object.keys(o)])].sort().filter(g=>JSON.stringify(i[g])!==JSON.stringify(o[g]));return s.length>0?`updated: ${s.join(", ")}`:"updated"}function le(e,n,t,i,o,d,s){let g=new Set((s?.rows??[]).map(c=>c.matched_cid).filter(c=>!!c)),l=[];for(let[c,h]of t.superseded)h===null||c===h||n.superseded.has(c)||t.nodeLabel.get(c)===b.USECASE&&l.push({kind:"MODIFY",ref:y(t,c),old_cid:c,new_cid:h,summary:de(t,c,h)});let r=d.map(c=>({kind:"ADD",ref:y(t,c),cid:c}));for(let c of s?.rows??[])c.kind==="MODIFY"&&c.matched_cid?l.push({kind:"MODIFY",ref:y(t,c.matched_cid),old_cid:c.matched_cid,new_cid:null,summary:`${c.why} (staged)`}):c.kind==="ADD"&&r.push({kind:"ADD",ref:c.title,cid:null});let f=[],m=L(e,t,o),p=new Map;for(let{cid:c}of t.byLabel(b.USECASE)){if(!T(t,c)||g.has(c))continue;let h=t.derivesInto(c),E=h.filter(w=>String(w.props.source_id)===i);E.length===0||E.some(w=>w.props.source_cid===o)||E.some(w=>{let a=String(w.props.anchor),_=D(a);return _?.kind==="img-whole"?!1:_?.kind==="img-part"?se(t,w,o):m!==null&&re(e,t,w,m,p)})||h.some(w=>{let a=String(w.props.source_id);if(a===i)return!1;let _=t.heads.get(a);return _!=null})||f.push({kind:"ARCHIVE",ref:y(t,c),cid:c,why:`evidence decayed: no quote from ${i} relocates into @${C(o)}, no other live source, no fresh evidence this run`,impact:J(t,t.tipOf(c))})}let u=(c,h)=>c.ref<h.ref?-1:c.ref>h.ref?1:0;return[...l.sort(u),...r.sort(u),...f.sort(u)]}function Ee(e,n,t,i,o){let d=n.rows.find(u=>u.temp_ref===t);if(!d)return{ok:!1,message:`held item ${t} missing from the plan artifact`};let s=d,g=x(e);if(s.matched_cid){let u=g.tipOf(s.matched_cid);if(g.superseded.get(u)===null)return{ok:!1,message:`use-case for "${s.title}" was retired meanwhile \u2014 nothing to update`};u!==s.matched_cid&&(s={...s,matched_cid:u,uc:{...s.uc,matches_existing:{cid:u}}})}let l=o?{edited:o}:"approve",r=W(e,g,{source_id:n.source_id,...n.staged_source_cid!==void 0?{staged_source_cid:n.staged_source_cid}:{},rows:[s]},new Map([[s.temp_ref,l]]),i);if(r.errors)return{ok:!1,message:r.errors.map(u=>`${u.code}: ${u.detail}`).join("; ")};let f=x(e),m=s.matched_cid?f.tipOf(s.matched_cid):r.record?.nodes.find(u=>u.label==="usecase")?.cid??r.record?.review[0]?.id;return{ok:!0,ref:m?y(f,m):s.title,kind:s.kind}}async function ve(e,n,t,i={}){let o=x(e),d=o.heads.get(n)??null,s=new Set(o.staleList().filter(a=>a.state==="stale").map(a=>a.cid)),g=await t.reingest(n);if(g.status==="unchanged"&&!i.resumeHeld)return{source_id:n,changed:!1,head:{status:g.status,before:d,after:g.cid},note:`nothing to reconcile \u2014 ${n} is unchanged`,skipped_arms:B,changeset:[],rows:[]};let l=i.resumeHeld?{minted:[],matched:[],held:i.resumeHeld}:await t.reextract(n),r=x(e),f=l.minted.map(a=>{let _=y(r,a);return{kind:"ADD",origin:"content-change",ref:_,reason:`new use-case extracted from ${n}`,provenance:`extraction commit \u2014 DERIVES ${n} @ ${C(g.cid)}`,action:`kane-cli design tests --use-case ${_}`}}),m=r.staleList().filter(a=>a.state==="stale"&&!s.has(a.cid)&&T(r,a.cid)).map(a=>a.cid),p=m.map(a=>{let _=y(r,a),R=ne.has(r.nodeLabel.get(a)??"");return{kind:"MODIFY",origin:"structural-stale",ref:_,reason:"stale (structural)",provenance:q(r,a),action:R?`kane-cli maintain evolve ${_}`:`kane-cli design explain ${_}`}}),u=[],c=[];for(let a of l.held?.rows??[])if(a.kind==="ADD")u.push({kind:"ADD",origin:"content-change",ref:a.title,held_ref:a.temp_ref,reason:`${a.why} (staged \u2014 commits on approval)`,provenance:`staged extraction of ${n} @ ${C(g.cid)}`,action:"approve to commit + design"});else{let _=a.matched_cid?r.tipOf(a.matched_cid):null,R=_?r.getNode(_)?.content.criteria??[]:[],I=(a.uc.updated?.criteria??[]).map(k=>typeof k=="string"?k:k.text),Q=[...I.filter(k=>!R.includes(k)),...a.uc.updated?.criteria!==void 0?R.filter(k=>!I.includes(k)):[]],H=_?J(r,_,Q):void 0;c.push({kind:"MODIFY",origin:"content-change",ref:a.matched_cid?y(r,a.matched_cid):a.title,held_ref:a.temp_ref,reason:`${a.why} (staged \u2014 commits on approval)`,provenance:`staged extraction of ${n} @ ${C(g.cid)}`,action:"approve to commit the updated version (old\u2192new redirect)",...H?{impact:H}:{}})}let h=new Set;for(let a of[...l.minted,...l.matched])h.add(r.tipOf(a));for(let a of l.held?.rows??[])a.matched_cid&&h.add(r.tipOf(a.matched_cid));for(let a of m){let _=Y(r,r.tipOf(a));_&&r.nodeLabel.get(_)===b.USECASE&&h.add(r.tipOf(_))}let E=[];for(let a of await F(r,"design")){if(a.kind!=="no-verifies")continue;let _=r.resolve(a.ref);if(!_)continue;let R=Y(r,_.tip);!R||!h.has(r.tipOf(R))||E.push({kind:"ADD",origin:"content-change",ref:a.ref,reason:a.why,provenance:`gaps engine (design) \u2014 uncovered AC of touched use-case ${y(r,R)}`,action:a.ready_command})}let v=[];for(let{cid:a}of r.byLabel(b.USECASE))T(r,a)&&r.stale(a)==="orphaned"&&v.push({kind:"REMOVE",ref:y(r,a),reason:"orphaned \u2014 no live source evidences this use-case",provenance:q(r,a),action:"plan-only \u2014 REMOVE is not executed in this release"});let S=new Set,w=[...f.sort(O),...u.sort(O),...E.sort(O),...c.sort(O),...p.sort(O),...v.sort(O)].filter(a=>{let _=`${a.kind}\0${a.ref}`;return S.has(_)?!1:(S.add(_),!0)});return{source_id:n,changed:!0,head:{status:g.status,before:d,after:g.cid},note:te,skipped_arms:B,changeset:le(e,o,r,n,g.cid,l.minted,l.held),rows:w,...l.held?{held:l.held}:{}}}function be(e,n){return async t=>{let{ingestFile:i}=await import("./ingest-FIIO67ZN.js"),{convertPdf:o}=await import("./pdf-convert-S7VYE6AV.js"),{convertDocx:d}=await import("./docx-convert-ZBVQO2LG.js"),s=await i({contextDir:e,filePath:n,asId:t,converters:{pdf:o,docx:d}});return{status:s.status,cid:s.cid}}}function Re(e,n={}){return async t=>{let i=[],[{runExtract:o},{resolveAgentAuthEnv:d},{runAgent:s},{preflightTurn:g}]=await Promise.all([import("./run-YGJZ2SXX.js"),import("./spawner-YNYB4Z7K.js"),import("./bridge-BTSWCJ3B.js"),import("./turn-preflight-JGYT7LXP.js")]),l=await d(),r=new Set(x(e).byLabel(b.USECASE).map(S=>S.cid)),f=ae(e,t)??void 0,m=0,p=await o({mode:"override",...f?{changeContext:f}:{}},{contextDir:e,agent:s,preflightTurn:()=>g(l),ask:async()=>[],review:async S=>{if(!n.stage)return new Map(S.map(a=>[a.temp_ref,{resolution:a.matches_existing&&a.changed?"edited":"skipped"}]));let w=new Map;for(let a of S){if(a.matches_existing&&!a.changed){w.set(a.temp_ref,{resolution:"skipped"});continue}i.push({kind:a.matches_existing?"MODIFY":"ADD",temp_ref:a.temp_ref,title:a.title,why:a.matches_existing?`updated: ${Object.keys(a.updated??{}).join(", ")||"content"}`:`newly extracted from ${t}`,...a.matches_existing?{matched_cid:a.matches_existing.cid,updated:a.updated}:{},uc:a}),w.set(a.temp_ref,{resolution:"rejected"})}return w},confirmStale:async()=>!1,out:S=>process.stderr.write(S+`
13
- `),progress:S=>process.stderr.write(S+`
14
- `),emit:S=>{S.type==="commit"&&typeof S.assumed=="number"&&(m+=S.assumed)},isTTY:!1,auth:l});if(p!==0)throw new Error(`reconcile: re-extract of ${t} failed (exit ${p})`);let u=x(e),c=u.heads.get(t),h=[],E=[];if(typeof c=="string"){let S=new Set;for(let w of u.edgesFrom(c))w.type!==$.DERIVES||u.nodeLabel.get(w.dst)!==b.USECASE||S.has(w.dst)||(S.add(w.dst),!(n.stage&&u.trust.get(w.dst)==="archived")&&(r.has(w.dst)?E:h).push(w.dst))}let v=x(e).heads.get(t);return{minted:h,matched:E,defaultsTaken:m,...n.stage?{held:{source_id:t,...v!=null?{staged_source_cid:v}:{},rows:i}}:{}}}}export{Ee as a,ve as b,be as c,Re as d};
@@ -1,5 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as S,b as A,d as P}from"./chunk-GRB66C5S.js";import{a as U}from"./chunk-JFAFKHDX.js";import{a as O}from"./chunk-3C5GMAM4.js";import{a as G}from"./chunk-DNNZ353O.js";import{a as E,b as $}from"./chunk-7E24OCGX.js";import{b as T}from"./chunk-6W6AIDLJ.js";import{d as g,e as m}from"./chunk-5YPBPZUR.js";var v=(e,t,n=new Set)=>{let o=e.nameOf.get(t);if(o!==void 0)return o;if(n.has(t))return t;n.add(t);for(let[s,r]of e.superseded){if(r!==t)continue;let c=v(e,s,n);if(c!==s)return c}return t};function M(e,t){let n=e.stale(t);if(n==="fresh")return;if(n==="orphaned")return"orphaned \u2014 no live source evidences this item";let o=[],s=new Map;for(let r of e.derivesInto(t))s.set(String(r.props.source_id),r);for(let[r,c]of s){let i=e.heads.get(r);if(i==null||i===c.props.source_cid)continue;let u=e.convChains.get(r)?.chain;u&&u.includes(String(c.props.source_cid))||o.push(`DERIVES pin ${r}@${String(c.props.source_cid).slice(0,19)} broke \u2014 the source head moved`)}for(let r of e.edgesFrom(t)){if(r.type===m.DERIVES||!e.superseded.has(r.dst))continue;let c=e.tipOf(r.dst);if(e.superseded.has(c)){o.push(`${r.type} pin \u2192 ${v(e,r.dst)} \u2014 target retired`);continue}let i=L(e,r.dst,c);o.push(i.length>0?`${v(e,r.dst)} updated: ${i.map(u=>u.field).join(", ")}`:`${r.type} pin \u2192 ${v(e,r.dst)} \u2014 target superseded`)}return o.length>0?o.join("; "):"stale \u2014 a pinned dependency moved"}function L(e,t,n){let o=e.getNode(t)?.content??{},s=e.getNode(n)?.content??{},r=i=>i===void 0?"":Array.isArray(i)?i.map(String).join(" \xB7 "):typeof i=="object"?JSON.stringify(i):String(i),c=[];for(let i of[...new Set([...Object.keys(o),...Object.keys(s)])].sort())JSON.stringify(o[i])!==JSON.stringify(s[i])&&c.push({field:i,old:r(o[i]),new:r(s[i])});return c}function V(e,t){let n=[];for(let{cid:o}of e.byLabel(g.SCENARIO))e.superseded.has(o)||e.edgesFrom(o).some(s=>s.type===m.BELONGS_TO&&e.tipOf(s.dst)===t)&&n.push(o);return n}function R(e,t){let n=[],o=[],s=[],r=V(e,t),c=new Set(r),i=(u,f)=>{let a=M(e,f);return a===void 0?u:{...u,stale:!0,stale_reason:a}};for(let u of r){let f=e.getNode(u)?.content??{};n.push(i({ref:v(e,u),title:String(f.title??""),case_type:String(f.case_type??""),intent:String(f.intent??"")},u));for(let a of e.edgesInto(u)){if(a.type!==m.AUTOMATES||e.superseded.has(a.src))continue;let d=e.getNode(a.src)?.content??{},l=e.edgesFrom(a.src).filter(p=>p.type===m.VERIFIES&&!e.superseded.has(p.dst)).map(p=>v(e,p.dst));o.push(i({ref:v(e,a.src),title:String(d.title??""),check:d.check,verifies:l},a.src))}}for(let{cid:u}of e.byLabel(g.AC)){if(e.superseded.has(u))continue;let f=e.edgesFrom(u).find(p=>p.type===m.SCOPED_TO);if(!f)continue;let a=e.tipOf(f.dst);if(!(a===t||c.has(a)))continue;let l=e.getNode(u)?.content??{};s.push(i({ref:v(e,u),text:String(l.text??""),kind:String(l.kind??""),scope:a===t?"use-case":v(e,a)},u))}return{scenarios:n,tests:o,acs:s}}function I(e,t,n){let o=G(e,t,n);return o===null?null:o.toString("utf8")}function q(e,t){let n=t.split(`
3
- `).map(s=>s.replace(/^\d+\| /,"")),o=[];for(let s of e.split(`
4
- `)){let r=s.trim();if(r.length===0)continue;let c=n.find(i=>i.includes(r));c!==void 0&&!o.includes(c.trim())&&o.push(c.trim())}return o.length>0?o.join(`
5
- `):{removed:!0}}function J(e,t,n,o){if(o!==void 0&&o.trim().length>0)return{kind:"user-directive",text:o.trim()};let s=[n,...R(t,n).acs.map(u=>t.resolve(u.ref)?.cid??"")].filter(Boolean),r=[],c=new Set;for(let u of s){let f=new Map;for(let a of t.derivesInto(u))f.set(String(a.props.source_id),a);for(let[a,d]of f){let l=t.heads.get(a);if(l==null||l===d.props.source_cid)continue;let p=String(d.props.anchor),b=`${a}\0${p}`;if(c.has(b)||p==="img#whole")continue;c.add(b);let k=I(e,t,String(d.props.source_cid)),w=k===null?null:T(k,p);if(w===null)continue;let x=I(e,t,l);r.push({source_id:a,anchor:p,old_anchor_text:w,new_anchor_text:x===null?{removed:!0}:q(w,x)})}}let i;for(let[u,f]of t.superseded){if(f!==n||t.nodeLabel.get(u)!==g.USECASE)continue;let a=L(t,u,n);a.length>0&&(i=a);break}return{kind:"source-change",changes:r,...i?{uc_updated:i}:{}}}function N(e,t,n,o){let s=R(t,n);if(s.scenarios.length===0&&s.tests.length===0&&s.acs.length===0)return;let r=J(e,t,n,o);if(!(r.kind==="source-change"&&r.changes.length===0&&!r.uc_updated))return{prior_design:s,change_delta:r}}var _=new Set([g.USECASE,g.SCENARIO,g.AC,g.TEST]);function h(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function y(e,t,n){let o=e.edgesFrom(t).find(s=>s.type===n);return o?e.tipOf(o.dst):null}function D(e,t,n){if(n===g.USECASE)return t;if(n===g.SCENARIO)return y(e,t,m.BELONGS_TO);if(n===g.AC){let o=y(e,t,m.SCOPED_TO);return o?e.nodeLabel.get(o)===g.USECASE?o:y(e,o,m.BELONGS_TO):null}if(n===g.TEST){let o=y(e,t,m.AUTOMATES);return o?y(e,o,m.BELONGS_TO):null}return null}function j(e,t){let n=e.nameOf.get(t);if(n)return n;for(let[o,s]of e.names)if(e.tipOf(s)===t)return o;return t}function B(e,t){return{ucTip:t,display:j(e,t),seamRef:e.nameOf.get(t)??t}}function Y(e,t){let n=e.resolve(t);if(!n)return{ok:!1,message:`unknown ref '${t}' \u2014 no test/scenario/ac/use-case by that id or cid`};let o=n.tip,s=e.nodeLabel.get(o);if(!s||!_.has(s))return{ok:!1,message:`'${t}' is a ${s??"missing node"} \u2014 evolve takes a test, scenario, acceptance criterion, or use-case`};let r=D(e,o,s);return!r||e.nodeLabel.get(r)!==g.USECASE?{ok:!1,message:`cannot resolve '${t}' to a parent use-case \u2014 its ${s} chain is broken`}:e.superseded.has(r)?{ok:!1,message:`use-case ${j(e,r)} was removed \u2014 nothing to evolve`}:{ok:!0,target:B(e,r)}}function ae(e,t){return C(e,t)}function C(e,t){let n=[];for(let{cid:s}of e.byLabel(g.SCENARIO)){if(!h(e,s)||!e.edgesFrom(s).some(c=>c.type===m.BELONGS_TO&&e.tipOf(c.dst)===t))continue;let r=e.edgesInto(s).filter(c=>c.type===m.AUTOMATES&&h(e,c.src));if(r.length===0)n.push({scenario:s,test:null});else for(let c of r)n.push({scenario:s,test:c.src})}let o=new Map;for(let{cid:s}of e.byLabel(g.AC)){if(!h(e,s)||D(e,s,g.AC)!==t)continue;let r=e.edgesInto(s).filter(c=>c.type===m.VERIFIES&&h(e,c.src)).map(c=>c.src).sort();o.set(s,r)}return{pairs:n,verifies:o}}function H(e,t){let n=c=>`${c.scenario}\0${c.test??""}`,o=new Set(e.pairs.map(n)),s=new Set(t.pairs.map(n)),r=[];for(let[c,i]of e.verifies){let u=t.verifies.get(c);u&&(i.length===u.length&&i.every((f,a)=>f===u[a])||r.push({ac:c,before:i,after:u}))}return{superseded:e.pairs.filter(c=>!s.has(n(c))),minted:t.pairs.filter(c=>!o.has(n(c))),retained:t.pairs.filter(c=>o.has(n(c))),moves:r}}function z(e,t,n,o,s){let r=i=>t.nameOf.get(i)??i,c=i=>` - ${r(i.scenario)} \xB7 ${i.test?r(i.test):"(no test)"}`;e.out(`evolved: use-case ${n} \u2014 design record ${o.before} \u2192 ${o.after}`),e.out(`superseded: ${s.superseded.length} pair(s)`);for(let i of s.superseded)e.out(c(i));e.out(`minted: ${s.minted.length} pair(s)`);for(let i of s.minted)e.out(c(i));e.out(`retained: ${s.retained.length} pair(s)`);for(let i of s.retained)e.out(c(i));if(s.moves.length===0)e.out("verifies moves: none");else{e.out("verifies moves:");for(let i of s.moves){let u=f=>f.length>0?f.map(r).join(" + "):"(none)";e.out(` - ${r(i.ac)}: ${u(i.before)} \u2192 ${u(i.after)}`)}}}async function F(e,t,n,o,s,r){let c=E(e),i=O(c,t.ucTip);if(!i)return r==="batch"?(o.out(`note: ${t.display} has no design output \u2014 nothing to evolve; run kane-cli design tests --use-case ${t.display} first`),{code:0,outcome:"no-design"}):(S(o,`nothing to evolve \u2014 run kane-cli design tests --use-case ${t.display} first (no design output)`),{code:2,outcome:"no-design"});let u=C(c,t.ucTip),f=`evolve re-designs the parent use-case ${t.display}; ${u.pairs.length} pair(s) affected`;if(n.yes)o.out(f);else if(!await o.confirm(`${f} \u2014 proceed?`))return o.out(r==="batch"?`skipped ${t.display}`:"declined \u2014 nothing evolved"),{code:0,outcome:"declined"};let a=N(e,c,t.ucTip,n.because),d=await s(t.seamRef,{yes:!!n.yes,...n.mode?{mode:n.mode}:{},...n.because?{because:n.because}:{},...a!==void 0?{changeDelta:a.change_delta,priorDesign:a.prior_design}:{}});if(d===3)return o.out(`design session for ${t.display} paused \u2014 resume with \`kane-cli design tests --resume\`, then re-run evolve for the diff`),{code:d,outcome:"paused"};if(d!==0)return S(o,`design run for ${t.display} ended with exit code ${d} \u2014 no diff to report`),{code:d,outcome:"failed"};let l=E(e),p=l.tipOf(t.ucTip),b=O(l,p)?.seq;return z(o,l,t.display,{before:i.seq,after:b??"?"},H(u,C(l,p))),{code:0,outcome:"evolved"}}function K(e){let t=new Map,n=0;for(let{cid:s,state:r}of e.staleList()){if(r==="superseded")continue;let c=e.nodeLabel.get(s);if(!c||!_.has(c)||!h(e,s)||!$(e,s))continue;let i=D(e,s,c);!i||e.nodeLabel.get(i)!==g.USECASE||e.superseded.has(i)||(n++,t.has(i)||t.set(i,B(e,i)))}return{targets:[...t.values()].sort((s,r)=>s.display<r.display?-1:s.display>r.display?1:0),staleCount:n}}function Q(e,t){for(let{cid:n,state:o}of e.staleList()){if(o==="superseded")continue;let s=e.nodeLabel.get(n);if(!(!s||!_.has(s)||!h(e,n))&&$(e,n)&&D(e,n,s)===t)return!0}return!1}async function W(e,t,n,o={},s=process.cwd()){if(e&&t.fromStale)return S(n,"pass a <ref> OR --from-stale, not both"),2;if(!e&&!t.fromStale)return S(n,"evolve needs a <ref> or --from-stale"),2;let r=A(s,n);if(!r)return 2;let c=o.runDesignForUc??X;n.out(`evolving ${e??"stale use-cases"}: reading the graph\u2026`);let i=E(r),u,f=null;if(e){let d=Y(i,e);if(!d.ok)return S(n,d.message),2;if(!t.because&&O(i,d.target.ucTip)&&!Q(i,d.target.ucTip))return S(n,`nothing changed underneath ${e} \u2014 its sources and requirements are current; use --because "<reason>" to re-design anyway`),2;u=[d.target]}else{let{targets:d,staleCount:l}=K(i);if(d.length===0)return n.out("nothing stale \u2014 nothing to evolve"),0;f=`from-stale: ${l} stale node(s) \u2192 ${d.length} use-case(s)`,u=d}if(!t.yes&&!n.isTTY)return S(n,"evolve needs a TTY \u2014 the blast-radius confirm is the point; headless evolution rides `kane-cli maintain reconcile`"),2;if(f&&n.out(f),e){let d=await F(r,u[0],t,n,c,"single");return d.outcome==="evolved"&&t.because&&U(r,{ts:new Date().toISOString(),command:"evolve",id:e,verdict:"gap-resolved-evolve",polarity:"preference",by:{kind:"human",id:process.env.USER??"operator"},target:e,reason:t.because}),d.code}let a=0;for(let d of u){let{code:l}=await F(r,d,t,n,c,"batch");l!==0&&a===0&&(a=l)}return a}var X=async(e,t)=>{let{designTestsCommand:n}=await import("./bind-NSGW5BBZ.js"),o=()=>n({useCase:e,force:!0,...t.mode?{mode:t.mode}:t.yes?{mode:"override"}:{},...t.because?{because:t.because}:{},...t.changeDelta!==void 0?{changeDelta:t.changeDelta}:{},...t.priorDesign!==void 0?{priorDesign:t.priorDesign}:{}});if(t.mode!=="agent")return o();let s=process.stdout.write;process.stdout.write=((...r)=>!0);try{return await o()}finally{process.stdout.write=s}};async function de(e,t){return W(e,t,P(),{})}export{Y as a,ae as b,F as c,K as d,W as e,X as f,de as g};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as M,b as A,d as K}from"./chunk-6HYW5RFX.js";import{c as z,e as P}from"./chunk-J2KSZUOO.js";import{d as L,e as R,f as U,g as B,h as J}from"./chunk-5YPBPZUR.js";function Z(c,s){let t=c.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(t.length>60){let o=t.lastIndexOf("-",60);t=(o>0?t.slice(0,o):t.slice(0,60)).replace(/-+$/g,"")}if(!G.test(t))return null;let e=t;for(let o=2;s(e);o++)e=`${t}-${o}`;return G.test(e)?e:null}var ee={source:"src",usecase:"uc",scenario:"sc",ac:"ac",test:"t",gap:"gap",stylenote:"sty"};function ae(c,s,t){let e=ee[c];return Z(e?`${e} ${s}`:s,t)}var te={usecase:"uc",scenario:"sc",ac:"ac",test:"t",gap:"gap",stylenote:"sty"},ue=/^(uc|sc|ac|t|gap|sty)-\d+$/i;function Q(c,s,t){let e=te[c];if(!e)return null;let o=new RegExp(`^${e}-(\\d+)$`),u=0;for(let a of t){let p=o.exec(a);if(!p)continue;let m=Number(p[1]);Number.isSafeInteger(m)&&m>u&&(u=m)}let r=u+1;for(;s(`${e}-${r}`);)r+=1;return`${e}-${r}`}var re=/^L([1-9]\d*)-L([1-9]\d*)$/,ie=/^img#(p[1-9]\d*-[1-9]\d*|i[1-9]\d*)$/;function q(c){if(c==="img#whole")return{kind:"img-whole"};let s=ie.exec(c);if(s)return{kind:"img-part",ref:s[1]};let t=re.exec(c);return t?{kind:"lines",a:parseInt(t[1],10),b:parseInt(t[2],10)}:null}function se(c,s){let t=/^L(\d+)-L(\d+)$/.exec(s);if(!t)return null;let e=parseInt(t[1],10),o=parseInt(t[2],10),u=c.split(`
3
- `);return e<1||o<e||o>u.length?null:u.slice(e-1,o).map(r=>r.replace(/^\d+\| /,"")).join(`
4
- `)}function F(c,s,t){let e=q(s.anchor);if(c.format==="image")return e?.kind==="img-whole"?[]:[{code:"CITE_ANCHOR_INVALID",detail:`image cites are anchor-only (img#whole), got ${s.anchor}`}];if(e?.kind==="img-part")return new Set((c.images??[]).map(r=>r.ref)).has(e.ref)?[]:[{code:"CITE_ANCHOR_INVALID",detail:`anchor ${s.anchor} names no embedded image of this source version`}];if(!s.anchor||s.quote===void 0||s.quote==="")return[{code:"MISSING_CITE",detail:"text-kind cites need anchor+quote"}];let o=t!==null?se(t,s.anchor):null;return o===null?[{code:"BAD_ANCHOR",detail:`anchor ${s.anchor} does not resolve in the source`}]:o.includes(s.quote)?[]:[{code:"QUOTE_MISMATCH",detail:`quote is not verbatim within ${s.anchor}`}]}var G=/^[a-z0-9][a-z0-9-]{1,63}$/;function X(c,s,t,e){if(!s)return{error:{code:"SUPERSEDE_TARGET_MISSING",detail:"supersede verdict needs a target (slug or cid)"}};let o=c.resolve(s);return o?o.superseded||e.has(o.cid)?{error:{code:"ALREADY_SUPERSEDED",detail:`${s} is already superseded (tip: ${o.tip})`}}:o.cid===t?{error:{code:"SELF_SUPERSEDE",detail:"a node cannot supersede itself"}}:{targetCid:o.cid}:{error:{code:"UNKNOWN_SUPERSEDE_TARGET",detail:`${s} names nothing in the graph`}}}function oe(c,s,t,e,o=[]){if(!B(s)?.acyclic)return null;if(t===e)return{code:"EDGE_CYCLE",detail:`${s} ${t} \u2192 itself`};let r=m=>[...c.edgesFrom(m).filter(E=>E.type===s).map(E=>E.dst),...o.filter(E=>E.type===s&&E.src===m).map(E=>E.dst)],a=new Set,p=[e];for(;p.length>0;){let m=p.pop();if(m===t)return{code:"EDGE_CYCLE",detail:`${s} ${t} \u2192 ${e} closes a cycle`};a.has(m)||(a.add(m),p.push(...r(m)))}return null}function Ie(c,s,t,e){let u=B(s)?.cardinality;if(u!=="one-live-per-src"&&u!=="one-live-per-src-and-dst")return null;let r=c.edgesFrom(t).filter(a=>a.type===s&&!c.superseded.has(a.dst));if(r.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${s} from ${t} already has a live edge (${r[0].ecid}) \u2014 supersede it first`};if(u==="one-live-per-src-and-dst"&&e!==void 0){let a=c.edgesInto(e).filter(p=>p.type===s&&!c.superseded.has(p.src));if(a.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${s} onto ${e} already has a live edge (${a[0].ecid}) \u2014 strict 1:1, supersede it first`}}return null}var Y=new Set(["high","med","low"]);function ve(c,s,t){let e=[],o=t.mediaOf(c.source.source_cid),u=new Set;for(let r of c.use_cases){if(u.has(r.temp_ref)&&e.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${r.temp_ref}`}),u.add(r.temp_ref),(!r.title||!r.title.trim())&&e.push({code:"EMPTY_TITLE",detail:`${r.temp_ref}: title is empty`}),Y.has(r.risk)||e.push({code:"BAD_RISK",detail:`${r.temp_ref}: risk ${JSON.stringify(r.risk)} not in high|med|low`}),!r.cite||!r.cite.anchor)e.push({code:"MISSING_CITE",detail:`${r.temp_ref}: every derived use-case must carry a cite`});else for(let a of F(o,r.cite,s))e.push({code:a.code,detail:`${r.temp_ref}: ${a.detail}`});r.matches_existing&&!t.hasNode(r.matches_existing.cid)&&e.push({code:"UNKNOWN_MATCH",detail:`${r.temp_ref}: matches_existing ${r.matches_existing.cid} is not in the graph`});for(let[a,p]of(r.criteria??[]).entries())if((!p.text||!p.text.trim())&&e.push({code:"EMPTY_CRITERION",detail:`${r.temp_ref}.criteria[${a}]: text is empty`}),!p.cite||!p.cite.anchor)e.push({code:"MISSING_CITE",detail:`${r.temp_ref}.criteria[${a}]: every criterion carries its own cite`});else for(let m of F(o,p.cite,s))e.push({code:m.code,detail:`${r.temp_ref}.criteria[${a}]: ${m.detail}`});for(let[a,p]of(r.updated?.criteria??[]).entries())if((!p.text||!p.text.trim())&&e.push({code:"EMPTY_CRITERION",detail:`${r.temp_ref}.updated.criteria[${a}]: text is empty`}),!p.cite||!p.cite.anchor)e.push({code:"MISSING_CITE",detail:`${r.temp_ref}.updated.criteria[${a}]: every updated criterion carries its own cite`});else for(let m of F(o,p.cite,s))e.push({code:m.code,detail:`${r.temp_ref}.updated.criteria[${a}]: ${m.detail}`})}return e}function Ne(c){let{contextDir:s,graph:t,proposal:e,proposalId:o,verdicts:u,by:r,allowStaleBasis:a,extractorVersion:p,autoName:m}=c,E=z(s);if(!a&&e.read_basis!==E)return{record:null,errors:[{code:"STALE_BASIS",detail:`proposal read_basis ${String(e.read_basis)} != latest ${String(E)}`}]};if(!t.hasNode(e.source.source_cid))return{record:null,errors:[{code:"MISSING_SOURCE_NODE",detail:`source ${e.source.source_id} (${e.source.source_cid}) is not a committed node \u2014 ingest it first`}]};let f=[],h=t.mediaOf(e.source.source_cid),w=new Set,I=[],S=[],b=[],D=[],C=[],O=[],j=new Set,W=new Set,H=(i,n,V)=>{let x=X(t,n.supersedeTarget,V,j);if("error"in x){f.push({code:x.error.code,detail:`${i}: ${x.error.detail}`});return}j.add(x.targetCid),C.push({kind:"node",old:x.targetCid,new:V,reason:n.reason??`superseded via review by ${r.id}`,by:r})};for(let i of e.use_cases){let n=u.get(i.temp_ref)??{resolution:"skipped"};w.has(i.temp_ref)&&f.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${i.temp_ref}`}),w.add(i.temp_ref),(!i.title||!i.title.trim())&&f.push({code:"EMPTY_TITLE",detail:`${i.temp_ref}: title is empty`}),Y.has(i.risk)||f.push({code:"BAD_RISK",detail:`${i.temp_ref}: risk ${JSON.stringify(i.risk)} not in high|med|low`});let V=q(i.cite?.anchor??"");if(h.format==="image"){if(V?.kind!=="img-whole"){f.push({code:i.cite?.anchor?"CITE_ANCHOR_INVALID":"MISSING_CITE",detail:`${i.temp_ref}: image cites are anchor-only (img#whole)`});continue}}else if(V?.kind==="img-part"){if(!(h.images??[]).some(g=>g.ref===V.ref)){f.push({code:"CITE_ANCHOR_INVALID",detail:`${i.temp_ref}: anchor ${i.cite?.anchor} names no embedded image of this source version`});continue}}else if(!i.cite||!i.cite.anchor||!i.cite.quote){f.push({code:"MISSING_CITE",detail:`${i.temp_ref}: every derived use-case must cite anchor+quote`});continue}n.resolution==="edited"&&n.edit&&(n.edit.title!==void 0&&!n.edit.title.trim()&&f.push({code:"EMPTY_TITLE",detail:`${i.temp_ref}: edited title is empty`}),n.edit.risk!==void 0&&!Y.has(n.edit.risk)&&f.push({code:"BAD_RISK",detail:`${i.temp_ref}: edited risk ${JSON.stringify(n.edit.risk)} invalid`}));let x=K({title:n.edit?.title??i.title,description:i.description,summary:n.edit?.summary??i.summary,actors:i.actors,value:i.value,risk:n.edit?.risk??i.risk,...i.criteria&&i.criteria.length>0?{criteria:i.criteria.map(d=>d.text)}:{}}),_=M("usecase",x),y={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:i.cite.anchor,...i.cite.quote?{quote:i.cite.quote}:{}};if(i.matches_existing&&!t.hasNode(i.matches_existing.cid)){f.push({code:"UNKNOWN_MATCH",detail:`${i.temp_ref}: matches_existing ${i.matches_existing.cid} is not in the graph`});continue}let v=i.matches_existing?.cid??(t.hasNode(_)?_:null);if(v&&t.superseded.has(v)){let d=t.tipOf(v);v=t.superseded.has(d)?null:d}if(v){if(i.changed&&(n.resolution==="approved"||n.resolution==="edited")){let d=i.updated;if(!d||Object.keys(d).length===0){f.push({code:"CHANGED_NEEDS_PAYLOAD",detail:`${i.temp_ref}: changed:true needs an updated{...} payload naming the moved fields`});continue}let g=t.getNode(v)?.content??{},$=(d.criteria??[]).map(l=>typeof l=="string"?{text:l,cite:void 0}:l),T=K({title:n.edit?.title??d.title??String(g.title??i.title),...d.description??g.description?{description:d.description??g.description}:{},...n.edit?.summary??d.summary??g.summary?{summary:n.edit?.summary??d.summary??g.summary}:{},...d.actors??g.actors?{actors:d.actors??g.actors}:{},...d.value??g.value?{value:d.value??g.value}:{},risk:n.edit?.risk??d.risk??String(g.risk??i.risk),...d.criteria?$.length>0?{criteria:$.map(l=>l.text)}:{}:g.criteria?{criteria:g.criteria}:{}}),k=M("usecase",T);if(k!==v){for(let l of U("usecase",T))f.push({code:l.code,detail:`${i.temp_ref}: ${l.detail}`});I.push({cid:k,label:L.USECASE,content:T}),S.push({ecid:A("DERIVES",y.source_cid,k,y),type:R.DERIVES,src:y.source_cid,dst:k,props:y});for(let l of $){if(!l.cite)continue;let N={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:l.cite.anchor,...l.cite.quote?{quote:l.cite.quote}:{},claim:l.text};S.push({ecid:A("DERIVES",N.source_cid,k,N),type:R.DERIVES,src:N.source_cid,dst:k,props:N})}H(i.temp_ref,{resolution:"supersede",supersedeTarget:v,reason:n.reason??`matches-but-changed: ${e.source.source_id} moved (${Object.keys(d).join(", ")})`},k),D.push({id:k,kind:"review-item",resolution:n.resolution,edit:n.resolution==="edited"?{...n.edit}:null,reason:null,by:r});continue}for(let l of $){if(!l.cite)continue;let N={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:l.cite.anchor,...l.cite.quote?{quote:l.cite.quote}:{},claim:l.text};S.push({ecid:A("DERIVES",N.source_cid,v,N),type:R.DERIVES,src:N.source_cid,dst:v,props:N})}}n.resolution!=="rejected"&&(S.push({ecid:A("DERIVES",y.source_cid,v,y),type:R.DERIVES,src:y.source_cid,dst:v,props:y}),(n.resolution==="approved"||n.resolution==="edited"||n.resolution==="supersede")&&D.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:null,by:r}),n.resolution==="supersede"&&H(i.temp_ref,n,v));continue}for(let d of U("usecase",x))f.push({code:d.code,detail:`${i.temp_ref}: ${d.detail}`});for(let d of J(R.DERIVES,"source","usecase",y))f.push({code:d.code,detail:`${i.temp_ref}: ${d.detail}`});I.push({cid:_,label:L.USECASE,content:x}),S.push({ecid:A("DERIVES",y.source_cid,_,y),type:R.DERIVES,src:y.source_cid,dst:_,props:y});for(let d of i.criteria??[]){let g={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:d.cite.anchor,...d.cite.quote?{quote:d.cite.quote}:{},claim:d.text};S.push({ecid:A("DERIVES",g.source_cid,_,g),type:R.DERIVES,src:g.source_cid,dst:_,props:g})}for(let d of i.depends_on_hint??[]){let g=l=>l.toLowerCase().trim().replace(/\s+/g," "),$=null,T=t.resolve(d);if(T&&!T.superseded&&t.nodeLabel.get(T.cid)===L.USECASE&&($=T.cid),!$){for(let{cid:l,content:N}of t.byLabel(L.USECASE))if(!t.superseded.has(l)&&g(String(N.title??""))===g(d)){$=l;break}}if(!$){let l=I.find(N=>N.label===L.USECASE&&g(String(N.content.title??""))===g(d));l&&($=l.cid)}!$||$===_||oe(t,R.DEPENDS_ON,_,$,b)||b.some(l=>l.src===_&&l.dst===$)||(S.push({ecid:A(R.DEPENDS_ON,_,$,{reason:"extract hint"}),type:R.DEPENDS_ON,src:_,dst:$,props:{reason:"extract hint"}}),b.push({src:_,dst:$,type:R.DEPENDS_ON}))}if((n.resolution==="approved"||n.resolution==="edited"||n.resolution==="supersede")&&t.superseded.get(_)===null&&!j.has(_)&&C.push({kind:"node",old:_,new:_,reason:`re-minted after tombstone via review by ${r.id}`,by:r}),m){let d=Q("usecase",g=>W.has(g),t.names.keys());d!==null&&!t.nameOf.has(_)&&(W.add(d),O.push({cid:_,slug:d,by:r}))}n.resolution==="approved"?D.push({id:_,kind:"review-item",resolution:"approved",edit:null,reason:null,by:r}):n.resolution==="edited"?D.push({id:_,kind:"review-item",resolution:"edited",edit:{...n.edit},reason:null,by:r}):n.resolution==="rejected"?D.push({id:_,kind:"review-item",resolution:"rejected",edit:null,reason:n.reason??null,by:r}):n.resolution==="supersede"&&(D.push({id:_,kind:"review-item",resolution:"approved",edit:null,reason:n.reason??null,by:r}),H(i.temp_ref,n,_))}return f.length?{record:null,errors:f}:{record:P(s,{ts:new Date().toISOString(),proposal_id:o,...o!=null?{extraction_of:e.source.source_cid}:{},...o!=null&&p?{extractor_version:p}:{},nodes:I,edges:S,review:D,supersessions:C,...O.length>0?{names:O}:{},...c.judgements&&c.judgements.length>0?{judgements:c.judgements}:{},source_head_moves:{}},{expectPrev:E}).record,errors:null}}function ye(c){let{contextDir:s,graph:t,verdicts:e,by:o}=c,u=[],r=[],a=[],p=[],m=new Set;for(let[f,h]of e){if(h.resolution==="skipped")continue;let w=t.resolve(f);if(!w){u.push({code:"UNKNOWN_NODE",detail:`${f} names nothing in the graph`});continue}if(w.superseded){u.push({code:"SUPERSEDED_TARGET",detail:`${f} is superseded \u2014 review the tip (${w.tip})`});continue}let I=w.cid;if(h.resolution==="approved")a.push({id:I,kind:"review-item",resolution:"approved",edit:null,reason:null,by:o});else if(h.resolution==="rejected")a.push({id:I,kind:"review-item",resolution:"rejected",edit:null,reason:h.reason??null,by:o});else if(h.resolution==="edited"){let S=t.getNode(I);if(!S){u.push({code:"UNKNOWN_NODE",detail:`${f}: node file unreadable`});continue}let b={...S.content,...h.edit?.title!==void 0?{title:h.edit.title}:{},...h.edit?.summary!==void 0?{summary:h.edit.summary}:{},...h.edit?.risk!==void 0?{risk:h.edit.risk}:{}},D=U(S.label,b);if(D.length>0){for(let O of D)u.push({code:O.code,detail:`${f}: ${O.detail}`});continue}let C=M(S.label,b);if(C===I){a.push({id:I,kind:"review-item",resolution:"approved",edit:null,reason:null,by:o});continue}r.push({cid:C,label:S.label,content:b}),m.add(I),p.push({kind:"node",old:I,new:C,reason:h.reason??"edited in review",by:o}),a.push({id:C,kind:"review-item",resolution:"edited",edit:{...h.edit},reason:null,by:o})}else if(h.resolution==="supersede"){let S=X(t,h.supersedeTarget,I,m);if("error"in S){u.push({code:S.error.code,detail:`${f}: ${S.error.detail}`});continue}m.add(S.targetCid),p.push({kind:"node",old:S.targetCid,new:I,reason:h.reason??`superseded via review by ${o.id}`,by:o}),a.push({id:I,kind:"review-item",resolution:"approved",edit:null,reason:h.reason??null,by:o})}}return u.length?{record:null,errors:u}:a.length===0&&p.length===0?{record:null,errors:[{code:"NO_VERDICTS",detail:"every item was skipped \u2014 nothing to commit"}]}:{record:P(s,{ts:new Date().toISOString(),proposal_id:null,nodes:r,edges:[],review:a,supersessions:p,source_head_moves:{}},{expectPrev:t.latestHash}).record,errors:null}}function Re(c){let{contextDir:s,graph:t,assignments:e,by:o}=c,u=[],r=[],a=new Set;for(let{ref:m,slug:E}of e){if(!G.test(E)){u.push({code:"BAD_SLUG",detail:`${JSON.stringify(E)} \u2014 slugs are kebab-case ${String(G)}`});continue}let f=t.resolve(m);if(!f){u.push({code:"UNKNOWN_REF",detail:`${m} names nothing in the graph`});continue}if(f.superseded){u.push({code:"SUPERSEDED_TARGET",detail:`${m} is superseded \u2014 name the tip instead (${f.tip})`});continue}let h=t.names.get(E);if(h!==void 0&&!t.superseded.has(h)&&h!==f.cid||a.has(E)){u.push({code:"SLUG_TAKEN",detail:`${E} already names ${h??"another node in this record"}`});continue}a.add(E),r.push({cid:f.cid,slug:E,by:o})}return u.length?{record:null,errors:u}:r.length===0?{record:null,errors:[{code:"NO_ASSIGNMENTS",detail:"nothing to name"}]}:{record:P(s,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],names:r,source_head_moves:{}},{expectPrev:t.latestHash}).record,errors:null}}function De(c){let{contextDir:s,graph:t,sourceId:e,reason:o,by:u}=c,r=t.heads.get(e);return r===void 0?{record:null,errors:[{code:"UNKNOWN_SOURCE",detail:`no source ${e} in the graph`}]}:r===null?{record:null,errors:[{code:"ALREADY_RETIRED",detail:`source ${e} is already retired`}]}:{record:P(s,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[{kind:"node",old:r,new:null,reason:o??`retired source ${e}`,by:u}],source_head_moves:{[e]:null},names:[]},{expectPrev:t.latestHash}).record,errors:null}}export{q as a,se as b,oe as c,Ie as d,ve as e,Ne as f,ye as g,Re as h,De as i,Z as j,ee as k,ae as l,ue as m,Q as n};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as G,b as R}from"./chunk-FRBYGSGJ.js";import{m as I}from"./chunk-6W6AIDLJ.js";import{a as L}from"./chunk-J2KSZUOO.js";import{e as N,g as M}from"./chunk-5YPBPZUR.js";import{existsSync as P,readFileSync as D}from"fs";function z(d){let n=R(d),g=new Map(Object.entries(n.heads)),l=new Map(Object.entries(n.trust)),a=new Map(Object.entries(n.nodeLabel)),i=new Map(Object.entries(n.superseded)),f=new Map(Object.entries(n.names)),T=new Map(Object.entries(n.archivedReason)),k=new Set(n.appliedEvents),E=new Map(Object.entries(n.conv)),q=e=>n.media[e]??{format:"text",media_type:"text/plain",anchors_supported:["L-L"]},h=new Map;for(let[e,t]of f)h.set(t,e);let m=new Map,C=e=>{if(m.has(e))return m.get(e);if(!a.has(e))return m.set(e,null),null;let t=G(d,e);if(!P(t))throw new L(`derived node file missing for ${e} \u2014 run kane-cli context rebuild`);let s=JSON.parse(D(t,"utf8"));return m.set(e,s),s},b=e=>{let t=e,s=new Set;for(;i.has(t)&&!s.has(t);){s.add(t);let r=i.get(t);if(typeof r!="string")break;t=r}return t},w=null,H=e=>{let t=h.get(e);if(t!==void 0)return t;if(w===null){w=new Map;for(let[c,o]of i)typeof o=="string"&&w.set(o,c)}let s=new Set,r=e;for(;!s.has(r);){s.add(r);let c=w.get(r);if(c===void 0)return null;let o=h.get(c);if(o!==void 0)return o;r=c}return null},x=e=>{I.test(e)&&(e=e.toLowerCase());let t=g.get(e),s=a.has(e)?e:f.get(e)??(typeof t=="string"?t:void 0);if(s===void 0||!a.has(s))return null;let r=b(s);return{cid:s,tip:r,superseded:i.has(s)||i.has(r)}},S=new Map;for(let e of Object.values(n.forward))for(let t of e){let s=S.get(t.dst);s?s.push(t):S.set(t.dst,[t])}let v=e=>(e??[]).filter(t=>!i.has(t.ecid)),O=e=>v(S.get(e)),y=e=>O(e).filter(t=>t.type===N.DERIVES),F=e=>v(n.forward[e]).some(t=>M(t.type)?.pin?.comparesTo==="dst_tip"&&i.has(t.dst)),_=e=>{if(i.has(e))return"superseded";let t=y(e);if(t.length===0)return F(e)?"stale":"fresh";let s=new Map;for(let o of t)s.set(o.props.source_id,o);let r=!1,c=!1;for(let[o,u]of s){let p=g.get(o);if(p!=null&&(r=!0,p!==u.props.source_cid)){let j=E.get(o)?.chain;(!j||!j.includes(u.props.source_cid))&&(c=!0)}}return r?c||F(e)?"stale":"fresh":"orphaned"};return{heads:g,trust:l,nodeLabel:a,superseded:i,names:f,nameOf:h,archivedReason:T,appliedEvents:k,convChains:E,mediaOf:q,extractedSourceCids:new Set(n.extracted),designOf:new Map(Object.entries(n.design_of??{})),latestHash:n.applied.hash,lastSeq:n.applied.seq,hasNode:e=>a.has(e),getNode:C,byLabel:e=>[...a.entries()].filter(([,t])=>t===e).map(([t])=>({cid:t,content:C(t)?.content??{}})),edgesFrom:e=>v(n.forward[e]),edgesInto:O,derivesInto:y,resolve:x,tipOf:b,displayNameOf:H,stale:_,staleList:()=>[...a.keys()].map(e=>({cid:e,state:_(e)})).filter(e=>e.state!=="fresh"),execHistory:e=>{let t=x(e);if(!t)return[];let s=b(t.cid),r=new Set([s]),c=!0;for(;c;){c=!1;for(let[u,p]of i)p!==null&&r.has(p)&&!r.has(u)&&(r.add(u),c=!0)}let o=[];for(let u of Object.entries(n.exec??{}))r.has(u[0])&&o.push(...u[1]);return o.sort((u,p)=>u.started_at<p.started_at?-1:1)}}}function B(d,n){if(d.stale(n)!=="stale")return!1;let g=new Map;for(let l of d.derivesInto(n))g.set(l.props.source_id,l);for(let[l,a]of g){let i=d.heads.get(l);if(i==null||i===a.props.source_cid)continue;let f=d.convChains.get(l)?.chain;if(!f||!f.includes(a.props.source_cid))return!0}for(let l of d.edgesFrom(n)){if(M(l.type)?.pin?.comparesTo!=="dst_tip"||!d.superseded.has(l.dst))continue;let a=d.tipOf(l.dst);if(d.superseded.has(a)||d.nodeLabel.get(a)==="usecase")return!0}return!1}export{z as a,B as b};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as Z,d as ee,e as te,f as ne}from"./chunk-GG43HSU2.js";import{b as B,d as Y}from"./chunk-FMR2KPSK.js";import{d as X}from"./chunk-NVGBE2DR.js";var oe=new Set(["approve","edit","reject"]);function ae(r,t){return`chatop:${t}:${r.target??"new"}:${r.op}:${r.seq}`}function ue(r,t,k,h){let u=ae(r,t),f=r.payload;switch(r.op){case"approve":return{kind:"approve",target:r.target,expectedCid:r.expected_cid,eventId:u};case"edit":{let{reason:i,...b}=f;return{kind:"edit",target:r.target,expectedCid:r.expected_cid,edit:b,reason:i,eventId:u}}case"enhance":return{kind:"enhance",target:r.target,expectedCid:r.expected_cid,edges:f.edges??[],eventId:u};case"reject":return{kind:"reject",target:r.target,expectedCid:r.expected_cid,reason:f.reason??"",redirectTo:f.redirect_to,eventId:u};case"add":{let i=f.proposal_item??{},b=String(i.label??"");if(!k.mint_gate.includes(b))throw new Error(`GATED_LABEL: cannot mint "${b}" (gate: ${k.mint_gate.join(", ")})`);let c=i.cite??{},p=i.conv_source_id??h;if(!p||typeof c.turn!="number"||!c.quote)throw new Error("INVALID_ADD: a chat add requires a conversation cite {turn, quote} and conv_source_id");return{kind:"add",label:b,content:i.content??{},cite:{turn:c.turn,quote:c.quote},convSourceId:p,rationale:i.rationale,eventId:u}}}}function ie(r,t,k={}){let h=k.turn??0,u=[],f=[];for(let c of r)(c.op==="add"||c.op==="enhance")&&f.push(c);let i=new Map;for(let c of r){if(!oe.has(c.op)||!c.target)continue;let p=i.get(c.target)??[];p.push(c),i.set(c.target,p)}for(let[c,p]of i){let w=Math.max(...p.map(_=>_.seq)),C=p.filter(_=>_.seq===w);if(C.length>1){u.push({target:c,seq:w,kinds:C.map(_=>_.op)});continue}f.push(C[0])}return{chatOps:f.sort((c,p)=>c.seq-p.seq).map(c=>ue(c,h,t,k.convSourceId)),ambiguous:u}}function ce(r){let t=[];return r.questions.forEach((k,h)=>{if(r.resolution[h])return;let u=k.recommended_index!=null?k.options[k.recommended_index]?.label:void 0;u!=null&&t.push(k.risk==="high"?`${u} \u203C`:u)}),t.length>3?`${t.slice(0,3).join(" \xB7 ")} \xB7 +${t.length-3} more`:t.join(" \xB7 ")}function re(r){let t=r.text.replace(/\?+\s*$/,"");return t.length<=36?t:`${t.slice(0,33)}\u2026`}function de(r){return r.use_cases??[]}var le={acs:"acceptance criteria",scenarios:"scenarios",exercises:"exercises",tests:"tests",gaps:"gaps"};function ge(r){let t=[],k=[],h=(i,b)=>{b.length!==0&&(k.push(i),t.push(...b))},u=i=>typeof i=="string"&&/^[a-z]{1,4}\d{1,4}$/i.test(i)?i:null,f=i=>{let b=u(i.automates)??"1 scenario",c=i.verifies??[],p=c.map(u).filter(_=>_!==null).slice(0,2),w=c.length-p.length,C=p.length?`${p.join(" ")}${w>0?` +${w}`:""}`:`${c.length} ACs`;return`covers ${b} \xB7 verifies ${C}`};return h("acs",(r.acs??[]).map(i=>({temp_ref:i.temp_ref,title:i.text,kind:"ac",badge:String(i.kind),extra:{...i.expected_answer?{expects:`${String(i.expected_answer.operator??"")} \xB7 ${String(i.expected_answer.operand??"")}`}:{},"scoped to":i.scoped_to??"(use-case)"}}))),h("scenarios",(r.scenarios??[]).map(i=>({temp_ref:i.temp_ref,title:i.title,kind:"scenario",badge:i.case_type,why:i.intent,depends_on_hint:i.depends_on??[],extra:{technique:i.technique_notes}}))),h("exercises",(r.exercises??[]).map(i=>({temp_ref:u(i.scenario)??"wiring",title:`${u(i.scenario)??"scenario"} exercises ${u(i.ac)??"1 AC"}`,kind:"exercise",badge:"wires",why:i.rationale}))),h("tests",(r.tests??[]).map(i=>({temp_ref:i.temp_ref,title:i.title,kind:"test",why:f(i),depends_on_hint:i.reuses??[],extra:{automates:String(i.automates??"?"),verifies:(i.verifies??[]).join(", "),check:i.check?`${String(i.check.kind)} vs ${String(i.check.verified_against)}`:"?"}}))),h("gaps",(r.gaps??[]).map(i=>({temp_ref:i.temp_ref??i.ref??"?",title:String(i.question?.header??i.kind),kind:"gap",badge:i.kind,why:i.risk_rationale}))),{items:t,heading:k.join(" + ")||"design"}}function be(r={}){let t={turns:[],thinking:ee(),pending:null,confirm:null,status:"idle",ledger:[],activeTurn:null,stream:null,checkpoint:!1},k=e=>{let n=[],s=e.minted.map(a=>a.slug).filter(Boolean);s.length&&n.push(`added ${s.join(", ")}`);let o=e.applied.length-e.minted.length;return o>0&&n.push(`${o} change${o===1?"":"s"} applied`),e.staleDelta.length&&n.push(`stales ${e.staleDelta.length}`),n.join(" \xB7 ")||"no changes"},h=[];r.onRender&&h.push(r.onRender);let u=0,f=0,i=null,b=null,c=null,p=[],w=0,C=e=>{if(!(!c||!r.contextDir||!e.trim()))try{let n=r.refreshGraph?.()??r.graph;if(!n)return;Y({contextDir:r.contextDir,graph:n,sourceId:c,text:e,by:r.by??{kind:"human",id:"owner"}})}catch{}},_=e=>{if(!c||!r.contextDir)return;let n=r.refreshGraph?.()??r.graph,s=n?.heads.get(c),o=n?.convChains.get(c);if(!n||typeof s!="string"||!o)return;let a=n.getNode(s)?.content?.blob,g=typeof a=="string"?X(r.contextDir,a)?.toString("utf8")??"":"";if(g)for(let y of e){if(y.kind!=="add"||y.convSourceId!==c)continue;let E=B(g,y.cite.turn);if(!(E!==null&&E.includes(y.cite.quote)))for(let S=o.turns;S>=1;S--){let N=B(g,S);if(N!==null&&N.includes(y.cite.quote)){y.cite={...y.cite,turn:S};break}}}},P=null,F=new Map,Q=new Map,G=null,m=()=>{M&&(clearTimeout(M),M=null);for(let e of h)e()},M=null,U=()=>{M||(M=setTimeout(()=>{M=null;for(let e of h)e()},80))},l=e=>{t.ledger.push(e)},R=null,O=!1,q=(e=!1)=>{R?l({kind:"agent",text:R}):e&&O&&l({kind:"note",text:'chat to refine ("looks good" approves; /done finishes)'}),R=null,O=!1},se=()=>{R=null,O=!1},A=null,W=e=>{if(A){if(e)for(let n of A.items){let s=e.get(n.temp_ref);s&&(n.logical_id=s)}l({kind:"turn",...A}),A=null}},T=()=>{W(),t.activeTurn&&(t.activeTurn=null)},z=(e,n)=>n.choice||(n.selected_index!=null?e.options[n.selected_index]?.label??"?":"?"),L=()=>{let e=t.pending;if(!e)return;if(!e.resolution.every(Boolean)){e.cursor=e.resolution.findIndex(o=>o===null);return}let n=e.questions.map((o,a)=>{let g=e.resolution[a];return g.form==="deferred"?{id:o.id,selected_index:null,free_text:null}:g.free_text!=null?{id:o.id,selected_index:null,free_text:g.free_text}:{id:o.id,selected_index:g.selected_index,free_text:null}});t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now());let s=P;P=null,s?.(n)},j=(e,n)=>{let s=t.pending,o=s.questions[e],a=s.resolution[e];s.resolution[e]=n;let g=re(o);a?l({kind:"answer",receipt:{form:"changed",qNum:e+1,stub:g,choice:z(o,n),prev:a.choice}}):n.form==="deferred"?l({kind:"answer",receipt:{form:"deferred",qNum:e+1,stub:g}}):l({kind:"answer",receipt:{form:n.form,qNum:e+1,stub:g,choice:z(o,n)}})},H=()=>{let e=t.pending;e&&(e.questions.forEach((n,s)=>{e.resolution[s]||j(s,{form:"deferred",selected_index:null,free_text:null,choice:""})}),L())},I=new Map,K=e=>{I.clear();let n={high:0,med:1,low:2};return e=e.map((s,o)=>({q:s,i:o})).sort((s,o)=>(n[s.q.risk]??3)-(n[o.q.risk]??3)||s.i-o.i).map(({q:s})=>s),{questions:e,cursor:0,resolution:e.map(()=>null)}};return{state:t,explainLines(e){if(!r.explain||!r.graph||r.contextDir===void 0)return null;let n=r.explain(r.contextDir,r.graph,e);return n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(s=>` [${s.kind}] ${s.rationale??s.detail}`)]:null},explainRef(e){if(!r.explain||!r.graph||r.contextDir===void 0){l({kind:"note",text:"explain isn't available here"}),m();return}let n=r.explain(r.contextDir,r.graph,e),s=n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(o=>` [${o.kind}] ${o.rationale??o.detail}`)].join(`
3
- `):`unknown ref: ${e}`;l({kind:"note",text:s}),m()},subscribe(e){return h.push(e),()=>{let n=h.indexOf(e);n>=0&&h.splice(n,1)}},submit(e){if(t.confirm&&(t.confirm=null),!t.pending){if(!i){t.turns.push({role:"user",text:e}),l({kind:"user",text:e}),t.notice="the agent isn't running \u2014 nothing sent",m();return}for(t.notice=void 0,t.checkpoint=!1,q(),t.turns.push({role:"user",text:e}),l({kind:"user",text:e}),C(e),t.status="streaming",t.busySince=Date.now(),t.error=void 0,f+=1;p.length>0;)f+=1,i({type:"user_message",message_id:`u${f}-receipt`,text:p.shift()});i({type:"user_message",message_id:`u${f}`,text:e}),m()}},attachSender(e){let n=i;return i=e,()=>{i=n}},attachOnCommitted(e){b=e},attachConversationSource(e){c=e},holdReceipt(e){p.push(e),t.checkpoint=!0,m()},drainHeldReceipts(){return p.splice(0,p.length)},submitAnswer(e,n){let s=t.pending,o=s?.questions[e],a=o?.options[n]?.label;!s||!o||a==null||(j(e,{form:"answered",selected_index:n,free_text:null,choice:a}),L(),m())},submitFreeText(e,n){let s=t.pending,o=s?.questions[e],a=n.trim();!s||!o||!a||(j(e,{form:"answered",selected_index:null,free_text:a,choice:a}),L(),m())},toggleOption(e,n){let s=t.pending?.questions[e];if(!s||s.options[n]==null)return;let o=I.get(e)??new Set;o.has(n)?o.delete(n):o.add(n),I.set(e,o),m()},multiSelection(e){return[...I.get(e)??[]].sort((n,s)=>n-s)},confirmMulti(e){let n=t.pending,s=n?.questions[e];if(!n||!s)return;let o=[...I.get(e)??[]].sort((g,y)=>g-y).map(g=>s.options[g]?.label).filter(g=>g!=null);if(o.length===0)return;I.delete(e);let a=o.join(", ");j(e,{form:"answered",selected_index:null,free_text:a,choice:a}),L(),m()},goWithRecommendations(){let e=t.pending;if(!e)return{picks:""};let n=ce(e),s=null;return e.questions.forEach((o,a)=>{if(e.resolution[a])return;let g=o.recommended_index,y=g!=null?o.options[g]?.label:void 0;if(y==null){s===null&&(s=a);return}j(a,{form:"assumed",selected_index:g,free_text:null,choice:y})}),s!==null?(e.cursor=s,m(),{blocked:s}):(L(),m(),{picks:n})},reopenQuestion(){let e=t.pending;if(!e)return;let n=e.cursor<0?e.questions.length:e.cursor;for(let s=n-1;s>=0;s--)if(e.resolution[s]){e.cursor=s,m();return}},continueParked(){if(i){for(t.checkpoint=!1,l({kind:"continued"});p.length>0;)f+=1,i({type:"user_message",message_id:`u${f}-receipt`,text:p.shift()});f+=1,i({type:"user_message",message_id:`u${f}`,text:"continue"}),t.status="streaming",t.busySince=Date.now(),m()}},note(e){l({kind:"note",text:e}),m()},aliasOf(e){return Q.get(e)},registerAliases(e){for(let n of e)Q.set(n.ref,n.cid);W(new Map(e.filter(n=>n.id).map(n=>[n.ref,n.id]))),m()},setWorking(e){if(e!=null){if(t.status!=="idle"&&t.status!=="working")return;t.status==="idle"&&(t.busySince=Date.now()),t.status="working",t.workingLabel=e}else{if(t.status!=="working")return;t.status="idle",t.workingLabel=void 0,t.busySince=void 0}m()},ledger(e){e.kind==="commit"&&W(),(e.kind==="pause"||e.kind==="error"||e.kind==="summary")&&(T(),q()),(e.kind==="summary"||e.kind==="pause")&&(t.stream=null),l(e),e.kind==="commit"&&(e.ok?q(!0):se()),m()},senderAlive(){return i!=null},completeSession(){H(),i?.({type:"session_complete"}),t.status="idle",t.busySince=void 0,m()},requestPause(){H(),t.status="pausing",t.busySince=void 0;let e=i;Promise.resolve().then(()=>e?.({type:"pause"})),m()},ask(e){return t.pending=K(e),F=new Map(e.map((n,s)=>[n.id,s+1])),t.status="awaiting-input",t.busySince=void 0,m(),new Promise(n=>{P=n})},noteCoercion(e,n){l({kind:"answer",receipt:{form:"assumed",qNum:F.get(e.id)??0,stub:re(e),choice:n,note:"your typed answer couldn't be used here"}}),m()},onAgentEvent(e){switch(e.type){case"reasoning_delta":case"reasoning_done":case"tool_activity":case"decision_activity":{let n=t.thinking;if(t.thinking=ne(n,e),t.thinking!==n){if(e.type==="reasoning_done"&&e.present)l({kind:"thinking",tookMs:e.took_ms});else if(e.type==="tool_activity"&&e.status!=="started")l({kind:"tool",name:e.name,status:e.status==="done"?"ok":e.status,detail:e.detail});else if(e.type==="decision_activity"){let s=`\xB7 ${te(e)}`,o=t.ledger.length-1;for(;o>=0&&t.ledger[o].kind==="tool";)o--;let a=t.ledger[o];a&&a.kind==="note"&&a.text===s||l({kind:"note",text:s})}}if(e.type==="reasoning_delta"){U();return}break}case"usage":t.credits={turn:e.credits,total:e.total_credits};break;case"text_delta":{let n=G;if(n&&(e.turn_id<n.turn_id||e.turn_id===n.turn_id&&e.attempt<n.attempt))return;(!n||n.turn_id!==e.turn_id||n.attempt!==e.attempt)&&(G={turn_id:e.turn_id,attempt:e.attempt},t.stream={text:""}),t.stream={text:(t.stream?.text??"")+e.text},U();return}case"progress":break;case"proposal":{u+=1,T(),t.stream=null,t.busySince&&(l({kind:"note",text:`\u2713 done in ${Math.max(1,Math.round((Date.now()-t.busySince)/1e3))}s`}),t.busySince=void 0);let n=de(e.proposal),s=r.dedupFlags?.(e.proposal);if(s)for(let o of n){let a=s.get(o.temp_ref);a&&(o.matches_existing=a)}t.turns.push({role:"agent",turnIndex:u,items:n,text:e.narrative}),R=e.narrative??null,O=!0,t.activeTurn={turnIndex:u,heading:"use-cases",items:n},A={turnIndex:u,heading:"use-cases",items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"design":{u+=1,T(),t.stream=null,t.busySince&&(l({kind:"note",text:`\u2713 done in ${Math.max(1,Math.round((Date.now()-t.busySince)/1e3))}s`}),t.busySince=void 0);let{items:n,heading:s}=ge(e.design),o=e.design.phase==="wiring"?"acceptance criteria + exercises":s.split(" + ").map(a=>le[a]??a).join(" + ");l({kind:"banner",text:`designing: ${o}`}),t.turns.push({role:"agent",turnIndex:u,items:n,itemsHeading:s,text:e.narrative}),R=e.narrative??null,O=!0,t.activeTurn={turnIndex:u,heading:s,items:n},A={turnIndex:u,heading:s,items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"ask_user":t.pending=K(e.questions),t.status="awaiting-input",t.busySince=void 0;break;case"chat_ops":{u+=1,T(),t.stream=null,t.status==="streaming"&&(t.status="idle",t.busySince=void 0);let n=e.chat_ops??e,s=Array.isArray(n.ops)?n.ops:[],o=n.text??e.text??"",a=r.refreshGraph?.()??r.graph,g=d=>Q.get(d)??d,y=s.map(d=>{if(!d.target)return d;let x=g(d.target),v=d.expected_cid;if(v==null&&a){let J=a.resolve(x);J&&(v=a.tipOf(J.cid))}let $=d.payload?.redirect_to,D=$&&g($);return x===d.target&&v===d.expected_cid&&D===$?d:{...d,target:x,expected_cid:v,...D!==$?{payload:{...d.payload,redirect_to:D}}:{}}}),E;try{if(!Array.isArray(n.ops))throw new Error("the agent sent an unreadable change set (no ops array) \u2014 say it again in different words");E=ie(y,r.descriptor??{mint_gate:[]},{turn:u,...c?{convSourceId:c}:{}})}catch(d){t.error=d instanceof Error?d.message:String(d),t.turns.push({role:"agent",turnIndex:u,text:o,narration:t.error}),o&&l({kind:"agent",text:o}),l({kind:"error",title:t.error,detail:[]});break}let{chatOps:S,ambiguous:N}=E;if(N.length>0){let d=N[0];t.confirm={kind:"ambiguity-confirm",prompt:`did you mean edit or ${d.kinds.filter(x=>x!=="edit").join("/")} on ${d.target}?`},t.turns.push({role:"agent",turnIndex:u,text:o}),o&&l({kind:"agent",text:o});break}if(_(S),r.commitChatTurn&&S.length>0){let d=r.commitChatTurn({contextDir:r.contextDir??"",graph:r.refreshGraph?.()??r.graph,ops:S,by:r.by??{kind:"human",id:"owner"},...r.descriptor?.mint_gate?{mintable:r.descriptor.mint_gate}:{}});if(d.errors)t.error=d.errors.map(x=>x.detail).join("; "),t.turns.push({role:"agent",turnIndex:u,text:o}),l({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:d.errors.map(x=>`${x.code}: ${x.detail}`)}),p.push(["COMMIT FAILED (chat turn) \u2014 nothing landed; do not assume any of your last ops applied.",...d.errors.map(x=>`- ${x.code}: ${x.detail}`),...d.errors.some(x=>x.code==="UNKNOWN_FIELD")?["If you were changing citations or matched-existing content, that is proposal territory (approve/re-propose) \u2014 a chat edit can only replace a node's own schema fields."]:[]].join(`
4
- `)),o&&l({kind:"agent",text:o});else{d.applied.length>0&&r.session?.markApplied(d.applied);let x=k(d);t.turns.push({role:"agent",turnIndex:u,text:o,narration:x}),l({kind:"commit",ok:!0,line:x});let v=r.refreshGraph?.();if(v&&b&&b(v),v)try{w+=1;let V=r.descriptor?.mint_gate?.includes("usecase")?"extract":"design",$=Z({verb:V,commitN:w,phase:"chat",committed:d.minted.map(D=>({cid:D.cid,...D.slug?{logical_id:D.slug}:{}}))},v);p.push($.text)}catch{}o&&l({kind:"agent",text:o})}}else t.turns.push({role:"agent",turnIndex:u,text:o}),o&&l({kind:"agent",text:o});C(o);break}case"done":case"session_complete":T(),q(),t.status="idle",t.busySince=void 0,i=null;break;case"error":T(),q(),t.stream=null,t.status="idle",t.busySince=void 0,t.error=e.message,i=null,l({kind:"error",title:e.message,detail:[]});break;case"session_paused":break;default:break}m()}}}export{ce as a,re as b,be as c};
@@ -1,12 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{f as He}from"./chunk-K7USHLVZ.js";import{a as he,e as Be,g as je,h as We}from"./chunk-JSF5JYZC.js";import{a as Ge,b as qe,c as Le}from"./chunk-J44RN3FB.js";import{a as Te,b as Ne}from"./chunk-JFAFKHDX.js";import{b as Fe}from"./chunk-YKTYVJBN.js";import{a as Ue}from"./chunk-CVOGP253.js";import{a as Me}from"./chunk-GG43HSU2.js";import{c as Ie}from"./chunk-FMR2KPSK.js";import{c as Pe}from"./chunk-V3UE6RJP.js";import{a as se,b as Ae}from"./chunk-DNNZ353O.js";import{b as Oe}from"./chunk-FHKDTM5L.js";import{a as V}from"./chunk-NVGBE2DR.js";import{a as R}from"./chunk-7E24OCGX.js";import{e as z,f as re}from"./chunk-6W6AIDLJ.js";import{d as j}from"./chunk-5YPBPZUR.js";import{b as Ee}from"./chunk-IAHKTEET.js";import{a as Re}from"./chunk-5EOX4MEY.js";import{appendFileSync as ot,mkdirSync as pe,writeFileSync as _e}from"fs";import{dirname as nt,extname as at,join as U}from"path";var E=class extends Error{code;constructor(e,c){super(`${e}: ${c}`),this.name="ProposalAdapterError",this.code=e}};function ze(s){return s.version===2}function Ve(s,e){if(s.read_basis.length!==1)throw new E("READ_BASIS_COUNT",`read_basis must have exactly 1 element, got ${s.read_basis.length}`);let c=s.read_basis[0],u=s.use_cases.map(i=>{if(i.cite.length!==1)throw new E("CITE_COUNT",`${i.temp_ref}: cite must have exactly 1 element, got ${i.cite.length}`);let g=i.cite[0];if(g.source_id!==c.source_id)throw new E("SOURCE_MISMATCH",`${i.temp_ref}: cite source ${g.source_id} != read_basis source ${c.source_id} (single-source)`);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:{anchor:g.anchor,quote:g.quote},...i.criteria!=null&&i.criteria.length>0?{criteria:i.criteria.map((d,_)=>{if(d.cite.source_id!==c.source_id)throw new E("SOURCE_MISMATCH",`${i.temp_ref}.criteria[${_}]: cite source ${d.cite.source_id} != read_basis source ${c.source_id} (single-source)`);return{text:d.text,cite:{anchor:d.cite.anchor,quote:d.cite.quote}}})}:{},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:i.updated.criteria.map((d,_)=>{if(d.cite.source_id!==c.source_id)throw new E("SOURCE_MISMATCH",`${i.temp_ref}.updated.criteria[${_}]: cite source ${d.cite.source_id} != read_basis source ${c.source_id} (single-source)`);return{text:d.text,cite:{anchor:d.cite.anchor,quote:d.cite.quote}}})}:{}}}:{},...i.change_note!=null?{change_note:i.change_note}:{}}});return{version:1,read_basis:e,source:{source_id:c.source_id,source_cid:c.source_cid},use_cases:u}}function Je(s){let{contextDir:e,graph:c}=s,u=s.maxDigestBytes??4096,i={},g=[];for(let[l,f]of c.heads){if(i[l]=f,typeof f!="string")continue;let x=c.mediaOf(f),k=c.getNode(f)?.content?.blob;if(typeof k=="string")if(x.format==="image")g.push({source_id:l,cid:f,format:"image",blobRef:{path:V(e,k),cid:k}});else{let n=se(e,c,f)?.toString("utf8")??"";g.push({source_id:l,cid:f,format:x.format,text:n})}}g.sort((l,f)=>l.source_id<f.source_id?-1:1);let d=[];for(let l of c.byLabel(j.STYLENOTE).sort((f,x)=>f.cid<x.cid?-1:1))c.superseded.has(l.cid)||d.push(`\u2022 ${String(l.content.statement)} [${String(l.content.learned_from_kind)}]`);let _="";for(let l of d){if(Buffer.byteLength(_+l+`
3
- `,"utf8")>u)break;_+=l+`
4
- `}return{read_basis:i,sources:g,styleNoteDigest:_}}function Ke(s,e){let c=Je({contextDir:s,graph:e}).styleNoteDigest;return c.length>0?c:void 0}function ct(s,e){let c=(s.images??[]).filter(u=>u.delivery==="selected");if(c.length!==0)return c.map(u=>({ref:u.ref,...u.page!==void 0?{page:u.page}:{},...u.loc!==void 0?{loc:u.loc}:{},media_type:u.media_type,blob_ref:{path:V(e,u.blob),cid:u.blob}}))}function dt(s){return s.length>8&&s[0]===137&&s[1]===80&&s[2]===78&&s[3]===71?"image/png":s.length>3&&s[0]===255&&s[1]===216&&s[2]===255?"image/jpeg":s.length>12&&s.toString("ascii",0,4)==="RIFF"&&s.toString("ascii",8,12)==="WEBP"?"image/webp":null}function Xe(s){return s.toISOString().replace(/[-:]/g,"").slice(0,15)}function ut(s){return s.startsWith("su-conv-")?`conv-${Ee(Buffer.from(s,"utf8")).slice(0,8)}`:s}function et(s){return s.source_id.startsWith("su-conv-")?"the conversation":s.source_id}function lt(s,e,c){return`reading ${et(s)}${c>1?` (source ${e} of ${c})`:""}`}function J(s){return s.toLowerCase().trim().replace(/\s+/g," ")}function Ye(s,e){let c=new Map,u=new Map,i=new Map;for(let{cid:d,content:_}of e.byLabel(j.USECASE)){if(e.superseded.has(d))continue;(e.trust.get(d)==="archived"?i:u).set(J(String(_.title??"")),d)}let g=d=>e.trust.get(d)==="archived"?{cid:d,archived:!0,reason:e.archivedReason.get(d)}:{cid:d};for(let d of s.use_cases){if(d.matches_existing){let f=d.matches_existing.cid;if(e.superseded.has(f)){let x=e.tipOf(f);f=e.superseded.has(x)?null:x}if(f!==null){c.set(d.temp_ref,g(f));continue}}let _=u.get(J(d.title));if(_){c.set(d.temp_ref,{cid:_});continue}let l=i.get(J(d.title));l&&c.set(d.temp_ref,g(l))}return c}var Qe=/^(\S+)\.criteria\[(\d+)\]/;function mt(s,e,c){if(e.length===0||!e.every(i=>Qe.test(i.detail)))return!1;let u=new Map;for(let i of e){let g=Qe.exec(i.detail),d=u.get(g[1])??new Set;d.add(Number(g[2])),u.set(g[1],d)}for(let i of s.use_cases){let g=u.get(i.temp_ref);g?.size&&(i.criteria=(i.criteria??[]).filter((d,_)=>!g.has(_)),c(`${i.temp_ref}: dropped ${g.size} criteria with unverifiable cites \u2014 committed without them (criteria are hints, not oracles)`))}return!0}async function Ze(s,e,c,u,i=()=>{},g){let d=(_,l)=>i(_,l,s.session_id);return je(s,e,c,u,i,{async onProposalEvent(_){let l=_,f=null,x=null;if(ze(l))try{f=Ve(l,s.read_basis),d("adapter",{ok:!0,use_cases:f.use_cases.length})}catch(k){x=k instanceof E?k.message:String(k),d("adapter",{ok:!1,error:x})}else f=l;return f&&f.use_cases.length===0&&e.out("warning: the agent proposed ZERO use-cases for this source"),f&&g&&await g(f),{proposal:f,error:x}}})}var gt=new Set(["agent","ci","override"]);async function Jt(s,e){let c=s.mode??"interactive";if(c==="interactive"){if(!e.isTTY)return e.out("extract: --mode interactive needs a TTY (use --mode agent|ci|override headless)"),2}else if(!gt.has(c))return e.out(`extract: unknown mode "${c}" \u2014 interactive | agent | ci | override`),2;let u=e.telemetry?.enabled?e.telemetry:void 0,i=Xe(e.now?.()??new Date),g=u?Re(u.ids.context_instance_id??null,"extract",u.ids.session_id):U(e.contextDir,"logs",`extract-${i}.log`);pe(nt(g),{recursive:!0});let d=`run-${i}-${Math.random().toString(36).slice(2,8)}`,_=t=>t==="error"||t==="failed_proposal"?"error":t==="repair_respawn"?"warn":"info",l=(t,a,m)=>{try{ot(g,JSON.stringify({ts:new Date().toISOString(),level:_(t),run_id:d,...u?{user_session_id:u.ids.session_id}:{},...m?{session_id:m}:{},kind:t,data:a})+`
5
- `)}catch{}u?.wireTrace(t,a,m)};e.out(`trace: ${he(g)}`),u&&e.out(u.banner()),e.emit?.({type:"run_start",mode:c,trace:g});let f=Fe();if(f&&e.out(f),e.preflightTurn){let t=await e.preflightTurn();if(l("preflight",t),!t.ok)return e.out(t.message??"error: turn-endpoint preflight failed"),e.emit?.({type:"error",message:t.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),2}let x=R(e.contextDir),k=Ke(e.contextDir,x);if(s.source){if(s.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}let t=x.heads.get(s.source);if(typeof t!="string"){let a=t===null?`error: --source ${s.source} was ingested but is retired \u2014 re-ingest it to extract again`:`error: --source ${s.source} is not an ingested source (kane-cli context list shows them)`;return e.out(a),e.emit?.({type:"error",message:a,code:"SOURCE_UNKNOWN"}),2}}let n=null;if(s.resume){try{n=Le(e.contextDir,s.resume,x)}catch(m){return e.out(`error: ${m instanceof Error?m.message:String(m)}`),e.emit?.({type:"error",message:`error: ${m instanceof Error?m.message:String(m)}`}),1}let t=n.handle.state.change_basis;if(t&&(x.heads.get(t.source_id)??null)!==t.new_head){let m=`error: ${t.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 ${s.resume} is defunct and can be ignored)`;return e.out(m),e.emit?.({type:"error",message:m,code:"CHANGE_BASIS_MOVED"}),n.handle.release(),2}n.staleBasis.length>0&&e.out(`note: changed since the pause: ${n.staleBasis.join(", ")} \u2014 re-presented items may be stale`);let a=n.handle.state.held_receipts??[];if(a.length>0)if(e.chat?.holdReceipt)for(let m of a)e.chat.holdReceipt(m);else e={...e,initialMessage:[a.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 ${s.resume} lists them`)}let xe=x.extractedSourceCids,K=!!(s.force||n?.handle.state.force),y=[],P=[];for(let[t,a]of x.heads.entries())if(a!=null&&!(s.source&&t!==s.source)){if(!s.source&&!n&&t.startsWith("su-conv-")){e.out(`skipped: ${t} \u2014 conversation source (extract it explicitly with --source ${t})`),P.push({source_id:t,reason:"conversation"});continue}if(n){let m=t in n.handle.state.read_basis,I=n.handle.state.corpus_cursor.remaining.includes(t);if(!m&&!I)continue;if(I&&!K&&xe.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),P.push({source_id:t,reason:"cached"});continue}}else if(!K&&xe.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),P.push({source_id:t,reason:"cached"});continue}y.push({source_id:t,cid:a})}let tt=t=>{let a=He(e.contextDir,t);a&&e.out(`note: a reconcile plan for ${t} is pending (${a.pending} item(s)) \u2014 resume with \`kane-cli maintain reconcile --apply ${a.path}\``)};for(let t of P)t.reason==="cached"&&tt(t.source_id);if(e.emit?.({type:"corpus",sources:y,skipped:P}),y.length===0){if(n){let m=`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 ${s.resume}, or discard with: kane-cli context sessions clean ${s.resume}`;return e.out(m),e.emit?.({type:"error",message:m,code:"SOURCE_MISSING"}),n.handle.release(),2}let t=P.length>0&&P.every(a=>a.reason==="conversation");return e.out(s.source?`extract: nothing to do \u2014 ${s.source} is already extracted at its current snapshot (--force to re-run)`:t?"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 X=new Map;if(n&&n.questions.length>0&&!s.message){e.out(`re-presenting ${n.questions.length} unanswered question(s) from the paused session`);let t=await e.ask(n.questions.map(Ge));for(let a of t)X.set(a.id,a)}let H=e.by??{kind:"human",id:"owner"},A=c==="interactive"&&!s.plan&&!!e.chat,ie=0,ye=0;try{for(let t of y){let a=R(e.contextDir),m={current:a};e.chat?.attachOnCommitted?.(r=>{m.current=r});let I=a.getNode(t.cid),Y=String(I?.content.blob??""),oe=se(e.contextDir,a,t.cid);if(!oe)return e.out(`error: ${t.source_id}: blob ${Y} missing from .context/blobs`),e.emit?.({type:"error",source_id:t.source_id,message:`error: ${t.source_id}: blob ${Y} missing from .context/blobs`,code:"BLOB_MISSING"}),1;let G=a.mediaOf(t.cid),ne=G.media_type.startsWith("image/");if(!ne){let r=dt(oe);if(r){e.out(`skipping ${t.source_id}: binary ${r} ingested before image support \u2014 re-ingest it (kane-cli context ingest) to extract from it`),e.emit?.({type:"source_skipped",source_id:t.source_id,reason:"binary_pre_media"});continue}}let q=ne?`0001| (image source ${t.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:Ae(oe),ve=Xe(e.now?.()??new Date),M=`${ve}-${t.source_id}`,be=!!(n&&t.source_id in n.handle.state.read_basis)?s.resume:`ext-${ve}-${ut(t.source_id)}`,T="";if(A){let r=Ie({contextDir:e.contextDir,graph:R(e.contextDir),sessionStamp:be,by:H});r.errors===null||r.errors[0]?.code==="CONV_SOURCE_EXISTS"?(T=r.sourceId,e.chat.attachConversationSource?.(T),m.current=R(e.contextDir)):e.out(`warning: conversation source unavailable (${r.errors[0]?.detail}) \u2014 chat adds will not land this session`)}let $={type:"run_config",version:1,session_id:be,mode:c,source:{source_id:t.source_id,source_cid:t.cid,kind:Pe.has(G.format)?G.format:at(t.source_id)||"md",numbered_text:q,...(()=>{let r=ct(G,e.contextDir);return r?{images:r}:{}})()},existing_use_cases:a.byLabel(j.USECASE).filter(({cid:r})=>a.trust.get(r)!=="archived"&&!a.superseded.has(r)).map(({cid:r,content:o})=>({id:r,title:String(o.title??""),summary:String(o.summary??"")})),read_basis:m.current.latestHash,max_free_text_rounds:Be,graph_reads:!0,verb:"extract",...k!==void 0?{style_note_digest:k}:{},...s.changeContext&&s.changeContext.source_id===t.source_id?{change_context:s.changeContext}:{},topology:Ue(),...A?{chat:!0}:{},...ne?{image_sources:[{source_id:t.source_id,source_cid:t.cid,media_type:G.media_type,blob_ref:{path:V(e.contextDir,Y),cid:Y}}]}:{},...n&&t.source_id in n.handle.state.read_basis?{resume:{agent_state:n.handle.state.agent_state}}:{}};A||e.out(n&&t.source_id in n.handle.state.read_basis?`resuming: ${t.source_id} (session ${s.resume})`:`extracting: ${t.source_id} @ ${t.cid.slice(0,19)}`),e.emit?.({type:"source_start",source_id:t.source_id,cid:t.cid,index:y.indexOf(t)+1,total:y.length,resumed:!!(n&&t.source_id in n.handle.state.read_basis)}),e.chat?.ledger?.({kind:"banner",text:lt(t,y.indexOf(t)+1,y.length)}),e.chat?.setWorking?.(`Reading ${et(t)}\u2026`);let $e=new Map;l("spawn",{source_id:t.source_id,source_cid:t.cid,resume:!!n,chat:A},$.session_id);let Se=!1,rt=async r=>{let o=z(r,q,R(e.contextDir));if(l("kane_validate",{errors:o.map(p=>p.code)},$.session_id),o.length>0){e.chat.submit("[auto-repair] the proposal failed validation: "+o.map(p=>`${p.code}: ${p.detail}`).join("; ")+" \u2014 please re-finalize with these fixed.");return}let v=R(e.contextDir),C=Ye(r,v),ee=U(e.contextDir,"proposals",M);pe(ee,{recursive:!0}),_e(U(ee,"proposal.json"),JSON.stringify(r,null,2)+`
10
- `);let it=new Map(r.use_cases.map(p=>[p.temp_ref,{resolution:"skipped"}])),te=re({contextDir:e.contextDir,graph:v,proposal:r,proposalId:M,verdicts:it,by:{kind:"ai",id:"extract-agent"},autoName:!0});if(te.errors){e.chat.ledger?.({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:te.errors.map(p=>`${p.code}: ${p.detail}`)});return}Se=!0;let F=te.record.nodes.length;ie+=F;let B=r.use_cases.length-F;{let p=R(e.contextDir),De=new Map;for(let{cid:b,content:D}of p.byLabel(j.USECASE))p.superseded.has(b)||De.set(J(String(D.title??"")),b);let fe=[];for(let b of r.use_cases){let D=null;if(b.matches_existing?.cid&&p.hasNode(b.matches_existing.cid)){let W=p.tipOf(b.matches_existing.cid);D=p.superseded.has(W)?null:W}D=D??De.get(J(b.title))??null,D&&fe.push({ref:b.temp_ref,cid:D,...p.displayNameOf(D)?{id:p.displayNameOf(D)}:{}})}fe.length>0&&e.chat.registerAliases?.(fe),m.current=p;let ke=b=>{for(let[D,W]of p.names)if(W===b&&!p.superseded.has(W))return D},Ce=Me({verb:"extract",commitN:1,phase:"proposal",committed:te.record.nodes.map(b=>({cid:b.cid,...ke(b.cid)?{logical_id:ke(b.cid)}:{}})),reused:B},p);e.emit?.(Ce.event),e.chat.holdReceipt?.(Ce.text)}l("commit",{derived:F,evidence_matched:B,chat:!0},$.session_id),e.chat.ledger?.({kind:"commit",ok:!0,line:F===0&&B>0?`all ${B} matched existing \u2014 nothing new to save`:`saved ${F} use-case${F===1?"":"s"} as drafts`+(B>0?` \xB7 ${B} matched existing`:"")})},we=!!(n&&t.source_id in n.handle.state.read_basis),Q=we&&X.size>0?{...e,ask:async r=>r.every(o=>X.has(o.id))?(n.handle.markApplied(r.map(o=>`resolveq:${s.resume}:${o.id}`)),e.out(`answered ${r.length} re-asked question(s) from the held resume answers`),r.map(o=>X.get(o.id))):e.ask(r)}:e;we&&s.message&&(Q={...Q,initialMessage:s.message});let h=await Ze($,{...Q,graphSlot:m},$e,a,l,A?rt:void 0);if(e.chat?.setWorking?.(null),h.error)return e.out(`error: agent failed for ${t.source_id}: ${h.error}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: agent failed for ${t.source_id}: ${h.error}`}),1;if(h.highRisk)return e.out(`error: ${h.highRisk.length} high-risk decision${h.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:t.source_id,message:`error: high-risk question(s) in ci mode (fail-closed): ${h.highRisk.map(r=>r.id).join(", ")}`,code:"HIGH_RISK_CI"}),1;if(h.paused){let r=y.slice(y.indexOf(t)+1).map(ee=>ee.source_id),o=n?.handle??Oe(e.contextDir,{sid:$.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:h.paused.agent_state,pending:{questions:[],proposals:[]},assumed:[],read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},conv_source:T,verb:"extract",...K?{force:!0}:{},...s.changeContext?{change_basis:{source_id:s.changeContext.source_id,new_head:s.changeContext.new_head}}:{},...u?{user_session_id:u.ids.session_id}:{}});T&&o.state.conv_source!==T&&o.save({conv_source:T});let v=e.chat?.drainHeldReceipts?.()??[];(v.length>0||(o.state.held_receipts?.length??0)>0)&&o.save({held_receipts:v}),n?.handle&&o.save({read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},...K&&!o.state.force?{force:!0}:{},...u&&o.state.user_session_id!==u.ids.session_id?{user_session_id:u.ids.session_id}:{}}),qe(o,h.paused),l("session_paused",{sid:o.state.sid},$.session_id);let C=`kane-cli context extract --resume ${o.state.sid} --mode ${c}`;return e.out(`paused: session ${o.state.sid} saved \u2014 resume with: ${C}`),e.emit?.({type:"session_paused",sid:o.state.sid,source_id:t.source_id,mode:c,resume:C,expires_at:o.state.expires_at,pending_questions:h.paused.pending.questions}),e.chat?.ledger?.({kind:"pause",sid:o.state.sid,expires_at:o.state.expires_at,resume:C,messageForm:`${C} --message "<your words>"`}),3}if(A){if(ye+=h.assumedDefaults??0,h.error)return 1;if(!Se){let r=y.length-y.indexOf(t)-1;return e.out(`done \u2014 nothing committed for ${t.source_id} (no finalize before the session ended)`+(r>0?`; stopping here \u2014 ${r} remaining source(s) not extracted (re-run kane-cli context extract to continue)`:"")),n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),n=null),0}n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),n=null);continue}if(!h.proposal)return e.out(`error: agent ended without a proposal for ${t.source_id}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: agent ended without a proposal for ${t.source_id}`}),1;let w=z(h.proposal,q,a);if(l("kane_validate",{errors:w.map(r=>r.code)},$.session_id),w.length>0&&mt(h.proposal,w,r=>e.out(r))&&(l("criteria_dropped",{source_id:t.source_id},$.session_id),w=z(h.proposal,q,a)),w.length>0){if(e.out("the agent's proposal didn't validate \u2014 retrying once"),e.emit?.({type:"validate_failed",source_id:t.source_id,codes:w.map(r=>r.code),repairing:!0}),l("repair_respawn",{source_id:t.source_id},$.session_id),h=await Ze($,{...Q,graphSlot:m},$e,a,l),h.error||!h.proposal)return e.out(`error: repair run failed for ${t.source_id}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: repair run failed for ${t.source_id}`}),1;if(w=z(h.proposal,q,a),w.length>0){for(let r of w)e.out(` ${r.detail}`);return e.emit?.({type:"validate_failed",source_id:t.source_id,codes:w.map(r=>r.code),repairing:!1}),e.emit?.({type:"error",source_id:t.source_id,message:`error: proposal failed validation after repair (${w.map(r=>r.code).join(", ")})`}),1}}let S=h.proposal,Z=Ye(S,a),ae=U(e.contextDir,"proposals",M);if(pe(ae,{recursive:!0}),_e(U(ae,"proposal.json"),JSON.stringify(S,null,2)+`
11
- `),s.plan){e.out(`plan: ${S.use_cases.length} use-case(s) proposed from ${t.source_id} (nothing committed)`);for(let r of S.use_cases){let o=Z.get(r.temp_ref),v=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(` [${r.risk}] ${r.title} \u2014 cite ${r.cite.anchor}${v}`)}e.emit?.({type:"plan",source_id:t.source_id,use_cases:S.use_cases.map(r=>{let o=Z.get(r.temp_ref);return{risk:r.risk,title:r.title,anchor:r.cite.anchor,...o?{match:o.cid,match_archived:!!o.archived}:{}}})}),h.assumedDefaults&&e.out(`assumed: ${h.assumedDefaults} default(s) auto-taken (flagged)`);continue}for(let r of S.use_cases){if(!r.conflicts_with?.length)continue;let o=r.conflicts_with.filter(C=>a.resolve(C)!==null),v=r.conflicts_with.filter(C=>a.resolve(C)===null);v.length>0&&(e.out(`note: ${r.temp_ref}: dropped unresolvable conflict hint(s): ${v.join(", ")}`),r.conflicts_with=o.length>0?o:void 0)}l("review_start",{use_cases:S.use_cases.length,flags:Z.size},$.session_id);let L=await e.review(S.use_cases,Z);l("review_verdicts",[...L.entries()].map(([r,o])=>({ref:r,resolution:o.resolution})),$.session_id),_e(U(ae,"review.json"),JSON.stringify(S.use_cases.map(r=>{let o=L.get(r.temp_ref)??{resolution:"skipped"};return{id:r.temp_ref,kind:"review-item",resolution:o.resolution,edit:o.edit??null,reason:o.reason??null,...o.supersedeTarget?{supersede_target:o.supersedeTarget}:{},by:H}}),null,2)+`
12
- `);let ce=a,O=re({contextDir:e.contextDir,graph:ce,proposal:S,proposalId:M,verdicts:L,by:H,autoName:!0});if(O.errors&&O.errors[0]?.code==="STALE_BASIS"){if(!await e.confirmStale(`the context changed while you reviewed (${O.errors[0].detail}) \u2014 commit against the new head anyway?`))return e.out("aborted: proposal not committed"),e.emit?.({type:"error",source_id:t.source_id,message:"aborted: proposal not committed",code:"STALE_BASIS"}),e.emit?.({type:"done",status:"aborted",exit_code:1}),1;ce=R(e.contextDir),O=re({contextDir:e.contextDir,graph:ce,proposal:S,proposalId:M,verdicts:L,by:H,allowStaleBasis:!0,autoName:!0})}if(O.errors){for(let r of O.errors)e.out(` ${r.detail}`);return e.emit?.({type:"error",source_id:t.source_id,message:`error: commit failed: ${O.errors.map(r=>`${r.code}: ${r.detail}`).join("; ")}`}),1}let st=new Date().toISOString();for(let r of S.use_cases){let o=L.get(r.temp_ref)??{resolution:"skipped"};for(let v of Ne({ts:st,command:"context extract",id:r.temp_ref,by:H},o.resolution))Te(e.contextDir,v)}let N=O.record,de=new Map(N.review.map(r=>[r.id,r.resolution])),ue=[...de.values()].filter(r=>r==="approved"||r==="edited").length,le=[...de.values()].filter(r=>r==="rejected").length,me=N.nodes.filter(r=>!de.has(r.cid)).length,ge=N.supersessions.filter(r=>r.kind==="node"&&r.new!==r.old).length;l("commit",{trusted:ue,derived:me,archived:le},$.session_id),e.out(`committed: ${ue} trusted, ${me} derived (queued), ${le} archived`+(ge>0?`, ${ge} superseded`:"")),h.assumedDefaults&&e.out(`assumed: ${h.assumedDefaults} default(s) auto-taken (flagged)`),e.emit?.({type:"commit",source_id:t.source_id,proposal_id:M,trusted:ue,derived:me,archived:le,superseded:ge,assumed:h.assumedDefaults??0,evidence_matched:Math.max(0,S.use_cases.length-N.nodes.length),minted:N.nodes.map(r=>{let o=N.names?.find(v=>v.cid===r.cid)?.slug;return{cid:r.cid,...o?{logical_id:o}:{}}})}),n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),e.out(`session ${s.resume} complete`),e.emit?.({type:"session_complete",sid:s.resume,source_id:t.source_id}),u?.event("ASR_SESSION_COMPLETE",{}),n=null)}}finally{n?.handle.release()}if(A){let t=e.chat?.state.ledger.filter(I=>I.kind==="answer"&&I.receipt.form==="assumed").length??0,a=ye+t,m=e.chat?.state.credits?.total;e.chat?.ledger?.({kind:"summary",lines:[`saved ${ie} use-case${ie===1?"":"s"} across ${y.length} source${y.length===1?"":"s"}`,...a>0?[`${a} assumed default(s)`]:[],...m!==void 0?[`credits used: ${m.toFixed(1)}`]:[],`trace: ${he(g)}`]})}return s.plan||We(e.contextDir),0}export{ct as a,ut as b,et as c,lt as d,Ye as e,Jt as f};
@@ -1,6 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{existsSync as f,mkdirSync as K,readFileSync as l,readdirSync as L,renameSync as y,rmSync as _,writeFileSync as $,openSync as q,closeSync as F}from"fs";import{randomBytes as H}from"crypto";import{join as w}from"path";var d=class extends Error{constructor(t,i){super(`${t}: ${i}`);this.code=t}},R=1440*60*1e3,A=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,N=n=>w(n,"sessions"),O=(n,e)=>w(N(n),e),g=(n,e)=>w(O(n,e),"state.json"),m=(n,e)=>w(O(n,e),".lock"),E=n=>(n?.now??(()=>new Date))();function P(n){if(!Number.isInteger(n)||n<=0)return!1;try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}function v(n,e){let t=`${n}.tmp-${process.pid}`;$(t,e,{mode:384}),y(t,n)}function b(n,e,t,i=0){if(i>20)throw new d("SESSION_LOCKED",`${e}: lock contention did not settle`);let o=m(n,e),s=H(8).toString("hex"),a=JSON.stringify({pid:process.pid,ts:t.toISOString(),nonce:s})+`
3
- `;try{let r=q(o,"wx",384);return $(r,a),F(r),s}catch(r){if(r.code!=="EEXIST")throw r;let p=!1,u;try{let c=JSON.parse(l(o,"utf8")),h=t.getTime()-new Date(c.ts).getTime();p=!P(c.pid)||h>=R,u=c.nonce}catch{p=!0}if(!p)throw new d("SESSION_LOCKED",`${e} is held by another live process`);let S=`${o}.break-${s}`;try{y(o,S);let c;try{c=JSON.parse(l(S,"utf8"))}catch{c=null}if(c===null||c.nonce===u)_(S,{force:!0});else try{y(S,o)}catch{_(S,{force:!0})}}catch(c){if(c.code!=="ENOENT")throw c}return b(n,e,t,i+1)}}function C(n,e,t,i,o){let s=()=>{try{if(JSON.parse(l(m(n,e),"utf8")).nonce!==i)throw new d("SESSION_LOCK_LOST",`${e} lock was taken over`)}catch(r){throw r instanceof d?r:new d("SESSION_LOCK_LOST",`${e} lock file unreadable/gone`)}},a=()=>v(g(n,e),JSON.stringify(t)+`
4
- `);return{get state(){return t},isApplied:r=>t.applied_events.includes(r),markApplied(r){s(),t={...t,applied_events:[...new Set([...t.applied_events,...r])].sort()},a()},save(r){s();let{agent_state:p,pending:u,assumed:S,read_basis:c,corpus_cursor:h,expires_at:I,force:k,conv_source:x,held_receipts:T,force_scope:D,user_session_id:J}=r;t={...t,...p!==void 0?{agent_state:p}:{},...u!==void 0?{pending:u}:{},...S!==void 0?{assumed:S}:{},...c!==void 0?{read_basis:c}:{},...h!==void 0?{corpus_cursor:h}:{},...I!==void 0?{expires_at:I}:{},...k!==void 0?{force:k}:{},...x!==void 0?{conv_source:x}:{},...T!==void 0?{held_receipts:T}:{},...D!==void 0?{force_scope:D}:{},...J!==void 0?{user_session_id:J}:{}},a()},complete(){s(),_(O(n,e),{recursive:!0,force:!0})},release(){try{s(),_(m(n,e),{force:!0})}catch(r){if(r instanceof d||r.code==="ENOENT")return;throw r}}}}function X(n,e,t){if(!A.test(e.sid))throw new d("SESSION_MISSING",`bad sid ${JSON.stringify(e.sid)}`);let i=E(t);if(f(g(n,e.sid)))throw new d("SESSION_LOCKED",`${e.sid} already exists \u2014 resume it`);K(O(n,e.sid),{recursive:!0,mode:448});let o=b(n,e.sid,i),s={schema:1,applied_events:[],...e};return v(g(n,e.sid),JSON.stringify(s)+`
5
- `),C(n,e.sid,s,o,t)}function z(n,e,t){if(!A.test(e)||!f(g(n,e)))throw new d("SESSION_MISSING",`no session ${e}`);let i=E(t),o=b(n,e,i),s=JSON.parse(l(g(n,e),"utf8"));if(new Date(s.expires_at).getTime()<=i.getTime())throw _(m(n,e),{force:!0}),new d("SESSION_EXPIRED",`${e} expired at ${s.expires_at}`);let a={...s,expires_at:new Date(i.getTime()+R).toISOString()};return v(g(n,e),JSON.stringify(a)+`
6
- `),C(n,e,a,o,t)}function Q(n,e){let t=g(n,e);return f(t)?JSON.parse(l(t,"utf8")):null}function Z(n){let e=N(n);if(!f(e))return[];let t=[];for(let i of L(e)){let o=g(n,i);if(f(o))try{let s=JSON.parse(l(o,"utf8"));t.push({sid:s.sid,mode:s.mode,created_at:s.created_at,expires_at:s.expires_at,pendingCount:s.pending.questions.length+s.pending.proposals.length,verb:s.verb,use_case:s.use_case})}catch{t.push({sid:i,mode:"?",created_at:"",expires_at:"",pendingCount:0,corrupt:!0})}}return t.sort((i,o)=>i.created_at<o.created_at?-1:1)}function B(n,e){let t=E(e),i=[],o=[],s=N(n);if(!f(s))return{removed:i,skipped:o};for(let a of L(s)){if(e?.sid&&a!==e.sid)continue;let r=!1,p=!1;try{let u=JSON.parse(l(g(n,a),"utf8"));r=new Date(u.expires_at).getTime()<=t.getTime()}catch{p=!0}if(e?.sid||e?.all||r||p&&e?.all){try{let u=JSON.parse(l(m(n,a),"utf8"));if(P(u.pid)&&u.pid!==process.pid){o.push({sid:a,reason:`in use by live pid ${u.pid}`});continue}}catch{}_(O(n,a),{recursive:!0,force:!0}),i.push(a)}}return{removed:i,skipped:o}}export{d as a,X as b,z as c,Q as d,Z as e,B as f};