@testmuai/kane-cli 0.8.1 → 0.8.3

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 (205) hide show
  1. package/bin/kane-cli.cjs +1 -1
  2. package/bin/resolve-runtime.cjs +8 -0
  3. package/dist/ChatSurface-FJSO3IKR.js +8 -0
  4. package/dist/{ChromeProfilePicker-AUU7JF6F.js → ChromeProfilePicker-NTZ2RN3L.js} +1 -1
  5. package/dist/{CliFeedbackPrompt-4W74Y3UF.js → CliFeedbackPrompt-BCHUH24C.js} +1 -1
  6. package/dist/{CliUploadProgress-6HL7WTEX.js → CliUploadProgress-QVAJJRUW.js} +1 -1
  7. package/dist/{ConfigView-6BSCZP5Y.js → ConfigView-LAKAQN7O.js} +1 -1
  8. package/dist/EvidenceViewOffer-POKUWAPS.js +2 -0
  9. package/dist/FolderPicker-GR6FZMUJ.js +2 -0
  10. package/dist/{HelpView-TU7ED43J.js → HelpView-JFFVHQAW.js} +1 -1
  11. package/dist/{InfoBox-JLTMKVDE.js → InfoBox-46C7AHDE.js} +1 -1
  12. package/dist/{LinksBox-LREUUJDV.js → LinksBox-KFJXZDUJ.js} +1 -1
  13. package/dist/{ProfilesView-W3GX2N2E.js → ProfilesView-FV3KFVBX.js} +1 -1
  14. package/dist/{ProjectPicker-SYQUJK2J.js → ProjectPicker-MCH35VEF.js} +1 -1
  15. package/dist/{SaveSessionPrompt-MR5NJMRP.js → SaveSessionPrompt-RXHP3YW6.js} +1 -1
  16. package/dist/SingleShotApp-BK5QNXGG.js +2 -0
  17. package/dist/{SummaryBox-UAYSVFB7.js → SummaryBox-33K2MMUW.js} +1 -1
  18. package/dist/TestMdRunView-AT26LOSG.js +2 -0
  19. package/dist/{WhoamiView-2YU76ASQ.js → WhoamiView-HUPBB5AQ.js} +1 -1
  20. package/dist/app-client-ZCCNE3RV.js +2 -0
  21. package/dist/{app-download-AEEFQ63M.js → app-download-3O7NJNGG.js} +1 -1
  22. package/dist/{auth-HET3TBRI.js → auth-OMWFVDL2.js} +1 -1
  23. package/dist/{bind-STKXOUYI.js → bind-NXXKFJMA.js} +2 -2
  24. package/dist/bootstrap-MMRPAHWE.js +2 -0
  25. package/dist/bridge-UH32UGR5.js +2 -0
  26. package/dist/{changelog-7OWRHFHZ.js → changelog-VZ5HFHYM.js} +1 -1
  27. package/dist/{chat-controller-T2FAI55V.js → chat-controller-R4THYYPU.js} +1 -1
  28. package/dist/{chunk-HMYMSRA4.js → chunk-2ERQYYSJ.js} +1 -1
  29. package/dist/{chunk-DCY6R5DP.js → chunk-2N4SZOWN.js} +1 -1
  30. package/dist/{chunk-FMRSMN34.js → chunk-2ZDXNTZT.js} +1 -1
  31. package/dist/{chunk-OTTGS2TE.js → chunk-37ZWKLEN.js} +1 -1
  32. package/dist/{chunk-UV462FZR.js → chunk-3MFTTLOF.js} +1 -1
  33. package/dist/{chunk-DO5HAO3H.js → chunk-3S5DDQLP.js} +1 -1
  34. package/dist/{chunk-BRHNRCEZ.js → chunk-4FQI643D.js} +1 -1
  35. package/dist/chunk-4G4RWARU.js +2 -0
  36. package/dist/{chunk-GZPK6FRP.js → chunk-5BVOF4UW.js} +1 -1
  37. package/dist/{chunk-C7HSWZP6.js → chunk-5CKQTZMG.js} +1 -1
  38. package/dist/{chunk-ZVHCQMJ6.js → chunk-5NQ3TI4S.js} +2 -2
  39. package/dist/{chunk-6O3DDOP2.js → chunk-5OVEBP4D.js} +1 -1
  40. package/dist/{chunk-FQLIW3LM.js → chunk-6G5YKTVN.js} +1 -1
  41. package/dist/chunk-6J5T5FEY.js +2 -0
  42. package/dist/{chunk-QRZRSAZH.js → chunk-7YZMUTJA.js} +1 -1
  43. package/dist/chunk-A2SQD2AY.js +4 -0
  44. package/dist/chunk-A5FFLJVL.js +26 -0
  45. package/dist/{chunk-RFR4ZKIC.js → chunk-AF572MQG.js} +2 -2
  46. package/dist/{chunk-HCKH44I2.js → chunk-APETOVZK.js} +1 -1
  47. package/dist/{chunk-AW2XUHH4.js → chunk-AVH3BEEU.js} +1 -1
  48. package/dist/chunk-AXTPNZPX.js +2 -0
  49. package/dist/{chunk-2WVKOZ6W.js → chunk-BPMSNGXQ.js} +1 -1
  50. package/dist/{chunk-EDSZJZFG.js → chunk-CDB3SYZG.js} +1 -1
  51. package/dist/{chunk-T5Y6MOLM.js → chunk-CJP7RX3E.js} +1 -1
  52. package/dist/{chunk-G7VQCS4J.js → chunk-CVCVBQP6.js} +1 -1
  53. package/dist/{chunk-YFYCCTSL.js → chunk-D5VYMHSO.js} +1 -1
  54. package/dist/chunk-D6FYCAIA.js +2 -0
  55. package/dist/{chunk-ZIUAOEUC.js → chunk-DJR3M7XO.js} +1 -1
  56. package/dist/{chunk-65ZTD5SJ.js → chunk-DN42IM2Z.js} +2 -2
  57. package/dist/{chunk-TKGUT425.js → chunk-DOG7S7R6.js} +1 -1
  58. package/dist/chunk-DSXSU5MH.js +10 -0
  59. package/dist/{chunk-QSDH5P7C.js → chunk-DVYO4CR2.js} +1 -1
  60. package/dist/chunk-DXI5TXNL.js +19 -0
  61. package/dist/{chunk-JJHG3BWO.js → chunk-EBJD2V4Z.js} +1 -1
  62. package/dist/chunk-FPAJURPL.js +2 -0
  63. package/dist/{chunk-3LJWYRAA.js → chunk-GIQURCTO.js} +1 -1
  64. package/dist/{chunk-2BGUUWNF.js → chunk-GR35ZFM2.js} +2 -2
  65. package/dist/chunk-HJ6AXOCR.js +2 -0
  66. package/dist/{chunk-6XX4LEVJ.js → chunk-IEOHAHZO.js} +1 -1
  67. package/dist/{chunk-QW6EZC53.js → chunk-IFIXY3YG.js} +1 -1
  68. package/dist/{chunk-XO5ZH3ZR.js → chunk-IHAHCFFG.js} +1 -1
  69. package/dist/chunk-ITTZYA2G.js +4 -0
  70. package/dist/chunk-IVYXXZEE.js +6 -0
  71. package/dist/chunk-IWWQTXGK.js +11 -0
  72. package/dist/{chunk-GCBKDX2J.js → chunk-JANVTG62.js} +1 -1
  73. package/dist/{chunk-IOFZSQAA.js → chunk-KGSVOTLG.js} +1 -1
  74. package/dist/{chunk-L7MXYCD7.js → chunk-KOMKHFC4.js} +1 -1
  75. package/dist/{chunk-EWCAFKLX.js → chunk-KZVEFBH5.js} +1 -1
  76. package/dist/{chunk-FEJXWJ3L.js → chunk-LCU2P3CH.js} +1 -1
  77. package/dist/{chunk-RC52N7PC.js → chunk-LNQCZ5DS.js} +1 -1
  78. package/dist/{chunk-IP2O264K.js → chunk-LP3BSP74.js} +1 -1
  79. package/dist/chunk-LQQXPY5B.js +4 -0
  80. package/dist/{chunk-3POR47RC.js → chunk-LSZVSYAP.js} +2 -2
  81. package/dist/chunk-MMBBQ4OZ.js +2 -0
  82. package/dist/chunk-NNCMMV6P.js +349 -0
  83. package/dist/{chunk-YJELGSKJ.js → chunk-NVGM5ISX.js} +1 -1
  84. package/dist/{chunk-GKYPNSQP.js → chunk-NWJOPZ7P.js} +2 -2
  85. package/dist/{chunk-ELM6MXGJ.js → chunk-NXXJ56QA.js} +1 -1
  86. package/dist/{chunk-NX7TM662.js → chunk-QJTXNQV5.js} +1 -1
  87. package/dist/chunk-RKXHVP2Z.js +2 -0
  88. package/dist/chunk-RUCSRS4C.js +5 -0
  89. package/dist/{chunk-TFPPEOAK.js → chunk-SA2LQSYP.js} +1 -1
  90. package/dist/chunk-SPQPOUUR.js +11 -0
  91. package/dist/chunk-SQDKYSWT.js +12 -0
  92. package/dist/chunk-TAOHYWEO.js +2 -0
  93. package/dist/{chunk-UXDL4XDL.js → chunk-TRVB7RSW.js} +1 -1
  94. package/dist/{chunk-SDPRO2LE.js → chunk-TUTDSX7T.js} +1 -1
  95. package/dist/{chunk-766WGMBU.js → chunk-UBTNWAKK.js} +1 -1
  96. package/dist/chunk-UJZZDPDY.js +2 -0
  97. package/dist/chunk-VK3NU742.js +21 -0
  98. package/dist/{chunk-DZGCXKKI.js → chunk-WCF2Z4SE.js} +1 -1
  99. package/dist/{chunk-KU6IXFGZ.js → chunk-WMMJXI5O.js} +1 -1
  100. package/dist/chunk-X2FM67OM.js +4 -0
  101. package/dist/chunk-XMYCRE5K.js +4 -0
  102. package/dist/chunk-XO45NGSN.js +2 -0
  103. package/dist/chunk-YJNGBZ42.js +4 -0
  104. package/dist/{chunk-7JWKHKFU.js → chunk-ZH64GOBG.js} +1 -1
  105. package/dist/{chunk-UDIQOJEL.js → chunk-ZNNRCUHH.js} +1 -1
  106. package/dist/{chunk-KFSUPQAG.js → chunk-ZUYPPPC5.js} +43 -43
  107. package/dist/{config-RS47F5SC.js → config-OTUKOTHM.js} +1 -1
  108. package/dist/{credentials-OH6AVI6N.js → credentials-A3RU25MJ.js} +1 -1
  109. package/dist/deps-bundle-RIBEQC2R.js +2 -0
  110. package/dist/{deps-resolve-XC5S53DG.js → deps-resolve-7SWSUDRX.js} +1 -1
  111. package/dist/dispatch-RHSWJJLC.js +2 -0
  112. package/dist/doctor-XP7YDE3J.js +2 -0
  113. package/dist/evidence-K7R7OG2K.js +2 -0
  114. package/dist/evolve-cmd-FFF3F3HO.js +2 -0
  115. package/dist/extract-bind-VIPNGK2H.js +10 -0
  116. package/dist/{extract-cmd-UZMEZMGP.js → extract-cmd-5J47Q4XU.js} +1 -1
  117. package/dist/gaps-cmd-WPCJPLGB.js +3 -0
  118. package/dist/{generate-headless-D3SVQ2AI.js → generate-headless-AJI2OVRG.js} +2 -2
  119. package/dist/index.js +61 -60
  120. package/dist/{ingest-EX72IEQT.js → ingest-4447MYLF.js} +1 -1
  121. package/dist/ingest-cmd-2LK7DWDW.js +2 -0
  122. package/dist/interactive-bind-PI3HY623.js +25 -0
  123. package/dist/{list-commands-MRXL5HGS.js → list-commands-7Y5XV5FK.js} +1 -1
  124. package/dist/login-flow-Z45G34DM.js +2 -0
  125. package/dist/mobile-prompts-O5ALU3QU.js +2 -0
  126. package/dist/{persist-recorded-session-TLDQ5HKP.js → persist-recorded-session-TKSU4HOA.js} +1 -1
  127. package/dist/{phase-seed-VFHIH6FL.js → phase-seed-DIRETNU6.js} +1 -1
  128. package/dist/{pipeline-UOM4LNAI.js → pipeline-HZUV7IMT.js} +1 -1
  129. package/dist/prepare-target-DBYKQ7HW.js +2 -0
  130. package/dist/reconcile-cmd-VHEW2DY5.js +2 -0
  131. package/dist/reconcile-deps-UJ6KVUIS.js +4 -0
  132. package/dist/reconcile-engine-NUQJSIFX.js +2 -0
  133. package/dist/{recording-banner-4M7XHVGI.js → recording-banner-GO2PP53Y.js} +1 -1
  134. package/dist/registry-KYPVINS2.js +2 -0
  135. package/dist/{require-project-folder-4UPQNEBJ.js → require-project-folder-NUQMH224.js} +1 -1
  136. package/dist/resolve-run-intent-H3HX5KUC.js +7 -0
  137. package/dist/{resolver-UBOZLFFE.js → resolver-HHLYRR5W.js} +1 -1
  138. package/dist/run-67ONKMGR.js +2 -0
  139. package/dist/{run-URPGHOQM.js → run-OPLOL3PZ.js} +1 -1
  140. package/dist/{run-test-md-76ZPKXO6.js → run-test-md-3BA56ZYF.js} +2 -2
  141. package/dist/session-items-2ATN7VXG.js +2 -0
  142. package/dist/{skill-installer-CIS6GAYF.js → skill-installer-O7JYVZXD.js} +1 -1
  143. package/dist/{spawner-J67QR4QP.js → spawner-OZ4OE44T.js} +1 -1
  144. package/dist/tcg-generate-EG2MXRJ7.js +2 -0
  145. package/dist/{testmd-actions-77ELR5UU.js → testmd-actions-YJ7O43Z6.js} +1 -1
  146. package/dist/{tms-client-VD3B3SMU.js → tms-client-V3TR4QW3.js} +1 -1
  147. package/dist/token-refresh-K7CANKFQ.js +2 -0
  148. package/dist/{validate-basic-2GVSQ2R5.js → validate-basic-HWYK3CU6.js} +1 -1
  149. package/dist/{verdicts-TRSTJLCL.js → verdicts-KFPMRADV.js} +1 -1
  150. package/dist/{version-check-O6PYTI4T.js → version-check-3ECNG5V2.js} +1 -1
  151. package/dist/walk-session-MZCMXVZB.js +2 -0
  152. package/dist/with-telemetry-Q6V6THIF.js +2 -0
  153. package/package.json +12 -12
  154. package/dist/ChatSurface-U37VZDCW.js +0 -8
  155. package/dist/EvidenceViewOffer-62XHEEGW.js +0 -2
  156. package/dist/FolderPicker-S7U2EN2M.js +0 -2
  157. package/dist/SingleShotApp-XOKVOM7C.js +0 -2
  158. package/dist/TestMdRunView-7UVSDAF4.js +0 -2
  159. package/dist/app-client-OEXESV4U.js +0 -2
  160. package/dist/bootstrap-44YKVWWE.js +0 -2
  161. package/dist/bridge-5Z3BIB77.js +0 -2
  162. package/dist/chunk-27U4PLPX.js +0 -2
  163. package/dist/chunk-2KDGIZED.js +0 -4
  164. package/dist/chunk-3PECJD6S.js +0 -11
  165. package/dist/chunk-7BZSCUPP.js +0 -10
  166. package/dist/chunk-7Q6M6P4X.js +0 -26
  167. package/dist/chunk-CTW2VQKS.js +0 -6
  168. package/dist/chunk-FNH55WSR.js +0 -19
  169. package/dist/chunk-GPG3FIN3.js +0 -21
  170. package/dist/chunk-HEAIJCGZ.js +0 -2
  171. package/dist/chunk-KCCSWEGA.js +0 -4
  172. package/dist/chunk-MA34UWKX.js +0 -4
  173. package/dist/chunk-MBF3FP5P.js +0 -5
  174. package/dist/chunk-MXHHMIO2.js +0 -349
  175. package/dist/chunk-OMQCD3KR.js +0 -2
  176. package/dist/chunk-QGKPLOUI.js +0 -2
  177. package/dist/chunk-RLRNLIRS.js +0 -2
  178. package/dist/chunk-TYLYFERW.js +0 -10
  179. package/dist/chunk-V2R3LCA3.js +0 -12
  180. package/dist/chunk-VGFTNLQQ.js +0 -2
  181. package/dist/chunk-W2JFDDIB.js +0 -2
  182. package/dist/chunk-W4B5LOEX.js +0 -4
  183. package/dist/chunk-YRFMPIU2.js +0 -4
  184. package/dist/dispatch-SE5GY3Z2.js +0 -2
  185. package/dist/doctor-FSECFZUU.js +0 -2
  186. package/dist/evidence-OYPHZUKI.js +0 -2
  187. package/dist/evolve-cmd-BCPNXAMV.js +0 -2
  188. package/dist/extract-bind-LLEASZAK.js +0 -10
  189. package/dist/gaps-cmd-IVXFPFAQ.js +0 -3
  190. package/dist/ingest-cmd-EAE7N5RC.js +0 -2
  191. package/dist/interactive-bind-ORMN2REX.js +0 -25
  192. package/dist/login-flow-QJQM3RHT.js +0 -2
  193. package/dist/mobile-prompts-TOX35ER6.js +0 -2
  194. package/dist/prepare-target-QYWIJIVQ.js +0 -2
  195. package/dist/reconcile-cmd-3H34KVVD.js +0 -2
  196. package/dist/reconcile-deps-XIH75ZLY.js +0 -4
  197. package/dist/reconcile-engine-UKWPG2LV.js +0 -2
  198. package/dist/registry-PYOTKZYZ.js +0 -2
  199. package/dist/resolve-run-intent-X72V3KJA.js +0 -7
  200. package/dist/run-2COODVX2.js +0 -2
  201. package/dist/tcg-generate-BDTRKY2A.js +0 -2
  202. package/dist/token-refresh-4BPAPXKK.js +0 -2
  203. package/dist/walk-session-CHJXHZMO.js +0 -2
  204. package/dist/with-telemetry-CQCWLVOC.js +0 -2
  205. /package/dist/{lifecycle-cmd-O2324GN6.js → lifecycle-cmd-HO5VL7AM.js} +0 -0
