@testmuai/kane-cli 0.4.10 → 0.6.0

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 (198) hide show
  1. package/dist/ChatSurface-I6PFL3OE.js +9 -0
  2. package/dist/{ChromeProfilePicker-EFEVOCWS.js → ChromeProfilePicker-YG7TKHM5.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-PPGJMKHQ.js → CliFeedbackPrompt-5RUIP4KA.js} +1 -1
  4. package/dist/CliUploadProgress-YQYPZNEV.js +2 -0
  5. package/dist/{ConfigView-Y7E4Q647.js → ConfigView-HZ7MFCAJ.js} +1 -1
  6. package/dist/EvidenceViewOffer-N4UED7VY.js +2 -0
  7. package/dist/FolderPicker-NAFYP7ES.js +2 -0
  8. package/dist/HelpView-BLWTCQ6T.js +2 -0
  9. package/dist/{InfoBox-BQ2QOIUP.js → InfoBox-7ZZGMYHY.js} +1 -1
  10. package/dist/{LinksBox-DX6BJAX5.js → LinksBox-63Q5YS5X.js} +1 -1
  11. package/dist/{ProfilesView-X35WWM4L.js → ProfilesView-AVYB43ES.js} +1 -1
  12. package/dist/{ProjectPicker-Y4A4UVHA.js → ProjectPicker-EINNALUG.js} +1 -1
  13. package/dist/{SaveSessionPrompt-IS6HZSF4.js → SaveSessionPrompt-C3LCI2KZ.js} +1 -1
  14. package/dist/ScrollbackTap-Q3IOKNMS.js +2 -0
  15. package/dist/SingleShotApp-PS42WWT7.js +2 -0
  16. package/dist/{SummaryBox-47MHU37V.js → SummaryBox-NRPQ2AMW.js} +1 -1
  17. package/dist/TestMdRunView-5FVCEQZI.js +2 -0
  18. package/dist/{WhoamiView-KVIQCGRC.js → WhoamiView-YLMIEJQN.js} +1 -1
  19. package/dist/archive-committer-3NI773TP.js +2 -0
  20. package/dist/bind-QYQ5IT4S.js +6 -0
  21. package/dist/bridge-QENVIWWC.js +2 -0
  22. package/dist/{changelog-S4ZLEQLC.js → changelog-4RSI7UIO.js} +1 -1
  23. package/dist/chat-committer-RTJCKQMM.js +2 -0
  24. package/dist/chat-controller-OTBYHB4Y.js +3 -0
  25. package/dist/chunk-22A2ECA2.js +2 -0
  26. package/dist/{chunk-OHT5RY5E.js → chunk-25YSMNUP.js} +1 -1
  27. package/dist/{chunk-LPUQ4HWQ.js → chunk-2WVKOZ6W.js} +1 -1
  28. package/dist/chunk-2YQ6TW77.js +82 -0
  29. package/dist/{chunk-FKAXPYV7.js → chunk-3SK5GXQM.js} +1 -1
  30. package/dist/chunk-427OQS2N.js +2 -0
  31. package/dist/chunk-5446YVGQ.js +4 -0
  32. package/dist/chunk-5ILXUQIX.js +2 -0
  33. package/dist/chunk-5Q46BEG7.js +2 -0
  34. package/dist/chunk-5U3GOEGG.js +7 -0
  35. package/dist/chunk-5Y2G4NC7.js +2 -0
  36. package/dist/chunk-6BQD2BXI.js +3 -0
  37. package/dist/chunk-6PS65QFF.js +2 -0
  38. package/dist/chunk-ABSEKYIB.js +13 -0
  39. package/dist/chunk-AD46OCZ4.js +4 -0
  40. package/dist/chunk-AE6SS34N.js +4 -0
  41. package/dist/chunk-B2OAEEKI.js +14 -0
  42. package/dist/chunk-B2PZAB7J.js +4 -0
  43. package/dist/chunk-BC7UVJJB.js +2 -0
  44. package/dist/chunk-BV3EARZO.js +17 -0
  45. package/dist/{chunk-QSXYNJOW.js → chunk-C5NNT7Y3.js} +1 -1
  46. package/dist/{chunk-GSKA5DKJ.js → chunk-CBIW5DTU.js} +1 -1
  47. package/dist/chunk-CE664P73.js +2 -0
  48. package/dist/{chunk-IGZPQQFP.js → chunk-D5SHVZGD.js} +1 -1
  49. package/dist/chunk-D5T4ARTB.js +2 -0
  50. package/dist/chunk-DFS4RMVP.js +2 -0
  51. package/dist/chunk-DM2GL24Z.js +3 -0
  52. package/dist/chunk-FAXRERS6.js +6 -0
  53. package/dist/chunk-FPGOV4AQ.js +17 -0
  54. package/dist/chunk-FXPPQL4D.js +6 -0
  55. package/dist/chunk-FYOCF7DY.js +2 -0
  56. package/dist/chunk-GIGD4M7V.js +5 -0
  57. package/dist/chunk-GIRXJOJI.js +2 -0
  58. package/dist/{chunk-AKLIPQVR.js → chunk-GNGGFK7C.js} +1 -1
  59. package/dist/{chunk-RQZCGHG7.js → chunk-H7ZQ4AWL.js} +1 -1
  60. package/dist/{chunk-HUAOH2JK.js → chunk-HYW5VDEC.js} +1 -1
  61. package/dist/chunk-I2S6KNZW.js +2 -0
  62. package/dist/chunk-IACKIGPX.js +2 -0
  63. package/dist/chunk-IF2R3AR4.js +6 -0
  64. package/dist/{chunk-KKIFXAJY.js → chunk-INP7FG6V.js} +1 -1
  65. package/dist/{chunk-G3PWEKD7.js → chunk-IPCC3P6T.js} +2 -2
  66. package/dist/chunk-JFAFKHDX.js +4 -0
  67. package/dist/chunk-KHDUQ33H.js +2 -0
  68. package/dist/chunk-KHU7C6EE.js +2 -0
  69. package/dist/chunk-LBBPMEO2.js +2 -0
  70. package/dist/chunk-LKXVYWKG.js +356 -0
  71. package/dist/chunk-LMJTY32X.js +6 -0
  72. package/dist/chunk-M5JQXOCE.js +12 -0
  73. package/dist/chunk-ME3GYVBV.js +2 -0
  74. package/dist/{chunk-QC73LMAN.js → chunk-MESFNOY3.js} +1 -1
  75. package/dist/chunk-MKD3KZPM.js +2 -0
  76. package/dist/{chunk-NUGGT2XH.js → chunk-MQ7DJ2XC.js} +1 -1
  77. package/dist/{chunk-IT66S24L.js → chunk-N2BUF6YU.js} +1 -1
  78. package/dist/chunk-NFOBDHZK.js +147 -0
  79. package/dist/chunk-NNZV5RCE.js +2 -0
  80. package/dist/{chunk-GF44B552.js → chunk-NOOHQBUD.js} +1 -1
  81. package/dist/chunk-NTJDMMLC.js +61 -0
  82. package/dist/chunk-NWZTYAJB.js +9 -0
  83. package/dist/{chunk-RB2YKN77.js → chunk-OXARXMMD.js} +1 -1
  84. package/dist/chunk-PGEMGGBS.js +26 -0
  85. package/dist/{chunk-JKLKZCJS.js → chunk-QI6WZ56Y.js} +1 -1
  86. package/dist/{chunk-6ATKQYAL.js → chunk-QK6KZMYG.js} +1 -1
  87. package/dist/chunk-QPZRHAYK.js +4 -0
  88. package/dist/chunk-RFHMDQXZ.js +3 -0
  89. package/dist/chunk-RGEAEAZB.js +20 -0
  90. package/dist/chunk-RKWJG3WW.js +19 -0
  91. package/dist/chunk-RTWWPEQ7.js +8 -0
  92. package/dist/chunk-TZVURR5H.js +5 -0
  93. package/dist/chunk-VJUIW2ES.js +4 -0
  94. package/dist/chunk-VK7RF53I.js +2 -0
  95. package/dist/{chunk-VLWWDXBN.js → chunk-VXS23M67.js} +1 -1
  96. package/dist/{chunk-KJLOYIWT.js → chunk-WFAMF4SG.js} +1 -1
  97. package/dist/chunk-WFSQZG26.js +11 -0
  98. package/dist/chunk-WG3BBXJF.js +7 -0
  99. package/dist/chunk-WUMNIGPR.js +2 -0
  100. package/dist/chunk-WUNN5OCH.js +4 -0
  101. package/dist/chunk-XQDDUVD3.js +4 -0
  102. package/dist/chunk-Y2S3PW7N.js +102 -0
  103. package/dist/chunk-YANCBRER.js +3 -0
  104. package/dist/{chunk-YAOWO2GE.js → chunk-YWWKKKXY.js} +1 -1
  105. package/dist/chunk-Z56AWGVY.js +2 -0
  106. package/dist/chunk-ZKYYZ5NO.js +6 -0
  107. package/dist/{chunk-EQC7WE2O.js → chunk-ZO7ROBPR.js} +1 -1
  108. package/dist/chunk-ZXDA4K6G.js +2 -0
  109. package/dist/chunk-ZZOSDBYN.js +23 -0
  110. package/dist/cover-cmd-Y5L4O4Q3.js +2 -0
  111. package/dist/credentials-WUEKK7FI.js +2 -0
  112. package/dist/descriptor-SL5A7RQE.js +2 -0
  113. package/dist/distill-cmd-EYCCCFL3.js +2 -0
  114. package/dist/evidence-4BSNTVND.js +2 -0
  115. package/dist/evolve-cmd-VUWLH3CO.js +2 -0
  116. package/dist/exit-manager-VCSIUYBR.js +2 -0
  117. package/dist/explain-JIXUWEFJ.js +2 -0
  118. package/dist/explain-cmd-55WRDIMW.js +9 -0
  119. package/dist/explain-cmd-RIDEMDMY.js +3 -0
  120. package/dist/extract-bind-T7SUAID6.js +5 -0
  121. package/dist/extract-cmd-LZW7CRT3.js +6 -0
  122. package/dist/gaps-cmd-P2DRK6FW.js +2 -0
  123. package/dist/gate-FACZRGOC.js +2 -0
  124. package/dist/{generate-headless-ODYT3HT7.js → generate-headless-C55T3GGR.js} +2 -2
  125. package/dist/headless-io-GXHKDPHB.js +2 -0
  126. package/dist/index.js +76 -39
  127. package/dist/ingest-4CGBXC2L.js +2 -0
  128. package/dist/ingest-cmd-FJ3SLTT4.js +3 -0
  129. package/dist/interactive-bind-P6AGLUMM.js +7 -0
  130. package/dist/interrupt-guard-UREUWNRL.js +2 -0
  131. package/dist/lifecycle-cmd-56OZT4LY.js +2 -0
  132. package/dist/list-cmd-JB2ABACD.js +3 -0
  133. package/dist/list-commands-M34USUNO.js +2 -0
  134. package/dist/logical-ids-QRRUXV5E.js +2 -0
  135. package/dist/login-flow-GMLHK6JT.js +2 -0
  136. package/dist/maintenance-cmd-E3HEEVQW.js +2 -0
  137. package/dist/open-MQLQKFAW.js +2 -0
  138. package/dist/persist-recorded-session-L2KAY37H.js +3 -0
  139. package/dist/pipeline-FJXQIFW7.js +2 -0
  140. package/dist/readmodel-MPTENJ2R.js +2 -0
  141. package/dist/reconcile-cmd-KTCH4KZQ.js +8 -0
  142. package/dist/{recording-banner-3XTXU2VL.js → recording-banner-2KIVZAXY.js} +1 -1
  143. package/dist/require-project-folder-NOGEHZTS.js +2 -0
  144. package/dist/revert-3TKLOYQA.js +2 -0
  145. package/dist/review-cmd-SL52N4TM.js +4 -0
  146. package/dist/run-P4CHG2VH.js +2 -0
  147. package/dist/run-test-md-ICLG4OPX.js +17 -0
  148. package/dist/{scrollback-6GINSTL2.js → scrollback-JLPJR25X.js} +1 -1
  149. package/dist/sessions-cmd-STHKGDX4.js +23 -0
  150. package/dist/signals-cmd-LXHZQLXZ.js +2 -0
  151. package/dist/{skill-installer-GYYMVNE4.js → skill-installer-KGPXQRCE.js} +1 -1
  152. package/dist/spawner-DDD3ICOX.js +2 -0
  153. package/dist/tcg-generate-KBXZIIHB.js +2 -0
  154. package/dist/testmd-actions-45BY3YFO.js +2 -0
  155. package/dist/{tms-client-NNYXLXZK.js → tms-client-VD3B3SMU.js} +1 -1
  156. package/dist/token-refresh-OCFALJ7U.js +2 -0
  157. package/dist/turn-preflight-I5SM4UIZ.js +2 -0
  158. package/dist/ui-JEJGTURD.js +4 -0
  159. package/dist/{validate-basic-4YMRWYLS.js → validate-basic-QCD4VN37.js} +1 -1
  160. package/dist/{version-check-GU2LS6NM.js → version-check-55YZMQUI.js} +1 -1
  161. package/dist/view-cmd-QE2FS3GB.js +436 -0
  162. package/package.json +8 -6
  163. package/dist/CliUploadProgress-3GGOTLPQ.js +0 -2
  164. package/dist/FolderPicker-LI5JKG2S.js +0 -2
  165. package/dist/HelpView-KHQYGSD2.js +0 -2
  166. package/dist/SingleShotApp-RO25ZX2E.js +0 -2
  167. package/dist/TestMdRunView-OXVWHOV3.js +0 -2
  168. package/dist/chunk-53O3GMZR.js +0 -8
  169. package/dist/chunk-7GOX44H7.js +0 -103
  170. package/dist/chunk-AH4AXJML.js +0 -2
  171. package/dist/chunk-AT45XB6X.js +0 -60
  172. package/dist/chunk-BH6EP2LD.js +0 -85
  173. package/dist/chunk-BQACGLXW.js +0 -5
  174. package/dist/chunk-C6S4IEBC.js +0 -2
  175. package/dist/chunk-DMG5QABA.js +0 -2
  176. package/dist/chunk-G2GQ67DP.js +0 -11
  177. package/dist/chunk-HPZREZKG.js +0 -2
  178. package/dist/chunk-IS62CNJW.js +0 -20
  179. package/dist/chunk-LOIRZFV3.js +0 -10
  180. package/dist/chunk-LRKWPAGK.js +0 -2
  181. package/dist/chunk-MDBXYXSC.js +0 -2
  182. package/dist/chunk-NAAPNSZD.js +0 -17
  183. package/dist/chunk-PUU7A26K.js +0 -11
  184. package/dist/chunk-SQOIKS77.js +0 -6
  185. package/dist/chunk-UAYCLUUZ.js +0 -27
  186. package/dist/chunk-UBN6J3ZA.js +0 -2
  187. package/dist/chunk-XCOU6AYD.js +0 -6
  188. package/dist/chunk-XCYCX4TU.js +0 -17
  189. package/dist/exit-manager-V2NW7A7U.js +0 -2
  190. package/dist/list-commands-PNYMVI6X.js +0 -2
  191. package/dist/login-flow-FIYH6K4A.js +0 -2
  192. package/dist/persist-recorded-session-OJPXI4HP.js +0 -3
  193. package/dist/pipeline-34CX3UBO.js +0 -2
  194. package/dist/require-project-folder-CFX6U6BZ.js +0 -2
  195. package/dist/run-test-md-YWKVMQDJ.js +0 -14
  196. package/dist/tcg-generate-KLY7QZY2.js +0 -2
  197. package/dist/testmd-actions-OUY5BOAV.js +0 -2
  198. package/dist/token-refresh-QCHKMPCM.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as l}from"./chunk-HUAOH2JK.js";import{a as f}from"./chunk-RB2YKN77.js";import{a as m}from"./chunk-KKIFXAJY.js";import{a as p}from"./chunk-RZ4F3BHX.js";import{a as c,c as s,h as a,w as u}from"./chunk-LRKWPAGK.js";var v="/public/skills/kane-cli";function C(){try{let n=new f().getDefaultEnv();if(n in u)return n}catch{}return"prod"}function k(){return`${m(C()).controllerBaseUrl}${v}`}import{readFileSync as S,writeFileSync as E,mkdirSync as g}from"fs";import{join as d}from"path";var h=d(s,"skill-check.json"),y=3600*1e3;function V(){try{let n=JSON.parse(S(h,"utf-8"));if(Date.now()-n.checkedAt<y)return n}catch{}return null}function A(n){try{g(s,{recursive:!0}),E(h,JSON.stringify({map:n,checkedAt:Date.now()}))}catch{}}function I(){for(let{dir:n}of a)try{let t=S(d(n,"VERSION"),"utf-8").trim();if(t)return t}catch{}return null}function M(n,t){let i=Object.keys(n.versions??{});if(i.length===0)return null;let o=i.slice().sort((r,e)=>l(r,e));for(let r of o){let e=n.versions[r]?.kaneCliMinVersion;if(!e||l(t,e)<=0)return r}return null}async function U(){try{let n=V()?.map;if(!n){let o=new AbortController,r=setTimeout(()=>o.abort(),5e3),e=await p(k(),{headers:{Accept:"application/json"},signal:o.signal});if(clearTimeout(r),!e.ok)return null;n=await e.json(),A(n)}let t=M(n,c);if(!t)return null;let i=I();return i===null?{current:null,latestCompatible:t}:l(i,t)>0?{current:i,latestCompatible:t}:null}catch{return null}}export{k as a,M as b,U as c};
