@testmuai/kane-cli 0.6.6 → 0.6.8

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 (187) hide show
  1. package/dist/ChatSurface-QLRMFZJG.js +8 -0
  2. package/dist/{ChromeProfilePicker-6PLUQ5TW.js → ChromeProfilePicker-FJOUNY2B.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-I4F56IVK.js → CliFeedbackPrompt-HC4NNBTK.js} +1 -1
  4. package/dist/{CliUploadProgress-ULRSPKY3.js → CliUploadProgress-VIEZQNZ5.js} +1 -1
  5. package/dist/{ConfigView-7NMYALEA.js → ConfigView-LK5F4F7W.js} +1 -1
  6. package/dist/EvidenceViewOffer-HZ4WZKGM.js +2 -0
  7. package/dist/{FolderPicker-4IOVDO2P.js → FolderPicker-3S57MSC6.js} +1 -1
  8. package/dist/{HelpView-SHMVMHNU.js → HelpView-BQ3TS7WE.js} +1 -1
  9. package/dist/{InfoBox-W2LZVGQS.js → InfoBox-4HVXV3TD.js} +1 -1
  10. package/dist/{LinksBox-ZS25VTBY.js → LinksBox-3B2KO5S4.js} +1 -1
  11. package/dist/{ProfilesView-XBBRIQ3U.js → ProfilesView-FLRMROUR.js} +1 -1
  12. package/dist/{ProjectPicker-AUN47FXS.js → ProjectPicker-R3KLRGHH.js} +1 -1
  13. package/dist/{SaveSessionPrompt-Z2K225VN.js → SaveSessionPrompt-P7HSG7R7.js} +1 -1
  14. package/dist/SingleShotApp-ZBZY7KGR.js +2 -0
  15. package/dist/{SummaryBox-4T545XRB.js → SummaryBox-HCDIWKPS.js} +1 -1
  16. package/dist/TestMdRunView-GQP2QGFU.js +2 -0
  17. package/dist/{WhoamiView-GCVD35EX.js → WhoamiView-ZD6FIBMK.js} +1 -1
  18. package/dist/{bind-JLMT57Q3.js → bind-RSVQXQJT.js} +2 -2
  19. package/dist/{bridge-PDJEOSAJ.js → bridge-D2HETW5M.js} +1 -1
  20. package/dist/{changelog-D65HWZDM.js → changelog-QB7S4VV4.js} +1 -1
  21. package/dist/chat-committer-MWZ4JQMM.js +2 -0
  22. package/dist/chat-controller-YX5A7R52.js +2 -0
  23. package/dist/{chunk-BLSZ4H5W.js → chunk-27GF2OQ7.js} +3 -3
  24. package/dist/chunk-35RV2AAV.js +12 -0
  25. package/dist/{chunk-MSPZOEFB.js → chunk-3BIEIXJK.js} +1 -1
  26. package/dist/chunk-4GXOBABK.js +4 -0
  27. package/dist/chunk-5VC7MBHR.js +2 -0
  28. package/dist/{chunk-MY32TBBR.js → chunk-66LXV7NN.js} +1 -1
  29. package/dist/chunk-6WHKJSMJ.js +6 -0
  30. package/dist/{chunk-GYW7LVVL.js → chunk-7Z64BL5D.js} +1 -1
  31. package/dist/{chunk-BV5QKFMJ.js → chunk-A6TFZQV6.js} +1 -1
  32. package/dist/{chunk-JU5KRCKD.js → chunk-ATO6NM45.js} +1 -1
  33. package/dist/{chunk-S2C62SDY.js → chunk-AXJIXRYF.js} +1 -1
  34. package/dist/{chunk-L26LU6TU.js → chunk-B22NUHB2.js} +2 -2
  35. package/dist/chunk-BLHCGRSK.js +11 -0
  36. package/dist/chunk-BSFONZ2E.js +2 -0
  37. package/dist/{chunk-P4HW2NTZ.js → chunk-BUVRZXO3.js} +1 -1
  38. package/dist/chunk-CVOGP253.js +2 -0
  39. package/dist/{chunk-JTEY32TL.js → chunk-D4WLVWJQ.js} +1 -1
  40. package/dist/{chunk-HA5GE57Z.js → chunk-D5IZ77YG.js} +2 -2
  41. package/dist/chunk-DNNZ353O.js +4 -0
  42. package/dist/chunk-E4EHWO3J.js +4 -0
  43. package/dist/{chunk-LLS47HUA.js → chunk-ELN3EN4K.js} +1 -1
  44. package/dist/{chunk-RV2NXHIC.js → chunk-EQORZ6RT.js} +1 -1
  45. package/dist/chunk-EYZWG32F.js +13 -0
  46. package/dist/{chunk-6NIV7AVZ.js → chunk-F4FXE466.js} +1 -1
  47. package/dist/chunk-FCMLIK7P.js +2 -0
  48. package/dist/{chunk-EWTX7HSU.js → chunk-FCZ2YFD3.js} +2 -2
  49. package/dist/{chunk-EOLQUB4Q.js → chunk-GFKIE3AL.js} +1 -1
  50. package/dist/chunk-GG43HSU2.js +3 -0
  51. package/dist/{chunk-3Z3UIW5H.js → chunk-GO4CBUB6.js} +1 -1
  52. package/dist/{chunk-UZJ7MRBV.js → chunk-HCWEZCKP.js} +1 -1
  53. package/dist/chunk-IAHKTEET.js +2 -0
  54. package/dist/{chunk-6XHAXAL2.js → chunk-IQFUBT6Z.js} +1 -1
  55. package/dist/{chunk-WJGBXJT4.js → chunk-JKHQBGFY.js} +2 -2
  56. package/dist/{chunk-AKHUNBQS.js → chunk-K4ERF7GT.js} +1 -1
  57. package/dist/chunk-K4LCN5X4.js +6 -0
  58. package/dist/{chunk-D7L6UW5Z.js → chunk-K7P6VNLI.js} +1 -1
  59. package/dist/chunk-L3HG5ONB.js +4 -0
  60. package/dist/{chunk-ZZLR3O5A.js → chunk-L4JIMNKW.js} +1 -1
  61. package/dist/chunk-LEA6IHXC.js +2 -0
  62. package/dist/chunk-MBXWXBDM.js +4 -0
  63. package/dist/{chunk-4SXD6XWV.js → chunk-MEHEGW3V.js} +1 -1
  64. package/dist/{chunk-2WO7G2HO.js → chunk-N5YIMTGV.js} +1 -1
  65. package/dist/{chunk-VBCE4U4B.js → chunk-NKCXCCPM.js} +1 -1
  66. package/dist/{chunk-C42WWO7Y.js → chunk-NKUA3TSO.js} +1 -1
  67. package/dist/{chunk-2PQXEEVY.js → chunk-NVGBE2DR.js} +1 -1
  68. package/dist/chunk-NVGTSXCJ.js +9 -0
  69. package/dist/{chunk-6GTOYTCQ.js → chunk-OSALXGD4.js} +1 -1
  70. package/dist/{chunk-LEQ2B3PR.js → chunk-OYOTWI53.js} +1 -1
  71. package/dist/{chunk-N6DO2LBH.js → chunk-PV4EDQY4.js} +1 -1
  72. package/dist/{chunk-6SGPN76K.js → chunk-PXPXK4Q7.js} +1 -1
  73. package/dist/{chunk-24OFJ7SE.js → chunk-Q3WHZ26R.js} +1 -1
  74. package/dist/{chunk-LABIRPOT.js → chunk-QFD6CB4P.js} +1 -1
  75. package/dist/chunk-QM4S2APK.js +2 -0
  76. package/dist/{chunk-JV356AYH.js → chunk-QOGQBVTP.js} +2 -2
  77. package/dist/chunk-QZ7DZXLQ.js +14 -0
  78. package/dist/chunk-RGDQMKNJ.js +4 -0
  79. package/dist/chunk-SHAA6FOD.js +11 -0
  80. package/dist/{chunk-5JJ245FW.js → chunk-TAUSKB3O.js} +1 -1
  81. package/dist/{chunk-XQL53VB7.js → chunk-TBXIOT6M.js} +1 -1
  82. package/dist/chunk-TFVMSEIA.js +2 -0
  83. package/dist/{chunk-KI2DVQSA.js → chunk-TRXNJZSL.js} +1 -1
  84. package/dist/{chunk-HWA7WD44.js → chunk-VRVSOGXH.js} +1 -1
  85. package/dist/{chunk-24VYAMMK.js → chunk-VZHXNQDO.js} +1 -1
  86. package/dist/chunk-XSAZDIQV.js +347 -0
  87. package/dist/chunk-XWIN3S7O.js +4 -0
  88. package/dist/{chunk-32GP7KTM.js → chunk-YEMR62WY.js} +1 -1
  89. package/dist/chunk-YKZIACYJ.js +2 -0
  90. package/dist/{chunk-2BWRAY3Y.js → chunk-YTK3IQUB.js} +1 -1
  91. package/dist/{chunk-FJTWJ243.js → chunk-ZPDM6FO7.js} +1 -1
  92. package/dist/{config-6PAZZ7CR.js → config-JV7HNJ3I.js} +1 -1
  93. package/dist/cover-cmd-L2HSVDLH.js +2 -0
  94. package/dist/{credentials-BJCIWQWA.js → credentials-TQW3TT2I.js} +1 -1
  95. package/dist/{descriptor-EHK3DRCZ.js → descriptor-KXDJ4XYD.js} +1 -1
  96. package/dist/dossier-ZHSHATVU.js +3 -0
  97. package/dist/evidence-ZFYDHO73.js +2 -0
  98. package/dist/evolve-cmd-YGJECGND.js +2 -0
  99. package/dist/explain-VTRHEVUQ.js +2 -0
  100. package/dist/{explain-cmd-U367SD4N.js → explain-cmd-327F6ESA.js} +1 -1
  101. package/dist/{explain-cmd-KV5YUXKB.js → explain-cmd-E366QTAD.js} +1 -1
  102. package/dist/extract-bind-7UZXDON6.js +5 -0
  103. package/dist/{extract-cmd-Z4PMDIMZ.js → extract-cmd-TQ2MYXOG.js} +1 -1
  104. package/dist/gaps-cmd-IAEXXESW.js +2 -0
  105. package/dist/{generate-headless-IWY32HC4.js → generate-headless-XXECVP6L.js} +2 -2
  106. package/dist/index.js +12 -12
  107. package/dist/ingest-CBQAXVH6.js +2 -0
  108. package/dist/ingest-cmd-JN6PLDE3.js +3 -0
  109. package/dist/interactive-bind-WA2YVAUW.js +7 -0
  110. package/dist/lifecycle-cmd-KZOC4WDW.js +2 -0
  111. package/dist/list-cmd-6X5U46RD.js +3 -0
  112. package/dist/{list-commands-SSXJQGE7.js → list-commands-I577A5LK.js} +1 -1
  113. package/dist/{logical-ids-3Y6RX5C2.js → logical-ids-RFGWBVML.js} +1 -1
  114. package/dist/login-flow-OVEZXSMW.js +2 -0
  115. package/dist/maintenance-cmd-UJG4LPWD.js +2 -0
  116. package/dist/pdf-convert-KYXI4FU4.js +2 -0
  117. package/dist/{persist-recorded-session-3AOYZJT2.js → persist-recorded-session-DT3K6ZYQ.js} +1 -1
  118. package/dist/pipeline-5N7HWGAL.js +2 -0
  119. package/dist/readmodel-V3DVL6NP.js +2 -0
  120. package/dist/reconcile-cmd-HYYH3SZS.js +2 -0
  121. package/dist/{recording-banner-KKEUWS3N.js → recording-banner-QI77ERTZ.js} +1 -1
  122. package/dist/{require-project-folder-NPTKR2AW.js → require-project-folder-2UAXXZA4.js} +1 -1
  123. package/dist/revert-FRXNIP5R.js +2 -0
  124. package/dist/{review-cmd-4WZUUOE4.js → review-cmd-XVWPSWU2.js} +1 -1
  125. package/dist/run-RYIYWV63.js +2 -0
  126. package/dist/run-VMKZDO7J.js +2 -0
  127. package/dist/{run-test-md-QNC6KDMN.js → run-test-md-DKRJOUFA.js} +2 -2
  128. package/dist/{skill-installer-ULFNSE6X.js → skill-installer-TK5REDD6.js} +1 -1
  129. package/dist/{spawner-DWONVIPI.js → spawner-K7LWPNIC.js} +1 -1
  130. package/dist/tcg-generate-6EJLU5KX.js +2 -0
  131. package/dist/{testmd-actions-S3ZNOZEK.js → testmd-actions-Q2XWL7P5.js} +1 -1
  132. package/dist/token-refresh-NQZJEUQE.js +2 -0
  133. package/dist/{validate-basic-4OLDKIA2.js → validate-basic-XEJGB4GN.js} +1 -1
  134. package/dist/{version-check-UL4S6R4N.js → version-check-IT7T5YKJ.js} +1 -1
  135. package/dist/{view-cmd-FRMQF76B.js → view-cmd-G4PGJRQH.js} +3 -3
  136. package/dist/walk-session-HCTG4LN2.js +2 -0
  137. package/package.json +7 -6
  138. package/dist/ChatSurface-LV3KW6WN.js +0 -8
  139. package/dist/EvidenceViewOffer-KQKPTMXA.js +0 -2
  140. package/dist/SingleShotApp-M7R5PW4X.js +0 -2
  141. package/dist/TestMdRunView-JXRXMACE.js +0 -2
  142. package/dist/chat-committer-ADJJTDUT.js +0 -2
  143. package/dist/chat-controller-VAC57IEV.js +0 -3
  144. package/dist/chunk-262ES67I.js +0 -14
  145. package/dist/chunk-4A6BLXQN.js +0 -13
  146. package/dist/chunk-4R2HOA7J.js +0 -14
  147. package/dist/chunk-64LC36AF.js +0 -2
  148. package/dist/chunk-6AYUSR7X.js +0 -2
  149. package/dist/chunk-6CZIEK6B.js +0 -11
  150. package/dist/chunk-6PS65QFF.js +0 -2
  151. package/dist/chunk-74RUSHIB.js +0 -4
  152. package/dist/chunk-GBBVP2JW.js +0 -2
  153. package/dist/chunk-JF7Q2I45.js +0 -2
  154. package/dist/chunk-KNCHEM6A.js +0 -9
  155. package/dist/chunk-KYHXDJN4.js +0 -2
  156. package/dist/chunk-LURGFJEE.js +0 -6
  157. package/dist/chunk-MCQXRJGH.js +0 -2
  158. package/dist/chunk-OFEOWKM3.js +0 -6
  159. package/dist/chunk-QPZRHAYK.js +0 -4
  160. package/dist/chunk-RE3BZVGE.js +0 -3
  161. package/dist/chunk-RIMJDJWY.js +0 -2
  162. package/dist/chunk-SJ2KQKOV.js +0 -3
  163. package/dist/chunk-WIA7TPK3.js +0 -2
  164. package/dist/chunk-WWH7CW5R.js +0 -356
  165. package/dist/chunk-ZG2V2ODK.js +0 -4
  166. package/dist/cover-cmd-K3LCXHAQ.js +0 -2
  167. package/dist/evidence-7VE5EGEF.js +0 -2
  168. package/dist/evolve-cmd-RUGUWKAG.js +0 -2
  169. package/dist/explain-VFIZTHFN.js +0 -2
  170. package/dist/extract-bind-YS7C4KZ3.js +0 -5
  171. package/dist/gaps-cmd-DTVDIOED.js +0 -2
  172. package/dist/ingest-C5ANIN7S.js +0 -2
  173. package/dist/ingest-cmd-LLC5CDQ5.js +0 -3
  174. package/dist/interactive-bind-ZIIJDRBU.js +0 -7
  175. package/dist/lifecycle-cmd-BXE5IMFN.js +0 -2
  176. package/dist/list-cmd-KBWPYJMV.js +0 -3
  177. package/dist/login-flow-HRS6YACY.js +0 -2
  178. package/dist/maintenance-cmd-VS3APIUN.js +0 -2
  179. package/dist/pipeline-IZSODNCC.js +0 -2
  180. package/dist/readmodel-XOGOELUP.js +0 -2
  181. package/dist/reconcile-cmd-6HVZJFG3.js +0 -2
  182. package/dist/revert-AQQ2VHRM.js +0 -2
  183. package/dist/run-2A7M7EJK.js +0 -2
  184. package/dist/run-6AFY35QW.js +0 -2
  185. package/dist/tcg-generate-IHHPRVNG.js +0 -2
  186. package/dist/token-refresh-CFVOA62N.js +0 -2
  187. package/dist/walk-session-N3BP57HK.js +0 -2
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as z,b as ee,c as te}from"./chunk-JF7Q2I45.js";import{c as K,d as V}from"./chunk-6CZIEK6B.js";import{c as J}from"./chunk-6XHAXAL2.js";import{a as Q}from"./chunk-VBCE4U4B.js";import{a as Z}from"./chunk-FPFOW6BS.js";import{b as H}from"./chunk-HWA7WD44.js";import{b as W}from"./chunk-N6DO2LBH.js";import{h as E}from"./chunk-M5JQXOCE.js";import{a as O}from"./chunk-2WVKOZ6W.js";import{a as _}from"./chunk-AKHUNBQS.js";import{a as k,b as A,d as Y}from"./chunk-VE3SUJMA.js";import{a as q}from"./chunk-P4HW2NTZ.js";import{a as G}from"./chunk-HCBYKLMW.js";import{a as c,b as u,i as I,j as X}from"./chunk-C44QQJR4.js";import{a as ue}from"./chunk-6YGTRKDT.js";import{e as F}from"./chunk-UR6MHSHU.js";var i=F(ue(),1);var r=F(G(),1);function _e({resultRef:h,mode:d="singleshot",loginCompleteRef:f}){let{exit:m}=X(),C=(0,i.useRef)(new q),S=(0,i.useRef)(new Q),v=(0,i.useRef)(new J),t=C.current,l=S.current,$=v.current,ne=K(),[P,g]=(0,i.useState)(d==="login"?"login":"gate"),[L,re]=(0,i.useState)(null),[de,R]=(0,i.useState)(null),[ge,T]=(0,i.useState)(null),[N,oe]=(0,i.useState)(null),[U,B]=(0,i.useState)([]),x=(0,i.useCallback)((e,n,s,o)=>$.log(e,n,s,o),[$]),pe=(0,i.useCallback)((e,n)=>{e?k(t,l,e,n):l.save({project_id:null,project_name:null,folder_id:null,folder_name:null})},[t,l]),y=(0,i.useCallback)(()=>{d==="login"?(f&&(f.current=!0),m()):g("input")},[d,m,f]),D=(0,i.useCallback)((e,n)=>{let s=k(t,l,e,n);if(d==="login"){g("ensure-project");return}Y(s)?y():s.projectId?g("ensure-folder"):g("ensure-project")},[t,l,y,d]);I((e,n)=>{n.ctrl&&e==="c"&&E(0,"Ctrl+C exit")});let M=(0,i.useRef)(!1);i.default.useEffect(()=>{M.current||(M.current=!0,d!=="login"&&te(t,x).then(e=>{re(e),e.status==="authenticated"?D(e.result.profile,e.result.env):e.status==="needs_pick"?g("pick"):(R(e.profile??null),T(e.env??null),g("login"))}).catch(e=>{oe(`Auth check failed: ${e instanceof Error?e.message:String(e)}`)}))},[t,x]);let ie=(0,i.useCallback)(e=>{h.current={objective:e},m()},[h,m]),se=(0,i.useCallback)(async(e,n)=>{t.setActiveProfile(e),t.setDefaultEnv(n),(await ee(t,e,n,x)).status==="authenticated"?D(e,n):(R(e),T(n),g("login"))},[t,x,D]),w=(0,i.useCallback)(()=>{let e=t.getActiveProfile(),n=t.getDefaultEnv();if(!e)return null;let s=_(n),o=t.loadBasicAuth(e,n);return new Z(s.controllerBaseUrl,async()=>t.loadCredentials(e,n)?.access_token??null,o,x)},[t,x]),le=(0,i.useCallback)(async()=>{let e=w();if(!e)return null;let n=e.cached??await e.resolve();if(!n)return null;let s=_(t.getDefaultEnv()),o=new O(s.tmsBaseUrl,n.username,n.access_key);try{let p=(await o.listProjects()).find(b=>b.name==="KaneAI Generated");if(p)return{id:p.project_id,name:p.name};let j=await o.createProject("KaneAI Generated");return{id:j.id,name:j.name}}catch{return null}},[w,t]),ae=(0,i.useCallback)(async e=>{let n=w();if(!n)return null;let s=n.cached??await n.resolve();if(!s)return null;let o=_(t.getDefaultEnv()),a=new O(o.tmsBaseUrl,s.username,s.access_key);try{let j=(await a.listFolders(e)).find(ce=>ce.name==="Untitled");if(j)return{id:j.id,name:j.name};let b=await a.createFolder(e,"Untitled");return{id:b.id,name:b.name}}catch{return null}},[w,t]);if(P==="gate")return(0,r.jsx)(c,{paddingX:1,children:(0,r.jsx)(u,{color:"yellow",children:"Checking authentication..."})});if(N)return(0,r.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,r.jsx)(u,{color:"red",children:N}),(0,r.jsx)(u,{color:"gray",children:"Press Ctrl+C to exit."})]});if(P==="pick"&&L?.status==="needs_pick")return(0,r.jsx)(fe,{profiles:L.profiles,onSelect:se});if(P==="login")return(0,r.jsx)(z,{devMode:process.env.KANE_DEV_MODE==="1",profiles:t.listProfiles(),onBasicLogin:async(e,n,s,o)=>{let{validateBasicAuth:a}=await import("./validate-basic-4OLDKIA2.js");await a(n,s,o),t.saveBasicAuth(e,n,{username:s,access_key:o}),t.setActiveProfile(e),t.setDefaultEnv(n)},onOAuthLogin:async(e,n)=>{let{LoginFlow:s}=await import("./login-flow-HRS6YACY.js");t.setDefaultEnv(n),t.setActiveProfile(e),await new s(e,n,t).login()},onComplete:(e,n)=>{R(e),T(n),t.setActiveProfile(e),t.setDefaultEnv(n),D(e,n)},onCancel:()=>{E(0,"Login cancelled")}});if(P==="ensure-project"){let e=t.getActiveProfile()??"default",n=t.getDefaultEnv(),s=()=>{if(d==="login"){g("ensure-folder");return}k(t,l,e,n).folderId?y():g("ensure-folder")};return(0,r.jsxs)(c,{flexDirection:"column",children:[(0,r.jsx)(c,{paddingX:1,marginBottom:1,children:(0,r.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,r.jsx)(H,{resolver:w(),currentProjectId:l.load().project_id,env:n,onSelect:(o,a)=>{A(t,l,e,n,{projectId:o,projectName:a}),B(p=>[...p,`\u2713 Project: ${a} (${o})`]),s()},onCancel:async()=>{let o=await le();o&&(A(t,l,e,n,{projectId:o.id,projectName:o.name}),B(a=>[...a,`\u2713 Default project: ${o.name} (${o.id})`]),s())}})]})}if(P==="ensure-folder"){let e=t.getActiveProfile()??"default",n=t.getDefaultEnv(),s=t.loadProfileConfig(e,n);return(0,r.jsxs)(c,{flexDirection:"column",children:[(0,r.jsx)(c,{paddingX:1,marginBottom:1,children:(0,r.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,r.jsx)(W,{resolver:w(),projectId:s?.project_id??"",currentFolderId:l.load().folder_id,env:n,onSelect:(o,a)=>{A(t,l,e,n,{folderId:o,folderName:a}),B(p=>[...p,`\u2713 Folder: ${a} (${o})`]),y()},onCancel:async()=>{if(!s?.project_id)return;let o=await ae(s.project_id);o&&(A(t,l,e,n,{folderId:o.id,folderName:o.name}),B(a=>[...a,`\u2713 Default folder: ${o.name} (${o.id})`]),y())}})]})}return P==="input"?(0,r.jsxs)(c,{flexDirection:"column",children:[U.length>0&&(0,r.jsx)(c,{flexDirection:"column",paddingX:1,marginBottom:1,children:U.map((e,n)=>(0,r.jsx)(u,{color:"green",children:e},n))}),(0,r.jsx)(V,{onSubmit:ie,onEscape:()=>E(0,"User pressed Escape"),history:ne,placeholder:"Type an objective..."})]}):(0,r.jsx)(r.Fragment,{})}function fe({profiles:h,onSelect:d}){let[f,m]=(0,i.useState)(0),[C,S]=(0,i.useState)(!1);return I((v,t)=>{if(!C){if(t.escape){E(0,"Profile picker cancelled");return}if(t.upArrow&&f>0&&m(l=>l-1),t.downArrow&&f<h.length-1&&m(l=>l+1),t.return){S(!0);let l=h[f];d(l.profile,l.env).catch(()=>S(!1))}}}),(0,r.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,r.jsx)(u,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,r.jsx)(c,{marginTop:1,flexDirection:"column",children:h.map((v,t)=>(0,r.jsxs)(u,{children:[t===f?"\u276F ":" ",(0,r.jsx)(u,{color:t===f?"#ff9500":"white",bold:t===f,children:v.profile}),(0,r.jsxs)(u,{color:"gray",children:[" [",v.env,"]"]})]},`${v.profile}-${v.env}`))}),C&&(0,r.jsx)(c,{marginTop:1,children:(0,r.jsx)(u,{color:"yellow",children:"Validating credentials..."})})]})}export{_e as a};
@@ -1,3 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as k,c as I}from"./chunk-2PQXEEVY.js";import{a as E}from"./chunk-MCQXRJGH.js";import{a as h,c as w}from"./chunk-ZZLR3O5A.js";import{g as S}from"./chunk-ZG2V2ODK.js";import{a as x,d as y,f as b}from"./chunk-5YPBPZUR.js";import{existsSync as M,mkdirSync as R,readFileSync as C,writeFileSync as F}from"fs";import{basename as P,extname as v,join as U}from"path";var A=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function D(e){return typeof e=="string"&&e!=="."&&e!==".."&&A.test(e)}function f(e){if(!D(e))throw new Error(`unsafe logical_id: ${JSON.stringify(e)} \u2014 must match ${String(A)} (no path separators)`)}import{extname as $}from"path";var O=[{kind:"text",media_type:"text/plain",extensions:[".txt"],cite:"verbatim",maxBytes:2e6},{kind:"markdown",media_type:"text/markdown",extensions:[".md",".markdown"],cite:"verbatim",maxBytes:2e6},{kind:"image",media_type:"image/png",extensions:[".png"],cite:"anchor-only",maxBytes:5e6},{kind:"image",media_type:"image/jpeg",extensions:[".jpg",".jpeg"],cite:"anchor-only",maxBytes:5e6},{kind:"image",media_type:"image/webp",extensions:[".webp"],cite:"anchor-only",maxBytes:5e6}];function L(e){let n=$(e).toLowerCase(),t=O.find(r=>r.extensions.includes(n));return t?{ok:!0,media:t}:{ok:!1,code:"UNSUPPORTED_MEDIA",allowlist:O.flatMap(r=>r.extensions)}}function j(e){let t=P(e,v(e)).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[^a-z0-9]+/,"");return f(t),t}function ee(e){let n=/^(.*?)[-_.]?v?\d+$/.exec(e);if(!n)return null;let t=(n[1]??"").replace(/[-_.]+$/,"");return t.length>0&&t!==e?t:null}function z(e){let n=U(e,"meta.json");M(n)||(R(e,{recursive:!0}),F(n,JSON.stringify({schema:x,canonicalizer:"v1"},null,2)+`
3
- `))}async function te(e){let{contextDir:n,filePath:t,asId:r,confirmSameSource:_}=e;z(n);let c=C(t),i=L(t);if(!i.ok)throw new Error(`UNSUPPORTED_MEDIA: ${v(t)} \u2014 supported: ${i.allowlist.join(" ")}`);if(c.byteLength>i.media.maxBytes)throw new Error(`FILE_TOO_LARGE: ${c.byteLength} bytes > ${i.media.maxBytes} cap for ${i.media.media_type}`);let s=k(c),o;r!==void 0?(f(r),o=r):o=j(t);let d=E(n),a=d.heads.get(o),N=a!=null?d.getNode(a)?.content:void 0;if(a!=null&&N?.blob===s)return{status:"unchanged",source_id:o,cid:a,blob:s};if(a==null){for(let[g,p]of d.heads.entries())if(!(g===o||p==null)&&d.getNode(p)?.content.blob===s){if(_&&await _(g))return{status:"unchanged",source_id:g,cid:p,blob:s};break}}I(n,c);let m=w(o,s),l=b("source",m);if(l.length>0)throw new Error(`source node fails ${l[0].code}: ${l[0].detail}`);let u=h("source",m);return S(n,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:u,label:y.SOURCE,content:m}],edges:[],review:[],supersessions:[],media:{[o]:{format:i.media.kind,media_type:i.media.media_type,anchors_supported:i.media.cite==="verbatim"?["L-L"]:[]}},source_head_moves:{[o]:u}}),{status:a!=null?"versioned":"created",source_id:o,cid:u,blob:s}}export{L as a,j as b,ee as c,te as d};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as F}from"./chunk-QPZRHAYK.js";import{a as U,b as T,d as B}from"./chunk-ZZLR3O5A.js";import{e as W,g as P}from"./chunk-ZG2V2ODK.js";import{d as A,e as D,f as L,g as q,h as H}from"./chunk-5YPBPZUR.js";var G=/^[a-z0-9][a-z0-9-]{1,63}$/;function z(f,d,t,e){if(!d)return{error:{code:"SUPERSEDE_TARGET_MISSING",detail:"supersede verdict needs a target (slug or cid)"}};let n=f.resolve(d);return n?n.superseded||e.has(n.cid)?{error:{code:"ALREADY_SUPERSEDED",detail:`${d} is already superseded (tip: ${n.tip})`}}:n.cid===t?{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(f,d,t,e,n=[]){if(!q(d)?.acyclic)return null;if(t===e)return{code:"EDGE_CYCLE",detail:`${d} ${t} \u2192 itself`};let r=_=>[...f.edgesFrom(_).filter(E=>E.type===d).map(E=>E.dst),...n.filter(E=>E.type===d&&E.src===_).map(E=>E.dst)],c=new Set,p=[e];for(;p.length>0;){let _=p.pop();if(_===t)return{code:"EDGE_CYCLE",detail:`${d} ${t} \u2192 ${e} closes a cycle`};c.has(_)||(c.add(_),p.push(...r(_)))}return null}function de(f,d,t,e){let m=q(d)?.cardinality;if(m!=="one-live-per-src"&&m!=="one-live-per-src-and-dst")return null;let r=f.edgesFrom(t).filter(c=>c.type===d&&!f.superseded.has(c.dst));if(r.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${d} from ${t} already has a live edge (${r[0].ecid}) \u2014 supersede it first`};if(m==="one-live-per-src-and-dst"&&e!==void 0){let c=f.edgesInto(e).filter(p=>p.type===d&&!f.superseded.has(p.src));if(c.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${d} onto ${e} already has a live edge (${c[0].ecid}) \u2014 strict 1:1, supersede it first`}}return null}var K=new Set(["high","med","low"]);function ce(f,d,t){let e=[],n=t.mediaOf(f.source.source_cid),m=new Set;for(let r of f.use_cases){if(m.has(r.temp_ref)&&e.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${r.temp_ref}`}),m.add(r.temp_ref),(!r.title||!r.title.trim())&&e.push({code:"EMPTY_TITLE",detail:`${r.temp_ref}: title is empty`}),K.has(r.risk)||e.push({code:"BAD_RISK",detail:`${r.temp_ref}: risk ${JSON.stringify(r.risk)} not in high|med|low`}),!r.cite||!r.cite.anchor)e.push({code:"MISSING_CITE",detail:`${r.temp_ref}: every derived use-case must carry a cite`});else for(let c of F(n,r.cite,d))e.push({code:c.code,detail:`${r.temp_ref}: ${c.detail}`});r.matches_existing&&!t.hasNode(r.matches_existing.cid)&&e.push({code:"UNKNOWN_MATCH",detail:`${r.temp_ref}: matches_existing ${r.matches_existing.cid} is not in the graph`});for(let[c,p]of(r.criteria??[]).entries())if((!p.text||!p.text.trim())&&e.push({code:"EMPTY_CRITERION",detail:`${r.temp_ref}.criteria[${c}]: text is empty`}),!p.cite||!p.cite.anchor)e.push({code:"MISSING_CITE",detail:`${r.temp_ref}.criteria[${c}]: every criterion carries its own cite`});else for(let _ of F(n,p.cite,d))e.push({code:_.code,detail:`${r.temp_ref}.criteria[${c}]: ${_.detail}`});for(let[c,p]of(r.updated?.criteria??[]).entries())if((!p.text||!p.text.trim())&&e.push({code:"EMPTY_CRITERION",detail:`${r.temp_ref}.updated.criteria[${c}]: text is empty`}),!p.cite||!p.cite.anchor)e.push({code:"MISSING_CITE",detail:`${r.temp_ref}.updated.criteria[${c}]: every updated criterion carries its own cite`});else for(let _ of F(n,p.cite,d))e.push({code:_.code,detail:`${r.temp_ref}.updated.criteria[${c}]: ${_.detail}`})}return e}function ae(f){let{contextDir:d,graph:t,proposal:e,proposalId:n,verdicts:m,by:r,allowStaleBasis:c,extractorVersion:p,autoName:_}=f,E=W(d);if(!c&&e.read_basis!==E)return{record:null,errors:[{code:"STALE_BASIS",detail:`proposal read_basis ${String(e.read_basis)} != latest ${String(E)}`}]};if(!t.hasNode(e.source.source_cid))return{record:null,errors:[{code:"MISSING_SOURCE_NODE",detail:`source ${e.source.source_id} (${e.source.source_cid}) is not a committed node \u2014 ingest it first`}]};let l=[],g=t.mediaOf(e.source.source_cid),k=new Set,v=[],S=[],O=[],R=[],x=[],V=[],M=new Set,Y=new Set,j=(i,s,b)=>{let u=z(t,s.supersedeTarget,b,M);if("error"in u){l.push({code:u.error.code,detail:`${i}: ${u.error.detail}`});return}M.add(u.targetCid),x.push({kind:"node",old:u.targetCid,new:b,reason:s.reason??`superseded via review by ${r.id}`,by:r})};for(let i of e.use_cases){let s=m.get(i.temp_ref)??{resolution:"skipped"};if(k.has(i.temp_ref)&&l.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${i.temp_ref}`}),k.add(i.temp_ref),(!i.title||!i.title.trim())&&l.push({code:"EMPTY_TITLE",detail:`${i.temp_ref}: title is empty`}),K.has(i.risk)||l.push({code:"BAD_RISK",detail:`${i.temp_ref}: risk ${JSON.stringify(i.risk)} not in high|med|low`}),g.format==="image"){if(i.cite?.anchor!=="img#whole"){l.push({code:i.cite?.anchor?"CITE_ANCHOR_INVALID":"MISSING_CITE",detail:`${i.temp_ref}: image cites are anchor-only (img#whole)`});continue}}else if(!i.cite||!i.cite.anchor||!i.cite.quote){l.push({code:"MISSING_CITE",detail:`${i.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:`${i.temp_ref}: edited title is empty`}),s.edit.risk!==void 0&&!K.has(s.edit.risk)&&l.push({code:"BAD_RISK",detail:`${i.temp_ref}: edited risk ${JSON.stringify(s.edit.risk)} invalid`}));let b=B({title:s.edit?.title??i.title,description:i.description,summary:s.edit?.summary??i.summary,actors:i.actors,value:i.value,risk:s.edit?.risk??i.risk,...i.criteria&&i.criteria.length>0?{criteria:i.criteria.map(o=>o.text)}:{}}),u=U("usecase",b),I={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:i.cite.anchor,...i.cite.quote?{quote:i.cite.quote}:{}};if(i.matches_existing&&!t.hasNode(i.matches_existing.cid)){l.push({code:"UNKNOWN_MATCH",detail:`${i.temp_ref}: matches_existing ${i.matches_existing.cid} is not in the graph`});continue}let N=i.matches_existing?.cid??(t.hasNode(u)?u:null);if(N&&t.superseded.has(N)){let o=t.tipOf(N);N=t.superseded.has(o)?null:o}if(N){if(i.changed&&(s.resolution==="approved"||s.resolution==="edited")){let o=i.updated;if(!o||Object.keys(o).length===0){l.push({code:"CHANGED_NEEDS_PAYLOAD",detail:`${i.temp_ref}: changed:true needs an updated{...} payload naming the moved fields`});continue}let h=t.getNode(N)?.content??{},$=(o.criteria??[]).map(a=>typeof a=="string"?{text:a,cite:void 0}:a),C=B({title:s.edit?.title??o.title??String(h.title??i.title),...o.description??h.description?{description:o.description??h.description}:{},...s.edit?.summary??o.summary??h.summary?{summary:s.edit?.summary??o.summary??h.summary}:{},...o.actors??h.actors?{actors:o.actors??h.actors}:{},...o.value??h.value?{value:o.value??h.value}:{},risk:s.edit?.risk??o.risk??String(h.risk??i.risk),...o.criteria?$.length>0?{criteria:$.map(a=>a.text)}:{}:h.criteria?{criteria:h.criteria}:{}}),w=U("usecase",C);if(w!==N){for(let a of L("usecase",C))l.push({code:a.code,detail:`${i.temp_ref}: ${a.detail}`});v.push({cid:w,label:A.USECASE,content:C}),S.push({ecid:T("DERIVES",I.source_cid,w,I),type:D.DERIVES,src:I.source_cid,dst:w,props:I});for(let a of $){if(!a.cite)continue;let y={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:a.cite.anchor,...a.cite.quote?{quote:a.cite.quote}:{},claim:a.text};S.push({ecid:T("DERIVES",y.source_cid,w,y),type:D.DERIVES,src:y.source_cid,dst:w,props:y})}j(i.temp_ref,{resolution:"supersede",supersedeTarget:N,reason:s.reason??`matches-but-changed: ${e.source.source_id} moved (${Object.keys(o).join(", ")})`},w),R.push({id:w,kind:"review-item",resolution:s.resolution,edit:s.resolution==="edited"?{...s.edit}:null,reason:null,by:r});continue}for(let a of $){if(!a.cite)continue;let y={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:a.cite.anchor,...a.cite.quote?{quote:a.cite.quote}:{},claim:a.text};S.push({ecid:T("DERIVES",y.source_cid,N,y),type:D.DERIVES,src:y.source_cid,dst:N,props:y})}}s.resolution!=="rejected"&&(S.push({ecid:T("DERIVES",I.source_cid,N,I),type:D.DERIVES,src:I.source_cid,dst:N,props:I}),(s.resolution==="approved"||s.resolution==="edited"||s.resolution==="supersede")&&R.push({id:N,kind:"review-item",resolution:"approved",edit:null,reason:null,by:r}),s.resolution==="supersede"&&j(i.temp_ref,s,N));continue}for(let o of L("usecase",b))l.push({code:o.code,detail:`${i.temp_ref}: ${o.detail}`});for(let o of H(D.DERIVES,"source","usecase",I))l.push({code:o.code,detail:`${i.temp_ref}: ${o.detail}`});v.push({cid:u,label:A.USECASE,content:b}),S.push({ecid:T("DERIVES",I.source_cid,u,I),type:D.DERIVES,src:I.source_cid,dst:u,props:I});for(let o of i.criteria??[]){let h={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:o.cite.anchor,...o.cite.quote?{quote:o.cite.quote}:{},claim:o.text};S.push({ecid:T("DERIVES",h.source_cid,u,h),type:D.DERIVES,src:h.source_cid,dst:u,props:h})}for(let o of i.depends_on_hint??[]){let h=a=>a.toLowerCase().trim().replace(/\s+/g," "),$=null,C=t.resolve(o);if(C&&!C.superseded&&t.nodeLabel.get(C.cid)===A.USECASE&&($=C.cid),!$){for(let{cid:a,content:y}of t.byLabel(A.USECASE))if(!t.superseded.has(a)&&h(String(y.title??""))===h(o)){$=a;break}}if(!$){let a=v.find(y=>y.label===A.USECASE&&h(String(y.content.title??""))===h(o));a&&($=a.cid)}!$||$===u||X(t,D.DEPENDS_ON,u,$,O)||O.some(a=>a.src===u&&a.dst===$)||(S.push({ecid:T(D.DEPENDS_ON,u,$,{reason:"extract hint"}),type:D.DEPENDS_ON,src:u,dst:$,props:{reason:"extract hint"}}),O.push({src:u,dst:$,type:D.DEPENDS_ON}))}if((s.resolution==="approved"||s.resolution==="edited"||s.resolution==="supersede")&&t.superseded.get(u)===null&&!M.has(u)&&x.push({kind:"node",old:u,new:u,reason:`re-minted after tombstone via review by ${r.id}`,by:r}),_){let o=J("usecase",s.edit?.title??i.title,h=>Y.has(h)||t.names.has(h)&&!t.superseded.has(t.names.get(h)));o!==null&&!t.nameOf.has(u)&&(Y.add(o),V.push({cid:u,slug:o,by:r}))}s.resolution==="approved"?R.push({id:u,kind:"review-item",resolution:"approved",edit:null,reason:null,by:r}):s.resolution==="edited"?R.push({id:u,kind:"review-item",resolution:"edited",edit:{...s.edit},reason:null,by:r}):s.resolution==="rejected"?R.push({id:u,kind:"review-item",resolution:"rejected",edit:null,reason:s.reason??null,by:r}):s.resolution==="supersede"&&(R.push({id:u,kind:"review-item",resolution:"approved",edit:null,reason:s.reason??null,by:r}),j(i.temp_ref,s,u))}return l.length?{record:null,errors:l}:{record:P(d,{ts:new Date().toISOString(),proposal_id:n,...n!=null?{extraction_of:e.source.source_cid}:{},...n!=null&&p?{extractor_version:p}:{},nodes:v,edges:S,review:R,supersessions:x,...V.length>0?{names:V}:{},...f.judgements&&f.judgements.length>0?{judgements:f.judgements}:{},source_head_moves:{}},{expectPrev:E}).record,errors:null}}function ue(f){let{contextDir:d,graph:t,verdicts:e,by:n}=f,m=[],r=[],c=[],p=[],_=new Set;for(let[l,g]of e){if(g.resolution==="skipped")continue;let k=t.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(g.resolution==="approved")c.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:null,by:n});else if(g.resolution==="rejected")c.push({id:v,kind:"review-item",resolution:"rejected",edit:null,reason:g.reason??null,by:n});else if(g.resolution==="edited"){let S=t.getNode(v);if(!S){m.push({code:"UNKNOWN_NODE",detail:`${l}: node file unreadable`});continue}let O={...S.content,...g.edit?.title!==void 0?{title:g.edit.title}:{},...g.edit?.summary!==void 0?{summary:g.edit.summary}:{},...g.edit?.risk!==void 0?{risk:g.edit.risk}:{}},R=L(S.label,O);if(R.length>0){for(let V of R)m.push({code:V.code,detail:`${l}: ${V.detail}`});continue}let x=U(S.label,O);if(x===v){c.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:null,by:n});continue}r.push({cid:x,label:S.label,content:O}),_.add(v),p.push({kind:"node",old:v,new:x,reason:g.reason??"edited in review",by:n}),c.push({id:x,kind:"review-item",resolution:"edited",edit:{...g.edit},reason:null,by:n})}else if(g.resolution==="supersede"){let S=z(t,g.supersedeTarget,v,_);if("error"in S){m.push({code:S.error.code,detail:`${l}: ${S.error.detail}`});continue}_.add(S.targetCid),p.push({kind:"node",old:S.targetCid,new:v,reason:g.reason??`superseded via review by ${n.id}`,by:n}),c.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:g.reason??null,by:n})}}return m.length?{record:null,errors:m}:c.length===0&&p.length===0?{record:null,errors:[{code:"NO_VERDICTS",detail:"every item was skipped \u2014 nothing to commit"}]}:{record:P(d,{ts:new Date().toISOString(),proposal_id:null,nodes:r,edges:[],review:c,supersessions:p,source_head_moves:{}},{expectPrev:t.latestHash}).record,errors:null}}function le(f){let{contextDir:d,graph:t,assignments:e,by:n}=f,m=[],r=[],c=new Set;for(let{ref:_,slug:E}of e){if(!G.test(E)){m.push({code:"BAD_SLUG",detail:`${JSON.stringify(E)} \u2014 slugs are kebab-case ${String(G)}`});continue}let l=t.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 g=t.names.get(E);if(g!==void 0&&!t.superseded.has(g)&&g!==l.cid||c.has(E)){m.push({code:"SLUG_TAKEN",detail:`${E} already names ${g??"another node in this record"}`});continue}c.add(E),r.push({cid:l.cid,slug:E,by:n})}return m.length?{record:null,errors:m}:r.length===0?{record:null,errors:[{code:"NO_ASSIGNMENTS",detail:"nothing to name"}]}:{record:P(d,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],names:r,source_head_moves:{}},{expectPrev:t.latestHash}).record,errors:null}}function pe(f){let{contextDir:d,graph:t,sourceId:e,reason:n,by:m}=f,r=t.heads.get(e);return r===void 0?{record:null,errors:[{code:"UNKNOWN_SOURCE",detail:`no source ${e} in the graph`}]}:r===null?{record:null,errors:[{code:"ALREADY_RETIRED",detail:`source ${e} is already retired`}]}:{record:P(d,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[{kind:"node",old:r,new:null,reason:n??`retired source ${e}`,by:m}],source_head_moves:{[e]:null},names:[]},{expectPrev:t.latestHash}).record,errors:null}}function Q(f,d){let t=f.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(t.length>60){let n=t.lastIndexOf("-",60);t=(n>0?t.slice(0,n):t.slice(0,60)).replace(/-+$/g,"")}if(!G.test(t))return null;let e=t;for(let n=2;d(e);n++)e=`${t}-${n}`;return G.test(e)?e:null}var Z={source:"src",usecase:"uc",scenario:"sc",ac:"ac",test:"t",gap:"gap",stylenote:"sty"};function J(f,d,t){let e=Z[f];return Q(e?`${e} ${d}`:d,t)}export{Z as a,J as b,X as c,de as d,ce as e,ae as f,ue as g,le as h,pe as i};
@@ -1,356 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as Ue}from"./chunk-KHU7C6EE.js";import{a as Me,b as Ge}from"./chunk-3C5GMAM4.js";import{a as me,b as Te,c as Oe,d as Ie,g as Ne,h as je}from"./chunk-KNCHEM6A.js";import{a as qe,b as Fe,g as Be,h as Pe}from"./chunk-FXPPQL4D.js";import{a as Ae}from"./chunk-RE3BZVGE.js";import{b as Re,c as De}from"./chunk-WIA7TPK3.js";import{c as Ce}from"./chunk-6GTOYTCQ.js";import{a as Le}from"./chunk-6AYUSR7X.js";import{b as _e,c as be,d as ye,e as ee,f as J,g as re,h as ve,i as le}from"./chunk-FJTWJ243.js";import{a as de}from"./chunk-L5LI2JF4.js";import{a as Y}from"./chunk-MCQXRJGH.js";import{a as xe,b as ue}from"./chunk-ZZLR3O5A.js";import{e as $e,g as Ee}from"./chunk-ZG2V2ODK.js";import{d as S,e as E,f as we,g as Se,h as ke}from"./chunk-5YPBPZUR.js";import{mkdirSync as Et,appendFileSync as Rt}from"fs";import{randomBytes as Dt}from"crypto";import{join as ct}from"path";import{existsSync as ge,readFileSync as pe,readdirSync as dt}from"fs";import{join as te}from"path";var ze=`
3
- version: 1
4
- techniques:
5
- - id: eqp
6
- name: "Equivalence partitioning"
7
- applies_hint: "any constrained input"
8
- emits: [absolute, forbidden-presence]
9
- - id: bva
10
- name: "Boundary value analysis"
11
- applies_hint: "input has an ordered range or length"
12
- emits: [absolute, forbidden-presence]
13
- - id: negative
14
- name: "Negative / error"
15
- applies_hint: "any input or action that can fail"
16
- emits: [forbidden-presence]
17
- - id: state_flow
18
- name: "State / flow"
19
- applies_hint: "the AC sits in a multi-step flow"
20
- emits: [state-transition]
21
- - id: crud
22
- name: "CRUD round-trip"
23
- applies_hint: "AC touches a persisted resource"
24
- emits: [delta, presence, forbidden-presence]
25
- - id: auth
26
- name: "Auth / permission"
27
- applies_hint: "AC is behind a gate or role"
28
- emits: [forbidden-presence, presence]
29
- - id: api_contract
30
- name: "API-contract"
31
- applies_hint: "surface is REST/GraphQL"
32
- emits: [absolute]
33
- - id: concurrency
34
- name: "Concurrency / race"
35
- applies_hint: "high-risk (money / data-loss) or shared-resource AC"
36
- emits: [state-transition, forbidden-presence]
37
- - id: idempotency
38
- name: "Idempotency / retry"
39
- applies_hint: "money or write operations"
40
- emits: [delta]
41
- - id: i18n
42
- name: "i18n / l10n"
43
- applies_hint: "AC renders user text or formats numbers/dates/currency"
44
- emits: [presence, absolute]
45
- - id: a11y
46
- name: "a11y"
47
- applies_hint: "any rendered surface"
48
- emits: [presence, absolute]
49
- - id: responsiveness
50
- name: "Responsiveness / layout"
51
- applies_hint: "rendered surface"
52
- emits: [presence, forbidden-presence]
53
- - id: empty_state
54
- name: "Empty / null / zero state"
55
- applies_hint: "list / search / collection AC"
56
- emits: [presence]
57
- - id: overflow_underflow
58
- name: "Overflow / underflow"
59
- applies_hint: "numeric or quantity AC (R9: explicit underflow/overflow)"
60
- emits: [forbidden-presence]
61
- - id: persistence
62
- name: "Persistence / refresh"
63
- applies_hint: "AC asserts durable state"
64
- emits: [absolute]
65
- - id: temporal
66
- name: "Time / timezone / expiry"
67
- applies_hint: "AC involves dates, TTLs, schedules"
68
- emits: [state-transition, forbidden-presence]
69
- - id: currency
70
- name: "Currency / rounding"
71
- applies_hint: "money AC"
72
- emits: [absolute]
73
- - id: pagination
74
- name: "Pagination / sort / filter"
75
- applies_hint: "list / search AC"
76
- emits: [absolute, presence]
77
- - id: file_media
78
- name: "File / media"
79
- applies_hint: "upload surface"
80
- emits: [forbidden-presence]
81
- - id: notification
82
- name: "Notification / async-effect"
83
- applies_hint: "AC produces an out-of-band effect (email/SMS/push)"
84
- emits: [presence, delta]
85
- `;var He={"web-form":`
86
- id: web-form
87
- name: "Web form"
88
- version: 1
89
- applies_when: >
90
- The AC concerns a data-entry form: input fields, required fields, submit,
91
- validation messages.
92
- candidate_checks:
93
- - id: field-validation
94
- family: negative
95
- measurable_example: "Enter 'abc' in a numeric quantity field \u2192 inline error 'must be a number', value not accepted"
96
- emits: forbidden-presence
97
- - id: required-fields
98
- family: negative
99
- measurable_example: "Submit with a required field empty \u2192 submit blocked, field flagged"
100
- emits: forbidden-presence
101
- - id: formats
102
- family: negative
103
- measurable_example: "Email without @ rejected; valid accepted"
104
- emits: forbidden-presence
105
- - id: empty-state
106
- family: empty_state
107
- measurable_example: "First load: no stale values, placeholders shown"
108
- emits: presence
109
- - id: error-messages
110
- family: negative
111
- measurable_example: "Each error is specific and tied to its field"
112
- emits: presence
113
- - id: a11y
114
- family: a11y
115
- measurable_example: "Every input has a programmatic label; keyboard-only submit works"
116
- emits: presence
117
- - id: responsiveness
118
- family: responsiveness
119
- measurable_example: "No field overlap at 1280/768/375 px"
120
- emits: forbidden-presence
121
- `,"rest-graphql-api":`
122
- id: rest-graphql-api
123
- name: "REST / GraphQL API"
124
- version: 1
125
- applies_when: >
126
- The surface is an HTTP/GraphQL endpoint.
127
- candidate_checks:
128
- - id: response-shape
129
- family: api_contract
130
- measurable_example: "Body validates against the declared schema"
131
- emits: absolute
132
- - id: status-codes
133
- family: api_contract
134
- measurable_example: "GET 200, POST 201, missing 404, bad 400, unauth 401"
135
- emits: absolute
136
- - id: verbs
137
- family: idempotency
138
- measurable_example: "PUT is idempotent, POST is not"
139
- emits: delta
140
- - id: bad-payloads
141
- family: negative
142
- measurable_example: "Malformed JSON \u2192 400, never 500"
143
- emits: absolute
144
- - id: idempotency
145
- family: idempotency
146
- measurable_example: "Same POST with idempotency-key twice \u2192 one effect"
147
- emits: delta
148
- - id: pagination
149
- family: pagination
150
- measurable_example: "Page beyond last \u2192 empty list, not error; cursor stable"
151
- emits: absolute
152
- - id: versioning
153
- family: api_contract
154
- measurable_example: "v1 contract unchanged after v2 ships"
155
- emits: absolute
156
- - id: rate-limits
157
- family: api_contract
158
- measurable_example: "Over the limit \u2192 429 with retry-after"
159
- emits: absolute
160
- `,"mobile-native":`
161
- id: mobile-native
162
- name: "Mobile native"
163
- version: 1
164
- applies_when: >
165
- iOS/Android native surface.
166
- candidate_checks:
167
- - id: interruptions
168
- family: state_flow
169
- measurable_example: "Incoming call mid-flow \u2192 state preserved on return"
170
- emits: state-transition
171
- - id: network-transitions
172
- family: state_flow
173
- measurable_example: "wifi\u2192cellular\u21924G drop: no data loss, graceful retry"
174
- emits: state-transition
175
- - id: permissions
176
- family: negative
177
- measurable_example: "Deny camera \u2192 feature degrades, no crash"
178
- emits: forbidden-presence
179
- - id: orientation
180
- family: persistence
181
- measurable_example: "Rotate mid-form \u2192 input preserved"
182
- emits: absolute
183
- - id: deep-links
184
- family: state_flow
185
- measurable_example: "Cold-start deep link lands on the right screen with auth"
186
- emits: state-transition
187
- - id: state-persistence
188
- family: persistence
189
- measurable_example: "Kill + relaunch \u2192 resume where left off"
190
- emits: absolute
191
- - id: localization
192
- family: i18n
193
- measurable_example: "Device locale switch reformats and re-translates"
194
- emits: presence
195
- `,"stateful-flow":`
196
- id: stateful-flow
197
- name: "Stateful flow"
198
- version: 1
199
- applies_when: >
200
- Multi-step wizard / checkout / onboarding.
201
- candidate_checks:
202
- - id: valid-transitions
203
- family: state_flow
204
- measurable_example: "Each step advances only when its precondition is met"
205
- emits: state-transition
206
- - id: invalid-transitions
207
- family: state_flow
208
- measurable_example: "Can't jump to step 3 with step 2 incomplete"
209
- emits: forbidden-presence
210
- - id: back-and-abandon
211
- family: state_flow
212
- measurable_example: "Back from step 3, then abandon \u2192 no partial commit"
213
- emits: forbidden-presence
214
- - id: refresh-persistence
215
- family: persistence
216
- measurable_example: "Reload at step 2 \u2192 still at step 2 with data"
217
- emits: absolute
218
- - id: resume
219
- family: persistence
220
- measurable_example: "Return later \u2192 resume the saved flow"
221
- emits: absolute
222
- - id: double-submission
223
- family: idempotency
224
- measurable_example: "Double-click submit \u2192 exactly one submission"
225
- emits: delta
226
- `,"data-crud":`
227
- id: data-crud
228
- name: "Data CRUD"
229
- version: 1
230
- applies_when: >
231
- A persisted record.
232
- candidate_checks:
233
- - id: crud-round-trip
234
- family: crud
235
- measurable_example: "Create \u2192 read shows it \u2192 update \u2192 read shows the change \u2192 delete \u2192 read 404"
236
- emits: state-transition
237
- - id: retry-safety
238
- family: idempotency
239
- measurable_example: "Retried create with same key \u2192 one row"
240
- emits: delta
241
- - id: concurrency-lost-update
242
- family: concurrency
243
- measurable_example: "Two writers, last must not silently clobber \u2192 conflict surfaced"
244
- emits: forbidden-presence
245
- - id: delete-cascade
246
- family: crud
247
- measurable_example: "Delete parent \u2192 children handled per rule"
248
- emits: state-transition
249
- - id: referential-consistency
250
- family: crud
251
- measurable_example: "Can't create a child for a missing parent"
252
- emits: forbidden-presence
253
- `,"auth-gated":`
254
- id: auth-gated
255
- name: "Auth gated"
256
- version: 1
257
- applies_when: >
258
- Behind login/role.
259
- candidate_checks:
260
- - id: login-gate
261
- family: auth
262
- measurable_example: "Anonymous \u2192 redirected to login, not the resource"
263
- emits: forbidden-presence
264
- - id: role-permission-matrix
265
- family: auth
266
- measurable_example: "For each role \xD7 action: allowed/denied as specified"
267
- emits: absolute
268
- - id: cross-user-record
269
- family: auth
270
- measurable_example: "User A cannot read/edit user B's record by id"
271
- emits: forbidden-presence
272
- - id: token-session-expiry
273
- family: auth
274
- measurable_example: "Expired token \u2192 401/redirect, no stale access"
275
- emits: forbidden-presence
276
- - id: privilege-escalation
277
- family: auth
278
- measurable_example: "Non-admin cannot reach an admin action by direct URL/API"
279
- emits: forbidden-presence
280
- `,"search-list":`
281
- id: search-list
282
- name: "Search / list"
283
- version: 1
284
- applies_when: >
285
- Search results / list views.
286
- candidate_checks:
287
- - id: pagination
288
- family: pagination
289
- measurable_example: "First/last/empty page correct; total accurate"
290
- emits: absolute
291
- - id: sorting
292
- family: pagination
293
- measurable_example: "Sort asc/desc actually orders; ties stable"
294
- emits: absolute
295
- - id: filtering
296
- family: pagination
297
- measurable_example: "Each filter narrows correctly; combined filters AND"
298
- emits: absolute
299
- - id: empty-state
300
- family: empty_state
301
- measurable_example: "No results \u2192 friendly empty state, not blank/error"
302
- emits: presence
303
- - id: invalid-input
304
- family: negative
305
- measurable_example: "Garbage query \u2192 no crash, sane result"
306
- emits: forbidden-presence
307
- - id: length-limits
308
- family: bva
309
- measurable_example: "Max-length query handled"
310
- emits: absolute
311
- - id: locale
312
- family: i18n
313
- measurable_example: "Locale-correct collation/casing"
314
- emits: presence
315
- `};var We=`
316
- version: 1
317
- principles:
318
- - "Each step is one complete OBJECTIVE the browser agent achieves autonomously \u2014 state the goal and the path, never low-level actions (the agent emits its own actions)."
319
- - "One objective (or tightly-related items of one goal) per step; unrelated goals split."
320
- - "Verbose path: name site, page, section, panel, control, state \u2014 'On the search results page for Noida, in the filter panel's Budget section, set min to 50L and max to 1Cr'."
321
- - "Self-contained: concrete values inline; never 'as defined in the scenario' \u2014 the agent cannot see the graph."
322
- - "Browser-only: the agent authors/runs BROWSER tests. Direct API calls and the page's own network traffic ARE in scope; native-app-only behavior, out-of-band email/SMS, backend state with no browser surface are NOT."
323
- verification:
324
- - "Phrase checks against the analyzer that observes them:"
325
- - "Visual \u2014 visible text, labels, counts, prices ('verify the price is 29.99', 'the Sold out label is shown')."
326
- - "Textual/DOM \u2014 element states/attributes ('the Add button is disabled', 'the placeholder of the search box is \u2026')."
327
- - "URL \u2014 'URL contains /checkout', 'redirected to /login'. Title \u2014 'page title contains \u2026'."
328
- - "DevTools/Network \u2014 'no API calls returned 5xx', 'the POST /api/login returned 200' (covers direct API calls too)."
329
- - "DevTools/Console \u2014 'no console errors'. Performance \u2014 'LCP under 2500ms'. Cookies/localStorage \u2014 'a cookie named session_id exists'."
330
- - "Assertions: 'Assert/Verify/Confirm \u2026'. Extractions: 'Store \u2026 as name' \u2014 vague verbs (read/tell/report) do NOT persist values."
331
- - "Baselines/deltas are EXTRACTIONS: 'store the result count as baseline_count' BEFORE the action; compare after. Never an abstract 'capture the state'."
332
- variables:
333
- - "Credentials and environment values are {{name}} variables; concrete domain values from the source stay literal."
334
- - "A value no evidence supplies (start URL, test account, seed data) is ASKED for \u2014 actual value or a variable name \u2014 never invented."
335
- pitfalls:
336
- - "A test without a starting URL cannot run \u2014 the first step names it."
337
- - "'Test the checkout flow' has no end state \u2014 state what done looks like."
338
- - "Do not cram many unrelated operations into one step; do not reference data outside the step."
339
- `;var lt=["presence","forbidden-presence","count","delta","state-transition","absolute","bound","propagation","latency","graded"];function Qe(s,t){for(let e of s)if(!lt.includes(e))throw new Error(`${t}: emits '${e}' is not an oracle kind`)}function Ve(s,t){let e=de(s);if(!e||!Array.isArray(e.techniques))throw new Error(`${t}: expected { techniques: [...] }`);for(let i of e.techniques){if(!i.id||!i.name||!i.applies_hint||!Array.isArray(i.emits))throw new Error(`${t}: technique '${i?.id??"?"}' missing id/name/applies_hint/emits`);Qe(i.emits,`${t}: technique '${i.id}'`)}return e.techniques}function Ye(s,t){let e=de(s);if(!e||!e.id||!e.name||!e.applies_when||!Array.isArray(e.candidate_checks))throw new Error(`${t}: profile missing id/name/applies_when/candidate_checks`);for(let i of e.candidate_checks){if(!i.id||!i.family||!i.measurable_example||!i.emits)throw new Error(`${t}: candidate_check '${i?.id??"?"}' missing id/family/measurable_example/emits`);Qe([i.emits],`${t}: check '${i.id}'`)}return e}function Ke(s){let t=new Map(Ve(ze,"packaged techniques").map(i=>[i.id,i])),e=te(s,"design","techniques.yaml");if(ge(e))for(let i of Ve(pe(e,"utf8"),e))t.set(i.id,i);return[...t.values()]}function Je(s){let t=new Map(Object.entries(He).map(([i,a])=>[i,Ye(a,`packaged profile '${i}'`)])),e=te(s,"design","profiles");if(ge(e))for(let i of dt(e).filter(a=>a.endsWith(".yaml")||a.endsWith(".yml")).sort()){let a=Ye(pe(te(e,i),"utf8"),te(e,i));t.set(a.id,a)}return[...t.values()]}function Xe(s){let t=te(s,"design","runner-grammar.yaml");return ge(t)?pe(t,"utf8"):We}function se(s,t){return!s.superseded.has(t)}function fe(s,t,e){return{cid:t,logical_id:s.nameOf.get(t)??null,content:e}}async function Ze(s,t,e,i,a){let d=await Te(s,"search_similar",{text:t,label:e,k:i},a);return d.ok&&Array.isArray(d.result)?d.result:[]}async function et(s,t,e={}){let i=Y(s),a=i.resolve(t);if(!a)throw new Error(`assembleDesignContext: unknown use-case '${t}' (run designGate first)`);let d=a.tip,D=i.getNode(d);if(!D||D.label!==S.USECASE)throw new Error(`assembleDesignContext: '${t}' is not a use-case (run designGate first)`);let N=i.derivesInto(d).map(b=>({source_id:b.props.source_id??null,anchor:b.props.anchor??null})),x=[],h=new Set;for(let{cid:b,content:p}of i.byLabel(S.SCENARIO))se(i,b)&&i.edgesFrom(b).some(o=>o.type===E.BELONGS_TO&&o.dst===d)&&(x.push(fe(i,b,p)),h.add(b));let O=[];for(let{cid:b,content:p}of i.byLabel(S.AC)){if(!se(i,b))continue;let o=i.edgesFrom(b).find(r=>r.type===E.SCOPED_TO);!o||o.dst!==d&&!h.has(o.dst)||O.push({...fe(i,b,p),scoped_to:o.dst})}let m=Array.isArray(D.content.criteria)?D.content.criteria:[],y=[D.content.title,D.content.description,...m].filter(Boolean).join(`
340
- `),C=(await Ze(i,y,S.SCENARIO,10,e.embedSearch)).filter(b=>!h.has(b.cid)),B=[],f=new Set,q=[],F=[d],P=new Set([d]);for(;F.length>0;){let b=F.shift();for(let p of i.edgesFrom(b)){if(p.type!==E.DEPENDS_ON||i.nodeLabel.get(p.dst)!==S.USECASE)continue;let o=i.tipOf(p.dst);P.has(o)||(P.add(o),q.push(o),F.push(o))}}for(let b of q){let p=`depends_on ${i.nameOf.get(b)??b.slice(0,19)}`;for(let{cid:o}of i.byLabel(S.SCENARIO))if(se(i,o)&&i.edgesFrom(o).some(r=>r.type===E.BELONGS_TO&&r.dst===b))for(let r of i.edgesInto(o)){if(r.type!==E.AUTOMATES||!se(i,r.src)||f.has(r.src))continue;f.add(r.src);let u=String(i.getNode(r.src)?.content.title??"");B.push({cid:r.src,logical_id:i.nameOf.get(r.src)??null,title:u,via:p})}}for(let b of await Ze(i,y,S.TEST,5,e.embedSearch)){let{cid:p,title:o}=b;f.has(p)||(f.add(p),B.push({cid:p,logical_id:i.nameOf.get(p)??null,title:o??"",via:"similar"}))}let I=i.byLabel(S.STYLENOTE).filter(b=>se(i,b.cid)).sort((b,p)=>b.cid<p.cid?-1:1).slice(0,5).map(b=>`${String(b.content.statement)} [${String(b.content.learned_from_kind)}]`);return{usecase:fe(i,d,D.content),cites:N,committed_acs:O,existing:{scenarios:x,reuse_candidates:C},import_candidates:B,style_notes:I,techniques:Ke(s),profiles:Je(s),runner_grammar:Xe(s),budget:{...e.max!=null?{max_pairs:e.max}:{},...e.strength!=null?{strength_override:e.strength}:{}},design_of:(()=>{let b=Me(i,d);return b?{engine:b.engine,seq:b.seq}:null})()}}function tt(s){let t=e=>{if(Array.isArray(e))return e.map(t);if(e!==null&&typeof e=="object"){let i={};for(let a of Object.keys(e).sort())i[a]=t(e[a]);return i}return e};return JSON.stringify(t(s),null,1)}var ne=s=>({record:null,errors:s,minted:{},logicalIds:{},superseded:[],warnings:[],finalizedTests:{}});function ie(s){return s.toLowerCase().trim().replace(/\s+/g," ")}function he(s,t){let e=s.resolve(t);if(!e||s.nodeLabel.get(e.cid)!==S.USECASE||e.superseded)return[];let i=new Set;for(let{cid:a}of s.byLabel(S.SCENARIO))if(!s.superseded.has(a)&&s.edgesFrom(a).some(d=>d.type===E.BELONGS_TO&&s.tipOf(d.dst)===e.cid)){i.add(a);for(let d of s.edgesInto(a))d.type!==E.AUTOMATES||s.superseded.has(d.src)||i.add(d.src)}return[...i]}function st(s){let{contextDir:t,graph:e,sections:i,by:a}=s,d=s.engine??"design@1",D=$e(t);if(e.latestHash!==D)return ne([{code:"STALE_BASIS",detail:`graph opened at ${String(e.latestHash)} but chain head is ${String(D)} \u2014 re-open and retry`}]);let N=e.resolve(s.ucRef);if(!N||e.nodeLabel.get(N.cid)!==S.USECASE||N.superseded)return ne([{code:"UNKNOWN_UC",detail:`${s.ucRef} is not a live use-case`}]);let x=N.cid,h=[],O=[],m=[],y=[],C=[],B=[],f={},q={},F={},P=[],I=[],b=new Set,p=[],o=new Set,r=new Set,u=[];{let n=s.forceScope??(s.force?he(e,s.ucRef):[]),l=new Set;s.sections.scenarios?.length&&l.add(S.SCENARIO),s.sections.tests?.length&&l.add(S.TEST);for(let c of n)e.superseded.has(c)||(l.has(e.nodeLabel.get(c)??"")?r.add(c):u.push(c))}let A=new Set,$=n=>!e.superseded.has(n)&&(!r.has(n)||A.has(n)),j=(n,l,c)=>{if(f[n])return f[n];let w=e.resolve(n),_=w?$(w.cid)?w.cid:e.tipOf(w.cid):null;return!w||!_||!$(_)?(h.push({code:"UNKNOWN_REF",detail:`${l}: '${n}' is neither in this payload nor a live committed node`}),null):c&&e.nodeLabel.get(_)!==c?(h.push({code:"ILLEGAL_EDGE",detail:`${l}: '${n}' is a ${e.nodeLabel.get(_)}, expected ${c}`}),null):_},H=(n,l,c,w)=>{if(e.nameOf.has(l)){q[w]=e.nameOf.get(l);return}let _=Re(n,c,L=>b.has(L)||e.names.has(L)&&!e.superseded.has(e.names.get(L)));_!==null&&(b.add(_),C.push({cid:l,slug:_,by:a}),q[w]=_)},U=(n,l,c,w)=>{for(let L of we(n,c))h.push({code:L.code,detail:`${l}: ${L.detail}`});let _=xe(n,c);return e.hasNode(_)&&!e.superseded.has(_)?(r.has(_)&&A.add(_),f[l]=_,_):(O.push({cid:_,label:n,content:c}),f[l]=_,H(n,_,w,l),_)},M=(n,l,c,w,_)=>{let L=ue(n,l,c,w);if(e.edgesFrom(l).some(g=>g.ecid===L&&!e.superseded.has(g.ecid))){n===E.AUTOMATES&&o.add(c);return}let Q=e.nodeLabel.get(l)??O.find(g=>g.cid===l)?.label??"(unknown)",R=e.nodeLabel.get(c)??O.find(g=>g.cid===c)?.label??"(unknown)";for(let g of ke(n,Q,R,w))h.push({code:g.code,detail:`${_}: ${g.detail}`});let T=De(e,n,l,c,p);if(T){h.push({code:T.code,detail:`${_}: ${T.detail}`});return}if(n===E.AUTOMATES){if(o.has(c)){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: two automates onto ${c} in one record (strict 1:1)`});return}if(o.add(c),!r.has(c)||A.has(c)){let g=G=>r.has(G)&&!A.has(G);if(e.edgesFrom(l).some(G=>G.type===E.AUTOMATES&&G.dst!==c&&!e.superseded.has(G.dst)&&!g(G.dst))&&e.hasNode(l)){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: automates from ${l} already has a live edge \u2014 supersede it first`});return}if(e.edgesInto(c).some(G=>G.type===E.AUTOMATES&&G.src!==l&&!e.superseded.has(G.src)&&!g(G.src))){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: automates onto ${c} already has a live edge \u2014 strict 1:1, supersede it first`});return}}}m.push({ecid:ue(n,l,c,w),type:n,src:l,dst:c,props:w}),p.push({src:l,dst:c,type:n})},W=new Set;for(let n of i.gaps??[]){let l=n.temp_ref??n.ref??"gap",c=n.question;if(!c||typeof c!="object"||!c.header||!Array.isArray(c.options)||c.options.length===0||!Number.isInteger(c.recommended_index)){h.push({code:"GAP_QUESTION_INCOMPLETE",detail:`${l}: design gaps carry a full ranked question object (header/options/recommended_index)`});continue}n.kind==="budget-evicted"&&n.ref&&W.add(n.ref);let w={kind:n.kind,question:c,derived:!0,uc:x,...n.risk?{risk:n.risk}:{},...n.risk_rationale?{risk_rationale:n.risk_rationale}:{},...n.text?{text:n.text}:{},...n.ref?{ref:n.ref}:{}};U(S.GAP,l,w,String(c.header))}let K=new Map;for(let{cid:n,content:l}of e.byLabel(S.SCENARIO))$(n)&&e.edgesFrom(n).some(c=>c.type===E.BELONGS_TO&&e.tipOf(c.dst)===x)&&K.set(ie(String(l.title??"")),n);for(let n of i.scenarios??[]){let l=K.get(ie(n.title));if(l){h.push({code:"DUPLICATE_SCENARIO",detail:`${n.temp_ref}: '${n.title}' duplicates live scenario ${e.nameOf.get(l)??l} \u2014 exercise/link it instead (reuse before minting)`});continue}let c={title:n.title,intent:n.intent,case_type:n.case_type,derived:!0,...n.technique_notes?{technique_notes:n.technique_notes}:{},...n.description?{description:n.description}:{},...n.parameters?{parameters:n.parameters}:{},...n.tags?{tags:n.tags}:{}};U(S.SCENARIO,n.temp_ref,c,n.title)}for(let n of i.scenarios??[]){let l=f[n.temp_ref];if(l){M(E.BELONGS_TO,l,x,{},n.temp_ref);for(let c of n.depends_on??[]){let w=j(c,`${n.temp_ref}.depends_on`,S.SCENARIO);w&&M(E.DEPENDS_ON,l,w,{},`${n.temp_ref}.depends_on`)}}}for(let n of i.acs??[]){let l={text:n.text,kind:n.kind,risk:n.risk,derived:!0,...n.expected_answer?{expected_answer:n.expected_answer}:{},...n.measurable!==void 0?{measurable:n.measurable}:{}},c=U(S.AC,n.temp_ref,l,n.text);if(!c)continue;let w=n.scope?.type==="scenario"&&n.scope.ref?j(n.scope.ref,`${n.temp_ref}.scope`,S.SCENARIO):x;w&&!e.edgesFrom(c).some(_=>_.type===E.SCOPED_TO&&!e.superseded.has(_.ecid))&&M(E.SCOPED_TO,c,w,{},`${n.temp_ref}.scope`);for(let _ of n.cites??[]){let L={source_id:_.source_id,source_cid:_.source_cid,anchor:_.anchor,..._.quote?{quote:_.quote}:{}};M(E.DERIVES,_.source_cid,c,L,`${n.temp_ref}.cite`)}}for(let n of i.exercises??[]){let l=j(n.scenario,"exercises.scenario",S.SCENARIO),c=j(n.ac,"exercises.ac",S.AC);l&&c&&M(E.EXERCISES,l,c,{},`exercises ${n.scenario}\u2192${n.ac}`)}for(let n of i.scoped_to_repoints??[]){let l=j(n.ac,"scoped_to_repoints.ac",S.AC),c=j(n.to,"scoped_to_repoints.to");if(!l||!c)continue;let w=e.edgesFrom(l).find(_=>_.type===E.SCOPED_TO&&!e.superseded.has(_.ecid));w&&y.push({kind:"edge",ecid:w.ecid,reason:`re-scoped to ${n.to} by ${a.id}`,by:a}),M(E.SCOPED_TO,l,c,{},`scoped_to_repoints ${n.ac}`)}let X=new Map;if(s.finalizeTestBody)for(let[n,l]of e.nameOf)X.set(e.tipOf(n),l);let V=n=>e.nameOf.get(n)??X.get(e.tipOf(n))??null,Z=n=>{let l=f[n];if(l)return q[n]??V(l);if(e.names.has(n))return e.resolve(n)?n:null;let c=e.resolve(n);return c?V(e.tipOf(c.cid)):null};for(let n of i.tests??[]){for(let R of n.reuses??[])W.has(R)&&h.push({code:"REUSES_EVICTED",detail:`${n.temp_ref}: reuses '${R}' which was budget-evicted \u2014 drop the edge; the dependent gap names the missing @import`});let l=n.test_md_blob,c=n.definitionId,w=n.objectives_blob;if(s.finalizeTestBody){let R;try{R=s.finalizeTestBody({temp_ref:n.temp_ref,test_md_blob:n.test_md_blob,verifies:n.verifies,reuses:n.reuses??[]},Z)}catch(T){return ne([{code:"FINALIZE_BODY",detail:`${n.temp_ref}: ${T instanceof Error?T.message:String(T)}`}])}R&&(l=R.test_md_blob,c=R.definitionId,w=R.objectives_blob??w,F[n.temp_ref]=c)}let _={title:n.title,check:n.check,definitionId:c,derived:!0,...n.config?{config:n.config}:{},...l?{test_md_blob:l}:{},...w?{objectives_blob:w}:{},...n.surface_required!==void 0?{surface_required:n.surface_required}:{}},L=U(S.TEST,n.temp_ref,_,n.title);if(!L)continue;let Q=j(n.automates,`${n.temp_ref}.automates`,S.SCENARIO);Q&&M(E.AUTOMATES,L,Q,{},`${n.temp_ref}.automates`);for(let R of n.verifies){let T=j(R,`${n.temp_ref}.verifies`,S.AC);T&&M(E.VERIFIES,L,T,{},`${n.temp_ref}.verifies`)}for(let R of n.reuses??[]){if(W.has(R))continue;let T=j(R,`${n.temp_ref}.reuses`,S.TEST);T&&M(E.REUSES,L,T,{},`${n.temp_ref}.reuses`)}for(let R of n.verifies){let T=f[R]??e.resolve(R)?.cid;T&&(e.trust.get(T)??"derived")==="derived"&&!O.some(g=>g.cid===T)?P.push(`${n.temp_ref}: verifies ${R} which is still DERIVED (unapproved) \u2014 committed anyway; approve it in chat or via review`):T&&f[R]===T&&(i.acs??[]).some(g=>g.temp_ref===R)&&P.push(`${n.temp_ref}: verifies ${R} minted in this same record (unapproved) \u2014 committed anyway; approve it in chat`)}if(n.verifies.length>1){let R=n.check?.verified_against;P.push(`${n.temp_ref}: verifies ${n.verifies.length} ACs but machine-asserts only 1 (check.verified_against=${R!=null?String(R):"?"}) \u2014 the rest ride prose only`)}}let ce=[];{let n=(g,v)=>`${g??""}\0${ie(String(v??""))}`,l=(g,v)=>s.reason?`${s.reason} \u2014 evolve by ${a.id}${v?` (${v})`:""}`:g,c=new Map;for(let g of O){if(g.label!==S.SCENARIO&&g.label!==S.TEST)continue;let v=n(g.label,g.content.title);c.set(v,[...c.get(v)??[],g.cid])}let w=new Map;for(let g of r){if(A.has(g))continue;let v=n(e.nodeLabel.get(g),e.getNode(g)?.content.title);w.set(v,[...w.get(v)??[],g])}for(let[g,v]of w){let k=c.get(g)??[],G=v.length===1&&k.length===1;for(let z of v)G?(y.push({kind:"node",old:z,new:k[0],reason:l(`--force redesign of ${s.ucRef} by ${a.id} (title-matched successor)`,"title-matched successor"),by:a}),ce.push({old:z,next:k[0]})):y.push({kind:"node",old:z,new:null,reason:l(`--force redesign of ${s.ucRef} by ${a.id}`),by:a}),I.push(z)}let _=g=>e.edgesFrom(g).some(v=>v.type!==E.SCOPED_TO?!1:v.dst===x||e.tipOf(v.dst)===x?!0:e.nodeLabel.get(v.dst)===S.SCENARIO&&e.edgesFrom(v.dst).some(k=>k.type===E.BELONGS_TO&&e.tipOf(k.dst)===x)),L=new Map;for(let{cid:g,content:v}of e.byLabel(S.AC)){if(e.superseded.has(g)||!_(g))continue;let k=ie(String(v.text??""));L.set(k,[...L.get(k)??[],g])}let Q=new Map;for(let g of O){if(g.label!==S.AC)continue;let v=ie(String(g.content.text??""));Q.set(v,[...Q.get(v)??[],g.cid])}for(let[g,v]of L){let k=Q.get(g)??[];v.length!==1||k.length!==1||(y.push({kind:"node",old:v[0],new:k[0],reason:l(`AC re-emitted with changed content by ${a.id} (text-matched successor)`,"AC text-matched successor"),by:a}),ce.push({old:v[0],next:k[0]}),I.push(v[0]))}let R=new Set(I),T=new Set;for(let g of y)g.kind==="edge"&&T.add(g.ecid);for(let{old:g,next:v}of ce)for(let k of e.edgesInto(g))Se(k.type)?.pin?.comparesTo!=="dst_tip"||e.superseded.has(k.src)||R.has(k.src)||T.has(k.ecid)||(y.push({kind:"edge",ecid:k.ecid,reason:`re-blessed onto ${v} (redirect successor of ${g}) by ${a.id}`,by:a}),T.add(k.ecid),m.some(z=>z.type===k.type&&z.src===k.src&&z.dst===v)||e.edgesFrom(k.src).some(z=>z.type===k.type&&z.dst===v))||k.type===E.AUTOMATES&&o.has(v)||M(k.type,k.src,v,k.props,`rebless ${k.type} from ${e.nameOf.get(k.src)??k.src}`)}return h.length>0?ne(h):O.length===0&&m.length===0&&y.length===0&&B.length===0?Object.keys(f).length>0?(P.push("everything in this phase is already current \u2014 nothing re-committed"),{record:null,errors:null,minted:f,logicalIds:q,superseded:[],warnings:P,finalizedTests:F,...s.force||s.forceScope?{forceScopeRemaining:u}:{}}):ne([{code:"EMPTY_DESIGN",detail:"finalize_design produced nothing to commit"}]):{record:Ee(t,{ts:new Date().toISOString(),proposal_id:null,nodes:O,edges:m,review:[],supersessions:y,source_head_moves:{},...C.length>0?{names:C}:{},...(()=>{for(let n of i.judgements??[]){let l=n.target?f[n.target]??e.resolve(n.target)?.cid??x:x;B.push({about:l,rationale:`[${n.kind}] ${n.rationale}`,by:a})}return B.length>0?{judgements:B}:{}})(),design_of:{uc_cid:x,engine:d}}).record,errors:null,minted:f,logicalIds:q,superseded:I,warnings:P,finalizedTests:F,...s.force||s.forceScope?{forceScopeRemaining:u}:{}}}import{existsSync as nt,mkdirSync as ut,readdirSync as mt,readFileSync as it,renameSync as gt,writeFileSync as pt}from"fs";import{join as oe}from"path";var ft=/^@import\s+(\S+)\s*$/;function ht(s){return oe(s,".testmuai","tests")}function _t(s){let t=new Map;if(!nt(s))return t;for(let e of mt(s)){if(!e.endsWith("_test.md"))continue;let i=oe(s,e);try{let a=le(it(i,"utf8"))?.id;a&&t.set(a,[...t.get(a)??[],i])}catch{}}return t}function bt(s,t){let e=`${s}.tmp-mint`;pt(e,t),gt(e,s)}function rt(s){let{graph:t,cids:e,cwd:i}=s,a=ht(i),d=[],D=[],N=_t(a),x=new Set,h=(m,y)=>{let C=N.get(m);if(C&&C.length>1)return D.push({id:m,reason:`two files claim assurance.id ${m}: ${C.join(" \xB7 ")} \u2014 resolve the duplicate first`}),null;if(x.has(m))return O(m);if(y.includes(m))return O(m)??`${m}_test.md`;let B=t.resolve(m),f=B?t.getNode(B.tip):void 0,q=f?.content.test_md_blob,F=f?.content.definitionId;if(!q||!F)return D.push({id:m,reason:`${m} has no test definition in the graph`}),null;let I=q.split(`
341
- `).map(o=>{let r=ft.exec(o.trim());if(!r)return o;let u=r[1];if(!t.resolve(u))return o;let A=h(u,[...y,m]);if(!A)throw new ae(`dependency ${u} could not be minted/located`);return`@import ./${A}`}).join(`
342
- `),b=`---
343
- assurance:
344
- id: ${m}
345
- base: ${F}
346
- ---
347
- ${I.endsWith(`
348
- `)?I:I+`
349
- `}`,p=C?.[0];if(p){let o=it(p,"utf8"),r=le(o)?.base,u=ee(J(o,ve(a,t)));if(!r||u!==r)return D.push({id:m,reason:`${p} was edited since the engine last wrote it \u2014 keeping yours (reconcile via a run or maintain)`}),null}else{let o=oe(a,`${m}_test.md`);for(let r=2;nt(o);r++)o=oe(a,`${m}-${r}_test.md`);p=o}return ut(a,{recursive:!0}),bt(p,b),x.add(m),N.set(m,[p]),d.push({id:m,path:p}),p.split("/").pop()},O=m=>N.get(m)?.[0]?.split("/").pop()??null;for(let m of e){let y=t.nameOf.get(m);if(!y){D.push({id:m,reason:"minted test has no logical id"});continue}try{h(y,[])}catch(C){if(C instanceof ae)D.push({id:y,reason:C.message});else throw C}}return{wrote:d,refused:D}}var ae=class extends Error{};import{basename as yt,dirname as vt,resolve as wt}from"path";var St=new Set(["narrative","acs","scenarios","tests","exercises","gaps","scoped_to_repoints","judgements","phase"]);function kt(s){let t=/strength=(\d+)\s*(?:—|-)?\s*(.*)/.exec(s??"");return t?{strength:Number(t[1]),reason:t[2]||s||""}:{strength:2,reason:s??""}}function xt(s,t,e=new Set,i=0){return J(t,re(s),e,i)}function $t(s,t,e,i){let a=t.scenarios?.find(m=>m.temp_ref===e.automates)??(()=>{let m=s.resolve(e.automates),y=m?s.getNode(m.tip)?.content:void 0;return y?{title:String(y.title??""),intent:String(y.intent??""),technique_notes:String(y.technique_notes??"")}:{}})(),d=[...(t.acs??[]).map(m=>({ref:m.temp_ref,text:m.text})),...e.verifies.filter(m=>!(t.acs??[]).some(y=>y.temp_ref===m)).map(m=>{let y=s.resolve(m);return{ref:m,text:y?String(s.getNode(y.tip)?.content.text??""):""}})],{test_md:D,objectives_yaml:N}=ye({title:e.title,steps:e.steps,check:e.check,check_prose:e.check_prose,reuses:e.reuses},{title:a.title,intent:a.intent},d),x=ee(xt(s,D)),h=e.check,O={technique:a.technique_notes??"",profile_family:t.judgements?.find(m=>m.kind==="profile_family"&&(m.target===e.temp_ref||m.target===e.automates))?.rationale??"unspecified",anchor:h.verified_against,expected_how:t.judgements?.find(m=>m.kind==="expected_how"&&m.target===h.verified_against)?.rationale??`expected_mode: ${h.expected_mode??"inferred"}`,combinatorial:kt(a.technique_notes),surface_state:"absent",deferred_bindings:h.expected_mode==="runtime-derived"?1:0};return i.push({definitionId:x,rationale:O,anchorRef:h.verified_against,tempRef:e.temp_ref}),{temp_ref:e.temp_ref,title:e.title,automates:e.automates,verifies:e.verifies,check:e.check,definitionId:x,test_md_blob:D,objectives_blob:N,...e.reuses?.length?{reuses:e.reuses}:{},...e.surface_required!==void 0?{surface_required:e.surface_required}:{}}}function ot(s){let t=0,e=s.forceScope??null;return{terminalEventType:"design",async onProposalEvent(i){let a=r=>s.steer?(s.steer(`[auto-repair] ${r} \u2014 please re-finalize with this fixed.`),{proposal:null,error:null}):{proposal:null,error:r};if(i==null||typeof i!="object")return a("finalize_design payload is not an object");let d=i,D=Object.keys(d).filter(r=>!St.has(r));if(D.length>0)return a(`finalize_design carries ungated/unknown section(s): ${D.join(", ")} \u2014 mintable here: acs, scenarios, tests (+gaps)`);let N=new Map;for(let r of d.tests??[]){let u=N.get(r.automates);if(u)return a(`strict 1:1 violated in-payload: ${u} and ${r.temp_ref} both automate ${r.automates}`);N.set(r.automates,r.temp_ref)}let x=Y(s.contextDir);s.force&&!s.resuming&&t===0&&e===null&&(e=he(x,s.ucRef));let h=x.resolve(s.ucRef),O=h?String(x.getNode(h.tip)?.content.risk??"med"):"med",m=[],y=new Set([s.ucRef,h?.cid,h?.tip].filter(Boolean)),C=r=>{if(y.has(r))return!0;let u=x.resolve(r);return u!=null&&(y.has(u.cid)||y.has(u.tip))},B;try{B={...d.acs?.length?{acs:d.acs.map(r=>({temp_ref:r.temp_ref,text:r.text,kind:r.kind,risk:r.risk??O,...r.expected_answer?{expected_answer:r.expected_answer}:{},...r.scoped_to&&!C(r.scoped_to)?{scope:{type:"scenario",ref:r.scoped_to}}:{}}))}:{},...d.scenarios?.length?{scenarios:d.scenarios}:{},...d.tests?.length?{tests:d.tests.map(r=>$t(x,d,r,m))}:{},...d.exercises?.length?{exercises:d.exercises}:{},...d.gaps?.length?{gaps:d.gaps}:{},...d.scoped_to_repoints?.length?{scoped_to_repoints:d.scoped_to_repoints}:{},...d.judgements?.length?{judgements:d.judgements}:{}}}catch(r){return a(r instanceof Error?r.message:String(r))}let f=st({contextDir:s.contextDir,graph:x,ucRef:s.ucRef,sections:B,by:s.by,...s.engine?{engine:s.engine}:{},...e?.length?{forceScope:e}:{},...s.because?{reason:s.because}:{},finalizeTestBody:(()=>{let r=new Map((B.tests??[]).map($=>[$.temp_ref,$])),u=new Map,A=($,j,H)=>{let U=r.get($);if(!U?.test_md_blob)return null;let M=u.get($);if(M!==void 0)return M;if(H.has($))return U.test_md_blob;H.add($);let W=new Map;for(let V of U.reuses??[]){A(V,j,H);let Z=j(V);Z!==null&&Z!==V&&W.set(V,Z)}let K=U.verifies.map(j).filter(V=>V!==null),X=_e(be(U.test_md_blob,W),K);return u.set($,X),X};return($,j)=>{if(!$.test_md_blob)return null;let H=A($.temp_ref,j,new Set)??$.test_md_blob;if(H===$.test_md_blob)return null;let U=M=>{for(let W of r.keys())if(j(W)===M){let K=A(W,j,new Set);if(K!==null)return{body:K,cycleKey:`batch:${M}`,next:U}}return re(x)(M)};return{test_md_blob:H,definitionId:ee(J(H,U))}}})()});if(f.errors)return a("design commit failed: "+f.errors.map(r=>`${r.code}: ${r.detail}`).join("; "));let q=f.warnings.filter(r=>r.includes("\u2014 committed anyway; approve"));for(let r of f.warnings)(!q.includes(r)||q.length===1)&&s.note(`warning: ${r}`);q.length>1&&s.note(`warning: ${q.length} verifies edges target not-yet-approved items \u2014 committed anyway; approve them in chat or via review`);let F=(r,u)=>r?`${r} ${u}${r>1?"s":""}`:null,P=[F(d.acs?.length,"AC"),F(d.scenarios?.length,"scenario"),F(d.tests?.length,"test"),F(d.gaps?.length,"gap")].filter(Boolean);{let r=`saved ${P.join(" \xB7 ")||"judgements/wiring"} as drafts`;(s.commitLine??s.note)(r)}s.aliases?.(Object.entries(f.minted).map(([r,u])=>({ref:r,cid:u})));let I=Y(s.contextDir);s.onCommitted?.(I);for(let r of m){let u=f.logicalIds[r.anchorRef]??f.minted[r.anchorRef];Ue(s.contextDir,f.finalizedTests[r.tempRef]??r.definitionId,{...r.rationale,anchor:u??r.rationale.anchor})}try{let r=Object.values(f.minted).filter(u=>I.getNode(u)?.label==="test");if(r.length>0){let u=vt(wt(s.contextDir)),A=rt({graph:I,cids:r,cwd:u});A.wrote.length>0&&s.note(`\u2692 wrote ${A.wrote.map($=>yt($.path)).join(" \xB7 ")}`);for(let $ of A.refused)s.note(`warning: mint refused ${$.id} \u2014 ${$.reason}`)}}catch(r){s.note(`warning: file mint failed (${r instanceof Error?r.message:String(r)}) \u2014 the design commit stands`)}s.event?.({type:"commit",acs:d.acs?.length??0,scenarios:d.scenarios?.length??0,tests:d.tests?.length??0,gaps:d.gaps?.length??0,warnings:f.warnings.length,minted:Object.entries(f.minted).map(([r,u])=>({temp_ref:r,cid:u,...f.logicalIds[r]?{logical_id:f.logicalIds[r]}:{}}))}),t+=1,e!==null&&(e=f.forceScopeRemaining??e,s.onForceScope?.(e));let b=Ae({verb:"design",commitN:t,ucRef:s.ucRef,phase:d.phase??(d.tests?.length?"tests":d.scenarios?.length?"scenarios":d.acs?.length?"acs":"design"),committed:Object.entries(f.minted).map(([r,u])=>({temp_ref:r,cid:u,...f.logicalIds[r]?{logical_id:f.logicalIds[r]}:{}})),warnings:f.warnings},I),p=b.event.parity?.missing??[],o=!!d.tests?.length&&p.length===0;return{proposal:f,error:null,receipt:b,...o?{sessionComplete:o}:{}}}}}function at(s,t){return{type:"run_config",version:1,session_id:t.session_id,mode:t.mode,source:{source_id:`design:${s.usecase.logical_id??t.ucCid.slice(0,19)}`,source_cid:t.ucCid,kind:"design_context",numbered_text:tt({...s,session_mode:t.mode})},existing_use_cases:[],read_basis:t.readBasis,max_free_text_rounds:2,graph_reads:!0,verb:"design",chat:!0,design_budget:s.budget,topology:t.topology}}function Ct(s,t){return{terminalEventType:"design",async onProposalEvent(e){let i=e??{},a=["acs","scenarios","tests","gaps"].map(d=>i[d]?.length?`${i[d].length} ${d}`:null).filter(Boolean).join(" \xB7 ");return s(`plan: finalize_design \u2014 ${a||"wiring/judgements only"} (nothing committed)`),s(JSON.stringify(i,null,2)),t?.({type:"plan",payload:i}),{proposal:i,error:null}}}}async function Ts(s,t){let e=Y(t.contextDir),i=null,a=s.useCase;if(s.resume){try{let u=Pe(t.contextDir,s.resume,e);i=u.handle,u.staleBasis.length>0&&(t.out(`note: sources changed since the pause: ${u.staleBasis.join(", ")} \u2014 the design continues against the current versions`),t.emit?.({type:"stale_basis",sources:u.staleBasis}))}catch(u){if(u instanceof qe)return t.out(`error: ${u.message}`),t.emit?.({type:"error",message:`error: ${u.message}`}),u.code==="SESSION_MISSING"||u.code==="SESSION_EXPIRED"?2:1;throw u}let o=i.state;if(o.verb&&o.verb!=="design")return t.out(`error: session ${s.resume} is a ${o.verb} session \u2014 resume it with kane-cli context extract --resume ${s.resume}`),t.emit?.({type:"error",message:`error: session ${s.resume} is a ${o.verb} session \u2014 resume it with kane-cli context extract --resume ${s.resume}`}),i.release(),2;if(a=a??o.use_case,o.uc_tip&&a){let u=e.resolve(a)?.tip;u&&u!==o.uc_tip&&(t.out("note: the use-case changed since the pause \u2014 the design continues against the new version"),t.emit?.({type:"stale_basis",usecase:a}))}let r=i.state.held_receipts??[];if(r.length>0)if(t.chat?.holdReceipt)for(let u of r)t.chat.holdReceipt(u);else t={...t,initialMessage:[r.join(`
350
-
351
- `),t.initialMessage].filter(Boolean).join(`
352
-
353
- `)};if(!a)return t.out(`error: session ${s.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`),t.emit?.({type:"error",message:`error: session ${s.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`}),i.release(),2}let d=!!(s.force||i?.state.force),D=!!(s.resume&&i),N=Ge(e,a,d||D);if(!N.ok)return t.out(`design: ${N.message}`),t.emit?.({type:"gate_refused",message:N.message}),i?.release(),N.code;if(t.preflightTurn){let o=await t.preflightTurn();if(!o.ok)return t.out(o.message??"error: turn-endpoint preflight failed"),t.emit?.({type:"error",message:o.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),i?.release(),2}let x={contextDir:t.contextDir,resolveAlias:o=>Oe(o,{env:process.env,auth:t.auth}),embed:(o,r)=>Ie(o,r,{env:process.env,auth:t.auth})};t.chat?.setWorking?.("assembling context\u2026");let h=await et(t.contextDir,a,{max:s.max,strength:s.strength,embedSearch:x});s.priorDesign!==void 0&&(h.prior_design=s.priorDesign),s.changeDelta!==void 0&&(h.change_delta=s.changeDelta),s.because&&(h.because=s.because);let O=t.now?.()??new Date,m=`${O.toISOString().replace(/[-:]/g,"").slice(0,15)}-${Dt(2).toString("hex")}`,y=s.mode??"interactive",C=at(h,{session_id:s.resume??`design-${m}`,mode:y,ucCid:h.usecase.cid,readBasis:e.latestHash,topology:Le("design")});s.plan?C.chat=!1:C.chat=!0,s.resume&&i&&(C.resume={agent_state:i.state.agent_state},t.out(`resuming design session ${s.resume}`),i.state.assumed.length>0&&t.out(`note: ${i.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${s.resume} lists them`),s.message&&(t={...t,initialMessage:[t.initialMessage,s.message].filter(Boolean).join(`
354
-
355
- `)}));let B=ct(t.contextDir,"logs");Et(B,{recursive:!0});let f=ct(B,`design-${m}.log`);t.out(`trace: ${me(f)}`),t.emit?.({type:"run_start",mode:y,trace:f,use_case:a});let q=(o,r,u)=>{try{Rt(f,JSON.stringify({ts:new Date().toISOString(),kind:o,session_id:u,data:r})+`
356
- `)}catch{}},F=null,P={current:e};t.chat?.attachOnCommitted?.(o=>{P.current=o});let I="";if(t.chat&&!s.plan){let o=Ce({contextDir:t.contextDir,graph:Y(t.contextDir),sessionStamp:C.session_id,by:t.by??{kind:"human",id:"owner"}});o.errors===null||o.errors[0]?.code==="CONV_SOURCE_EXISTS"?(I=o.sourceId,t.chat.attachConversationSource?.(I),P.current=Y(t.contextDir)):t.out(`warning: conversation source unavailable (${o.errors[0]?.detail}) \u2014 chat adds will not land this session`)}let b=s.plan?Ct(t.out,t.emit):ot({contextDir:t.contextDir,ucRef:a,by:{kind:"ai",id:"design-agent"},force:d,engine:"design@1",note:o=>t.chat?t.chat.note(o):t.out(o),commitLine:o=>t.chat?t.chat.ledger({kind:"commit",ok:!0,line:o}):t.out(o),steer:t.chat?o=>t.chat.submit(o):void 0,event:t.emit,resuming:D,...i?.state.force_scope?.length?{forceScope:i.state.force_scope}:{},onForceScope:o=>{F=o},...s.because?{because:s.because}:{},aliases:t.chat?o=>t.chat.registerAliases?.(o):void 0,onCommitted:o=>{P.current=o}});t.chat||t.out(`designing: ${h.usecase.logical_id??a} (budget ${h.budget.max_pairs!=null?`${h.budget.max_pairs} pairs`:"no ceiling"}${h.budget.strength_override?`, strength ${h.budget.strength_override}`:""})`),t.chat?.setWorking?.(`designing ${h.usecase.logical_id??a}\u2026`);let p;try{p=await Ne(C,{...t,graphSlot:P},new Map,e,q,b)}catch(o){throw q("error",{message:o instanceof Error?o.message:String(o),stack:o instanceof Error?o.stack:void 0},C.session_id),i?.release(),o}finally{t.chat?.setWorking?.(null)}if(p.highRisk)return t.out(`error: ${p.highRisk.length} high-risk decision${p.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),t.emit?.({type:"error",message:`error: high-risk question(s) in ci mode (fail-closed): ${p.highRisk.map(o=>o.id).join(", ")}`,code:"HIGH_RISK_CI"}),i?.release(),1;if(p.paused){let o=i;o||(o=Fe(t.contextDir,{sid:C.session_id,mode:"agent",created_at:O.toISOString(),expires_at:new Date(O.getTime()+1440*60*1e3).toISOString(),agent_state:p.paused.agent_state,pending:{questions:[],proposals:[]},read_basis:Object.fromEntries((e.resolve(a)?e.edgesInto(e.resolve(a).tip):[]).filter($=>$.type==="DERIVES"&&typeof $.props.source_id=="string").map($=>[String($.props.source_id),e.heads.get(String($.props.source_id))??null])),assumed:[],corpus_cursor:{remaining:[]},conv_source:I,verb:"design",use_case:a,...e.resolve(a)?.tip?{uc_tip:e.resolve(a).tip}:{},...d?{force:!0}:{}})),d&&!o.state.force&&o.save({force:!0}),I&&o.state.conv_source!==I&&o.save({conv_source:I});let r=t.chat?.drainHeldReceipts?.()??[];(r.length>0||(o.state.held_receipts?.length??0)>0)&&o.save({held_receipts:r}),F!==null&&o.save({force_scope:F}),Be(o,p.paused),q("session_paused",{sid:o.state.sid},C.session_id);let u=y!=="interactive"?` --mode ${y}`:"",A=`kane-cli design tests --resume ${o.state.sid}${u}`;return t.out(`paused \u2014 resume with: ${A}`),t.emit?.({type:"session_paused",sid:o.state.sid,mode:y,resume:A,expires_at:o.state.expires_at,pending_questions:p.paused.pending.questions}),t.chat?.ledger?.({kind:"pause",sid:o.state.sid,expires_at:o.state.expires_at,resume:A,messageForm:`${A} --message "<your words>"`}),3}if(p.error)return t.out(`error: design agent failed: ${p.error}`),t.emit?.({type:"error",message:`error: design agent failed: ${p.error}`}),i?.release(),1;if(p.proposal==null&&y!=="interactive")return t.out(`error: the design agent ended without a finalize event \u2014 nothing committed (trace: ${f})`),t.emit?.({type:"error",message:`error: the design agent ended without a finalize event \u2014 nothing committed (trace: ${f})`}),i?.release(),1;p.proposal==null&&t.out("done \u2014 nothing designed this session (no finalize before the session ended)"),p.assumedDefaults&&t.out(`assumed: ${p.assumedDefaults} default(s) auto-taken (flagged)`),i&&t.emit?.({type:"session_complete",sid:s.resume}),i?.complete();{let o=t.chat?.state.ledger.filter(A=>A.kind==="answer"&&A.receipt.form==="assumed").length??0,r=(p.assumedDefaults??0)+o,u=t.chat?.state.credits?.total??p.creditsTotal;t.chat?.ledger?.({kind:"summary",lines:[`designed: ${h.usecase.logical_id??a}${p.proposal==null?" (nothing committed this session)":""}`,...r>0?[`${r} assumed default(s)`]:[],...u!==void 0?[`credits used: ${u.toFixed(1)}`]:[],`trace: ${me(f)}`]})}return s.plan||je(t.contextDir),0}export{Ts as a};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as g}from"./chunk-5YPBPZUR.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};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as x}from"./chunk-GBBVP2JW.js";import{a as d,b as $,d as w}from"./chunk-GRB66C5S.js";import"./chunk-RN4OSVTG.js";import{e as b,f as k}from"./chunk-CJJXT5DO.js";import"./chunk-BC7UVJJB.js";import{e as v}from"./chunk-EHN5HTUD.js";import{a as h}from"./chunk-L5LI2JF4.js";import{a as y}from"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-UR6MHSHU.js";import{basename as f}from"path";import{statSync as R}from"fs";function S(s,e){if(!s)return 1;let r=s.resolve(e);return!r||r.superseded?1:s.getNode(r.tip)?.content.risk==="high"?3:1}function C(s,e){return s.usecases.map(r=>{let n=r.acceptance_criteria??[],a=n.filter(o=>(o.covered_by??[]).length>0),u=n.filter(o=>o.execution==="passed"),c=n.filter(o=>o.execution==="failed"),p=n.filter(o=>o.execution==="blocked"),i=0,l=0;for(let o of n){let g=S(e,o.id);i+=g,o.execution==="passed"&&(l+=g)}let t=i===0?0:Math.round(100*l/i),m=a.length===0?"uncovered":n.length===u.length?"covered":p.length>0&&c.length===0?"blocked":"partial";return{id:r.id,title:r.title,status:m,pct:t,acs:{total:n.length,covered:a.length,passed:u.length,failed:c.length,blocked:p.length},stale:n.filter(o=>o.fresh==="stale").map(o=>o.id)}})}async function A(s){let e=await b(s);return e.length===0?null:e.map(r=>({p:r,m:R(r).mtimeMs})).sort((r,n)=>n.m-r.m)[0].p}var D={covered:"\u2714",partial:"\u25D0",uncovered:"\u2716",blocked:"\u23F8"};function G(s){let e=Math.round(s/10);return"\u2588".repeat(e)+"\u2591".repeat(10-e)}async function E(s,e=w(),r=process.cwd()){let n=$(r,e);if(!n)return 2;let a=s.from?await k(s.from,r):await A(r);if(!a)return d(e,s.from?`no evidence pack at '${s.from}'`:"no evidence pack in .testmuai/evidence \u2014 run a test first, or pass --from <pack>"),2;let u=await v(a,"coverage/usecases.yaml");if(u==null)return d(e,`${f(a)} carries no coverage/usecases.yaml \u2014 the pack predates coverage or its project had no .context at seal time`),2;let c=h(u);if(!c||!Array.isArray(c.usecases))return d(e,`${f(a)}: coverage/usecases.yaml is not a usecases document`),2;let p=y(n),i=C(c,p),l=await x(p,"design");if(s.json)return e.out(JSON.stringify({pack:a,depth:i,completeness:l},null,2)),0;e.out(`coverage \u2014 ${f(a)}`),e.out(""),e.out("depth (proven by the pack):");for(let t of i){let m=t.stale.length?` \xB7 ${t.stale.length} stale`:"";e.out(` ${D[t.status]} ${G(t.pct)} ${String(t.pct).padStart(3)}% ${t.id} \u2014 ${t.status} (${t.acs.passed}/${t.acs.total} ACs proven${t.acs.failed?`, ${t.acs.failed} failed`:""}${t.acs.blocked?`, ${t.acs.blocked} blocked`:""})${m}`)}e.out(""),e.out("completeness (live graph):"),l.length===0&&e.out(" no design gaps \u2014 every AC verified, every use-case scenarioed");for(let t of l)e.out(` [${t.risk}] ${t.tag} ${t.ref} \u2014 ${t.why}`),e.out(` \u2192 ${t.ready_command}`);return 0}export{E as coverCommand,C as depthRows};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{$ as fa,A as J,B as K,C as L,D as M,E as N,F as O,G as P,H as Q,L as R,M as S,N as T,O as U,P as V,Q as W,R as X,S as Y,T as Z,U as _,V as $,W as aa,X as ba,Y as ca,Z as da,_ as ea,a,aa as ga,b,ba as ha,c,ca as ia,d,e,f,g,h,i,j,k as t,l as u,m as v,n as w,o as x,p as y,q as z,r as A,s as B,t as C,u as D,v as E,w as F,x as G,y as H,z as I}from"./chunk-4A6BLXQN.js";import{a as n,b as o,c as p,e as q,f as r,g as s}from"./chunk-CJJXT5DO.js";import"./chunk-FJTWJ243.js";import"./chunk-BC7UVJJB.js";import"./chunk-2PQXEEVY.js";import{a as k,b as l,c as m}from"./chunk-EHN5HTUD.js";import"./chunk-L5LI2JF4.js";import"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-AKHUNBQS.js";import"./chunk-6SGPN76K.js";import"./chunk-UR6MHSHU.js";export{P as EvidenceSession,C as appendExecutionPointer,M as assembleExecutionEnv,i as buildEnvironment,j as buildEvidenceRunConfig,g as buildExternalId,z as buildLogsMetaYaml,y as buildResultYaml,t as buildRunYaml,O as createCdpBrowserCapture,u as createRunningPack,v as createRunningPackRoot,H as declareLogsFromDir,J as diagnostics,x as discardPack,ba as ensureAuteurExecution,N as fetchCdpBrowserString,L as finalizeEvidencePack,U as finalizeInlineEvidence,K as finalizeMemberTestLogs,da as flattenAuteurLeafIds,ca as flattenAuteurLeaves,T as inlineEvidenceBlock,q as listPacks,p as newExecutionId,h as normalizeOs,S as noteInlineSpawn,$ as offerEvidenceView,o as packPath,I as packTestLogsDir,V as parseRange,D as readExecutionPointers,ia as readPackLeafIds,ha as readPackLeaves,s as recoverStore,fa as remapReplayActionIds,r as resolvePack,ga as resolveReplayResultSteps,F as rollupTestStatus,aa as runEvidenceMerge,_ as runEvidenceServe,E as runEvidenceValidate,Q as runStartupRecovery,l as sealPack,w as sealPackById,Z as serveHint,d as shortHash,c as slugify,W as startEvidenceLocalServer,R as startInlineEvidence,n as storeDir,m as sweepStore,ea as synthesizeSkippedTail,f as testIdForInline,e as testIdForTestmd,k as validatePack,a as verdictFromResultCode,X as viewerBaseFor,Y as viewerUrlFor,b as worstOf,G as worstResultCode,B as writeLogsMeta,A as writeResult};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g}from"./chunk-JV356AYH.js";import"./chunk-3C5GMAM4.js";import"./chunk-GRB66C5S.js";import"./chunk-JFAFKHDX.js";import"./chunk-QPZRHAYK.js";import"./chunk-RN4OSVTG.js";import"./chunk-BC7UVJJB.js";import"./chunk-2PQXEEVY.js";import"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-UR6MHSHU.js";export{b as designStateOf,g as evolveCommand,c as evolveOneUc,f as liveRunDesignForUc,a as resolveParentUc,e as runEvolveCommand,d as staleTargets};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-GYW7LVVL.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-UR6MHSHU.js";export{a as explain};
@@ -1,5 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as D,e as h}from"./chunk-4R2HOA7J.js";import"./chunk-K5JGCJ2K.js";import"./chunk-KNCHEM6A.js";import"./chunk-FXPPQL4D.js";import"./chunk-RE3BZVGE.js";import"./chunk-6PS65QFF.js";import"./chunk-JFAFKHDX.js";import"./chunk-WIA7TPK3.js";import"./chunk-QPZRHAYK.js";import"./chunk-6GTOYTCQ.js";import{c as A}from"./chunk-YKTYVJBN.js";import"./chunk-6AYUSR7X.js";import"./chunk-427OQS2N.js";import{a as y}from"./chunk-LURGFJEE.js";import{d as C}from"./chunk-KYHXDJN4.js";import{c as E}from"./chunk-RN4OSVTG.js";import{a as P}from"./chunk-BC7UVJJB.js";import"./chunk-2PQXEEVY.js";import"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-6SGPN76K.js";import"./chunk-UR6MHSHU.js";async function j(n){let[{render:o},e,{QuestionBatchPrompt:i}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./ui-JEJGTURD.js")]),c=e.default??e;return new Promise(t=>{let p=o(c.createElement(i,{questions:n,onSubmit:a=>{p.unmount(),t(a)}}))})}async function F(n,o){let[{render:e},i,{ReviewChecklist:c}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./ui-JEJGTURD.js")]),t=i.default??i;return new Promise(p=>{let a=e(t.createElement(c,{items:n.map(u=>{let s=o.get(u.temp_ref);return{uc:u,dedupWith:s&&!s.archived?s.cid:void 0,archivedMatch:s?.archived?{cid:s.cid,reason:s.reason}:void 0}}),onSubmit:u=>{a.unmount(),p(u)}}))})}async function G(n){let{createInterface:o}=await import("readline/promises"),e=o({input:process.stdin,output:process.stdout});try{let i=await e.question(`${n} [y/N] `);return/^y(es)?$/i.test(i.trim())}finally{e.close()}}async function O(n){let o=await C(),e=P(process.cwd()),i=await A(o);if(!i.ok)return process.stderr.write((i.message??"error: turn-endpoint preflight failed")+`
3
- `),2;let c=async()=>i;if(n.plan)return h(n,{contextDir:e,agent:y,preflightTurn:c,ask:j,review:F,confirmStale:G,out:l=>process.stdout.write(l+`
4
- `),progress:l=>process.stderr.write(l+`
5
- `),isTTY:E(),auth:o});let[{render:t},p,{ScrollbackProvider:a},{ChatSurface:u},{ScrollbackTap:s},{makeChatController:r},{setInkExit:w},x]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./scrollback-JLPJR25X.js"),import("./ChatSurface-LV3KW6WN.js"),import("./ScrollbackTap-Q3IOKNMS.js"),import("./chat-controller-VAC57IEV.js"),import("./exit-manager-VCSIUYBR.js"),Promise.all([import("./chat-committer-ADJJTDUT.js"),import("./descriptor-EHK3DRCZ.js"),import("./explain-VFIZTHFN.js"),import("./readmodel-XOGOELUP.js")])]),[{commitChatTurn:I},{topologyDescriptor:M},{explain:V},{openGraph:k}]=x,v=p.default??p,m=r({commitChatTurn:I,descriptor:M(),contextDir:e,refreshGraph:()=>k(e),graph:k(e),explain:V,by:{kind:"human",id:"owner"},dedupFlags:l=>D(l,k(e))}),T={current:null},S=0,b=null,f=!1,N=()=>{if(S+=1,S>=2){try{g.unmount()}catch{}process.exit(130)}m.requestPause(),b=setTimeout(()=>{f||(f=!0,(async()=>{m.ledger({kind:"interrupted",detail:"the agent did not confirm the pause within 5s"}),await T.current?.flush();try{g.unmount()}catch{}process.exit(130)})())},5e3)},g=t(v.createElement(a,null,v.createElement(s,{into:T}),v.createElement(u,{controller:m,verb:"extract",onCtrlC:N})),{exitOnCtrlC:!1});w(()=>g.unmount()),m.ledger({kind:"banner",text:"kane-cli context \xB7 extract \xB7 interactive"});try{let l=h(n,{contextDir:e,agent:y,preflightTurn:c,ask:d=>m.ask(d),review:async d=>new Map(d.map(R=>[R.temp_ref,{resolution:"skipped"}])),confirmStale:async()=>!0,out:d=>m.note(d),progress:()=>{},isTTY:E(),auth:o,chat:m});return l.finally(()=>{f=!0}),await l}finally{f=!0,b&&clearTimeout(b),await T.current?.flush();try{g.unmount()}catch{}}}async function U(n){let o=await C(),{makeHeadlessIO:e,resolveEncoding:i,guardedChannels:c}=await import("./headless-io-PWW6YKH2.js"),t=e(i(n.mode),"extract"),{makeInterruptGuard:p}=await import("./interrupt-guard-UREUWNRL.js"),a=p(y,r=>t.out(r)),s=c(t,()=>a.interrupted(),/^error: (agent failed|repair run failed|agent ended)/);try{let r=await h(n,{contextDir:P(process.cwd()),agent:a.agent,preflightTurn:()=>A(o),ask:async()=>[],review:async w=>new Map(w.map(x=>[x.temp_ref,{resolution:"skipped"}])),confirmStale:async()=>!1,out:s.out,emit:s.emit,progress:t.progress,isTTY:!1,auth:o});return a.interrupted()&&r!==3?(t.out("interrupted \u2014 no session saved"),t.done(130)):t.done(r)}catch(r){return t.event({type:"error",message:`error: extract failed: ${r instanceof Error?r.message:String(r)}`}),t.out(`error: extract failed: ${r instanceof Error?r.message:String(r)}`),t.out("hint: per-run trace logs live under .context/logs/ (extract-*.log)"),t.done(1)}finally{a.dispose()}}export{U as bindExtractHeadless,O as bindExtractInteractive};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as b}from"./chunk-GBBVP2JW.js";import{a as o,b as h,d as w}from"./chunk-GRB66C5S.js";import"./chunk-RN4OSVTG.js";import{e as $,f as y}from"./chunk-CJJXT5DO.js";import"./chunk-BC7UVJJB.js";import{e as l}from"./chunk-EHN5HTUD.js";import{a as g}from"./chunk-L5LI2JF4.js";import{a as k}from"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-UR6MHSHU.js";import{basename as p}from"path";import{statSync as O}from"fs";async function P(t){let e=await $(t);return e.length===0?null:e.map(a=>({p:a,m:O(a).mtimeMs})).sort((a,r)=>r.m-a.m)[0].p}async function U(t,e=w(),a=process.cwd()){let r=t.stage??"design";if(r!=="design"&&r!=="cover"&&r!=="all")return o(e,`--stage must be design | cover | all, got '${r}'`),2;if(t.top!==void 0&&(!Number.isInteger(t.top)||t.top<1))return o(e,"--top must be a positive integer"),2;let f=h(a,e);if(!f)return 2;let d,i;if(r!=="design"){let s=t.from?await y(t.from,a):await P(a);if(!s)return o(e,`--stage ${r} needs an evidence pack \u2014 run a test first, or pass --from <pack>`),2;let c=await l(s,"coverage/usecases.yaml");if(c==null)return o(e,`${p(s)} carries no coverage/usecases.yaml \u2014 re-run the tests to produce a coverage-bearing pack`),2;let u=g(c);if(!u||!Array.isArray(u.usecases))return o(e,`${p(s)}: coverage/usecases.yaml is not a usecases document`),2;d=u,i=p(s)}let v=k(f),n=await b(v,r,void 0,d),m=n.length;return t.top!==void 0&&(n=n.slice(0,t.top)),t.json?(e.out(JSON.stringify({stage:r,...i?{pack:i}:{},total:m,rows:n},null,2)),0):(e.out(`gaps \u2014 stage ${r}${i?` \xB7 pack ${i}`:""} (${n.length}${n.length<m?` of ${m}`:""})`),n.length===0&&e.out(" nothing owed \u2014 design and execution are square"),n.forEach((s,c)=>{e.out(` ${String(c+1).padStart(2)}. [${s.risk}] ${s.tag} ${s.ref} \u2014 ${s.why}`),e.out(` \u2192 ${s.ready_command}`)}),0)}export{U as gapsCommand};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as a,c as b,d as c}from"./chunk-SJ2KQKOV.js";import"./chunk-2PQXEEVY.js";import"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-UR6MHSHU.js";export{c as ingestFile,a as slugFromFilename,b as versionBaseOf};
@@ -1,3 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as g,c as b,d as p}from"./chunk-SJ2KQKOV.js";import{c as l}from"./chunk-RN4OSVTG.js";import{a as f}from"./chunk-BC7UVJJB.js";import"./chunk-2PQXEEVY.js";import{a as d}from"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-UR6MHSHU.js";import{existsSync as $}from"fs";async function h(o,u,e,i=process.cwd()){let n=f(i);if(u.as!==void 0&&o.length>1)return(e.err??e.out)(`error: --as names ONE source identity \u2014 pass a single file (got ${o.length})`),2;for(let a of o){let m=u.as;if(e.isTTY&&m===void 0&&$(n)){let t=g(a),s=b(t);if(s){let c=d(n);c.heads.get(s)!=null&&c.heads.get(t)==null&&await e.confirm(`${t} looks like a new version of existing source '${s}' \u2014 ingest as '${s}' (moves its head)?`)&&(m=s)}}let r;try{r=await p({contextDir:n,filePath:a,asId:m,confirmSameSource:e.isTTY?t=>e.confirm(`identical bytes already ingested as ${t} \u2014 treat as the same source?`):void 0})}catch(t){return e.out(`error: ${a}: ${t instanceof Error?t.message:String(t)}`),1}if(e.out(`${r.status} ${r.source_id} source ${r.cid} blob ${r.blob}`),!e.isTTY&&r.status==="created"){let t=d(n);for(let[s,c]of t.heads.entries())if(!(s===r.source_id||c==null)&&t.getNode(c)?.content.blob===r.blob){e.out(`hint: identical bytes already ingested as ${s} \u2014 merged later via review`);break}}}return 0}async function Y(o,u){let{createInterface:e}=await import("readline/promises");return h(o,u,{out:i=>process.stdout.write(i+`
3
- `),isTTY:l(),confirm:async i=>{let n=e({input:process.stdin,output:process.stdout});try{let a=await n.question(`${i} [Y/n] `);return!/^n(o)?$/i.test(a.trim())}finally{n.close()}}})}export{Y as ingestCommand,h as runIngestCommand};
@@ -1,7 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as y}from"./chunk-WWH7CW5R.js";import"./chunk-KHU7C6EE.js";import"./chunk-3C5GMAM4.js";import"./chunk-KNCHEM6A.js";import"./chunk-FXPPQL4D.js";import"./chunk-RE3BZVGE.js";import"./chunk-6PS65QFF.js";import"./chunk-JFAFKHDX.js";import"./chunk-WIA7TPK3.js";import"./chunk-QPZRHAYK.js";import"./chunk-6GTOYTCQ.js";import"./chunk-YKTYVJBN.js";import"./chunk-6AYUSR7X.js";import"./chunk-427OQS2N.js";import{c as k}from"./chunk-RN4OSVTG.js";import"./chunk-FJTWJ243.js";import{a as v}from"./chunk-BC7UVJJB.js";import"./chunk-2PQXEEVY.js";import"./chunk-L5LI2JF4.js";import"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-6SGPN76K.js";import"./chunk-UR6MHSHU.js";async function j(t){let[{render:u},o,{QuestionBatchPrompt:p}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./ui-JEJGTURD.js")]),i=o.default??o;return new Promise(e=>{let m=u(i.createElement(p,{questions:t,onSubmit:a=>{m.unmount(),e(a)}}))})}async function q(t){let[{resolveAgentAuthEnv:u},{runAgent:o},{preflightTurn:p}]=await Promise.all([import("./spawner-DWONVIPI.js"),import("./bridge-PDJEOSAJ.js"),import("./turn-preflight-JGYT7LXP.js")]),i=await u(),e=v(process.cwd()),{baseUrlAdvisory:m}=await import("./turn-preflight-JGYT7LXP.js"),a=m();a&&process.stderr.write(a+`
3
- `);let d=await p(i);if(!d.ok)return process.stderr.write((d.message??"error: turn-endpoint preflight failed")+`
4
- `),2;let T=async()=>d;if(t.plan)return y(t,{contextDir:e,agent:o,preflightTurn:T,ask:j,out:r=>process.stdout.write(r+`
5
- `),progress:r=>process.stderr.write(r+`
6
- `),isTTY:k(),auth:i});if(!t.resume){let[{openGraph:r},{designGate:s}]=await Promise.all([import("./readmodel-XOGOELUP.js"),import("./gate-B6C6KLFA.js")]),w=s(r(e),t.useCase,!!t.force);if(!w.ok)return process.stderr.write(`design: ${w.message}
7
- `),w.code}let[{render:C},b,{ScrollbackProvider:A},{ChatSurface:D},{ScrollbackTap:E},{makeChatController:R},{setInkExit:S},G]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./scrollback-JLPJR25X.js"),import("./ChatSurface-LV3KW6WN.js"),import("./ScrollbackTap-Q3IOKNMS.js"),import("./chat-controller-VAC57IEV.js"),import("./exit-manager-VCSIUYBR.js"),Promise.all([import("./chat-committer-ADJJTDUT.js"),import("./descriptor-EHK3DRCZ.js"),import("./explain-VFIZTHFN.js"),import("./readmodel-XOGOELUP.js")])]),[{commitChatTurn:I},{topologyDescriptor:O},{explain:Q},{openGraph:x}]=G,f=b.default??b,n=R({commitChatTurn:I,descriptor:O("design"),contextDir:e,refreshGraph:()=>x(e),graph:x(e),explain:Q,by:{kind:"human",id:"owner"}}),g={current:null},P=0,h=null,c=!1,Y=()=>{if(P+=1,P>=2){try{l.unmount()}catch{}process.exit(130)}n.requestPause(),h=setTimeout(()=>{c||(c=!0,(async()=>{n.ledger({kind:"interrupted",detail:"the agent did not confirm the pause within 5s"}),await g.current?.flush();try{l.unmount()}catch{}process.exit(130)})())},5e3)},l=C(f.createElement(A,null,f.createElement(E,{into:g}),f.createElement(D,{controller:n,verb:"design",onCtrlC:Y})),{exitOnCtrlC:!1});S(()=>l.unmount()),n.ledger({kind:"banner",text:`kane-cli design \xB7 ${t.useCase??t.resume??""}`});try{let r=y(t,{contextDir:e,agent:o,preflightTurn:T,ask:s=>n.ask(s),out:s=>n.note(s),progress:()=>{},isTTY:k(),auth:i,chat:n});return r.finally(()=>{c=!0}),await r}finally{c=!0,h&&clearTimeout(h),await g.current?.flush();try{l.unmount()}catch{}}}export{q as bindDesignInteractive};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as b,b as a,c as f,d as m}from"./chunk-GRB66C5S.js";import{h as p,i as y}from"./chunk-WIA7TPK3.js";import"./chunk-QPZRHAYK.js";import"./chunk-RN4OSVTG.js";import"./chunk-BC7UVJJB.js";import{a as c}from"./chunk-MCQXRJGH.js";import"./chunk-74RUSHIB.js";import"./chunk-ZZLR3O5A.js";import"./chunk-ZG2V2ODK.js";import"./chunk-5YPBPZUR.js";import"./chunk-UR6MHSHU.js";var g={kind:"human",id:process.env.USER??"operator"},$=/^(UNKNOWN_|BAD_|INVALID_|MALFORMED_|NOT_|SLUG_TAKEN|ALREADY_|SUPERSEDED_)/;function h(e){return e.every(r=>$.test(r.code))?2:1}function l(e,r){for(let n of r)b(e,`${n.code}: ${n.detail}`);return h(r)}async function w(e,r,n,t=process.cwd()){let s=a(t,n);if(!s||!await f(n,`retire source ${e} (head \u2192 null + tombstone record)`,r.yes))return 2;let i=c(s),o=y({contextDir:s,graph:i,sourceId:e,reason:r.reason,by:g});return o.errors?l(n,o.errors):(n.out(`retired ${e} (record ${o.record.seq}) \u2014 its use-cases stay until no live source evidences them`),0)}async function x(e,r,n,t=process.cwd()){let s=a(t,n);if(!s)return 2;let i=c(s),o=p({contextDir:s,graph:i,assignments:[{ref:e,slug:r}],by:g});return o.errors?l(n,o.errors):(n.out(`named ${o.record.names[0].cid} as "${r}" (record ${o.record.seq})`),0)}async function O(e,r,n,t=process.cwd()){let s=a(t,n);if(!s)return 2;let i=Number(e);if(!await f(n,`revert record ${i} via a compensation record`,r.yes))return 2;let o=c(s),{commitRevert:v}=await import("./revert-AQQ2VHRM.js"),d=v({contextDir:s,graph:o,seq:i,reason:r.reason,by:g});for(let C of d.warnings)n.out(`note: ${C}`);if(d.errors)return l(n,d.errors);let u=d.record;return n.out(`reverted record ${i} via compensation record ${u.seq}: ${u.supersessions.length} supersession(s), ${u.review.length} trust restoration(s), ${Object.keys(u.source_head_moves).length} head move(s) \u2014 history unchanged, effects inverted`),0}async function A(e,r){return w(e,r,m())}async function P(e,r){return x(e,r,m())}async function I(e={},r=process.cwd()){return D(e,m(),r)}async function D(e,r,n=process.cwd()){let t=a(n,r);if(!t||!await f(r,"assign logical ids to every live unnamed node (one commit record)",e.yes))return 2;let{backfillLogicalIds:s}=await import("./logical-ids-3Y6RX5C2.js"),i=c(t),o=s(t,i);return o.errors?l(r,o.errors):(r.out(o.assigned===0?"backfill: every live node already has a logical id":`backfill: assigned ${o.assigned} logical id(s) (record ${o.record.seq})`),0)}async function R(e,r){return O(e,r,m())}export{I as nameBackfillCommand,P as nameCommand,A as retireCommand,R as revertCommand,D as runNameBackfillCommand,x as runNameCommand,w as runRetireCommand,O as runRevertCommand};