@@ -0,0 +1,5 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as V,b as $,c as ce,d as R}from"./chunk-2YQ6TW77.js";import{b as z}from"./chunk-CJJXT5DO.js";import{a as B}from"./chunk-BPMSNGXQ.js";import{a as M}from"./chunk-DPUV6OSP.js";import{a as F}from"./chunk-NLCCBXXV.js";import{a as x}from"./chunk-RZ4F3BHX.js";import{e as le}from"./chunk-UR6MHSHU.js";import{readFileSync as oe,existsSync as j,readdirSync as Se,mkdirSync as U,writeFileSync as O}from"fs";import{readFile as ae,unlink as Te}from"fs/promises";import{join as E}from"path";import{existsSync as ye,mkdirSync as Ae,readdirSync as ee,writeFileSync as Re}from"fs";import{join as N}from"path";import{randomUUID as P}from"crypto";var ue="/home/kaneai/Downloads";function w(t){return`${ue}/${t}`}function K(t){return"FILE__"+t.replace(/[^A-Za-z0-9]/g,"_")}function C(t){let e=t?.media;return!e||!e.name||!e.media_url?null:{media_id:e.media_id??"",name:e.name,media_url:e.media_url,type:e.type??"doc"}}function H(t){return t?t.includes(`
3
+ `)?t.split(`
4
+ `).map(e=>e.trim()).filter(Boolean):t.split(". ").map(e=>e.trim()).filter(Boolean).map(e=>e.endsWith(".")?e:e+"."):[]}function T(t,e){return!t||!e?t:t.replace(/\{\{(.+?)\}\}/g,(s,i)=>{let n=e[i];return n?n.value:s}).replace(/\$\{(.+?)\}/g,(s,i)=>{let n=e[i];return n?n.value:s})}var de={click:"CLICK",double_click:"CLICK",type:"TYPE",fill:"TYPE",clear:"CLEAR",select:"SELECT",hover:"HOVER",drag:"DRAG_DROP",upload_files:"UPLOAD_FILE",navigate:"OPEN",go_back:"NAVIGATE",go_forward:"NAVIGATE",refresh:"REFRESH",press_key:"SENDKEYS",scroll:"SCROLL_PIXELS",scroll_into_view:"SCROLL_UNTIL_ELEMENT",wait:"WAIT",wait_until:"WAIT_UNTIL",wait_for_load:"WAIT_FOR_LOAD",switch_tab:"SWITCH_TAB",new_tab:"NEW_TAB",close_tab:"CLOSE_TAB",api:"API",evaluate_js:"EVALUATE_JS",vision_query:"VISION_QUERY",textual_query:"TEXTUAL_QUERY",get_url:"GET_URL",get_title:"GET_TITLE",assert:"ASSERTION",math:"MATHEMATICAL_OPERATION",set_cookies:"SET_COOKIES",delete_cookies:"DELETE_COOKIES",clear_cookies:"CLEAR_COOKIES",set_local_storage:"SET_LOCAL_STORAGE",delete_local_storage:"DELETE_LOCAL_STORAGE",clear_local_storage:"CLEAR_LOCAL_STORAGE",set_clipboard:"SET_CLIPBOARD",paste_clipboard:"PASTE_CLIPBOARD",clear_clipboard:"CLEAR_CLIPBOARD"},X={literal:"SET_VARIABLE",condition:"SET_VARIABLE",visual:"VISION_QUERY",dom:"TEXTUAL_QUERY",url:"GET_URL",title:"GET_TITLE",devtool_network:"DEVTOOLS_NETWORK_QUERY",devtool_console:"DEVTOOLS_CONSOLE_QUERY",devtool_cookies:"DEVTOOLS_COOKIES_QUERY",devtool_storage:"DEVTOOLS_STORAGE_QUERY",devtool_performance:"DEVTOOLS_PERFORMANCE",api_response:"API_CALLS_QUERY",textual_visual:"TEXTUAL_ANALYZER"},_e=new Set(["CLICK","TYPE","FILL","HOVER","SCROLL_UNTIL_ELEMENT","UPLOAD_FILE","VISION_QUERY","DRAG_DROP","SELECT"]);function W(t,e){if(t==="analyze"){let i=e?.action_params?.analyzer_type??"";return X[i]}if(t==="scroll"&&e?.action_params?.into_view===!0)return"SCROLL_UNTIL_ELEMENT";let s=de[t];return s||console.warn(`[migrator] UNKNOWN action_type "${t}" \u2014 falling back to "${t.toUpperCase()}"; explicit mapping required`),s??t.toUpperCase()}function Y(t,e){if(!t||!e)return"";try{let s=new Date(t);return isNaN(s.getTime())?"":new Date(s.getTime()+e).toISOString()}catch{return""}}function J(t){try{return JSON.parse(t.output_value??"{}")}catch{return{}}}function pe(t){let e=t.output_variable??"";if(!e)return"[]";let i={...J(t)};return delete i.body,JSON.stringify([{name:e,unique_key:(t.action_id??"").replace(/-/g,"").slice(0,8)||P().replace(/-/g,"").slice(0,8),value:i,variable_description:"API Response"}])}function ge(t,e,s){let i=t.action_params??{},n=_e.has(e)?"Vision Agent":"Operation Agent",r={operation_type:e};if(e==="OPEN"&&(r.url=i.url??""),e==="SET_VARIABLE"&&(r.variable_name=t.output_variable??i.key??"",r.variable_value=t.output_value??""),e==="UPLOAD_FILE"){let m=C(i);m&&(r.value=w(m.name))}let o={},l={},a=t.action_instruction??"",c=i.text??"",u=i.url??"",p=[["intent",a],["value",c],["url",u]];for(let[m,h]of Object.entries(s)){let I=String(h);if(m.startsWith("secrets."))for(let[b,v]of p)v.includes(I)&&(l[b]=m);for(let[b,v]of p)v.includes(I)&&!(b in o)&&(o[b]=v)}let d=t.action_type,_={operation:t.action_instruction??"",agent:n,operation_dict:r,reasoning:d==="analyze"?i.query??"":t.intent??t.action_instruction??"",variable:o,secrets:l,params:{}};d==="analyze"&&typeof i.code=="string"&&i.code&&(_.code=i.code),d==="analyze"&&typeof i.code_js=="string"&&i.code_js&&(_.code_js=i.code_js),d==="analyze"&&typeof i.condition_expression=="string"&&i.condition_expression&&(_.condition_expression=i.condition_expression),i.uses_websocket===!0&&(_.uses_websocket=!0),i.uses_sse===!0&&(_.uses_sse=!0),d==="analyze"&&i.analyzer_type==="textual_visual"&&(typeof i.wrapped_js=="string"&&(_.wrapped_js=i.wrapped_js),Array.isArray(i.locators)&&(_.locators=i.locators),typeof i.operator=="string"&&(_.operator=i.operator),Array.isArray(i.transforms)&&(_.transforms=i.transforms),typeof i.query=="string"&&(_.query=i.query),typeof i.expected_value=="string"&&(_.expected_value=i.expected_value),typeof i.needs_unit_conversion=="boolean"&&(_.needs_unit_conversion=i.needs_unit_conversion),typeof i.condition=="string"&&(_.condition=i.condition));let f={set_cookies:"cookies",set_clipboard:"text",delete_cookies:"names",set_local_storage:"items",delete_local_storage:"keys"}[d];return f&&i[f]!==void 0&&(_[f]=i[f]),d==="set_clipboard"&&typeof i.html=="string"&&i.html&&(_.html=i.html),_}function fe(t){let e=t.assertion_tree??{};if(typeof e.passed=="boolean")return e.passed;let s=e.sub_results??[];return s.length===0?e.status==="passed":(e.composite_operator??"and")==="or"?s.some(n=>n.passed===!0):s.every(n=>n.passed===!0)}function Z(t){return t.map(e=>({description:e.description??"",store_key:e.store_key??"",expected_value:e.expected??"",extracted_value:e.extracted_value??"",operator:e.operator??"equals",transforms:e.transforms??[]}))}function me(t){let e=t.assertion_tree??{},s=e.sub_results??[],i=Z(s);return{operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[],sub_results:s,sub_checks:i,composite_operator:e.composite_operator??"and",verification:e.verification??"",claim:e.description??""}}function he(t){let s=(t.action_params??{}).assertion_tree??{},i=s.sub_results??[],n=Z(i);return[{operation:t.action_instruction??"",agent:"Operation Agent",operation_dict:{operation_type:"ASSERTION",assertion_tree:{sub_results:i,sub_checks:n,composite_operator:s.composite_operator??"and",verification:"",claim:s.description??t.action_instruction??"",operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[]}},variable:{},secrets:{},params:{}}]}function Ee(t,e,s,i){let n=t.visual_data;if(!n||n.x==null||n.y==null)return null;let r=e?`${e}/test_screenshots`:"";return{x:n.x,y:n.y,confidence:0,bbox:n.bbox??null,bbox_source:n.bbox?"accessibility_tree":"fallback",viewport_width:n.viewport_width??1280,viewport_height:n.viewport_height??800,scale_factor:null,raw_image_url:r?`${r}/untagged_screenshot/${s}.${i?.get(s)??"png"}`:"",raw_image_sas_url:"",annotated_image_url:"",annotated_image_sas_url:""}}function be(t){if(!t)return"";let e=t;return typeof t=="object"&&!Array.isArray(t)&&Array.isArray(t.frameInfo)&&(e=t.frameInfo),!Array.isArray(e)||e.length===0?"":JSON.stringify(e)}function Ie(t){return/^(android|ios)_native$/i.test(t.platform??"")}function q(t,e={},s="",i){let n=t.action_type,r=W(n,t),o=t.action_params??{},l=t.coordinates??null,a=t.selectors??null,c=!!(a&&a.length>0),u=Ie(t),p=t.timestamp??"",d=t.duration_ms??0,_=t.variables_used??{},g=t.action_id??P(),f=P(),m=Y(p,d),h="",I="";if(n==="navigate")I=o.url??"",h=I;else if(n==="type"||n==="fill")h=o.text??"";else if(n==="press_key")h=o.key??"";else if(n==="wait")h=String(o.ms??o.timeout_ms??"");else if(n==="evaluate_js")h=o.script??"";else if(n==="upload_files"){let A=C(o);A&&(h=w(A.name))}else n==="analyze"&&r==="SET_VARIABLE"&&(h=t.output_value??"");let b="";n==="go_back"?b="back":n==="go_forward"&&(b="forward");let v=T(h,e),k=T(I,e),y=T(t.action_instruction??"",e),S=ge(t,r,_);return{operation_id:g,instruction_id:f,instruction:y,intent:y,operation_start:p,operation_end:m,status:t.status??"",command:r,name:"",target:"",value:v,message:"",operation_dict:"",frame:be(t.frame_info),error_message:t.error??"",code_snippet:"",sub_instruction_obj:JSON.stringify(S),test_id:"",test_version:"",action:"",string_to_float:!1,feedback_msg:"",time_taken:"",create_time_stamp:"",update_time_stamp:"",locator_variable:"",locator_variable_name:"",image_url:s?`${s}/test_screenshots/untagged_screenshot/${g}.${i?.get(g)??"png"}`:"",alternative_xpaths:[],attribute:"",value_description:"",url:k,navigation_direction:b,tagified_image_url:"",query_variable_name:t.output_variable??"",query_variable_value:t.output_value??"",query_variable_type:"",expected_value:"",queried_value:"",operator:"",assertion_status:r==="ASSERTION"?fe(o):"",query_info_dict:{},query_content_confidence:"none",debugging_logs:[],locator_index:0,query_html:"",user_variables:"[]",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,tab_index:String(o.tab_index??""),tab_identifier:String(o.tab_identifier??""),scroll_value:o.amount??1,scroll_direction:o.direction??"",mi_scroll_payload:{},sleep_duration:0,app_id:"",manual_interaction_tag:"",string_to_float_list:[],js_snippet:n==="evaluate_js"?o.script??"":"",code_error:"",hide:!1,dismiss_dialog:!1,use_v2_mobile_tagging:u,multiple_inputs:!1,dialog_action:"",dialog_type:"",is_coordinates_used_for_interaction:l!==null&&!c,element_coordinates_ratio:[],element_bounds_ratio:[],x_coord:c?null:l?.x??null,y_coord:c?null:l?.y??null,target_x_coord:o.target_x??null,target_y_coord:o.target_y??null,source_description:o.source_description??null,target_description:o.target_description??null,use_coordinates:l!==null&&!c,kaneaiMobileTaggingImageLimit:1,clicks_order_code:"se_js_ac",selector:c?a.map(A=>({...A,type:u?A.strategy??A.type??"native":A.isXPath?"xpath":"css"})):"",selector_target:"",math_result_variable_name:"",math_result_variable_value:"",expression_tree:r==="ASSERTION"?me(o):o.expression_tree??{},assertion_tree:o.assertion_tree??{},assertion_tree_simplified:{},network_throttle:{},is_mobile_offline:!1,autoheal:!1,db_query:"",db_details:{},db_query_decoded:"",is_global_variable:!1,is_global_variable_persist:!1,global_variable_id:"",wait_for_element_timeout:0,failure_condition:r==="ASSERTION"?"Fail test immediately":"",screenshot_command:"",smartui_contents:{},smartui_results:{},result_type:"",result_hint:"",drag_offset:{},start_coordinates:o.source_coordinates?{x:o.source_coordinates[0],y:o.source_coordinates[1]}:{},end_coordinates:o.target_coordinates?{x:o.target_coordinates[0],y:o.target_coordinates[1]}:{},element_rect:null,is_canvas:!1,until_condition:"",until_max_retries:0,until_settle_ms:0,api_data:n==="api"?{request:t.action_params?.api_data?.request??{}}:{},output_variables:n==="api"?t.output_variable?{[t.output_variable]:null}:{}:t.output_variable?{[t.output_variable]:t.output_value??""}:{},visual_context:Ee(t,s,g,i),reasoning:n==="analyze"?o.query??"":t.intent??t.action_instruction??""}}function G(t,e,s={}){let i=t.action_type,n=W(i,t),r=t.timestamp??"",o=t.duration_ms??0,l=Y(r,o),a=n==="ASSERTION"||n==="MATHEMATICAL_OPERATION";return{instruction_id:e.instruction_id,instruction_class:a?"non_driver_action":"driver_action",module_id:"",instruction:T(t.action_instruction??"",s),command:n,error:null,parent_instruction_id:"",classification_layer_resp:n==="ASSERTION"?he(t):[],classification_error:{},operations:[e],status:t.status??"",start_timestamp:r,end_timestamp:l,type:"agent_generated",tags:[],html_paths:[],optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,content_type:i==="api"?"api":i==="analyze"&&t.action_params?.analyzer_type==="api_response"?"api_calls_query":i==="analyze"&&t.action_params?.analyzer_type?.startsWith("devtool_")?t.action_params.analyzer_type.replace("devtool_","devtools_"):"instruction",js_snippet:i==="evaluate_js"?t.action_params?.script??"":"",user_variables:i==="api"?pe(t):"[]",api_data:i==="api"?{request:t.action_params?.api_data?.request??{},response:J(t)}:{},params_used:!1,hard_assertion:n==="ASSERTION"?t.action_params?.failure_condition==="hard":!1,expected_outcome:"",module_execution_index:0,module_version:null,network_throttle:{},isEdited:!1,use_query_assertion_v2:!1,db_query:"",db_details:{},network_assertion_content:{},screenshot_command:"",smartui_contents:{},generative_id:"",plan_id:"",generative_objective:"",error_message:"",error_code:"",reason:"",title:"",used_variables:[],reasoning:i==="analyze"?t.action_params?.query??"":t.intent??t.action_instruction??""}}function ve(t,e=[]){let s=t.action_params??{},i=s.branches??[],n=s.winning_index??-1,r=s.sub_results??[],o={};for(let a of r){let c=a.sub_results;if(c)for(let u of c){let p=u.store_key;p&&(o[p]=u)}}let l=i.map((a,c)=>{let u=c===n,p=(a.sub_checks??[]).map(d=>{let _=o[d.store_key];return{description:d.description,store_key:d.store_key,expected_value:d.expected_value,stored_value:_?.extracted_value??d.stored_value,operator:d.operator??_?.operator??"equals",transforms:d.transforms??_?.transforms??[]}});if(p.length===0&&a.condition&&r.length>0){let _=r.find(g=>g.branch_index===c)?.sub_results??[];_.length>0&&(p=_.map(g=>({description:g.description??a.condition,store_key:g.store_key??"",expected_value:g.expected??"true",stored_value:g.extracted_value??void 0,operator:g.operator??"equals",transforms:g.transforms??[]})))}return{branch_index:c,condition:a.condition??null,branch_type:a.branch_type??"sub_objective",passed:u,sub_objective:null,custom_event:a.custom_event??null,children:u?e:[],sub_checks:a.condition?p:[],composite_operator:a.composite_operator??"and"}});return{content_type:"conditional_block",instruction_id:`if_else_${P().slice(0,8)}`,instruction:t.action_instruction??"",instruction_class:"driver_action",command:"",status:t.status??"success",resolved_branch_index:n,branches:l,generative_id:"",generative_objective:"",variables_used:{},classification_layer_resp:[],classification_error:{},used_variables:[],user_variables:"[]",module_id:"",module_execution_index:0,module_version:"",plan_id:"",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,error:null,error_message:"",error_code:"",reason:"",start_timestamp:t.timestamp??"",end_timestamp:"",type:"agent_generated",hook:null,hook_type:null,evaluation_context:{},query_variables:{}}}function Q(t,e,s){for(let i of t)i.content_type==="instruction"&&"generative_id"in i&&(i.generative_id=e,i.generative_objective=s)}function D(t,e={},s="",i,n){let r=[],o=0;for(;o<t.length;){let l=t[o],a=l.action_type;if(!n?.keepFailedActions&&l.status==="error"&&a!=="assert"&&a!=="if_else"&&a!=="child_agent_start"&&a!=="child_agent_end"&&!(l.until_condition&&!l.error)){o+=1;continue}if(a==="analyze"&&!X[l.action_params?.analyzer_type??""]){o+=1;continue}if(a==="child_agent_start"){let c=l.action_params?.child_id??"",u=l.action_params?.objective??"",p=[];o+=1;let d=1,_="error",g;for(;o<t.length&&d>0;){let y=t[o],S=y.action_type;if(S==="child_agent_start")d+=1;else if(S==="child_agent_end"&&(d-=1,d===0)){_=y.status??"success",g=y,o+=1;break}d>0&&p.push(y),o+=1}let f=D(p,e,s,i);Q(f,c,u);let m=g?.action_params?.result_code??null,h=g?.action_params?.reason_code??null,I=g?.action_params?.error_message??null,b=g?.action_params?.summary??null,v=g?.action_params?.one_liner??null,k=_==="error";r.push({content_type:"generative_block",instruction_id:`generative_block_${c}`,generative_id:c,objective:u,status:_,children:f,error_message:k?I??null:null,error_code:k?h??null:null,result_code:m??null,bifurcation_context:[],approach_reason:H(b),one_liner:v??null});continue}else if(a==="child_agent_end"){o+=1;continue}else if(a==="if_else"){o+=1;let c=[];for(;o<t.length&&t[o].action_type==="child_agent_start";){let u=t[o],p=u.action_params?.child_id??"",d=u.action_params?.objective??"",_=[];o+=1;let g=1,f="error";for(;o<t.length&&g>0;){let h=t[o];if(h.action_type==="child_agent_start")g+=1;else if(h.action_type==="child_agent_end"&&(g-=1,g===0)){f=h.status??"success",o+=1;break}g>0&&_.push(h),o+=1}let m=D(_,e,s,i);c.push(...m)}r.push(ve(l,c));continue}else if(a==="query_tool"){o+=1;continue}else if(l.until_condition){let c=q(l,e,s,i),u=G(l,c,e),p=typeof l.until_condition_met=="boolean"?l.until_condition_met:l.status==="success";r.push({content_type:"until_block",instruction_id:`until_${P().slice(0,8)}`,condition:l.until_condition,max_retries:l.until_max_retries??10,settle_ms:l.until_settle_ms??500,current_count:0,condition_met:p,children:[u],generative_id:"",generative_objective:"",variables_used:{},status:l.status??"success"})}else{let c=q(l,e,s,i),u=G(l,c,e);r.push(u)}o+=1}return r}function L(t,e={},s="",i,n){let r=[];for(let o of t){let l=D(o.records,e,s,i,n);if(l.length===0)continue;let a=P().replace(/-/g,"");Q(l,a,o.objective);let c=l.some(_=>"status"in _&&typeof _.status=="string"?_.status==="error"||_.status==="failed":!1),u=o.resultCode?parseInt(o.resultCode,10):null,p=u!==null&&!isNaN(u)&&u>=200,d=c||p?"error":"success";r.push({content_type:"generative_block",instruction_id:`generative_block_${a}`,generative_id:a,objective:o.objective,status:d,children:l,error_message:d==="error"?o.errorMessage??null:null,error_code:d==="error"?o.reasonCode??null:null,result_code:o.resultCode??null,bifurcation_context:[],approach_reason:H(o.summary),one_liner:o.oneLiner??null})}return{instructions:r}}function te(t,e){let s;try{s=ee(t)}catch{return 0}let i=0,n=s.filter(r=>/^\d+$/.test(r)).sort((r,o)=>Number(r)-Number(o));for(let r of n){let o=N(t,r),l=N(o,"logs");if(!ye(l))continue;let a;try{a=ee(l)}catch{continue}let c=a.filter(d=>d.endsWith("-actions.ndjson")).sort((d,_)=>(parseInt(d,10)||0)-(parseInt(_,10)||0)),u=[];for(let d of c){let _=e.readActions(N(l,d));_.length&&u.push({objective:e.objective??"",records:_})}if(u.length===0)continue;let{instructions:p}=L(u,e.vars??{},e.screenshotBaseUrl??"",e.extMap,{keepFailedActions:!0});if(p.length!==0)try{let d=N(o,"auteur");Ae(d,{recursive:!0}),Re(N(d,"execution.json"),JSON.stringify(e.buildBlob(p),null,2)),i++,e.log?.("info","EVIDENCE_ARCHIVED_ATTEMPT_BLOB","Derived nested attempt blob",{attempt:r,instructions:p.length})}catch(d){e.log?.("debug","EVIDENCE_ARCHIVED_ATTEMPT_BLOB_FAILED","Nested attempt blob derivation failed",{attempt:r,error:d instanceof Error?d.message:String(d)})}}return i}var ie=le(ce(),1);import{createWriteStream as Pe}from"fs";import{readFile as xe}from"fs/promises";import{join as Le,basename as Ne}from"path";import{tmpdir as Oe}from"os";var ke=["**/screenshots/**","**/annotated/**","**/tcg/**","**/bifurcation/**"];async function ne(t){let e=Le(Oe(),`${Ne(t)}_artifacts.zip`);return new Promise((s,i)=>{let n=Pe(e),r=(0,ie.default)("zip",{zlib:{level:6}});n.on("close",()=>s(e)),r.on("error",i),r.pipe(n),r.glob("**/*",{cwd:t,ignore:ke}),r.finalize()})}async function se(t){return xe(t)}async function we(t,e){return ae(z(t,e))}function Ce(t){return{key:"artifacts",content_type:"application/zip",filename:`${t}.evidence`}}var re=class{config;controller;testId;constructor(e){this.config=e,this.controller=new M(e.controllerBaseUrl,e.auth),this.testId=e.testId}log(e,s,i,n){this.config.log?.(e,s,i,n)}async execute(){let{onProgress:e}=this.config;try{if(!this.testId)return this.log("error","PIPELINE_ABORT","No test_id available"),{success:!1,testId:null,error:"No test_id available"};let s=this.config.evidence,i=null;if(this.config.shouldUploadArtifacts!==!1){e("convert","running");let l=this.collectNdjsonPerRun(),a=l.reduce((f,m)=>f+m.records.length,0);this.log("info","PIPELINE_CONVERT","Collected NDJSON records",{total_records:a,run_groups:l.length});let c=this.config.variables??{};this.log("info","PIPELINE_CONVERT_VARS","Variables for template resolution",{keys:Object.keys(c)});let{instructions:u}=l.length>0?L(l,c,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap):{instructions:[]};this.log("info","PIPELINE_CONVERT_INSTRUCTIONS","Auteur instructions produced",{count:u.length});let p=this.buildExecutionEnvelope(u),d=Buffer.from(JSON.stringify(p));this.log("info","PIPELINE_CONVERT_BLOB","Blob created",{size_kb:+(d.length/1024).toFixed(1)});let _=E(this.config.sessionDir,"execution.json");O(_,JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_LOCAL_SAVE","Execution blob saved locally",{path:_});let g=s?.packTestDir??this.config.evidenceRead?.packTestDir;if(g){let f=E(g,"auteur");U(f,{recursive:!0}),O(E(f,"execution.json"),JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack",{path:E(f,"execution.json")}),this.deriveArchivedAttemptBlobs(g,c)}if(e("convert","done"),s)i=d;else{e("zip","running"),this.log("info","PIPELINE_ZIP_START","Zipping session",{session_dir:this.config.sessionDir});let f=null,m;try{f=await ne(this.config.sessionDir),m=await se(f),this.log("info","PIPELINE_ZIP_DONE","Zip complete",{size_mb:+(m.length/1024/1024).toFixed(1),path:f}),e("zip","done",`${(m.length/1024/1024).toFixed(1)}MB`)}finally{f&&await Te(f).catch(()=>{})}e("presign","running"),this.log("info","PIPELINE_PRESIGN_START","Requesting presigned URLs",{url:`${this.config.controllerBaseUrl}/upload/presign`,test_id:this.testId,session_id:this.config.sessionId});let h=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"artifacts",content_type:"application/zip",filename:`${this.config.sessionId}_artifacts.zip`},{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:h.urls.artifacts?.blob_url,blob_url:h.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading artifacts and blob",{artifact_size_mb:+(m.length/1024/1024).toFixed(1),blob_size_kb:+(d.length/1024).toFixed(1)}),await Promise.all([R(h.urls.artifacts.upload_url,m,"application/zip"),R(h.urls.blob.upload_url,d,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}}else{let l=this.collectNdjsonPerRun(),a=this.config.variables??{},{instructions:c}=l.length>0?L(l,a,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{keepFailedActions:!0}):{instructions:[]},u=this.buildExecutionEnvelope(c),p=E(this.config.sessionDir,"execution.json");O(p,JSON.stringify(u,null,2)),this.log("info","PIPELINE_LOCAL_SAVE","Execution blob saved locally (no upload)",{path:p});let d=this.config.evidence?.packTestDir??this.config.evidenceRead?.packTestDir;if(d){let _=E(d,"auteur");U(_,{recursive:!0});let g=this.readAuthoredExecution();O(E(_,"execution.json"),g??JSON.stringify(u,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack (gated)",{path:E(_,"execution.json"),source:g?"authored":"run_envelope"}),this.deriveArchivedAttemptBlobs(d,a)}e("convert","skipped"),e("zip","skipped"),e("presign","skipped"),e("upload","skipped"),this.log("info","PIPELINE_UPLOAD_SKIPPED","Upload steps skipped (gate disabled)")}if(this.config.shouldReplaceLocalOutput&&this.config.onAtomicReplace){e("atomic_replace","running");try{await this.config.onAtomicReplace(),this.log("info","PIPELINE_ATOMIC_REPLACE_OK","Local output replaced"),e("atomic_replace","done")}catch(l){let a=l instanceof Error?l.message:String(l);throw this.log("error","PIPELINE_ATOMIC_REPLACE_FAILED","Atomic-replace failed",{error:a}),e("atomic_replace","failed",a),l}}else e("atomic_replace","skipped");let n,r;if(this.config.shouldCommit&&!this.config.isFirstRun&&this.config.onCommitLock){e("commit_lock","running");let l=await this.config.onCommitLock();if(l.ok)n=l.testcaseId,this.log("info","PIPELINE_COMMIT_LOCK_OK","Commit lock acquired",{testcase_id:n??"none"}),e("commit_lock","done");else return this.log("error","PIPELINE_COMMIT_LOCK_FAILED","Commit lock failed",{reason:l.reason,message:l.message}),e("commit_lock","failed",`${l.reason??"unknown"}: ${l.message??""}`),{success:!1,testId:this.testId,error:`commit-lock failed: ${l.reason??"unknown"}`}}else e("commit_lock","skipped");if(this.config.isFirstRun&&!this.config.skipTmsFinalize){e("finalize","running"),this.log("info","PIPELINE_FINALIZE_START","Finalizing test (first-run)",{test_id:this.testId,commit_id:this.config.commitId});let l=new B(this.config.tmsBaseUrl,this.config.tmsUsername,this.config.tmsAccessKey),a=this.config.runObjectives&&this.config.runObjectives.length>0?this.config.runObjectives:[this.config.firstObjective];if(n=(await l.endTest(this.testId,{commit_id:this.config.commitId,time_taken:Math.round(this.config.totalDuration),steps_count:this.config.totalSteps,commit_message:this.config.firstObjective.slice(0,255),objectives:a})).testcase_id||void 0,this.log("info","PIPELINE_FINALIZE_OK","Test finalized",{testcase_id:n??"none"}),this.config.onFinalizeSuccess)try{await this.config.onFinalizeSuccess(n)}catch(u){this.log("warn","PIPELINE_FINALIZE_META_FAILED","Meta-rewrite after endTest failed",{error:String(u)})}e("finalize","done")}else e("finalize","skipped"),this.log("info","PIPELINE_FINALIZE_SKIPPED","Finalize skipped (evolve flow or first-run disabled)");if(n&&this.config.shareApiBaseUrl)try{r=await this.generateShareLink(n),this.log("info","PIPELINE_SHARE_OK","Share link generated",{share_id:r})}catch(l){this.log("warn","PIPELINE_SHARE_FAILED","Share link failed",{error:String(l)})}if(s&&i){let l=null;e("zip","running");try{await s.sealFn({testcaseId:n,shareId:r}),l=s.sealedPackPath?await ae(s.sealedPackPath):await we(s.executionId,s.cwd),this.log("info","PIPELINE_EVIDENCE_SEALED","Evidence pack sealed",{execution_id:s.executionId}),this.log("info","PIPELINE_PACK_READ","Sealed pack read",{size_mb:+(l.length/1024/1024).toFixed(1)})}catch(a){let c=a instanceof Error?a.message:String(a);this.log("warn","PIPELINE_EVIDENCE_UPLOAD_SKIPPED","Evidence seal/read failed \u2014 uploading blob only",{execution_id:s.executionId,error:c})}if(l){e("zip","done",`${(l.length/1024/1024).toFixed(1)}MB`),e("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[Ce(s.executionId),{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:a.urls.artifacts?.blob_url,blob_url:a.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading pack and blob",{artifact_size_mb:+(l.length/1024/1024).toFixed(1),blob_size_kb:+(i.length/1024).toFixed(1)}),await Promise.all([R(a.urls.artifacts.upload_url,l,"application/zip"),R(a.urls.blob.upload_url,i,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}else{e("zip","skipped"),e("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading blob only (evidence skipped)",{blob_size_kb:+(i.length/1024).toFixed(1)}),await R(a.urls.blob.upload_url,i,"application/json"),this.log("info","PIPELINE_UPLOAD_OK","Blob upload complete (pack skipped)"),e("upload","done")}}let o;if(this.config.mobile&&this.config.codeExport?.enabled)this.log("info","PIPELINE_CODE_EXPORT_SKIPPED","Code export is not supported for device runs"),e("code_export","skipped","not supported on mobile yet");else if(this.config.codeExport?.enabled&&n){let l=!1;try{await this.triggerCodeExport(n),this.log("info","PIPELINE_CODE_EXPORT_START","Code export triggered"),l=!0}catch(a){let c=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export trigger failed; skipping poll",{error:c}),e("code_export","failed",`trigger failed: ${c}`)}if(l){e("code_export","running","Waiting for code generation\u2026");try{o=await this.pollAndDownloadCode(n,e),this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:o}),e("code_export","done",o)}catch(a){let c=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:c}),e("code_export","failed",c)}}}else e("code_export","skipped");return this.log("info","PIPELINE_COMPLETE","Pipeline complete"),{success:!0,testId:this.testId,testcaseId:n,shareId:r,codeExportDir:o}}catch(s){return{success:!1,testId:this.testId,error:s instanceof Error?s.message:String(s)}}}async runCodeExport(e,s){let i=s??this.config.onProgress,n=!1;try{await this.triggerCodeExport(e),this.log("info","PIPELINE_CODE_EXPORT_TRIGGER","Code export triggered",{testcase_id:e}),n=!0}catch(r){let o=r instanceof Error?r.message:String(r);this.log("error","PIPELINE_CODE_EXPORT_TRIGGER_FAILED","Code export trigger failed; skipping poll",{error:o}),i("code_export","failed",`trigger failed: ${o}`)}if(n){i("code_export","running","Waiting for code generation\u2026");try{let r=await this.pollAndDownloadCode(e,i);return this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:r}),i("code_export","done",r),r}catch(r){let o=r instanceof Error?r.message:String(r);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:o}),i("code_export","failed",o);return}}}deriveArchivedAttemptBlobs(e,s){try{let i=te(e,{readActions:n=>this.readNdjsonFromFile(n),buildBlob:n=>this.buildExecutionEnvelope(n),objective:this.config.firstObjective,vars:s,screenshotBaseUrl:this.config.screenshotBaseUrl??"",extMap:this.config.screenshotExtMap,log:(n,r,o,l)=>this.log(n,r,o,l)});i>0&&this.log("info","PIPELINE_ARCHIVED_ATTEMPTS","Nested retry-attempt blobs derived",{count:i})}catch(i){this.log("debug","PIPELINE_ARCHIVED_ATTEMPTS_FAILED","Nested attempt blob pass failed",{error:i instanceof Error?i.message:String(i)})}}collectNdjsonPerRun(){let e=[],s=this.config.runObjectives??[],i=this.config.runMetadata??[],n=this.config.evidence??this.config.evidenceRead;for(let r=0;r<this.config.runDirs.length;r++){let o=this.config.runDirs[r],l=s[r]||this.config.firstObjective,a=i[r],c=n?this.readNdjsonFromFile(E(n.packTestDir,"logs",`${n.runIndices?.[r]??r}-actions.ndjson`)):this.readNdjsonFromDir(o);c.length>0&&e.push({objective:l,records:c,resultCode:a?.resultCode,reasonCode:a?.reasonCode,errorMessage:a?.errorMessage,summary:a?.summary,oneLiner:a?.oneLiner})}if(e.length===0){let r=E(this.config.sessionDir,"runs");if(j(r))try{let l=Se(r,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort();for(let a of l){let c=E(r,a),u=this.readNdjsonFromDir(c);u.length>0&&e.push({objective:this.config.firstObjective,records:u})}}catch{}}return e}readNdjsonFromDir(e){let s=[E(e,"run-test","actions.ndjson"),E(e,"actions.ndjson")];for(let i of s)if(j(i))return this.readNdjsonFromFile(i);return[]}readNdjsonFromFile(e){let s=[];if(!j(e))return s;this.log("debug","PIPELINE_COLLECT_READ","Reading NDJSON file",{path:e});let i=oe(e,"utf-8");for(let n of i.split(`
5
+ `)){let r=n.trim();if(r)try{s.push(JSON.parse(r))}catch{}}return s}async generateShareLink(e){let s=`${this.config.shareApiBaseUrl}/lshs/api/v1.0/share-item/generate-sharable-link`;this.log("info","PIPELINE_SHARE_START","Requesting share link",{url:s,testcase_id:e});let i={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({entityIds:[e],entityType:"Test Case Details",expiresAt:7})},n=!!this.config.authResolver;this.log("debug","PIPELINE_SHARE_AUTH","Share link auth config",{resolver:n,fallback_auth_type:typeof this.config.auth=="string"?"bearer":"basic",tms_user:this.config.tmsUsername});let r=n?await this.config.authResolver.fetch(s,i):await x(s,{...i,headers:{...i.headers,Authorization:this.buildAuthHeader()}});if(!r.ok)throw new Error(`Share link API failed: ${r.status} ${await r.text()}`);let o=await r.json();if(!o.shareId)throw new Error("Share link API returned no shareId");return o.shareId}async triggerCodeExport(e){if(!this.config.codeExport)throw new Error("triggerCodeExport called without resolved codeExport config");let{url:s,body:i}=V({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e,codeExport:this.config.codeExport});this.log("info","PIPELINE_CODE_EXPORT_POST","Triggering code export",{url:s});let n={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(i)},r=this.config.authResolver?await this.config.authResolver.fetch(s,n):await x(s,{...n,headers:{...n.headers,Authorization:this.buildAuthHeader()}});if(!r.ok)throw new Error(`Code export failed: ${r.status} ${await r.text()}`)}async pollAndDownloadCode(e,s){let i=$({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e}),n=this.config.exitTimeoutMs??3e5,r=5e3,o=Date.now()+n;this.log("info","PIPELINE_CODE_EXPORT_POLL","Polling for code export",{url:i,timeout_ms:n});let l=(a,c)=>this.config.authResolver?this.config.authResolver.fetch(a,c):x(a,{...c,headers:{...c?.headers,Authorization:this.buildAuthHeader()}});for(;Date.now()<o;){let a=await l(i,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok){let _=await a.text().catch(()=>"");throw this.log("warn","PIPELINE_CODE_EXPORT_POLL_FAILED","Code export poll non-200; skipping",{status:a.status,body:_.slice(0,200)}),new Error(`code export poll skipped: HTTP ${a.status}`)}let u=(await a.json()).data?.find(_=>_.code_name==="kane-cli-trigger");if(!u){this.log("debug","PIPELINE_CODE_EXPORT_WAITING","No kane-cli-trigger entry yet"),s("code_export","running","Waiting for code generation\u2026"),await this.sleep(r);continue}let p=u.status.toLowerCase();if(p==="in progress"||p==="in_progress"||p==="pending"){this.log("debug","PIPELINE_CODE_EXPORT_IN_PROGRESS","Code export in progress",{status:u.status}),s("code_export","running","Generating code\u2026"),await this.sleep(r);continue}if(!u.url||u.url.length===0)throw new Error(`Code export status=${u.status} but no files returned`);let d=this.config.codeExportDir??E(this.config.sessionDir,"code-export");U(d,{recursive:!0}),this.log("info","PIPELINE_CODE_EXPORT_DOWNLOAD","Downloading code files",{file_count:u.url.length,dir:d}),s("code_export","running",`Downloading ${u.url.length} files\u2026`);for(let _ of u.url){let g=E(d,_.file_name),f=await x(_.file_url);if(!f.ok){this.log("warn","PIPELINE_CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:_.file_name,status:f.status});continue}let m=await f.text();O(g,m,"utf-8"),this.log("info","PIPELINE_CODE_EXPORT_FILE_SAVED","File saved",{file_name:_.file_name,size_bytes:m.length})}return d}throw new Error("Code export timed out")}sleep(e){return new Promise(s=>setTimeout(s,e))}buildAuthHeader(){return typeof this.config.auth=="string"?`Bearer ${this.config.auth}`:F(this.config.auth.username,this.config.auth.accessKey)}readAuthoredExecution(){let e=this.config.authoredExecutionPath;if(!e)return null;try{let s=oe(e,"utf8");return JSON.parse(s),s}catch{return this.log("warn","PIPELINE_AUTHORED_BLOB_UNREADABLE","Authored execution.json missing/unreadable \u2014 pack gets this run's envelope",{path:e}),null}}buildExecutionEnvelope(e){let s=this.config.runStatuses.every(a=>a==="passed")?"success":"error",i=this.config.variableIds??{},n=[];if(this.config.variables)for(let[a,c]of Object.entries(this.config.variables)){if(c.secret)continue;let u=a.startsWith("global.")?a.slice(7):a;n.push({id:i[u]??0,name:u,value:c.value,session_value:c.value,is_persist:!1,environment_id:0,environment_name:"No Env"})}let r=[],o=[],l=new Set;for(let a of this.collectNdjsonPerRun())for(let c of a.records)if(c.output_variable&&c.output_value!=null&&r.push({name:c.output_variable,value:String(c.output_value),value_type:"test_level",variable_description:"ANALYZE result"}),c.action_type==="upload_files"){let u=C(c.action_params);if(u){let p=u.media_id||u.media_url;if(!l.has(p)){l.add(p),o.push({media_url:u.media_url,media_id:u.media_id,name:u.name,type:u.type});let d=w(u.name);r.push({name:K(u.name),value:d,value_type:"string",variable_description:`variable for ${d}`})}}}return{test_id:this.testId,version:"v4",auto_heal_version:this.config.apMode==="v2"?"AH2":"",session_id:this.config.sessionId,org_id:String(this.config.orgId),user_id:String(this.config.userId),url:this.config.firstUrl??"",start_timestamp:this.config.startedAt,end_timestamp:this.config.endedAt,status:s,commit_id:this.config.commitId,instructions:e,modules:[],uploaded_files:o,test_params:[],test_level_variables:JSON.stringify(r),test_global_variables:n,max_network_wait:0,wait_buffer:0,network_throttle:{},secrets:this.config.secrets??[],totp:[],environment_id:0,environment:"",mobile_browser:!1,native_popups:[],smartui:{},module_index:0}}};export{we as a,Ce as b,re as c};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{y as n}from"./chunk-27U4PLPX.js";import{a as s}from"./chunk-HCBYKLMW.js";import{a,b as i}from"./chunk-C44QQJR4.js";import{e as r}from"./chunk-UR6MHSHU.js";var o=r(s(),1);function g({bindings:c,suppressEscBack:p=!1,escBackLabel:m="back to chat"}){let e=c.map(t=>`${t.keys} ${t.label}`);return p||e.push(`esc \xB7 ${m}`),(0,o.jsx)(a,{marginTop:1,children:(0,o.jsx)(i,{color:n.dim,children:e.join(" \xB7 ")})})}export{g as a};
2
+ import{y as n}from"./chunk-D6FYCAIA.js";import{a as s}from"./chunk-HCBYKLMW.js";import{a,b as i}from"./chunk-C44QQJR4.js";import{e as r}from"./chunk-UR6MHSHU.js";var o=r(s(),1);function g({bindings:c,suppressEscBack:p=!1,escBackLabel:m="back to chat"}){let e=c.map(t=>`${t.keys} ${t.label}`);return p||e.push(`esc \xB7 ${m}`),(0,o.jsx)(a,{marginTop:1,children:(0,o.jsx)(i,{color:n.dim,children:e.join(" \xB7 ")})})}export{g as a};
@@ -0,0 +1,11 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as W}from"./chunk-MSGW4JDG.js";import{d as U,e as F}from"./chunk-4JOD47QI.js";import{a as H}from"./chunk-D6FYCAIA.js";import{createHash as Y}from"crypto";import{access as Q,mkdir as S,mkdtemp as Z,readdir as O,readFile as y,rename as N,rm as v,writeFile as x}from"fs/promises";import{homedir as tt}from"os";import{arch as et,platform as st}from"process";import{dirname as C,isAbsolute as nt,join as l,relative as X,resolve as rt,sep as it}from"path";var q=1,ot={emulator:"emulator",simulator:"simulator"};function Pt(i){return ot[i.kind]??null}var j=class extends Error{constructor(s,e,n){super([`Managed mobile dependencies for ${s} are not installed.`,`- kaneai-mobile-deps ${s} ${e.bundleVersion}: ${e.url} (${_(e.bytes)})`,`Destination: ${n}`,`Run \`kane-cli doctor --target ${s} --install\` to download it.`].join(`
3
+ `));this.deviceClass=s;this.name="DepsInstallRequiredError"}};function _(i){return i>=1024*1024?`${Math.ceil(i/(1024*1024))} MB`:`${i} bytes`}function at(i){let t=i/1048576;return t>=10?`${Math.round(t)} MB/s`:t>=1?`${t.toFixed(1)} MB/s`:`${Math.max(1,Math.round(i/1024))} KB/s`}function lt(i){let t=Math.max(1,Math.round(i));return t<60?`~${t}s left`:`~${Math.floor(t/60)}m ${t%60}s left`}var K=8*1024*1024,ct=8;function ut(i){if(!Number.isFinite(i)||i<2*K)return null;let t=Math.min(ct,Math.floor(i/K)),s=Math.ceil(i/t),e=[];for(let n=0;n<i;n+=s)e.push({start:n,end:Math.min(n+s,i)-1});return e}async function L(i,t){let s=i.body;if(!s||typeof s.getReader!="function"){let c=new Uint8Array(await i.arrayBuffer());return t?.(c.length),c}let e=s.getReader(),n=[],r=0;for(;;){let{done:c,value:h}=await e.read();if(c)break;h&&(n.push(h),r+=h.length,t?.(h.length))}let o=new Uint8Array(r),a=0;for(let c of n)o.set(c,a),a+=c.length;return o}var z=3,dt=3e4,k=class extends Error{};async function pt(i,t,s,e,n,r=dt){let o=new Uint8Array(s),a=0,c=new AbortController,h=null,b=!1;try{await Promise.all(e.map(async(f,M)=>{let P=0,V=d=>{P+=d,a+=d,n?.(a)},T=()=>{a=Math.max(0,a-P),P=0},R=null;for(let d=0;d<z;d+=1){if(c.signal.aborted)return;let u=new AbortController,m=()=>u.abort();c.signal.addEventListener("abort",m,{once:!0});let w=!1,g=null,$=()=>{g&&clearTimeout(g),g=setTimeout(()=>{w=!0,u.abort()},r)};try{$();let p=await i(t,{headers:{Range:`bytes=${f.start}-${f.end}`},signal:u.signal});if(typeof p.body?.getReader!="function"&&g&&(clearTimeout(g),g=null),!p.ok)throw new k(`Could not download ${t}: HTTP ${p.status}`);if(p.status!==206){b=!0,M===0?h=await L(p,I=>{$(),V(I)}):await(p.body?.cancel().catch(()=>{})??Promise.resolve());return}let D=f.end-f.start+1,E=await L(p,I=>{$(),V(I)});if(E.length!==D)throw new Error(`range ${f.start}-${f.end} returned ${E.length} bytes (expected ${D})`);o.set(E,f.start);return}catch(p){if(p instanceof k)throw p;if(c.signal.aborted)return;T(),R=w?new Error(`no data for ${Math.round(r/1e3)}s`):p instanceof Error?p:new Error(String(p))}finally{g&&clearTimeout(g),c.signal.removeEventListener("abort",m)}}throw new Error(`Could not download ${t}: range ${f.start}-${f.end} failed after ${z} attempts (${R?.message??"unknown error"}) \u2014 check your network and rerun \`kane-cli doctor --target <emulator|simulator> --install\`.`)}))}catch(f){throw c.abort(),f}return h||(b?null:o)}async function ht(i,t,s,e,n){let r=ut(s);if(r){let c=await pt(i,t,s,r,e,n?.stallMs);if(c)return c}let o=await i(t);if(!o.ok)throw new Error(`Could not download ${t}: HTTP ${o.status}`);let a=0;return L(o,e&&(c=>{a+=c,e(a)}))}function ft(i){return Y("sha256").update(i).digest("hex")}function mt(i,t){let s=X(i,t);return s!==""&&!s.startsWith(`..${it}`)&&s!==".."&&!nt(s)}async function A(i){try{return await Q(i),!0}catch{return!1}}function wt(){return{home:tt(),os:st,arch:et,cliVersion:H,nodeModuleVersion:process.versions.modules,fetch,resolveBundle:async i=>(await import("./deps-resolve-7SWSUDRX.js")).controllerResolveBundle()(i),exec:U,now:()=>new Date,wait:F,processAlive:i=>{try{return process.kill(i,0),!0}catch{return!1}}}}var B=class extends Error{constructor(s,e,n){super(`No managed mobile dependencies are published for ${s} (kane-cli ${e}).
4
+ This is a packaging gap, not something to install locally \u2014 report it, or pass --appium-url to use an Appium server you manage yourself.`);this.coordinate=s;this.cause=n;this.name="NoPublishedBundleError"}},J=class i{deps;constructor(t={}){this.deps={...wt(),...t}}mobileRoot(){return l(this.deps.home,".testmuai","kaneai","mobile")}depsRoot(){return l(this.mobileRoot(),"deps")}classRoot(t,s){return l(this.depsRoot(),s,t)}resolveCacheFile(){return l(this.depsRoot(),"resolve-cache.json")}resolveCacheKey(t){return`${this.deps.cliVersion}|${this.deps.os}-${this.deps.arch}-${t}`}static RESOLVE_CACHE_TTL_MS=1440*60*1e3;async readCachedWantedVersion(t){try{let e=JSON.parse(await y(this.resolveCacheFile(),"utf8"))[this.resolveCacheKey(t)];if(!e?.bundleVersion||!e.fetchedAt)return null;let n=this.deps.now().getTime()-new Date(e.fetchedAt).getTime();return n>=0&&n<i.RESOLVE_CACHE_TTL_MS?e.bundleVersion:null}catch{return null}}async writeResolveCache(t,s){try{let e={};try{e=JSON.parse(await y(this.resolveCacheFile(),"utf8"))}catch{}e[this.resolveCacheKey(t)]={bundleVersion:s,fetchedAt:this.deps.now().toISOString()},await S(this.depsRoot(),{recursive:!0}),await x(this.resolveCacheFile(),`${JSON.stringify(e,null,2)}
5
+ `)}catch{}}async warmResolveCache(t){if(await this.readCachedWantedVersion(t)===null)try{await this.resolveOrExplain(t)}catch{}}paths(t,s){let e=this.classRoot(t,s);return{root:e,appium:l(e,"appium"),appiumHome:l(e,"appium-home"),platformTools:l(e,"platform-tools"),wdaDir:l(e,"wda","Build","Products","Debug-iphonesimulator"),iwdpBinDir:l(e,"bin"),installManifest:l(e,"install-manifest.json")}}async status(t,s){s||(s=await this.readCachedWantedVersion(t)??void 0);let e=[];try{e=await O(this.depsRoot())}catch{}s&&(e=e.filter(c=>c===s));let n=null;for(let c of e){let h=this.classRoot(t,c),b=null;try{b=JSON.parse(await y(l(h,"install-manifest.json"),"utf8"))}catch{continue}b.schemaVersion===q&&(!s&&b.cliVersion!==this.deps.cliVersion||(!n||b.installedAt>n.manifest.installedAt)&&(n={manifest:b,root:h}))}if(!n)return{class:t,installed:!1};let r=this.paths(t,n.manifest.bundleVersion),o=[l(r.appium,"node_modules","appium","index.js")];t==="emulator"&&o.push(l(r.platformTools,this.deps.os==="win32"?"adb.exe":"adb")),t==="simulator"&&o.push(l(r.wdaDir,"WebDriverAgentRunner-Runner.app"));for(let c of o)if(!await A(c))return{class:t,installed:!1,version:n.manifest.bundleVersion,root:n.root,corrupt:`a bundle component is missing from disk (${X(n.root,c)})`};let a=await this.postInstallDrifted(r);return{class:t,installed:!0,version:n.manifest.bundleVersion,root:n.root,...a?{needsRepair:a}:{}}}async postInstallDrifted(t){let s=l(t.appiumHome,"node_modules",".cache","appium","extensions.yaml");if(!await A(s))return!1;let e=await y(s,"utf8");for(let n of e.split(`
6
+ `)){let r=/^\s*installPath:\s*(.+?)\s*$/.exec(n);if(r&&!r[1].startsWith(t.appiumHome))return!0}return!1}async environment(t){let s=await this.status(t);if(!s.installed||!s.version)return{dirs:[]};let e=this.paths(t,s.version),n=[],r={dirs:n,appiumHome:e.appiumHome};return t!=="simulator"&&(n.push(e.platformTools),r.platformToolsDir=e.platformTools),n.push(l(e.appium,"node_modules",".bin")),t==="simulator"&&(n.push(e.iwdpBinDir),r.wdaDir=e.wdaDir,r.wdaRoot=l(e.root,"wda"),r.iwdpBinDir=e.iwdpBinDir),r}async ensure(t,s){let e,n;try{e=await this.resolveOrExplain(t)}catch(a){n=a}let r=await this.status(t,e?.bundleVersion);if(r.installed&&!r.needsRepair)return e&&r.version&&await this.adoptInstall(t,r.version),r;if(!e)throw n;if(r.installed&&r.needsRepair&&r.version){let a=this.paths(t,r.version);return await this.withInstallLock(async()=>{await this.postInstall(a.root,a,s.onProgress)}),await this.adoptInstall(t,r.version),this.status(t,e.bundleVersion)}let o=e;if(!s.automatic&&!s.approved)throw new j(t,o,this.classRoot(t,o.bundleVersion));return await this.withInstallLock(async()=>{(await this.status(t,o.bundleVersion)).installed||await this.install(t,o,s.onProgress)}),this.status(t,o.bundleVersion)}async adoptInstall(t,s){try{let e=this.paths(t,s).installManifest,n=JSON.parse(await y(e,"utf8"));if(n.cliVersion===this.deps.cliVersion)return;n.cliVersion=this.deps.cliVersion;let r=l(C(e),`install-manifest-${process.pid}.json`);await x(r,`${JSON.stringify(n,null,2)}
7
+ `),await N(r,e)}catch{}}async resolveOrExplain(t){let s=`${this.deps.os}-${this.deps.arch}-${t}`,e;try{e=await this.deps.resolveBundle({cliVersion:this.deps.cliVersion,os:this.deps.os,arch:this.deps.arch,deviceClass:t})}catch(n){throw new B(s,this.deps.cliVersion,n)}if(!e?.url||!e.sha256||!e.bundleVersion)throw new B(s,this.deps.cliVersion);return await this.writeResolveCache(t,e.bundleVersion),e}async install(t,s,e){let n=this.paths(t,s.bundleVersion),r=l(this.depsRoot(),s.bundleVersion);await S(r,{recursive:!0});let o=await Z(l(r,".staging-"));try{e?.(`Downloading the ${t} dependencies ${s.bundleVersion} (${_(s.bytes)}) \u2014 this happens once\u2026`);let a=[],c=-1,h=0,b=await this.download(s,(d,u)=>{if(!u)return;let m=Math.min(d,u),w=this.deps.now().getTime();for(a.push({t:w,received:m});a.length>1&&a[0].t<w-3e3;)a.shift();let g=Math.min(100,Math.floor(m/u*20)*5);if(g===c&&w-h<2e3&&m<u)return;c=g,h=w;let $=a[0],p=(w-$.t)/1e3,D=p>0?(m-$.received)/p:0,E=D>0&&m<u?` \xB7 ${at(D)} \xB7 ${lt((u-m)/D)}`:"";e?.(`Downloading the ${t} dependencies \u2014 ${_(m)} / ${_(u)} (${g}%)${E}`)}),f=W(b),M=gt(f);for(let[d,u]of Object.entries(f)){if(d.endsWith("/"))continue;let m=M&&d.startsWith(M)?d.slice(M.length):d;if(!m)continue;let w=rt(o,m);if(!mt(o,w))throw new Error(`Unsafe path in ${s.url}: ${d}`);await S(C(w),{recursive:!0}),await x(w,u,this.deps.os!=="win32"?{mode:493}:{})}let P=await this.readBundleManifest(o,s.url,t);await this.postInstall(o,n,e),await v(n.root,{recursive:!0,force:!0}),await N(o,n.root);let V={schemaVersion:q,class:t,bundleVersion:s.bundleVersion,cliVersion:this.deps.cliVersion,os:this.deps.os,arch:this.deps.arch,sha256:s.sha256,bytes:s.bytes,sourceUrl:s.url,installedAt:this.deps.now().toISOString(),nodeAbi:P.node_abi?.node_module_version??this.deps.nodeModuleVersion,postInstall:{quarantineStripped:this.deps.os==="darwin",extensionsRewritten:!0}},T=l(r,`install-manifest-${process.pid}.json`);await x(T,`${JSON.stringify(V,null,2)}
8
+ `),await N(T,n.installManifest),await this.gcOldVersions(t);let R=l(this.mobileRoot(),"trees");await A(R)&&(await this.reapLegacyServers(R,e),await v(R,{recursive:!0,force:!0}),e?.("Removed the legacy per-component toolchain trees"));for(let d of["emulator","simulator"]){let u=l(this.depsRoot(),d);await A(l(u,"install-manifest.json"))||await A(u)&&(await v(u,{recursive:!0,force:!0}),e?.(`Removed the previous ${d} deps layout`))}}finally{await v(o,{recursive:!0,force:!0})}}async reapLegacyServers(t,s){if(this.deps.os==="win32")return;let e=await this.deps.exec("pgrep",["-f",t],{timeoutMs:1e4});if(e.code!==0)return;let n=e.stdout.split(`
9
+ `).map(r=>r.trim()).filter(r=>/^\d+$/.test(r));for(let r of n)await this.deps.exec("kill",[r],{timeoutMs:5e3});n.length>0&&s?.(`Stopped ${n.length} legacy managed server process${n.length===1?"":"es"} before removing the old toolchain trees`)}async gcOldVersions(t){let s=[];try{s=await O(this.depsRoot())}catch{return}let e=[];for(let n of s){let r=this.classRoot(t,n);try{let o=JSON.parse(await y(l(r,"install-manifest.json"),"utf8"));e.push({root:r,installedAt:o.installedAt})}catch{}}e.sort((n,r)=>n.installedAt<r.installedAt?1:-1);for(let n of e.slice(2)){await v(n.root,{recursive:!0,force:!0});let r=C(n.root);try{(await O(r)).length===0&&await v(r,{recursive:!0,force:!0})}catch{}}}async download(t,s){let e=null;for(let n=0;n<2;n+=1){let r=await ht(this.deps.fetch,t.url,t.bytes,s&&(a=>s(a,t.bytes))),o=ft(r);if(o===t.sha256)return r;e=new Error(`Checksum mismatch for ${t.url}: expected ${t.sha256}, got ${o}.`)}throw e??new Error(`Could not download ${t.url}`)}async readBundleManifest(t,s,e){let n;try{n=JSON.parse(await y(l(t,"manifest.json"),"utf8"))}catch{throw new Error(`The bundle at ${s} carries no readable manifest.json; refusing to install it.`)}if(n.platform!==this.deps.os||n.arch!==this.deps.arch)throw new Error(`The bundle at ${s} is built for ${n.platform}-${n.arch}; this host is ${this.deps.os}-${this.deps.arch}. A wrong blob was published for this coordinate.`);if(!n.supported_targets?.includes(e))throw new Error(`The bundle at ${s} does not support the ${e} device class (it supports: ${n.supported_targets?.join(", ")||"nothing"}). A wrong blob was published.`);return n}async postInstall(t,s,e){this.deps.os==="darwin"&&await this.deps.exec("xattr",["-dr","com.apple.quarantine",t],{timeoutMs:6e4});let n=l(t,"appium-home","node_modules",".cache","appium","extensions.yaml");if(await A(n)){let r=await y(n,"utf8"),o=bt(r,s.appiumHome);await x(n,o),e?.("Rewrote Appium extension paths for this machine")}}async withInstallLock(t){let s=l(this.mobileRoot(),"install.lock"),e=Date.now();for(await S(this.mobileRoot(),{recursive:!0});;)try{await S(s),await x(l(s,"owner.json"),JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()}));try{return await t()}finally{await v(s,{recursive:!0,force:!0})}}catch(n){if(n.code!=="EEXIST")throw n;let r={};try{r=JSON.parse(await y(l(s,"owner.json"),"utf8"))}catch{}if(r.pid&&!this.deps.processAlive(r.pid)){await v(s,{recursive:!0,force:!0});continue}if(Date.now()-e>12e4)throw new Error(`Timed out waiting for the mobile install lock (holder pid ${r.pid??"unknown"}).`);await this.deps.wait(500)}}};function gt(i){let t=Object.keys(i).filter(e=>!e.endsWith("/")),s=new Set(t.map(e=>e.split("/")[0]));return s.size===1&&t.every(e=>e.includes("/"))?`${[...s][0]}/`:""}function bt(i,t){return i.split(`
10
+ `).map(s=>{let e=/^(\s*installPath:\s*)(.+?)\s*$/.exec(s);if(!e)return s;let n=e[2],r=/[\\/]node_modules[\\/]/g,o=-1;for(let a=r.exec(n);a;a=r.exec(n))o=a.index+a[0].length;return o<0?s:`${e[1]}${l(t,"node_modules",n.slice(o))}`}).join(`
11
+ `)}var G;function Et(){return G??=new J,G}export{q as a,Pt as b,j as c,at as d,lt as e,ut as f,ht as g,B as h,J as i,Et as j};
@@ -0,0 +1,12 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as Bt}from"./chunk-ZMNJBUAO.js";import{f as tr}from"./chunk-W5TTF7GB.js";import{a as Ft}from"./chunk-I7TIGB7K.js";import{a as te,c as Yt,e as Zt,f as qe,g as Qt,h as nr}from"./chunk-WMMJXI5O.js";import{a as Xt,b as rr,c as sr,d as ir,e as dt,f as or}from"./chunk-ZGBSGZZM.js";import{a as ke,b as qt,c as Gt,d as Lt,e as Vt}from"./chunk-4FQI643D.js";import{a as zt}from"./chunk-L2TV4G56.js";import{a as Kt,b as Jt}from"./chunk-JFAFKHDX.js";import{c as Wt}from"./chunk-6KPPGMO2.js";import{b as Nt}from"./chunk-YKTYVJBN.js";import{a as Ht,e as jt}from"./chunk-GFKCTYCA.js";import{a as er}from"./chunk-IMR64OCZ.js";import{e as Ut}from"./chunk-XO45NGSN.js";import{a as Fe}from"./chunk-TUTDSX7T.js";import{e as Mt}from"./chunk-X2FM67OM.js";import{a as $e,b as ct}from"./chunk-DNNZ353O.js";import{a as Se}from"./chunk-NVGBE2DR.js";import{b as nt}from"./chunk-IDX3TOPY.js";import{A as ee,k as be,o as Be}from"./chunk-TH47OOBV.js";import{f as It}from"./chunk-DUAXZYAD.js";import{e as at}from"./chunk-DBIBROYW.js";import{d as me}from"./chunk-WXHQYYD5.js";import{b as Ot}from"./chunk-IAHKTEET.js";import{a as At}from"./chunk-5EOX4MEY.js";import{appendFileSync as wr,mkdirSync as ut,rmdirSync as br,writeFileSync as lt}from"fs";import{dirname as mr,extname as Sr,join as ce}from"path";var X=class extends Error{code;constructor(e,a){super(`${e}: ${a}`),this.name="ProposalAdapterError",this.code=e}};function cr(r){return r.version===2}var ar=8;function vr(r){let e=/^extract@(\d+)$/.exec(r??"");return e?Number.parseInt(e[1],10):null}var yr=r=>typeof r=="object"&&r!==null&&"op"in r;function Ge(r,e,a){return{anchor:r.anchor,quote:r.quote,...a||r.source_id!==e?{source_id:r.source_id}:{}}}function dr(r,e,a={}){let m=vr(a.templateVersion),x=m!==null&&m>=5,_=m!==null&&m<5,y=r.archived!=null&&r.archived.length>0&&m!==null&&m<5;if(y&&a.warn?.(`dropped ${r.archived.length} archive op(s): the bound extract template @${m} never described archiving \u2014 nothing was archived; the use-cases still land`),!x&&r.read_basis.length!==1)throw new X("READ_BASIS_COUNT",`read_basis must have exactly 1 element, got ${r.read_basis.length}`);if(r.read_basis.length===0)throw new X("READ_BASIS_COUNT","read_basis must not be empty");let v=r.read_basis[0],h=r.read_basis.length>1,$=r.use_cases.map(i=>{if(_&&i.cite.length!==1)throw new X("CITE_COUNT",`${i.temp_ref}: cite must have exactly 1 element, got ${i.cite.length}`);if(i.cite.length<1||i.cite.length>ar)throw new X("CITE_COUNT",`${i.temp_ref}: 1..${ar} cites allowed, got ${i.cite.length}`);let M=(f,re)=>{if(!x&&f!==v.source_id)throw new X("SOURCE_MISMATCH",`${re}: cite source ${f} != read_basis source ${v.source_id} (single-source)`)};M(i.cite[0].source_id,i.temp_ref);let P=i.cite.map(f=>(M(f.source_id,i.temp_ref),Ge(f,v.source_id,x&&(h||f.source_id!==v.source_id)))),l=(i.updated?.criteria??[]).some(yr);if(!x&&l)throw new X("CRITERIA_OPS_UNSUPPORTED",`${i.temp_ref}: op-union updated.criteria (keep/set/remove) needs an extract@5+ binding \u2014 this session is bound to ${a.templateVersion??"an unversioned template"}`);return{temp_ref:i.temp_ref,title:i.title,...i.description!==void 0?{description:i.description}:{},...i.summary!==void 0?{summary:i.summary}:{},...i.actors!==void 0?{actors:i.actors}:{},...i.value!==void 0?{value:i.value}:{},risk:i.risk,cite:P[0],...P.length>1?{cites:P}:{},...i.criteria!=null&&i.criteria.length>0?{criteria:i.criteria.map((f,re)=>(M(f.cite.source_id,`${i.temp_ref}.criteria[${re}]`),{text:f.text,cite:Ge(f.cite,v.source_id,x&&f.cite.source_id!==v.source_id)}))}:{},depends_on_hint:i.depends_on_hint,matches_existing:i.matches_existing,...i.conflicts_with!=null?{conflicts_with:i.conflicts_with}:{},...i.changed?{changed:!0}:{},...i.updated!=null?{updated:{...i.updated.title!=null?{title:i.updated.title}:{},...i.updated.description!=null?{description:i.updated.description}:{},...i.updated.summary!=null?{summary:i.updated.summary}:{},...i.updated.actors!=null?{actors:i.updated.actors}:{},...i.updated.value!=null?{value:i.updated.value}:{},...i.updated.risk!=null?{risk:i.updated.risk}:{},...i.updated.criteria!=null?{criteria:l?i.updated.criteria.map(f=>f.op==="set"?{op:"set",text:f.text,cite:Ge(f.cite,v.source_id,x&&f.cite.source_id!==v.source_id)}:f.op==="keep"?{op:"keep",ref:f.ref,text:f.text}:{op:"remove",ref:f.ref,text:f.text,reason:f.reason}):i.updated.criteria.map((f,re)=>(M(f.cite.source_id,`${i.temp_ref}.updated.criteria[${re}]`),{text:f.text,cite:Ge(f.cite,v.source_id,x&&f.cite.source_id!==v.source_id)}))}:{}}}:{},...i.change_note!=null?{change_note:i.change_note}:{}}});return{version:1,read_basis:e,source:{source_id:v.source_id,source_cid:v.source_cid},use_cases:$,...h?{sources:r.read_basis.map(i=>({source_id:i.source_id,source_cid:i.source_cid}))}:{},...r.extraction_of!=null&&r.extraction_of.length>0?{extraction_claims:r.extraction_of.map(i=>({source_id:i.source_id,completeness:i.completeness}))}:{},...r.archived!=null&&r.archived.length>0&&!y?{archived:r.archived.map(i=>({target:i.target,reason:i.reason,basis:i.basis}))}:{}}}function ur(r){let{contextDir:e,graph:a}=r,m=r.maxDigestBytes??4096,x={},_=[];for(let[h,$]of a.heads){if(x[h]=$,typeof $!="string")continue;let i=a.mediaOf($),M=a.getNode($)?.content?.blob;if(typeof M=="string")if(i.format==="image")_.push({source_id:h,cid:$,format:"image",blobRef:{path:Se(e,M),cid:M}});else{let P=$e(e,a,$)?.toString("utf8")??"";_.push({source_id:h,cid:$,format:i.format,text:P})}}_.sort((h,$)=>h.source_id<$.source_id?-1:1);let y=[];for(let h of a.byLabel(me.STYLENOTE).sort(($,i)=>$.cid<i.cid?-1:1))a.superseded.has(h.cid)||y.push(`\u2022 ${String(h.content.statement)} [${String(h.content.learned_from_kind)}]`);let v="";for(let h of y){if(Buffer.byteLength(v+h+`
3
+ `,"utf8")>m)break;v+=h+`
4
+ `}return{read_basis:x,sources:_,styleNoteDigest:v}}function lr(r,e){let a=ur({contextDir:r,graph:e}).styleNoteDigest;return a.length>0?a:void 0}function mt(r,e,a,m,x){let _=null,y=()=>_??=x&&Object.keys(x).length>0?Promise.resolve(x):Ut().catch(()=>({}));return{contextDir:r,rootSid:e,locks:at(r,e),probe:m??Ft(r,{resolveAlias:async v=>qt(v,{env:process.env,auth:await y()}),embed:async(v,h)=>Gt(v,h,{env:process.env,auth:await y()}),readVector:(v,h)=>Lt(r,v,h),writeVector:(v,h,$)=>Vt(r,v,h,$)}),...a?.length?{reservedEventIds:a}:{}}}function ht(r,e){let a=[],m=[];for(let x of r.use_cases){let _=x.matches_existing;_?.cid&&e.hasNode(_.cid)?a.push({ref:_.cid,expectedTip:e.tipOf(_.cid)}):m.push({tempRef:x.temp_ref,title:String(x.title??""),probeText:String(x.title??"")})}return{verb:"extract",ucTargets:a,newBuCandidates:m,sourcePins:[{source_id:r.source.source_id,source_cid:r.source.source_cid}],readBasis:r.read_basis??null}}function $r(r,e){let a=(r.images??[]).filter(m=>m.delivery==="selected");if(a.length!==0)return a.map(m=>({ref:m.ref,...m.page!==void 0?{page:m.page}:{},...m.loc!==void 0?{loc:m.loc}:{},media_type:m.media_type,blob_ref:{path:Se(e,m.blob),cid:m.blob}}))}function kr(r){return r.length>8&&r[0]===137&&r[1]===80&&r[2]===78&&r[3]===71?"image/png":r.length>3&&r[0]===255&&r[1]===216&&r[2]===255?"image/jpeg":r.length>12&&r.toString("ascii",0,4)==="RIFF"&&r.toString("ascii",8,12)==="WEBP"?"image/webp":null}function Le(r){return r.toISOString().replace(/[-:]/g,"").slice(0,15)}function hr(r){return r.startsWith("su-conv-")?`conv-${Ot(Buffer.from(r,"utf8")).slice(0,8)}`:r}function pr(r){return r.source_id.startsWith("su-conv-")?"the conversation":r.source_id}function Rr(r,e,a){return`reading ${pr(r)}${a>1?` (source ${e} of ${a})`:""}`}function Re(r){return r.toLowerCase().trim().replace(/\s+/g," ")}function gr(r,e){let a=new Map,m=new Map,x=new Map;for(let{cid:y,content:v}of e.byLabel(me.USECASE)){if(e.superseded.has(y))continue;(e.trust.get(y)==="archived"?x:m).set(Re(String(v.title??"")),y)}let _=y=>e.trust.get(y)==="archived"?{cid:y,archived:!0,reason:e.archivedReason.get(y)}:{cid:y};for(let y of r.use_cases){if(y.matches_existing){let $=y.matches_existing.cid;if(e.superseded.has($)){let i=e.tipOf($);$=e.superseded.has(i)?null:i}if($!==null){a.set(y.temp_ref,_($));continue}}let v=m.get(Re(y.title));if(v){a.set(y.temp_ref,{cid:v});continue}let h=x.get(Re(y.title));h&&a.set(y.temp_ref,_(h))}return a}var fr=/^(\S+)\.criteria\[(\d+)\]/;function Cr(r,e,a){if(e.length===0||!e.every(x=>fr.test(x.detail)))return!1;let m=new Map;for(let x of e){let _=fr.exec(x.detail),y=m.get(_[1])??new Set;y.add(Number(_[2])),m.set(_[1],y)}for(let x of r.use_cases){let _=m.get(x.temp_ref);_?.size&&(x.criteria=(x.criteria??[]).filter((y,v)=>!_.has(v)),a(`${x.temp_ref}: dropped ${_.size} criteria with unverifiable cites \u2014 committed without them (criteria are hints, not oracles)`))}return!0}async function gt(r,e,a,m,x=()=>{},_,y){let v=(h,$)=>x(h,$,r.session_id);return Zt(r,e,a,m,x,{async onProposalEvent(h){let $=h,i=null,M=null;if(cr($))try{i=dr($,r.read_basis,{templateVersion:y?.()??null,warn:P=>{e.out(`warning: ${P}`),v("adapter",{warn:P})}}),v("adapter",{ok:!0,use_cases:i.use_cases.length})}catch(P){M=P instanceof X?P.message:String(P),v("adapter",{ok:!1,error:M})}else i=$;return i&&i.use_cases.length===0&&(e.out("warning: the agent proposed ZERO use-cases for this source"),e.emit?.({type:"warning",code:"ZERO_USE_CASES",message:"the agent proposed ZERO use-cases for this source"})),i&&_&&await _(i),{proposal:i,error:M}}})}var Dr=new Set(["agent","ci","override"]);async function Ss(r,e){let a=`ext-${Le(e.now?.()??new Date)}-lk${Math.random().toString(36).slice(2,8)}`,x=at(e.contextDir,a,e.now?{now:e.now}:void 0).tryAcquire([{kind:"extract"}],{hold:"session",verb:"extract"});if("contended"in x){let _=x.contended.holder,y=`another extraction is running on this context${_?` (pid ${_.pid})`:""} \u2014 retry when it finishes`;return e.out(y),e.emit?.({type:"error",message:y,code:"EXTRACT_LOCKED"}),2}try{return await Er(r,e)}finally{x.release()}}async function Er(r,e){let a=r.mode??"interactive";if(r.posture==="reconcile"){if(r.trust==="hold"){let o="error: --trust hold has no meaning here \u2014 a reconcile IS the review; drop the flag";return e.out(`${o} [TRUST_USAGE]`),e.emit?.({type:"error",message:o,code:"TRUST_USAGE"}),2}if(!r.source||!r.changeContext){let o="reconcile posture needs a pinned source and its change context \u2014 internal wiring fault";return e.out(`error: ${o}`),e.emit?.({type:"error",message:o,code:"POSTURE_USAGE"}),2}if(a==="ci"){let o="reconcile posture is not available under --mode ci \u2014 a held changeset needs a durable session; use --mode agent";return e.out(`error: ${o}`),e.emit?.({type:"error",message:o,code:"POSTURE_USAGE"}),2}}if(r.trust==="hold"&&a==="interactive")return e.out("error: --trust hold only applies to headless runs \u2014 in interactive chat you review items in-session anyway; use --mode agent to hold everything for review"),e.emit?.({type:"error",message:"error: --trust hold only applies to headless runs \u2014 use --mode agent",code:"TRUST_USAGE"}),2;if(a==="interactive"){if(!e.isTTY)return e.out("extract: --mode interactive needs a TTY (use --mode agent|ci|override headless)"),2}else if(!Dr.has(a))return e.out(`extract: unknown mode "${a}" \u2014 interactive | agent | ci | override`),2;if(r.trust!==void 0){if(a==="ci")return e.out("error: --trust is not available under --mode ci (ci is fail-closed \u2014 no trust dials)"),e.emit?.({type:"error",message:"error: --trust is not available under --mode ci",code:"TRUST_UNDER_CI"}),2;if(r.trust!=="auto"&&r.trust!=="hold")return e.out(`error: --trust must be auto | hold, got '${r.trust}'`),e.emit?.({type:"error",message:`error: --trust must be auto | hold, got '${r.trust}'`,code:"TRUST_USAGE"}),2}let m=e.telemetry?.enabled?e.telemetry:void 0,x=Le(e.now?.()??new Date),_=m?At(m.ids.context_instance_id??null,"extract",m.ids.session_id):ce(e.contextDir,"logs",`extract-${x}.log`);ut(mr(_),{recursive:!0});let y=`run-${x}-${Math.random().toString(36).slice(2,8)}`,v=o=>o==="error"||o==="failed_proposal"?"error":o==="repair_respawn"?"warn":"info",h=(o,u,s)=>{try{wr(_,JSON.stringify({ts:new Date().toISOString(),level:v(o),run_id:y,...m?{user_session_id:m.ids.session_id}:{},...s?{session_id:s}:{},kind:o,data:u})+`
5
+ `)}catch{}m?.wireTrace(o,u,s)};{let o=e.out;e.out=u=>{h("transcript",{line:u}),o(u)}}e.chat||e.out(`trace: ${te(_)}`),e.emit?.({type:"run_start",mode:a,trace:_,...m?{session:m.ids.session_id}:{}});let $=Nt();if($&&e.out($),e.preflightTurn){let o=await e.preflightTurn();if(h("preflight",o),!o.ok)return e.out(o.message??"error: turn-endpoint preflight failed"),e.emit?.({type:"error",message:o.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),2}let i=ee(e.contextDir),M=lr(e.contextDir,i),P=r.sources?.length?r.sources:r.source?[r.source]:[];if(P.length>0){if(r.resume){let o="error: --source cannot be combined with --resume (the resumed session already has its scope)";return e.out(o),e.emit?.({type:"error",message:o,code:"SOURCE_WITH_RESUME"}),2}for(let o of P){let u=i.heads.get(o);if(typeof u!="string"){let s=u===null?`error: --source ${o} was ingested but is retired \u2014 re-ingest it to extract again`:`error: --source ${o} is not an ingested source (kane-cli context list shows them)`;return e.out(s),e.emit?.({type:"error",message:s,code:"SOURCE_UNKNOWN"}),2}}}let l=null,f=null;if(r.resume){try{{let c=await or(e.contextDir,r.resume,i,{verb:"extract",deps:{onWarn:C=>e.out(`note: ${C}`)}});{let C=Object.keys(c.handle.state.read_basis??{});if(C.length>1){let B=`error: session ${r.resume} spans ${C.length} sources \u2014 multi-source resume isn't supported yet; committed work is preserved (re-run kane-cli context extract for anything remaining)`;return e.out(B),e.emit?.({type:"error",message:B,code:"MULTI_SOURCE_RESUME"}),c.handle.release(),2}f=c,h("resume_kind",{kind:c.view.pointer===null?"bare-base":c.view.pointer.at==="final"?"pause":"crash"}),l={handle:c.handle,represent:c.represent,questions:c.questions,staleBasis:c.drift.map(B=>B.subject)}}}}catch(c){let C=c instanceof Error?c.message:String(c);return e.out(`error: ${C}`),e.emit?.({type:"error",message:`error: ${C}`,...c instanceof dt?{code:c.code}:{}}),c instanceof dt?2:1}let o=f?null:Xt(l.handle.state.verb,"extract",r.resume);if(o)return e.out(o.message),e.emit?.({type:"error",message:o.message,code:o.code}),l.handle.release(),2;let u=l.handle.state.change_basis;if(u&&(i.heads.get(u.source_id)??null)!==u.new_head){let c=`error: ${u.source_id} moved while this reconcile extraction was paused \u2014 its recorded change context no longer matches; re-run kane-cli maintain reconcile against the current file (session ${r.resume} is defunct and can be ignored)`;return e.out(c),e.emit?.({type:"error",message:c,code:"CHANGE_BASIS_MOVED"}),l.handle.release(),2}if(f&&f.view.pointer!==null&&f.drift.length>0){if(!await e.confirmStale(`changed since the pause: ${f.drift.map(C=>C.subject).join(", ")} \u2014 re-ground and continue against the current versions?`)){let C=`resume aborted: the context moved since the pause (${f.drift.map(B=>B.subject).join(", ")}) \u2014 session ${r.resume} is preserved`;return e.out(C),e.emit?.({type:"error",message:C,code:"RESUME_DRIFT"}),l.handle.release(),2}}else l.staleBasis.length>0&&e.out(`note: changed since the pause: ${l.staleBasis.join(", ")} \u2014 re-presented items may be stale`);let s=[...new Set([...l.handle.state.held_receipts??[],...f?.view.kane?.held_receipts??[]])];if(s.length>0)if(e.chat?.holdReceipt)for(let c of s)e.chat.holdReceipt(c);else e={...e,initialMessage:[s.join(`
6
+
7
+ `),e.initialMessage].filter(Boolean).join(`
8
+
9
+ `)};l.handle.state.assumed.length>0&&e.out(`note: ${l.handle.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${r.resume} lists them`)}let re=i.extractedSourceCids,he=!!(r.force||l?.handle.state.force),se=[],oe=[],Ce=P.length>0?new Set(P):null;for(let[o,u]of i.heads.entries())if(u!=null&&!(Ce&&!Ce.has(o))){if(!Ce&&!l&&o.startsWith("su-conv-")){e.out(`skipped ${o} \u2014 conversation source; extract it explicitly with --source ${o}`),oe.push({source_id:o,reason:"conversation"});continue}if(l){let s=o in l.handle.state.read_basis,c=l.handle.state.corpus_cursor.remaining.includes(o);if(!s&&!c)continue;if(c&&!he&&re.has(u)){e.out(`${o} already extracted \u2014 skipped (--force re-runs it)`),oe.push({source_id:o,reason:"cached"});continue}}else if(!he&&re.has(u)){e.out(`${o} already extracted \u2014 skipped (--force re-runs it)`),oe.push({source_id:o,reason:"cached"});continue}se.push({source_id:o,cid:u})}let _r=o=>{let u=tr(e.contextDir,o);u&&e.out(`note: a reconcile plan for ${o} is pending (${u.pending} item(s)) \u2014 resume with \`kane-cli maintain reconcile --apply ${u.path}\``)};for(let o of oe)o.reason==="cached"&&_r(o.source_id);if(e.emit?.({type:"corpus",sources:se,skipped:oe}),se.length===0){if(l){let s=`error: resumed session's paused source (${Object.keys(l.handle.state.read_basis).join(", ")||"unknown"}) is no longer in the corpus \u2014 restore/re-ingest it and re-run --resume ${r.resume}, or discard with: kane-cli context sessions clean ${r.resume}`;return e.out(s),e.emit?.({type:"error",message:s,code:"SOURCE_MISSING"}),l.handle.release(),2}let o=oe.length>0&&oe.every(u=>u.reason==="conversation");return e.out(Ce?`extract: nothing to do \u2014 ${P.join(", ")} ${P.length===1?"is":"are all"} already extracted at the current snapshot (--force to re-run)`:o?"extract: nothing to do \u2014 only conversation sources here (extract one explicitly with --source <id>)":"extract: nothing to do \u2014 every ingested source is already extracted"),0}let ie=!r.plan&&a!=="ci",De=e.now?.()??new Date,Ee=r.resume??`ext-${Le(De)}-${hr(se[0].source_id)}`,T=null,Pe=!1;ie&&!l&&(T=nt(e.contextDir,{sid:Ee,mode:"agent",created_at:De.toISOString(),expires_at:new Date(De.getTime()+1440*60*1e3).toISOString(),agent_state:{schema:2,items:[],provider_state:""},pending:{questions:[],proposals:[]},assumed:[],read_basis:{[se[0].source_id]:se[0].cid},corpus_cursor:{remaining:se.slice(1).map(o=>o.source_id)},conv_source:"",verb:"extract",...he?{force:!0}:{},...r.changeContext?{change_basis:{source_id:r.changeContext.source_id,new_head:r.changeContext.new_head}}:{},...m?{user_session_id:m.ids.session_id}:{}}));let Ve=f?f.represent.map(o=>o.event_id).filter(o=>typeof o=="string"):[],S=l?.handle??T,ft=!1,pt=()=>{try{br(ce(e.contextDir,"sessions"))}catch{}},_t=()=>{if(T){try{T.complete()}catch{T.release()}T=null,S=null,pt()}},Te=new Map;if(l&&l.questions.length>0&&!r.message&&!r.withSource){e.out(`re-presenting ${l.questions.length} unanswered question(s) from the paused session`);let o=await e.ask(l.questions.map(rr));if(Array.isArray(o))for(let u of o)Te.set(u.id,u)}let ge=e.by??{kind:"human",id:"owner"},I=a==="interactive"&&!r.plan&&!!e.chat,Y=0,xt=0,Ae=!1,de=0,We=()=>{Ae||(Ae=!0,e.out("note: duplicate detection is running in a reduced mode this run \u2014 new items will be held for your review instead of committed"),m?.event("ASR_EMBED_DEGRADED",{}),e.emit?.({type:"degraded",reason:"embed_fallback"}))},Oe=null,fe=()=>S??T,ze=(o,u,s)=>{let c=fe();if(!c)return;let C=u.map(w=>({label:"usecase",content:{title:w.title,...w.summary!==void 0?{summary:w.summary}:{},...w.risk!==void 0?{risk:w.risk}:{},derived:!0,_held:{source_id:o.source_id,source_cid:o.cid,anchor:w.cite?.anchor??"L1-L1",quote:w.cite?.quote??""}},rationale:`held (${s==="degraded"?"embed degraded \u2014 lexical dedup only":"--trust hold"}): ${o.source_id} @ ${o.cid.slice(0,19)} ${w.cite?.anchor??""}`,edges:[],tempRef:w.temp_ref})),B=c.state.pending;c.save({pending:{questions:B.questions,proposals:[...B.proposals,...C]}}),de+=C.length,Oe=c.state.sid,e.emit?.({type:"held",source_id:o.source_id,count:C.length,reason:s==="degraded"?"embed_degraded":"trust_hold"})},q=[],vt=!1,U=[...se];try{let o=u=>{let s=S;if(!s)return;let c=s.state.ingest_schedule??[];if(!c.some(w=>w.status==="pending"))return;let C=ee(e.contextDir),B=c.map(w=>w.status!=="pending"?w:(C.heads.get(w.source_id)??null)!==w.cid?(e.out(`note: ${w.source_id} changed after it was added \u2014 skipping its extraction this run; re-run kane-cli context extract to pick up the newer version`),{...w,status:"skipped",note:"head moved since landing"}):C.extractedSourceCids.has(w.cid)||U.some(W=>W.source_id===w.source_id&&W.cid===w.cid)?{...w,status:"done"}:U.some(W=>W.source_id===w.source_id)?(e.out(`note: an older version of ${w.source_id} is already queued this run \u2014 the newly landed version is not extracted; re-run kane-cli context extract to pick it up`),{...w,status:"skipped",note:"an older version of the source was already queued this run"}):(U.push({source_id:w.source_id,cid:w.cid}),e.out(`queued ${w.source_id} for extraction in this run (landed mid-run)`),{...w,status:"done"}));s.save({ingest_schedule:B,corpus_cursor:{remaining:U.slice(u+1).map(w=>w.source_id)}})};for(let u=0;u<U.length;o(u),u++){let s=U[u],c=ee(e.contextDir),C={current:c};e.chat?.attachOnCommitted?.(t=>{C.current=t});let B=c.getNode(s.cid),w=String(B?.content.blob??""),Ie=$e(e.contextDir,c,s.cid);if(!Ie){e.out(`error: ${s.source_id}: its stored content is missing \u2014 re-ingest the file (kane-cli context ingest <file>) [BLOB_MISSING]`),e.emit?.({type:"error",source_id:s.source_id,message:`error: ${s.source_id}: blob ${w} missing from .context/blobs`,code:"BLOB_MISSING"}),q.push(s.source_id);continue}let W=c.mediaOf(s.cid),Ke=W.media_type.startsWith("image/");if(!Ke){let t=kr(Ie);if(t){e.out(`skipping ${s.source_id}: binary ${t} ingested before image support \u2014 re-ingest it (kane-cli context ingest) to extract from it`),e.emit?.({type:"source_skipped",source_id:s.source_id,reason:"binary_pre_media"});continue}}let yt=Ke?`0001| (image source ${s.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:ct(Ie),Me=(t,n)=>{let d=new Map;d.set(s.source_id,{media:W,numberedText:yt});for(let g of n.sources??[]){if(d.has(g.source_id))continue;let D=$e(e.contextDir,t,g.source_cid);if(!D)continue;let k=t.mediaOf(g.source_cid),E=k.media_type.startsWith("image/")?`0001| (image source ${g.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:ct(D);d.set(g.source_id,{media:k,numberedText:E})}return d},wt=Le(e.now?.()??new Date),ne=`${wt}-${s.source_id}`,pe=!!(l&&s.source_id in l.handle.state.read_basis),Ue=S?Ee:`ext-${wt}-${hr(s.source_id)}`,Je=U.slice(u+1).map(t=>t.source_id);S&&ie&&!pe&&S.save({read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:Je}});let ae="";if(I){let t=Wt({contextDir:e.contextDir,graph:ee(e.contextDir),sessionStamp:Ue,by:ge});t.errors===null||t.errors[0]?.code==="CONV_SOURCE_EXISTS"?(ae=t.sourceId,e.chat.attachConversationSource?.(ae),C.current=ee(e.contextDir)):e.out(`warning: notes you add in chat can't be saved to the context this session (${t.errors[0]?.detail})`)}let bt={type:"run_config",version:1,session_id:Ue,mode:a,source:{source_id:s.source_id,source_cid:s.cid,kind:Mt.has(W.format)?W.format:Sr(s.source_id)||"md",numbered_text:yt,...(()=>{let t=$r(W,e.contextDir);return t?{images:t}:{}})()},existing_use_cases:c.byLabel(me.USECASE).filter(({cid:t})=>c.trust.get(t)!=="archived"&&!c.superseded.has(t)).map(({cid:t,content:n})=>({id:t,title:String(n.title??""),summary:String(n.summary??"")})),read_basis:C.current.latestHash,max_free_text_rounds:Yt,graph_reads:!0,verb:"extract",...M!==void 0?{style_note_digest:M}:{},...r.changeContext&&r.changeContext.source_id===s.source_id?{change_context:r.changeContext}:{},topology:er(),...I?{chat:!0}:{},...Ke?{image_sources:[{source_id:s.source_id,source_cid:s.cid,media_type:W.media_type,blob_ref:{path:Se(e.contextDir,w),cid:w}}]}:{},...l&&!f&&s.source_id in l.handle.state.read_basis?{resume:{agent_state:l.handle.state.agent_state}}:{},...ie&&S?{checkpoints:!0}:{}},R=f&&pe?{...f.spawnConfig,mode:a}:bt;if(ie&&S&&!ft){ft=!0;let{resume:t,...n}=bt;jt(e.contextDir,Ee,{schema:Ht,kind:"base",sid:Ee,verb:"extract",mode:a,created_at:De.toISOString(),run_config:n,conv_source:ae||S.state.conv_source||"",store_watermark:It(e.contextDir)})}let St=f&&pe?0:S?.state.checkpoint?.seq??0,_e={current:null};if(R.resume&&"schema"in R.resume){let t=R.resume.binding?.template_version;typeof t=="string"&&(_e.current=t)}let Xe=ie&&S?ir({contextDir:e.contextDir,handle:S,seqBase:()=>St,peekHeldReceipts:()=>e.chat?.peekHeldReceipts?.()??[],readBasis:()=>({[s.source_id]:s.cid}),corpusCursor:()=>({remaining:Je}),onSoftCap:t=>e.out(t),onStat:t=>h("ckpt_stat",t,R.session_id),...e.now?{now:e.now}:{}}):void 0,ue=Xe?{...Xe,persist:t=>{let n=t.binding?.template_version;return typeof n=="string"&&n&&(_e.current=n),Xe.persist(t)}}:void 0;I||e.out(l&&s.source_id in l.handle.state.read_basis?`resuming: ${s.source_id} (session ${r.resume})`:`reading ${s.source_id} (source ${u+1} of ${U.length})`),e.emit?.({type:"source_start",source_id:s.source_id,cid:s.cid,index:u+1,total:U.length,resumed:!!(l&&s.source_id in l.handle.state.read_basis)}),e.chat?.ledger?.({kind:"banner",text:Rr(s,u+1,U.length)}),e.chat?.setWorking?.(`Reading ${pr(s)}\u2026`);let Ye=new Map;h("spawn",{source_id:s.source_id,source_cid:s.cid,resume:!!l,chat:I},R.session_id);let $t=!1,kt=!1,Ze=!1,Rt=async t=>{let n=ee(e.contextDir),d=be(t,Me(n,t),n);if(h("kane_validate",{errors:d.map(p=>p.code)},R.session_id),d.length>0){if(e.nested){e.chat?.ledger?.({kind:"commit",ok:!1,line:"proposal failed validation \u2014 nothing landed",warnings:d.map(p=>`${p.code}: ${p.detail}`)}),kt=!0;return}e.chat.submit("[auto-repair] the proposal failed validation: "+d.map(p=>`${p.code}: ${p.detail}`).join("; ")+" \u2014 please re-finalize with these fixed.");return}let g=ee(e.contextDir),D=gr(t,g),k=ce(e.contextDir,"proposals",ne);ut(k,{recursive:!0}),lt(ce(k,"proposal.json"),JSON.stringify(t,null,2)+`
10
+ `);let E=new Map(t.use_cases.map(p=>[p.temp_ref,{resolution:"skipped"}])),Q=mt(e.contextDir,R.session_id,Ve,e.probe,e.auth),O=await ke(Q,ht(t,g),p=>{if(p.degradedProbe&&fe()!==null&&t.use_cases.some(ye=>ye.matches_existing==null))return{result:{degradedHold:!0},record:null};let K=Be({contextDir:e.contextDir,graph:p.graph,proposal:t,proposalId:ne,verdicts:E,by:{kind:"ai",id:"extract-agent"},autoName:!0,allowStaleBasis:!0,eventIds:p.eventIds("extract",1),...ie?{sid:p.sid}:{},probeHits:p.probeHits});return K.errors!==null?{errors:K.errors}:{result:K,record:K.record}}),N=O.ok&&"result"in O?O.result:null;if(N!==null&&"degradedHold"in N){We(),ze(s,t.use_cases,"degraded"),Ze=!0,e.chat.ledger?.({kind:"commit",ok:!1,line:`held ${t.use_cases.length} item(s) for review \u2014 semantic dedup ran degraded (embeddings unavailable); nothing saved this turn`});return}let V=N??{record:null,errors:O.ok?null:O.kind==="validation"?O.errors:[{code:O.kind==="contended"?O.err.code:"UNSETTLED",detail:O.kind==="contended"?`held by ${O.err.holder?.owner_sid??"another session"}`:"concurrent activity kept moving the store"}]};if(V.errors){e.chat.ledger?.({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:V.errors.map(p=>`${p.code}: ${p.detail}`)});return}$t=!0,V.record?.event_ids?.length&&S?.markApplied(V.record.event_ids);{let p=V.record.review.filter(K=>K.kind==="pending_update");p.length>0&&(I||e.out(`${p.length} update(s) held for review`),e.emit?.({type:"update_held",count:p.length,targets:p.map(K=>K.id)}),e.chat?.ledger?.({kind:"commit",ok:!0,line:`${p.length} update(s) held for review`}))}let z=V.record.nodes.length;Y+=z;let H=t.use_cases.length-z;{let p=ee(e.contextDir),K=new Map;for(let{cid:j,content:J}of p.byLabel(me.USECASE))p.superseded.has(j)||K.set(Re(String(J.title??"")),j);let ye=[];for(let j of t.use_cases){let J=null;if(j.matches_existing?.cid&&p.hasNode(j.matches_existing.cid)){let we=p.tipOf(j.matches_existing.cid);J=p.superseded.has(we)?null:we}J=J??K.get(Re(j.title))??null,J&&ye.push({ref:j.temp_ref,cid:J,...p.displayNameOf(J)?{id:p.displayNameOf(J)}:{}})}ye.length>0&&e.chat.registerAliases?.(ye),C.current=p;let Pt=j=>{for(let[J,we]of p.names)if(we===j&&!p.superseded.has(we))return J},Tt=zt({verb:"extract",commitN:1,phase:"proposal",committed:V.record.nodes.map(j=>({cid:j.cid,...Pt(j.cid)?{logical_id:Pt(j.cid)}:{}})),reused:H},p);e.emit?.(Tt.event),e.chat.holdReceipt?.(Tt.text)}h("commit",{derived:z,evidence_matched:H,chat:!0},R.session_id),e.chat.ledger?.({kind:"commit",ok:!0,line:z===0&&H>0?`all ${H} matched existing \u2014 nothing new to save`:`saved ${z} use-case${z===1?"":"s"} as drafts`+(H>0?` \xB7 ${H} matched existing`:"")})},Qe=!!(l&&s.source_id in l.handle.state.read_basis),G=Qe&&Te.size>0?{...e,ask:async t=>t.every(n=>Te.has(n.id))?(l.handle.markApplied(t.map(n=>`resolveq:${r.resume}:${n.id}`)),e.out(`answered ${t.length} re-asked question(s) from the held resume answers`),t.map(n=>Te.get(n.id))):e.ask(t)}:e;Qe&&r.message&&(G={...G,initialMessage:r.message}),G={...G,onEmbedDegraded:We};let le,et;if(S){let t=S,n=G.ask,d=Qt({contextDir:e.contextDir,cwd:mr(e.contextDir),handle:t,note:g=>e.chat?e.chat.note(g):e.out(g),schedule:r.trust!=="hold",...r.trust==="hold"?{scheduleRefused:"this run holds items for review, so its extraction is not scheduled \u2014 kane-cli context extract runs it after the review"}:{},graphSlot:C,...e.now?{now:e.now}:{}});if(G={...G,ask:async g=>{let D=await n(g);if(Array.isArray(D)){let k=D.filter(E=>{if(E.free_text==null||E.free_text.trim()==="")return!1;let Q=g.find(O=>O.id===E.id);return E.selected_index!=null&&Q?.options[E.selected_index]?.input===!0}).map(E=>E.free_text.trim());if(k.length>0){let E=t.state.ingest_registry;for(let Q of k)E=qe(E,Q,e.now?.()??new Date);t.save({ingest_registry:E})}}return D},ingest:d},Qe&&r.withSource){let g=(t.state.pending?.proposals??[]).filter(E=>E.content?._held!=null).length;if(r.trust==="hold"||g>0){let E=g>0?`error: --with-source can't add a source to a session holding ${g} item(s) for review \u2014 resume without --with-source to finish the review first, then land it with kane-cli context ingest [HOLD_MULTI_SOURCE]`:"error: --with-source is not available with --trust hold \u2014 held work from a multi-source run can't be resumed yet; drop --trust hold, or land the source separately with kane-cli context ingest [HOLD_MULTI_SOURCE]";return e.out(E),e.emit?.({type:"error",code:"HOLD_MULTI_SOURCE",message:E}),2}let D=r.withSource;t.save({ingest_registry:qe(t.state.ingest_registry,D,e.now?.()??new Date)});let k=await d({id:`withsource-${t.state.sid}`,ref:D,purpose:null});if(!k.ok)return e.out(`error: --with-source: ${k.error.message}`),e.emit?.({type:"error",code:k.error.code,message:`--with-source: ${k.error.message}`}),2;G={...G,pendingDeferral:{ingested:{source_id:k.result.source_id,cid:k.result.cid}}}}et=()=>{if(!e.chat?.attachIngest)return;let g=e.chat;le=g.attachIngest(async D=>{try{t.save({ingest_registry:qe(t.state.ingest_registry,D,e.now?.()??new Date)});let k=await d({id:`attach-${t.state.sid}-${(t.state.ingest_registry??[]).length}`,ref:D,purpose:null});return k.ok?(g.deferBatch({source_id:k.result.source_id,cid:k.result.cid}),{ok:!0}):{ok:!1,error:k.error.message}}catch(k){return{ok:!1,error:k instanceof Error?k.message:String(k)}}})},et()}let b;try{b=await gt(R,{...G,graphSlot:C,...ue?{checkpoint:ue}:{}},Ye,c,h,I?Rt:void 0,()=>_e.current)}catch(t){if(t instanceof Fe)return le?.(),e.chat?.setWorking?.(null),e.out(`error: ${t.message}`),e.emit?.({type:"error",code:"PAIR_MISMATCH",message:t.message}),2;throw t}if(le?.(),e.chat?.setWorking?.(null),b.errorCode==="binding_mismatch"&&f&&pe){let t=await e.ask([{id:"binding-mismatch",text:"this session's saved conversation is no longer accepted by the service \u2014 start the conversation fresh (committed work is kept), or stop and keep the session?",risk:"high",rationale:"the service refused the saved conversation on the first turn after resume",options:[{label:"start fresh",detail:"continue with a fresh conversation \u2014 earlier answers may be re-asked"},{label:"stop",detail:"stop here; the session stays resumable"}],recommended_index:1,allow_free_text:!1}]);if((Array.isArray(t)?t.find(g=>g.id==="binding-mismatch"):void 0)?.selected_index!==0){let g=`resume abandoned: binding mismatch on session ${Ue} \u2014 the session is preserved`;return e.out(g),e.emit?.({type:"error",message:g,code:"BINDING_MISMATCH"}),2}h("binding_migrate",{sid:Ue},R.session_id),et?.();let d=R.resume&&"schema"in R.resume?{...R.resume,binding:{}}:void 0;try{b=await gt({...R,...d?{resume:d}:{}},{...G,graphSlot:C,...ue?{checkpoint:ue}:{}},Ye,c,h,I?Rt:void 0,()=>_e.current)}catch(g){if(g instanceof Fe)return le?.(),e.chat?.setWorking?.(null),e.out(`error: ${g.message}`),e.emit?.({type:"error",code:"PAIR_MISMATCH",message:g.message}),2;throw le?.(),g}le?.(),e.chat?.setWorking?.(null)}if(b.error){let t=b.error.startsWith("proposal failed validation after repair:");t&&h("agent_error_detail",{error:b.error},R.session_id);let n=t?`error: the agent could not produce a valid proposal for ${s.source_id} \u2014 re-run kane-cli context extract to retry`:`error: agent failed for ${s.source_id}: ${b.error}`;e.out(n),e.emit?.({type:"error",source_id:s.source_id,message:n}),q.push(s.source_id);continue}if(b.highRisk)return e.out(`error: ${b.highRisk.length} high-risk decision${b.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),e.emit?.({type:"error",source_id:s.source_id,message:`error: high-risk question(s) in ci mode (fail-closed): ${b.highRisk.map(t=>t.id).join(", ")}`,code:"HIGH_RISK_CI"}),1;if(b.paused){let t=U.slice(u+1).map(D=>D.source_id),n=l?.handle??T,d=n??nt(e.contextDir,{sid:R.session_id,mode:"agent",created_at:(e.now?.()??new Date).toISOString(),expires_at:new Date((e.now?.()??new Date).getTime()+1440*60*1e3).toISOString(),agent_state:b.paused.agent_state,pending:{questions:[],proposals:[]},assumed:[],read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:t},conv_source:ae,verb:"extract",...he?{force:!0}:{},...r.changeContext?{change_basis:{source_id:r.changeContext.source_id,new_head:r.changeContext.new_head}}:{},...m?{user_session_id:m.ids.session_id}:{}});Pe=!0;try{ae&&d.state.conv_source!==ae&&d.save({conv_source:ae});let D=e.chat?.drainHeldReceipts?.()??[];(D.length>0||(d.state.held_receipts?.length??0)>0)&&d.save({held_receipts:D}),n&&d.save({read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:t},...he&&!d.state.force?{force:!0}:{},...m&&d.state.user_session_id!==m.ids.session_id?{user_session_id:m.ids.session_id}:{}}),sr(d,b.paused)}catch(D){let k=d.state.checkpoint,E=`error: couldn't persist the pause for session ${d.state.sid}`+(k?` \u2014 last durable checkpoint: seq ${k.seq} @ ${k.ts}`:" \u2014 no durable checkpoint exists")+` (${D instanceof Error?D.message:String(D)})`;return e.out(E),e.emit?.({type:"error",message:E,code:"PAUSE_PERSIST_FAILED",sid:d.state.sid}),1}h("session_paused",{sid:d.state.sid},R.session_id);let g=`kane-cli context extract --resume ${d.state.sid} --mode ${a}`;if(I||e.out(`paused: session ${d.state.sid} saved \u2014 resume with: ${g}`),e.emit?.({type:"session_paused",sid:d.state.sid,source_id:s.source_id,mode:a,resume:g,expires_at:d.state.expires_at,pending_questions:b.paused.pending.questions}),I){let D=e.chat?.state.credits?.total;e.onSummary?.({state:"paused",reason:"ctrl+c",facts:[`session ${d.state.sid} saved`+(Y>0?` \u2014 ${Y} use-case${Y===1?"":"s"} committed so far`:""),...d.state.expires_at?[`expires: ${d.state.expires_at}`]:[],...D!==void 0?[`credits used: ${D.toFixed(1)}`]:[]],resume:g,resumeMessage:`${g} --message "<your words>"`,tracePath:te(_)})}return 3}if(b.crashed){let t=S?.state.checkpoint;if(S&&t){let n=`kane-cli context extract --resume ${S.state.sid} --mode ${a}`;try{S.save({read_basis:{[s.source_id]:s.cid},corpus_cursor:{remaining:Je}})}catch{}if(h("agent_crashed_resumable",{sid:S.state.sid,seq:t.seq},R.session_id),I||e.out(`agent crashed \u2014 session ${S.state.sid} is resumable at checkpoint seq ${t.seq} (at most the in-flight turn lost); resume with: ${n}`),e.emit?.({type:"session_paused",sid:S.state.sid,source_id:s.source_id,mode:a,resume:n,expires_at:S.state.expires_at,crashed:!0}),I){let d=e.chat?.state.credits?.total;e.onSummary?.({state:"crashed",facts:[`agent crashed \u2014 session ${S.state.sid} is resumable at checkpoint seq ${t.seq}`,"at most the in-flight turn was lost",...d!==void 0?[`credits used: ${d.toFixed(1)}`]:[]],resume:n,resumeMessage:`${n} --message "<your words>"`,tracePath:te(_)})}return Pe=!0,S.release(),3}e.out(`error: agent crashed for ${s.source_id} with no durable checkpoint`),e.emit?.({type:"error",source_id:s.source_id,message:`error: agent crashed for ${s.source_id} with no durable checkpoint`,code:"AGENT_CRASHED"}),q.push(s.source_id);continue}if(I){if(xt+=b.assumedDefaults??0,b.error||kt)return 1;if(!$t&&!Ze){let t=U.length-u-1,n=`done \u2014 nothing committed for ${s.source_id} (no finalize before the session ended)`+(t>0?`; stopping here \u2014 ${t} remaining source(s) not extracted (re-run kane-cli context extract to continue)`:"");I||e.out(n),e.onSummary?.({state:"complete",facts:[n,...Y>0?[`${Y} use-case${Y===1?"":"s"} saved earlier in this run`]:[]],tracePath:te(_)});{let d=(S?.state.ingest_schedule??[]).filter(g=>g.status==="pending");d.length>0&&e.out(`note: ${d.length} source(s) landed this session (${d.map(g=>g.source_id).join(", ")}) were not extracted \u2014 the session ended first; kane-cli context extract runs them`)}return l&&s.source_id in l.handle.state.read_basis&&(l.handle.complete(),l=null,S=null),_t(),0}l&&s.source_id in l.handle.state.read_basis&&!Ze&&(o(u),l.handle.complete(),l=null,S=null);continue}if(!b.proposal){e.out(`error: agent ended without a proposal for ${s.source_id}`),e.emit?.({type:"error",source_id:s.source_id,message:`error: agent ended without a proposal for ${s.source_id}`}),q.push(s.source_id);continue}let L=be(b.proposal,Me(c,b.proposal),c);if(h("kane_validate",{errors:L.map(t=>t.code)},R.session_id),L.length>0&&Cr(b.proposal,L,t=>e.out(t))&&(h("criteria_dropped",{source_id:s.source_id},R.session_id),L=be(b.proposal,Me(c,b.proposal),c)),L.length>0){e.out("the agent's proposal didn't validate \u2014 retrying once"),e.emit?.({type:"validate_failed",source_id:s.source_id,codes:L.map(t=>t.code),repairing:!0}),h("repair_respawn",{source_id:s.source_id},R.session_id),f&&pe||(St=S?.state.checkpoint?.seq??0);try{b=await gt(R,{...G,graphSlot:C,...ue?{checkpoint:ue}:{}},Ye,c,h,void 0,()=>_e.current)}catch(t){if(t instanceof Fe)return e.out(`error: ${t.message}`),e.emit?.({type:"error",code:"PAIR_MISMATCH",message:t.message}),2;throw t}if(b.error||!b.proposal){e.out(`error: repair run failed for ${s.source_id}`),e.emit?.({type:"error",source_id:s.source_id,message:`error: repair run failed for ${s.source_id}`}),q.push(s.source_id);continue}if(L=be(b.proposal,Me(c,b.proposal),c),L.length>0){h("validation_details",{errors:L.map(t=>({code:t.code,detail:t.detail}))},R.session_id),e.out(`\u2717 validation failed \u2014 ${L.map(t=>t.code).join(", ")} (details: ${te(_)})`),e.emit?.({type:"validate_failed",source_id:s.source_id,codes:L.map(t=>t.code),repairing:!1}),e.emit?.({type:"error",source_id:s.source_id,message:`error: proposal failed validation after repair (${L.map(t=>t.code).join(", ")})`}),q.push(s.source_id);continue}}let A=b.proposal,Ne=gr(A,c),tt=ce(e.contextDir,"proposals",ne);if(ut(tt,{recursive:!0}),lt(ce(tt,"proposal.json"),JSON.stringify(A,null,2)+`
11
+ `),r.plan){e.out(`plan: ${A.use_cases.length} use-case(s) proposed from ${s.source_id} (nothing committed)`);for(let t of A.use_cases){let n=Ne.get(t.temp_ref),d=n?n.archived?` \u2248 matches ARCHIVED ${n.cid.slice(0,19)}${n.reason?` \u2014 previously rejected: "${n.reason}"`:" \u2014 previously rejected"}`:` \u2248 matches ${n.cid.slice(0,19)}`:"";e.out(` [${t.risk}] ${t.title} \u2014 cite ${t.cite.anchor}${d}`)}e.emit?.({type:"plan",source_id:s.source_id,use_cases:A.use_cases.map(t=>{let n=Ne.get(t.temp_ref);return{risk:t.risk,title:t.title,anchor:t.cite.anchor,...n?{match:n.cid,match_archived:!!n.archived}:{}}})}),b.assumedDefaults&&e.out(`assumed: ${b.assumedDefaults} default(s) auto-taken (assumed)`);continue}for(let t of A.use_cases){if(!t.conflicts_with?.length)continue;let n=t.conflicts_with.filter(g=>c.resolve(g)!==null),d=t.conflicts_with.filter(g=>c.resolve(g)===null);d.length>0&&(e.out(`note: ${t.temp_ref}: dropped unresolvable conflict hint(s): ${d.join(", ")}`),t.conflicts_with=n.length>0?n:void 0)}h("review_start",{use_cases:A.use_cases.length,flags:Ne.size},R.session_id);let He=await e.review(A.use_cases,Ne);if(h("review_verdicts",[...He.entries()].map(([t,n])=>({ref:t,resolution:n.resolution})),R.session_id),lt(ce(tt,"review.json"),JSON.stringify(A.use_cases.map(t=>{let n=He.get(t.temp_ref)??{resolution:"skipped"};return{id:t.temp_ref,kind:"review-item",resolution:n.resolution,edit:n.edit??null,reason:n.reason??null,...n.supersedeTarget?{supersede_target:n.supersedeTarget}:{},by:ge}}),null,2)+`
12
+ `),r.posture==="reconcile"){let t=Bt(A),n=N=>t.passthrough.use_cases.filter(V=>{let z=V.matches_existing?.cid,H=z?N.resolve(z):null,p=H?N.tipOf(H.cid):null;return p!=null&&(N.trust.get(p)??null)!=="derived"}),d=n(c),g=t.passthrough.use_cases.length-d.length,D=mt(e.contextDir,R.session_id,Ve,e.probe,e.auth),k=new Set(d.map(N=>N.temp_ref));(await ke(D,ht({...t.passthrough,use_cases:d},c),N=>{let V={...t.passthrough,use_cases:n(N.graph).filter(p=>k.has(p.temp_ref))},z=new Map(V.use_cases.map(p=>[p.temp_ref,{resolution:"approved"}])),H=Be({contextDir:e.contextDir,graph:N.graph,proposal:V,proposalId:ne,verdicts:z,by:ge,autoName:!0,allowStaleBasis:!0,eventIds:N.eventIds("extract",1),...ie?{sid:N.sid}:{},probeHits:N.probeHits});return H.errors!==null?{errors:H.errors}:{result:H,record:H.record}})).ok||e.out("note: the unchanged-match evidence attach did not land this run \u2014 the held changeset is unaffected; re-run reconcile to refresh it"),g>0&&e.out(`note: ${g} unchanged match(es) target unreviewed (or no-longer-resolving) item(s) \u2014 evidence not attached (bless them with kane-cli context review; a later reconcile attaches)`);let Q=fe(),O=t.adds.length+t.updates.length+t.archives.length;Q&&O>0&&(Q.save({reconcile:{proposal_id:ne,verdicts:{}}}),de+=O,Oe=Q.state.sid,e.out(`held: ${O} change(s) from ${s.source_id} await your verdicts \u2014 nothing from the changeset committed`),e.emit?.({type:"held",source_id:s.source_id,count:O,reason:"reconcile"}));continue}if((Ae||r.trust==="hold")&&fe()&&A.use_cases.some(t=>t.matches_existing==null)){ze(s,A.use_cases,Ae?"degraded":"trust_hold");continue}let Ct=mt(e.contextDir,R.session_id,Ve,e.probe,e.auth),Dt=t=>{if(t.degradedProbe&&fe()!==null&&A.use_cases.some(d=>d.matches_existing==null))return{result:{degradedHold:!0},record:null};let n=Be({contextDir:e.contextDir,graph:t.graph,proposal:A,proposalId:ne,verdicts:He,by:ge,autoName:!0,allowStaleBasis:!0,eventIds:t.eventIds("extract",1),...ie?{sid:t.sid}:{},probeHits:t.probeHits});return n.errors!==null?{errors:n.errors}:{result:n,record:n.record}},Et=ht(A,c),F=await ke(Ct,Et,Dt);if(!F.ok&&F.kind==="drifted"){if(!await e.confirmStale(`the context changed while you reviewed (${F.asks.map(n=>n.detail).join("; ")}) \u2014 commit against the new head anyway?`)){e.out("aborted: proposal not committed"),e.emit?.({type:"error",source_id:s.source_id,message:"aborted: proposal not committed",code:"STALE_BASIS"}),q.push(s.source_id);continue}F=await ke(Ct,{...Et,sourcePins:[]},Dt)}let rt=F.ok&&"result"in F?F.result:null;if(rt!==null&&"degradedHold"in rt){We(),ze(s,A.use_cases,"degraded");continue}let xe=rt??(F.ok?{record:null,errors:null}:{record:null,errors:F.kind==="validation"?F.errors:F.kind==="contended"?[{code:F.err.code,detail:`a use-case this proposal touches is held by ${F.err.holder?.owner_sid??"another session"} \u2014 try again when it frees`}]:[{code:"UNSETTLED",detail:"concurrent activity kept moving the store \u2014 retry when quieter"}]});if(xe.errors){h("commit_error_details",{errors:xe.errors.map(t=>({code:t.code,detail:t.detail}))},R.session_id),e.out(`\u2717 commit failed \u2014 ${xe.errors.map(t=>t.code).join(", ")} (details: ${te(_)})`),e.emit?.({type:"error",source_id:s.source_id,message:`error: commit failed: ${xe.errors.map(t=>`${t.code}: ${t.detail}`).join("; ")}`}),q.push(s.source_id);continue}let xr=new Date().toISOString();for(let t of A.use_cases){let n=He.get(t.temp_ref)??{resolution:"skipped"};for(let d of Jt({ts:xr,command:"context extract",id:t.temp_ref,by:ge},n.resolution))Kt(e.contextDir,d)}let Z=xe.record;Z.event_ids?.length&&S?.markApplied(Z.event_ids);let st=new Map(Z.review.map(t=>[t.id,t.resolution])),it=[...st.values()].filter(t=>t==="approved"||t==="edited").length,je=[...st.values()].filter(t=>t==="rejected").length,ve=Z.nodes.filter(t=>!st.has(t.cid)).length,ot=Z.supersessions.filter(t=>t.kind==="node"&&t.new!==t.old).length;h("commit",{trusted:it,derived:ve,archived:je},R.session_id),e.out(`saved ${it+ve} use-case(s)`+(ve>0?` \xB7 ${ve} awaiting review`:"")+(je>0?` \xB7 ${je} archived`:"")+(ot>0?` \xB7 ${ot} superseded`:""));{let t=Z.review.filter(n=>n.kind==="pending_update");t.length>0&&(e.out(`${t.length} update(s) held for review`),e.emit?.({type:"update_held",count:t.length,targets:t.map(n=>n.id)}))}b.assumedDefaults&&e.out(`assumed: ${b.assumedDefaults} default(s) auto-taken (assumed)`),e.emit?.({type:"commit",source_id:s.source_id,proposal_id:ne,trusted:it,derived:ve,archived:je,superseded:ot,assumed:b.assumedDefaults??0,evidence_matched:Math.max(0,A.use_cases.length-Z.nodes.length),minted:Z.nodes.map(t=>{let n=Z.names?.find(d=>d.cid===t.cid)?.slug;return{cid:t.cid,...n?{logical_id:n}:{}}})}),l&&s.source_id in l.handle.state.read_basis&&(o(u),l.handle.complete(),e.out(`session ${r.resume} complete`),e.emit?.({type:"session_complete",sid:r.resume,source_id:s.source_id}),m?.event("ASR_SESSION_COMPLETE",{}),l=null,S=null)}if(S){let u=S.state.ingest_schedule??[];u.some(s=>s.status==="pending")&&S.save({ingest_schedule:u.map(s=>s.status==="pending"?{...s,status:"skipped",note:"run ended before its turn \u2014 kane-cli context extract runs it"}:s)})}vt=!0}finally{if(l?.handle.release(),T&&!Pe&&!vt){let o=T.state.checkpoint;if(o){let u=`kane-cli context extract --resume ${T.state.sid} --mode ${a}`;e.out(`session ${T.state.sid} kept its last checkpoint (seq ${o.seq}, ${o.ts}) \u2014 resume with: ${u}`),T.release()}else{try{T.complete()}catch{T.release()}pt()}T=null}}if(I){let o=e.chat?.state.ledger.filter(c=>c.kind==="answer"&&c.receipt.form==="assumed").length??0,u=xt+o,s=e.chat?.state.credits?.total;e.onSummary?.({state:"complete",facts:[`saved ${Y} use-case${Y===1?"":"s"} across ${U.length} source${U.length===1?"":"s"}`,...u>0?[`${u} assumed default(s)`]:[],...s!==void 0?[`credits used: ${s.toFixed(1)}`]:[]],tracePath:te(_)})}if(r.plan||nr(e.contextDir),de>0&&(T||Oe)){Pe=!0;let o=T?.state.sid??Oe,u=`kane-cli context extract --resume ${o} --mode ${a}`;if(I||e.out(`paused: ${de} held item(s) await review \u2014 resume with: ${u}`),e.emit?.({type:"session_paused",sid:o,resume:u,held:de}),I){let s=e.chat?.state.credits?.total;e.onSummary?.({state:"paused",reason:"held for review",facts:[`${de} held item(s) await your review`,...s!==void 0?[`credits used: ${s.toFixed(1)}`]:[]],resume:u,tracePath:te(_)})}return T?.release(),3}return q.length>0&&e.out(`${q.length} of ${U.length} source(s) failed \u2014 re-run kane-cli context extract to retry (${q.join(", ")})`),_t(),q.length>0?1:0}export{mt as a,$r as b,hr as c,pr as d,Rr as e,gr as f,Ss as g};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as g}from"./chunk-RZ4F3BHX.js";import{openAsBlob as w}from"fs";import{basename as A}from"path";var d={emulator:{product:"app-testing",type:"emulator",source:"web-client"},simulator:{product:"app-testing",type:"simulator",source:"web-client"}},f={emulator:"application/vnd.android.package-archive",simulator:"application/zip"},b=30*6e4,u=3e4;function _(n){let t=n??{},e=Array.isArray(t.data)?t.data:[],r=[];for(let a of e){let i=a??{},c=typeof i.app_id=="string"?i.app_id:void 0;c&&r.push({appId:c,name:typeof i.name=="string"&&i.name.trim()!==""?i.name:c,...typeof i.package=="string"?{packageName:i.package}:{},...typeof i.updated_at=="string"?{updatedAt:i.updated_at}:{}})}let s=t.metaData??{},o=typeof s.total=="number"?s.total:typeof s.total=="string"&&Number.isFinite(Number(s.total))?Number(s.total):r.length;return{apps:r,total:o}}function k(){return{fileBody:n=>w(n),request:g}}function $(n){if(!n||typeof n!="object")return null;let t=n,e=typeof t.app_id=="string"?t.app_id:void 0;return e?{appId:e,...typeof t.app_url=="string"?{appUrl:t.app_url}:{},...typeof t.url=="string"?{url:t.url}:{},cached:t.cached===!0,...typeof t.name=="string"?{name:t.name}:{}}:null}function R(n){if(!n||typeof n!="object")return null;let t=n,e=typeof t.app_id=="string"?t.app_id:void 0,r=typeof t.download_url=="string"&&t.download_url!==""?t.download_url:void 0;if(!e||!r)return null;let s=typeof t.app_name=="string"&&t.app_name.trim()!==""?t.app_name:`${e}.bin`;return{appId:e,name:s,url:r,...typeof t.package=="string"?{packageName:t.package}:{},...typeof t.type=="string"?{type:t.type}:{}}}function U(n){if(!n||typeof n!="object")return null;let t=n,e=typeof t.app_id=="string"?t.app_id:void 0,r=a=>typeof t[a]=="string"&&t[a]!==""?t[a]:void 0,s=r("cf_url")??r("cf_ap_url")??r("url");if(!e||!s)return null;let o=typeof t.name=="string"&&t.name.trim()!==""?t.name:`${e}.bin`;return{appId:e,name:o,url:s,...typeof t.package=="string"?{packageName:t.package}:{},...typeof t.type=="string"?{type:t.type}:{}}}function T(n){let t=n?.cause,e=t instanceof Error?t.message:typeof t=="string"?t:void 0,r=n instanceof Error?n.message:String(n);return e&&e!==r?`${r} (${e})`:r}var p=class extends Error{constructor(e,r){super(e);this.status=r;this.name="AppUploadError"}};async function l(n){let t=await n.text();try{let e=JSON.parse(t);return e.message??e.error??t}catch{return t||`app service returned ${n.status}`}}var m=20,h=100,y=class{constructor(t,e,r={}){this.baseUrl=t;this.auth=e;this.deps={...k(),...r}}deps;headers(){return{Authorization:`Basic ${Buffer.from(`${this.auth.username}:${this.auth.accessKey}`).toString("base64")}`,Accept:"application/json"}}async upload(t,e,r={}){let s=A(t);if(!this.auth.orgId||!Number.isFinite(Number(this.auth.orgId)))throw new p(`Could not register ${s}: this account's org id is required to record an upload.`);let o=await this.uploadTarget(s,e);r.onProgress?.(`uploading ${s}\u2026`);let a=await this.deps.request(o.uploadUrl,{method:"PUT",headers:{"Content-Type":f[e]},body:await this.deps.fileBody(t),signal:r.signal??AbortSignal.timeout(b)});if(!a.ok)throw new p(`Uploading ${s} failed: ${a.status} ${await a.text()}`,a.status);let i=o.uploadUrl.split("?")[0];return this.register(s,e,i)}async uploadTarget(t,e){let r=d[e],s=new URLSearchParams({key:t,contentType:f[e],product:r.product}),o=await this.deps.request(`${this.baseUrl}/app/get-upload-url?${s.toString()}`,{method:"GET",headers:this.headers(),signal:AbortSignal.timeout(u)});if(!o.ok)throw new p(`Could not start the upload of ${t}: ${await l(o)}`,o.status);let a=await o.json();if(!a.uploadURL)throw new p(`Could not start the upload of ${t}: no upload url.`);return{key:a.Key??"",uploadUrl:a.uploadURL}}async register(t,e,r){let s=Number(this.auth.orgId),o=d[e],a=await this.deps.request(`${this.baseUrl}/app/url`,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({name:t,source:o.source,type:o.type,org_id:s,url:r,product:o.product}),signal:AbortSignal.timeout(u)});if(!a.ok)throw new p(`Could not register ${t}: ${await l(a)}`,a.status);let i=$(await a.json());if(!i)throw new p(`Registering ${t} returned no app id.`);return i}async list(t){let e=t.limit??m;e<=0&&(e=m),e>h&&(e=h);let r=t.offset!==void 0&&t.offset>0?t.offset:0,s=new URLSearchParams({limit:String(e),offset:String(r),type:d[t.type].type,level:"user",searchtxt:t.search??""}),o=`${this.baseUrl}/app/list?${s.toString()}`,a;try{a=await this.deps.request(o,{method:"GET",headers:this.headers(),signal:AbortSignal.timeout(u)})}catch(i){throw new p(T(i))}if(!a.ok)throw new p(`Could not list your uploads: ${await l(a)}`,a.status);return _(await a.json())}async details(t){let e=await this.deps.request(`${this.baseUrl}/app/${encodeURIComponent(t)}/download?format=url`,{method:"GET",headers:this.headers(),signal:AbortSignal.timeout(u)});if(e.ok){let o=R(await e.json());if(o)return o}else if(e.status!==404)throw new p(`${t}: ${await l(e)}`,e.status);let r=await this.deps.request(`${this.baseUrl}/app/${encodeURIComponent(t)}/url`,{method:"GET",headers:this.headers(),signal:AbortSignal.timeout(u)});if(!r.ok)throw new p(`${t}: ${await l(r)}`,r.status);let s=U(await r.json());if(!s)throw new p(`${t} returned no download url.`);return s}async liveness(t){try{return await this.details(t),"alive"}catch(e){let r=e instanceof p?e.status:void 0;return r!==void 0&&r>=400&&r<500?"gone":"unknown"}}};export{f as a,_ as b,$ as c,R as d,U as e,T as f,p as g,y as h};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-L7MXYCD7.js";import{a as B}from"./chunk-2WVKOZ6W.js";import{a as R}from"./chunk-TFPPEOAK.js";import{a as k}from"./chunk-G7VQCS4J.js";import{y as c}from"./chunk-27U4PLPX.js";import{a as P}from"./chunk-HCBYKLMW.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,i,y,m){return{id:n,label:`${i} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:i,currentFolderId:y,env:m,onSelect:x,onCancel:w}){let[I,M]=(0,t.useState)([]),[$,d]=(0,t.useState)(!0),[O,g]=(0,t.useState)(!1),[U,N]=(0,t.useState)(null),[p,b]=(0,t.useState)("list"),[S,v]=(0,t.useState)(""),[E,f]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){N("Login first to browse folders"),d(!1);return}let o=new AbortController;return d(!0),g(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){N("Login first to browse folders"),d(!1),g(!1);return}let a=k(m),T=new B(a.tmsBaseUrl,r.username,r.access_key),F=(async function*(){if(o.signal.aborted)return;let s=await T.listFolders(i);yield{page:1,folders:s,totalLoaded:s.length,done:!0}})();for await(let s of F){if(d(!1),s.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(s.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),s.done&&g(!1)}}catch(r){if(r?.name==="AbortError")return;N(r instanceof Error?r.message:String(r)),d(!1),g(!1)}})(),()=>o.abort()},[n,i,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!i){f("No project selected \u2014 pick a project first");return}f(null),b("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let T=k(m),s=await new B(T.tmsBaseUrl,a.username,a.access_key).createFolder(i,r);x(s.id,s.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,i,m,x]),H=(0,t.useCallback)(()=>{v(""),f(null),h.current?w():b("list")},[w]);return p==="naming"||p==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:c.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.orange,bold:!0,children:"Create new folder"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"No folders yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(l,{color:c.dim,children:"Name: "}),p==="naming"?(0,e.jsx)(A,{value:S,onChange:o=>{v(o),E&&f(null)},onSubmit:D,onCancel:H}):(0,e.jsx)(l,{children:S})]}),E&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.red,children:E})}),p==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"Creating..."})}),p==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(_,{title:"Folders",items:I,loading:$,loadingMore:O,preserveSelectionById:!0,error:U,itemNoun:"folders",onTab:()=>{h.current=!1,b("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.split(" (")[0];x(o.id,r)},onCancel:w})}export{X as a,W as b};
2
+ import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-KOMKHFC4.js";import{a as B}from"./chunk-BPMSNGXQ.js";import{a as R}from"./chunk-SA2LQSYP.js";import{a as k}from"./chunk-CVCVBQP6.js";import{y as c}from"./chunk-D6FYCAIA.js";import{a as P}from"./chunk-HCBYKLMW.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,i,y,m){return{id:n,label:`${i} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:i,currentFolderId:y,env:m,onSelect:x,onCancel:w}){let[I,M]=(0,t.useState)([]),[$,d]=(0,t.useState)(!0),[O,g]=(0,t.useState)(!1),[U,N]=(0,t.useState)(null),[p,b]=(0,t.useState)("list"),[S,v]=(0,t.useState)(""),[E,f]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){N("Login first to browse folders"),d(!1);return}let o=new AbortController;return d(!0),g(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){N("Login first to browse folders"),d(!1),g(!1);return}let a=k(m),T=new B(a.tmsBaseUrl,r.username,r.access_key),F=(async function*(){if(o.signal.aborted)return;let s=await T.listFolders(i);yield{page:1,folders:s,totalLoaded:s.length,done:!0}})();for await(let s of F){if(d(!1),s.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(s.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),s.done&&g(!1)}}catch(r){if(r?.name==="AbortError")return;N(r instanceof Error?r.message:String(r)),d(!1),g(!1)}})(),()=>o.abort()},[n,i,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!i){f("No project selected \u2014 pick a project first");return}f(null),b("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let T=k(m),s=await new B(T.tmsBaseUrl,a.username,a.access_key).createFolder(i,r);x(s.id,s.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,i,m,x]),H=(0,t.useCallback)(()=>{v(""),f(null),h.current?w():b("list")},[w]);return p==="naming"||p==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:c.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.orange,bold:!0,children:"Create new folder"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"No folders yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(l,{color:c.dim,children:"Name: "}),p==="naming"?(0,e.jsx)(A,{value:S,onChange:o=>{v(o),E&&f(null)},onSubmit:D,onCancel:H}):(0,e.jsx)(l,{children:S})]}),E&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.red,children:E})}),p==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"Creating..."})}),p==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(_,{title:"Folders",items:I,loading:$,loadingMore:O,preserveSelectionById:!0,error:U,itemNoun:"folders",onTab:()=>{h.current=!1,b("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.split(" (")[0];x(o.id,r)},onCancel:w})}export{X as a,W as b};
@@ -1,4 +1,4 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as n}from"./chunk-27U4PLPX.js";import{createHash as _}from"crypto";import{existsSync as m,readFileSync as u}from"fs";import{dirname as T,join as f,resolve as o}from"path";import{fileURLToPath as E}from"url";var s=T(E(import.meta.url)),l=2;function p(e,r){let t=_("sha256");return t.update(`kane-assurance-contract
2
+ import{a as n}from"./chunk-D6FYCAIA.js";import{createHash as _}from"crypto";import{existsSync as m,readFileSync as u}from"fs";import{dirname as T,join as f,resolve as o}from"path";import{fileURLToPath as E}from"url";var s=T(E(import.meta.url)),l=2;function p(e,r){let t=_("sha256");return t.update(`kane-assurance-contract
3
3
  `),t.update(e),t.update(`
4
4
  agent_state_schema=${r}`),"sha256:"+t.digest("hex")}function d(){return[o(s,".."),o(s,"../../..")]}function i(){return"sha256:85dd52f33a9fd9cf22ebb81f04dfd3c05bdbeca2e62e3a7a53e8caaaa4060752"}var a=class extends Error{constructor(t,c){super(`agent/cli contract mismatch (cli ${t||"<unset>"}, agent ${c||"<unset>"}) \u2014 rebuild or reinstall the stale half`);this.expected=t;this.actual=c;this.name="PairMismatchError"}};function I(){return{TESTMUAI_CONTRACT_DIGEST:i(),TESTMUAI_CLIENT_VERSION:process.env.KANE_DEV_FORCE_CLIENT_RELEASE??`kane-cli/${n}`}}export{a,I as b};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as c}from"./chunk-G7VQCS4J.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{v as s,w as a}from"./chunk-27U4PLPX.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
2
+ import{a as c}from"./chunk-CVCVBQP6.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{v as s,w as a}from"./chunk-D6FYCAIA.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ async function g(e,o,r,u){if(!e)return r();let{fixCmd:i,...a}=o,c=Date.now();e({kind:"start",...a});let d=()=>Math.max(1,Math.round((Date.now()-c)/1e3)),s=i!==void 0?{fixCmd:i}:{},t;try{t=await r()}catch(l){throw e({kind:"end",ok:!1,durS:d(),...s}),l}let n=u(t);return e({kind:"end",ok:n.ok,durS:d(),...n.exitCode!==void 0?{exitCode:n.exitCode}:{},...n.results!==void 0?{results:n.results}:{},...n.credits!==void 0?{credits:n.credits}:{},...n.ok?{}:s}),t}function m(e){return{ing:`${e.replace(/e$/,"")}ing`,ed:`${e.endsWith("e")?`${e}d`:`${e}ed`}`}}export{g as a,m as b};
@@ -0,0 +1,21 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as j}from"./chunk-L5LI2JF4.js";import{c as C}from"./chunk-EYOCNMUM.js";import{dirname as z,basename as U,join as y}from"path";function Z(e){let t=U(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function k(e){return y(z(e),`output-${Z(e)}`)}function Te(e){return y(k(e),"Result.md")}function T(e){return y(k(e),".internal")}function O(e){return y(T(e),"meta.json")}function Ae(e,t,r){return y(k(e),`${t}-${r}-code`)}function Ie(e){return y(k(e),"generated-code")}function Le(e){return k(e)+".staging"}function Q(e){return y(T(e),"steps")}function Pe(e,t,r){return y(Q(e),`${t}-${r}`)}import{existsSync as u,renameSync as S,rmSync as _}from"fs";function Ke(e){let t=`${e}.staging`,r=`${e}.bak`;if(!u(t))throw new Error(`atomicReplaceDir: staging missing: ${t}`);if(process.platform==="win32"){u(e)&&_(e,{recursive:!0,force:!0}),S(t,e);return}u(e)&&(u(r)&&_(r,{recursive:!0,force:!0}),S(e,r)),S(t,e),u(r)&&_(r,{recursive:!0,force:!0})}function Ge(e){let t=`${e}.staging`,r=`${e}.bak`;if(process.platform==="win32"){u(t)&&(u(e)?_(t,{recursive:!0,force:!0}):S(t,e));return}if(u(r)&&!u(e)){S(r,e),u(t)&&_(t,{recursive:!0,force:!0});return}u(r)&&u(e)&&_(r,{recursive:!0,force:!0}),u(t)&&u(e)&&_(t,{recursive:!0,force:!0})}import{readFileSync as Se,existsSync as xe}from"fs";import{basename as N,dirname as Re,isAbsolute as $e,resolve as J}from"path";import{dirname as X,isAbsolute as ee,resolve as te}from"path";var d=class extends Error{constructor(r,o,n){super(`[${o}${n!=null?`:${n}`:""}] ${r}`);this.file=o;this.line=n;this.name="TestMdParseError"}},ne=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),A=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","url","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version","on_lock_conflict","tags","assurance"]),I=new Set(["optional"]),re=new Set(["optional","variables"]),oe=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),ie=new Set(["app","no_reset","os_version"]),se=new Set(["mode","on_lock_conflict","tags","assurance"]);function L(e,t){let r=t.split(`
3
+ `),{global:o,bodyStartLine:n}=ae(e,r),{title:a,steps:s}=be(e,r,n);return{path:e,title:a,global:o,steps:s}}function ae(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let r=-1;for(let c=1;c<t.length;c++)if(t[c].trim()==="---"){r=c;break}if(r===-1)throw new d("frontmatter is missing closing '---'",e,1);let o=t.slice(1,r).join(`
4
+ `),n;try{n=j(o)??{}}catch(c){throw new d(`invalid YAML in frontmatter: ${c.message}`,e,1)}if(V(e,n,"frontmatter",1),n.on_lock_conflict!==void 0){let c=n.on_lock_conflict;if(c!=="readonly"&&c!=="fail"&&c!=="wait")throw new d(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(c)}`,e,1)}if(F(e,n,1),n.assurance!==void 0){let c=n.assurance;if(c===null||typeof c!="object"||Array.isArray(c))throw new d("assurance must be a mapping with sub-keys {id, base}",e,1);let f=c;for(let g of Object.keys(f))if(g!=="id"&&g!=="base")throw new d(`unknown assurance sub-key '${g}' \u2014 the engine block allows only {id, base}`,e,1);if(typeof f.id!="string"||f.id.length===0)throw new d("assurance.id must be a non-empty string (logical id)",e,1);if(f.base!==void 0&&!(typeof f.base=="string"&&/^sha256:[0-9a-f]+$/.test(f.base)))throw new d("assurance.base must be a 'sha256:<hex>' string",e,1)}if(n.tags!==void 0){let c=n.tags,f=Array.isArray(c)?c.map(g=>String(g)).join(","):String(c);n.tags=ce(f,e,1)}if(n.target!==void 0&&(n.target=le(n.target,e,1)),n.app!==void 0&&(n.app=ge(n.app,e,1)),n.no_reset!==void 0&&typeof n.no_reset!="boolean")throw new d(`no_reset must be boolean: got ${typeof n.no_reset}`,e,1);if(n.os_version!==void 0&&typeof n.os_version!="string")if(typeof n.os_version=="number")n.os_version=String(n.os_version);else throw new d(`os_version must be a string: got ${typeof n.os_version}`,e,1);let a=n.target,s=a==="emulator"||a==="simulator";if(s&&n.app===void 0)throw new d(`target: ${String(a)} needs an app \u2014 add \`app: <path-to-build | APPid>\``,e,1);if(!s&&n.app!==void 0)throw new d("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);if(!s&&n.no_reset!==void 0)throw new d("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);if(!s&&n.os_version!==void 0)throw new d("os_version requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);return{global:n,bodyStartLine:r+1}}function ce(e,t,r){let n=e.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(a=>a.trim().toLowerCase());if(n.length===0||n.some(a=>a.length===0))throw new d("tags must be a non-empty list of non-empty strings",t,r);return[...new Set(n)]}var de=new Set(["chrome","cdp","ws","emulator","simulator"]),fe="target must be one of 'chrome' | 'cdp' | 'ws' (web) or 'emulator' | 'simulator' (mobile, with a root `app:` key)";function le(e,t,r){if(typeof e=="string"&&de.has(e))return e;throw e!==null&&typeof e=="object"&&!Array.isArray(e)?new d(`the mapping form of target is no longer accepted \u2014 write flat keys:
5
+ target: emulator | simulator
6
+ app: <path-to-build | APPid>`,t,r):new d(`${fe} \u2014 got: ${JSON.stringify(e)}`,t,r)}function ge(e,t,r){if(typeof e!="string"||e.trim().length===0)throw new d("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",t,r);let o=e.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new d(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,t,r);return ue(o,t)}function ue(e,t){return/^APP[0-9A-Za-z_-]+$/.test(e)||ee(e)?e:te(X(t),e)}function We(e){let t=e.target;if(!(t!=="emulator"&&t!=="simulator"))return{platform:C(t)??"",app:e.app??"",...e.no_reset!==void 0?{no_reset:e.no_reset}:{}}}function P(e){let t=e.target;return t==="chrome"||t==="cdp"||t==="ws"?t:void 0}var pe=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function me(e,t,r){let o=pe.exec(t);if(o)return{label:t.slice(0,o.index).trim(),verifies:o[1].split(",").map(a=>a.trim())};let n=t.lastIndexOf("@verifies");if(n>0&&/\s/.test(t[n-1])){let a=t.slice(n+9).split(/[\s,]+/).filter(s=>s.length>0);if(a.length===0||a.every(s=>s.startsWith("ac-")))throw new d("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",e,r)}return{label:t,verifies:[]}}function be(e,t,r){let o,n=r;for(;n<t.length&&t[n].trim()==="";)n++;let a=n<t.length?/^#\s+(.+?)\s*$/.exec(t[n]):null;a&&(o=a[1],n++);let s=[];for(let f=n;f<t.length;f++)/^##\s/.test(t[f])&&s.push(f);let c=[];for(let f=0;f<s.length;f++){let g=s[f],p=s[f+1]??t.length,h=t[g].replace(/^##\s+/,"").trim(),{label:i,verifies:l}=me(e,h,g+1),m=t.slice(g+1,p),{config:b,body:w,optional:R}=he(e,g+1,m);c.push({index:f+1,heading:i,verifies:l,config:b,body:w,headingLine:g+1,optional:R})}return{title:o,steps:c}}function he(e,t,r){let o=0;for(;o<r.length&&r[o].trim()==="";)o++;let n,a=t;if(o<r.length&&/^```yaml\s*$/.test(r[o])){let l=o;a=t+l,o++;let m=-1;for(;o<r.length;){if(/^```\s*$/.test(r[o])){m=o;break}o++}if(m===-1)throw new d("step-config fenced ```yaml block is not closed",e,a);let b=r.slice(l+1,m).join(`
7
+ `);try{n=j(b)??{}}catch(w){throw new d(`invalid YAML in step config: ${w.message}`,e,a)}o=m+1}let s=we(r.slice(o)),c=s.filter(l=>l.trim()!=="");if(c.length>0&&/^@session\s+/.test(c[0].trim()))throw new d("@session is no longer supported (iteration 3); use @import instead",e,t);let f=/^@import\s+(\S.*)$/,p=s.filter(l=>f.test(l.trim())).length>0;if(p&&c.length!==1)throw new d("step body must be exactly one of prose / @import",e,t);let h=!1,i;if(n){if(V(e,n,p?"step config (ref)":"step config (objective)",a),F(e,n,a),typeof n.optional=="boolean")h=n.optional;else if(n.optional!==void 0)throw new d(`step config 'optional' must be boolean: got ${typeof n.optional}`,e,a);let l={...n};delete l.optional,p&&delete l.variables,!p&&Object.keys(l).length>0&&(i=l)}if(p){let m=f.exec(c[0].trim())[1].trim(),b=n?.variables;return{body:{kind:"import_ref",path:m,...b&&Object.keys(b).length>0?{bindings:b}:{}},optional:h}}return{body:{kind:"objective",text:s.join(`
8
+ `).trim()},config:i,optional:h}}function we(e){let t=0,r=e.length;for(;t<r&&e[t].trim()==="";)t++;for(;r>t&&e[r-1].trim()==="";)r--;return e.slice(t,r)}function F(e,t,r){let o=t.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new d("variables must be an object map",e,r);let n={};for(let[a,s]of Object.entries(o))if(typeof s=="string")n[a]={value:s};else if(s&&typeof s=="object"&&!Array.isArray(s)&&typeof s.value=="string")n[a]=s;else throw new d(`variable '${a}' must be a string or { value: ... } object`,e,r);t.variables=n}function V(e,t,r,o){for(let n of Object.keys(t)){if(ne.has(n))throw new d(`auth/identity keys are CLI-only: ${n}`,e,o);if(r==="frontmatter"){if(I.has(n))throw new d(`step-only key in frontmatter: ${n}`,e,o);if(!A.has(n))throw new d(`unknown config key: ${n}`,e,o)}else if(r==="step config (objective)"){if(!A.has(n)&&!I.has(n))throw new d(`unknown config key: ${n}`,e,o);if(oe.has(n))throw new d(`chrome config is global-only: ${n}`,e,o);if(ie.has(n))throw new d(`'${n}' is global-only: the whole run drives one app`,e,o);if(se.has(n))throw new d(`'${n}' is run-level and cannot be set per-step`,e,o)}else if(!re.has(n))throw new d(`step config on @import may only contain 'optional' / 'variables': got ${n}`,e,o)}}import{createHash as K}from"crypto";function x(e){if(e==null)return null;if(Array.isArray(e))return e.map(x);if(typeof e=="object"){let t={};for(let r of Object.keys(e).sort()){let o=e[r];o!==void 0&&(t[r]=x(o))}return t}return e}function ye(e){if(e.body.kind!=="objective")throw new Error("stepMd5: only objective steps have an md5; @import rows do not");let t={...e.config??{},optional:e.optional??!1},r=JSON.stringify(x(t));return K("md5").update(e.body.text).update(`
9
+ `).update(r).digest("hex")}function G(e){let t={};for(let[o,n]of Object.entries(e.bindings??{}))t[o]={value:n.value,...n.secret===!0?{secret:!0}:{},...n.syntax?{syntax:n.syntax}:{}};let r=JSON.stringify(x({bindings:t,optional:e.optional}));return K("md5").update(e.path).update(`
10
+ `).update(r).digest("hex")}function qe(e){return ye({index:e.trace[e.trace.length-1].stepIndex,heading:e.trace[e.trace.length-1].heading,verifies:[],body:{kind:"objective",text:e.objective},config:e.parsedConfig,headingLine:1,optional:e.optional})}import{writeFileSync as _e,mkdirSync as ve,readFileSync as ke}from"fs";import{dirname as Y}from"path";function D(e){try{return JSON.parse(ke(O(e),"utf8"))}catch{return null}}function Xe(e){let t=O(e.sourcePath);try{ve(Y(t),{recursive:!0})}catch(o){return process.stderr.write(`
11
+ \u26A0 Failed to create output directory.
12
+ ${o.message}
13
+ Path: ${Y(t)}
14
+
15
+ `),t}let r={commit_id:e.commitId};e.testId!==void 0&&(r.test_id=e.testId),e.testcaseId!==void 0&&(r.testcase_id=e.testcaseId),e.projectId!==void 0&&(r.project_id=e.projectId),e.folderId!==void 0&&(r.folder_id=e.folderId),e.orgId!==void 0&&(r.org_id=e.orgId),e.sessionName!==void 0&&(r.session_name=e.sessionName),e.plan!==void 0&&(r.plan=e.plan);try{_e(t,JSON.stringify(r,null,2)+`
16
+ `,"utf8")}catch(o){process.stderr.write(`
17
+ \u26A0 Failed to write meta.json.
18
+ ${o.message}
19
+ Path: ${t}
20
+
21
+ `)}return t}var W=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"],je=["app","no_reset","os_version"],Oe=["mode","on_lock_conflict","tags","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version"],v=class extends Error{constructor(t){super(t),this.name="TestMdResolveError"}};function E(e){return N(e).endsWith("_test.md")?"test":"helper"}function st(e){let t=J(e),r=B(t),o=Ee(r.global),n=[],a=[],s=[{file:t,kind:E(t)}],c=[];return H(r,a,n,[],t,{},s,c,{}),n.forEach((g,p)=>g.flatIndex=p+1),{rootPath:t,rootTitle:r.title,rootGlobal:r.global,rootSteps:r.steps,chrome:o,steps:n,unitFiles:s,warnings:c}}function at(e){let t=[];for(let r of e.unitFiles){if(r.kind!=="test")continue;let o=D(r.file);o&&t.push({file:r.file,...o.project_id?{project_id:String(o.project_id)}:{},...o.org_id?{org_id:String(o.org_id)}:{}})}return t}function B(e){if(!xe(e))throw new v(`@import path not found: ${e}`);let t=Se(e,"utf8");return L(e,t)}function H(e,t,r,o,n,a,s,c,f){if(t.includes(e.path)){let i=[...t,e.path].map(l=>N(l)).join(" \u2192 ");throw new v(`cyclic reference: ${i}`)}t.push(e.path);let g=o.length===0,p=e.global.variables??{};for(let i of Object.keys(a))if(Object.hasOwn(p,i))throw new v(`callsite binding '${i}' collides with a declared variable in ${e.path} (frontmatter variables are pinned; parameters are its undeclared names)`);let h=e.global;if(!g){let i={...e.global};for(let l of Oe)i[l]!==void 0&&(c.push(`${e.path}: '${l}' is root-governed on imported units \u2014 ignored`),delete i[l]);i.url!==void 0&&(f.pending=String(i.url),delete i.url),h=i}for(let i of e.steps){let l=i.body.kind!=="objective";if(i.optional&&l&&!g)throw new v(`intermediate-ref 'optional' is not supported in v1: ${e.path}:${i.headingLine}`);if(i.body.kind==="objective"){let $={file:e.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1},q=Me(h,i.config,a),M={flatIndex:0,objective:i.body.text,sourceFile:e.path,trace:[...o,$],config:q,parsedConfig:i.config,optional:i.optional??!1,verifies:i.verifies,owningFile:e.path,unitKind:E(e.path)};f.pending&&(M.unitEntryUrl=f.pending,f.pending=void 0),r.push(M);continue}let m={file:e.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1,rowMd5:G({path:i.body.path,bindings:i.body.bindings,optional:i.optional??!1})},b=Re(e.path),w=$e(i.body.path)?i.body.path:J(b,i.body.path),R=B(w);s.some($=>$.file===w)||s.push({file:w,kind:E(w)}),H(R,t,r,[...o,m],n,i.body.bindings??{},s,c,f)}g||(f.pending=void 0),t.pop()}function Ee(e){let t={};for(let r of W){if(r==="target"){let o=P(e);o!==void 0&&(t.target=o);continue}e[r]!==void 0&&(t[r]=e[r])}return t}function Me(e,t,r){let o={};for(let[s,c]of Object.entries(e))W.includes(s)||je.includes(s)||(o[s]=c);let n={...o,...t??{}},a={...r,...e.variables??{},...t?.variables??{}};return Object.keys(a).length>0?n.variables=a:delete n.variables,n}export{Z as a,k as b,Te as c,T as d,O as e,Ae as f,Ie as g,Le as h,Q as i,Pe as j,Ke as k,Ge as l,L as m,We as n,G as o,qe as p,D as q,Xe as r,v as s,st as t,at as u};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as g}from"./chunk-2WVKOZ6W.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-G7VQCS4J.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
2
+ import{a as g}from"./chunk-BPMSNGXQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-CVCVBQP6.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
3
3
 
4
4
  discover IDs:
5
5
  kane-cli projects list --search "<keyword>" --limit 10
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as ke}from"./chunk-65ZTD5SJ.js";import{b as he,c as _e,d as Z,e as ee}from"./chunk-BRHNRCEZ.js";import{c as ye,e as we}from"./chunk-VGFTNLQQ.js";import{d as P}from"./chunk-JFAFKHDX.js";import{a as L}from"./chunk-DNNZ353O.js";import{a as pe}from"./chunk-SDPRO2LE.js";import{A as I,z as me}from"./chunk-TH47OOBV.js";import{b as ge}from"./chunk-VAYBKR76.js";import{a as ue}from"./chunk-CUM23TLF.js";import{d as de,i as fe}from"./chunk-DUAXZYAD.js";import{d as ae,f as le}from"./chunk-WXHQYYD5.js";function bt(t){let e=process.env.HOME??"";return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}import{randomBytes as mt}from"crypto";function te(t,e){let n=Math.min(t.length,e.length),o=0,r=0,c=0;for(let s=0;s<n;s++)o+=t[s]*e[s],r+=t[s]*t[s],c+=e[s]*e[s];return r===0||c===0?0:o/(Math.sqrt(r)*Math.sqrt(c))}function ne(t,e,n){return n*t+(1-n)*e}var re=.7;var ze=["get_node","get_edges","find_by_provenance","match_by_type","stale_nodes","search_similar","search_similar_batch","history"],Qe=["source_read","source_grep","source_list"],Ke=[...ze,...Qe],Se=50,Ee=200,se=10,Re=50,be=20,We=200,Xe=50;function U(t,e,n){let o=typeof t=="number"&&Number.isFinite(t)?Math.floor(t):e;return Math.max(1,Math.min(o,n))}function M(t,e){let n=t[e];if(typeof n!="string"||n.length===0)throw new b(`param "${e}" must be a non-empty string`);return n}function D(t,e){let n=t[e];if(n==null)return null;if(typeof n!="string")throw new b(`param "${e}" must be a string when present`);return n}var b=class extends Error{},xe=24,qe=10,Ye=10;function Je(t){let e=t.cursor;if(e==null)return 0;if(typeof e=="string"&&/^\d+$/.test(e))return Number.parseInt(e,10);throw new b(`BAD_CURSOR: cursor ${JSON.stringify(e)} is not a cursor this store minted`)}function Ae(t,e){let n=e.fields;if(!Array.isArray(n)||n.length===0)return t;let o=new Set(n.filter(r=>typeof r=="string"));return t.map(r=>Object.fromEntries(Object.entries(r).filter(([c])=>o.has(c))))}function oe(t,e,n=Se,o=Ee){let r=Je(e),c=U(e.limit,n,o),s=t.slice(r,r+c),d=r+s.length<t.length;return{rows:Ae(s,e),truncated:d,next_cursor:d?String(r+s.length):null}}var Ze=t=>t.cursor!=null||t.fields!=null;function z(t,e,n=Se){let o=oe(t,e,n);return Ze(e)||o.truncated?{rows:o.rows,truncated:o.truncated,next_cursor:o.next_cursor}:o.rows}function ie(t,e){let n=t.getNode(e);return n?{cid:e,label:n.label,content:n.content,trust:t.trust.get(e)??null,freshness:t.stale(e)}:null}function ve(t){return new Set(t.toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").split(" ").filter(Boolean))}function Q(t,...e){let n=ve(t);if(n.size===0)return 0;let o=t.trim().toLowerCase(),r=0;for(let c of e){let s=ve(c);if(s.size===0)continue;let d=0;for(let u of n)s.has(u)&&d++;let m=n.size+s.size-d,f=m===0?0:d/m;o&&c.toLowerCase().includes(o)&&(f=Math.max(f,.9)),r=Math.max(r,f)}return r}function et(t,e){let n=M(e,"cid"),o=D(e,"type"),r=D(e,"direction")??"both";if(!["out","in","both"].includes(r))throw new b('param "direction" must be out|in|both');let c=[];(r==="out"||r==="both")&&c.push(...t.edgesFrom(n)),(r==="in"||r==="both")&&c.push(...t.edgesInto(n));let s=c.filter(d=>o==null||d.type===o);return z(s,e)}function tt(t,e){let n=M(e,"source_id"),o=t.heads.get(n)??null,r=[];for(let c of t.nodeLabel.keys()){let s=t.derivesInto(c).filter(m=>m.props.source_id===n).map(m=>({source_cid:m.props.source_cid,anchor:m.props.anchor??null}));if(s.length===0)continue;let d=ie(t,c);d&&r.push({...d,pins:s,pinned_to_head:o!=null&&s.some(m=>m.source_cid===o)})}return z(r,e,Ee)}function nt(t,e){let n=M(e,"label"),o=D(e,"trust"),r=D(e,"freshness"),c=[];for(let{cid:s}of t.byLabel(n)){let d=ie(t,s);d&&(o!=null&&d.trust!==o||r!=null&&d.freshness!==r||c.push(d))}return z(c,e)}function rt(t,e={}){let n=D(e,"label"),o=t.staleList().map(({cid:r,state:c})=>{let s=t.getNode(r);return{cid:r,state:c,label:s?.label??null,title:s?.content.title??null}}).filter(r=>n==null||r.label===n);return z(o,e)}function st(t,e,n){let o=e.extracted,r=D(e,"kind"),c=[];for(let f of[...t.heads.keys()].sort()){let u=t.heads.get(f);if(typeof u!="string")continue;let h=t.mediaOf(u).format;if(r!=null&&h!==r)continue;let _=t.extractedSourceCids.has(u);if(typeof o=="boolean"&&_!==o)continue;let E=0;if(h!=="image"){let y=L(n,t,u);y&&(E=y.toString("utf8").replace(/\n$/,"").split(`
2
+ import{a as ke}from"./chunk-DN42IM2Z.js";import{b as he,c as _e,d as Z,e as ee}from"./chunk-4FQI643D.js";import{d as ye,e as we}from"./chunk-AXTPNZPX.js";import{d as P}from"./chunk-JFAFKHDX.js";import{a as pe}from"./chunk-TUTDSX7T.js";import{a as L}from"./chunk-DNNZ353O.js";import{A as I,z as me}from"./chunk-TH47OOBV.js";import{b as ge}from"./chunk-VAYBKR76.js";import{a as ue}from"./chunk-CUM23TLF.js";import{d as de,i as fe}from"./chunk-DUAXZYAD.js";import{d as ae,f as le}from"./chunk-WXHQYYD5.js";function bt(t){let e=process.env.HOME??"";return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}import{randomBytes as mt}from"crypto";function te(t,e){let n=Math.min(t.length,e.length),o=0,r=0,c=0;for(let s=0;s<n;s++)o+=t[s]*e[s],r+=t[s]*t[s],c+=e[s]*e[s];return r===0||c===0?0:o/(Math.sqrt(r)*Math.sqrt(c))}function ne(t,e,n){return n*t+(1-n)*e}var re=.7;var ze=["get_node","get_edges","find_by_provenance","match_by_type","stale_nodes","search_similar","search_similar_batch","history"],Qe=["source_read","source_grep","source_list"],Ke=[...ze,...Qe],Se=50,Ee=200,se=10,Re=50,be=20,We=200,Xe=50;function U(t,e,n){let o=typeof t=="number"&&Number.isFinite(t)?Math.floor(t):e;return Math.max(1,Math.min(o,n))}function M(t,e){let n=t[e];if(typeof n!="string"||n.length===0)throw new b(`param "${e}" must be a non-empty string`);return n}function D(t,e){let n=t[e];if(n==null)return null;if(typeof n!="string")throw new b(`param "${e}" must be a string when present`);return n}var b=class extends Error{},xe=24,qe=10,Ye=10;function Je(t){let e=t.cursor;if(e==null)return 0;if(typeof e=="string"&&/^\d+$/.test(e))return Number.parseInt(e,10);throw new b(`BAD_CURSOR: cursor ${JSON.stringify(e)} is not a cursor this store minted`)}function Ae(t,e){let n=e.fields;if(!Array.isArray(n)||n.length===0)return t;let o=new Set(n.filter(r=>typeof r=="string"));return t.map(r=>Object.fromEntries(Object.entries(r).filter(([c])=>o.has(c))))}function oe(t,e,n=Se,o=Ee){let r=Je(e),c=U(e.limit,n,o),s=t.slice(r,r+c),d=r+s.length<t.length;return{rows:Ae(s,e),truncated:d,next_cursor:d?String(r+s.length):null}}var Ze=t=>t.cursor!=null||t.fields!=null;function z(t,e,n=Se){let o=oe(t,e,n);return Ze(e)||o.truncated?{rows:o.rows,truncated:o.truncated,next_cursor:o.next_cursor}:o.rows}function ie(t,e){let n=t.getNode(e);return n?{cid:e,label:n.label,content:n.content,trust:t.trust.get(e)??null,freshness:t.stale(e)}:null}function ve(t){return new Set(t.toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").split(" ").filter(Boolean))}function Q(t,...e){let n=ve(t);if(n.size===0)return 0;let o=t.trim().toLowerCase(),r=0;for(let c of e){let s=ve(c);if(s.size===0)continue;let d=0;for(let u of n)s.has(u)&&d++;let m=n.size+s.size-d,f=m===0?0:d/m;o&&c.toLowerCase().includes(o)&&(f=Math.max(f,.9)),r=Math.max(r,f)}return r}function et(t,e){let n=M(e,"cid"),o=D(e,"type"),r=D(e,"direction")??"both";if(!["out","in","both"].includes(r))throw new b('param "direction" must be out|in|both');let c=[];(r==="out"||r==="both")&&c.push(...t.edgesFrom(n)),(r==="in"||r==="both")&&c.push(...t.edgesInto(n));let s=c.filter(d=>o==null||d.type===o);return z(s,e)}function tt(t,e){let n=M(e,"source_id"),o=t.heads.get(n)??null,r=[];for(let c of t.nodeLabel.keys()){let s=t.derivesInto(c).filter(m=>m.props.source_id===n).map(m=>({source_cid:m.props.source_cid,anchor:m.props.anchor??null}));if(s.length===0)continue;let d=ie(t,c);d&&r.push({...d,pins:s,pinned_to_head:o!=null&&s.some(m=>m.source_cid===o)})}return z(r,e,Ee)}function nt(t,e){let n=M(e,"label"),o=D(e,"trust"),r=D(e,"freshness"),c=[];for(let{cid:s}of t.byLabel(n)){let d=ie(t,s);d&&(o!=null&&d.trust!==o||r!=null&&d.freshness!==r||c.push(d))}return z(c,e)}function rt(t,e={}){let n=D(e,"label"),o=t.staleList().map(({cid:r,state:c})=>{let s=t.getNode(r);return{cid:r,state:c,label:s?.label??null,title:s?.content.title??null}}).filter(r=>n==null||r.label===n);return z(o,e)}function st(t,e,n){let o=e.extracted,r=D(e,"kind"),c=[];for(let f of[...t.heads.keys()].sort()){let u=t.heads.get(f);if(typeof u!="string")continue;let h=t.mediaOf(u).format;if(r!=null&&h!==r)continue;let _=t.extractedSourceCids.has(u);if(typeof o=="boolean"&&_!==o)continue;let E=0;if(h!=="image"){let y=L(n,t,u);y&&(E=y.toString("utf8").replace(/\n$/,"").split(`
3
3
  `).length)}let l=t.extractionCompleteness.get(f);c.push({source_id:f,kind:h,lines:E,head_cid:u,extracted:_,last_extract_at:l?.at??null,extractor_version:l?.extractor_version??null})}let{rows:s,truncated:d,next_cursor:m}=oe(c,e);return{sources:s,truncated:d,next_cursor:m}}function ot(t,e,n){let o=M(e,"ref"),r=t.resolve(o);if(!r)throw new b(`UNKNOWN_REF: ${o} names nothing in the graph`);let c=r.tip,s=new Map;for(let[p,k]of t.superseded)typeof k=="string"&&k!==p&&s.set(k,[...s.get(k)??[],p]);let d=[],m=[c],f=new Set;for(;m.length>0;){let p=m.pop();f.has(p)||(f.add(p),d.push(p),m.push(...s.get(p)??[]))}let{records:u}=de(n),g=new Map,h=new Map;for(let p of u){for(let k of p.nodes)g.has(k.cid)||g.set(k.cid,p.ts);for(let k of p.supersessions)k.kind==="node"&&h.set(k.old,{by_cid:k.new,reason:k.reason})}let _=d.map(p=>({cid:p,minted_at:g.get(p)??null,superseded_by:h.get(p)?.by_cid??null,reason:h.get(p)?.reason??null,change_note:null})),{rows:E,truncated:l,next_cursor:y}=oe(_,e,Ye);return{root_logical_id:t.displayNameOf(c),live_tip:t.superseded.has(c)?null:c,truncated:l,next_cursor:y,chain:E}}function $e(t){let e=t.queries;if(!Array.isArray(e)||e.length<1||e.length>xe)throw new b(`param "queries" must be 1..${xe} entries`);return e.map((n,o)=>{if(typeof n!="object"||n===null)throw new b(`queries[${o}] must be an object`);let r=n;if(typeof r.qid!="string"||r.qid.length===0)throw new b(`queries[${o}].qid must be a non-empty string`);if(typeof r.text!="string"||r.text.length===0)throw new b(`queries[${o}].text must be a non-empty string`);return{qid:r.qid,text:r.text,topK:U(r.top_k,se,qe)}})}function De(t){let e=[];for(let{cid:n,content:o}of t.byLabel("usecase"))t.superseded.has(n)||e.push({cid:n,title:String(o.title??""),summary:String(o.summary??""),description:String(o.description??"")});return e}function Me(t,e,n){let o=De(t);return e.map(r=>{let c=[];for(let s of o){let d=n(r,s);d<=0||c.push({cid:s.cid,logical_id:t.displayNameOf(s.cid),title:s.title,score:Math.round(d*1e3)/1e3,trust:t.trust.get(s.cid)??null,superseded:!1})}return c.sort((s,d)=>d.score-s.score||s.cid.localeCompare(d.cid)),{qid:r.qid,truncated:c.length>r.topK,matches:c.slice(0,r.topK)}})}function Ce(t,e){let n=$e(e);return{results:Me(t,n,(o,r)=>Q(o.text,r.title,r.summary,r.description)),scorer:"lexical_fallback"}}function it(t,e){let n=M(e,"text"),o=D(e,"label")??"usecase",r=U(e.k,se,Re),c=[];for(let{cid:s,content:d}of t.byLabel(o)){let m=String(d.title??""),f=String(d.summary??""),u=Q(n,m,f);u<=0||c.push({cid:s,title:m,summary:f,score:Math.round(u*1e3)/1e3,trust:t.trust.get(s)??null,freshness:t.stale(s)})}return c.sort((s,d)=>d.score-s.score||s.cid.localeCompare(d.cid)),c.slice(0,r)}function Te(t,e,n){let o=t.heads.get(n);if(typeof o!="string"){let c=[...t.heads.keys()].sort().join(", ");throw new b(`unknown source_id "${n}" \u2014 known: ${c||"(none)"}`)}if(t.mediaOf(o).format==="image")throw new b(`source "${n}" is an image \u2014 no line window (cite img#whole)`);let r=L(e,t,o);if(r==null)throw new b(`source "${n}" blob is missing from the store`);return{head:o,lines:r.toString("utf8").replace(/\n$/,"").split(`
4
4
  `)}}function ct(t,e,n){return t.slice(e-1,n).map((o,r)=>`${String(e+r).padStart(4,"0")}| ${o}`).join(`
5
5
  `)}function at(t,e,n){let o=M(e,"source_id"),r=D(e,"anchor"),c=e.line_range;if(r!=null&&c!=null)throw new b("give anchor OR line_range, not both");let{head:s,lines:d}=Te(t,n,o),m=d.length,f,u;if(r!=null){let g=/^L(\d+)-L(\d+)$/.exec(r);if(!g)throw new b(`anchor "${r}" is not L<a>-L<b>`);let h=Number(g[1]),_=Number(g[2]);if(h<1||_<h||_>m)throw new b(`anchor "${r}" does not resolve (source has ${m} lines)`);f=Math.max(1,h-be),u=Math.min(m,_+be)}else if(c!=null){if(!Array.isArray(c)||c.length!==2||!c.every(_=>Number.isInteger(_)))throw new b('param "line_range" must be [from_line, to_line]');let[g,h]=c;if(g<1||h<g)throw new b('param "line_range" must be 1-based with from \u2264 to');if(g>m)throw new b(`line_range starts past the end (source has ${m} lines)`);f=g,u=Math.min(h,m)}else f=1,u=m;return u=Math.min(u,f+We-1),{window:ct(d,f,u),from_line:f,to_line:u,source_cid:s,total_lines:m}}function lt(t,e,n){let o=M(e,"pattern"),r=D(e,"source_id"),c;try{c=new RegExp(o,"u")}catch(f){throw new b(`invalid pattern: ${f instanceof Error?f.message:String(f)}`)}let s=r!=null?[r]:[...t.heads.keys()].sort(),d=[],m=!1;e:for(let f of s){if(r==null){let g=t.heads.get(f);if(typeof g!="string"||t.mediaOf(g).format==="image")continue}let{lines:u}=Te(t,n,f);for(let g=0;g<u.length;g++)if(c.test(u[g])){if(d.length>=Xe){m=!0;break e}d.push({source_id:f,line:g+1,text:u[g]})}}return{matches:d,truncated:m}}function ut(t,e,n,o){try{switch(e){case"get_node":{let r=ie(t,M(n,"cid"));return r==null?{ok:!0,result:null}:{ok:!0,result:Ae([r],n)[0]}}case"get_edges":return{ok:!0,result:et(t,n)};case"find_by_provenance":return{ok:!0,result:tt(t,n)};case"match_by_type":return{ok:!0,result:nt(t,n)};case"stale_nodes":return{ok:!0,result:rt(t,n)};case"search_similar":return{ok:!0,result:it(t,n)};case"search_similar_batch":return{ok:!0,result:Ce(t,n)};case"history":{if(o==null)throw new b("history unavailable (no context store)");return{ok:!0,result:ot(t,n,o)}}case"source_list":{if(o==null)throw new b("source roster unavailable (no context store)");return{ok:!0,result:st(t,n,o)}}case"source_read":case"source_grep":{if(o==null)throw new b("source text unavailable (no context store)");return{ok:!0,result:(e==="source_read"?at:lt)(t,n,o)}}default:return{ok:!1,error:`unknown method: ${e} \u2014 available: ${Ke.join(", ")}`}}}catch(r){return r instanceof b?{ok:!1,error:`${e}: ${r.message}`}:{ok:!1,error:`${e}: graph read failed: ${r instanceof Error?r.message:String(r)}`}}}var H="assurance.sim";function dt(t){return[t.title,t.summary,t.description].filter(Boolean).join(`
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as U}from"./chunk-DNNZ353O.js";import{a as G}from"./chunk-Q2F5QB2W.js";import{b as I,c as b}from"./chunk-NVGBE2DR.js";import{A as T}from"./chunk-TH47OOBV.js";import{a as L,c as F}from"./chunk-CUM23TLF.js";import{b as P,i as j}from"./chunk-DUAXZYAD.js";import{a as R,d as $,f as D}from"./chunk-WXHQYYD5.js";import{existsSync as ie,mkdirSync as oe,readFileSync as re,writeFileSync as se}from"fs";import{basename as S,extname as H,join as ae}from"path";var K=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function Z(e){return typeof e=="string"&&e!=="."&&e!==".."&&K.test(e)}function k(e){if(!Z(e))throw new Error(`unsafe logical_id: ${JSON.stringify(e)} \u2014 must match ${String(K)} (no path separators)`)}import{extname as q}from"path";var Q={kind:"jira",media_type:"application/x-kane-jira-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},ee={kind:"confluence",media_type:"application/x-kane-confluence-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},fe={kind:"web",media_type:"application/x-kane-web-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},z=[{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},{kind:"text",media_type:"application/json",extensions:[".json"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"application/yaml",extensions:[".yaml",".yml"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"application/toml",extensions:[".toml"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"application/xml",extensions:[".xml"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"text/plain",extensions:[".log"],cite:"verbatim",maxBytes:2e6},{kind:"pdf",media_type:"application/pdf",extensions:[".pdf"],cite:"verbatim",maxBytes:25e6,sniff:e=>e.subarray(0,5).toString("latin1")==="%PDF-"},{kind:"docx",media_type:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",extensions:[".docx"],cite:"verbatim",maxBytes:25e6,sniff:e=>e.length>=4&&e[0]===80&&e[1]===75&&e[2]===3&&e[3]===4,sniffFail:e=>e.length>=8&&e.subarray(0,8).equals(te)?"DOCX_ENCRYPTED_OR_LEGACY: password-protected Office file (or a legacy .doc renamed .docx) \u2014 remove the password / save as .docx and re-ingest":void 0},Q,ee],te=Buffer.from([208,207,17,224,161,177,26,225]),M={pdf:"pdf",docx:"docx",jira:"jira",confluence:"confluence",web:"web"},ue=new Set(Object.keys(M));function J(e){let n=q(e).toLowerCase(),t=z.find(i=>i.extensions.includes(n));return t?{ok:!0,media:t}:{ok:!1,code:"UNSUPPORTED_MEDIA",allowlist:z.flatMap(i=>i.extensions)}}function v(e){return e>=1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:`${Math.max(1,Math.round(e/1024))} KB`}function de(e,n,t){return G({source_id:e,source_cid:"sha256:".padEnd(71,"0"),doc_kind:n,numbered_text:U(t)})}var Y=2e3;function ce(e){let t=S(e,H(e)).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[^a-z0-9]+/,"");return k(t),t}function Me(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 W(e){let n=ae(e,"meta.json");ie(n)||(oe(e,{recursive:!0}),se(n,JSON.stringify({schema:R,canonicalizer:"v1"},null,2)+`
3
+ `))}async function Se(e){let{contextDir:n,filePath:t,asId:i,confirmSameSource:_,converters:h}=e;W(n);let o=re(t),s=J(t);if(!s.ok)throw new Error(`${S(t)} is a file type kane can't ingest (${H(t)||"no extension"}) \u2014 supported: ${s.allowlist.join(" ")} [UNSUPPORTED_MEDIA]`);if(o.byteLength>s.media.maxBytes)throw new Error(`${S(t)} is too large \u2014 ${v(o.byteLength)}, the limit for ${s.media.media_type} is ${v(s.media.maxBytes)} [FILE_TOO_LARGE]`);if(s.media.sniff&&!s.media.sniff(o)){let m=s.media.sniffFail?.(o);throw new Error(m??`MEDIA_SNIFF_MISMATCH: ${t} does not look like ${s.media.media_type}`)}let l;return i!==void 0?(k(i),l=i):l=ce(t),le({contextDir:n,bytes:o,media:s.media,sourceId:l,label:t,confirmSameSource:_,converters:h})}async function le(e){let{contextDir:n,bytes:t,media:i,confirmSameSource:_,converters:h}=e,o=e.sourceId,s=e.label??o;if(W(n),t.byteLength>i.maxBytes)throw new Error(`the content is too large \u2014 ${v(t.byteLength)}, the limit for ${i.media_type} is ${v(i.maxBytes)} [FILE_TOO_LARGE]`);let l=[],m=M[i.kind];if(i.cite==="verbatim"&&!m){try{new TextDecoder("utf-8",{fatal:!0}).decode(t)}catch{throw new Error(`ENCODING_UNSUPPORTED: ${s} is not valid UTF-8 \u2014 re-save it as UTF-8 and re-ingest`)}t.toString("utf8").split(`
4
+ `).some(f=>f.length>Y)&&l.push(`long line detected (> ${Y} chars) \u2014 anchors lose granularity; consider pretty-printing before ingest`)}let p=I(t),y=new Map,c=null,C=!1;for(let f=0;;f++){let x=T(n),u=x.heads.get(o),X=u!=null?x.getNode(u)?.content:void 0;if(u!=null&&X?.blob===p)return{status:"unchanged",source_id:o,cid:u,blob:p};if(u==null){for(let[r,g]of x.heads.entries())if(!(r===o||g==null)&&x.getNode(g)?.content.blob===p){let a;if(y.has(r)?a=y.get(r):f===0&&_?(a=await _(r),y.set(r,a)):(a=!1,y.set(r,a),f>0&&l.push(`same bytes already ingested as '${r}' \u2014 minted under '${o}' anyway (the twin appeared mid-commit; not prompted)`)),a)return{status:"unchanged",source_id:r,cid:g,blob:p};break}}if(c===null){let r={},g,a=null,A=null;if(m){let O=h?.[m];if(!O)throw new Error(`${m.toUpperCase()}_CONVERTER_MISSING: ${m} ingestion requires the converter \u2014 the command layer wires it`);let d=await O(t);a=Buffer.from(d.projection,"utf8");let N=de(o,i.kind,a);if(N>4e5)throw new Error(`PROJECTION_TOO_LARGE: serialized source payload ${N} bytes > ${4e5} \u2014 split the document and re-ingest`);r={text_blob:I(a),...d.inventory.length>0?{images:d.inventory}:{},converter:d.converter},A=d.blobs,g={kind:i.kind,...d.pages!==void 0?{pages:d.pages}:{},delivered:d.delivered.length,omitted:d.inventory.length-d.delivered.length}}c={derived:r,composite:g,projBytes:a,derivedBlobs:A}}if(!C){if(b(n,t),c.projBytes!==null&&b(n,c.projBytes),c.derivedBlobs!==null)for(let[,r]of c.derivedBlobs)b(n,r);C=!0}let w=F(o,p),E=D("source",w);if(E.length>0)throw new Error(`source node fails ${E[0].code}: ${E[0].detail}`);let B=L("source",w);try{j(n,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:B,label:$.SOURCE,content:w}],edges:[],review:[],supersessions:[],media:{[o]:{format:i.kind,media_type:i.media_type,anchors_supported:m?["L-L","img#ref"]:i.cite==="verbatim"?["L-L"]:[],...c.derived}},...e.eventIds&&e.eventIds.length>0?{event_ids:e.eventIds}:{},source_head_moves:{[o]:B}},{expectPrev:x.latestHash})}catch(r){if(r instanceof P&&f<3)continue;throw r}return{status:u!=null?"versioned":"created",source_id:o,cid:B,blob:p,...l.length?{warnings:l}:{},...c.composite?{composite:c.composite}:{}}}}export{k as a,Q as b,ee as c,fe as d,ue as e,J as f,de as g,ce as h,Me as i,Se as j,le as k};
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{j as Re,k as oe,l as se,m as _e,n as $e,o as ae}from"./chunk-LSZVSYAP.js";import{a as te,c as re,d as ye,f as ie}from"./chunk-FPAJURPL.js";import{a as P,b as we,d as ke}from"./chunk-OS4VSIHT.js";import{d as ve}from"./chunk-6J5T5FEY.js";import{a as S}from"./chunk-CLGC7VEO.js";import{a as X,b as N,c as ee,d as W,e as he,g as O,h as ne}from"./chunk-W5TTF7GB.js";import{a as ge}from"./chunk-JFAFKHDX.js";import{b as Z,c as J,d as Q}from"./chunk-DSXSU5MH.js";import{f as me,h as pe}from"./chunk-X2FM67OM.js";import{A as I}from"./chunk-TH47OOBV.js";import{f as T}from"./chunk-DUAXZYAD.js";import{existsSync as Oe,statSync as Ue}from"fs";import{basename as G,resolve as q}from"path";function Ee(e){if(!e||e.stale_refs.length===0)return"\u2014";let n=e.direct_refs??[];return`${e.stale_refs.length} stale${n.length>0?` \xB7 ${n.length} direct`:""}`}function ce(e,n){let t=[...e.rows.filter(a=>a.kind!=="REMOVE").map(a=>[a.kind,S(a.ref),a.reason,Ee(a.impact)]),...e.archive.map(a=>["ARCHIVE",S(a.ref),a.why,Ee(a.impact)])],r=Math.max(40,n??100),i=[`reconcile ${e.source_id} \u2014 head ${e.head.status} \xB7 ${t.length} decision${t.length===1?"":"s"}`];return t.length>0&&i.push(...ve(["kind","ref","why","impact"],t,r,2)),e.changed&&i.push(e.held?`extract ran in override mode; ${e.defaultsTaken??0} default(s) auto-taken; matched-but-changed and new proposals HELD for your verdict (staged \u2014 nothing committed)`:`extract ran in override mode; ${e.defaultsTaken??0} default(s) auto-taken; matched-but-changed proposals auto-committed as edits`),i.push("each row becomes a card below \u2014 verdicts commit as they land"),e.planPath&&i.push(`plan: ${e.planPath}`),i}var xe=new Set(["interactive","agent","ci","override"]);function Ae(e,n){if(e.mode!==void 0&&!xe.has(e.mode))return{error:`--mode must be interactive | agent | ci | override, got '${e.mode}'`,code:"MODE_USAGE"};let t=e.mode,r="reconcile without a TTY needs an explicit mode \u2014 pass --mode agent|ci|override, or --plan for a preview";return t==="interactive"&&!n?{error:r}:t||(n?"interactive":e.plan?"override":{error:r})}async function Pe(e){let{makeHeadlessIO:n,agentRefusal:t}=await import("./headless-io-66RG5NN5.js");return t(n("ndjson","reconcile"),e,"MODE_USAGE")}function Me(e,n,t,r){if(J(t)){let v=Q(t),s=v?.sourceIdFor(t)??null;if(v===null||s===null)return{error:`--from '${t}' is not a supported remote URL \u2014 supported: ${Z.map(u=>u.hint).join("; ")}`};if(r!==void 0&&r!==s)return{error:`--source-id '${r}' does not match this URL's own identity '${s}' \u2014 re-run without --source-id. A source adopted with --as updates by re-running context ingest with the same --as; reconcile follows only the URL's own id`};let c=I(e);if(!c.heads.has(s))return{error:`unknown source '${s}' \u2014 see \`kane-cli context list --type source\`. If this URL was ingested under a custom id, update it by re-running context ingest with the same --as`};if(c.heads.get(s)==null)return{error:`source '${s}' is retired \u2014 restore it first with \`kane-cli context revert\`, then reconcile`};let _=z(e,s,{remoteUrl:t});return _!==null?{error:_}:{sourceId:s,remoteUrl:t}}if(r===void 0)return{error:"reconcile needs --from <file> AND --source-id <id> \u2014 see `kane-cli context list --type source` for ids"};let i=q(n,t);if(!Oe(i)||!Ue(i).isFile())return{error:`--from '${t}' is not a file \u2014 pass the changed source document`};let a=me(i);if(!a.ok)return{error:`--from '${t}' is not an ingestable document \u2014 allowed: ${a.allowlist.join(", ")}`};let o=I(e);if(!o.heads.has(r))return{error:`unknown source '${r}' \u2014 see \`kane-cli context list --type source\``};if(o.heads.get(r)==null)return{error:`source '${r}' is retired \u2014 restore it first with \`kane-cli context revert\`, then reconcile`};let w=z(e,r,{filePath:i});if(w!==null)return{error:w};let f=null;try{f=pe(i)}catch{}return f!==null&&f!==r&&o.heads.get(f)!=null?{error:`'${G(i)}' already backs live source '${f}' \u2014 did you mean --source-id ${f}? To truly move these bytes under '${r}', retire '${f}' first`}:{sourceId:r,filePath:i}}function C(e){return e==null?"(none)":e.slice(0,19)}function Y(e,n,t,r=!1,i){if(e.out(`reconcile ${n.source_id}: head ${n.head.status} \u2014 ${C(n.head.before)} \u2192 ${C(n.head.after)}`),r||(e.out(`note: ${n.note}`),e.out(`skipped arms: ${n.skipped_arms}`)),n.changed&&(e.out(n.held?`extract ran in override mode; ${t?.defaultsTaken??0} default(s) auto-taken; matched-but-changed and new proposals HELD for your verdict (staged \u2014 nothing committed)`:`extract ran in override mode; ${t?.defaultsTaken??0} default(s) auto-taken; matched-but-changed proposals auto-committed as edits`),i?.({type:"defaults_taken",count:t?.defaultsTaken??0})),r){let a=n.changeset??[],o=(f,v)=>{let s=a.filter(c=>c.kind===f).length;return s>0?`${s} ${v}`:null},w=[o("ADD","add"),o("MODIFY","modify"),o("ARCHIVE","archive")].filter(Boolean);n.changed&&e.out(`changeset: ${a.length} item(s)${w.length?` \u2014 ${w.join(" \xB7 ")}`:""}`),e.out(`plan: ${n.rows.length} row(s) \u2014 each gets a card below`);return}if(n.changed){let a=n.changeset??[];e.out(`changeset: ${a.length} item(s)`);for(let o of a)if(o.kind==="MODIFY")e.out(` [MODIFY] ${S(o.ref)} \u2014 ${o.summary} (${C(o.old_cid)} \u2192 ${o.new_cid===null?"(staged)":C(o.new_cid)})`);else if(o.kind==="ADD")e.out(` [ADD] ${S(o.ref)}`);else{e.out(` [ARCHIVE] ${S(o.ref)} \u2014 ${o.why}`);let w=le(o.impact,"retiring drops");w&&e.out(` ${w}`)}}e.out(`plan: ${n.rows.length} row(s)`);for(let a of n.rows){e.out(` [${a.kind}] ${S(a.ref)} \u2014 ${a.reason}`);let o=le(a.impact,"approving marks");o&&e.out(` ${o}`),e.out(` provenance: ${a.provenance}`),e.out(` action: ${a.action}`)}}function De(e,n){return ce({source_id:e.source_id,head:{status:e.head.status},rows:e.rows,archive:(e.changeset??[]).filter(t=>t.kind==="ARCHIVE"),changed:e.changed,held:!!e.held,defaultsTaken:n?.defaultsTaken},process.stdout.columns)}function le(e,n){if(!e||e.stale_refs.length===0)return null;let t=e.direct_refs??[];return`impact: ${n} ${e.stale_refs.length} item(s) stale`+(t.length>0?` \u2014 ${t.length} directly touched: ${t.join(", ")}`:"")}function D(e){return e==="interactive"?"override":e}async function M(e,n,t,r,i,a,o=[],w="override",f,v,s,c,_,u,E){let m;try{m=ne(e)}catch(d){return P(r,d instanceof Error?d.message:String(d)),1}try{if(!t){let{runWalkSession:d}=await import("./walk-session-MZCMXVZB.js"),{telemetryEnvName:R}=await import("./bootstrap-MMRPAHWE.js");return await d({dir:e,rows:n,archive:o,held:f??null,childMode:w,runDesign:c??null,mark:a,markA:s,...v?{archiveState:v}:{},...u?{meta:{verb:"reconcile",sid:u,env:R()}}:{},...E?{resumeCmd:E}:{},signals:b=>U(e,b.ref,b.verdict,b.reason),..._?{script:_}:{}})}return await Te(e,n,t,r,i,a,o,w,f,v)}finally{m()}}var H=(e,n)=>e?`kane-cli maintain reconcile --from ${e} --source-id ${n}`:void 0,He=e=>e===null?void 0:"filePath"in e?e.filePath:e.remoteUrl,V=e=>`${e} high-risk item(s) need a human \u2014 ci mode won't guess. Walk interactively or use --mode agent.`;function F(e,n,t){let r=n.rows;e({type:"reconcile_plan",source_id:n.source_id,plan_path:t,rows:r.map(i=>({kind:i.kind,ref:i.ref,why:i.reason})),archive:n.changeset.filter(i=>i.kind==="ARCHIVE").map(i=>({ref:i.ref,why:i.why}))})}function de(e={}){return{type:"reconcile_summary",applied:0,skipped:0,deferred:0,plan_only:0,failed:0,paused:0,stale_created:0,...e}}var L=de();async function j(e,n,t,r,i,a,o,w,f){F(i,n,t);let v=n.changeset.filter(_=>_.kind==="ARCHIVE"&&f?.[_.ref]===void 0),s=n.rows,c;try{c=ne(e)}catch(_){return i({type:"error",message:_ instanceof Error?_.message:String(_)}),i(de()),2}try{return await Fe(e,n,t,r,i,a,o,s,v,w)}finally{c()}}async function Fe(e,n,t,r,i,a,o,w,f,v){let s=0,c=0,_=0,u=0,E=0,m=0,d=0,R=new Set,b=(h,p)=>{try{v?.(h,p)}catch{}};for(let[h,p]of w.entries()){i({type:"reconcile_row_start",kind:p.kind,ref:p.ref,...p.impact?{stale:p.impact.stale_refs.length,direct:p.impact.direct_refs?.length??0}:{}});let g=(l,$,x)=>i({type:"reconcile_row_end",kind:p.kind,ref:p.ref,outcome:l,...$!==void 0?{exit_code:$}:{},...x?{detail:x}:{}});if(p.applied){c++,g("skipped");continue}if(p.kind==="REMOVE"){E++,g("plan-only");continue}if(p.held_ref&&n.held){let l=new Set;if(p.kind==="MODIFY"&&p.impact){let x=I(e);for(let A of p.impact.stale_refs){let K=x.resolve(A);K&&x.stale(K.tip)==="fresh"&&l.add(A)}}let $=oe(e,n.held,p.held_ref,ue);if(!$.ok){_++,d===0&&(d=1),g("failed",1,$.message);continue}if($.kind==="ADD"){let x=await r($.ref,{yes:!0,mode:o});if(x!==0){x===3?(u++,d===0&&(d=3),g("paused",3)):(_++,d===0&&(d=1),g("failed",x));continue}}s++,$.kind!=="ADD"&&p.impact&&(m+=l.size),b(h,"approved"),U(e,p.ref,$.kind==="ADD"?"gap-resolved-create":"gap-resolved-evolve"),g("applied");continue}let y=te(I(e),p.ref);if(!y.ok){c++,g("skipped");continue}let k=y.target;if(R.has(k.ucTip)){c++,g("skipped");continue}if(p.kind==="ADD"){let l=await r(k.seamRef,{yes:!0,mode:o});if(l===3){u++,d===0&&(d=3),g("paused",3);continue}if(l!==0){_++,d===0&&(d=1),g("failed",l);continue}R.add(k.ucTip),s++,b(h,"approved"),U(e,p.ref,"gap-resolved-create"),g("applied")}else{let l=await re(e,k,{yes:!0,mode:o},a,r,"batch");l.outcome==="evolved"?(R.add(k.ucTip),s++,b(h,"approved"),U(e,p.ref,"gap-resolved-evolve"),g("applied")):l.outcome==="paused"?(u++,d===0&&(d=l.code),g("paused",l.code)):l.outcome==="failed"?(_++,d===0&&(d=1),g("failed",l.code)):(c++,g("skipped"))}}return f.length>0&&(i({type:"reconcile_paused",plan_path:t,pending:f.map(h=>({ref:h.ref,why:h.why}))}),u+=f.length,d===0&&(d=3)),i(de({applied:s,skipped:c,plan_only:E,failed:_,paused:u,stale_created:m})),d}var ue={kind:"human",id:process.env.USER??"operator"};function U(e,n,t,r){ge(e,{ts:new Date().toISOString(),command:"reconcile-walk",id:n,verdict:t,polarity:"preference",by:ue,target:n,...r!==void 0?{reason:r}:{}})}async function Te(e,n,t,r,i,a,o=[],w="override",f,v){let s=0,c=0,_=0,u=0,E=0,m=0,d=0,R=new Set;for(let[b,h]of n.entries()){if(h.applied){r.out(`skipped ${h.ref} \u2014 already applied (${h.applied.outcome} at ${h.applied.at})`),c++;continue}let p=l=>{try{a?.(b,l)}catch($){P(r,`could not record applied state for ${h.ref}: ${$ instanceof Error?$.message:String($)}`)}};if(h.kind==="REMOVE"){r.out(`REMOVE ${h.ref} \u2014 plan-only in this release (not executed)`),u++;continue}if(h.held_ref&&f){let l=oe(e,f,h.held_ref,ue);if(!l.ok){P(r,`held ${h.ref}: ${l.message}`),E++,d===0&&(d=1);continue}if(r.out(`committed ${l.ref} (${h.kind==="ADD"?"minted":"updated \u2014 old\u2192new redirect"})`),l.kind==="ADD"){let $=await i(l.ref,{yes:t,mode:w});if($===3){r.out(`design session for ${l.ref} paused \u2014 resume with the "kane-cli design tests --resume <session>" command printed above`),m++,d===0&&(d=3),p("approved");continue}if($!==0){P(r,`design run for ${l.ref} ended with exit code ${$}`),E++,d===0&&(d=1),p("approved");continue}}s++,p("approved"),U(e,h.ref,h.kind==="ADD"?"gap-resolved-create":"gap-resolved-evolve");continue}let g=I(e),y=te(g,h.ref);if(!y.ok){r.out(`skipped ${h.ref} \u2014 ${y.message}`),c++;continue}let k=y.target;if(R.has(k.ucTip)){r.out(`skipped ${h.ref} \u2014 use-case ${k.display} already handled in this walk`),c++;continue}if(h.kind==="ADD"){let l=await i(k.seamRef,{yes:t,mode:w});if(l===3){r.out(`design session for ${k.display} paused \u2014 resume with the "kane-cli design tests --resume <session>" command printed above; this row lands when that session completes`),m++,d===0&&(d=3);continue}if(l!==0){P(r,`design run for ${k.display} ended with exit code ${l}`),E++,d===0&&(d=1);continue}R.add(k.ucTip),s++,p("approved"),U(e,h.ref,"gap-resolved-create")}else{let l=await re(e,k,{yes:!0,mode:w},r,i,"batch");l.outcome==="evolved"?(R.add(k.ucTip),s++,p("approved"),U(e,h.ref,"gap-resolved-evolve")):l.outcome==="paused"?(m++,d===0&&(d=l.code)):l.outcome==="failed"?(E++,d===0&&(d=l.code)):c++}}for(let b of o)if(b.kind==="ARCHIVE"&&v?.[b.ref]===void 0){r.out(`[ARCHIVE] ${b.ref} \u2014 ${b.why}`);{let h=le(b.impact,"retiring drops");h&&r.out(` ${h}`)}r.out(" plan-only \u2014 retire belongs to the interactive session (never headless)"),u++}return r.out(`reconcile walk: ${s} applied, ${c} skipped, ${_} deferred, ${u} plan-only`+(E>0?`, ${E} failed`:"")+(m>0?`, ${m} paused`:"")),d}var Be=new Set(Z.map(e=>e.name));function z(e,n,t){let r=I(e),i=r.heads.get(n);if(i==null)return null;let a=r.mediaOf(i);if("remoteUrl"in t){let o=Q(t.remoteUrl)?.name??"remote";return a.format!==o?`source '${n}' is backed by ${a.format} content, not a ${o} source \u2014 reconcile it with the --from it was originally ingested from`:null}return Be.has(a.format)?`source '${n}' is a remote ${a.format} source \u2014 pass its URL to --from, not a file`:null}function fe(e,n,t,r){return"remoteUrl"in n?$e(e,n.remoteUrl,{out:t.out,err:t.err},r.remoteFindProvider):_e(e,n.filePath)}function Ie(e){return e.remote_url!==void 0?{remoteUrl:e.remote_url}:e.backing_path!==void 0?{filePath:e.backing_path}:null}async function Se(e,n,t,r,i,a=!1,o=!1){let w=i.seams??{reingest:fe(e,t,r,i),reextract:ae(e,{stage:a,hostOut:c=>r.out(c),hostEmit:c=>{c.type!=="run_start"&&i.emitEvent?.(c)},...i.emitEvent?{}:{hostProgress:c=>process.stderr.write(c+`
3
+ `)}})},f=null,v={reingest:w.reingest,reextract:async c=>f=await w.reextract(c)},s;try{r.out(`reconciling ${n}: re-reading the source and comparing against the graph\u2026`),s=await(i.buildPlan??se)(e,n,v)}catch(c){return P(r,`reconcile failed: ${c instanceof Error?c.message:String(c)}`),null}if(s.changed)if(o)for(let c of De(s,f))r.out(c);else Y(r,s,f,!1,i.emitEvent);return s}async function Ve(e){let[{render:n},t,{ScrollbackProvider:r},{ChatSurface:i},{makeChatController:a},{makeReconcileDeps:o}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./scrollback-JLPJR25X.js"),import("./ChatSurface-FJSO3IKR.js"),import("./chat-controller-R4THYYPU.js"),import("./reconcile-deps-UJ6KVUIS.js")]),w=t.default??t,f=a(),v=o({contextDir:e,note:s=>f.note(s)});return new Promise(s=>{let c=n(w.createElement(r,null,w.createElement(i,{controller:f,verb:"extract",reconcile:v,autoReview:!0,onReviewExit:()=>{c.unmount(),s(0)},onCtrlC:()=>{c.unmount(),s(v.pending()?3:0)}})),{exitOnCtrlC:!1})})}async function Le(e,n,t,r,i){let a=N(e,n);if("error"in a)return P(r,a.error),2;let{plan:o,path:w}=a,f=t==="override"||t==="ci";if(n===void 0&&t==="interactive"&&r.isTTY&&!await r.confirm(`apply plan ${G(w)} for ${o.source_id} (created ${o.created})?`))return r.out(`not applying ${G(w)}`),0;let v=i.runDesignForUc??ie,s=i.runDesignForUc??null,c=i.sessionScript,_=(h,p)=>O(w,h,p),u=(h,p)=>W(w,h,p),E=T(e);if(E===o.head_pin){if(t==="agent"){let p=i.emitEvent??(()=>{});return j(e,B(o),w,v,p,r,D(t),_,o.archive_state)}let h=ee(o);if(t==="ci"&&h.length>0)return P(r,V(h.length)),2;if(r.out(`applying stored plan ${G(w)} for ${o.source_id} (${o.rows.length} row(s))`),!f)for(let p of ce({source_id:o.source_id,head:{status:"stored plan"},rows:o.rows,archive:(o.changeset??[]).filter(g=>g.kind==="ARCHIVE"),changed:!1,held:!!o.held},process.stdout.columns))r.out(p);return M(e,o.rows,f,r,v,_,o.changeset??[],D(t),o.held,o.archive_state,u,s,c,o.source_id,H(o.backing_path??o.remote_url,o.source_id))}if(r.out(`graph moved since this plan (${C(o.head_pin)} \u2192 ${C(E)}) \u2014 recomputing`),o.held)return Ce(e,o,r,i,t,v,!1);let m=Ie(o);if(m===null)return P(r,`stored plan for ${o.source_id} names no backing file or URL \u2014 re-run reconcile --from`),2;let d=z(e,o.source_id,m);if(d!==null)return P(r,`stored plan cannot replay: ${d}`),2;let R=await Se(e,o.source_id,m,r,i,!1,t==="interactive");if(!R)return 1;if(!R.changed)return Y(r,R,null,!1,i.emitEvent),0;if(t==="agent"){let h=i.emitEvent??(()=>{});return j(e,R,null,v,h,r,D(t))}let b=R.changeset.filter(h=>h.kind==="ARCHIVE");return t==="ci"&&b.length>0?(P(r,V(b.length)),2):M(e,R.rows,f,r,v,void 0,R.changeset,D(t),R.held,void 0,void 0,s,c,R.source_id,H(He(m),R.source_id))}function B(e,n=!1){return{source_id:e.source_id,changed:!0,head:{status:"unchanged",before:e.head_pin,after:e.head_pin},note:e.note,skipped_arms:e.skipped_arms,changeset:e.changeset??[],rows:n?e.rows.filter(t=>t.applied===void 0):e.rows,...e.held?{held:e.held}:{}}}async function je(e,n,t,r,i,a,o){let w=r.runDesignForUc??null,f=r.sessionScript,v=he(e,n);if(v===null)return null;if("error"in v)return P(t,v.error),2;let{plan:s,path:c}=v,_=s.rows.filter(d=>d.applied===void 0),u=ee(s),E=r.emitEvent??(()=>{});if(_.length===0&&u.length===0){t.out(`already reconciled \u2014 plan ${s.created} applied ${s.rows.length} row(s)`);let d=ye(I(e)).staleCount;return d>0&&(t.out(`${d} item(s) still stale \u2014 kane-cli maintain evolve --from-stale`),E({type:"stale_debt",count:d})),i==="agent"&&(F(E,B(s),c),E({...L})),0}let m=T(e);return m!==s.head_pin?(t.out(`plan ${s.created} superseded \u2014 graph moved (${C(s.head_pin)} \u2192 ${C(m)}); recomputing`),Ce(e,s,t,r,i,a,o)):(t.out(`resuming plan ${s.created} \u2014 ${_.length} pending row(s)${u.length>0?`, ${u.length} undecided archive item(s)`:""}`),o?(Y(t,B(s),null,!1,r.emitEvent),t.out(`plan stored: ${c}`),i==="agent"&&(F(E,B(s),c),E({...L})),0):i==="agent"?j(e,B(s),c,a,E,t,D(i),(d,R)=>O(c,d,R),s.archive_state):i==="ci"&&u.length>0?(P(t,V(u.length)),2):M(e,s.rows,i==="override"||i==="ci",t,a,(d,R)=>O(c,d,R),s.changeset??[],D(i),s.held,s.archive_state,(d,R)=>W(c,d,R),w,f,s.source_id,H(s.backing_path??s.remote_url,s.source_id)))}async function Ce(e,n,t,r,i,a,o){let w=r.runDesignForUc??null,f=r.sessionScript,v;if(n.held){let g=I(e),y=new Set(n.rows.filter(l=>l.held_ref!==void 0&&l.applied!==void 0).map(l=>l.held_ref)),k=[];for(let l of n.held.rows){if(y.has(l.temp_ref))continue;if(!l.matched_cid){k.push(l);continue}let $=g.tipOf(l.matched_cid);if(g.superseded.get($)===null){t.out(`dropped held "${l.title}" \u2014 its use-case was retired meanwhile`),r.emitEvent?.({type:"held_dropped",ref:l.temp_ref,title:l.title,reason:"target_retired"});continue}k.push($===l.matched_cid?l:{...l,matched_cid:$,uc:{...l.uc,matches_existing:{cid:$}}})}v={source_id:n.held.source_id,rows:k}}let s=Ie(n);if(s===null)return P(t,`stored plan for ${n.source_id} names no backing file or URL \u2014 re-run reconcile --from`),2;let c=z(e,n.source_id,s);if(c!==null)return P(t,`stored plan cannot replay: ${c}`),2;let _=r.seams??{reingest:fe(e,s,t,r),reextract:ae(e,{stage:v!==void 0,hostOut:g=>t.out(g),hostEmit:g=>{g.type!=="run_start"&&r.emitEvent?.(g)},...r.emitEvent?{}:{hostProgress:g=>process.stderr.write(g+`
4
+ `)}})},u;try{u=await(r.buildPlan??se)(e,n.source_id,_,{resumeHeld:v})}catch(g){return P(t,`reconcile failed: ${g instanceof Error?g.message:String(g)}`),1}if(i==="interactive"&&!o)for(let g of De(u,null))t.out(g);else Y(t,u,null,!1,r.emitEvent);let E=T(e),m=null;if(E!=null){let g={},y=new Set(u.changeset.filter(k=>k.kind==="ARCHIVE").map(k=>k.ref));for(let[k,l]of Object.entries(n.archive_state??{}))y.has(k)&&(g[k]=l);m=X(e,{version:2,source_id:u.source_id,...n.remote_url!==void 0?{remote_url:n.remote_url}:{backing_path:n.backing_path},head_pin:E,created:new Date().toISOString().replace(/[:.]/g,"-"),skipped_arms:u.skipped_arms,note:u.note,changeset:u.changeset,rows:u.rows,...u.held?{held:u.held}:{},...Object.keys(g).length>0?{archive_state:g}:{}}),t.out(`plan stored: ${m}`)}if(o){if(i==="agent"){let g=r.emitEvent??(()=>{});F(g,u,m),g({...L})}return 0}let d=r.emitEvent??(()=>{}),R=m?N(e,m).plan.archive_state:void 0,b=m?(g,y)=>O(m,g,y):void 0,h=m?(g,y)=>W(m,g,y):void 0;if(i==="agent")return j(e,u,m,a,d,t,D(i),b,R);let p=u.changeset.filter(g=>g.kind==="ARCHIVE"&&R?.[g.ref]===void 0);return i==="ci"&&p.length>0?(P(t,V(p.length)),2):M(e,u.rows,i==="override"||i==="ci",t,a,b,u.changeset,D(i),u.held,R,h,w,f,u.source_id,H(n.backing_path??n.remote_url,u.source_id))}async function be(e,n,t={},r=process.cwd()){let{telemetryBootstrap:i,telemetryEnvName:a}=await import("./bootstrap-MMRPAHWE.js"),o=i({verb:"reconcile",mode:typeof e.mode=="string"?e.mode:"interactive",contextRoot:q(r,".context"),env:a(),applyPlanPath:typeof e.apply=="string"?q(r,e.apply):void 0,write:!0,longSession:!0});e.mode==="agent"&&t.emitEvent?.({type:"run_start",session:o.ids.session_id});let w=await Ye(e,n,t,r);return w===1&&e.mode!=="agent"&&(n.err??n.out)(o.supportFooter()),await o.end({exit_code:w}),w}async function Ye(e,n,t={},r=process.cwd()){let i=e.apply!==void 0&&e.apply!==!1,a=typeof e.apply=="string"?e.apply:void 0;if(e.plan&&i)return P(n,"pass --plan OR --apply, not both"),2;let o=e.from!==void 0||!i,w=e.from!==void 0&&J(e.from);if(o&&(!e.from||!e.sourceId&&!w))return P(n,"reconcile needs --from <file|url> AND --source-id <id> (files only \u2014 a URL derives its own id) \u2014 see `kane-cli context list --type source` for ids"),2;if(e.from&&a!==void 0)return P(n,"pass --from OR --apply <path>, not both \u2014 a stored plan names its own source"),2;let f=we(r,n);if(!f)return 2;if(e.mode!==void 0&&!xe.has(e.mode))return Pe(`--mode must be interactive | agent | ci | override, got '${e.mode}'`);let v=e.mode==="agent"||e.mode==="ci"||e.mode==="override";if(i&&!v&&!n.isTTY)return P(n,"refusing to apply without a TTY to confirm \u2014 pass --mode override|ci"),2;let s=!e.plan,c="override";if(e.from){let y=Ae(e,n.isTTY);if(typeof y=="object")return y.code==="MODE_USAGE"?Pe(y.error):(P(n,y.error),2);c=y}let _=c==="override"||c==="ci";if(i&&!e.from){let{makeReconcileDeps:y}=await import("./reconcile-deps-UJ6KVUIS.js"),k=a===void 0?y({contextDir:f}).pending():null;if(k?.kind==="cards"){let $=e.mode??"interactive";return!n.isTTY||$!=="interactive"?(P(n,`a held changeset for ${k.source} awaits review (${k.count} change(s)) \u2014 resume in a terminal: kane-cli maintain reconcile --apply [HELD_REVIEW]`),2):(t.cardApplyMount??Ve)(f)}let l=e.mode??"interactive";return Le(f,a===void 0?void 0:q(r,a),l,n,t)}let u=Me(f,r,e.from,e.sourceId);if("error"in u)return P(n,u.error),2;if(!i){let{sessionsHoldingSource:y}=await import("./sessions-GIEXOCE4.js"),{holders:k,corrupt:l}=y(f,u.sourceId);if(l>0)return P(n,`cannot verify review holds \u2014 ${l} session file(s) unreadable; inspect with kane-cli context sessions list, clean with kane-cli context sessions clean, then retry [SESSIONS_UNREADABLE]`),2;if(k.length>0)return P(n,`session ${k[0]} holds item(s) for review pinned to ${u.sourceId} \u2014 finish that review first: kane-cli context extract --resume ${k[0]} [SOURCE_HELD]`),2}if(c==="interactive"&&!e.plan&&!i){let y=t.seams?.reingest??fe(f,u,n,t),k;try{k=await y(u.sourceId)}catch($){return P(n,$ instanceof Error?$.message:String($)),1}let l=k.status==="unchanged"?null:Re(f,u.sourceId);if(k.status!=="unchanged"&&!l)return n.out(`${u.sourceId} landed for the first time \u2014 extract it: kane-cli context extract --source ${u.sourceId}`),0;if(l){let x=await(t.chatMount??(async A=>{let{bindExtractInteractive:K}=await import("./extract-bind-VIPNGK2H.js");return K(A)}))({mode:"interactive",posture:"reconcile",source:u.sourceId,changeContext:l});if(x===3){let{sessionsHoldingSource:A}=await import("./sessions-GIEXOCE4.js");if(A(f,u.sourceId).holders.length===0)return 0}return x}}let E="remoteUrl"in u?{remoteUrl:u.remoteUrl}:{filePath:u.filePath},m=await Se(f,u.sourceId,E,n,t,!!e.plan||c==="interactive",c==="interactive"&&!e.plan);if(!m)return 1;let d=t.runDesignForUc??ie,R=t.runDesignForUc??null,b=t.sessionScript;if(!m.changed){let y=await je(f,u.sourceId,n,t,c,d,!!e.plan);if(y!==null)return y;if(Y(n,m,null,!1,t.emitEvent),c==="agent"){let k=t.emitEvent??(()=>{});F(k,m,null),k({...L})}return 0}let h=T(f),p=null;if(h!=null?p=X(f,{version:2,source_id:m.source_id,..."remoteUrl"in E?{remote_url:E.remoteUrl}:{backing_path:E.filePath},head_pin:h,created:new Date().toISOString().replace(/[:.]/g,"-"),skipped_arms:m.skipped_arms,note:m.note,changeset:m.changeset,rows:m.rows,...m.held?{held:m.held}:{}}):P(n,"no chain head after extract \u2014 plan not stored"),c==="agent"){let y=t.emitEvent??(()=>{});if(!s)return F(y,m,p),y({...L}),0;let k=p?(l,$)=>O(p,l,$):void 0;return j(f,m,p,d,y,n,D(c),k)}if(!s)return p&&n.out(`plan stored: ${p}`),0;let g=m.changeset.filter(y=>y.kind==="ARCHIVE");if(c==="ci"&&g.length>0)return p&&n.out(`plan stored: ${p}`),P(n,V(g.length)),2;if(p){n.out(`plan stored: ${p}`);let y=p;return M(f,Ke(f,y)??m.rows,_,n,d,(k,l)=>O(y,k,l),m.changeset,D(c),m.held,void 0,void 0,R,b,m.source_id,H(e.from,m.source_id))}return M(f,m.rows,_,n,d,void 0,m.changeset,D(c),m.held,void 0,void 0,R,b,m.source_id,H(e.from,m.source_id))}function Ke(e,n){let t=N(e,n);return"error"in t?null:t.plan.rows}async function dn(e,n={},t,r=process.cwd()){if(e.mode==="agent"){let{makeHeadlessIO:i}=await import("./headless-io-66RG5NN5.js"),a=t?i("ndjson","reconcile",t):i("ndjson","reconcile"),o={out:a.out,err:v=>a.event({type:"error",message:v}),isTTY:!1,confirm:async()=>!1,ask:async()=>""},{runWithChannel:w}=await import("./run-channel-RGH4WIQX.js"),f=2;try{f=await w({event:v=>a.event(v)},()=>be(e,o,{...n,emitEvent:v=>a.event(v)},r))}catch(v){f=1,a.event({type:"error",message:v instanceof Error?v.message:String(v)})}return a.done(f)}return be(e,ke(),n,r)}export{Ae as a,Me as b,D as c,U as d,be as e,dn as f};