2
+ import{b as l}from"./chunk-HYW5VDEC.js";import{a as m}from"./chunk-INP7FG6V.js";import{a as p}from"./chunk-RZ4F3BHX.js";import{a as f}from"./chunk-OXARXMMD.js";import{a as c,c as s,h as a,w as u}from"./chunk-MKD3KZPM.js";var v="/public/skills/kane-cli";function C(){try{let n=new f().getDefaultEnv();if(n in u)return n}catch{}return"prod"}function k(){return`${m(C()).controllerBaseUrl}${v}`}import{readFileSync as S,writeFileSync as E,mkdirSync as g}from"fs";import{join as d}from"path";var h=d(s,"skill-check.json"),y=3600*1e3;function V(){try{let n=JSON.parse(S(h,"utf-8"));if(Date.now()-n.checkedAt<y)return n}catch{}return null}function A(n){try{g(s,{recursive:!0}),E(h,JSON.stringify({map:n,checkedAt:Date.now()}))}catch{}}function I(){for(let{dir:n}of a)try{let t=S(d(n,"VERSION"),"utf-8").trim();if(t)return t}catch{}return null}function M(n,t){let i=Object.keys(n.versions??{});if(i.length===0)return null;let o=i.slice().sort((r,e)=>l(r,e));for(let r of o){let e=n.versions[r]?.kaneCliMinVersion;if(!e||l(t,e)<=0)return r}return null}async function U(){try{let n=V()?.map;if(!n){let o=new AbortController,r=setTimeout(()=>o.abort(),5e3),e=await p(k(),{headers:{Accept:"application/json"},signal:o.signal});if(clearTimeout(r),!e.ok)return null;n=await e.json(),A(n)}let t=M(n,c);if(!t)return null;let i=I();return i===null?{current:null,latestCompatible:t}:l(i,t)>0?{current:i,latestCompatible:t}:null}catch{return null}}export{k as a,M as b,U as c};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ var t={extract:["usecase"],design:["ac","scenario","test"]},a={};function r(e="extract"){return[...a[e]??t[e]]}export{r as a};
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ var u={prod:"https://kaneai-api.lambdatest.com/v16-controller/v1",stage:"https://auteur-stage-automind.lambdatestinternal.com/v16-controller/v1"};function T(e=process.env){return e.TESTMUAI_BASE_URL||u[e.TESTMUAI_ENV==="stage"?"stage":"prod"]}function E(e=process.env){return e.TESTMUAI_BASE_URL&&e.TESTMUAI_ENV!=="stage"?"note: TESTMUAI_BASE_URL is honored by context/design, but run/testmd ignore it unless TESTMUAI_ENV=stage":null}async function g(e,t=process.env,c=fetch){let o=T(t),a=`${o}/assurance/turn`,n={"Content-Type":"application/json"},i=e.TESTMUAI_BASIC_AUTH??t.TESTMUAI_BASIC_AUTH,l=e.TESTMUAI_API_KEY??t.TESTMUAI_API_KEY;i?n.Authorization=`Basic ${i}`:l&&(n.Authorization=`Bearer ${l}`);let s;try{s=(await c(a,{method:"POST",headers:n,body:"{}",signal:AbortSignal.timeout(8e3)})).status}catch(r){return{ok:!1,message:`error: cannot reach the controller at ${o} (${r instanceof Error?r.message:String(r)})
3
+ hint: for a local run, start the controller and export TESTMUAI_BASE_URL=http://localhost:8000/v1`}}return s===404?{ok:!1,message:`error: ${a} does not exist (404) \u2014 this controller does not serve the turn endpoint yet
4
+ hint: the endpoint is currently local-only. Run a local controller and export TESTMUAI_BASE_URL=http://localhost:8000/v1`}:s===401?{ok:!1,message:`error: the controller at ${o} rejected your credentials (401) \u2014 check your login/profile for TESTMUAI_ENV=${t.TESTMUAI_ENV??"prod"}`}:{ok:!0}}export{T as a,E as b,g as c};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as K}from"./chunk-QPZRHAYK.js";import{a as L,b,d as B}from"./chunk-GIRXJOJI.js";import{e as W,g as A}from"./chunk-B2PZAB7J.js";import{d as O,e as R,f as P,g as j,h as q}from"./chunk-IACKIGPX.js";var V=/^[a-z0-9][a-z0-9-]{1,63}$/;function z(p,d,e,t){if(!d)return{error:{code:"SUPERSEDE_TARGET_MISSING",detail:"supersede verdict needs a target (slug or cid)"}};let n=p.resolve(d);return n?n.superseded||t.has(n.cid)?{error:{code:"ALREADY_SUPERSEDED",detail:`${d} is already superseded (tip: ${n.tip})`}}:n.cid===e?{error:{code:"SELF_SUPERSEDE",detail:"a node cannot supersede itself"}}:{targetCid:n.cid}:{error:{code:"UNKNOWN_SUPERSEDE_TARGET",detail:`${d} names nothing in the graph`}}}function X(p,d,e,t,n=[]){if(!j(d)?.acyclic)return null;if(e===t)return{code:"EDGE_CYCLE",detail:`${d} ${e} \u2192 itself`};let i=_=>[...p.edgesFrom(_).filter(h=>h.type===d).map(h=>h.dst),...n.filter(h=>h.type===d&&h.src===_).map(h=>h.dst)],a=new Set,g=[t];for(;g.length>0;){let _=g.pop();if(_===e)return{code:"EDGE_CYCLE",detail:`${d} ${e} \u2192 ${t} closes a cycle`};a.has(_)||(a.add(_),g.push(...i(_)))}return null}function de(p,d,e,t){let m=j(d)?.cardinality;if(m!=="one-live-per-src"&&m!=="one-live-per-src-and-dst")return null;let i=p.edgesFrom(e).filter(a=>a.type===d&&!p.superseded.has(a.dst));if(i.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${d} from ${e} already has a live edge (${i[0].ecid}) \u2014 supersede it first`};if(m==="one-live-per-src-and-dst"&&t!==void 0){let a=p.edgesInto(t).filter(g=>g.type===d&&!p.superseded.has(g.src));if(a.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${d} onto ${t} 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 ce(p,d,e){let t=[],n=e.mediaOf(p.source.source_cid),m=new Set;for(let i of p.use_cases){if(m.has(i.temp_ref)&&t.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${i.temp_ref}`}),m.add(i.temp_ref),(!i.title||!i.title.trim())&&t.push({code:"EMPTY_TITLE",detail:`${i.temp_ref}: title is empty`}),Y.has(i.risk)||t.push({code:"BAD_RISK",detail:`${i.temp_ref}: risk ${JSON.stringify(i.risk)} not in high|med|low`}),!i.cite||!i.cite.anchor)t.push({code:"MISSING_CITE",detail:`${i.temp_ref}: every derived use-case must carry a cite`});else for(let a of K(n,i.cite,d))t.push({code:a.code,detail:`${i.temp_ref}: ${a.detail}`});i.matches_existing&&!e.hasNode(i.matches_existing.cid)&&t.push({code:"UNKNOWN_MATCH",detail:`${i.temp_ref}: matches_existing ${i.matches_existing.cid} is not in the graph`});for(let[a,g]of(i.criteria??[]).entries())if((!g.text||!g.text.trim())&&t.push({code:"EMPTY_CRITERION",detail:`${i.temp_ref}.criteria[${a}]: text is empty`}),!g.cite||!g.cite.anchor)t.push({code:"MISSING_CITE",detail:`${i.temp_ref}.criteria[${a}]: every criterion carries its own cite (D3)`});else for(let _ of K(n,g.cite,d))t.push({code:_.code,detail:`${i.temp_ref}.criteria[${a}]: ${_.detail}`})}return t}function ae(p){let{contextDir:d,graph:e,proposal:t,proposalId:n,verdicts:m,by:i,allowStaleBasis:a,extractorVersion:g,autoName:_}=p,h=W(d);if(!a&&t.read_basis!==h)return{record:null,errors:[{code:"STALE_BASIS",detail:`proposal read_basis ${String(t.read_basis)} != latest ${String(h)}`}]};if(!e.hasNode(t.source.source_cid))return{record:null,errors:[{code:"MISSING_SOURCE_NODE",detail:`source ${t.source.source_id} (${t.source.source_cid}) is not a committed node \u2014 ingest it first`}]};let l=[],f=e.mediaOf(t.source.source_cid),k=new Set,v=[],E=[],C=[],I=[],w=[],x=[],U=new Set,H=new Set,F=(r,s,T)=>{let c=z(e,s.supersedeTarget,T,U);if("error"in c){l.push({code:c.error.code,detail:`${r}: ${c.error.detail}`});return}U.add(c.targetCid),w.push({kind:"node",old:c.targetCid,new:T,reason:s.reason??`superseded via review by ${i.id}`,by:i})};for(let r of t.use_cases){let s=m.get(r.temp_ref)??{resolution:"skipped"};if(k.has(r.temp_ref)&&l.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${r.temp_ref}`}),k.add(r.temp_ref),(!r.title||!r.title.trim())&&l.push({code:"EMPTY_TITLE",detail:`${r.temp_ref}: title is empty`}),Y.has(r.risk)||l.push({code:"BAD_RISK",detail:`${r.temp_ref}: risk ${JSON.stringify(r.risk)} not in high|med|low`}),f.format==="image"){if(r.cite?.anchor!=="img#whole"){l.push({code:r.cite?.anchor?"CITE_ANCHOR_INVALID":"MISSING_CITE",detail:`${r.temp_ref}: image cites are anchor-only (img#whole)`});continue}}else if(!r.cite||!r.cite.anchor||!r.cite.quote){l.push({code:"MISSING_CITE",detail:`${r.temp_ref}: every derived use-case must cite anchor+quote`});continue}s.resolution==="edited"&&s.edit&&(s.edit.title!==void 0&&!s.edit.title.trim()&&l.push({code:"EMPTY_TITLE",detail:`${r.temp_ref}: edited title is empty`}),s.edit.risk!==void 0&&!Y.has(s.edit.risk)&&l.push({code:"BAD_RISK",detail:`${r.temp_ref}: edited risk ${JSON.stringify(s.edit.risk)} invalid`}));let T=B({title:s.edit?.title??r.title,description:r.description,summary:s.edit?.summary??r.summary,actors:r.actors,value:r.value,risk:s.edit?.risk??r.risk,...r.criteria&&r.criteria.length>0?{criteria:r.criteria.map(o=>o.text)}:{}}),c=L("usecase",T),$={source_id:t.source.source_id,source_cid:t.source.source_cid,anchor:r.cite.anchor,...r.cite.quote?{quote:r.cite.quote}:{}};if(r.matches_existing&&!e.hasNode(r.matches_existing.cid)){l.push({code:"UNKNOWN_MATCH",detail:`${r.temp_ref}: matches_existing ${r.matches_existing.cid} is not in the graph`});continue}let N=r.matches_existing?.cid??(e.hasNode(c)?c:null);if(N&&e.superseded.has(N)){let o=e.tipOf(N);N=e.superseded.has(o)?null:o}if(N){if(r.changed&&(s.resolution==="approved"||s.resolution==="edited")){let o=r.updated;if(!o||Object.keys(o).length===0){l.push({code:"CHANGED_NEEDS_PAYLOAD",detail:`${r.temp_ref}: changed:true needs an updated{...} payload naming the moved fields`});continue}let u=e.getNode(N)?.content??{},S=B({title:s.edit?.title??o.title??String(u.title??r.title),...o.description??u.description?{description:o.description??u.description}:{},...s.edit?.summary??o.summary??u.summary?{summary:s.edit?.summary??o.summary??u.summary}:{},...o.actors??u.actors?{actors:o.actors??u.actors}:{},...o.value??u.value?{value:o.value??u.value}:{},risk:s.edit?.risk??o.risk??String(u.risk??r.risk),...o.criteria??u.criteria?{criteria:o.criteria??u.criteria}:{}}),y=L("usecase",S);if(y!==N){for(let M of P("usecase",S))l.push({code:M.code,detail:`${r.temp_ref}: ${M.detail}`});v.push({cid:y,label:O.USECASE,content:S}),E.push({ecid:b("DERIVES",$.source_cid,y,$),type:R.DERIVES,src:$.source_cid,dst:y,props:$}),F(r.temp_ref,{resolution:"supersede",supersedeTarget:N,reason:s.reason??`matches-but-changed: ${t.source.source_id} moved (${Object.keys(o).join(", ")})`},y),I.push({id:y,kind:"review-item",resolution:s.resolution,edit:s.resolution==="edited"?{...s.edit}:null,reason:null,by:i});continue}}s.resolution!=="rejected"&&(E.push({ecid:b("DERIVES",$.source_cid,N,$),type:R.DERIVES,src:$.source_cid,dst:N,props:$}),(s.resolution==="approved"||s.resolution==="edited"||s.resolution==="supersede")&&I.push({id:N,kind:"review-item",resolution:"approved",edit:null,reason:null,by:i}),s.resolution==="supersede"&&F(r.temp_ref,s,N));continue}for(let o of P("usecase",T))l.push({code:o.code,detail:`${r.temp_ref}: ${o.detail}`});for(let o of q(R.DERIVES,"source","usecase",$))l.push({code:o.code,detail:`${r.temp_ref}: ${o.detail}`});v.push({cid:c,label:O.USECASE,content:T}),E.push({ecid:b("DERIVES",$.source_cid,c,$),type:R.DERIVES,src:$.source_cid,dst:c,props:$});for(let o of r.criteria??[]){let u={source_id:t.source.source_id,source_cid:t.source.source_cid,anchor:o.cite.anchor,...o.cite.quote?{quote:o.cite.quote}:{}};u.anchor!==$.anchor&&E.push({ecid:b("DERIVES",u.source_cid,c,u),type:R.DERIVES,src:u.source_cid,dst:c,props:u})}for(let o of r.depends_on_hint??[]){let u=D=>D.toLowerCase().trim().replace(/\s+/g," "),S=null,y=e.resolve(o);if(y&&!y.superseded&&e.nodeLabel.get(y.cid)===O.USECASE&&(S=y.cid),!S){for(let{cid:D,content:G}of e.byLabel(O.USECASE))if(!e.superseded.has(D)&&u(String(G.title??""))===u(o)){S=D;break}}if(!S){let D=v.find(G=>G.label===O.USECASE&&u(String(G.content.title??""))===u(o));D&&(S=D.cid)}!S||S===c||X(e,R.DEPENDS_ON,c,S,C)||C.some(D=>D.src===c&&D.dst===S)||(E.push({ecid:b(R.DEPENDS_ON,c,S,{reason:"extract hint"}),type:R.DEPENDS_ON,src:c,dst:S,props:{reason:"extract hint"}}),C.push({src:c,dst:S,type:R.DEPENDS_ON}))}if((s.resolution==="approved"||s.resolution==="edited"||s.resolution==="supersede")&&e.superseded.get(c)===null&&!U.has(c)&&w.push({kind:"node",old:c,new:c,reason:`re-minted after tombstone via review by ${i.id}`,by:i}),_){let o=J("usecase",s.edit?.title??r.title,u=>H.has(u)||e.names.has(u)&&!e.superseded.has(e.names.get(u)));o!==null&&!e.nameOf.has(c)&&(H.add(o),x.push({cid:c,slug:o,by:i}))}s.resolution==="approved"?I.push({id:c,kind:"review-item",resolution:"approved",edit:null,reason:null,by:i}):s.resolution==="edited"?I.push({id:c,kind:"review-item",resolution:"edited",edit:{...s.edit},reason:null,by:i}):s.resolution==="rejected"?I.push({id:c,kind:"review-item",resolution:"rejected",edit:null,reason:s.reason??null,by:i}):s.resolution==="supersede"&&(I.push({id:c,kind:"review-item",resolution:"approved",edit:null,reason:s.reason??null,by:i}),F(r.temp_ref,s,c))}return l.length?{record:null,errors:l}:{record:A(d,{ts:new Date().toISOString(),proposal_id:n,...n!=null?{extraction_of:t.source.source_cid}:{},...n!=null&&g?{extractor_version:g}:{},nodes:v,edges:E,review:I,supersessions:w,...x.length>0?{names:x}:{},...p.judgements&&p.judgements.length>0?{judgements:p.judgements}:{},source_head_moves:{}},{expectPrev:h}).record,errors:null}}function le(p){let{contextDir:d,graph:e,verdicts:t,by:n}=p,m=[],i=[],a=[],g=[],_=new Set;for(let[l,f]of t){if(f.resolution==="skipped")continue;let k=e.resolve(l);if(!k){m.push({code:"UNKNOWN_NODE",detail:`${l} names nothing in the graph`});continue}if(k.superseded){m.push({code:"SUPERSEDED_TARGET",detail:`${l} is superseded \u2014 review the tip (${k.tip})`});continue}let v=k.cid;if(f.resolution==="approved")a.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:null,by:n});else if(f.resolution==="rejected")a.push({id:v,kind:"review-item",resolution:"rejected",edit:null,reason:f.reason??null,by:n});else if(f.resolution==="edited"){let E=e.getNode(v);if(!E){m.push({code:"UNKNOWN_NODE",detail:`${l}: node file unreadable`});continue}let C={...E.content,...f.edit?.title!==void 0?{title:f.edit.title}:{},...f.edit?.summary!==void 0?{summary:f.edit.summary}:{},...f.edit?.risk!==void 0?{risk:f.edit.risk}:{}},I=P(E.label,C);if(I.length>0){for(let x of I)m.push({code:x.code,detail:`${l}: ${x.detail}`});continue}let w=L(E.label,C);if(w===v){a.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:null,by:n});continue}i.push({cid:w,label:E.label,content:C}),_.add(v),g.push({kind:"node",old:v,new:w,reason:f.reason??"edited in review",by:n}),a.push({id:w,kind:"review-item",resolution:"edited",edit:{...f.edit},reason:null,by:n})}else if(f.resolution==="supersede"){let E=z(e,f.supersedeTarget,v,_);if("error"in E){m.push({code:E.error.code,detail:`${l}: ${E.error.detail}`});continue}_.add(E.targetCid),g.push({kind:"node",old:E.targetCid,new:v,reason:f.reason??`superseded via review by ${n.id}`,by:n}),a.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:f.reason??null,by:n})}}return m.length?{record:null,errors:m}:a.length===0&&g.length===0?{record:null,errors:[{code:"NO_VERDICTS",detail:"every item was skipped \u2014 nothing to commit"}]}:{record:A(d,{ts:new Date().toISOString(),proposal_id:null,nodes:i,edges:[],review:a,supersessions:g,source_head_moves:{}},{expectPrev:e.latestHash}).record,errors:null}}function ue(p){let{contextDir:d,graph:e,assignments:t,by:n}=p,m=[],i=[],a=new Set;for(let{ref:_,slug:h}of t){if(!V.test(h)){m.push({code:"BAD_SLUG",detail:`${JSON.stringify(h)} \u2014 slugs are kebab-case ${String(V)}`});continue}let l=e.resolve(_);if(!l){m.push({code:"UNKNOWN_REF",detail:`${_} names nothing in the graph`});continue}if(l.superseded){m.push({code:"SUPERSEDED_TARGET",detail:`${_} is superseded \u2014 name the tip instead (${l.tip})`});continue}let f=e.names.get(h);if(f!==void 0&&!e.superseded.has(f)&&f!==l.cid||a.has(h)){m.push({code:"SLUG_TAKEN",detail:`${h} already names ${f??"another node in this record"}`});continue}a.add(h),i.push({cid:l.cid,slug:h,by:n})}return m.length?{record:null,errors:m}:i.length===0?{record:null,errors:[{code:"NO_ASSIGNMENTS",detail:"nothing to name"}]}:{record:A(d,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],names:i,source_head_moves:{}},{expectPrev:e.latestHash}).record,errors:null}}function pe(p){let{contextDir:d,graph:e,sourceId:t,reason:n,by:m}=p,i=e.heads.get(t);return i===void 0?{record:null,errors:[{code:"UNKNOWN_SOURCE",detail:`no source ${t} in the graph`}]}:i===null?{record:null,errors:[{code:"ALREADY_RETIRED",detail:`source ${t} is already retired`}]}:{record:A(d,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[{kind:"node",old:i,new:null,reason:n??`retired source ${t}`,by:m}],source_head_moves:{[t]:null},names:[]},{expectPrev:e.latestHash}).record,errors:null}}function Q(p,d){let e=p.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(e.length>60){let n=e.lastIndexOf("-",60);e=(n>0?e.slice(0,n):e.slice(0,60)).replace(/-+$/g,"")}if(!V.test(e))return null;let t=e;for(let n=2;d(t);n++)t=`${e}-${n}`;return V.test(t)?t:null}var Z={source:"src",usecase:"uc",scenario:"sc",ac:"ac",test:"t",gap:"gap",stylenote:"sty"};function J(p,d,e){let t=Z[p];return Q(t?`${t} ${d}`:d,e)}export{Z as a,J as b,X as c,de as d,ce as e,ae as f,le as g,ue as h,pe as i};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a}from"./chunk-5Y2G4NC7.js";import{x as o}from"./chunk-MKD3KZPM.js";import{a as n}from"./chunk-HCBYKLMW.js";import{b as t}from"./chunk-C44QQJR4.js";import{a as s}from"./chunk-6YGTRKDT.js";import{e as r}from"./chunk-UR6MHSHU.js";var l=r(s(),1);var m=r(n(),1),i=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function b({active:e=!0}){let[p,c]=(0,l.useState)(0);return a(()=>{c(f=>(f+1)%i.length)},e?80:null),(0,m.jsx)(t,{color:o.orange,children:e?i[p]:"\u25CF"})}export{b as a};
@@ -0,0 +1,7 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as x}from"./chunk-RTWWPEQ7.js";import{a as w}from"./chunk-INP7FG6V.js";import{spawn as M,execSync as V}from"child_process";import{appendFileSync as T,existsSync as g,mkdirSync as k}from"fs";import{homedir as P}from"os";import{join as U,resolve as t,dirname as h}from"path";import{fileURLToPath as B}from"url";import{createInterface as L}from"readline";async function*A(n){let e=L({input:n,crlfDelay:1/0});for await(let d of e){let r=d.trim();if(r)try{let l=JSON.parse(r);l&&typeof l.type=="string"&&(yield l)}catch{}}}function N(n){return n==="action"?{set:{V16_AGENT_ENABLE_ALL_BLOCKERS:"true",V16_BIFURCATION_PHASES:"1"},unset:["V16_NETWORK_WS","V16_NETWORK_SSE"]}:{set:{V16_BIFURCATION_PHASES:"1"},unset:["V16_AGENT_ENABLE_ALL_BLOCKERS","V16_NETWORK_WS","V16_NETWORK_SSE"]}}function O(n){return n?{set:{},unset:["V16_AGENT_SKIP_CP_FINAL"]}:{set:{V16_AGENT_SKIP_CP_FINAL:"true"},unset:[]}}function b(n){return n==="dom"?{set:{V16_AGENT_ENABLE_TEXTUAL_VISUAL:"true"},unset:[]}:{set:{},unset:["V16_AGENT_ENABLE_TEXTUAL_VISUAL"]}}var o=h(B(import.meta.url));function G(){for(let n of["python3","python"])try{return V(`${n} --version`,{stdio:"ignore"}),n}catch{}return null}function K(){let e=process.platform==="win32"?"v16-runner.exe":"v16-runner",d={"darwin-arm64":["@testmuai/kane-cli-darwin-arm64","@lambdatestincprivate/kane-cli-darwin-arm64"],"darwin-x64":["@testmuai/kane-cli-darwin-x64","@lambdatestincprivate/kane-cli-darwin-x64"],"linux-x64":["@testmuai/kane-cli-linux-x64","@lambdatestincprivate/kane-cli-linux-x64"],"linux-arm64":["@testmuai/kane-cli-linux-arm64","@lambdatestincprivate/kane-cli-linux-arm64"],"win32-x64":["@testmuai/kane-cli-win-x64","@lambdatestincprivate/kane-cli-win-x64"]},r=`${process.platform}-${process.arch}`,l=d[r];if(l)for(let i of l){let m=[t(o,"..","node_modules",i,"bin",e),t(o,"..","..","node_modules",i,"bin",e),t(o,"..","..","..","node_modules",i,"bin",e),t(o,"..","..","..","..","node_modules",i,"bin",e)];for(let c of m)if(g(c))return{cmd:c,args:[]}}let v=[t(o,"bin",e),t(o,"..","bin",e),t(o,"..","..","..","..","v16-runner","dist",e),t(o,"..","..","..","v16-runner","dist",e),t(o,"..","..","v16-runner","dist",e),t(process.cwd(),"v16-runner","dist",e),t(process.cwd(),"..","v16-runner","dist",e)];for(let i of v)if(g(i))return{cmd:i,args:[]};let _=[t(o,"..","..","v16-runner"),t(o,"..","..","..","..","v16-runner"),t(o,"..","..","..","v16-runner"),t(process.cwd(),"v16-runner"),t(process.cwd(),"..","v16-runner")];for(let i of _)if(g(t(i,"main.py"))){for(let c of[t(i,".venv","bin","python"),t(i,"..",".venv","bin","python"),t(i,"..","browser-agent",".venv","bin","python")])if(g(c))return{cmd:c,args:["main.py"],cwd:i};let m=G();if(m)return{cmd:m,args:["main.py"],cwd:i}}return null}function Z(n,e){let d=K();if(!d)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");process.env.KANE_SPAWN_DEBUG&&process.stderr.write(`[spawn-debug] ${JSON.stringify(d)}
3
+ `);let r={...process.env};e?.environment&&(r.TESTMUAI_ENV=e.environment),r.TESTMUAI_SOURCE="kane-cli",process.platform==="win32"&&(r.PYTHONIOENCODING="utf-8");let l=w(e?.environment);r.V16_SERVER_API_HOST=l.v16ServerHost,r.ATMS_URL=l.tmsBaseUrl.replace(/\/api\/?$/,""),n.username&&n.access_key&&(r.LT_USERNAME=n.username,r.LT_ACCESS_KEY=n.access_key),n.session_id&&(r.TESTMUAI_SESSION_ID=n.session_id);let v=N(e?.mode??"testing");Object.assign(r,v.set);for(let s of v.unset)delete r[s];let _=new x().load(),i=b(e?.assertionMode??(_.assertion_mode==="visual"?"visual":"dom"));Object.assign(r,i.set);for(let s of i.unset)delete r[s];let m=e?.finalValidation??_.final_validation,c=O(m);Object.assign(r,c.set);for(let s of c.unset)delete r[s];let a=M(d.cmd,d.args,{stdio:["pipe","pipe","pipe"],env:r,cwd:d.cwd});a.stdin.on("error",()=>{}),a.stdin.write(JSON.stringify(n)+`
4
+ `);let p=n.session_id?U(P(),".testmuai","kaneai","sessions",n.session_id,"runner-stderr.log"):null;if(p)try{k(h(p),{recursive:!0}),T(p,`--- runner spawn ${new Date().toISOString()} run_index=${n.run_index} ---
5
+ `)}catch{}let E=1e5,f="";a.stderr.on("data",s=>{if(f+=s.toString(),f.length>E&&(f=f.slice(-E)),p)try{T(p,s)}catch{}}),a.on("error",s=>{e?.log?.("error","RUNNER_SPAWN_ERROR","Runner spawn error",{error:s.message})});let S=null,y=null,C=new Promise(s=>{a.on("close",(u,R)=>{S=u,y=R?String(R):null,e?.log?.("info","RUNNER_EXIT","Runner exited",{code:u,signal:y??"none"}),s({code:u,signal:y})})}),I=A(a.stdout);return{child:a,events:I,sendUserResponse(s){let u=JSON.stringify({type:"user_response",answer:s});try{a.stdin.write(u+`
6
+ `)}catch{}},sendCancel(s){let u=JSON.stringify({type:"cancel",reason:s});try{a.stdin.write(u+`
7
+ `)}catch{}},cancel(){a.kill("SIGTERM")},get stderr(){return f},get exitCode(){return S},get exitSignal(){return y},exited:C}}export{K as a,Z as b};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as s}from"./chunk-6YGTRKDT.js";import{e as o}from"./chunk-UR6MHSHU.js";var r=o(s(),1);function c(n,e){let t=(0,r.useRef)(n);t.current=n,(0,r.useEffect)(()=>{if(e===null)return;let u=setInterval(()=>t.current(),e);return()=>clearInterval(u)},[e])}export{c as a};
@@ -0,0 +1,3 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ function l(r){let{isAgent:c,log:m}=r,a=r.stdout??process.stderr,s=r.stdin??process.stdin,p=t=>{c&&process.stdout.write(JSON.stringify(t)+`
3
+ `)};return{async runSteps(t){let{default:e}=await import("./react-QWOAB3TB.js"),{render:o}=await import("./build-JIKYOZUH.js"),{TestMdRunView:i}=await import("./TestMdRunView-5FVCEQZI.js"),{ScrollbackProvider:n}=await import("./scrollback-JLPJR25X.js"),{waitUntilExit:d}=o(e.createElement(n,null,e.createElement(i,t)),{stdout:a,stdin:s,exitOnCtrlC:!1});await d()},async runUpload(t,e){let{renderUploadProgress:o}=await import("./CliUploadProgress-YQYPZNEV.js");return await o(t,e)},async onSummary(t){try{let{default:e}=await import("./react-QWOAB3TB.js"),{render:o}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:i}=await import("./SummaryBox-NRPQ2AMW.js"),{waitUntilExit:n}=o(e.createElement(i,{data:t}),{stdout:a,stdin:s});await n()}catch(e){m("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(e)})}},async onLinks(t){try{let{default:e}=await import("./react-QWOAB3TB.js"),{render:o}=await import("./build-JIKYOZUH.js"),{LinksBox:i}=await import("./LinksBox-63Q5YS5X.js"),{waitUntilExit:n}=o(e.createElement(i,t),{stdout:a,stdin:s});await n()}catch(e){m("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(e)})}},onLockState(t){p({type:"test_md_lock_state",...t})},onRetryAttempt(t){p({type:"test_md_retry_attempt",...t})},onAgentEvent(t){p(t)}}}export{l as a};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ var n={graph_search_similar:"search graph",graph_get_node:"read node",graph_get_edges:"read edges",graph_match_by_type:"match by type",graph_find_by_provenance:"trace provenance",graph_stale_nodes:"check stale",ask_user:"ask",finalize_proposal:"propose use-cases",chat_turn:"apply changes",read_image:"read image",source_read:"read source",source_grep:"search source",finalize_design:"propose design",expand_bva:"expand boundaries",covering_array:"combine classes",dedupe_candidates:"dedupe",budget_cut:"trim to budget"};function s(e){let r=n[e.name],t=e.status==="error"||e.status==="aborted"?" \u2717":"",a=e.detail?` \u2014 ${e.detail}`:"";return r?`\u2692 ${r}${a}${t}`:`\u2692 working\u2026${a}${t}`}function o(e){return s(e).replace(/^\S+ /,"")}export{s as a,o as b};
@@ -0,0 +1,13 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b,c as ge,d as ct,f as ve,g as he}from"./chunk-FYOCF7DY.js";import{a as at,e as N,f as J,g as dt,h as te,i as U,j as ut}from"./chunk-RGEAEAZB.js";import{a as oe}from"./chunk-BC7UVJJB.js";import{a as K,b as W,d as st}from"./chunk-NFOBDHZK.js";import{d as ft}from"./chunk-KHDUQ33H.js";import{a as T,b as S}from"./chunk-L5LI2JF4.js";import{a as O}from"./chunk-D5T4ARTB.js";import{b as ie}from"./chunk-AE6SS34N.js";import{a as pt}from"./chunk-GIRXJOJI.js";import{e as re,g as ne}from"./chunk-B2PZAB7J.js";import{d as R,e as H,f as lt}from"./chunk-IACKIGPX.js";import{a as ot}from"./chunk-INP7FG6V.js";import{a as it}from"./chunk-MKD3KZPM.js";function M(e){if(e===null)return"broken";let t=Math.floor(e/100);return t===1?"passed":t===7?"failed":t===2?"skipped":"broken"}var j={failed:3,broken:2,passed:1,skipped:0};function we(e){let t="skipped";for(let r of e)j[r]>j[t]&&(t=r);return t}import{createHash as Wt}from"crypto";import{basename as Jt}from"path";function ye(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return t.length>0?t:"session"}function _e(e){return Wt("sha256").update(e).digest("hex").slice(0,8)}function xe(e){let t=Jt(e).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${ye(t)}-${_e(e)}`}function Se(e,t){return`${ye(e)}-${_e(t)}`}function be(e){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&n.length>0&&(t[r]=n);return t}var Xt={darwin:"macOS",linux:"Linux",win32:"Windows"};function ke(e){return Xt[e]??e}function Ee(e,t){let r={},n=(i,o)=>{o!==void 0&&o!==""&&(r[i]=o)};return n("model",t.model),n("os",e.os),n("browser",e.browser),n("browser_version",e.browser_version),n("resolution",e.resolution),n("platform",t.platform),n("platform_type",t.platform_type),n("run_kind",t.run_kind),n("os_version",e.os_version),e.device!==void 0&&e.device!==""?r.device=e.device:t.platform_type&&t.platform_type!=="web"&&(r.device=null),r}function Zt(e,t){return{pack_test_dir:e,ordinal_offset:t}}import{promises as P}from"fs";import{join as D}from"path";function Ie(e){let t={evidence:"0.1",run_id:e.execution_id,status:"running",title:e.title,started:e.started,environment:{producer:{name:"kane-cli",version:e.producerVersion},...e.surfaces?{surfaces:e.surfaces}:{},run_kind:e.run_kind,origin:e.origin,pid:e.pid},...e.credits!==void 0?{metrics:{credits:{value:e.credits,type:"count"}}}:{}};return S(t,{lineWidth:-1})}async function Re(e,t,r,n=process.cwd(),i){let o=i??b(e.execution_id,n),a=D(o,"tests",t);return await P.mkdir(D(o,"coverage"),{recursive:!0}),await P.writeFile(D(o,"coverage",".keep"),""),await P.mkdir(a,{recursive:!0}),await P.writeFile(D(o,"run.yaml"),Ie(e)),r&&await P.writeFile(D(a,r.path),r.content),o}async function Qt(e,t=process.cwd()){let r=b(e.execution_id,t);await P.mkdir(D(r,"coverage"),{recursive:!0}),await P.writeFile(D(r,"coverage",".keep"),"");let n=T(Ie(e));return n.environment&&delete n.environment.run_kind,await P.writeFile(D(r,"run.yaml"),S(n,{lineWidth:-1})),r}async function qt(e,t=process.cwd()){return W(b(e,t),new Date().toISOString())}async function Pe(e,t=process.cwd()){await P.rm(b(e,t),{recursive:!0,force:!0})}import{promises as Ce}from"fs";import{join as Ae}from"path";function Oe(e){let t={evidence:"0.1",test:e.testId,status:e.status,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{},...e.definitionPath?{definition:{path:e.definitionPath}}:{},...e.definitionId?{definition_id:e.definitionId}:{},...e.assuranceId?{assurance_id:e.assuranceId}:{},...Object.keys(e.externalId).length?{external_id:e.externalId}:{},...e.tags&&e.tags.length?{tags:e.tags}:{},...Object.keys(e.environment).length?{environment:e.environment}:{},steps:e.steps};return S(t,{lineWidth:-1})}function De(e){return S({logs:e},{lineWidth:-1})}async function $e(e,t,r){await Ce.writeFile(Ae(e,"tests",t,"result.yaml"),r)}async function Fe(e,t,r){let n=Ae(e,"tests",t,"logs");await Ce.mkdir(n,{recursive:!0}),await Ce.writeFile(Ae(n,"meta.yaml"),r)}import{promises as se}from"fs";import{join as mt}from"path";function gt(e){return mt(e,".internal","meta.json")}async function vt(e){let t;try{t=await se.readFile(gt(e),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function Le(e,t){let r;try{r=await vt(e)??{}}catch(a){console.warn(`evidence: meta.json at ${e} unreadable \u2014 skipping execution-pointer append to preserve identity`,a);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(t),r.executions=n,await se.mkdir(mt(e,".internal"),{recursive:!0});let i=gt(e),o=`${i}.tmp-${process.pid}-${Date.now()}`;await se.writeFile(o,JSON.stringify(r,null,2)+`
3
+ `),await se.rename(o,i)}async function er(e){try{let t=await vt(e);return t&&Array.isArray(t.executions)?t.executions:[]}catch{return[]}}async function tr(e,t,r=process.cwd()){let n=await ve(e,r);if(!n){let o=`evidence: no pack found for "${e}"`;return t.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:e})):console.error(o),2}let i=await K(n,t.profile??"L1");return t.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${t.profile??"L1"}, status ${i.status})`),i.valid?0:1}function Te(e){let t=[];for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)t.push(M(i))}return we(t)}function rr(e){let t=null;for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(t==null||j[M(i)]>j[M(t)]||j[M(i)]===j[M(t)]&&i>t)&&(t=i)}return t}import{promises as nr}from"fs";import{extname as ht,basename as ir}from"path";var or={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function Ne(e){let t;try{t=await nr.readdir(e)}catch{return[]}return t.filter(r=>r!=="meta.yaml").sort().map(r=>({name:ir(r,ht(r)),file:r,format:or[ht(r)]??"txt"}))}import{mkdirSync as sr,appendFileSync as cr}from"fs";import{join as wt}from"path";function je(e,t){return wt(e,"tests",t,"logs")}function Me(e,t,r,n={},i){try{i?.(t,r,r,n)}catch{}if(e)try{sr(e,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:t,event:r,...n})+`
4
+ `;cr(wt(e,"diagnostics.ndjson"),o)}catch{}}import{promises as $}from"fs";import{join as G}from"path";async function ar(e){try{let t=G(e,"tests"),r=await $.readdir(t).catch(()=>[]);for(let n of r){let i=G(t,n,"steps"),o=await $.readdir(i).catch(()=>[]);for(let a of o){let s=await $.readFile(G(i,a,"failure.yaml"),"utf8").catch(()=>null);if(s!=null)try{let u=T(s);if(u&&typeof u=="object"&&u.triage)return!0}catch{}}}}catch{}return!1}async function yt(e,t,r){let n=G(e,"tests",t,"logs");if(r)try{await $.mkdir(n,{recursive:!0}),await $.copyFile(r,G(n,"tui.log"))}catch{}let i=await Ne(n);i.length&&await Fe(e,t,De(i))}async function Ve(e){let t=e.cwd??process.cwd(),r=e.packDir??b(e.executionId,t);if(!e.saved&&!e.packDir)return await Pe(e.executionId,t),{sealed:!1};await yt(r,e.testId,e.tuiLogPath);let n=G(r,"run.yaml"),i=T(await $.readFile(n,"utf8"));i.environment={...i.environment??{},saved:e.saved,run_kind:e.runKind},await $.writeFile(n,S(i,{lineWidth:-1}));let o=await $.open(n,"r+");try{await o.sync()}finally{await o.close()}let a=await ar(r);await W(r,new Date().toISOString());let s;try{let c=await K(r,"L1");s=c.valid;let p=(c.diagnostics??[]).filter(l=>String(l?.code??"").includes("failure.status_disagrees"));if(p.length>0)if(e.expectStatusDisagrees||a){let l=e.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 ${l}`)}else console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,p);if(!c.valid){console.warn(`evidence: sealed pack ${e.executionId} failed L1 validation`,c.diagnostics);let l=String(c.diagnostics?.[0]?.code??"");Me(je(r,e.testId),"warn","EVIDENCE_INVALID",{execution_id:e.executionId,first_code:l,surface:e.surface??"testmd"},e.log)}}catch(c){console.warn(`evidence: validation error for ${e.executionId}`,c)}let u;if(e.saved&&e.packDir)try{u=await ct(r,e.executionId,t)}catch(c){console.warn(`evidence: store install failed for ${e.executionId}`,c)}if(e.outputStemDir)try{await Le(e.outputStemDir,{execution_id:e.executionId,run_kind:e.runKind,status:e.verdict,valid:s,at:new Date().toISOString()})}catch(c){console.warn(`evidence: execution-pointer append failed for ${e.executionId} (pack is sealed)`,c)}return{sealed:!0,valid:s,storePath:u}}import{release as _t}from"os";import{execFileSync as dr}from"child_process";var xt=!1,ce;function ur(){if(!xt)if(xt=!0,process.platform==="darwin")try{ce=dr("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{ce=_t()||void 0}else ce=_t()||void 0;return ce}function Be(e){let t={os:ke(process.platform)},r=ur();if(r&&(t.os_version=r),e.cdpBrowser){let n=/^([A-Za-z]+)\/(\d+)/.exec(e.cdpBrowser);n&&(t.browser=n[1].replace(/^Headless/,""),t.browser_version=n[2])}return e.resolution&&(t.resolution=e.resolution),t}async function St(e){if(e)try{let t=await fetch(`${e}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return;let r=await t.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function lr(e){let t;return()=>(t||(t=St(e)),t)}import{promises as Ue,existsSync as He,readFileSync as gr}from"fs";import{basename as vr,join as F}from"path";import{readFileSync as pr}from"fs";import{dirname as fr,resolve as mr}from"path";function bt(e,t){let r=mr(e),n=pr(r,"utf8");return N(t?J(n,te(fr(r),t)):n)}var X=class e{constructor(t){this.opts=t}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_packDirOverride;_attached=!1;get attached(){return this._attached}static async attach(t){let r=vr(t.packDir).replace(/\.evidence$/,""),n=new e({origin:"testrun",runKind:"author",pid:process.pid,title:t.testId,started:new Date().toISOString(),producerVersion:it,cwd:t.cwd});n.executionId=r,n.testId=t.testId,n._packDirOverride=t.packDir,n._attached=!0;let i=F(t.packDir,"tests",t.testId);return await Ue.mkdir(i,{recursive:!0}),t.definition&&(await Ue.writeFile(F(i,t.definition.path),t.definition.content),n.definitionPath=t.definition.path,n.definitionContent=t.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=ge(),this.testId=this.opts.testmdRelPath?xe(this.opts.testmdRelPath):Se(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let t=this.opts.definition??null;return await Re({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,t,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),t&&(this.definitionPath=t.path,this.definitionContent=t.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?F(this.opts.packRootDir,`${this.executionId}.evidence`):b(this.executionId,this.opts.cwd)}get packTestDir(){return F(this.pack,"tests",this.testId)}async writeDefinition(t,r="test.md"){await Ue.writeFile(F(this.packTestDir,r),t),this.definitionPath=r,this.definitionContent=t}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=F(this.opts.cwd,this.opts.testmdRelPath);if(He(t))return U(gr(t,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=F(this.opts.cwd,this.opts.testmdRelPath),r=F(this.opts.cwd,".context"),n=He(r)?O(r):void 0;if(He(t))return bt(t,n)}if(this.definitionContent!=null)return N(this.definitionContent)}catch{}}noteSpawn(t){this.accumulatedSteps.push(...t.steps),this.maxOrdinal=Math.max(this.maxOrdinal,t.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}async writeResult(t){let r=Te(t.spawns),n=this.pack;await $e(n,this.testId,Oe({testId:this.testId,status:r,durationMs:t.durationMs,definitionPath:this.definitionPath,definitionId:this.computeDefinitionId(),assuranceId:this.computeAssuranceId(),externalId:be(t.externalIdInput),environment:Ee(t.runnerEnv,t.intentEnv),steps:t.steps,tags:t.tags}));let i=t.externalIdInput;return t.log&&(i.commit_id||i.test_id||i.testcase_id)&&t.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:i.commit_id??null,test_id:i.test_id??null,testcase_id:i.testcase_id??null,project_id:i.project_id??null,session_id:i.session_id??null,session_name:i.session_name??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function hr(e,t,r=he){try{let n=await r(e);if(n.aborted.length>0||n.removed.length>0)try{t?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as Jr}from"fs";import{existsSync as Ye,mkdirSync as Ur,readdirSync as Hr,readFileSync as Gr,rmSync as zr,statSync as Yr,writeFileSync as Kr}from"fs";import{join as z}from"path";var wr={window:10,latest_only:!1,stale_at_run_weight:.5,counted_verdicts:["passed","failed"],accepted_oracle_modes:["authored","inferred","runtime-derived"],verified_threshold:.5,min_passes:1,risk_weights:{high:3}},yr={window:10,latest_only:!0,stale_at_run_weight:0,counted_verdicts:["passed","failed"],accepted_oracle_modes:["authored","inferred"],verified_threshold:1,min_passes:1,risk_weights:{high:3}},_r={lenient:wr,strict:yr};function xr(e,t){let r=e.slice(-t.window),n=new Map;for(let c of r)n.set(c.execution_id,c);let i=[...n.values()].sort((c,d)=>c.ts<d.ts?-1:c.ts>d.ts?1:c.execution_id<d.execution_id?-1:1).filter(c=>t.counted_verdicts.includes(c.verdict)&&t.accepted_oracle_modes.includes(c.oracle_mode));t.latest_only&&i.length>1&&(i=[i[i.length-1]]);let o=0,a=0,s=0;for(let c of i){let d=c.stale_at_run?t.stale_at_run_weight:1;o+=d,c.verdict==="passed"&&(a+=d,s++)}let u=o>0?Math.round(a/o*100)/100:0;return{score:u,verified:u>=t.verified_threshold&&s>=t.min_passes,passes:s,counted:i.length}}function kt(e,t){let r=0,n=0;for(let i of e){let o=t.risk_weights[i.risk]??1;r+=o,i.verified&&(n+=o)}return r>0?Math.round(n/r*100):0}function Sr(e,t){let r={},n={},i=[],o=0;for(let a of e.usecases){let s=[];for(let d of a.acceptance_criteria){let p=xr(d.executions??[],t);r[d.id]=p;let l={risk:d.risk,verified:p.verified};s.push(l),i.push(l)}let u=s.filter(d=>d.verified).length,c=s.length>0&&u===s.length?"covered":u>0?"partial":"uncovered";c==="covered"&&o++,n[a.id]={status:c,pct:kt(s,t)}}return{config:t,acs:r,usecases:n,summary:{coverage_pct:kt(i,t),acs_verified:`${i.filter(a=>a.verified).length}/${i.length}`,usecases_covered:`${o}/${e.usecases.length}`,uncovered:Object.values(n).filter(a=>a.status==="uncovered").length}}}function Et(e,t=_r){return{rollup_version:1,stale_sources:new Set(e.usecases.flatMap(r=>r.stale_sources??[])).size,high_risk_gaps:(e.gaps??[]).filter(r=>r.risk==="high").length,aspects:Object.fromEntries(Object.entries(t).map(([r,n])=>[r,Sr(e,n)]))}}var C=(e,t)=>e.nameOf.get(t)??t,V=(e,t)=>!e.superseded.has(t);function br(e,t){return e.byLabel(R.SCENARIO).filter(({cid:r})=>V(e,r)).filter(({cid:r})=>e.edgesFrom(r).some(n=>n.type===H.BELONGS_TO&&e.tipOf(n.dst)===t)).map(({cid:r})=>r)}function kr(e,t,r){let n=[];for(let{cid:i}of e.byLabel(R.AC)){if(!V(e,i))continue;let o=e.edgesFrom(i).find(s=>s.type===H.SCOPED_TO);if(!o)continue;let a=e.tipOf(o.dst);a===t?n.push({cid:i,scope:{type:"usecase",ref:C(e,t)}}):r.has(a)&&n.push({cid:i,scope:{type:"scenario",ref:C(e,a)}})}return n}function Er(e){let t=e.filter(r=>r!==void 0).map(r=>r.execution);return t.includes("failed")?"failed":t.includes("blocked")?"blocked":t.includes("passed")?"passed":"not-run"}var Ir={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"};function Rr(e,t){let r=t.flatMap(n=>n?.acs??[]).filter(n=>n.ref===e).map(n=>Ir[n.verdict]??"not-run");return r.length===0?Er(t):r.includes("failed")?"failed":r.includes("blocked")?"blocked":r.includes("passed")?"passed":"not-run"}function It(e,t,r){let n=r?.scope==="run",i=[],o=new Set,a=new Map;for(let[c,d]of e.nameOf)a.set(e.tipOf(c)??c,d);let s=c=>a.get(c)??C(e,c);for(let{cid:c,content:d}of e.byLabel(R.USECASE)){if(!V(e,c)||e.trust.get(c)==="archived")continue;let p=e.tipOf(c),l=e.derivesInto(p).filter(f=>!e.superseded.has(f.ecid)),v=[...new Set(l.map(f=>String(f.props?.source_id??"")).filter(Boolean))].sort(),g=v.map(f=>{let y=e.heads.get(f);if(typeof y!="string")return{id:f};let m=e.getNode(y)?.content.blob;return{id:f,media_type:e.mediaOf(y).media_type,...typeof m=="string"?{cid:m}:{}}}),w=l[0],E=new Map;for(let f of l)f.props?.source_id&&f.props?.source_cid&&E.set(String(f.props.source_id),String(f.props.source_cid));let I=v.filter(f=>{let y=e.heads.get(f),m=E.get(f);return y!=null&&m!==void 0&&y!==m}).sort(),_=e.edgesFrom(c).filter(f=>f.type===H.DEPENDS_ON&&!e.superseded.has(f.ecid)).map(f=>Cr(e,f.dst)).filter(f=>f!==null).sort(),A=br(e,p),B=new Set(A),Y=A.map(f=>{let y=e.getNode(f)?.content??{},m=e.edgesFrom(f).filter(k=>k.type===H.EXERCISES&&!e.superseded.has(k.ecid)&&V(e,e.tipOf(k.dst))).map(k=>C(e,e.tipOf(k.dst))).sort();return{id:C(e,f),case_type:String(y.case_type??""),intent:String(y.intent??""),exercises:m}}).sort((f,y)=>f.id<y.id?-1:1),ue=!1,L=new Set([p]);for(let f of A)L.add(f);let q=kr(e,p,B).map(({cid:f,scope:y})=>{let m=e.getNode(f)?.content??{},k=[...new Set(e.edgesInto(f).filter(h=>h.type===H.VERIFIES&&!e.superseded.has(h.ecid)).map(h=>e.tipOf(h.src)).filter(h=>!!h&&V(e,h)))].sort((h,x)=>s(h)<s(x)?-1:1),le=k.length>0,pe=k.map(h=>t.get(`id:${s(h)}`)??t.get(`def:${String(e.getNode(h)?.content.definitionId??"")}`)),tt=pe.some(h=>h!==void 0);tt&&(ue=!0),L.add(f);for(let h of k)L.add(h);let Kt=le&&!tt?"unknown":e.stale(f)==="fresh"?"fresh":"stale",ee=m.expected_answer??{},fe=C(e,f),rt=k.flatMap(h=>(e.execHistory?.(s(h))??[]).map(x=>({execution_id:String(x.execution_id),ts:String(x.started_at),verdict:String(x.per_ac?.find(me=>me.ac_ref===fe)?.verdict??x.verdict),stale_at_run:!!x.stale_at_run,oracle_mode:String(x.oracle_mode),...x.via_parent?{via_parent:String(x.via_parent)}:{}}))).sort((h,x)=>h.ts<x.ts?-1:1).slice(-10);return{id:fe,text:String(m.text??""),risk:String(m.risk??""),scope:y,covered_by:k.map(h=>s(h)),...le?{link_type:"verifies"}:{},execution:Rr(fe,pe),fresh:Kt,derived:!!m.derived,...m.kind||m.expected_answer?{expected_answer:{...m.kind?{kind:String(m.kind)}:{},statement:String(m.text??""),...ee.operator!==void 0?{operator:ee.operator}:{},...ee.operand!==void 0?{operand:ee.operand}:{}}}:{},...le?{satisfied_by:k.map((h,x)=>{let me=e.getNode(h)?.content.check??{},nt=pe[x]?.steps?.checkStepId??me.verified_against;return{test:s(h),...nt?{step:nt}:{}}})}:{},...rt.length?{executions:rt}:{}}}).sort((f,y)=>f.id<y.id?-1:1);if(!(n&&!ue)){for(let f of L)o.add(f);i.push({id:C(e,c),title:String(d.title??""),...d.description||d.summary?{description:String(d.description??d.summary)}:{},...Array.isArray(d.actors)&&d.actors.length?{actors:d.actors.map(String)}:{},...d.value?{value:String(d.value)}:{},risk:String(d.risk??""),status:e.trust.get(c)==="trusted"?"approved":"draft",sources:g,...I.length?{stale_sources:I}:{},..._.length?{depends_on:_}:{},...w?{provenance:{derived_from:`${String(w.props?.source_id??"")}#${String(w.props?.anchor??"")}`}}:{},scenarios:Y,acceptance_criteria:q})}}i.sort((c,d)=>c.id<d.id?-1:1);let u=e.byLabel(R.GAP).filter(({cid:c})=>V(e,c)&&e.trust.get(c)!=="archived").filter(({content:c})=>{if(!n||typeof c.uc=="string"&&o.has(e.tipOf(c.uc)))return!0;let d=typeof c.ref=="string"?e.resolve(c.ref):null;return d!==null&&o.has(e.tipOf(d.cid))}).map(({cid:c,content:d})=>({ref:C(e,c),kind:String(d.kind??""),...d.risk?{risk:String(d.risk)}:{},...d.question?{question:Pr(d.question)}:{}})).sort((c,d)=>c.ref<d.ref?-1:1);return{usecases:i,...u.length?{gaps:u}:{},...n?{scope:"run"}:{}}}function Pr(e){if(typeof e=="string")return e;let t=e?.header;return typeof t=="string"?t:""}function Cr(e,t){let r=e.tipOf(t);return e.nodeLabel.get(r)!==R.USECASE||!V(e,r)?null:C(e,r)}import{mkdirSync as Ar,renameSync as Or,rmSync as Dr,writeFileSync as $r}from"fs";import{join as Rt}from"path";var Fr=5e6;function Pt(e,t,r){let n=Rt(e,"coverage","sources"),i=new Map,o=!1;try{for(let a of r.usecases)for(let s of a.sources){if(i.has(s.id)){s.file=i.get(s.id);continue}if(!s.cid)continue;let u=ft(t,s.cid);if(u===null||u.byteLength>Fr)continue;o||(Ar(n,{recursive:!0}),o=!0);let c=Rt(n,s.id),d=`${c}.tmp-${process.pid}`;$r(d,u),Or(d,c);let p=`coverage/sources/${s.id}`;i.set(s.id,p),s.file=p}}catch{for(let a of r.usecases)for(let s of a.sources)delete s.file;if(o)try{Dr(n,{recursive:!0,force:!0})}catch{}}}import{existsSync as ze,readFileSync as Z,renameSync as Nr,writeFileSync as jr}from"fs";import{dirname as $t,isAbsolute as Ft,resolve as Lt}from"path";var Lr=new Set(["inline","testmd","testrun"]),Tr=new Set(["inferred","authored","runtime-derived"]),Ge=new Set(["passed","failed","broken","skipped"]);function Ct(e,t,r){let n=[];if(r.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"a run with no designed units attaches no facts \u2014 skip the call"}]};let i=re(e);if(t.latestHash!==i)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(t.latestHash)} but chain head is ${String(i)} \u2014 re-open and retry`}]};let o=[];for(let s of r.facts){let u=`executions[${s.ref}]`,c=t.resolve(s.ref),d=c?t.tipOf(c.cid):null;if(!c||!d||t.superseded.has(d)){n.push({code:"UNKNOWN_REF",detail:`${u}: '${s.ref}' is not a live committed node`});continue}if(t.nodeLabel.get(d)!==R.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${u}: execution facts attach to tests \u2014 '${s.ref}' is a ${t.nodeLabel.get(d)}`});continue}if(!Lr.has(s.mode)){n.push({code:"BAD_MODE",detail:`${u}: mode '${s.mode}' not in inline|testmd|testrun`});continue}if(!Ge.has(s.verdict)){n.push({code:"BAD_VERDICT",detail:`${u}: verdict '${s.verdict}' not in ${[...Ge].join("|")}`});continue}if(!Tr.has(s.oracle_mode)){n.push({code:"BAD_ORACLE_MODE",detail:`${u}: oracle_mode '${s.oracle_mode}' not in inferred|authored|runtime-derived`});continue}if(typeof s.drift_flag!="boolean"||typeof s.stale_at_run!="boolean"){n.push({code:"MISSING_FIELD",detail:`${u}: drift_flag and stale_at_run are required booleans`});continue}if(!s.execution_id||!s.started_at||!s.definition_id_at_run){n.push({code:"MISSING_FIELD",detail:`${u}: execution_id, started_at and definition_id_at_run are required`});continue}let p=[];for(let l of s.per_ac??[]){let v=t.resolve(l.ac_ref),g=v?t.tipOf(v.cid):null;if(!v||!g||t.superseded.has(g)||t.nodeLabel.get(g)!==R.AC){n.push({code:"UNKNOWN_REF",detail:`${u}.per_ac: '${l.ac_ref}' is not a live AC`});continue}if(!Ge.has(l.verdict)){n.push({code:"BAD_VERDICT",detail:`${u}.per_ac['${l.ac_ref}']: verdict '${l.verdict}'`});continue}p.push({ac_ref:t.nameOf.get(g)??g,verdict:l.verdict})}o.push({about:d,definition_id_at_run:s.definition_id_at_run,verdict:s.verdict,...p.length?{per_ac:p}:{},drift_flag:s.drift_flag,oracle_mode:s.oracle_mode,stale_at_run:s.stale_at_run,...s.unresolved_acs?.length?{unresolved_acs:s.unresolved_acs}:{},execution_id:s.execution_id,...s.evidence_id?{evidence_id:s.evidence_id}:{},...s.duration_ms!==void 0?{duration_ms:s.duration_ms}:{},started_at:s.started_at,mode:s.mode,local:s.local,...s.via_parent?{via_parent:s.via_parent}:{}})}if(n.length>0)return{record:null,errors:n};let a=ne(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:o,source_head_moves:{}});return ie(e),{record:a.record,errors:null}}function Tt(e){let t={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of e)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(t[n.status]??0)>(t[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function Nt(e){let t=[],r=oe(e.cwd);if(!ze(r))return{synced:0,superseded:0,skipped:"no-context",warnings:t};let n=e.by??{kind:"ai",id:"exec-sync"},i=O(r),o=[],a=0,s=new Set;for(let c of e.members){let d=Ft(c.path)?c.path:Lt(e.cwd,c.path);for(let p of Mr(d)){if(s.has(p.path))continue;s.add(p.path);let l=p.path===d?void 0:U(Z(d,"utf8"))?.id,v=Z(p.path,"utf8"),g=U(v);if(!g?.id)continue;let w=i.resolve(g.id),E=w?i.tipOf(w.cid):null;if(!w||!E||i.superseded.has(E)){t.push(`sync: ${g.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let I=N(J(v,te($t(p.path),i))),_=String(i.getNode(E)?.content.test_md_blob??""),A=N(J(_,dt(i))),B=!1,Y=E;if(I===A)g.base!==A&&Dt(p.path,v,A,t);else if(g.base===A){let m=Vr(r,i,E,v,I,n);m.error?(t.push(`sync: could not supersede ${g.id}: ${m.error}`),B=!0):(a++,Y=m.newCid,B=m.oracleTier,Dt(p.path,Z(p.path,"utf8"),I,t),i=O(r))}else B=!0,t.push(g.base?`sync: ${g.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${g.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);let L=i.getNode(Y)?.content.check,q=p.path===d?c.acs??[]:[],f=q.filter(m=>At(i,m.ref)),y=q.filter(m=>!At(i,m.ref)).map(m=>m.ref);o.push({ref:g.id,definition_id_at_run:I,verdict:c.verdict,...f.length?{per_ac:f.map(m=>({ac_ref:m.ref,verdict:m.verdict}))}:{},drift_flag:B,oracle_mode:L?.expected_mode??(at(L?.operand)?"runtime-derived":"inferred"),stale_at_run:i.stale(Y)!=="fresh",...y.length?{unresolved_acs:y}:{},execution_id:c.executionId,...c.evidenceId?{evidence_id:c.evidenceId}:{},...c.durationMs!==void 0?{duration_ms:c.durationMs}:{},started_at:c.startedAt,mode:c.mode,local:c.local,...l?{via_parent:l}:{}})}}if(o.length===0)return{synced:0,superseded:a,warnings:t};let u=Ct(r,O(r),{facts:o,by:n});return u.errors?(t.push(...u.errors.map(c=>`sync facts: ${c.code}: ${c.detail}`)),{synced:0,superseded:a,warnings:t}):{synced:o.length,superseded:a,warnings:t}}function Mr(e){let t=[],r=new Set,n=i=>{if(r.has(i)||!ze(i))return;r.add(i);let o=Z(i,"utf8");for(let a of o.split(`
5
+ `)){let s=/^@import\s+(\S+)\s*$/.exec(a.trim());if(!s)continue;let u=Ft(s[1])?s[1]:Lt($t(i),s[1]);ze(u)&&U(Z(u,"utf8"))?.id&&n(u)}t.push({path:i})};return n(e),t}function At(e,t){let r=e.resolve(t),n=r?e.tipOf(r.cid):null;return!!(r&&n&&!e.superseded.has(n)&&e.nodeLabel.get(n)==="ac")}function Vr(e,t,r,n,i,o){let a=t.getNode(r);if(!a)return{oracleTier:!1,error:"tip unreadable"};let s=ut(n),u=String(a.content.test_md_blob??""),c=/^#\s+(.+?)\s*$/m.exec(s)?.[1]??String(a.content.title??""),d={...a.content,test_md_blob:s,definitionId:i,title:c},p=lt("test",d);if(p.length>0)return{oracleTier:!1,error:p.map(w=>w.detail).join("; ")};let l=pt("test",d);if(l===r)return{newCid:r,oracleTier:!1};let v=Ot(u)!==Ot(s),g=re(e);if(t.latestHash!==g)return{oracleTier:v,error:`store advanced under the sync (basis ${String(t.latestHash)} vs head ${String(g)}) \u2014 re-run to retry`};try{ne(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:l,label:"test",content:d}],edges:[],review:[{id:l,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:o}],supersessions:[{kind:"node",old:r,new:l,reason:"edited on disk (run sync)",by:o}],source_head_moves:{}},{expectPrev:g})}catch(w){return{oracleTier:v,error:w instanceof Error?w.message:String(w)}}return ie(e),{newCid:l,oracleTier:v}}var Br=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function Ot(e){let t=[],r=e.split(`
6
+ `),n=!1;for(let i of r){if(/^##\s/.test(i)){n=/\bassert\b/i.test(i);let o=Br.exec(i);o&&t.push(`v:${o[1].trim()}`);continue}n&&i.trim()!==""&&t.push(i.trim())}return t.join(`
7
+ `)}function Dt(e,t,r,n){try{let i=t.split(`
8
+ `),o=-1;if(i[0]?.trim()==="---"){for(let u=1;u<i.length;u++)if(i[u].trim()==="---"){o=u;break}}if(o<0)return;let a=!1;for(let u=1;u<o;u++){if(/^\s+base:\s*sha256:[0-9a-f]+\s*$/.test(i[u])){i[u]=i[u].replace(/sha256:[0-9a-f]+/,r),a=!0;break}if(/^assurance:\s*$/.test(i[u])&&!i.slice(u,Math.min(u+3,o)).some(c=>/^\s+base:/.test(c))){i.splice(u+2,0,` base: ${r}`),a=!0;break}}if(!a)return;let s=`${e}.tmp-sync`;jr(s,i.join(`
9
+ `)),Nr(s,e)}catch(i){n.push(`sync: pin refresh failed for ${e} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var Wr={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},jt=(e,t)=>{try{if(!Ye(t))return{status:"skipped",reason:"no context store at the project root"};let r=z(e,"tests");if(!Ye(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let s of Hr(r)){let u=z(r,s,"result.yaml");if(!Ye(u)||!Yr(z(r,s)).isDirectory())continue;let c=T(Gr(u,"utf8"));if(!c?.definition_id&&!c?.assurance_id)continue;let d=Tt(c.steps??[]),p={testShortId:String(c.test??s),execution:Wr[String(c.status)]??"not-run",...d.length?{acs:d}:{}};c.assurance_id&&n.set(`id:${c.assurance_id}`,p),c.definition_id&&n.set(`def:${c.definition_id}`,p)}let i=It(O(t),n,{scope:"run"}),o=Et(i);Pt(e,t,i);let a=S({...i,rollup:o},{lineWidth:-1});return Ur(z(e,"coverage"),{recursive:!0}),Kr(z(e,"coverage","usecases.yaml"),a),{status:"written"}}catch(r){try{zr(z(e,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function Xr(e){try{let t=new X({origin:"inline",runKind:"author",pid:e.pid,title:e.title,started:new Date().toISOString(),producerVersion:e.producerVersion,surfaces:e.surfaces,objectiveOrName:e.objectiveOrName,sessionId:e.sessionId,cwd:e.cwd,packRootDir:e.packRootDir}),r=await t.start();return{session:t,...r,packDir:t.pack,spawns:[],startedAtMs:Date.now(),cwd:e.cwd}}catch(t){return console.warn("evidence: inline pack creation failed",t),null}}function Zr(e,t,r){if(!e)return;e.session.noteSpawn(t),t.resolution&&(e.resolution=t.resolution);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));e.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function Qr(e){if(e)return{packTestDir:e.packTestDir,ordinalOffset:e.session.nextOrdinalOffset()}}async function qr(e,t){if(!e)return null;if(e.finalized)return e.finalized;let r=(n,i,o)=>t.log?t.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(t.recordedTestPath)try{await e.session.writeDefinition(await Jr.readFile(t.recordedTestPath,"utf8"))}catch(a){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(a)})}let n=t.cdpBrowserCapture?await t.cdpBrowserCapture():void 0,i=await e.session.writeResult({steps:e.session.steps,spawns:e.spawns.length?e.spawns:[{resultCode:null}],externalIdInput:{...t.externalIdInput,execution_id:e.executionId},runnerEnv:Be({cdpBrowser:n,resolution:e.resolution}),intentEnv:{model:t.model,platform:"Desktop",platform_type:"web"},durationMs:t.durationMs??Date.now()-e.startedAtMs,log:t.log});try{if(t.recordedTestPath){let a=Nt({cwd:t.cwd??e.cwd??process.cwd(),members:[{path:t.recordedTestPath,verdict:i,executionId:e.executionId,startedAt:new Date(e.startedAtMs).toISOString(),mode:"inline",local:t.local??!1}]});for(let s of a.warnings)r("EXEC_SYNC",s)}}catch(a){r("EXEC_SYNC","exec-sync failed",{error:String(a)})}try{let a=(t.coverageWriter??jt)(e.packDir,oe(t.cwd??e.cwd??process.cwd()));a.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${a.reason}`)}catch(a){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(a)})}let o=await Ve({executionId:e.executionId,testId:e.testId,saved:t.saved,runKind:"author",verdict:i,cwd:t.cwd??e.cwd,packDir:e.packDir,tuiLogPath:t.tuiLogPath,log:t.log,surface:"inline"});return e.finalized=o,t.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:e.executionId,verdict:i,valid:o.valid,pack:e.packDir,store_copy:o.storePath??null}),o}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as sn,openSync as cn,readSync as an,closeSync as dn}from"fs";import{basename as un,resolve as ln}from"path";import{createServer as en}from"http";import{createReadStream as tn,promises as rn}from"fs";import{randomBytes as nn}from"crypto";var ae="127.0.0.1";function Mt(e,t){if(!e)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(e.trim());if(!r)return null;let[,n,i]=r;if(n===""&&i==="")return null;if(n===""){let s=Number(i);return s===0||t===0?"unsatisfiable":{start:Math.max(0,t-s),end:t-1}}let o=Number(n);if(o>=t)return"unsatisfiable";let a=i===""?t-1:Math.min(Number(i),t-1);return a<o?null:{start:o,end:a}}async function Ke(e){let t=nn(16).toString("hex"),r=en((i,o)=>{on(i,o,e,t).catch(()=>o.destroy())});await new Promise((i,o)=>{r.once("error",o),r.listen(e.port??0,ae,()=>{r.removeListener("error",o),i()})});let n=r.address().port;return{port:n,urlFor:i=>`http://${ae}:${n}/${t}/${encodeURIComponent(i)}`,close:()=>new Promise(i=>{r.close(()=>i()),r.closeAllConnections()})}}async function on(e,t,r,n){let i=e.url??"/",o=_=>{try{r.log?.("warn","EVIDENCE_SERVE_DENIED",{reason:_,path:i})}catch{}};if(e.headers.host!==`${ae}:${e.socket.localPort}`){o("host_mismatch"),t.writeHead(403).end();return}let a=e.headers.origin;if(a!==void 0&&!r.allowedOrigins.includes(a)){o("origin_denied"),t.writeHead(403).end();return}let s=a?{"Access-Control-Allow-Origin":a,Vary:"Origin","Access-Control-Expose-Headers":"Content-Range, Content-Length"}:{};if(e.method==="OPTIONS"){let _={...s,"Access-Control-Allow-Methods":"GET, HEAD, OPTIONS","Access-Control-Allow-Headers":"range","Access-Control-Max-Age":"86400"};e.headers["access-control-request-private-network"]==="true"&&(_["Access-Control-Allow-Private-Network"]="true"),t.writeHead(204,_).end();return}if(e.method!=="GET"&&e.method!=="HEAD"){t.writeHead(405,s).end();return}let u;try{let _=new URL(e.url??"/",`http://${ae}`).pathname.split("/");if(_.length!==3||_[1]!==n){o("bad_token"),t.writeHead(404,s).end();return}u=decodeURIComponent(_[2])}catch{o("not_found"),t.writeHead(404,s).end();return}let c=r.packs.get(u);if(!c){o("not_found"),t.writeHead(404,s).end();return}let d;try{let _=await rn.stat(c);if(!_.isFile())throw new Error("not a file");d=_.size}catch{o("not_found"),t.writeHead(404,s).end();return}let p={...s,"Accept-Ranges":"bytes","Content-Type":"application/zip","Cache-Control":"no-store"};if(e.method==="HEAD"){t.writeHead(200,{...p,"Content-Length":String(d)}).end();return}let l=Mt(e.headers.range,d);if(l==="unsatisfiable"){o("unsatisfiable"),t.writeHead(416,{...s,"Content-Range":`bytes */${d}`}).end();return}let[v,g,w]=l===null?[0,d-1,200]:[l.start,l.end,206],E={...p,"Content-Length":String(g-v+1)};if(w===206&&(E["Content-Range"]=`bytes ${v}-${g}/${d}`),t.writeHead(w,E),d===0){t.end();return}let I=tn(c,{start:v,end:g});I.on("error",()=>t.destroy()),t.on("close",()=>I.destroy()),I.pipe(t)}function Q(e,t){return(t??ot(e).evidenceViewerUrl).replace(/\/+$/,"")}function We(e,t){return`${t}/?pack=${encodeURIComponent(e)}`}function Je(e){return`evidence: view locally with \`kane-cli evidence serve ${e}\``}async function pn(e,t,r={}){let n=r.out??(d=>process.stdout.write(d+`
10
+ `)),i=d=>(n(`error: ${d}`),2);if(t.env!=="prod"&&t.env!=="stage")return i(`invalid --env: ${String(t.env)} (expected prod or stage)`);if(t.port!==void 0&&(!Number.isInteger(t.port)||t.port<1||t.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=Q(t.env,t.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${t.viewerUrl}`)}if(e.length===0)return i("no pack paths given");let a=new Map;for(let d of e){let p=ln(d),l;try{l=sn(p)}catch{return i(`${d}: not found`)}if(l.isDirectory())return i(`${d}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!l.isFile())return i(`${d}: not a regular file`);let v=Buffer.alloc(2),g=cn(p,"r");try{an(g,v,0,2,0)}finally{dn(g)}if(v.toString("latin1")!=="PK")return i(`${d}: not a sealed evidence pack (zip magic missing)`);let w=un(p);if(a.has(w))return i(`duplicate pack basename: ${w} (URL names collide \u2014 rename one)`);a.set(w,p)}let s=r.log??((d,p,l)=>process.stderr.write(`warn: ${p} reason=${l.reason} path=${l.path}
11
+ `)),u;try{u=await Ke({packs:a,allowedOrigins:[new URL(o).origin],port:t.port,log:s})}catch(d){return i(`could not bind 127.0.0.1${t.port?`:${t.port}`:""} \u2014 ${d.message}`)}n(`serving ${a.size} pack${a.size===1?"":"s"} on http://127.0.0.1:${u.port}`);for(let d of a.keys()){let p=u.urlFor(d);n(d),n(` pack ${p}`),n(` viewer ${We(p,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??fn)(),await u.close(),0}function fn(){return new Promise(e=>{let t=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of t)process.on("SIGINT",r);e()})})}import{promises as de}from"fs";import{tmpdir as vn}from"os";import{join as Ut,resolve as Ze}from"path";var mn=["error","prefer_first","prefer_latest","discard"];function Vt(e){let t=e.replace(/-/g,"_");return mn.includes(t)?t:null}function Bt(e="error"){return S({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:{on_collision:e},rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function Xe(e){try{if(!e.isTTY){e.log(Je(e.packPath));return}let t=Q(e.env);await(e.renderPrompt??gn)(e.packPath,t)}catch(t){try{e.log(`evidence view failed \u2014 ${t.message}`)}catch{}}}async function gn(e,t){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-N4UED7VY.js");await new Promise(o=>{let a=n(r.default.createElement(i,{packPath:e,viewerBase:t,onDone:()=>{a.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function hn(e,t,r=process.cwd(),n={}){let i=n.out??(l=>process.stdout.write(l+`
12
+ `)),o=n.err??(l=>process.stderr.write(l+`
13
+ `)),a=l=>(o(`evidence merge: ${l}`),2);if(!t.runId)return a("--run-id is required (merged identity is the caller's fact)");if(t.rules&&t.onCollision)return a("--rules and --on-collision are mutually exclusive");let s="error";if(t.onCollision!==void 0&&(s=Vt(t.onCollision),!s))return a(`invalid --on-collision: ${t.onCollision} (expected error | prefer-first | prefer-latest | discard)`);let u=[];for(let l of e){let v=await wn(l,r);if(!v)return a(`no pack found for "${l}"`);u.push(v)}let c=t.out?Ze(r,t.out):b(t.runId,r),d=null,p;t.rules?p=Ze(r,t.rules):(d=await de.mkdtemp(Ut(vn(),"kane-merge-rules-")),p=Ut(d,"merge-rules.yaml"),await de.writeFile(p,Bt(s)));try{let l=await(n.mergeFn??st)(u,{runId:t.runId,out:c,rulesPath:p,title:t.title,finalize:t.finalize});return t.json?i(JSON.stringify(l)):yn(i,l),l.output.finalized&&!t.json&&await(n.offer??Xe)({packPath:c,env:t.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(l){let v=l instanceof Error?l.message:String(l);return l?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${v}`),1):a(v)}finally{d&&await de.rm(d,{recursive:!0,force:!0}).catch(()=>{})}}async function wn(e,t){let r=Ze(t,e);if(await Ht(r))return r;let n=b(e,t);return await Ht(n)?n:null}async function Ht(e){try{return await de.stat(e),!0}catch{return!1}}function yn(e,t){let{packs:r,tests:n,output:i}=t;e(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)e(` skipped ${o.runId}: ${o.rule} \u2014 ${o.reason}`);for(let o of n.collisions)e(` collision ${o.test}: winner ${o.winner} (${o.rule})`);for(let o of n.discarded)e(` discarded ${o}`)}import{copyFileSync as _n,existsSync as Qe,mkdirSync as xn}from"fs";import{join as Gt}from"path";function Sn(e,t,r){try{let n=Gt(e,"auteur","execution.json");if(Qe(n))return!0;for(let i of t)if(!(!i||!Qe(i)))return xn(Gt(e,"auteur"),{recursive:!0}),_n(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:t.find(i=>i&&Qe(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as bn}from"fs";import{join as kn}from"path";function et(e){let t=[],r=!0,n=o=>{if(o===null||typeof o!="object")return;let a=o;if(Array.isArray(a.operations))for(let s of a.operations){let u=s?.operation_id;typeof u=="string"&&u&&t.push(u)}if(Array.isArray(a.children)){a.content_type!=="generative_block"&&(r=!1);for(let s of a.children)n(s)}if(Array.isArray(a.branches)){r=!1;for(let s of a.branches){let u=s?.children;if(Array.isArray(u))for(let c of u)n(c)}}},i=e?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:t,linear:r}}function En(e){return et(e).ids}function qe(e,t){let r=new Set(t.map(s=>s.action_id).filter(Boolean)),n=-1;for(let s of r){let u=e.indexOf(s);u>n&&(n=u)}let i=t.reduce((s,u)=>Math.max(s,u.ordinal),0),o=new Set,a=[];for(let s of e.slice(n+1))r.has(s)||o.has(s)||(o.add(s),a.push({id:s,ordinal:++i,status:"skipped",action_id:s}));return a}function zt(e,t){let r=new Set(t),n=e.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>t.length)return null;let i=0;return e.map(o=>o.action_id?{...o,action_id:t[i++]}:o)}function In(e,t){if(e.length>t.length)return!1;for(let r=0;r<e.length;r++)if(t[r]!==e[r].action_id)return!1;return!0}function Rn(e,t,r,n=!0){if(t.length===0)return{steps:e,tail:[]};let i=(r&&n?zt(e,t):null)??e,o=i.filter(s=>s.action_id),a=new Set(t);return o.length>0&&o.every(s=>a.has(s.action_id))?{steps:i,tail:qe(t,i)}:o.length>0&&!In(o,t)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:qe(t,i)}}function Yt(e){try{let t=bn(kn(e,"auteur","execution.json"),"utf8");return et(JSON.parse(t))}catch{return{ids:[],linear:!0}}}function Pn(e){return Yt(e).ids}export{M as a,we as b,ye as c,_e as d,xe as e,Se as f,be as g,ke as h,Ee as i,Zt as j,Ie as k,Re as l,Qt as m,qt as n,Pe as o,Oe as p,De as q,$e as r,Fe as s,Le as t,er as u,tr as v,Te as w,rr as x,Ne as y,je as z,Me as A,yt as B,Ve as C,Be as D,St as E,lr as F,X as G,hr as H,Tt as I,Nt as J,jt as K,Xr as L,Zr as M,Qr as N,qr as O,Mt as P,Ke as Q,Q as R,We as S,Je as T,pn as U,Xe as V,hn as W,Sn as X,et as Y,En as Z,qe as _,zt as $,Rn as aa,Yt as ba,Pn as ca};
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{c as o}from"./chunk-ZKYYZ5NO.js";import{a as n}from"./chunk-BC7UVJJB.js";import{existsSync as c}from"fs";function s(t,r){(t.err??t.out)(`error: ${r}`)}function a(t,r){let e=n(t);return c(e)?e:(s(r,"no context store here (run `kane-cli context ingest <files>` first)"),null)}async function p(t,r,e){return e?!0:t.isTTY?t.confirm(`${r}?`):(s(t,`refusing to ${r} without --yes (no TTY to confirm)`),!1)}function d(){return{out:t=>process.stdout.write(t+`
3
+ `),err:t=>process.stderr.write(t+`
4
+ `),isTTY:o(),confirm:async t=>{let{createInterface:r}=await import("readline/promises"),e=r({input:process.stdin,output:process.stdout});try{let i=await e.question(`${t} [y/N] `);return/^y(es)?$/i.test(i.trim())}finally{e.close()}},ask:async t=>{let{createInterface:r}=await import("readline/promises"),e=r({input:process.stdin,output:process.stdout});try{return await e.question(t)}finally{e.close()}}}}export{s as a,a as b,p as c,d};
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as j}from"./chunk-GIRXJOJI.js";import{c as m,d as _,f as L}from"./chunk-B2PZAB7J.js";import{a as w,e as N,f as k,g as O,h as I}from"./chunk-IACKIGPX.js";import{existsSync as v,mkdirSync as M,readFileSync as S,renameSync as T,rmSync as P,writeFileSync as J}from"fs";import{dirname as W,join as b}from"path";var $=s=>b(s,"derived"),q=s=>b($(s),"index.json");function x(s,n){let t=n.startsWith("sha256:")?n.slice(7):n;return b($(s),"nodes",t.slice(0,2),t.slice(2)+".json")}function A(){return{applied:{seq:0,hash:null},heads:{},trust:{},nodeLabel:{},forward:{},extracted:[],design_of:{},exec:{},superseded:{},names:{},archivedReason:{},appliedEvents:[],conv:{},media:{}}}function D(s){let n=q(s);if(!v(n))return null;try{let t=JSON.parse(S(n,"utf8"));return t.superseded===void 0||t.names===void 0||t.archivedReason===void 0||t.appliedEvents===void 0||t.conv===void 0||t.media===void 0||t.exec===void 0||t.reverse!==void 0?null:t}catch{return null}}function U(s,n){M(W(s),{recursive:!0});let t=`${s}.tmp-${process.pid}`;J(t,n),T(t,s)}function y(s,n,t,l,a={}){let p=a.writeNodeFiles!==!1,g=new Set(n.extracted),h=new Set(n.appliedEvents);t.forEach((i,o)=>{for(let e of i.nodes){let r=x(s,e.cid);p&&!v(r)&&U(r,JSON.stringify({label:e.label,content:e.content})+`
3
+ `),!(e.cid in n.trust)&&e.content.derived===!0&&(n.trust[e.cid]="derived"),n.nodeLabel[e.cid]=e.label}i.proposal_id!=null&&typeof i.extraction_of=="string"&&g.add(i.extraction_of),i.design_of&&((n.design_of??={})[i.design_of.uc_cid]={engine:i.design_of.engine,seq:i.seq});for(let e of i.executions??[])((n.exec??={})[e.about]??=[]).push(e);for(let e of i.edges){let{quote:r,...d}=e.props,c=n.forward[e.src]??=[];c.some(u=>u.ecid===e.ecid)||c.push({...e,props:d}),i.proposal_id!=null&&e.type===N.DERIVES&&typeof e.props.source_cid=="string"&&g.add(e.props.source_cid)}for(let e of i.review)e.resolution==="approved"||e.resolution==="edited"?(n.trust[e.id]="trusted",delete n.archivedReason[e.id]):e.resolution==="rejected"?(n.trust[e.id]="archived",e.reason?n.archivedReason[e.id]=e.reason:delete n.archivedReason[e.id]):e.resolution==="reset"&&(n.trust[e.id]="derived",delete n.archivedReason[e.id]);for(let e of i.supersessions)e.kind==="node"?e.new===e.old?delete n.superseded[e.old]:n.superseded[e.old]=e.new:n.superseded[e.ecid]=null;for(let e of i.names??[])n.names[e.slug]=e.cid;for(let[e,r]of Object.entries(i.source_head_moves))n.heads[e]=r;for(let e of i.event_ids??[])h.add(e);if(i.media)for(let[e,r]of Object.entries(i.media)){let d=i.source_head_moves[e];typeof d=="string"&&(n.media[d]=r)}if(i.conv){let e=i.source_head_moves[i.conv.source_id];if(typeof e=="string"){let r=n.conv[i.conv.source_id],d=r&&r.chain.length>0?r.chain[r.chain.length-1]:null;i.conv.append_of===d?n.conv[i.conv.source_id]={turns:i.conv.turn,chain:[...r?.chain??[],e]}:n.conv[i.conv.source_id]={turns:i.conv.turn,chain:[e]}}}for(let[e,r]of Object.entries(i.source_head_moves))i.conv?.source_id!==e&&n.conv[e]!==void 0&&(n.conv[e]=typeof r=="string"?{turns:n.conv[e].turns,chain:[r]}:{turns:n.conv[e].turns,chain:[]});n.applied={seq:i.seq,hash:l[o]}}),n.extracted=[...g].sort(),n.appliedEvents=[...h].sort()}function F(s,n){U(q(s),JSON.stringify(n)+`
4
+ `)}function K(s){let n=b(s,"meta.json");if(v(n))try{let t=JSON.parse(S(n,"utf8"));if(t.schema!==w||t.canonicalizer!=="v1")throw new m(`schema fence: store is ${t.schema}/${t.canonicalizer}, this build is ${w}/${"v1"} \u2014 migrate explicitly (kane-cli context rebuild after upgrading)`)}catch(t){throw t instanceof m?t:new m(`corrupt meta.json in ${s} \u2014 fix or remove it`)}}function V(s){K(s);let n=D(s);if(n===null){n=A();let{records:a,hashes:p}=_(s);return y(s,n,a,p),F(s,n),n}let{records:t,hashes:l}=L(s,n.applied.seq,n.applied.hash);return t.length>0&&(y(s,n,t,l),F(s,n)),n}function Z(s){return P($(s),{recursive:!0,force:!0}),V(s)}function Q(s){let n=[],t=[],l=[];try{({records:t,hashes:l}=_(s))}catch(o){return{ok:!1,issues:[o instanceof m?o.message:String(o)],records:0}}let a=A();y(s,a,t,l,{writeNodeFiles:!1});let p=D(s);if(p===null)n.push("derived/index.json missing or corrupt (run kane-cli context rebuild)");else{let o=e=>JSON.stringify(R(e));for(let e of["applied","heads","trust","nodeLabel","forward","extracted","superseded","names","archivedReason","appliedEvents","conv","media","design_of","exec"])o(a[e])!==o(p[e])&&n.push(`derived drift in index.${e} (run kane-cli context rebuild)`)}let g=new Set;for(let o of Object.values(a.forward))for(let e of o)g.add(e.ecid);let h=new Set;for(let o of t)for(let e of o.supersessions)e.kind==="node"?(e.old in a.nodeLabel||n.push(`SUPERSEDE_UNKNOWN_OLD: ${e.old} (record ${o.seq})`),e.new!==null&&e.new!==e.old&&!(e.new in a.nodeLabel)&&n.push(`SUPERSEDE_UNKNOWN_NEW: ${String(e.new)} (record ${o.seq})`),e.new===e.old?h.delete(e.old):(h.has(e.old)&&n.push(`DOUBLE_SUPERSEDE: ${e.old} re-superseded while live (record ${o.seq})`),h.add(e.old))):g.has(e.ecid)||n.push(`SUPERSEDE_UNKNOWN_ECID: ${e.ecid} (record ${o.seq})`);for(let o of Object.keys(a.superseded)){let e=new Set,r=o;for(;r!==null&&r in a.superseded;){if(e.has(r)){n.push(`SUPERSEDE_CYCLE: chain from ${o} revisits ${r}`);break}e.add(r),r=a.superseded[r]}}for(let[o,e]of Object.entries(a.names))e in a.nodeLabel||n.push(`NAME_UNKNOWN_TARGET: slug ${o} \u2192 ${e} not in the graph`);for(let o of t)for(let e of o.edges){let r=a.nodeLabel[e.src]??"(unknown)",d=a.nodeLabel[e.dst]??"(unknown)";for(let c of I(e.type,r,d,e.props))n.push(`${c.code}: ${e.ecid} ${c.detail}`)}let i=new Map;for(let o of Object.values(a.forward))for(let e of o){if(e.ecid in a.superseded)continue;let r=i.get(e.type)??[];r.push(e),i.set(e.type,r)}for(let[o,e]of i){let r=O(o);if(r?.acyclic){let d=new Map;for(let f of e)d.set(f.src,[...d.get(f.src)??[],f.dst]);let c=new Map,u=f=>{c.set(f,1);for(let E of d.get(f)??[])if(c.get(E)===1||c.get(E)===void 0&&u(E))return!0;return c.set(f,2),!1};for(let f of d.keys())if(c.get(f)===void 0&&u(f)){n.push(`EDGE_CYCLE: live ${o} edges form a cycle reachable from ${f}`);break}}if(r?.cardinality==="one-live-per-src"||r?.cardinality==="one-live-per-src-and-dst"){let d=new Map;for(let c of e)c.dst in a.superseded||d.set(c.src,(d.get(c.src)??0)+1);for(let[c,u]of d)u>1&&n.push(`CARDINALITY_VIOLATION: ${u} live ${o} edges from ${c} (one-live-per-src)`)}if(r?.cardinality==="one-live-per-src-and-dst"){let d=new Map;for(let c of e)c.src in a.superseded||c.dst in a.superseded||d.set(c.dst,(d.get(c.dst)??0)+1);for(let[c,u]of d)u>1&&n.push(`CARDINALITY_VIOLATION: ${u} live ${o} edges onto ${c} (one-live-per-dst)`)}}for(let[o,e]of Object.entries(a.nodeLabel)){let r=x(s,o);if(!v(r)){n.push(`missing node file for ${o} (run kane-cli context rebuild)`);continue}try{let d=JSON.parse(S(r,"utf8"));(d.label!==e||j(d.label,d.content)!==o)&&n.push(`node file content mismatch for ${o} (run kane-cli context rebuild)`);for(let c of k(d.label,d.content))n.push(`${c.code}: ${o} ${c.detail}`)}catch{n.push(`corrupt node file for ${o} (run kane-cli context rebuild)`)}}return{ok:n.length===0,issues:n,records:t.length}}function R(s){return Array.isArray(s)?s.map(R):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).sort(([n],[t])=>n<t?-1:1).map(([n,t])=>[n,R(t)])):s}export{x as a,V as b,Z as c,Q as d};
@@ -0,0 +1,14 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as Ie,f as Te,g as Ue}from"./chunk-NWZTYAJB.js";import{a as Ce}from"./chunk-DM2GL24Z.js";import{a as Oe,b as Pe}from"./chunk-JFAFKHDX.js";import{e as L,f as re}from"./chunk-5ILXUQIX.js";import{c as Ee}from"./chunk-VJUIW2ES.js";import{b as Me,f as Fe,g as je,h as Be}from"./chunk-FXPPQL4D.js";import{b as Ae}from"./chunk-5446YVGQ.js";import{a as Ne}from"./chunk-Z56AWGVY.js";import{a as ee,d as te}from"./chunk-KHDUQ33H.js";import{a as E}from"./chunk-D5T4ARTB.js";import{b as Re}from"./chunk-B2PZAB7J.js";import{d as j}from"./chunk-IACKIGPX.js";import{appendFileSync as Qe,mkdirSync as fe,writeFileSync as ge}from"fs";import{extname as Ze,join as A}from"path";var O=class extends Error{code;constructor(e,c){super(`${e}: ${c}`),this.name="ProposalAdapterError",this.code=e}};function Ge(s){return s.version===2}function He(s,e){if(s.read_basis.length!==1)throw new O("READ_BASIS_COUNT",`read_basis must have exactly 1 element, got ${s.read_basis.length}`);let c=s.read_basis[0],h=s.use_cases.map(i=>{if(i.cite.length!==1)throw new O("CITE_COUNT",`${i.temp_ref}: cite must have exactly 1 element, got ${i.cite.length}`);let l=i.cite[0];if(l.source_id!==c.source_id)throw new O("SOURCE_MISMATCH",`${i.temp_ref}: cite source ${l.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:l.anchor,quote:l.quote},...i.criteria!=null&&i.criteria.length>0?{criteria:i.criteria.map((d,p)=>{if(d.cite.source_id!==c.source_id)throw new O("SOURCE_MISMATCH",`${i.temp_ref}.criteria[${p}]: 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}:{}}});return{version:1,read_basis:e,source:{source_id:c.source_id,source_cid:c.source_cid},use_cases:h}}function qe(s){let{contextDir:e,graph:c}=s,h=s.maxDigestBytes??4096,i={},l=[];for(let[u,m]of c.heads){if(i[u]=m,typeof m!="string")continue;let _=c.mediaOf(m),w=c.getNode(m)?.content?.blob;if(typeof w=="string")if(_.format==="image")l.push({source_id:u,cid:m,format:"image",blobRef:{path:ee(e,w),cid:w}});else{let n=te(e,w)?.toString("utf8")??"";l.push({source_id:u,cid:m,format:_.format,text:n})}}l.sort((u,m)=>u.source_id<m.source_id?-1:1);let d=[];for(let u of c.byLabel(j.STYLENOTE).sort((m,_)=>m.cid<_.cid?-1:1))c.superseded.has(u.cid)||d.push(`\u2022 ${String(u.content.statement)} [${String(u.content.learned_from_kind)}]`);let p="";for(let u of d){if(Buffer.byteLength(p+u+`
3
+ `,"utf8")>h)break;p+=u+`
4
+ `}return{read_basis:i,sources:l,styleNoteDigest:p}}function Le(s,e){let c=qe({contextDir:s,graph:e}).styleNoteDigest;return c.length>0?c:void 0}function et(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 tt(s){return s.toString("utf8").replace(/\n$/,"").split(`
5
+ `).map((c,h)=>`${String(h+1).padStart(4,"0")}| ${c}`).join(`
6
+ `)}function We(s){return s.toISOString().replace(/[-:]/g,"").slice(0,15)}function rt(s){return s.startsWith("su-conv-")?`conv-${Re(Buffer.from(s,"utf8")).slice(0,8)}`:s}function W(s){return s.toLowerCase().trim().replace(/\s+/g," ")}function ze(s,e){let c=new Map,h=new Map,i=new Map;for(let{cid:d,content:p}of e.byLabel(j.USECASE)){if(e.superseded.has(d))continue;(e.trust.get(d)==="archived"?i:h).set(W(String(p.title??"")),d)}let l=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 m=d.matches_existing.cid;if(e.superseded.has(m)){let _=e.tipOf(m);m=e.superseded.has(_)?null:_}if(m!==null){c.set(d.temp_ref,l(m));continue}}let p=h.get(W(d.title));if(p){c.set(d.temp_ref,{cid:p});continue}let u=i.get(W(d.title));u&&c.set(d.temp_ref,l(u))}return c}var Ve=/^(\S+)\.criteria\[(\d+)\]/;function st(s,e,c){if(e.length===0||!e.every(i=>Ve.test(i.detail)))return!1;let h=new Map;for(let i of e){let l=Ve.exec(i.detail),d=h.get(l[1])??new Set;d.add(Number(l[2])),h.set(l[1],d)}for(let i of s.use_cases){let l=h.get(i.temp_ref);l?.size&&(i.criteria=(i.criteria??[]).filter((d,p)=>!l.has(p)),c(`${i.temp_ref}: dropped ${l.size} criteria with unverifiable cites \u2014 committed without them (criteria are hints; P2 blast-radius rule)`))}return!0}async function Je(s,e,c,h,i=()=>{},l){let d=(p,u)=>i(p,u,s.session_id);return Te(s,e,c,h,i,{async onProposalEvent(p){let u=p,m=null,_=null;if(Ge(u))try{m=He(u,s.read_basis),d("adapter",{ok:!0,use_cases:m.use_cases.length})}catch(w){_=w instanceof O?w.message:String(w),d("adapter",{ok:!1,error:_})}else m=u;return m&&m.use_cases.length===0&&e.out("warning: the agent proposed ZERO use-cases for this source"),m&&l&&await l(m),{proposal:m,error:_}}})}var ot=new Set(["agent","ci","override"]);async function It(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(!ot.has(c))return e.out(`extract: unknown mode "${c}" \u2014 interactive | agent | ci | override`),2;let h=We(e.now?.()??new Date),i=A(e.contextDir,"logs");fe(i,{recursive:!0});let l=A(i,`extract-${h}.log`),d=`run-${h}-${Math.random().toString(36).slice(2,8)}`,p=t=>t==="error"||t==="failed_proposal"?"error":t==="repair_respawn"?"warn":"info",u=(t,a,x)=>{try{Qe(l,JSON.stringify({ts:new Date().toISOString(),level:p(t),run_id:d,...x?{session_id:x}:{},kind:t,data:a})+`
7
+ `)}catch{}};e.out(`trace: ${l}`),e.emit?.({type:"run_start",mode:c,trace:l});let m=Ae();if(m&&e.out(m),e.preflightTurn){let t=await e.preflightTurn();if(u("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 _=E(e.contextDir),w=Le(e.contextDir,_);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=_.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=Be(e.contextDir,s.resume,_)}catch(a){return e.out(`error: ${a instanceof Error?a.message:String(a)}`),e.emit?.({type:"error",message:`error: ${a instanceof Error?a.message:String(a)}`}),1}n.staleBasis.length>0&&e.out(`note: changed since the pause: ${n.staleBasis.join(", ")} \u2014 re-presented items may be stale`);let t=n.handle.state.held_receipts??[];if(t.length>0)if(e.chat?.holdReceipt)for(let a of t)e.chat.holdReceipt(a);else e={...e,initialMessage:[t.join(`
8
+
9
+ `),e.initialMessage].filter(Boolean).join(`
10
+
11
+ `)};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 pe=_.extractedSourceCids,z=!!(s.force||n?.handle.state.force),$=[],I=[];for(let[t,a]of _.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})`),I.push({source_id:t,reason:"conversation"});continue}if(n){let x=t in n.handle.state.read_basis,P=n.handle.state.corpus_cursor.remaining.includes(t);if(!x&&!P)continue;if(P&&!z&&pe.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),I.push({source_id:t,reason:"cached"});continue}}else if(!z&&pe.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),I.push({source_id:t,reason:"cached"});continue}$.push({source_id:t,cid:a})}if(e.emit?.({type:"corpus",sources:$,skipped:I}),$.length===0){if(n){let x=`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(x),e.emit?.({type:"error",message:x,code:"SOURCE_MISSING"}),n.handle.release(),2}let t=I.length>0&&I.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 V=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(Fe));for(let a of t)V.set(a.id,a)}let B=e.by??{kind:"human",id:"owner"},T=c==="interactive"&&!s.plan&&!!e.chat,he=0,_e=0;try{for(let t of $){let a=E(e.contextDir),x={current:a};e.chat?.attachOnCommitted?.(r=>{x.current=r});let P=a.getNode(t.cid),U=String(P?.content.blob??""),se=te(e.contextDir,U);if(!se)return e.out(`error: ${t.source_id}: blob ${U} missing from .context/blobs`),e.emit?.({type:"error",source_id:t.source_id,message:`error: ${t.source_id}: blob ${U} missing from .context/blobs`,code:"BLOB_MISSING"}),1;let xe=a.mediaOf(t.cid),oe=xe.media_type.startsWith("image/");if(!oe){let r=et(se);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 G=oe?`0001| (image source ${t.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:tt(se),ye=We(e.now?.()??new Date),M=`${ye}-${t.source_id}`,ve=!!(n&&t.source_id in n.handle.state.read_basis)?s.resume:`ext-${ye}-${rt(t.source_id)}`,N="";if(T){let r=Ee({contextDir:e.contextDir,graph:E(e.contextDir),sessionStamp:ve,by:B});r.errors===null||r.errors[0]?.code==="CONV_SOURCE_EXISTS"?(N=r.sourceId,e.chat.attachConversationSource?.(N),x.current=E(e.contextDir)):e.out(`warning: conversation source unavailable (${r.errors[0]?.detail}) \u2014 chat adds will not land this session`)}let b={type:"run_config",version:1,session_id:ve,mode:c,source:{source_id:t.source_id,source_cid:t.cid,kind:Ze(t.source_id)||"md",numbered_text:G},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:x.current.latestHash,max_free_text_rounds:Ie,graph_reads:!0,verb:"extract",...w!==void 0?{style_note_digest:w}:{},topology:Ne(),...T?{chat:!0}:{},...oe?{image_sources:[{source_id:t.source_id,source_cid:t.cid,media_type:xe.media_type,blob_ref:{path:ee(e.contextDir,U),cid:U}}]}:{},...n&&t.source_id in n.handle.state.read_basis?{resume:{agent_state:n.handle.state.agent_state}}:{}};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:$.indexOf(t)+1,total:$.length,resumed:!!(n&&t.source_id in n.handle.state.read_basis)}),e.chat?.ledger?.({kind:"banner",text:`source ${$.indexOf(t)+1}/${$.length} \xB7 ${t.source_id} @ ${t.cid.slice(0,19)}`}),e.chat?.setWorking?.(`extracting ${t.source_id}\u2026`);let $e=new Map;u("spawn",{source_id:t.source_id,source_cid:t.cid,resume:!!n,chat:T},b.session_id);let be=!1,Xe=async r=>{let o=L(r,G,E(e.contextDir));if(u("kane_validate",{errors:o.map(g=>g.code)},b.session_id),o.length>0){e.chat.submit("[auto-repair] the proposal failed validation: "+o.map(g=>`${g.code}: ${g.detail}`).join("; ")+" \u2014 please re-finalize with these fixed.");return}let y=E(e.contextDir),k=ze(r,y),Y=A(e.contextDir,"proposals",M);fe(Y,{recursive:!0}),ge(A(Y,"proposal.json"),JSON.stringify(r,null,2)+`
12
+ `);let Ke=new Map(r.use_cases.map(g=>[g.temp_ref,{resolution:"skipped"}])),K=re({contextDir:e.contextDir,graph:y,proposal:r,proposalId:M,verdicts:Ke,by:{kind:"ai",id:"extract-agent"},autoName:!0});if(K.errors){e.chat.ledger?.({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:K.errors.map(g=>`${g.code}: ${g.detail}`)});return}be=!0;let Q=K.record.nodes.length;he+=Q;let Z=r.use_cases.length-Q;{let g=E(e.contextDir),we=new Map;for(let{cid:v,content:R}of g.byLabel(j.USECASE))g.superseded.has(v)||we.set(W(String(R.title??"")),v);let me=[];for(let v of r.use_cases){let R=null;if(v.matches_existing?.cid&&g.hasNode(v.matches_existing.cid)){let q=g.tipOf(v.matches_existing.cid);R=g.superseded.has(q)?null:q}R=R??we.get(W(v.title))??null,R&&me.push({ref:v.temp_ref,cid:R})}me.length>0&&e.chat.registerAliases?.(me),x.current=g;let De=v=>{for(let[R,q]of g.names)if(q===v&&!g.superseded.has(q))return R},ke=Ce({verb:"extract",commitN:1,phase:"proposal",committed:K.record.nodes.map(v=>({cid:v.cid,...De(v.cid)?{logical_id:De(v.cid)}:{}})),reused:Z},g);e.emit?.(ke.event),e.chat.holdReceipt?.(ke.text)}u("commit",{derived:Q,evidence_matched:Z,chat:!0},b.session_id),e.chat.ledger?.({kind:"commit",ok:!0,line:`committed: ${Q} new use-case(s) as derived`+(Z>0?` \xB7 ${Z} matched existing (evidence attached, no duplicate)`:"")}),e.chat.note('chat to refine ("looks good" approves; "done" finishes)')},Se=!!(n&&t.source_id in n.handle.state.read_basis),J=Se&&V.size>0?{...e,ask:async r=>r.every(o=>V.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=>V.get(o.id))):e.ask(r)}:e;Se&&s.message&&(J={...J,initialMessage:s.message});let f=await Je(b,{...J,graphSlot:x},$e,a,u,T?Xe:void 0);if(e.chat?.setWorking?.(null),f.error)return e.out(`error: agent failed for ${t.source_id}: ${f.error}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: agent failed for ${t.source_id}: ${f.error}`}),1;if(f.highRisk)return e.out(`error: ${f.highRisk.length} high-risk decision${f.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): ${f.highRisk.map(r=>r.id).join(", ")}`,code:"HIGH_RISK_CI"}),1;if(f.paused){let r=$.slice($.indexOf(t)+1).map(Y=>Y.source_id),o=n?.handle??Me(e.contextDir,{sid:b.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:f.paused.agent_state,pending:{questions:[],proposals:[]},assumed:[],read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},conv_source:N,verb:"extract",...z?{force:!0}:{}});N&&o.state.conv_source!==N&&o.save({conv_source:N});let y=e.chat?.drainHeldReceipts?.()??[];(y.length>0||(o.state.held_receipts?.length??0)>0)&&o.save({held_receipts:y}),n?.handle&&o.save({read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},...z&&!o.state.force?{force:!0}:{}}),je(o,f.paused),u("session_paused",{sid:o.state.sid},b.session_id);let k=`kane-cli context extract --resume ${o.state.sid} --mode ${c}`;return e.out(`paused: session ${o.state.sid} saved \u2014 resume with: ${k}`),e.emit?.({type:"session_paused",sid:o.state.sid,source_id:t.source_id,mode:c,resume:k,expires_at:o.state.expires_at,pending_questions:f.paused.pending.questions}),e.chat?.ledger?.({kind:"pause",sid:o.state.sid,expires_at:o.state.expires_at,resume:k,messageForm:`${k} --message "<your words>"`}),3}if(T){if(_e+=f.assumedDefaults??0,f.error)return 1;if(!be){let r=$.length-$.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(!f.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 D=L(f.proposal,G,a);if(u("kane_validate",{errors:D.map(r=>r.code)},b.session_id),D.length>0&&st(f.proposal,D,r=>e.out(r))&&(u("criteria_dropped",{source_id:t.source_id},b.session_id),D=L(f.proposal,G,a)),D.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:D.map(r=>r.code),repairing:!0}),u("repair_respawn",{source_id:t.source_id},b.session_id),f=await Je(b,{...J,graphSlot:x},$e,a,u),f.error||!f.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(D=L(f.proposal,G,a),D.length>0){for(let r of D)e.out(` ${r.detail}`);return e.emit?.({type:"validate_failed",source_id:t.source_id,codes:D.map(r=>r.code),repairing:!1}),e.emit?.({type:"error",source_id:t.source_id,message:`error: proposal failed validation after repair (${D.map(r=>r.code).join(", ")})`}),1}}let S=f.proposal,X=ze(S,a),ie=A(e.contextDir,"proposals",M);if(fe(ie,{recursive:!0}),ge(A(ie,"proposal.json"),JSON.stringify(S,null,2)+`
13
+ `),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=X.get(r.temp_ref),y=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}${y}`)}e.emit?.({type:"plan",source_id:t.source_id,use_cases:S.use_cases.map(r=>{let o=X.get(r.temp_ref);return{risk:r.risk,title:r.title,anchor:r.cite.anchor,...o?{match:o.cid,match_archived:!!o.archived}:{}}})}),f.assumedDefaults&&e.out(`assumed: ${f.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(k=>a.resolve(k)!==null),y=r.conflicts_with.filter(k=>a.resolve(k)===null);y.length>0&&(e.out(`note: ${r.temp_ref}: dropped unresolvable conflict hint(s): ${y.join(", ")}`),r.conflicts_with=o.length>0?o:void 0)}u("review_start",{use_cases:S.use_cases.length,flags:X.size},b.session_id);let H=await e.review(S.use_cases,X);u("review_verdicts",[...H.entries()].map(([r,o])=>({ref:r,resolution:o.resolution})),b.session_id),ge(A(ie,"review.json"),JSON.stringify(S.use_cases.map(r=>{let o=H.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:B}}),null,2)+`
14
+ `);let ne=a,C=re({contextDir:e.contextDir,graph:ne,proposal:S,proposalId:M,verdicts:H,by:B,autoName:!0});if(C.errors&&C.errors[0]?.code==="STALE_BASIS"){if(!await e.confirmStale(`the context changed while you reviewed (${C.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;ne=E(e.contextDir),C=re({contextDir:e.contextDir,graph:ne,proposal:S,proposalId:M,verdicts:H,by:B,allowStaleBasis:!0,autoName:!0})}if(C.errors){for(let r of C.errors)e.out(` ${r.detail}`);return e.emit?.({type:"error",source_id:t.source_id,message:`error: commit failed: ${C.errors.map(r=>`${r.code}: ${r.detail}`).join("; ")}`}),1}let Ye=new Date().toISOString();for(let r of S.use_cases){let o=H.get(r.temp_ref)??{resolution:"skipped"};for(let y of Pe({ts:Ye,command:"context extract",id:r.temp_ref,by:B},o.resolution))Oe(e.contextDir,y)}let F=C.record,ae=new Map(F.review.map(r=>[r.id,r.resolution])),ce=[...ae.values()].filter(r=>r==="approved"||r==="edited").length,ue=[...ae.values()].filter(r=>r==="rejected").length,de=F.nodes.filter(r=>!ae.has(r.cid)).length,le=F.supersessions.filter(r=>r.kind==="node"&&r.new!==r.old).length;u("commit",{trusted:ce,derived:de,archived:ue},b.session_id),e.out(`committed: ${ce} trusted, ${de} derived (queued), ${ue} archived`+(le>0?`, ${le} superseded`:"")),f.assumedDefaults&&e.out(`assumed: ${f.assumedDefaults} default(s) auto-taken (flagged)`),e.emit?.({type:"commit",source_id:t.source_id,proposal_id:M,trusted:ce,derived:de,archived:ue,superseded:le,assumed:f.assumedDefaults??0,evidence_matched:Math.max(0,S.use_cases.length-F.nodes.length),minted:F.nodes.map(r=>{let o=F.names?.find(y=>y.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}),n=null)}}finally{n?.handle.release()}if(T){let t=e.chat?.state.ledger.filter(P=>P.kind==="answer"&&P.receipt.form==="assumed").length??0,a=_e+t,x=e.chat?.state.credits?.total;e.chat?.ledger?.({kind:"summary",lines:[`committed ${he} across ${$.length} source(s)`,...a>0?[`${a} assumed default(s)`]:[],...x!==void 0?[`credits used: ${x.toFixed(1)}`]:[],`trace: ${l}`]})}return s.plan||Ue(e.contextDir),0}export{rt as a,ze as b,It as c};
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as g}from"./chunk-IACKIGPX.js";import{createHash as E}from"crypto";function w(e){if(e===null)return"null";let r=typeof e;if(r==="string")return JSON.stringify(e.normalize("NFC"));if(r==="boolean")return e?"true":"false";if(r==="number"){if(!Number.isFinite(e))throw new Error("non-finite number is not canonicalizable");return JSON.stringify(e)}if(Array.isArray(e))return"["+e.map(n=>n===void 0?"null":w(n)).join(",")+"]";if(r==="object"){let n=e,s=new Map;for(let t of Object.keys(n)){if(n[t]===void 0)continue;let c=t.normalize("NFC");if(s.has(c))throw new Error(`canonicalization collision: NFC-equivalent duplicate key ${JSON.stringify(c)}`);s.set(c,n[t])}return"{"+[...s.keys()].sort((t,c)=>Buffer.compare(Buffer.from(t,"utf8"),Buffer.from(c,"utf8"))).map(t=>JSON.stringify(t)+":"+w(s.get(t))).join(",")+"}"}throw new Error("unsupported type for canonicalization: "+r)}function k(e){return E("sha256").update(e).digest("hex")}import{closeSync as $,existsSync as O,fsyncSync as x,mkdirSync as b,openSync as S,readFileSync as R,readdirSync as j,renameSync as F,rmSync as J,writeFileSync as _}from"fs";import{join as f}from"path";var a=class extends Error{};function v(e,r){if(e.schema_version!==void 0&&e.schema_version!==g)throw new a(`record ${r} is stamped ${e.schema_version}, this build reads ${g} \u2014 migrate explicitly`);if(e.parents!==void 0&&!(e.prev_hash===null?e.parents.length===0:e.parents.length===1&&e.parents[0]===e.prev_hash))throw new a(`record ${r}: parents does not mirror prev_hash \u2014 multi-parent records need a DAG-aware reader`)}function z(e){b(e,{recursive:!0});let r=f(e,".lock"),n=Date.now()+2e3;for(;;)try{let s=S(r,"wx");return _(s,`${process.pid}
3
+ `),$(s),()=>{try{J(r)}catch{}}}catch(s){if(s.code!=="EEXIST")throw s;if(Date.now()>n)throw new a(`.context is locked by another process \u2014 remove ${r} if that process is gone`);Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,25)}}var A=/^\d{6}-[0-9a-f]{12}\.json$/,p=e=>f(e,"commits");function y(e){return"sha256:"+k(Buffer.from(w(e),"utf8"))}function q(e){let r=p(e);return O(r)?j(r).filter(n=>A.test(n)).sort():[]}function T(e){let r=q(e),n=[],s=[],i=null;return r.forEach((t,c)=>{let d=R(f(p(e),t),"utf8"),o;try{o=JSON.parse(d)}catch(l){throw new a(`corrupt commit record ${t}: ${String(l)}`)}if(o.seq!==c+1)throw new a(`sequence gap: expected seq ${c+1}, ${t} has ${o.seq}`);if(o.prev_hash!==i)throw new a(`broken chain at ${t}: prev_hash ${String(o.prev_hash)} != ${String(i)}`);v(o,t);let m=y(o),h=t.slice(7,19);if(!m.slice(7).startsWith(h))throw new a(`tampered record ${t}: content hash ${m} does not match filename`);n.push(o),s.push(m),i=m}),{records:n,hashes:s}}function N(e){let r=q(e);if(r.length===0)return null;let n=r[r.length-1],s=R(f(p(e),n),"utf8"),i;try{i=JSON.parse(s)}catch(c){throw new a(`corrupt tail record ${n}: ${String(c)}`)}v(i,n);let t=y(i);if(!t.slice(7).startsWith(n.slice(7,19)))throw new a(`tampered tail record ${n}: content hash ${t} does not match filename`);if(i.seq!==r.length)throw new a(`sequence gap at tail: ${r.length} record files but tail seq is ${i.seq}`);return{seq:i.seq,hash:t}}function G(e){return N(e)?.hash??null}function V(e,r,n){let s=q(e);if(s.length<r)throw new a(`derived state is ahead of the record log (applied seq ${r}, ${s.length} records) \u2014 run kane-cli context rebuild`);let i=[],t=[],c=n;for(let d=r;d<s.length;d++){let o=s[d],m=R(f(p(e),o),"utf8"),h;try{h=JSON.parse(m)}catch(u){throw new a(`corrupt commit record ${o}: ${String(u)}`)}if(h.seq!==d+1)throw new a(`sequence gap: expected seq ${d+1}, ${o} has ${h.seq}`);if(h.prev_hash!==c)throw new a(`broken chain at ${o}: prev_hash ${String(h.prev_hash)} != ${String(c)}`);v(h,o);let l=y(h);if(!l.slice(7).startsWith(o.slice(7,19)))throw new a(`tampered record ${o}: content hash ${l} does not match filename`);i.push(h),t.push(l),c=l}return{records:i,hashes:t}}function X(e,r,n={}){let s=z(e);try{return B(e,r,n)}finally{s()}}function B(e,r,n){let s=N(e),i=(s?.seq??0)+1,t=s?.hash??null;if(n.expectPrev!==void 0&&n.expectPrev!==t)throw new a(`concurrent append detected: validated against ${String(n.expectPrev)} but the chain head is ${String(t)} \u2014 re-open and retry`);let c={seq:i,prev_hash:t,...r,schema_version:g,parents:t===null?[]:[t]},d=y(c),o=p(e);b(o,{recursive:!0});let m=`${String(i).padStart(6,"0")}-${d.slice(7,19)}.json`,h=f(o,m),l=h+".tmp",u=S(l,"w");try{_(u,JSON.stringify(c)+`
4
+ `),x(u)}finally{$(u)}F(l,h);try{let C=S(o,"r");x(C),$(C)}catch{}return{seq:i,hash:d,file:h,record:c}}export{w as a,k as b,a as c,T as d,G as e,V as f,X as g};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{join as o}from"path";var r=t=>o(t,".context");export{r as a};
@@ -0,0 +1,17 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as m}from"./chunk-L5LI2JF4.js";import{c as p}from"./chunk-MKD3KZPM.js";import{randomUUID as E}from"crypto";import{mkdirSync as F,writeFileSync as f,appendFileSync as O,existsSync as v}from"fs";import{join as u}from"path";import{writeFileSync as w,mkdirSync as x,existsSync as I}from"fs";import{join as h,relative as j}from"path";function _(n){let t=Object.keys(n.frontmatter).length>0?m(n.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${n.heading}`,""),n.steps.forEach((i,r)=>{s.push(`## Step ${r+1}`,i,"")}),s.join(`
3
+ `)}function C(n,e){let t={},s={},i=e;for(let[r,l]of Object.entries(n)){if(r.startsWith("global.")||r.startsWith("secrets.user.")||r.startsWith("environment.")){let o=r.startsWith("secrets.user.");t[r]={value:l.value,secret:o,syntax:`{{${r}}}`,type:o?"secret":r.startsWith("environment.")?"environment":"global"},s[r]=r;continue}if(l.secret){let o=`secrets.user.${r}`;t[o]={value:l.value,secret:!0,syntax:`{{secrets.user.${r}}}`,type:"secret"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{secrets.user.${r}}}`)}else{let o=`global.${r}`;t[o]={value:l.value,secret:!1,syntax:`{{global.${r}}}`,type:"global"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{global.${r}}}`)}}return{variables:t,objective:i,keyMap:s}}var y=/\{\{\s*(?:global|secrets\.user|environment)\.([^{}]+?)\s*\}\}/g;function c(n){return typeof n!="string"||!n.includes("{{")?n:n.replace(y,"{{$1}}")}function d(n){if(typeof n=="string")return c(n);if(Array.isArray(n))return n.map(e=>d(e));if(n&&typeof n=="object"){let e={};for(let[t,s]of Object.entries(n))e[t]=d(s);return e}return n}var L=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),N=new Set(["model","env"]),g=class{constructor(e){this.opts=e}objectives=[];flushed=!1;lastWrittenPath=null;lastCollisionSuffixed=!1;appendObjective(e){this.objectives.push(e)}flush(){if(this.flushed||(this.flushed=!0,this.objectives.length===0))return;let e=this.opts.getName();if(!e)return;let t=h(this.opts.cwd,".testmuai","tests");try{x(t,{recursive:!0})}catch(a){process.stderr.write(`
4
+ \u26A0 Failed to create ${j(this.opts.cwd,t)}/
5
+ ${a.message}
6
+ Your test recording was NOT saved.
7
+
8
+ `);return}let s=h(t,`${e}_test.md`),i=2,r=!1;for(;I(s);)s=h(t,`${e}-${i}_test.md`),i++,r=!0;let l=d($(this.opts.getResolvedGlobal())),o=_({frontmatter:l,heading:`Session: ${e}`,steps:this.objectives.map(c)});try{w(s,o,"utf8")}catch(a){process.stderr.write(`
9
+ \u26A0 Failed to save your test recording.
10
+ ${a.message}
11
+ Path: ${s}
12
+
13
+ `);return}this.lastWrittenPath=s,this.lastCollisionSuffixed=r}};function $(n){let e={};for(let[t,s]of Object.entries(n))L.has(t)||N.has(t)||(e[t]=s);return e}var A=u(p,"sessions"),b=class{sessionId;sessionDir;runs=[];_flows=[];_nextIndex=0;_started=!1;_testId=null;_testcaseId=null;_projectId=null;_orgId=null;_userName=null;_userEmail=null;_uploadStatus="pending";_uploadAttempts=0;_uploadError=null;_firstObjective=null;_firstUrl=null;_auteurVariables={};_screenshotSas=null;_model="";_environment="";_profile=null;_plan=null;_startedAt="";_remoteLogger=null;_earlyLogBuffer=[];_recorder=null;_resolvedGlobal={};_sessionName=null;_recordingEnabled=!0;_stepRunRecords=[];constructor(e){this.sessionId=E();let t=e?.baseDir?u(e.baseDir,"sessions"):A;this.sessionDir=u(t,this.sessionId)}setResolvedGlobal(e){this._resolvedGlobal={...this._resolvedGlobal,...e}}setSessionName(e){this._sessionName=e}get sessionName(){return this._sessionName}setRecordingEnabled(e){this._recordingEnabled=e}get recorder(){return this._recorder}flushRecorder(){try{this._recorder?.flush()}catch(e){process.stderr.write(`[recorder] flush failed: ${e.message}
14
+ `)}}start(e){if(!this._started){this._started=!0,this._model=e.model,this._environment=e.environment,this._profile=e.profile,this._startedAt=new Date().toISOString();try{F(this.sessionDir,{recursive:!0}),this._recorder=new g({cwd:process.cwd(),getResolvedGlobal:()=>this._resolvedGlobal,getName:()=>this._sessionName});let t={session_id:this.sessionId,started_at:this._startedAt,model:e.model,environment:e.environment,profile:e.profile,plan:this._plan,objectives:[],runs:[],status:"in_progress"};f(u(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
15
+ `)}catch{}this._log(`SESSION START session_id=${this.sessionId}`),this._log(`CONFIG model=${e.model} env=${e.environment} profile=${e.profile}`),this._earlyLogBuffer.push({level:"info",event:"SESSION_START",message:"Session started",context:{session_id:this.sessionId}},{level:"info",event:"CONFIG",message:"Session config",context:{model:e.model,environment:e.environment,profile:e.profile}})}}setPlan(e){this._plan=e;let t={level:"info",event:"SESSION_INFO",message:"Session info",context:{session_id:this.sessionId,plan:e??null}};this._remoteLogger?this._remoteLogger.log(t.level,t.event,t.message,t.context):this._earlyLogBuffer.push(t)}get plan(){return this._plan}setRemoteLogger(e){this._remoteLogger=e;for(let t of this._earlyLogBuffer)e.log(t.level,t.event,t.message,t.context);this._earlyLogBuffer=[]}get hasRemoteLogger(){return this._remoteLogger!==null}setAuteurVariables(e){Object.assign(this._auteurVariables,e)}get auteurVariables(){return this._auteurVariables}setScreenshotSas(e){this._screenshotSas=e}get screenshotSas(){return this._screenshotSas}get screenshotBaseUrl(){return this._screenshotSas?`${this._screenshotSas.base_url}/${this._screenshotSas.container}`:""}get startedAt(){return this._startedAt||new Date().toISOString()}log(e,t,s,i){if(t===void 0){this._log(e);let o=e.indexOf(" "),a=o>0?e.slice(0,o):e,R=o>0?e.slice(o+1):"",S=/fail|error/i.test(e)?"error":"info";this._remoteLogger?.log(S,a,R||e);return}let r=e,l=s;this._log(`${t} ${l}`,i),this._remoteLogger?.log(r,t,l,i)}logStep(e,t,s){this._log(`${e} ${t}`,s);let i=this._nextIndex>0?this._nextIndex-1:0;this._remoteLogger?.logStep(i,e,t,s)}logCommand(e){this._log(`COMMAND ${e}`)}logRunStart(e,t,s){this._log(`RUN ${e} START objective="${t.slice(0,100)}" url=${s}`),this._remoteLogger?.setRunIndex(e),this._remoteLogger?.log("info","RUN_START",`Run ${e} started`,{run_index:e,objective:t,url:s})}logRunEnd(e,t,s,i,r){let l=(s??0).toFixed(1),o=(i??"").slice(0,100),a=r==null||r===""||Number.isNaN(Number(r))?null:Number(r);this._log(`RUN ${e} END status=${t} duration=${l}s summary="${o}"`,a!=null?{result_code:a}:void 0),this._remoteLogger?.log("info","RUN_END",`Run ${e} ended`,{run_index:e,status:t,duration:s??0,summary:i??"",result_code:a}),t!=="failed"&&t!=="error"&&this._remoteLogger?.discardSteps(e)}escalateRun(e){this._remoteLogger?.escalate(e)}logChromeLaunch(e,t){this._log(`CHROME LAUNCH port=${e} endpoint=${t}`),this._remoteLogger?.log("info","CHROME_LAUNCH","Chrome launched",{port:e,cdp_endpoint:t})}async finish(e="complete"){this._log(`SESSION END status=${e} total_runs=${this.runs.length}`),this._remoteLogger?.log("info","SESSION_END","Session ended",{status:e,total_runs:this.runs.length}),await this._remoteLogger?.shutdown();let t={session_id:this.sessionId,started_at:this._startedAt,ended_at:new Date().toISOString(),model:this._model,environment:this._environment,profile:this._profile,plan:this._plan,status:e,total_runs:this.runs.length,test_id:this._testId,testcase_id:this._testcaseId,commit_id:this.sessionId,project_id:this._projectId,upload_status:this._uploadStatus,upload_attempts:this._uploadAttempts,last_upload_attempt:this._uploadAttempts>0?new Date().toISOString():null,upload_error:this._uploadError,runs:this.runs.map(s=>({index:s.index,objective:s.objective,status:s.status,summary:s.summary,run_dir:s.run_dir}))};v(this.sessionDir)&&f(u(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
16
+ `),this.flushRecorder(),this._recorder=null}nextRunIndex(){return this._nextIndex}addRunResult(e,t){this.runs.push(e),this._nextIndex+=t??1,this._recordingEnabled&&this._recorder?.appendObjective(e.objective)}getContext(){return{prior_runs:this.runs.map(e=>({index:e.index,objective:e.objective,summary:e.summary,status:e.status,memory:e.context.memory,variables:e.context.variables,pointer:e.context.pointer}))}}addFlow(e){let t={...e,index:this._flows.length+1};return this._flows.push(t),t}getFlows(){return[...this._flows]}getFlow(e){return this._flows.find(t=>t.index===e)}clearFlows(){this._flows=[]}recordStepRun(e){this._stepRunRecords.push(e)}getStepRunRecords(){return[...this._stepRunRecords]}getRunsAsStepRecords(){return this.runs.map((e,t)=>({testmdStepIndex:t+1,runIndex:e.index,totalRunDirs:e.run_dirs?.length??1}))}snapshot(){return{runsLen:this.runs.length,nextRunIndex:this._nextIndex,stepRunRecordsLen:this._stepRunRecords.length}}rollback(e){this.runs.length=e.runsLen,this._nextIndex=e.nextRunIndex,this._stepRunRecords.length=e.stepRunRecordsLen}setTestId(e){this._testId=e}get testId(){return this._testId}setTestcaseId(e){this._testcaseId=e}get testcaseId(){return this._testcaseId}setProjectId(e){this._projectId=e}setOrgId(e){this._orgId=e}get orgId(){return this._orgId}setUserIdentity(e,t){e&&(this._userName=e),t&&(this._userEmail=t)}get userName(){return this._userName}get userEmail(){return this._userEmail}setFirstRun(e,t){this._firstObjective||(this._firstObjective=e,this._firstUrl=t)}get firstObjective(){return this._firstObjective}get firstUrl(){return this._firstUrl}getRunDirs(){let e=[];for(let t of this.runs)t.run_dirs&&t.run_dirs.length>0?e.push(...t.run_dirs):t.run_dir&&e.push(t.run_dir);return e}getRunObjectives(){let e=[];for(let t of this.runs)t.flow_objectives&&t.flow_objectives.length>0?e.push(...t.flow_objectives):e.push(t.objective);return e}getRunMetadata(){let e=[];for(let t of this.runs)if(t.perFlowMetadata&&t.perFlowMetadata.length>0)e.push(...t.perFlowMetadata);else{let s={resultCode:t.resultCode,reasonCode:t.reasonCode,errorMessage:t.status==="failed"?t.summary??null:null,summary:t.summary,oneLiner:t.oneLiner},i=t.run_dirs?.length??1;for(let r=0;r<i;r++)e.push(s)}return e}setUploadStatus(e,t){this._uploadStatus=e,this._uploadAttempts+=1,this._uploadError=t??null}_log(e,t){if(!(!this._started||!v(this.sessionDir)))try{let s=new Date().toISOString().slice(0,19).replace("T"," "),i=u(this.sessionDir,"tui.log"),r=t&&Object.keys(t).length>0?` ${JSON.stringify(t)}`:"";O(i,`[${s}] ${e}${r}
17
+ `)}catch{}}};export{_ as a,C as b,b as c};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{x as o}from"./chunk-LRKWPAGK.js";import{a as m}from"./chunk-HCBYKLMW.js";import{a as e,b as i}from"./chunk-C44QQJR4.js";import{e as d}from"./chunk-UR6MHSHU.js";var r=d(m(),1),s={default:o.muted,error:o.red,success:o.green,info:o.orange,warning:o.orange};function h({title:t,titleColor:a,borderColor:l,variant:n="default",children:c,width:u,paddingX:x=2,paddingY:g=0,marginBottom:f=0}){let p=l??s[n],B=a??(n==="default"?o.orange:s[n]);return(0,r.jsxs)(e,{flexDirection:"column",marginBottom:f,children:[t&&(0,r.jsx)(e,{marginBottom:0,children:(0,r.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,r.jsx)(e,{borderStyle:"round",borderColor:p,flexDirection:"column",paddingX:x,paddingY:g,width:u,children:c})]})}function k({label:t,value:a,labelColor:l=o.dim,valueColor:n,labelWidth:c=14}){return(0,r.jsxs)(e,{children:[(0,r.jsx)(e,{width:c,flexShrink:0,children:(0,r.jsx)(i,{color:l,children:t})}),(0,r.jsx)(e,{flexShrink:1,children:(0,r.jsx)(i,{color:n,wrap:"wrap",children:a})})]})}function I({label:t}){return(0,r.jsx)(e,{marginTop:1,marginBottom:0,children:(0,r.jsx)(i,{bold:!0,children:t})})}export{h as a,k as b,I as c};
2
+ import{x as o}from"./chunk-MKD3KZPM.js";import{a as m}from"./chunk-HCBYKLMW.js";import{a as e,b as i}from"./chunk-C44QQJR4.js";import{e as d}from"./chunk-UR6MHSHU.js";var r=d(m(),1),s={default:o.muted,error:o.red,success:o.green,info:o.orange,warning:o.orange};function h({title:t,titleColor:a,borderColor:l,variant:n="default",children:c,width:u,paddingX:x=2,paddingY:g=0,marginBottom:f=0}){let p=l??s[n],B=a??(n==="default"?o.orange:s[n]);return(0,r.jsxs)(e,{flexDirection:"column",marginBottom:f,children:[t&&(0,r.jsx)(e,{marginBottom:0,children:(0,r.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,r.jsx)(e,{borderStyle:"round",borderColor:p,flexDirection:"column",paddingX:x,paddingY:g,width:u,children:c})]})}function k({label:t,value:a,labelColor:l=o.dim,valueColor:n,labelWidth:c=14}){return(0,r.jsxs)(e,{children:[(0,r.jsx)(e,{width:c,flexShrink:0,children:(0,r.jsx)(i,{color:l,children:t})}),(0,r.jsx)(e,{flexShrink:1,children:(0,r.jsx)(i,{color:n,wrap:"wrap",children:a})})]})}function I({label:t}){return(0,r.jsx)(e,{marginTop:1,marginBottom:0,children:(0,r.jsx)(i,{bold:!0,children:t})})}export{h as a,k as b,I as c};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{x as m}from"./chunk-LRKWPAGK.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
2
+ import{x as m}from"./chunk-MKD3KZPM.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d,e as f}from"./chunk-IACKIGPX.js";var G={high:3,med:2,low:1},R={create:0,evolve:1,"reuse-candidate":2},_=.75;function a(e,n){return!e.superseded.has(n)&&e.trust.get(n)!=="archived"}function m(e,n="med"){let t=e.risk;return t==="high"||t==="med"||t==="low"?t:n}function l(e,n){return e.nameOf.get(n)??n}function y(e,n){return`kane-cli design tests --use-case ${l(e,n)}`}function b(e,n){let t=e.edgesFrom(n).find(i=>i.type===f.SCOPED_TO&&a(e,i.dst));if(!t)return null;let s=e.nodeLabel.get(t.dst);if(s===d.USECASE)return t.dst;if(s===d.SCENARIO){let i=e.edgesFrom(t.dst).find(r=>r.type===f.BELONGS_TO&&a(e,r.dst));return i?i.dst:null}return null}function v(e,n){let t=b(e,n);return t?y(e,t):w(e,n)}function w(e,n){return`kane-cli design explain ${l(e,n)}`}function E(e,n){let t=e.edgesFrom(n).find(i=>i.type===f.AUTOMATES&&a(e,i.dst));if(!t)return null;let s=e.edgesFrom(t.dst).find(i=>i.type===f.BELONGS_TO&&a(e,i.dst));return s?s.dst:null}function S(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.AC))!a(e,t)||e.edgesInto(t).filter(r=>r.type===f.VERIFIES&&a(e,r.src)).length>0||n.push({ref:l(e,t),kind:"no-verifies",why:"no live test verifies this acceptance criterion",risk:m(s),stage:"design",tag:"create",ready_command:v(e,t)});return n}function h(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.USECASE)){if(!a(e,t))continue;let i=e.edgesInto(t).filter(o=>o.type===f.BELONGS_TO&&a(e,o.src));if(i.length===0){n.push({ref:l(e,t),kind:"zero-scenario",why:"use-case has no scenarios",risk:m(s),stage:"design",tag:"create",ready_command:y(e,t)});continue}i.every(o=>e.getNode(o.src)?.content.case_type==="happy")&&n.push({ref:l(e,t),kind:"happy-only",why:"use-case is exercised by happy-path scenarios only",risk:m(s),stage:"design",tag:"create",ready_command:y(e,t)})}return n}function x(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.GAP)){if(!a(e,t))continue;let i=s.ref,r=typeof i=="string"?e.resolve(i):null,o=r&&a(e,r.tip)?r.tip:null,u=o?e.nodeLabel.get(o):null,p=u===d.USECASE?y(e,o):u===d.AC?v(e,o):w(e,t),c=s.question&&typeof s.question=="object"?s.question:void 0,k=typeof s.text=="string"&&s.text||(c&&typeof c.header=="string"?c.header:"")||"design gap";n.push({ref:l(e,t),kind:String(s.kind),why:k,risk:m(s),stage:"design",tag:"create",ready_command:p,...typeof s.risk_rationale=="string"?{risk_rationale:s.risk_rationale}:{},...c?{question:c}:{}})}return n}function L(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.AC)){if(!a(e,t))continue;let i=e.stale(t);i==="fresh"||i==="superseded"||n.push({ref:l(e,t),kind:"stale-ac",why:`acceptance criterion is ${i} \u2014 its source moved since this was authored`,risk:m(s),stage:"design",tag:"evolve",ready_command:v(e,t)})}for(let{cid:t,content:s}of e.byLabel(d.TEST)){if(!a(e,t))continue;let i=e.stale(t);if(i==="fresh"||i==="superseded")continue;let r=e.edgesFrom(t).filter(g=>g.type===f.VERIFIES&&a(e,g.dst)),o=r.map(g=>m(e.getNode(g.dst)?.content??{})),u=o.includes("high")?"high":o.includes("med")?"med":o.includes("low")?"low":"med",p=r[0]?.dst??null,c=p?null:E(e,t),k=p?v(e,p):c?y(e,c):w(e,t);n.push({ref:l(e,t),kind:"stale-test",why:`test is ${i} \u2014 its source moved since this was authored`,risk:u,stage:"design",tag:"evolve",ready_command:k})}return n}async function C(e,n,t){for(let s of e)if(s.tag==="create"){if(!t){s.meta={embed_arm:"skipped"};continue}try{let i=n.resolve(s.ref),r=i?n.getNode(i.tip):null,o=r&&(String(r.content.title??"")||String(r.content.text??""))||s.why,u=r?.label===d.USECASE?"scenario":"test",c=(await t.searchSimilar(o,{label:u,k:1}))[0];c&&c.score>=_?(s.tag="reuse-candidate",s.meta={embed_arm:"used",near_hit:{ref:l(n,c.cid),score:c.score}}):s.meta={embed_arm:"used",near_hit:null}}catch{s.meta={embed_arm:"skipped"}}}}function O(e,n){let t=G[n.risk]-G[e.risk];if(t!==0)return t;let s=R[e.tag]-R[n.tag];return s!==0?s:e.ref<n.ref?-1:e.ref>n.ref?1:0}function A(e,n){let t=[],s=r=>{let o=e.resolve(r);return o&&!o.superseded?m(e.getNode(o.tip)?.content??{}):"med"},i=r=>{let o=e.resolve(r),u=o&&!o.superseded?b(e,o.tip):null;return u?l(e,u):r};for(let r of n.usecases??[])for(let o of r.acceptance_criteria??[])(o.covered_by??[]).length>0&&(o.execution==="failed"?t.push({ref:o.id,kind:"execution-failed",stage:"cover",tag:"evolve",risk:s(o.id),why:`covering test failed against this AC (tests: ${(o.covered_by??[]).join(", ")})`,ready_command:`kane-cli maintain evolve ${i(o.id)}`}):o.execution==="blocked"?t.push({ref:o.id,kind:"execution-blocked",stage:"cover",tag:"reuse-candidate",risk:s(o.id),why:"the oracle could not run (infrastructure) \u2014 the covering test exists and is reusable",ready_command:"kane-cli testrun run"}):o.execution==="not-run"&&t.push({ref:o.id,kind:"covered-not-run",stage:"cover",tag:"reuse-candidate",risk:s(o.id),why:"a covering test exists but never joined this pack \u2014 run it",ready_command:"kane-cli testrun run"}));return t}async function I(e,n,t,s){if(n!=="design"&&!s)throw new Error(`gaps-engine: stage "${n}" requires a pack's usecases doc`);let i=[];return(n==="design"||n==="all")&&i.push(...S(e),...h(e),...x(e),...L(e)),(n==="cover"||n==="all")&&i.push(...A(e,s)),await C(i,e,t),i.sort(O),i}export{I as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as c}from"./chunk-KKIFXAJY.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{u as s,v as a}from"./chunk-LRKWPAGK.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
2
+ import{a as c}from"./chunk-INP7FG6V.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{u as s,v as a}from"./chunk-MKD3KZPM.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as L,b as N}from"./chunk-AE6SS34N.js";import{c as G}from"./chunk-B2PZAB7J.js";import{e as _,g as v}from"./chunk-IACKIGPX.js";import{existsSync as k,readFileSync as q}from"fs";function J(a){let s=N(a),u=new Map(Object.entries(s.heads)),d=new Map(Object.entries(s.trust)),r=new Map(Object.entries(s.nodeLabel)),i=new Map(Object.entries(s.superseded)),g=new Map(Object.entries(s.names)),R=new Map(Object.entries(s.archivedReason)),I=new Set(s.appliedEvents),S=new Map(Object.entries(s.conv)),T=e=>s.media[e]??{format:"text",media_type:"text/plain",anchors_supported:["L-L"]},M=new Map;for(let[e,t]of g)M.set(t,e);let h=new Map,E=e=>{if(h.has(e))return h.get(e);if(!r.has(e))return h.set(e,null),null;let t=L(a,e);if(!k(t))throw new G(`derived node file missing for ${e} \u2014 run kane-cli context rebuild`);let n=JSON.parse(q(t,"utf8"));return h.set(e,n),n},m=e=>{let t=e,n=new Set;for(;i.has(t)&&!n.has(t);){n.add(t);let o=i.get(t);if(typeof o!="string")break;t=o}return t},x=e=>{let t=u.get(e),n=r.has(e)?e:g.get(e)??(typeof t=="string"?t:void 0);if(n===void 0||!r.has(n))return null;let o=m(n);return{cid:n,tip:o,superseded:i.has(n)||i.has(o)}},b=new Map;for(let e of Object.values(s.forward))for(let t of e){let n=b.get(t.dst);n?n.push(t):b.set(t.dst,[t])}let w=e=>(e??[]).filter(t=>!i.has(t.ecid)),C=e=>w(b.get(e)),O=e=>C(e).filter(t=>t.type===_.DERIVES),y=e=>w(s.forward[e]).some(t=>v(t.type)?.pin?.comparesTo==="dst_tip"&&i.has(t.dst)),F=e=>{if(i.has(e))return"superseded";let t=O(e);if(t.length===0)return y(e)?"stale":"fresh";let n=new Map;for(let p of t)n.set(p.props.source_id,p);let o=!1,f=!1;for(let[p,c]of n){let l=u.get(p);if(l!=null&&(o=!0,l!==c.props.source_cid)){let j=S.get(p)?.chain;(!j||!j.includes(c.props.source_cid))&&(f=!0)}}return o?f||y(e)?"stale":"fresh":"orphaned"};return{heads:u,trust:d,nodeLabel:r,superseded:i,names:g,nameOf:M,archivedReason:R,appliedEvents:I,convChains:S,mediaOf:T,extractedSourceCids:new Set(s.extracted),designOf:new Map(Object.entries(s.design_of??{})),latestHash:s.applied.hash,lastSeq:s.applied.seq,hasNode:e=>r.has(e),getNode:E,byLabel:e=>[...r.entries()].filter(([,t])=>t===e).map(([t])=>({cid:t,content:E(t)?.content??{}})),edgesFrom:e=>w(s.forward[e]),edgesInto:C,derivesInto:O,resolve:x,tipOf:m,stale:F,staleList:()=>[...r.keys()].map(e=>({cid:e,state:F(e)})).filter(e=>e.state!=="fresh"),execHistory:e=>{let t=x(e);if(!t)return[];let n=m(t.cid),o=new Set([n]),f=!0;for(;f;){f=!1;for(let[c,l]of i)l!==null&&o.has(l)&&!o.has(c)&&(o.add(c),f=!0)}let p=[];for(let c of Object.entries(s.exec??{}))o.has(c[0])&&p.push(...c[1]);return p.sort((c,l)=>c.started_at<l.started_at?-1:1)}}}function V(a,s){if(a.stale(s)!=="stale")return!1;let u=new Map;for(let d of a.derivesInto(s))u.set(d.props.source_id,d);for(let[d,r]of u){let i=a.heads.get(d);if(i==null||i===r.props.source_cid)continue;let g=a.convChains.get(d)?.chain;if(!g||!g.includes(r.props.source_cid))return!0}for(let d of a.edgesFrom(s)){if(v(d.type)?.pin?.comparesTo!=="dst_tip"||!a.superseded.has(d.dst))continue;let r=a.tipOf(d.dst);if(a.superseded.has(r)||a.nodeLabel.get(r)==="usecase")return!0}return!1}export{J as a,V as b};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as R}from"./chunk-HCBYKLMW.js";import{a as h,d as k}from"./chunk-C44QQJR4.js";import{a as A}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var e=p(A(),1);var a=p(R(),1),g=(0,e.createContext)(null),T=250;function C({children:d}){let[s,x]=(0,e.useState)([]),m=(0,e.useRef)(0),f=(0,e.useRef)([]),c=(0,e.useRef)(null),u=(0,e.useRef)(new Map),b=(0,e.useRef)(0),S=(0,e.useRef)(0);(0,e.useEffect)(()=>{for(let r=S.current;r<s.length;r++){let i=s[r];b.current=i.seq;let t=u.current.get(i.seq);if(t){u.current.delete(i.seq);for(let n of t)n()}}S.current=s.length},[s]),(0,e.useEffect)(()=>()=>{c.current&&clearTimeout(c.current)},[]);let P=(0,e.useMemo)(()=>{let r=()=>{c.current&&(clearTimeout(c.current),c.current=null);let t=f.current;t.length!==0&&(f.current=[],x(n=>[...n,...t]))},i=()=>{c.current||(c.current=setTimeout(()=>{c.current=null,r()},0))};return{append:(t,n)=>{let o=++m.current;if(n){let l=u.current.get(o)??[];l.push(n),u.current.set(o,l)}f.current.push({id:`sb-${o}`,seq:o,content:t}),i()},flush:()=>{r();let t=m.current;return t===0||b.current>=t?Promise.resolve():new Promise(n=>{let o=!1,l=()=>{o||(o=!0,clearTimeout(q),n())},q=setTimeout(l,T),v=u.current.get(t)??[];v.push(l),u.current.set(t,v)})}}},[]);return(0,a.jsxs)(g.Provider,{value:P,children:[s.length>0&&(0,a.jsx)(k,{items:s,children:r=>(0,a.jsx)(h,{children:r.content},r.id)}),d]})}function I(){let d=(0,e.useContext)(g);if(!d)throw new Error("useScrollback must be used within a ScrollbackProvider. Wrap this Ink render() root in <ScrollbackProvider>. Never render <Static> directly \u2014 push via append().");return d}export{C as a,I as b};
@@ -0,0 +1,3 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as u}from"./chunk-6PS65QFF.js";function g(t,e){return t.byLabel(e).filter(({cid:n})=>!t.superseded.has(n)&&t.trust.get(n)!=="archived")}function f(t,e,n){for(let[a,c]of t.names)if(c===e&&!t.superseded.has(c))return a;return String(n.title??n.text??e)}function v(t,e){let n=g(t,"scenario");if(e){let i=t.resolve(e);if(i){let s=new Set([i.cid,i.tip,t.tipOf(i.cid)]);n=n.filter(({cid:o})=>t.edgesFrom(o).some(d=>d.type==="belongs_to"&&(s.has(d.dst)||s.has(t.tipOf(d.dst)))))}}let a=new Set;for(let{cid:i}of n)a.add(i),a.add(t.tipOf(i));let c=g(t,"test").filter(({cid:i})=>!e||t.edgesFrom(i).some(s=>s.type==="automates"&&(a.has(s.dst)||a.has(t.tipOf(s.dst))))),r=new Set;for(let i of c)for(let s of t.edgesFrom(i.cid))s.type==="automates"&&r.add(t.tipOf(s.dst));let m=n.filter(({cid:i})=>!r.has(i)&&!r.has(t.tipOf(i))).map(({cid:i,content:s})=>f(t,i,s));return{live_scenarios:n.length,live_tests:c.length,missing:m}}function l(t){return t.length<=12?t.join(", "):`${t.slice(0,12).join(", ")} +${t.length-12} more`}function b(t,e){let n=t.committed.length===0?"committed: nothing new":`committed: ${l(t.committed.map(o=>o.temp_ref?`${o.temp_ref} \u2192 ${o.logical_id??o.cid}`:o.logical_id??o.cid))}`,a=[];t.reused&&a.push(`reused: ${t.reused}`),t.rejected?.length&&a.push(`rejected: ${l(t.rejected.map(o=>`${o.ref} (${o.reason})`))}`),t.warnings?.length&&a.push(`warnings: ${l(t.warnings)}`);let c=[`RECEIPT (commit ${t.commitN}, ${t.phase})`,n,...a],r,m;if(t.verb==="design")r=v(e,t.ucRef),c.push(`parity: ${r.live_scenarios} scenario(s) live \xB7 ${r.live_tests} test(s) live`+(r.missing.length?` \xB7 missing tests: ${l(r.missing)}`:"")),m=r.missing.length>0?`next: emit tests for the ${r.missing.length} scenario(s) listed \u2014 1:1, strict. Never re-emit committed items; reference them by the ids above.`:"next: every live scenario has a test. Address open gaps, or finish.";else{let o=g(e,"usecase").length;c.push(`parity: ${o} use-case(s) live`),m="next: refine via chat ops using the ids above. Never re-emit committed items."}c.push(m);let i=c.join(`
3
+ `);for(;Buffer.byteLength(i,"utf8")>6e3;)i=i.slice(0,Math.floor(i.length*.9))+"\u2026";let s={type:"receipt",verb:t.verb,commit_n:t.commitN,phase:t.phase,committed:t.committed,reused:t.reused??0,rejected:t.rejected??[],warnings:t.warnings??[],...r?{parity:{live_scenarios:r.live_scenarios,live_tests:r.live_tests,missing:r.missing}}:{},next:m};return{text:i,event:s}}function A(){return{currentAttempt:null,liveThinking:"",thinkingLog:[],activity:[]}}var p={dedup_candidate:"checking a possible duplicate",ambiguity:"asking to resolve an ambiguity",validation_repair:"repairing a validation failure",finalize:"finalizing the proposal"};function h(t){return p[t.reason_code]??t.reason_code.replace(/_/g," ")}function y(t){let e=u({name:t.name});return t.status==="started"?`\u2192 ${e}\u2026`:t.status==="error"||t.status==="aborted"?`\u2717 ${e}`:`\u2713 ${e}`}function _(t,e){return e.turn_id!==t.turn_id?e.turn_id<t.turn_id:e.attempt<t.attempt}function x(t,e){let n=t.currentAttempt;if(n===null||n.turn_id!==e.turn_id||n.attempt!==e.attempt){if(n!==null&&_(n,e))return t;t={...t,currentAttempt:{turn_id:e.turn_id,attempt:e.attempt},liveThinking:""}}switch(e.type){case"reasoning_delta":return{...t,liveThinking:t.liveThinking+e.text};case"reasoning_done":return e.present?{...t,thinkingLog:[...t.thinkingLog,{text:t.liveThinking,tookMs:e.took_ms}],liveThinking:""}:{...t,liveThinking:""};case"tool_activity":return{...t,activity:[...t.activity,{name:e.name,status:e.status,label:y(e)}]};case"decision_activity":return{...t,activity:[...t.activity,{name:e.action,status:"decision",label:h(e)}]}}}export{b as a,A as b,h as c,x as d};
@@ -0,0 +1,6 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as b}from"./chunk-C5NNT7Y3.js";import{x as l}from"./chunk-MKD3KZPM.js";import{a as f}from"./chunk-HCBYKLMW.js";import{a as m,b as s}from"./chunk-C44QQJR4.js";import{e as p}from"./chunk-UR6MHSHU.js";var u=p(f(),1),T=5;function _({thinking:t,expanded:e,thinkingDone:o,maxLines:i=T}){if(!e)return(0,u.jsxs)(m,{paddingX:1,children:[(0,u.jsx)(s,{color:l.dim,children:o?"\u2237 thinking complete ":"\u2237 thinking\u2026 "}),(0,u.jsx)(s,{color:l.muted,children:o?"(ctrl+t to view)":"(ctrl+t to show)"})]});let g=t.split(`
3
+ `),n=Math.max(0,g.length-i),a=n>0?g.slice(-i).join(`
4
+ `):t;return(0,u.jsxs)(b,{variant:"default",paddingX:1,children:[n>0&&(0,u.jsxs)(s,{color:l.muted,children:["\u22EE (",n," earlier line",n===1?"":"s"," hidden)"]}),(0,u.jsx)(s,{color:l.dim,children:a}),o&&(0,u.jsx)(s,{color:l.muted,children:"\u2014 thinking complete"})]})}function k(t){let e=t;return e=e.replace(/@TS\{([^}]+)\}/g,"@S{$1}"),e=e.replace(/@TS-(\d+)/g,(o,i)=>`@S${parseInt(i,10)}.C1`),e=e.replace(/@TS(\d+)/g,(o,i)=>`@S${parseInt(i,10)}`),e=e.replace(/\\n/g,`
5
+ `),e}var c=p(f(),1),B=t=>t!==void 0&&/[A-Za-z0-9]/.test(t);function x(t){let e=[],o="",i=()=>{o&&(e.push({text:o}),o="")},g=(a,d,r)=>(a===0||!B(t[a-1]))&&(d+r>=t.length||!B(t[d+r])),n=0;for(;n<t.length;){let a=t.slice(n,n+2),d=t[n];if(a==="**"||a==="__"){let r=t.indexOf(a,n+2);if(r!==-1&&r>n+2&&(a==="**"||g(n,r,2))){i(),e.push({text:t.slice(n+2,r),bold:!0}),n=r+2;continue}}if(d==="`"){let r=t.indexOf("`",n+1);if(r!==-1&&r>n+1){i(),e.push({text:t.slice(n+1,r),code:!0}),n=r+1;continue}}if(d==="*"||d==="_"){let r=t.indexOf(d,n+1);if(r!==-1&&r>n+1&&(d==="*"||g(n,r,1))){i(),e.push({text:t.slice(n+1,r),italic:!0}),n=r+1;continue}}o+=d,n+=1}return i(),e.length===0&&e.push({text:""}),e}function h(t){return t.map((e,o)=>(0,c.jsx)(s,{bold:e.bold,italic:e.italic,color:e.code?l.dim:void 0,children:e.text},o))}function S(t){return t.split(`
6
+ `).map(e=>{if(e.trim()==="")return{kind:"blank"};let o=e.match(/^\s*[-*+]\s+(.*)$/);if(o)return{kind:"bullet",segs:x(o[1])};let i=e.match(/^\s*(\d+)\.\s+(.*)$/);if(i)return{kind:"numbered",n:i[1],segs:x(i[2])};let g=e.match(/^#{1,6}\s+(.*)$/);return g?{kind:"heading",segs:x(g[1])}:{kind:"para",segs:x(e)}})}function R(t,e,o=""){switch(t.kind){case"blank":return(0,c.jsx)(s,{children:o||" "},e);case"heading":return(0,c.jsxs)(s,{bold:!0,children:[o,h(t.segs)]},e);case"bullet":return(0,c.jsx)(m,{marginLeft:1,children:(0,c.jsxs)(s,{children:[o,"\u2022 ",h(t.segs)]})},e);case"numbered":return(0,c.jsx)(m,{marginLeft:1,children:(0,c.jsxs)(s,{children:[o,`${t.n}. `,h(t.segs)]})},e);default:return(0,c.jsxs)(s,{children:[o,h(t.segs)]},e)}}function E({text:t}){let e=S(k(t));return(0,c.jsxs)(m,{marginBottom:1,children:[(0,c.jsx)(s,{color:l.generateAccent,children:"\u2503 "}),(0,c.jsx)(m,{flexDirection:"column",children:e.map((o,i)=>R(o,i))})]})}export{E as a,_ as b};
@@ -0,0 +1,17 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as m}from"./chunk-2WVKOZ6W.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as g}from"./chunk-INP7FG6V.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new m(g(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
3
+
4
+ discover IDs:
5
+ kane-cli projects list --search "<keyword>" --limit 10
6
+ kane-cli folders list --project <project-id> --search "<keyword>" --limit 10
7
+
8
+ create one:
9
+ kane-cli projects create "<project-name>"
10
+ kane-cli folders create "<folder-name>" --project <project-id>
11
+
12
+ set them:
13
+ kane-cli config project <project-id>
14
+ kane-cli config folder <folder-id>
15
+ `;function C(e,r){return k(e,r)}function D(e){return`info: auto-configured project "${e.projectName}" (${e.projectId}) and folder "${e.folderName}" (${e.folderId}). Change with: kane-cli config project <id> / kane-cli config folder <id>.`}function S(e){return`${JSON.stringify(T(e))}
16
+ `}function T(e){return{type:"project_folder_auto_defaulted",project_id:e.projectId,project_name:e.projectName,folder_id:e.folderId,folder_name:e.folderName}}async function x(e){if(e.isLocal)return e.log("info","GATE_SKIP_LOCAL","Gate skipped (--local)",{}),{status:"skip",reason:"local"};j(e.creds,e.config,e.profile,e.env,e.log);let r=A(e.creds,e.profile,e.env),d=null;if(r.projectId!==null){let o=g(e.env);d=await new m(o.tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key).validateProjectFolder(r.projectId,r.folderId??""),e.log("info","GATE_VALIDATE","TMS project/folder validation",{project:d.project,folder:d.folder,folder_was_cached:r.folderId!==null})}else r.folderId!==null&&(f(e.creds,e.config,e.profile,e.env,{folderId:null,folderName:null}),e.log("warn","GATE_CLEARED_ORPHAN_FOLDER","Cleared orphan folder (no project cached)",{folder_id:r.folderId}),r.folderId=null);let n=N(r,d);if(n==="ok")return{status:"ok",projectId:r.projectId,folderId:r.folderId};if(n==="ok-tms-degraded")return e.log("warn","GATE_TMS_DEGRADED","TMS validation failed; using cached IDs",{project_id:r.projectId,folder_id:r.folderId}),{status:"ok",projectId:r.projectId,folderId:r.folderId};if(d){let o={};d.project==="missing"?(o.projectId=null,o.projectName=null,o.folderId=null,o.folderName=null):d.folder==="missing"&&(o.folderId=null,o.folderName=null),Object.keys(o).length>0&&(f(e.creds,e.config,e.profile,e.env,o),e.log("info","GATE_CLEARED_STALE","Cleared stale cached IDs before re-resolve",{project_cleared:d.project==="missing",folder_cleared:d.folder==="missing"||d.project==="missing"}))}try{let o=await p({creds:e.creds,config:e.config,profile:e.profile,env:e.env,tmsCreds:e.tmsCreds,log:e.log}),t={projectId:o.projectId,projectName:o.projectName,folderId:o.folderId,folderName:o.folderName};return e.log("info","GATE_AUTO_DEFAULTED","Auto-configured project/folder",{project_id:t.projectId,project_name:t.projectName,folder_id:t.folderId,folder_name:t.folderName}),e.onAnnounce?e.onAnnounce(t):process.stderr.write(`${D(t)}
17
+ `),{status:"ok",projectId:t.projectId,folderId:t.folderId,autoDefaulted:t}}catch(o){let t=C(e.profile,e.env);if(e.log("error","GATE_FATAL","Auto-default failed",{profile:e.profile,env:e.env,cached_project_id:r.projectId,cached_folder_id:r.folderId,validation:d,error:o instanceof Error?o.message:String(o)}),e.onFatalExit)e.onFatalExit(t);else{process.stderr.write(t);let{shutdown:s}=await import("./exit-manager-VCSIUYBR.js");s(2,"Project/folder gate failed")}return{status:"cancelled"}}}export{p as a,A as b,N as c,C as d,D as e,S as f,T as g,x as h};
@@ -0,0 +1,6 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{existsSync as f,mkdirSync as C,readFileSync as S,readdirSync as T,renameSync as y,rmSync as m,writeFileSync as P,openSync as H,closeSync as F}from"fs";import{randomBytes as K}from"crypto";import{join as w}from"path";var d=class extends Error{constructor(t,r){super(`${t}: ${r}`);this.code=t}},D=1440*60*1e3,J=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,v=e=>w(e,"sessions"),h=(e,n)=>w(v(e),n),l=(e,n)=>w(h(e,n),"state.json"),_=(e,n)=>w(h(e,n),".lock"),N=e=>(e?.now??(()=>new Date))();function L(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(n){return n.code==="EPERM"}}function E(e,n){let t=`${e}.tmp-${process.pid}`;P(t,n,{mode:384}),y(t,e)}function b(e,n,t,r=0){if(r>20)throw new d("SESSION_LOCKED",`${n}: lock contention did not settle`);let o=_(e,n),s=K(8).toString("hex"),a=JSON.stringify({pid:process.pid,ts:t.toISOString(),nonce:s})+`
3
+ `;try{let i=H(o,"wx",384);return P(i,a),F(i),s}catch(i){if(i.code!=="EEXIST")throw i;let p=!1,u;try{let c=JSON.parse(S(o,"utf8")),O=t.getTime()-new Date(c.ts).getTime();p=!L(c.pid)||O>=D,u=c.nonce}catch{p=!0}if(!p)throw new d("SESSION_LOCKED",`${n} is held by another live process`);let g=`${o}.break-${s}`;try{y(o,g);let c;try{c=JSON.parse(S(g,"utf8"))}catch{c=null}if(c===null||c.nonce===u)m(g,{force:!0});else try{y(g,o)}catch{m(g,{force:!0})}}catch(c){if(c.code!=="ENOENT")throw c}return b(e,n,t,r+1)}}function A(e,n,t,r,o){let s=()=>{try{if(JSON.parse(S(_(e,n),"utf8")).nonce!==r)throw new d("SESSION_LOCK_LOST",`${n} lock was taken over`)}catch(i){throw i instanceof d?i:new d("SESSION_LOCK_LOST",`${n} lock file unreadable/gone`)}},a=()=>E(l(e,n),JSON.stringify(t)+`
4
+ `);return{get state(){return t},isApplied:i=>t.applied_events.includes(i),markApplied(i){s(),t={...t,applied_events:[...new Set([...t.applied_events,...i])].sort()},a()},save(i){s();let{agent_state:p,pending:u,assumed:g,read_basis:c,corpus_cursor:O,expires_at:x,force:k,conv_source:I,held_receipts:R,force_scope:$}=i;t={...t,...p!==void 0?{agent_state:p}:{},...u!==void 0?{pending:u}:{},...g!==void 0?{assumed:g}:{},...c!==void 0?{read_basis:c}:{},...O!==void 0?{corpus_cursor:O}:{},...x!==void 0?{expires_at:x}:{},...k!==void 0?{force:k}:{},...I!==void 0?{conv_source:I}:{},...R!==void 0?{held_receipts:R}:{},...$!==void 0?{force_scope:$}:{}},a()},complete(){s(),m(h(e,n),{recursive:!0,force:!0})},release(){try{s(),m(_(e,n),{force:!0})}catch(i){if(i instanceof d||i.code==="ENOENT")return;throw i}}}}function X(e,n,t){if(!J.test(n.sid))throw new d("SESSION_MISSING",`bad sid ${JSON.stringify(n.sid)}`);let r=N(t);if(f(l(e,n.sid)))throw new d("SESSION_LOCKED",`${n.sid} already exists \u2014 resume it`);C(h(e,n.sid),{recursive:!0,mode:448});let o=b(e,n.sid,r),s={schema:1,applied_events:[],...n};return E(l(e,n.sid),JSON.stringify(s)+`
5
+ `),A(e,n.sid,s,o,t)}function Q(e,n,t){if(!J.test(n)||!f(l(e,n)))throw new d("SESSION_MISSING",`no session ${n}`);let r=N(t),o=b(e,n,r),s=JSON.parse(S(l(e,n),"utf8"));if(new Date(s.expires_at).getTime()<=r.getTime())throw m(_(e,n),{force:!0}),new d("SESSION_EXPIRED",`${n} expired at ${s.expires_at}`);let a={...s,expires_at:new Date(r.getTime()+D).toISOString()};return E(l(e,n),JSON.stringify(a)+`
6
+ `),A(e,n,a,o,t)}function z(e,n){let t=l(e,n);return f(t)?JSON.parse(S(t,"utf8")):null}function Z(e){let n=v(e);if(!f(n))return[];let t=[];for(let r of T(n)){let o=l(e,r);if(f(o))try{let s=JSON.parse(S(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:r,mode:"?",created_at:"",expires_at:"",pendingCount:0,corrupt:!0})}}return t.sort((r,o)=>r.created_at<o.created_at?-1:1)}function W(e,n){let t=N(n),r=[],o=[],s=v(e);if(!f(s))return{removed:r,skipped:o};for(let a of T(s)){if(n?.sid&&a!==n.sid)continue;let i=!1,p=!1;try{let u=JSON.parse(S(l(e,a),"utf8"));i=new Date(u.expires_at).getTime()<=t.getTime()}catch{p=!0}if(n?.sid||n?.all||i||p&&n?.all){try{let u=JSON.parse(S(_(e,a),"utf8"));if(L(u.pid)&&u.pid!==process.pid){o.push({sid:a,reason:`in use by live pid ${u.pid}`});continue}}catch{}m(h(e,a),{recursive:!0,force:!0}),r.push(a)}}return{removed:r,skipped:o}}function Y(e){return{id:e.id,text:e.question,risk:["high","med","low"].includes(e.risk)?e.risk:"med",rationale:e.rationale,options:e.options.map(n=>({label:n.label,detail:n.description??""})),recommended_index:e.recommendedOptionIndex,allow_free_text:e.allowFreeText,kind:e.kind,consequence:e.consequence,evidence_count:e.evidence_count,multi_select:e.multiSelect}}function j(e){return{id:e.id,header:e.kind??"question",question:e.text,kind:e.kind??"clarify",multiSelect:e.multi_select??!1,options:e.options.map((n,t)=>({id:`o${t}`,label:n.label,description:n.detail||void 0})),recommendedOptionIndex:e.recommended_index,risk:e.risk,rationale:e.rationale,consequence:e.consequence??"",evidence_count:e.evidence_count,allowFreeText:e.allow_free_text}}function q(e,n){e.save({agent_state:n.agent_state,pending:{questions:n.pending.questions.map(j),proposals:n.pending.proposals??[]},assumed:n.assumed.map(t=>({questionId:t.question_id,optionId:t.option_id,flagged:!0,eventId:`assumed:${n.sid}:${t.question_id}`}))}),e.release()}function ee(e,n,t){let r=Q(e,n),o=[];for(let[a,i]of Object.entries(r.state.read_basis))(t.heads.get(a)??null)!==i&&o.push(a);let s=r.state.pending.questions.filter(a=>!r.isApplied(`resolveq:${n}:${a.id}`)&&!r.isApplied(`assumed:${n}:${a.id}`));return{handle:r,represent:[...r.state.pending.proposals],questions:s,staleBasis:o}}export{d as a,X as b,z as c,Z as d,W as e,Y as f,q as g,ee as h};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{c as h}from"./chunk-NFOBDHZK.js";import{a as y,b as v}from"./chunk-L5LI2JF4.js";import{randomUUID as k,randomBytes as D}from"crypto";import{promises as i}from"fs";import{join as c}from"path";function p(t=process.cwd()){return c(t,".testmuai","evidence")}function b(t,e=process.cwd()){return c(p(e),`${t}.evidence`)}function W(){return k()}var S=/\.evidence\.tmp-(\d+)-[0-9a-f]+$/;async function _(t,e,r=process.cwd()){let n=p(r);await i.mkdir(n,{recursive:!0});let o=b(e,r),a=c(n,`${e}.evidence.tmp-${process.pid}-${D(6).toString("hex")}`);return await i.copyFile(t,a),await i.rename(a,o),o}async function I(t=process.cwd()){let e=p(t),r;try{r=await i.readdir(e)}catch{return[]}return r.filter(n=>n.endsWith(".evidence")).sort().map(n=>c(e,n))}async function L(t,e=process.cwd()){if(await P(t))return t;let r=b(t,e);return await P(r)?r:null}async function P(t){try{return await i.stat(t),!0}catch{return!1}}function E(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function M(t=process.cwd(),e=E){let r=p(t);await h(r).catch(()=>({restored:[],removed:[]}));let n=[],o=[],a;try{a=await i.readdir(r,{withFileTypes:!0})}catch{return{aborted:n,removed:o}}for(let u of a){let d=u.name.match(S);if(d){let g=Number(d[1]);if(Number.isFinite(g)&&e(g))continue;let w=c(r,u.name);await i.rm(w,{force:!0}),o.push(w);continue}if(!u.isDirectory()||!u.name.endsWith(".evidence"))continue;let m=c(r,u.name),f=c(m,"run.yaml"),s;try{s=y(await i.readFile(f,"utf8"))}catch{continue}if(s?.status!=="running")continue;let l=s?.environment?.pid;if(typeof l=="number"&&e(l))continue;let x=s?.environment?.saved===!0;s?.environment?.origin==="inline"&&!x?(await i.rm(m,{recursive:!0,force:!0}),o.push(m)):(s.status="aborted",await i.writeFile(f,v(s,{lineWidth:-1})),n.push(m))}return{aborted:n,removed:o}}export{p as a,b,W as c,_ as d,I as e,L as f,M as g};