@testmuai/kane-cli 0.8.1 → 0.8.2
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.
- package/dist/ChatSurface-B3ULYDYC.js +8 -0
- package/dist/{ChromeProfilePicker-AUU7JF6F.js → ChromeProfilePicker-T77E7ZSC.js} +1 -1
- package/dist/{CliFeedbackPrompt-4W74Y3UF.js → CliFeedbackPrompt-FQ2XV5DZ.js} +1 -1
- package/dist/{CliUploadProgress-6HL7WTEX.js → CliUploadProgress-TZ55LONO.js} +1 -1
- package/dist/{ConfigView-6BSCZP5Y.js → ConfigView-WWQMH36G.js} +1 -1
- package/dist/EvidenceViewOffer-L5FVBQNK.js +2 -0
- package/dist/FolderPicker-6Z3CYSHF.js +2 -0
- package/dist/{HelpView-TU7ED43J.js → HelpView-XXPCPJNF.js} +1 -1
- package/dist/{InfoBox-JLTMKVDE.js → InfoBox-SHBRHQX5.js} +1 -1
- package/dist/{LinksBox-LREUUJDV.js → LinksBox-ENNF7TDJ.js} +1 -1
- package/dist/{ProfilesView-W3GX2N2E.js → ProfilesView-CNF2FXF3.js} +1 -1
- package/dist/{ProjectPicker-SYQUJK2J.js → ProjectPicker-PVPLS642.js} +1 -1
- package/dist/{SaveSessionPrompt-MR5NJMRP.js → SaveSessionPrompt-4QP4GNGO.js} +1 -1
- package/dist/SingleShotApp-M3HNSUMZ.js +2 -0
- package/dist/{SummaryBox-UAYSVFB7.js → SummaryBox-HYNINDNN.js} +1 -1
- package/dist/TestMdRunView-ISOVQ7YP.js +2 -0
- package/dist/{WhoamiView-2YU76ASQ.js → WhoamiView-NN2HOK6H.js} +1 -1
- package/dist/app-client-ZCCNE3RV.js +2 -0
- package/dist/{app-download-AEEFQ63M.js → app-download-5UJMXPF3.js} +1 -1
- package/dist/{auth-HET3TBRI.js → auth-QKBTOWQX.js} +1 -1
- package/dist/{bind-STKXOUYI.js → bind-LVGP5KHO.js} +2 -2
- package/dist/bootstrap-RUJBMB2P.js +2 -0
- package/dist/bridge-QDPBIIOW.js +2 -0
- package/dist/{changelog-7OWRHFHZ.js → changelog-HBPBPR2O.js} +1 -1
- package/dist/{chat-controller-T2FAI55V.js → chat-controller-R4THYYPU.js} +1 -1
- package/dist/chunk-2E3ZWGIK.js +12 -0
- package/dist/{chunk-ZVHCQMJ6.js → chunk-2KH2JUGL.js} +2 -2
- package/dist/{chunk-ZIUAOEUC.js → chunk-2TYCUPCN.js} +1 -1
- package/dist/{chunk-FEJXWJ3L.js → chunk-2ZZDNPFN.js} +1 -1
- package/dist/{chunk-KFSUPQAG.js → chunk-3654GK6O.js} +43 -43
- package/dist/{chunk-RFR4ZKIC.js → chunk-3NHO5R4P.js} +2 -2
- package/dist/{chunk-3LJWYRAA.js → chunk-4II6VDXG.js} +1 -1
- package/dist/chunk-4J6DQFPC.js +4 -0
- package/dist/{chunk-SDPRO2LE.js → chunk-4U4OSOA4.js} +1 -1
- package/dist/chunk-5NIYYD7O.js +2 -0
- package/dist/{chunk-L7MXYCD7.js → chunk-5SNT2MK5.js} +1 -1
- package/dist/chunk-6J5T5FEY.js +2 -0
- package/dist/chunk-6N726QLP.js +349 -0
- package/dist/chunk-7F2ZV46B.js +2 -0
- package/dist/{chunk-BRHNRCEZ.js → chunk-7S3JZ6FQ.js} +1 -1
- package/dist/chunk-A2SQD2AY.js +4 -0
- package/dist/{chunk-AW2XUHH4.js → chunk-AJQT4IWZ.js} +1 -1
- package/dist/{chunk-6XX4LEVJ.js → chunk-AN2ZPHCE.js} +1 -1
- package/dist/{chunk-3POR47RC.js → chunk-ATGRRKEV.js} +2 -2
- package/dist/chunk-AXTPNZPX.js +2 -0
- package/dist/{chunk-RC52N7PC.js → chunk-BKVDAZEJ.js} +1 -1
- package/dist/{chunk-2WVKOZ6W.js → chunk-BPMSNGXQ.js} +1 -1
- package/dist/{chunk-UV462FZR.js → chunk-BSYX225I.js} +1 -1
- package/dist/{chunk-DZGCXKKI.js → chunk-CAMO26QU.js} +1 -1
- package/dist/chunk-ECZMYPLJ.js +19 -0
- package/dist/{chunk-65ZTD5SJ.js → chunk-FNS2EAA5.js} +2 -2
- package/dist/{chunk-7BZSCUPP.js → chunk-GNIFMQNK.js} +3 -3
- package/dist/chunk-GUVM6SZF.js +2 -0
- package/dist/{chunk-2BGUUWNF.js → chunk-HFFPPCZO.js} +2 -2
- package/dist/{chunk-T5Y6MOLM.js → chunk-HRZOFTV7.js} +1 -1
- package/dist/chunk-HWH3UYD6.js +4 -0
- package/dist/{chunk-EDSZJZFG.js → chunk-I7RQS65W.js} +1 -1
- package/dist/chunk-IUEEFGEW.js +11 -0
- package/dist/{chunk-DO5HAO3H.js → chunk-IV76ZXCY.js} +1 -1
- package/dist/{chunk-UXDL4XDL.js → chunk-IZ2FJYHG.js} +1 -1
- package/dist/{chunk-766WGMBU.js → chunk-J7KT44IC.js} +1 -1
- package/dist/{chunk-QW6EZC53.js → chunk-JEDLXUO5.js} +1 -1
- package/dist/chunk-JGOZUAMC.js +2 -0
- package/dist/{chunk-XO5ZH3ZR.js → chunk-JHKM7W5X.js} +1 -1
- package/dist/{chunk-IOFZSQAA.js → chunk-JJN76EXE.js} +1 -1
- package/dist/{chunk-YFYCCTSL.js → chunk-JUVQQP42.js} +1 -1
- package/dist/chunk-KKRNTSLL.js +6 -0
- package/dist/{chunk-IP2O264K.js → chunk-LDCLZR2U.js} +1 -1
- package/dist/chunk-LQQXPY5B.js +4 -0
- package/dist/{chunk-FMRSMN34.js → chunk-LVCY5IYI.js} +1 -1
- package/dist/{chunk-G7VQCS4J.js → chunk-LVN6VHFN.js} +1 -1
- package/dist/chunk-MMBBQ4OZ.js +2 -0
- package/dist/{chunk-QSDH5P7C.js → chunk-MTIC65NK.js} +1 -1
- package/dist/chunk-NHBYZCSX.js +4 -0
- package/dist/{chunk-GZPK6FRP.js → chunk-NRUD56FY.js} +1 -1
- package/dist/{chunk-GKYPNSQP.js → chunk-NXFAEDHV.js} +2 -2
- package/dist/{chunk-ELM6MXGJ.js → chunk-NXXJ56QA.js} +1 -1
- package/dist/{chunk-JJHG3BWO.js → chunk-O3AHFP3K.js} +1 -1
- package/dist/{chunk-FQLIW3LM.js → chunk-OAVPM6YJ.js} +1 -1
- package/dist/{chunk-QRZRSAZH.js → chunk-OJTCIZDK.js} +1 -1
- package/dist/{chunk-YJELGSKJ.js → chunk-OOEPLMKA.js} +1 -1
- package/dist/{chunk-6O3DDOP2.js → chunk-PXCMEI73.js} +1 -1
- package/dist/{chunk-C7HSWZP6.js → chunk-R4UCBA5R.js} +1 -1
- package/dist/chunk-RKXHVP2Z.js +2 -0
- package/dist/{chunk-KU6IXFGZ.js → chunk-RN4PKQFR.js} +1 -1
- package/dist/chunk-RUCSRS4C.js +5 -0
- package/dist/chunk-TAOHYWEO.js +2 -0
- package/dist/{chunk-TFPPEOAK.js → chunk-U5GHOGLM.js} +1 -1
- package/dist/chunk-UJZZDPDY.js +2 -0
- package/dist/{chunk-EWCAFKLX.js → chunk-UODLRQQ4.js} +1 -1
- package/dist/chunk-VK3NU742.js +21 -0
- package/dist/{chunk-DCY6R5DP.js → chunk-VPRNGWIY.js} +1 -1
- package/dist/{chunk-NX7TM662.js → chunk-WOEQDUJ6.js} +1 -1
- package/dist/{chunk-OMQCD3KR.js → chunk-WQPQNL4S.js} +1 -1
- package/dist/{chunk-HMYMSRA4.js → chunk-WV27D55O.js} +1 -1
- package/dist/{chunk-GCBKDX2J.js → chunk-WVCH66YH.js} +1 -1
- package/dist/{chunk-7JWKHKFU.js → chunk-YCLG3T5E.js} +1 -1
- package/dist/chunk-YGMC3FGJ.js +26 -0
- package/dist/{chunk-TKGUT425.js → chunk-YHYTCENI.js} +1 -1
- package/dist/{chunk-UDIQOJEL.js → chunk-YSSYT5F5.js} +1 -1
- package/dist/{chunk-OTTGS2TE.js → chunk-YTDSQAYN.js} +1 -1
- package/dist/{chunk-HCKH44I2.js → chunk-ZEDAPY7M.js} +1 -1
- package/dist/chunk-ZI6UIJUN.js +11 -0
- package/dist/{config-RS47F5SC.js → config-RLDXM5ZH.js} +1 -1
- package/dist/{credentials-OH6AVI6N.js → credentials-CALNKQMN.js} +1 -1
- package/dist/deps-bundle-GVHIMZ5E.js +2 -0
- package/dist/{deps-resolve-XC5S53DG.js → deps-resolve-T6P4EACP.js} +1 -1
- package/dist/{dispatch-SE5GY3Z2.js → dispatch-ECUEAMXS.js} +1 -1
- package/dist/doctor-SIBHJVGC.js +2 -0
- package/dist/evidence-ZVQHPELX.js +2 -0
- package/dist/evolve-cmd-JGCFTXWA.js +2 -0
- package/dist/extract-bind-EXW32RUY.js +10 -0
- package/dist/{extract-cmd-UZMEZMGP.js → extract-cmd-7IOLJJCL.js} +1 -1
- package/dist/gaps-cmd-WPCJPLGB.js +3 -0
- package/dist/{generate-headless-D3SVQ2AI.js → generate-headless-U4GTG234.js} +2 -2
- package/dist/index.js +61 -60
- package/dist/{ingest-cmd-EAE7N5RC.js → ingest-cmd-YYNAKI2U.js} +1 -1
- package/dist/interactive-bind-Y65XV4Y5.js +25 -0
- package/dist/{list-commands-MRXL5HGS.js → list-commands-3EROWJWV.js} +1 -1
- package/dist/login-flow-TRINUSBB.js +2 -0
- package/dist/mobile-prompts-TP3ODM5M.js +2 -0
- package/dist/{persist-recorded-session-TLDQ5HKP.js → persist-recorded-session-EHYT3PVN.js} +1 -1
- package/dist/{phase-seed-VFHIH6FL.js → phase-seed-DIRETNU6.js} +1 -1
- package/dist/{pipeline-UOM4LNAI.js → pipeline-5GOS2KV2.js} +1 -1
- package/dist/prepare-target-BUEOZVJV.js +2 -0
- package/dist/reconcile-cmd-TY3MWZL3.js +2 -0
- package/dist/reconcile-deps-6KTJHBMJ.js +4 -0
- package/dist/reconcile-engine-O7QEZVX6.js +2 -0
- package/dist/{recording-banner-4M7XHVGI.js → recording-banner-BWWFOJCR.js} +1 -1
- package/dist/registry-KXEDLM6X.js +2 -0
- package/dist/{require-project-folder-4UPQNEBJ.js → require-project-folder-CXDRRWEQ.js} +1 -1
- package/dist/resolve-run-intent-PZXEQTHC.js +7 -0
- package/dist/{resolver-UBOZLFFE.js → resolver-FTU5KO7H.js} +1 -1
- package/dist/{run-URPGHOQM.js → run-CMFBSYWF.js} +1 -1
- package/dist/run-WKHPVWUN.js +2 -0
- package/dist/{run-test-md-76ZPKXO6.js → run-test-md-7HGOZJSU.js} +2 -2
- package/dist/session-items-2ATN7VXG.js +2 -0
- package/dist/{skill-installer-CIS6GAYF.js → skill-installer-QNUDLGPD.js} +1 -1
- package/dist/{spawner-J67QR4QP.js → spawner-DQZRJIE6.js} +1 -1
- package/dist/tcg-generate-XKSTMCOG.js +2 -0
- package/dist/{testmd-actions-77ELR5UU.js → testmd-actions-IFRW7NGG.js} +1 -1
- package/dist/{tms-client-VD3B3SMU.js → tms-client-V3TR4QW3.js} +1 -1
- package/dist/token-refresh-FP6JFLXB.js +2 -0
- package/dist/{validate-basic-2GVSQ2R5.js → validate-basic-3CNUDDH7.js} +1 -1
- package/dist/{verdicts-TRSTJLCL.js → verdicts-NYCSBWUC.js} +1 -1
- package/dist/{version-check-O6PYTI4T.js → version-check-7TSAVA6V.js} +1 -1
- package/dist/walk-session-AINBHZKB.js +2 -0
- package/dist/with-telemetry-3DL7ZEZL.js +2 -0
- package/package.json +11 -11
- package/dist/ChatSurface-U37VZDCW.js +0 -8
- package/dist/EvidenceViewOffer-62XHEEGW.js +0 -2
- package/dist/FolderPicker-S7U2EN2M.js +0 -2
- package/dist/SingleShotApp-XOKVOM7C.js +0 -2
- package/dist/TestMdRunView-7UVSDAF4.js +0 -2
- package/dist/app-client-OEXESV4U.js +0 -2
- package/dist/bootstrap-44YKVWWE.js +0 -2
- package/dist/bridge-5Z3BIB77.js +0 -2
- package/dist/chunk-27U4PLPX.js +0 -2
- package/dist/chunk-2KDGIZED.js +0 -4
- package/dist/chunk-3PECJD6S.js +0 -11
- package/dist/chunk-7Q6M6P4X.js +0 -26
- package/dist/chunk-CTW2VQKS.js +0 -6
- package/dist/chunk-FNH55WSR.js +0 -19
- package/dist/chunk-GPG3FIN3.js +0 -21
- package/dist/chunk-HEAIJCGZ.js +0 -2
- package/dist/chunk-KCCSWEGA.js +0 -4
- package/dist/chunk-MA34UWKX.js +0 -4
- package/dist/chunk-MBF3FP5P.js +0 -5
- package/dist/chunk-MXHHMIO2.js +0 -349
- package/dist/chunk-QGKPLOUI.js +0 -2
- package/dist/chunk-RLRNLIRS.js +0 -2
- package/dist/chunk-TYLYFERW.js +0 -10
- package/dist/chunk-V2R3LCA3.js +0 -12
- package/dist/chunk-VGFTNLQQ.js +0 -2
- package/dist/chunk-W2JFDDIB.js +0 -2
- package/dist/chunk-YRFMPIU2.js +0 -4
- package/dist/doctor-FSECFZUU.js +0 -2
- package/dist/evidence-OYPHZUKI.js +0 -2
- package/dist/evolve-cmd-BCPNXAMV.js +0 -2
- package/dist/extract-bind-LLEASZAK.js +0 -10
- package/dist/gaps-cmd-IVXFPFAQ.js +0 -3
- package/dist/interactive-bind-ORMN2REX.js +0 -25
- package/dist/login-flow-QJQM3RHT.js +0 -2
- package/dist/mobile-prompts-TOX35ER6.js +0 -2
- package/dist/prepare-target-QYWIJIVQ.js +0 -2
- package/dist/reconcile-cmd-3H34KVVD.js +0 -2
- package/dist/reconcile-deps-XIH75ZLY.js +0 -4
- package/dist/reconcile-engine-UKWPG2LV.js +0 -2
- package/dist/registry-PYOTKZYZ.js +0 -2
- package/dist/resolve-run-intent-X72V3KJA.js +0 -7
- package/dist/run-2COODVX2.js +0 -2
- package/dist/tcg-generate-BDTRKY2A.js +0 -2
- package/dist/token-refresh-4BPAPXKK.js +0 -2
- package/dist/walk-session-CHJXHZMO.js +0 -2
- package/dist/with-telemetry-CQCWLVOC.js +0 -2
- /package/dist/{lifecycle-cmd-O2324GN6.js → lifecycle-cmd-HO5VL7AM.js} +0 -0
package/dist/chunk-CTW2VQKS.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as X,b as Y,c as Z,d as nn,e as en}from"./chunk-GZPK6FRP.js";import{b as tn,c as rn}from"./chunk-6IA6QMPH.js";import{m as Q,o as P}from"./chunk-56PAQAX5.js";import{a as Cn}from"./chunk-6YGTRKDT.js";import{e as kn}from"./chunk-UR6MHSHU.js";function sn(i){return{command:"start",...i}}function on(i,e,o){return{command:"run",run_id:i,kind:e,...o}}function an(i){return{command:"cancel",...i?{run_id:i}:{}}}function un(i){return{command:"ask_user_response",answer:i}}function dn(){return{command:"shutdown"}}var q=Symbol("run-queue-end"),z=class{items=[];waiting=null;ended=!1;error=null;push(e){if(this.waiting){let{resolve:o}=this.waiting;this.waiting=null,o(e)}else this.items.push(e)}end(){if(this.ended=!0,this.waiting){let{resolve:e}=this.waiting;this.waiting=null,e(q)}}fail(e){if(this.error=e,this.waiting){let{reject:o}=this.waiting;this.waiting=null,o(e)}}next(){return this.items.length>0?Promise.resolve(this.items.shift()):this.error?Promise.reject(this.error):this.ended?Promise.resolve(q):new Promise((e,o)=>{this.waiting={resolve:e,reject:o}})}},A=class{env;runner;log;sessionId;spawnFn;proc=null;activeRun=null;pendingReady=null;shuttingDown=!1;finalized=!1;exitInfo=null;exitedUnexpectedly=!1;exitResolve;exited;constructor(e){this.env=e.env,this.runner=e.runner,this.log=e.log,this.sessionId=e.sessionId,this.spawnFn=e.spawn??Y;let o;this.exited=new Promise(c=>{o=c}),this.exitResolve=o}async start(e){if(this.proc)throw new Error("PersistentRunner.start called twice");this.proc=this.spawnFn({env:this.env,runner:this.runner,log:this.log,sessionId:this.sessionId}),this.consume();let o=new Promise((c,g)=>{this.pendingReady={resolve:c,reject:g}});this.writeCommand(sn(e)),await o}async*run(e,o,c){if(!this.proc)throw new Error("PersistentRunner.run called before start");if(this.finalized)throw new Error(`v16-runner is not running (exited code=${this.exitInfo?.code??"null"}, signal=${this.exitInfo?.signal??"none"}) \u2014 cannot start run '${e}'`);if(this.activeRun)throw new Error(`PersistentRunner.run overlap: '${this.activeRun.runId}' still in flight`);let g=new z,w={runId:e,queue:g};this.activeRun=w,this.writeCommand(on(e,o,c));try{for(;;){let v=await g.next();if(v===q||(yield v,v.type==="run_end"&&(v.run_id===void 0||v.run_id===e)))break}}finally{this.activeRun===w&&(this.activeRun=null)}}sendUserResponse(e){this.writeCommand(un(e))}cancel(e){this.writeCommand(an(e))}kill(){this.proc?.child.kill("SIGTERM")}async shutdown(){this.shuttingDown=!0,this.proc&&(this.writeCommand(dn()),await this.exited)}get stderr(){return this.proc?.getStderr()??""}get diedUnexpectedly(){return this.exitedUnexpectedly}writeCommand(e){let o=JSON.stringify(e)+`
|
|
3
|
-
`;try{this.proc?.child.stdin?.write(o)}catch{}}async consume(){if(!this.proc)return;try{for await(let c of this.proc.events){if(c.type==="ready"){this.onReady();continue}this.routeEvent(c)}}catch(c){this.log?.("error","PERSISTENT_RUNNER_STREAM_ERROR","Runner stdout stream errored",{error:c instanceof Error?c.message:String(c)})}let{code:e,signal:o}=await this.proc.exited;this.onExit(e,o)}onReady(){if(this.pendingReady){let{resolve:e}=this.pendingReady;this.pendingReady=null,e()}}routeEvent(e){let o=this.activeRun;if(!o){this.log?.("warn","PERSISTENT_RUNNER_ORPHAN_EVENT","Runner event with no active run",{event_type:e.type});return}o.queue.push(e)}onExit(e,o){if(!this.finalized){if(this.finalized=!0,this.exitInfo={code:e,signal:o},this.shuttingDown||(this.exitedUnexpectedly=!0),this.exitResolve({code:e,signal:o}),this.pendingReady){let{reject:c}=this.pendingReady;this.pendingReady=null,c(new Error(`v16-runner exited before ready (code=${e}, signal=${o??"none"})`))}if(this.activeRun){let{queue:c}=this.activeRun;if(this.activeRun=null,this.shuttingDown)c.end();else{let g=this.proc?.getStderr()?.slice(-500)??"";c.fail(new Error(`v16-runner exited unexpectedly mid-run (code=${e}, signal=${o??"none"})${g?`
|
|
4
|
-
${g}`:""}`))}}}}};var p=kn(Cn(),1);function ln(i){let e={cdp_endpoint:i.cdp_endpoint,ws_endpoint:i.ws_endpoint,width:i.width,height:i.height,headless:i.headless,model:i.model,max_steps:i.max_steps,network_ws:i.network_ws,network_sse:i.network_sse,session_id:i.session_id};return i.device&&(e.device=i.device),i.auth&&(e.auth=i.auth),i.username&&(e.username=i.username),i.access_key&&(e.access_key=i.access_key),e}function j(i,e){let o=null,c=(g,w)=>{for(let v=0;v<g.length;v++){let x=g[v],h=[...w,v];e(x)&&(o===null||h.length>o.length)&&(o=h),x.children&&x.children.length>0&&c(x.children,h)}};return c(i,[]),o}function N(i,e,o){if(e.length===0)return[...i];let c=e[0],g=[...i],w=g[c];if(e.length===1)g[c]=o(w);else{let v=e.slice(1),x=N(w.children??[],v,o);g[c]={...w,children:x}}return g}function cn(){return{steps:[],maxOrdinal:0}}function Pn(i,e){if(e.type==="run_start"&&e.child_id)return e.environment?.resolution?{...i,resolution:e.environment.resolution}:i;if(e.type==="run_start"){let o=rn(i.runnerEnvironment,tn(e.environment));if(o)return{...i,runnerEnvironment:o,...o.resolution?{resolution:o.resolution}:{}}}if(e.type==="step_end"&&typeof e.ordinal=="number"&&e.id){let o={id:e.id,ordinal:e.ordinal,status:e.status,...e.kind?{kind:e.kind}:{},...typeof e.duration=="number"?{duration_ms:Math.round(e.duration*1e3)}:{},...typeof e.action_id=="string"&&e.action_id?{action_id:e.action_id}:{}};return{...i,steps:[...i.steps,o],maxOrdinal:Math.max(i.maxOrdinal,e.ordinal)}}return i}function V(i){let e=i.indexOf(": ");return e>0&&e<15?i.slice(e+2):i}function W(i){return i.map(e=>{let o=e.children?W(e.children):e.children;return e.status==="running"?{...e,status:"stopped",phase:void 0,children:o}:o!==e.children?{...e,children:o}:e})}function qn(i,e,o,c,g){let[w,v]=(0,p.useState)(!1),[x,h]=(0,p.useState)([]),[pn,T]=(0,p.useState)(null),[hn,D]=(0,p.useState)(null),[fn,I]=(0,p.useState)(null),[mn,J]=(0,p.useState)(null),[vn,G]=(0,p.useState)([]),[gn,H]=(0,p.useState)(null),[Rn,Sn]=(0,p.useState)(void 0),y=(0,p.useRef)(null),E=(0,p.useRef)(null),S=(0,p.useRef)(null),b=(0,p.useRef)(0),B=(0,p.useRef)(!1),$=(0,p.useRef)(cn()),U=(0,p.useRef)(null),yn=(0,p.useCallback)(async(m,_)=>{let K=U.current;if(K)try{await K}catch{}h([]),T(null),D(null),I(null),J(null),G([]),H(null),Sn(m.max_steps),v(!0),S.current=null,b.current=0,$.current=cn();let k=y.current;if(k&&E.current!==m.session_id){try{k.kill()}catch{}y.current=null,E.current=null,k=null}if(!k){let n=X();if(!n){I("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available."),v(!1);return}let d=nn({environment:_?.environment,mode:_?.mode,assertionMode:_?.assertionMode,finalValidation:_?.finalValidation,username:m.username,accessKey:m.access_key,sessionId:m.session_id});m.device?.platform&&await Z(d,m.device);let u=new A({env:d,runner:n,log:_?.log,sessionId:m.session_id});y.current=u,E.current=m.session_id,k=u,Q("runner",()=>{try{u.kill()}catch{}});let s=ln(m);try{await u.start(s)}catch(a){I(a instanceof Error?a.message:String(a)),v(!1),P("runner","Runner start failed"),y.current=null,E.current=null;return}}let F={...m};delete F.run_id,en(F,{environment:_?.environment});let En=`run-${m.run_index}`,In=m.mode==="replay"?"replay":"author",M=k,L=(async()=>{B.current=!1;for await(let n of M.run(En,In,F)){if(B.current)break;switch($.current=Pn($.current,n),n.type){case"run_start":if(n.child_id)break;if(S.current&&!S.current.isSingleFlow){let d=b.current;b.current++,h(u=>u.map((s,a)=>a===d?{...s,status:"running"}:s.status==="running"&&!s.children?.some(t=>t.status==="running")?{...s,status:s.children?.some(t=>t.status==="failed")?"failed":"passed"}:s))}break;case"bifurcation":{let d=n.flows??[],u=n.count??d.length,s={flows:d,isSingleFlow:n.is_single_flow??u<=1};J(s),S.current=s,b.current=0,h(d.map((a,t)=>({index:t+1,objective:a??`Flow ${t+1}`,status:"pending"})));break}case"step_start":{e?.("STEP_START",`Step ${n.index} started`,{index:n.index,objective:n.objective,child_id:n.child_id});let d=n.index,u=n.objective??`Step ${d}`,s=n.child_id,a=S.current&&!S.current.isSingleFlow;if(s)h(t=>{let r=j(t,l=>l.branchChildId===s)??j(t,l=>l.status==="running");return r?N(t,r,l=>{let f=(l.children??[]).map(R=>R.status==="running"&&R.childId===s?{...R,status:"stopped",phase:void 0}:R);return f.push({index:d,objective:u,status:"running",childId:s}),{...l,children:f}}):t});else if(a){let t=Math.max(0,b.current-1);h(r=>{let l=[...r];if(t>=l.length)return r;let f={...l[t]},C=[...f.children??[]].map(O=>O.status==="running"&&O.childId===void 0?{...O,status:"stopped",phase:void 0}:O);return C.push({index:d,objective:u,status:"running"}),f.children=C,f.status="running",l[t]=f,l})}else h(t=>{let r=W(t);return r.some(f=>f.index===d)?r.map(f=>f.index===d?{...f,status:"running",objective:u}:f):[...r,{index:d,objective:u,status:"running"}]});break}case"step_event":{e?.("STEP_EVENT",`Step ${n.index} ${n.event}`,{index:n.index,phase:n.event,action_type:n.action_type,detail:n.detail,child_id:n.child_id});let d=n.child_id,u=S.current&&!S.current.isSingleFlow;if(n.event==="cm_init"&&n.checkpoint_count!=null){G(s=>[...s,n.checkpoint_count]);break}if(n.event==="replay_started"){H({recordingLength:n.recording_length??0});break}if(n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&o?.(n.detail),d){let s=t=>{if(t.index!==n.index||t.childId!==d)return t;let r={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(r.objective=n.detail),n.action_type&&(r.actionType=n.action_type),{...t,...r}},a=t=>t.map(r=>{let l=s(r);return l!==r?l:r.children&&r.children.length>0?{...r,children:a(r.children)}:r});h(t=>t.map(r=>r.children?{...r,children:a(r.children)}:r))}else if(u){let s=Math.max(0,b.current-1);h(a=>{let t=[...a];if(s>=t.length)return a;let r={...t[s]},l=[...r.children??[]];if(!l.some(R=>R.index===n.index&&R.childId===void 0))l.push({index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type});else for(let R=0;R<l.length;R++){if(l[R].index!==n.index||l[R].childId!==void 0)continue;let C={phase:n.event};n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(C.objective=n.detail),n.action_type&&(C.actionType=n.action_type),l[R]={...l[R],...C}}return r.children=l,t[s]=r,t})}else h(s=>s.some(t=>t.index===n.index)?s.map(t=>{if(t.index!==n.index)return t;let r={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(r.objective=n.detail),n.action_type&&(r.actionType=n.action_type),{...t,...r}}):[...W(s),{index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type}]);break}case"step_end":{e?.("STEP_END",`Step ${n.index} ${n.status}`,{index:n.index,status:n.status,duration:n.duration,summary:n.summary,child_id:n.child_id}),c?.();let d=n.child_id,u=S.current&&!S.current.isSingleFlow;if(d){let s=t=>t.index===n.index&&t.childId===d?{...t,status:n.status,duration:n.duration,phase:void 0,objective:t.objective.startsWith("Step ")?V(n.summary||t.objective):t.objective}:t,a=t=>t.map(r=>{let l=s(r);return l!==r?l:r.children&&r.children.length>0?{...r,children:a(r.children)}:r});h(t=>t.map(r=>r.children?{...r,children:a(r.children)}:r))}else if(u){let s=Math.max(0,b.current-1);h(a=>{let t=[...a];if(s>=t.length)return a;let r={...t[s]},l=(r.children??[]).map(f=>f.index===n.index&&f.childId===void 0?{...f,status:n.status,duration:n.duration,phase:void 0,objective:f.objective.startsWith("Step ")?V(n.summary||f.objective):f.objective}:f);return r.children=l,t[s]=r,t})}else h(s=>s.map(a=>a.index===n.index?{...a,status:n.status,duration:n.duration,phase:void 0,objective:a.objective.startsWith("Step ")?V(n.summary||a.objective):a.objective}:a));{let a=S.current&&!S.current.isSingleFlow?Math.max(0,b.current-1):0,t=typeof n.ordinal=="number"&&n.id?{ordinal:n.ordinal,id:n.id}:void 0;i?.(n.index,a,n.child_id,t)}break}case"child_agent_start":{let d=n.objective??"",u=n.child_id;h(s=>{let a=j(s,t=>t.status==="running");return a?N(s,a,t=>({...t,objective:`${d} (branch)`,phase:`child: ${d.slice(0,50)}`,branchObjective:d,branchChildId:u})):s});break}case"child_agent_end":{let d=n.child_id,u=`child ${n.success?"done":"failed"}`;h(s=>{let a=j(s,t=>t.branchChildId===d);return a?N(s,a,t=>({...t,phase:u})):s.map(t=>t.phase?.startsWith("child:")?{...t,phase:u}:t)});break}case"describe_trigger":g?.(n);break;case"ask_user":T(n.question??"");break;case"run_end":h(d=>d.map(u=>u.status==="running"?{...u,status:n.status,phase:void 0}:u)),v(!1),D(n);break;case"error":v(!1),I(n.message??"Runner error"),h(d=>d.map(u=>u.status==="running"?{...u,status:"failed",phase:void 0}:u));break}}})().catch(n=>{if(y.current!==M)return;let u=[n instanceof Error?n.message:String(n)],s=M.stderr;s&&!u.join(`
|
|
5
|
-
`).includes(s)&&u.push(s),I(u.join(`
|
|
6
|
-
`)),v(!1),h(a=>a.map(t=>t.status==="running"?{...t,status:"failed",phase:void 0}:t)),P("runner","Runner died mid-run"),y.current=null,E.current=null});U.current=L,L.finally(()=>{U.current===L&&(U.current=null)})},[i,e,o,c,g]),wn=(0,p.useCallback)(m=>{y.current?.sendUserResponse(m),T(null)},[]),xn=(0,p.useCallback)(()=>{let m=y.current;m&&(m.cancel(),v(!1),T(null))},[]),bn=(0,p.useCallback)(async()=>{let m=y.current;if(m){try{await Promise.race([m.shutdown(),new Promise(_=>setTimeout(_,5e3))])}catch{}P("runner","Runner shut down"),y.current=null,E.current=null}},[]),_n=(0,p.useCallback)(()=>{h([]),D(null),I(null)},[]);return(0,p.useEffect)(()=>()=>{B.current=!0,P("runner","Component unmounted"),y.current=null,E.current=null},[]),{isRunning:w,steps:x,askingUser:pn,lastRunEnd:hn,runError:fn,bifurcationInfo:mn,cmInitCounts:vn,replayInfo:gn,maxSteps:Rn,startRun:yn,sendAnswer:wn,cancelRun:xn,shutdownRunner:bn,clearLastRun:_n,getEvidenceState:()=>$.current}}export{A as a,ln as b,cn as c,Pn as d,qn as e};
|
package/dist/chunk-FNH55WSR.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as N,d as G}from"./chunk-TYLYFERW.js";import{d as I,e as z}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{spawn as Pe}from"child_process";import{existsSync as Me}from"fs";import{homedir as _e}from"os";import{dirname as Q,join as D}from"path";import{access as ge,mkdir as W,readFile as he}from"fs/promises";import{homedir as ve}from"os";import{arch as be,platform as we}from"process";import{join as T}from"path";var ye=35,Ae="google_apis",xe="KaneCLI_Pixel_API35",Se="KaneAI_Pixel_API35";function ht(t){return t===Se?xe:t}var ke=1;function Te(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function De(){return{home:ve(),os:we,arch:be}}async function Y(t){try{return await ge(t),!0}catch{return!1}}var j=class{deps;constructor(e={}){this.deps={...De(),...e}}paths(){let e=T(this.deps.home,".testmuai","kaneai","mobile"),r=T(e,"android-sdk");return{root:r,emulatorDir:T(r,"emulator"),systemImageDir:T(r,"system-images",`android-${ye}`,Ae,Te(this.deps.os,this.deps.arch)),avdHome:T(e,"avd"),manifest:T(r,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await W(T(e,"platforms"),{recursive:!0}),await W(T(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await he(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==ke)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await Y(T(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await Y(T(e.systemImageDir,"system.img"))}}},Z;function L(){return Z??=new j,Z}var H="android",$e="http://127.0.0.1:4723/status",Ie=2e3,ee=12e4,Ne=1e3,Ee=3e5;var Oe=5,te="Run `kane-cli doctor --install` to install the managed Appium tree.",Re={device:"ready",unauthorized:"unauthorized",offline:"offline"};function Ce(t){let e={};for(let r of t){let o=r.indexOf(":");o<=0||(e[r.slice(0,o)]=r.slice(o+1))}return e}function Le(t){let e=[];for(let r of t.split(`
|
|
3
|
-
`)){let o=r.trim();if(!o||o.startsWith("*"))continue;let u=o.toLowerCase();if(u.startsWith("list of devices")||u.startsWith("adb server"))continue;let f=o.split(/\s+/),p=f[0],b=f[1];if(!p||!b||!p.startsWith("emulator-"))continue;let h=Ce(f.slice(2)),v=h.model?h.model.replace(/_/g," "):void 0;e.push({platform:H,kind:"emulator",id:p,displayName:v??p,state:Re[b]??"offline"})}return e}function ie(t){let e=[];for(let r of t.split(`
|
|
4
|
-
`)){let o=r.trim();o&&/^[A-Za-z0-9._-]+$/.test(o)&&(e.includes(o)||e.push(o))}return e}function Fe(t){for(let e of t.split(`
|
|
5
|
-
`)){let r=e.trim();if(!(!r||r==="OK"))return r}}function Be(t){let e=/^Version\s+(\S+)/m.exec(t);return e?.[1]?e[1].split("-")[0]:/Android Debug Bridge version\s+(\S+)/.exec(t)?.[1]}function Ue(t){let e=[];for(let r of t.split(`
|
|
6
|
-
`)){let o=r.trim();if(!o.startsWith("package:"))continue;let u=o.slice(8).trim();u&&!e.includes(u)&&e.push(u)}return e.sort()}function qe(t){let e=Number(t.trim());return Number.isInteger(e)&&e>0?e:void 0}function je(t){return[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))]}var He=[{match:/INSTALL_FAILED_VERIFICATION|verif(?:ier|ication)/i,hint:`Package verification blocked the install. Disable it for adb installs:
|
|
7
|
-
adb -s <device> shell settings put global verifier_verify_adb_installs 0`},{match:/INSTALL_FAILED_UPDATE_INCOMPATIBLE|INSTALL_FAILED_VERSION_DOWNGRADE|signatures do not match/i,hint:`A different build of this package is already installed. Uninstall it first:
|
|
8
|
-
adb -s <device> uninstall <package>`},{match:/INSUFFICIENT_STORAGE/i,hint:"The device is out of storage. Free space on the device and retry."}];function Ve(t){for(let{match:e,hint:r}of He)if(e.test(t))return r}function V(t,e,r=Oe){let o=t.toLowerCase(),u=e.filter(b=>b.toLowerCase().includes(o)),f=Math.max(6,Math.floor(o.length/2)),p=e.filter(b=>!u.includes(b)&&Je(b.toLowerCase(),o)>=f);return[...u,...p].slice(0,r)}function Je(t,e){let r=Math.min(t.length,e.length),o=0;for(;o<r&&t[o]===e[o];)o++;return o}function Ke(){return X($e,{signal:AbortSignal.timeout(Ie)}).then(t=>t.ok,()=>!1)}function Xe(t,e,r){Pe(t,e,{stdio:"ignore",detached:!0,...r?{env:{...process.env,...r}}:{}}).unref()}function ze(){return{exec:I,spawnDetached:Xe,fileExists:Me,env:process.env,home:_e(),os:process.platform,probeAppiumServer:Ke,now:()=>Date.now(),sleep:z,mobileDeps:{status:t=>N().status(t),environment:t=>N().environment(t)},sdkSuite:{status:()=>L().status(),environment:()=>L().environment(),emulatorPath:()=>{let t=L().paths().emulatorDir;return D(t,process.platform==="win32"?"emulator.exe":"emulator")},ensureSdkRootMarkers:()=>L().ensureSdkRootMarkers()}}}function ne(t={}){let e={...ze(),...t},r={},o=new Set;function u(i){return e.os==="win32"?`${i}.exe`:i}function f(){return e.os==="win32"?"appium.cmd":"appium"}function p(){let i=[];for(let n of["ANDROID_HOME","ANDROID_SDK_ROOT"]){let s=e.env[n];s&&s.trim()!==""&&i.push(s.trim())}return e.os==="darwin"?i.push(D(e.home,"Library","Android","sdk")):e.os==="win32"?i.push(D(e.home,"AppData","Local","Android","Sdk")):i.push(D(e.home,"Android","Sdk")),i}function b(i){let n=i==="adb"?"platform-tools":"emulator";return p().map(s=>D(s,n,u(i)))}async function h(i){let n=e.os==="win32"?"where":"which",s=await e.exec(n,[u(i)],{timeoutMs:5e3});if(s.code!==0)return null;let a=s.stdout.split(`
|
|
9
|
-
`)[0]?.trim();return a&&a!==""?a:null}async function v(i){if(i==="adb"){let s=G(e.env);if(s){let m=D(s.platformToolsDir,u("adb"));if(e.fileExists(m)){let c={path:m,source:"sdk"};return r[i]=c,c}return delete r[i],null}if((await e.mobileDeps.status("emulator")).installed){let m=await e.mobileDeps.environment("emulator");if(m.platformToolsDir){let c={path:D(m.platformToolsDir,u("adb")),source:"local"};return r[i]=c,c}}return delete r[i],null}if(i==="emulator"&&(await e.sdkSuite.status()).emulator){let a={path:e.sdkSuite.emulatorPath(),source:"local"};return r[i]=a,a}let n=await h(i);if(n){let s={path:n,source:"sdk"};return r[i]=s,s}for(let s of b(i))if(e.fileExists(s)){let a={path:s,source:"sdk"};return r[i]=a,a}return delete r[i],null}async function $(){let i=await v("adb");if(!i)throw new Error("Managed adb is not installed.\nRun `kane-cli doctor --install` to install the pinned Android platform-tools.");return i.path}async function O(i){let n=await e.exec(i,["devices","-l"],{timeoutMs:2e4});return Le(n.stdout)}async function d(i,n){let s=await e.exec(i,["-s",n,"shell","getprop","ro.boot.qemu.avd_name"],{timeoutMs:1e4});if(s.code===0){let m=s.stdout.split(`
|
|
10
|
-
`)[0]?.trim();if(m)return m}let a=await e.exec(i,["-s",n,"emu","avd","name"],{timeoutMs:1e4});if(a.code===0)return Fe(a.stdout)}async function l(i){let n=await v("emulator");if(!n)return[];let s=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4}),a=s.code===0?ie(s.stdout):[];if(o.clear(),(await e.sdkSuite.status()).emulator){let c=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4,env:{...e.env,...e.sdkSuite.environment()}});if(c.code===0)for(let A of ie(c.stdout))o.add(A),a.includes(A)||a.push(A)}return a.filter(c=>!i.has(c)).map(c=>({platform:H,kind:"emulator",id:c,displayName:c,state:"stopped",virtualName:c}))}async function g(){let i=await v("adb");if(!i)return[];let n=await O(i.path),s=new Set;for(let m of n){if(m.kind!=="emulator"||m.state!=="ready")continue;let c=await d(i.path,m.id);c&&(m.virtualName=c,m.displayName=c,s.add(c))}let a=await l(s);return[...n,...a]}function w(i,n){return[`${i} did not finish booting within ${ee/1e3}s.`,n?`It attached as ${n} but never reported sys.boot_completed=1.`:"It never attached to adb.","The emulator process is still running \u2014 check its window for errors.","Common causes: no hardware acceleration (install the Android Emulator","hypervisor driver / enable KVM), or a corrupt AVD (recreate it in","Android Studio's Device Manager)."].join(`
|
|
11
|
-
`)}async function S(i,n,s){let a=await v("emulator");if(!a)throw new Error("The Android `emulator` binary was not found, so AVDs cannot be booted.\nInstall it via Android Studio's SDK Manager (Android Emulator) and set ANDROID_HOME.");let m=new Set((await O(i)).map(F=>F.id)),c=o.has(n);c&&await e.sdkSuite.ensureSdkRootMarkers();let A=c?{...e.env,...e.sdkSuite.environment()}:void 0;e.spawnDetached(a.path,["-avd",n],A),s?.(`booting ${n}\u2026`);let M=e.now()+ee,x;for(;e.now()<M;){if(await e.sleep(Ne),!x){let _=(await O(i)).find(C=>C.kind==="emulator"&&!m.has(C.id));_&&(x=_.id,s?.(`${n} attached as ${x}, waiting for boot\u2026`));continue}if((await e.exec(i,["-s",x,"shell","getprop","sys.boot_completed"],{timeoutMs:1e4})).stdout.trim()==="1")return x}throw new Error(w(n,x))}async function y(i,n){let s=await $();if(i.state==="ready")return P(i,s);if(i.state==="unauthorized")throw new Error(`${i.displayName} (${i.id}) is UNAUTHORIZED. Accept the USB-debugging prompt on the device, then retry.`);if(i.state==="offline")throw new Error(`${i.displayName} (${i.id}) is offline. Reconnect it (USB) or re-run \`adb connect ${i.id}\` (wireless), then retry.`);let a=i.virtualName??i.id,m=await S(s,a,n);return P({...i,kind:"emulator",id:m,displayName:a,state:"ready",virtualName:a},s)}async function P(i,n){let[s,a,m]=await Promise.all([e.exec(n,["-s",i.id,"shell","getprop","ro.build.version.sdk"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abilist"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abi"],{timeoutMs:1e4})]),c=s.code===0?qe(s.stdout):void 0,A=je(a.code===0&&a.stdout.trim()!==""?a.stdout:m.stdout);return{...i,...c!==void 0?{androidApiLevel:c}:{},...A.length>0?{androidAbis:A}:{}}}async function k(i){let n=await $(),s=await e.exec(n,["-s",i.id,"shell","pm","list","packages","-3"],{timeoutMs:3e4});if(s.code!==0)throw new Error(`Could not list installed packages on ${i.id}: ${s.stderr.trim()||`adb exited ${s.code}`}`);return Ue(s.stdout)}async function R(i){let n;try{let{default:s}=await import("./adbkit-apkreader-ORZBGCJQ.js");n=(await(await s.open(i)).readManifest())?.package}catch(s){let a=s instanceof Error?s.message:String(s);throw new Error(`Could not read the package name from ${i} (${a}).
|
|
12
|
-
Pass the package name explicitly with --app <package>.`)}if(typeof n!="string"||n.trim()==="")throw new Error(`${i} has no package name in its manifest.
|
|
13
|
-
Pass the package name explicitly with --app <package>.`);return n.trim()}async function U(i,n,s){let a=await $();s?.(`installing ${n} on ${i.id}\u2026`);let m=await e.exec(a,["-s",i.id,"install","-r",n],{timeoutMs:Ee}),c=`${m.stdout}
|
|
14
|
-
${m.stderr}`;if(m.code===0&&!/\bFailure\b/i.test(c))return;let A=Ve(c),M=[`Installing ${n} on ${i.id} failed (adb exited ${m.code}).`,c.trim()];throw A&&M.push("",A),new Error(M.filter(x=>x!=="").join(`
|
|
15
|
-
`))}async function ue(i,n,s){if(n.kind==="package"){let a=await k(i);if(a.includes(n.value))return n.value;let m=V(n.value,a),c=[`${n.value} is not installed on ${i.displayName} (${i.id}).`];throw m.length>0?c.push("Close matches:",...m.map(A=>` ${A}`)):c.push("Pass a local .apk path to --app to install it instead."),new Error(c.join(`
|
|
16
|
-
`))}if(n.kind!=="apk"){let a=n.kind==="aab"?"Android app bundles are not directly installable; build an APK first.":n.kind==="apks"?"Split bundles are not supported yet.":`${n.kind} artifacts are not installable on Android.`;throw new Error(a)}return await U(i,n.value,s),R(n.value)}async function ce(){let i=await e.mobileDeps.status("emulator");return i.installed?{status:i,env:await e.mobileDeps.environment("emulator")}:null}async function me(i={}){let n=[],s=await ce(),a=await e.mobileDeps.status("emulator"),m=await v("adb");if(m){let _=await e.exec(m.path,["version"],{timeoutMs:1e4}),C=Be(_.stdout);n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"pass",detail:C?`platform-tools ${C} \xB7 ${m.path}`:m.path})}else n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"fail",detail:a.corrupt??"managed mobile dependencies are not installed",fixText:"Run `kane-cli doctor --install` to download the managed mobile deps bundle under ~/.testmuai/kaneai/mobile."});let c=!i.appiumUrl;s?.env.appiumHome?n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:"pass",detail:D(Q(s.env.appiumHome),"appium","node_modules",".bin",f())}):n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:c?"fail":"info",detail:i.appiumUrl?`managed Appium not required because --appium-url is set (${i.appiumUrl})`:a.corrupt??"managed Appium is not installed",...c?{fixText:te}:{}}),n.push({id:"android.uiautomator2",fixedByBundle:!0,label:"uiautomator2 driver",required:c,status:s?"pass":c?"fail":"info",detail:s?"bundled in the managed mobile deps":i.appiumUrl?"managed driver not required because --appium-url is set":"not installed in the managed deps tree",...s||!c?{}:{fixText:te}});let A=D(e.home,".testmuai","kaneai","mobile","trees");e.fileExists(A)&&n.push({id:"android.legacy-trees",label:"legacy toolchain trees",required:!1,status:"info",detail:`${A} predates the deps bundle \u2014 removed automatically by the next bundle install`});let M=await h("adb");M&&n.push({id:"android.system-adb",label:"system adb",required:!1,status:"info",detail:`${M} (ignored; managed adb always wins and may restart its server)`});let x=await h("appium");x&&n.push({id:"android.system-appium",label:"system Appium",required:!1,status:"info",detail:`${x} (ignored; managed Appium always wins)`});let F=await e.sdkSuite.status(),q=await v("emulator");if(F.emulator?n.push({id:"android.emulator",label:"emulator",required:!1,status:"pass",detail:`managed emulator \xB7 ${e.sdkSuite.emulatorPath()}`}):q?n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:`${q.path} (system install)`}):n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:"not installed, so stopped AVDs are not listed. Install it with the Android SDK (Android Studio \u2192 SDK Manager \u2192 Android Emulator)."}),e.os==="darwin"){let _=await e.exec("sysctl",["-n","kern.hv_support"],{timeoutMs:5e3});n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:_.code===0&&_.stdout.trim()==="1"?"Hypervisor.framework available":"Hypervisor.framework not reported \u2014 emulator boots may hang"})}else e.os==="linux"?n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:e.fileExists("/dev/kvm")?"/dev/kvm present":"/dev/kvm missing \u2014 enable KVM or emulator boots will hang"}):n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:"not checked on this host"});return n}async function pe(i){let n=await e.mobileDeps.environment("emulator"),s=[...n.dirs],a=r.emulator,m=a?.source==="sdk"?Q(a.path):void 0;return m&&!s.includes(m)&&s.push(m),{...n,dirs:s}}async function fe(i,n){let s=await $(),a=[];return n.appPackage&&a.push({label:`closing ${n.appPackage}`,file:s,args:["-s",i.id,"shell","am","force-stop",n.appPackage]}),n.shutdown&&a.push({label:`shutting down ${i.displayName}`,file:s,args:["-s",i.id,"emu","kill"]}),a}return{platform:H,available:()=>!0,checks:me,discover:g,prepare:y,listApps:k,ensureApp:ue,teardownPlan:fe,toolEnv:pe}}import{mkdtemp as re,readdir as Ge,rm as se,writeFile as We}from"fs/promises";import{tmpdir as oe}from"os";import{join as E}from"path";var ae="ios",Ye=12e4,Ze=3e5,Qe="an .ipa cannot be installed on a simulator \u2014 use a .zip of the .app build";function et(t){let e=/\.iOS-(\d+)-(\d+)$/.exec(t);return e?`${e[1]}.${e[2]}`:void 0}function tt(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e.devices??{})){let f=et(o);for(let p of u??[]){let b=typeof p.udid=="string"?p.udid:void 0,h=typeof p.name=="string"?p.name:void 0;if(!b||!h)continue;let v=p.state==="Booted"?"ready":p.state==="Shutdown"?"stopped":"offline";r.push({platform:ae,kind:"simulator",id:b,displayName:f?`${h} (iOS ${f})`:h,state:v,virtualName:h,...f?{iosVersion:f}:{}})}}return r}function it(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){if(u?.ApplicationType!=="User")continue;let f=u.CFBundleIdentifier??o;r.includes(f)||r.push(f)}return r.sort()}function nt(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){let f=u?.CFBundleIdentifier??o;f&&!r.includes(f)&&r.push(f)}return r.sort()}var J=16;function rt(t){return/^Xcode (\d+(?:\.\d+)*)/m.exec(t)?.[1]}async function st(t){let e=await re(E(oe(),"kane-app-unzip-")),r=()=>se(e,{recursive:!0,force:!0}),o=await I("unzip",["-q",t,"-d",e],{timeoutMs:10*6e4});if(o.code!==0)throw await r(),new Error(`Could not unpack ${t}: ${o.stderr.trim()||`unzip exited ${o.code}`}`);for(let u of[e,E(e,"Payload")]){let f;try{f=await Ge(u)}catch{continue}let p=f.find(b=>b.toLowerCase().endsWith(".app"));if(p)return{appPath:E(u,p),cleanup:r}}throw await r(),new Error(`${t} does not contain a .app bundle.`)}async function ot(t){let e=await re(E(oe(),"kane-plist-"));try{let r=E(e,"input.plist");await We(r,t);let o=await I("plutil",["-convert","json","-o","-",r],{timeoutMs:15e3});if(o.code!==0)throw new Error(`plutil could not convert simctl output: ${o.stderr.trim()}`);return o.stdout}finally{await se(e,{recursive:!0,force:!0})}}function at(){return{exec:I,os:process.platform,convertPlistToJson:ot,mobileDeps:{status:()=>N().status("simulator"),environment:()=>N().environment("simulator")}}}function de(t={}){let e={...at(),...t};async function r(d,l=3e4){return e.exec("xcrun",["simctl",...d],{timeoutMs:l})}async function o(){let d=await r(["list","devices","available","--json"]);return d.code!==0?[]:tt(d.stdout)}async function u(){return o()}async function f(d,l){let g=await e.exec("open",["-a","Simulator","--args","-CurrentDeviceUDID",d],{timeoutMs:15e3});g.code!==0&&l?.(`could not open Simulator.app (${g.stderr.trim()||`exit ${g.code}`}); the device is booted and the run continues headless`)}async function p(d,l){if(d.state!=="ready"&&d.state!=="stopped")throw new Error(`${d.displayName} (${d.id}) is ${d.state}; open Simulator.app to inspect it, then retry.`);d.kind==="simulator"&&await f(d.id,l),d.state==="stopped"&&l?.(`booting ${d.displayName}\u2026`);let g=await r(["bootstatus",d.id,"-b"],Ye);if(g.code!==0)throw new Error(`Could not boot ${d.displayName}: ${g.stderr.trim()||g.stdout.trim()||`simctl bootstatus exited ${g.code}`}`);let w=(await o()).find(S=>S.id===d.id);if(w?.state==="ready")return w;throw new Error(`${d.displayName} finished booting but simctl still reports it as ${w?.state??"missing"}.`)}async function b(d){let l=await r(["listapps",d.id]);if(l.code!==0)throw new Error(`Could not list apps on ${d.displayName}: ${l.stderr.trim()||`simctl exited ${l.code}`}`);return it(await e.convertPlistToJson(l.stdout))}async function h(d){let l=E(d,"Info.plist"),g=await e.exec("plutil",["-convert","json","-o","-",l],{timeoutMs:15e3});if(g.code!==0)throw new Error(`${d} Info.plist could not be read: ${g.stderr.trim()||`plutil exited ${g.code}`}`);let w;try{w=JSON.parse(g.stdout)}catch{throw new Error(`${d} Info.plist did not contain valid JSON from plutil.`)}if(!w.CFBundleIdentifier)throw new Error(`${d} has no CFBundleIdentifier in its Info.plist.`);return w.CFBundleIdentifier}async function v(d,l,g){if(l.kind==="package"){let y=await r(["listapps",d.id]);if(y.code!==0)throw new Error(`Could not list apps on ${d.displayName}: ${y.stderr.trim()||`simctl exited ${y.code}`}`);let P=nt(await e.convertPlistToJson(y.stdout));if(P.includes(l.value))return l.value;let k=V(l.value,P),R=[`${l.value} is not installed on ${d.displayName} (${d.id}).`];throw k.length>0?R.push("Close matches:",...k.map(U=>` ${U}`)):R.push("Pass a .zip of the .app bundle to install it instead."),new Error(R.join(`
|
|
17
|
-
`))}if(l.kind==="ipa")throw new Error(`${Qe}.`);if(l.kind!=="app"&&l.kind!=="zip")throw new Error(`${l.kind} artifacts are Android-only and not installable on iOS.`);let w=l.value,S;if(l.kind==="zip"){g?.(`unpacking ${l.value}\u2026`);let y=await st(l.value);w=y.appPath,S=y.cleanup}g?.(`installing ${w} on ${d.displayName}\u2026`);try{let y=await r(["install",d.id,w],Ze);if(y.code!==0)throw new Error(`Installing ${l.value} on ${d.displayName} failed: ${y.stderr.trim()||y.stdout.trim()}`);return await h(w)}finally{await S?.()}}async function $(d={}){let l=[],g=await e.exec("xcode-select",["-p"],{timeoutMs:1e4});if(g.code===0&&g.stdout.trim()!==""){let P=await e.exec("xcodebuild",["-version"],{timeoutMs:3e4}),k=P.code===0?rt(P.stdout):void 0;k?Number(k.split(".")[0])<J?l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`Xcode ${k} is older than the required Xcode ${J}`,fixText:`Update Xcode to ${J} or newer from the App Store.`}):l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"pass",detail:`Xcode ${k} \xB7 ${g.stdout.trim()}`}):l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`${g.stdout.trim()} has no usable xcodebuild (Command Line Tools only?)`,fixText:"Install full Xcode from the App Store, then run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`."})}else l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:"xcode-select reports no developer directory",fixText:"Install Xcode from the App Store, then run `xcode-select --install`."});let w=await e.exec("xcrun",["simctl","help"],{timeoutMs:15e3});l.push(w.code===0?{id:"ios.xcrun",label:"xcrun",required:!0,status:"pass",detail:"simctl reachable"}:{id:"ios.xcrun",label:"xcrun",required:!0,status:"fail",detail:`xcrun cannot run simctl: ${w.stderr.trim()||w.stdout.trim()||`exit ${w.code}`}`,fixText:"Run `xcode-select --install`, then confirm with `xcrun simctl list devices`. If Xcode is installed, `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer` repoints it."});let S=!d.appiumUrl,y=await e.mobileDeps.status();return l.push({id:"ios.xcuitest",fixedByBundle:!0,label:"xcuitest driver",required:S,status:y.installed?"pass":S?"fail":"info",detail:y.installed?"bundled in the managed mobile deps (with prebuilt WDA)":d.appiumUrl?"managed driver not required because --appium-url is set":y.corrupt??"the simulator deps bundle is not installed",...y.installed||!S?{}:{fixText:"Run `kane-cli doctor --install` to download the simulator deps bundle."}}),l}async function O(d,l){let g=[];return l.appPackage&&g.push({label:`closing ${l.appPackage}`,file:"xcrun",args:["simctl","terminate",d.id,l.appPackage]}),l.shutdown&&g.push({label:`shutting down ${d.displayName}`,file:"xcrun",args:["simctl","shutdown",d.id]}),g}return{platform:ae,available:()=>e.os==="darwin",checks:$,discover:u,prepare:p,listApps:b,ensureApp:v,teardownPlan:O,toolEnv:()=>e.mobileDeps.environment()}}var le=[ne(),de()];function B(){return le.filter(t=>t.available())}function Ft(){return B().map(t=>t.platform)}function Bt(){return le.map(t=>t.platform)}function dt(t){let e=t.toLowerCase();return B().find(r=>r.platform.toLowerCase()===e)}async function lt(t){let e=t?B().filter(o=>o.platform.toLowerCase()===t.toLowerCase()):B(),r=[];for(let o of e)try{r.push(...await o.discover())}catch{}return r}function ut(t,e){let r=e.toLowerCase();return t.id.toLowerCase()===r||t.virtualName?.toLowerCase()===r}function ct(t){let e=t.virtualName&&t.virtualName!==t.id?`${t.displayName} (${t.virtualName})`:t.displayName;return`${t.id} \u2014 ${e} [${t.platform} \xB7 ${t.kind} \xB7 ${t.state}]`}function K(t){return t.length===0?"":`
|
|
18
|
-
${t.map(e=>` ${ct(e)}`).join(`
|
|
19
|
-
`)}`}async function Ut(t,e={}){let r=e.discover??lt,o=e.providerFor??dt,u=await r(t.platform),f=h=>{let v=o(h.platform);return v?{ok:!0,target:h,provider:v}:{ok:!1,reason:"not-found",candidates:u,message:`No provider is registered for platform '${h.platform}'.`}};if(t.device){let h=u.filter(v=>ut(v,t.device));return h.length===0?{ok:!1,reason:"not-found",candidates:u,message:`No target matches --device '${t.device}'.`+(u.length>0?` Available:${K(u)}`:" No targets were found \u2014 run `kane-cli doctor`.")}:f(h.find(v=>v.state==="ready")??h[0])}let p=t.defaultTarget;if(p&&(!t.platform||t.platform.toLowerCase()===p.platform.toLowerCase())){let h=u.find(v=>v.platform===p.platform&&v.kind===p.kind&&(v.id===p.id||v.virtualName===p.id));return h?f(h):{ok:!1,reason:t.interactive?"needs-picker":"not-found",candidates:u,message:`The saved default target '${p.id}' (${p.platform} \xB7 ${p.kind}) is not connected. `+(t.interactive?"Pick a target to bind this run.":"Pass --device <id> explicitly \u2014 kane-cli never binds a different device on its own.")+(u.length>0?` Available:${K(u)}`:"")}}if(u.length===0)return{ok:!1,reason:"none-found",candidates:[],message:"No emulator or simulator found. Start an Android emulator or boot an iOS simulator, then run `kane-cli doctor`."};let b=u.filter(h=>h.state==="ready");return b.length===1?f(b[0]):t.interactive?{ok:!1,reason:"needs-picker",candidates:u,message:b.length===0?"No target is ready \u2014 pick one to prepare it.":"More than one target is ready \u2014 pick one."}:{ok:!1,reason:"ambiguous",candidates:u,message:(b.length===0?"No target is ready.":`${b.length} targets are ready.`)+` Pass --device <id>:${K(u)}`}}export{ht as a,Ft as b,Bt as c,dt as d,lt as e,Ut as f};
|
package/dist/chunk-GPG3FIN3.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
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 U,basename as q,join as y}from"path";function Z(e){let t=q(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function v(e){return y(U(e),`output-${Z(e)}`)}function Te(e){return y(v(e),"Result.md")}function T(e){return y(v(e),".internal")}function O(e){return y(T(e),"meta.json")}function Ae(e,t,n){return y(v(e),`${t}-${n}-code`)}function Ie(e){return y(v(e),"generated-code")}function Le(e){return v(e)+".staging"}function Q(e){return y(T(e),"steps")}function Pe(e,t,n){return y(Q(e),`${t}-${n}`)}import{existsSync as p,renameSync as S,rmSync as _}from"fs";function Ke(e){let t=`${e}.staging`,n=`${e}.bak`;if(!p(t))throw new Error(`atomicReplaceDir: staging missing: ${t}`);if(process.platform==="win32"){p(e)&&_(e,{recursive:!0,force:!0}),S(t,e);return}p(e)&&(p(n)&&_(n,{recursive:!0,force:!0}),S(e,n)),S(t,e),p(n)&&_(n,{recursive:!0,force:!0})}function Ge(e){let t=`${e}.staging`,n=`${e}.bak`;if(process.platform==="win32"){p(t)&&(p(e)?_(t,{recursive:!0,force:!0}):S(t,e));return}if(p(n)&&!p(e)){S(n,e),p(t)&&_(t,{recursive:!0,force:!0});return}p(n)&&p(e)&&_(n,{recursive:!0,force:!0}),p(t)&&p(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(n,o,r){super(`[${o}${r!=null?`:${r}`:""}] ${n}`);this.file=o;this.line=r;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","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"]),se=new Set(["mode","on_lock_conflict","tags","assurance"]);function L(e,t){let n=t.split(`
|
|
3
|
-
`),{global:o,bodyStartLine:r}=ae(e,n),{title:a,steps:s}=be(e,n,r);return{path:e,title:a,global:o,steps:s}}function ae(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let n=-1;for(let c=1;c<t.length;c++)if(t[c].trim()==="---"){n=c;break}if(n===-1)throw new d("frontmatter is missing closing '---'",e,1);let o=t.slice(1,n).join(`
|
|
4
|
-
`),r;try{r=j(o)??{}}catch(c){throw new d(`invalid YAML in frontmatter: ${c.message}`,e,1)}if(V(e,r,"frontmatter",1),r.on_lock_conflict!==void 0){let c=r.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,r,1),r.assurance!==void 0){let c=r.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(r.tags!==void 0){let c=r.tags,f=Array.isArray(c)?c.map(g=>String(g)).join(","):String(c);r.tags=ce(f,e,1)}if(r.target!==void 0&&(r.target=le(r.target,e,1)),r.app!==void 0&&(r.app=ge(r.app,e,1)),r.no_reset!==void 0&&typeof r.no_reset!="boolean")throw new d(`no_reset must be boolean: got ${typeof r.no_reset}`,e,1);let a=r.target,s=a==="emulator"||a==="simulator";if(s&&r.app===void 0)throw new d(`target: ${String(a)} needs an app \u2014 add \`app: <path-to-build | APPid>\``,e,1);if(!s&&r.app!==void 0)throw new d("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);if(!s&&r.no_reset!==void 0)throw new d("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);return{global:r,bodyStartLine:n+1}}function ce(e,t,n){let r=e.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(a=>a.trim().toLowerCase());if(r.length===0||r.some(a=>a.length===0))throw new d("tags must be a non-empty list of non-empty strings",t,n);return[...new Set(r)]}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,n){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,n):new d(`${fe} \u2014 got: ${JSON.stringify(e)}`,t,n)}function ge(e,t,n){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,n);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,n);return pe(o,t)}function pe(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 ue=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function me(e,t,n){let o=ue.exec(t);if(o)return{label:t.slice(0,o.index).trim(),verifies:o[1].split(",").map(a=>a.trim())};let r=t.lastIndexOf("@verifies");if(r>0&&/\s/.test(t[r-1])){let a=t.slice(r+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,n)}return{label:t,verifies:[]}}function be(e,t,n){let o,r=n;for(;r<t.length&&t[r].trim()==="";)r++;let a=r<t.length?/^#\s+(.+?)\s*$/.exec(t[r]):null;a&&(o=a[1],r++);let s=[];for(let f=r;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],u=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,u),{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,n){let o=0;for(;o<n.length&&n[o].trim()==="";)o++;let r,a=t;if(o<n.length&&/^```yaml\s*$/.test(n[o])){let l=o;a=t+l,o++;let m=-1;for(;o<n.length;){if(/^```\s*$/.test(n[o])){m=o;break}o++}if(m===-1)throw new d("step-config fenced ```yaml block is not closed",e,a);let b=n.slice(l+1,m).join(`
|
|
7
|
-
`);try{r=j(b)??{}}catch(w){throw new d(`invalid YAML in step config: ${w.message}`,e,a)}o=m+1}let s=we(n.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.*)$/,u=s.filter(l=>f.test(l.trim())).length>0;if(u&&c.length!==1)throw new d("step body must be exactly one of prose / @import",e,t);let h=!1,i;if(r){if(V(e,r,u?"step config (ref)":"step config (objective)",a),F(e,r,a),typeof r.optional=="boolean")h=r.optional;else if(r.optional!==void 0)throw new d(`step config 'optional' must be boolean: got ${typeof r.optional}`,e,a);let l={...r};delete l.optional,u&&delete l.variables,!u&&Object.keys(l).length>0&&(i=l)}if(u){let m=f.exec(c[0].trim())[1].trim(),b=r?.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,n=e.length;for(;t<n&&e[t].trim()==="";)t++;for(;n>t&&e[n-1].trim()==="";)n--;return e.slice(t,n)}function F(e,t,n){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,n);let r={};for(let[a,s]of Object.entries(o))if(typeof s=="string")r[a]={value:s};else if(s&&typeof s=="object"&&!Array.isArray(s)&&typeof s.value=="string")r[a]=s;else throw new d(`variable '${a}' must be a string or { value: ... } object`,e,n);t.variables=r}function V(e,t,n,o){for(let r of Object.keys(t)){if(ne.has(r))throw new d(`auth/identity keys are CLI-only: ${r}`,e,o);if(n==="frontmatter"){if(I.has(r))throw new d(`step-only key in frontmatter: ${r}`,e,o);if(!A.has(r))throw new d(`unknown config key: ${r}`,e,o)}else if(n==="step config (objective)"){if(!A.has(r)&&!I.has(r))throw new d(`unknown config key: ${r}`,e,o);if(oe.has(r))throw new d(`chrome config is global-only: ${r}`,e,o);if(ie.has(r))throw new d(`'${r}' is global-only: the whole run drives one app`,e,o);if(se.has(r))throw new d(`'${r}' is run-level and cannot be set per-step`,e,o)}else if(!re.has(r))throw new d(`step config on @import may only contain 'optional' / 'variables': got ${r}`,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 n of Object.keys(e).sort()){let o=e[n];o!==void 0&&(t[n]=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},n=JSON.stringify(x(t));return K("md5").update(e.body.text).update(`
|
|
9
|
-
`).update(n).digest("hex")}function G(e){let t={};for(let[o,r]of Object.entries(e.bindings??{}))t[o]={value:r.value,...r.secret===!0?{secret:!0}:{},...r.syntax?{syntax:r.syntax}:{}};let n=JSON.stringify(x({bindings:t,optional:e.optional}));return K("md5").update(e.path).update(`
|
|
10
|
-
`).update(n).digest("hex")}function ze(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 ke,readFileSync as ve}from"fs";import{dirname as Y}from"path";function D(e){try{return JSON.parse(ve(O(e),"utf8"))}catch{return null}}function Xe(e){let t=O(e.sourcePath);try{ke(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 n={commit_id:e.commitId};e.testId!==void 0&&(n.test_id=e.testId),e.testcaseId!==void 0&&(n.testcase_id=e.testcaseId),e.projectId!==void 0&&(n.project_id=e.projectId),e.folderId!==void 0&&(n.folder_id=e.folderId),e.orgId!==void 0&&(n.org_id=e.orgId),e.sessionName!==void 0&&(n.session_name=e.sessionName),e.plan!==void 0&&(n.plan=e.plan);try{_e(t,JSON.stringify(n,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"],Oe=["mode","on_lock_conflict","tags","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset"],k=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),n=B(t),o=Ee(n.global),r=[],a=[],s=[{file:t,kind:E(t)}],c=[];return H(n,a,r,[],t,{},s,c,{}),r.forEach((g,u)=>g.flatIndex=u+1),{rootPath:t,rootTitle:n.title,rootGlobal:n.global,rootSteps:n.steps,chrome:o,steps:r,unitFiles:s,warnings:c}}function at(e){let t=[];for(let n of e.unitFiles){if(n.kind!=="test")continue;let o=D(n.file);o&&t.push({file:n.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 k(`@import path not found: ${e}`);let t=Se(e,"utf8");return L(e,t)}function H(e,t,n,o,r,a,s,c,f){if(t.includes(e.path)){let i=[...t,e.path].map(l=>N(l)).join(" \u2192 ");throw new k(`cyclic reference: ${i}`)}t.push(e.path);let g=o.length===0,u=e.global.variables??{};for(let i of Object.keys(a))if(Object.hasOwn(u,i))throw new k(`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 k(`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},z=Me(h,i.config,a),M={flatIndex:0,objective:i.body.text,sourceFile:e.path,trace:[...o,$],config:z,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),n.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,n,[...o,m],r,i.body.bindings??{},s,c,f)}g||(f.pending=void 0),t.pop()}function Ee(e){let t={};for(let n of W){if(n==="target"){let o=P(e);o!==void 0&&(t.target=o);continue}e[n]!==void 0&&(t[n]=e[n])}return t}function Me(e,t,n){let o={};for(let[s,c]of Object.entries(e))W.includes(s)||je.includes(s)||(o[s]=c);let r={...o,...t??{}},a={...n,...e.variables??{},...t?.variables??{}};return Object.keys(a).length>0?r.variables=a:delete r.variables,r}export{Z as a,v 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,ze as p,D as q,Xe as r,k as s,st as t,at as u};
|
package/dist/chunk-HEAIJCGZ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as l}from"./chunk-RZ4F3BHX.js";import{openAsBlob as g}from"fs";import{basename as f}from"path";var h={emulator:"application/vnd.android.package-archive",simulator:"application/zip"},m=30*6e4,p=3e4;function y(n){let e=n??{},t=Array.isArray(e.apps)?e.apps:[],s=[];for(let r of t){let a=r??{},o=typeof a.app_id=="string"?a.app_id:void 0;o&&s.push({appId:o,name:typeof a.name=="string"&&a.name.trim()!==""?a.name:o,...typeof a.package=="string"?{packageName:a.package}:{},...typeof a.updated_at=="string"?{updatedAt:a.updated_at}:{}})}return{apps:s,total:typeof e.total=="number"?e.total:s.length}}function w(){return{fileBody:n=>g(n),request:l}}function A(n){if(!n||typeof n!="object")return null;let e=n,t=typeof e.app_id=="string"?e.app_id:void 0;return t?{appId:t,...typeof e.app_url=="string"?{appUrl:e.app_url}:{},...typeof e.url=="string"?{url:e.url}:{},cached:e.cached===!0,...typeof e.name=="string"?{name:e.name}:{}}:null}function b(n){if(!n||typeof n!="object")return null;let e=n,t=typeof e.app_id=="string"?e.app_id:void 0,s=typeof e.url=="string"?e.url:void 0;if(!t||!s)return null;let r=typeof e.name=="string"&&e.name.trim()!==""?e.name:`${t}.bin`;return{appId:t,name:r,url:s,...typeof e.package=="string"?{packageName:e.package}:{},...typeof e.type=="string"?{type:e.type}:{}}}function k(n){let e=n?.cause,t=e instanceof Error?e.message:typeof e=="string"?e:void 0,s=n instanceof Error?n.message:String(n);return t&&t!==s?`${s} (${t})`:s}var i=class extends Error{constructor(t,s){super(t);this.status=s;this.name="AppUploadError"}};async function u(n){let e=await n.text(),t;try{let s=JSON.parse(e);t=s.error??s.message??e}catch{t=e}return n.status===503&&t.includes("app service not configured")?"the controller has the app routes but its app service is not configured (LMAO_BASE_URL is unset) \u2014 ask whoever runs this environment to set it.":t}var d=class{constructor(e,t,s={}){this.baseUrl=e;this.auth=t;this.deps={...w(),...s}}deps;headers(){return{Authorization:typeof this.auth=="string"?`Bearer ${this.auth}`:`Basic ${Buffer.from(`${this.auth.username}:${this.auth.accessKey}`).toString("base64")}`}}async upload(e,t,s={}){let r=f(e),a=await this.uploadTarget(r,t);s.onProgress?.(`uploading ${r}\u2026`);let o=await this.deps.request(a.uploadUrl,{method:"PUT",headers:{"Content-Type":h[t]},body:await this.deps.fileBody(e),signal:s.signal??AbortSignal.timeout(m)});if(!o.ok)throw new i(`Uploading ${r} failed: ${o.status} ${await o.text()}`,o.status);let c=a.uploadUrl.split("?")[0];return this.register(r,t,c)}async uploadTarget(e,t){let s=`name=${encodeURIComponent(e)}&device_class=${encodeURIComponent(t)}`,r=await this.deps.request(`${this.baseUrl}/mobile-app/upload-url?${s}`,{method:"GET",headers:this.headers(),signal:AbortSignal.timeout(p)});if(!r.ok)throw new i(`Could not start the upload of ${e}: ${await u(r)}`,r.status);let a=await r.json();if(!a.upload_url)throw new i(`Could not start the upload of ${e}: no upload url.`);return{key:a.key??"",uploadUrl:a.upload_url}}async register(e,t,s){let r=await this.deps.request(`${this.baseUrl}/mobile-app/register`,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({name:e,device_class:t,url:s}),signal:AbortSignal.timeout(p)});if(!r.ok)throw new i(`Could not register ${e}: ${await u(r)}`,r.status);let a=A(await r.json());if(!a)throw new i(`Registering ${e} returned no app id.`);return a}async list(e){let t=new URLSearchParams({device_class:e.type});e.limit!==void 0&&t.set("limit",String(e.limit)),e.offset!==void 0&&t.set("offset",String(e.offset)),e.search&&t.set("search",e.search);let s=`${this.baseUrl}/mobile-app/list?${t.toString()}`,r;try{r=await this.deps.request(s,{method:"GET",headers:this.headers(),signal:AbortSignal.timeout(p)})}catch(a){throw new i(k(a))}if(!r.ok)throw r.status===404?new i("Browsing uploads needs a newer v16 controller than this environment is running.",404):new i(`Could not list your uploads: ${await u(r)}`,r.status);return y(await r.json())}async details(e){let t=await this.deps.request(`${this.baseUrl}/mobile-app/${encodeURIComponent(e)}`,{method:"GET",headers:this.headers(),signal:AbortSignal.timeout(p)});if(!t.ok)throw new i(`${e}: ${await u(t)}`,t.status);let s=b(await t.json());if(!s)throw new i(`${e} returned no download url.`);return s}async liveness(e){try{return await this.details(e),"alive"}catch(t){let s=t instanceof i?t.status:void 0;return s!==void 0&&s>=400&&s<500?"gone":"unknown"}}};export{h as a,y as b,A as c,b as d,k as e,i as f,d as g};
|
package/dist/chunk-KCCSWEGA.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as re,d as ie,e as se}from"./chunk-VGFTNLQQ.js";import{a as ne}from"./chunk-L2TV4G56.js";import{b as G,d as te}from"./chunk-6KPPGMO2.js";import{d as ee}from"./chunk-NVGBE2DR.js";var ce=new Set(["approve","edit","reject"]);function le(s,t){return`chatop:${t}:${s.target??"new"}:${s.op}:${s.seq}`}function de(s,t,b,k){let c=le(s,t),h=s.payload;switch(s.op){case"approve":return{kind:"approve",target:s.target,expectedCid:s.expected_cid,eventId:c};case"edit":{let{reason:o,...y}=h;return{kind:"edit",target:s.target,expectedCid:s.expected_cid,edit:y,reason:o,eventId:c}}case"enhance":return{kind:"enhance",target:s.target,expectedCid:s.expected_cid,edges:h.edges??[],eventId:c};case"reject":return{kind:"reject",target:s.target,expectedCid:s.expected_cid,reason:h.reason??"",redirectTo:h.redirect_to,eventId:c};case"add":{let o=h.proposal_item??{},y=String(o.label??"");if(!b.mint_gate.includes(y))throw new Error(`GATED_LABEL: cannot mint "${y}" (gate: ${b.mint_gate.join(", ")})`);let l=o.cite??{},p=o.conv_source_id??k;if(!p||typeof l.turn!="number"||!l.quote)throw new Error("INVALID_ADD: a chat add requires a conversation cite {turn, quote} and conv_source_id");let _=o.content,w=_&&typeof _=="object"&&!Array.isArray(_)&&Object.keys(_).length>0?_:null,v=new Set(["label","cite","conv_source_id","content","rationale","edges"]),C=w??Object.fromEntries(Object.entries(o).filter(([R])=>!v.has(R)));return{kind:"add",label:y,content:C,cite:{turn:l.turn,quote:l.quote},convSourceId:p,rationale:o.rationale,eventId:c}}}}function oe(s,t,b={}){let k=b.turn??0,c=[],h=[];for(let l of s)(l.op==="add"||l.op==="enhance")&&h.push(l);let o=new Map;for(let l of s){if(!ce.has(l.op)||!l.target)continue;let p=o.get(l.target)??[];p.push(l),o.set(l.target,p)}for(let[l,p]of o){let _=Math.max(...p.map(v=>v.seq)),w=p.filter(v=>v.seq===_);if(w.length>1){c.push({target:l,seq:_,kinds:w.map(v=>v.op)});continue}h.push(w[0])}return{chatOps:h.sort((l,p)=>l.seq-p.seq).map(l=>de(l,k,t,b.convSourceId)),ambiguous:c}}function ge(s){let t=[];return s.questions.forEach((b,k)=>{if(s.resolution[k])return;let c=b.recommended_index!=null?b.options[b.recommended_index]?.label:void 0;c!=null&&t.push(b.risk==="high"?`${c} \u203C`:c)}),t.length>3?`${t.slice(0,3).join(" \xB7 ")} \xB7 +${t.length-3} more`:t.join(" \xB7 ")}function ae(s){let t=s.text.replace(/\?+\s*$/,"");return t.length<=36?t:`${t.slice(0,33)}\u2026`}function pe(s){return s.use_cases??[]}var me={acs:"acceptance criteria",scenarios:"scenarios",exercises:"exercises",tests:"tests",gaps:"gaps"};function fe(s){let t=[],b=[],k=(o,y)=>{y.length!==0&&(b.push(o),t.push(...y))},c=o=>typeof o=="string"&&/^[a-z]{1,4}\d{1,4}$/i.test(o)?o:null,h=o=>{let y=c(o.automates)??"1 scenario",l=o.verifies??[],p=l.map(c).filter(v=>v!==null).slice(0,2),_=l.length-p.length,w=p.length?`${p.join(" ")}${_>0?` +${_}`:""}`:`${l.length} ACs`;return`covers ${y} \xB7 verifies ${w}`};return k("acs",(s.acs??[]).map(o=>({temp_ref:o.temp_ref,title:o.text,kind:"ac",badge:String(o.kind),extra:{...o.expected_answer?{expects:`${String(o.expected_answer.operator??"")} \xB7 ${String(o.expected_answer.operand??"")}`}:{},"scoped to":o.scoped_to??"(use-case)"}}))),k("scenarios",(s.scenarios??[]).map(o=>({temp_ref:o.temp_ref,title:o.title,kind:"scenario",badge:o.case_type,why:o.intent,depends_on_hint:o.depends_on??[],extra:{technique:o.technique_notes}}))),k("exercises",(s.exercises??[]).map(o=>({temp_ref:c(o.scenario)??"wiring",title:`${c(o.scenario)??"scenario"} exercises ${c(o.ac)??"1 AC"}`,kind:"exercise",badge:"wires",why:o.rationale}))),k("tests",(s.tests??[]).map(o=>({temp_ref:o.temp_ref,title:o.title,kind:"test",why:h(o),depends_on_hint:o.reuses??[],extra:{automates:String(o.automates??"?"),verifies:(o.verifies??[]).join(", "),check:o.check?`${String(o.check.kind)} vs ${String(o.check.verified_against)}`:"?"}}))),k("gaps",(s.gaps??[]).map(o=>({temp_ref:o.temp_ref??o.ref??"?",title:String(o.question?.header??o.kind),kind:"gap",badge:o.kind,why:o.risk_rationale}))),{items:t,heading:b.join(" + ")||"design"}}function ve(s={}){let t={turns:[],thinking:re(),pending:null,confirm:null,status:"idle",ledger:[],activeTurn:null,stream:null,checkpoint:!1},b=e=>{let n=[],r=e.minted.map(a=>a.slug).filter(Boolean);r.length&&n.push(`added ${r.join(", ")}`);let i=e.applied.length-e.minted.length;return i>0&&n.push(`${i} change${i===1?"":"s"} applied`),e.staleDelta.length&&n.push(`stales ${e.staleDelta.length}`),n.join(" \xB7 ")||"no changes"},k=[];s.onRender&&k.push(s.onRender);let c=0,h=0,o=null,y=null,l=null,p=[],_=0,w=e=>{if(!(!l||!s.contextDir||!e.trim()))try{let n=s.refreshGraph?.()??s.graph;if(!n)return;te({contextDir:s.contextDir,graph:n,sourceId:l,text:e,by:s.by??{kind:"human",id:"owner"}})}catch{}},v=e=>{if(!l||!s.contextDir)return;let n=s.refreshGraph?.()??s.graph,r=n?.heads.get(l),i=n?.convChains.get(l);if(!n||typeof r!="string"||!i)return;let a=n.getNode(r)?.content?.blob,u=typeof a=="string"?ee(s.contextDir,a)?.toString("utf8")??"":"";if(u)for(let f of e){if(f.kind!=="add"||f.convSourceId!==l)continue;let Q=G(u,f.cite.turn);if(!(Q!==null&&Q.includes(f.cite.quote)))for(let $=i.turns;$>=1;$--){let W=G(u,$);if(W!==null&&W.includes(f.cite.quote)){f.cite={...f.cite,turn:$};break}}}},C=null,R=new Map,U=e=>JSON.stringify([e.id,e.text,e.options.map(n=>n.label)]),T=null,z=new Map,B=new Map,H=null,m=()=>{I&&(clearTimeout(I),I=null);for(let e of k)e()},I=null,K=()=>{I||(I=setTimeout(()=>{I=null;for(let e of k)e()},80))},d=e=>{t.ledger.push(e)},O=null,P=!1,N=(e=!1)=>{O?d({kind:"agent",text:O}):e&&P&&d({kind:"note",text:'chat to refine ("looks good" approves; /done finishes)'}),O=null,P=!1},ue=()=>{O=null,P=!1},q=null,F=e=>{if(q){if(e)for(let n of q.items){let r=e.get(n.temp_ref);r&&(n.logical_id=r)}d({kind:"turn",...q}),q=null}},j=()=>{F(),t.activeTurn&&(t.activeTurn=null)},J=(e,n)=>n.choice||(n.selected_index!=null?e.options[n.selected_index]?.label??"?":"?"),L=()=>{let e=t.pending;if(!e)return;if(!e.resolution.every(Boolean)){e.cursor=e.resolution.findIndex(i=>i===null);return}let n=e.questions.map((i,a)=>{let u=e.resolution[a];return u.form==="deferred"?{id:i.id,selected_index:null,free_text:null}:{id:i.id,selected_index:u.selected_index,free_text:u.free_text}});t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now());let r=C;C=null,r?.(n)},A=(e,n)=>{let r=t.pending,i=r.questions[e],a=r.resolution[e];r.resolution[e]=n;let u=ae(i);a?d({kind:"answer",receipt:{form:"changed",qNum:e+1,stub:u,choice:J(i,n),prev:a.choice}}):n.form==="deferred"?d({kind:"answer",receipt:{form:"deferred",qNum:e+1,stub:u}}):d({kind:"answer",receipt:{form:n.form,qNum:e+1,stub:u,choice:J(i,n)}})},V=()=>{let e=t.pending;e&&(e.questions.forEach((n,r)=>{e.resolution[r]||A(r,{form:"deferred",selected_index:null,free_text:null,choice:""})}),L())},E=new Map,Y=e=>{E.clear();let n={high:0,med:1,low:2};return e=e.map((r,i)=>({q:r,i})).sort((r,i)=>(n[r.q.risk]??3)-(n[i.q.risk]??3)||r.i-i.i).map(({q:r})=>r),{questions:e,cursor:0,resolution:e.map(()=>null)}};return{state:t,explainLines(e){if(!s.explain||!s.graph||s.contextDir===void 0)return null;let n=s.explain(s.contextDir,s.graph,e);return n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(r=>` [${r.kind}] ${r.rationale??r.detail}`)]:null},explainRef(e){if(!s.explain||!s.graph||s.contextDir===void 0){d({kind:"note",text:"explain isn't available here"}),m();return}let n=s.explain(s.contextDir,s.graph,e),r=n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(i=>` [${i.kind}] ${i.rationale??i.detail}`)].join(`
|
|
3
|
-
`):`unknown ref: ${e}`;d({kind:"note",text:r}),m()},subscribe(e){return k.push(e),()=>{let n=k.indexOf(e);n>=0&&k.splice(n,1)}},submit(e){if(t.confirm&&(t.confirm=null),!t.pending){if(!o){t.turns.push({role:"user",text:e}),d({kind:"user",text:e}),t.notice="the agent isn't running \u2014 nothing sent",m();return}for(t.notice=void 0,t.checkpoint=!1,N(),t.turns.push({role:"user",text:e}),d({kind:"user",text:e}),w(e),t.status="streaming",t.busySince=Date.now(),t.error=void 0,h+=1;p.length>0;)h+=1,o({type:"user_message",message_id:`u${h}-receipt`,text:p.shift()});o({type:"user_message",message_id:`u${h}`,text:e}),m()}},attachSender(e){let n=o;return o=e,()=>{o=n}},attachOnCommitted(e){y=e},attachConversationSource(e){l=e},attachSession(e){s.session=e},holdReceipt(e){p.push(e),t.checkpoint=!0,m()},drainHeldReceipts(){return p.splice(0,p.length)},peekHeldReceipts(){return[...p]},submitAnswer(e,n){let r=t.pending,i=r?.questions[e],a=i?.options[n]?.label;!r||!i||a==null||(A(e,{form:"answered",selected_index:n,free_text:null,choice:a}),L(),m())},submitFreeText(e,n){let r=t.pending,i=r?.questions[e],a=n.trim();!r||!i||!a||(A(e,{form:"answered",selected_index:null,free_text:a,choice:a}),L(),m())},deferBatch(e){let n=t.pending;if(!n||!C)return;n.questions.forEach((i,a)=>{let u=n.resolution[a];u&&u.form==="answered"&&R.set(U(i),u)}),t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now()),d({kind:"note",text:`questions set aside \u2014 source ${e.source_id} landed; the agent reads it next`});let r=C;C=null,r({deferred:!0,ingested:e}),m()},submitAnswerWithText(e,n,r){let i=t.pending,a=i?.questions[e],u=a?.options[n]?.label;if(!i||!a||u==null)return;let f=r.trim();A(e,{form:"answered",selected_index:n,free_text:f||null,choice:f?`${u} \u2014 ${f}`:u}),L(),m()},toggleOption(e,n){let r=t.pending?.questions[e];if(!r||r.options[n]==null)return;let i=E.get(e)??new Set;i.has(n)?i.delete(n):i.add(n),E.set(e,i),m()},multiSelection(e){return[...E.get(e)??[]].sort((n,r)=>n-r)},confirmMulti(e){let n=t.pending,r=n?.questions[e];if(!n||!r)return;let i=[...E.get(e)??[]].sort((u,f)=>u-f).map(u=>r.options[u]?.label).filter(u=>u!=null);if(i.length===0)return;E.delete(e);let a=i.join(", ");A(e,{form:"answered",selected_index:null,free_text:a,choice:a}),L(),m()},goWithRecommendations(){let e=t.pending;if(!e)return{picks:""};let n=ge(e),r=null;return e.questions.forEach((i,a)=>{if(e.resolution[a])return;let u=i.recommended_index,f=u!=null?i.options[u]?.label:void 0;if(f==null){r===null&&(r=a);return}A(a,{form:"assumed",selected_index:u,free_text:null,choice:f})}),r!==null?(e.cursor=r,m(),{blocked:r}):(L(),m(),{picks:n})},reopenQuestion(){let e=t.pending;if(!e)return;let n=e.cursor<0?e.questions.length:e.cursor;for(let r=n-1;r>=0;r--)if(e.resolution[r]){e.cursor=r,m();return}},continueParked(){if(o){for(t.checkpoint=!1,d({kind:"continued"});p.length>0;)h+=1,o({type:"user_message",message_id:`u${h}-receipt`,text:p.shift()});h+=1,o({type:"user_message",message_id:`u${h}`,text:"continue"}),t.status="streaming",t.busySince=Date.now(),m()}},note(e){d({kind:"note",text:e}),m()},aliasOf(e){return B.get(e)},registerAliases(e){for(let n of e)B.set(n.ref,n.cid);F(new Map(e.filter(n=>n.id).map(n=>[n.ref,n.id]))),m()},setWorking(e){if(e!=null){if(t.status!=="idle"&&t.status!=="working")return;t.status==="idle"&&(t.busySince=Date.now()),t.status="working",t.workingLabel=e}else{if(t.status!=="working")return;t.status="idle",t.workingLabel=void 0,t.busySince=void 0}m()},ledger(e){e.kind==="commit"&&F(),(e.kind==="pause"||e.kind==="error"||e.kind==="summary")&&(j(),N()),(e.kind==="summary"||e.kind==="pause")&&(t.stream=null),d(e),e.kind==="commit"&&(e.ok?N(!0):ue()),m()},senderAlive(){return o!=null},completeSession(){V(),o?.({type:"session_complete"}),t.status="idle",t.busySince=void 0,m()},requestPause(){V(),t.status="pausing",t.busySince=void 0;let e=o;Promise.resolve().then(()=>e?.({type:"pause"})),m()},ask(e){t.pending=Y(e),z=new Map(e.map((r,i)=>[r.id,i+1])),t.status="awaiting-input",t.busySince=void 0;let n=new Promise(r=>{C=r});if(R.size>0){let r=0;e.forEach((i,a)=>{let u=U(i),f=R.get(u);f&&(R.delete(u),A(a,{...f}),r+=1)}),r>0&&d({kind:"note",text:`your earlier answer${r>1?"s are":" is"} pre-filled \u2014 press enter to send, or pick a different answer`})}return m(),n},attachIngest(e){let n=T;return T=e,()=>{T===e&&(T=n)}},canIngest(){return T!==null},async ingestAttach(e){let n=T,r=e.trim();if(!n||!r)return;let i;try{i=await n(r)}catch(a){i={ok:!1,error:a instanceof Error?a.message:String(a)}}i.ok||(d({kind:"note",text:i.error??"the source could not be ingested"}),m())},noteCoercion(e,n){d({kind:"answer",receipt:{form:"assumed",qNum:z.get(e.id)??0,stub:ae(e),choice:n,note:"your typed answer couldn't be used here"}}),m()},onAgentEvent(e){switch(e.type){case"reasoning_delta":case"reasoning_done":case"tool_activity":case"decision_activity":{let n=t.thinking;if(t.thinking=se(n,e),t.thinking!==n){if(e.type==="reasoning_done"&&e.present)d({kind:"thinking",tookMs:e.took_ms});else if(e.type==="tool_activity"&&e.status!=="started")d({kind:"tool",name:e.name,status:e.status==="done"?"ok":e.status,detail:e.detail});else if(e.type==="decision_activity"){let r=`\xB7 ${ie(e)}`,i=t.ledger.length-1;for(;i>=0&&t.ledger[i].kind==="tool";)i--;let a=t.ledger[i];a&&a.kind==="note"&&a.text===r||d({kind:"note",text:r})}}if(e.type==="reasoning_delta"){K();return}break}case"usage":t.credits={turn:e.credits,total:e.total_credits};break;case"text_delta":{let n=H;if(n&&(e.turn_id<n.turn_id||e.turn_id===n.turn_id&&e.attempt<n.attempt))return;(!n||n.turn_id!==e.turn_id||n.attempt!==e.attempt)&&(H={turn_id:e.turn_id,attempt:e.attempt},t.stream={text:""}),t.stream={text:(t.stream?.text??"")+e.text},K();return}case"progress":break;case"proposal":{c+=1,j(),t.stream=null,t.busySince&&(d({kind:"note",text:`\u2713 done in ${Math.max(1,Math.round((Date.now()-t.busySince)/1e3))}s`}),t.busySince=void 0);let n=pe(e.proposal),r=s.dedupFlags?.(e.proposal);if(r)for(let i of n){let a=r.get(i.temp_ref);a&&(i.matches_existing=a)}t.turns.push({role:"agent",turnIndex:c,items:n,text:e.narrative}),O=e.narrative??null,P=!0,t.activeTurn={turnIndex:c,heading:"use-cases",items:n},q={turnIndex:c,heading:"use-cases",items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"design":{c+=1,j(),t.stream=null,t.busySince&&(d({kind:"note",text:`\u2713 done in ${Math.max(1,Math.round((Date.now()-t.busySince)/1e3))}s`}),t.busySince=void 0);let{items:n,heading:r}=fe(e.design),i=e.design.phase==="wiring"?"acceptance criteria + exercises":r.split(" + ").map(a=>me[a]??a).join(" + ");d({kind:"banner",text:`designing: ${i}`}),t.turns.push({role:"agent",turnIndex:c,items:n,itemsHeading:r,text:e.narrative}),O=e.narrative??null,P=!0,t.activeTurn={turnIndex:c,heading:r,items:n},q={turnIndex:c,heading:r,items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"ask_user":t.pending=Y(e.questions),t.status="awaiting-input",t.busySince=void 0;break;case"chat_ops":{c+=1,j(),t.stream=null,t.status==="streaming"&&(t.status="idle",t.busySince=void 0);let n=e.chat_ops??e,r=Array.isArray(n.ops)?n.ops:[],i=n.text??e.text??"",a=s.refreshGraph?.()??s.graph,u=g=>B.get(g)??g,f=r.map(g=>{if(!g.target)return g;let x=u(g.target),S=g.expected_cid;if(S==null&&a){let Z=a.resolve(x);Z&&(S=a.tipOf(Z.cid))}let D=g.payload?.redirect_to,M=D&&u(D);return x===g.target&&S===g.expected_cid&&M===D?g:{...g,target:x,expected_cid:S,...M!==D?{payload:{...g.payload,redirect_to:M}}:{}}}),Q;try{if(!Array.isArray(n.ops))throw new Error("the agent sent an unreadable change set (no ops array) \u2014 say it again in different words");Q=oe(f,s.descriptor??{mint_gate:[]},{turn:c,...l?{convSourceId:l}:{}})}catch(g){t.error=g instanceof Error?g.message:String(g),t.turns.push({role:"agent",turnIndex:c,text:i,narration:t.error}),i&&d({kind:"agent",text:i}),d({kind:"error",title:t.error,detail:[]});break}let{chatOps:$,ambiguous:W}=Q;if(W.length>0){let g=W[0];t.confirm={kind:"ambiguity-confirm",prompt:`did you mean edit or ${g.kinds.filter(x=>x!=="edit").join("/")} on ${g.target}?`},t.turns.push({role:"agent",turnIndex:c,text:i}),i&&d({kind:"agent",text:i});break}if(v($),s.commitChatTurn&&$.length>0){let g=s.commitChatTurn({contextDir:s.contextDir??"",graph:s.refreshGraph?.()??s.graph,ops:$,by:s.by??{kind:"human",id:"owner"},...s.descriptor?.mint_gate?{mintable:s.descriptor.mint_gate}:{},...s.session?.state?.sid?{sid:s.session.state.sid}:{}});if(g.errors)t.error=g.errors.map(x=>x.detail).join("; "),t.turns.push({role:"agent",turnIndex:c,text:i}),d({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:g.errors.map(x=>`${x.code}: ${x.detail}`)}),p.push(["COMMIT FAILED (chat turn) \u2014 nothing landed; do not assume any of your last ops applied.",...g.errors.map(x=>`- ${x.code}: ${x.detail}`),...g.errors.some(x=>x.code==="UNKNOWN_FIELD")?["If you were changing citations or matched-existing content, that is proposal territory (approve/re-propose) \u2014 a chat edit can only replace a node's own schema fields."]:[]].join(`
|
|
4
|
-
`)),i&&d({kind:"agent",text:i});else{g.applied.length>0&&s.session?.markApplied(g.applied);let x=b(g);t.turns.push({role:"agent",turnIndex:c,text:i,narration:x}),d({kind:"commit",ok:!0,line:x});let S=s.refreshGraph?.();if(S&&y&&y(S),S)try{_+=1;let X=s.descriptor?.mint_gate?.includes("usecase")?"extract":"design",D=ne({verb:X,commitN:_,phase:"chat",committed:g.minted.map(M=>({cid:M.cid,...M.slug?{logical_id:M.slug}:{}}))},S);p.push(D.text)}catch{}i&&d({kind:"agent",text:i})}}else t.turns.push({role:"agent",turnIndex:c,text:i}),i&&d({kind:"agent",text:i});w(i);break}case"done":case"session_complete":j(),N(),t.status="idle",t.busySince=void 0,o=null;break;case"error":j(),N(),t.stream=null,t.status="idle",t.busySince=void 0,t.error=e.message,o=null,d({kind:"error",title:e.message,detail:[]});break;case"session_paused":break;default:break}m()}}}export{ge as a,ae as b,ve as c};
|
package/dist/chunk-MA34UWKX.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{j as we,k as ie,l as oe,m as ye,n as ke,o as se}from"./chunk-3POR47RC.js";import{a as ne,c as te,d as ve,f as re}from"./chunk-RLRNLIRS.js";import{a as E,b as ge,d as he}from"./chunk-OS4VSIHT.js";import{a as H}from"./chunk-CLGC7VEO.js";import{a as Q,b as K,c as X,d as N,e as pe,g as C,h as ee}from"./chunk-W5TTF7GB.js";import{a as me}from"./chunk-JFAFKHDX.js";import{b as z,c as Z,d as J}from"./chunk-7BZSCUPP.js";import{e as ue,g as fe}from"./chunk-W4B5LOEX.js";import{A as S}from"./chunk-TH47OOBV.js";import{f as F}from"./chunk-DUAXZYAD.js";import{existsSync as De,statSync as xe}from"fs";import{basename as W,resolve as G}from"path";var _e=new Set(["interactive","agent","ci","override"]);function Se(e,n){if(e.mode!==void 0&&!_e.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 Re(e){let{makeHeadlessIO:n,agentRefusal:t}=await import("./headless-io-66RG5NN5.js");return t(n("ndjson","reconcile"),e,"MODE_USAGE")}function Oe(e,n,t,r){if(Z(t)){let v=J(t),a=v?.sourceIdFor(t)??null;if(v===null||a===null)return{error:`--from '${t}' is not a supported remote URL \u2014 supported: ${z.map(u=>u.hint).join("; ")}`};if(r!==void 0&&r!==a)return{error:`--source-id '${r}' does not match this URL's own identity '${a}' \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=S(e);if(!c.heads.has(a))return{error:`unknown source '${a}' \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(a)==null)return{error:`source '${a}' is retired \u2014 restore it first with \`kane-cli context revert\`, then reconcile`};let $=q(e,a,{remoteUrl:t});return $!==null?{error:$}:{sourceId:a,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=G(n,t);if(!De(i)||!xe(i).isFile())return{error:`--from '${t}' is not a file \u2014 pass the changed source document`};let l=ue(i);if(!l.ok)return{error:`--from '${t}' is not an ingestable document \u2014 allowed: ${l.allowlist.join(", ")}`};let o=S(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=q(e,r,{filePath:i});if(w!==null)return{error:w};let d=null;try{d=fe(i)}catch{}return d!==null&&d!==r&&o.heads.get(d)!=null?{error:`'${W(i)}' already backs live source '${d}' \u2014 did you mean --source-id ${d}? To truly move these bytes under '${r}', retire '${d}' first`}:{sourceId:r,filePath:i}}function O(e){return e==null?"(none)":e.slice(0,19)}function j(e,n,t,r=!1,i){if(e.out(`reconcile ${n.source_id}: head ${n.head.status} \u2014 ${O(n.head.before)} \u2192 ${O(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 l=n.changeset??[],o=(d,v)=>{let a=l.filter(c=>c.kind===d).length;return a>0?`${a} ${v}`:null},w=[o("ADD","add"),o("MODIFY","modify"),o("ARCHIVE","archive")].filter(Boolean);n.changed&&e.out(`changeset: ${l.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 l=n.changeset??[];e.out(`changeset: ${l.length} item(s)`);for(let o of l)if(o.kind==="MODIFY")e.out(` [MODIFY] ${H(o.ref)} \u2014 ${o.summary} (${O(o.old_cid)} \u2192 ${o.new_cid===null?"(staged)":O(o.new_cid)})`);else if(o.kind==="ADD")e.out(` [ADD] ${H(o.ref)}`);else{e.out(` [ARCHIVE] ${H(o.ref)} \u2014 ${o.why}`);let w=ae(o.impact,"retiring drops");w&&e.out(` ${w}`)}}e.out(`plan: ${n.rows.length} row(s)`);for(let l of n.rows){e.out(` [${l.kind}] ${H(l.ref)} \u2014 ${l.reason}`);let o=ae(l.impact,"approving marks");o&&e.out(` ${o}`),e.out(` provenance: ${l.provenance}`),e.out(` action: ${l.action}`)}}function ae(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 x(e){return e==="interactive"?"override":e}async function A(e,n,t,r,i,l,o=[],w="override",d,v,a,c,$){let u;try{u=ee(e)}catch(R){return E(r,R instanceof Error?R.message:String(R)),1}try{if(!t){let{runWalkSession:R}=await import("./walk-session-CHJXHZMO.js");return await R({dir:e,rows:n,archive:o,held:d??null,childMode:w,runDesign:c??null,mark:l,markA:a,...v?{archiveState:v}:{},signals:m=>I(e,m.ref,m.verdict,m.reason),...$?{script:$}:{}})}return await Ie(e,n,t,r,i,l,o,w,d,v)}finally{u()}}var L=e=>`${e} high-risk item(s) need a human \u2014 ci mode won't guess. Walk interactively or use --mode agent.`;function M(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 ce(e={}){return{type:"reconcile_summary",applied:0,skipped:0,deferred:0,plan_only:0,failed:0,paused:0,stale_created:0,...e}}var V=ce();async function B(e,n,t,r,i,l,o,w,d){M(i,n,t);let v=n.changeset.filter($=>$.kind==="ARCHIVE"&&d?.[$.ref]===void 0),a=n.rows,c;try{c=ee(e)}catch($){return i({type:"error",message:$ instanceof Error?$.message:String($)}),i(ce()),2}try{return await Ce(e,n,t,r,i,l,o,a,v,w)}finally{c()}}async function Ce(e,n,t,r,i,l,o,w,d,v){let a=0,c=0,$=0,u=0,R=0,m=0,f=0,P=new Set,b=(g,p)=>{try{v?.(g,p)}catch{}};for(let[g,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 h=(s,_,D)=>i({type:"reconcile_row_end",kind:p.kind,ref:p.ref,outcome:s,..._!==void 0?{exit_code:_}:{},...D?{detail:D}:{}});if(p.applied){c++,h("skipped");continue}if(p.kind==="REMOVE"){R++,h("plan-only");continue}if(p.held_ref&&n.held){let s=new Set;if(p.kind==="MODIFY"&&p.impact){let D=S(e);for(let U of p.impact.stale_refs){let Y=D.resolve(U);Y&&D.stale(Y.tip)==="fresh"&&s.add(U)}}let _=ie(e,n.held,p.held_ref,le);if(!_.ok){$++,f===0&&(f=1),h("failed",1,_.message);continue}if(_.kind==="ADD"){let D=await r(_.ref,{yes:!0,mode:o});if(D!==0){D===3?(u++,f===0&&(f=3),h("paused",3)):($++,f===0&&(f=1),h("failed",D));continue}}a++,_.kind!=="ADD"&&p.impact&&(m+=s.size),b(g,"approved"),I(e,p.ref,_.kind==="ADD"?"gap-resolved-create":"gap-resolved-evolve"),h("applied");continue}let k=ne(S(e),p.ref);if(!k.ok){c++,h("skipped");continue}let y=k.target;if(P.has(y.ucTip)){c++,h("skipped");continue}if(p.kind==="ADD"){let s=await r(y.seamRef,{yes:!0,mode:o});if(s===3){u++,f===0&&(f=3),h("paused",3);continue}if(s!==0){$++,f===0&&(f=1),h("failed",s);continue}P.add(y.ucTip),a++,b(g,"approved"),I(e,p.ref,"gap-resolved-create"),h("applied")}else{let s=await te(e,y,{yes:!0,mode:o},l,r,"batch");s.outcome==="evolved"?(P.add(y.ucTip),a++,b(g,"approved"),I(e,p.ref,"gap-resolved-evolve"),h("applied")):s.outcome==="paused"?(u++,f===0&&(f=s.code),h("paused",s.code)):s.outcome==="failed"?($++,f===0&&(f=1),h("failed",s.code)):(c++,h("skipped"))}}return d.length>0&&(i({type:"reconcile_paused",plan_path:t,pending:d.map(g=>({ref:g.ref,why:g.why}))}),u+=d.length,f===0&&(f=3)),i(ce({applied:a,skipped:c,plan_only:R,failed:$,paused:u,stale_created:m})),f}var le={kind:"human",id:process.env.USER??"operator"};function I(e,n,t,r){me(e,{ts:new Date().toISOString(),command:"reconcile-walk",id:n,verdict:t,polarity:"preference",by:le,target:n,...r!==void 0?{reason:r}:{}})}async function Ie(e,n,t,r,i,l,o=[],w="override",d,v){let a=0,c=0,$=0,u=0,R=0,m=0,f=0,P=new Set;for(let[b,g]of n.entries()){if(g.applied){r.out(`skipped ${g.ref} \u2014 already applied (${g.applied.outcome} at ${g.applied.at})`),c++;continue}let p=s=>{try{l?.(b,s)}catch(_){E(r,`could not record applied state for ${g.ref}: ${_ instanceof Error?_.message:String(_)}`)}};if(g.kind==="REMOVE"){r.out(`REMOVE ${g.ref} \u2014 plan-only in this release (not executed)`),u++;continue}if(g.held_ref&&d){let s=ie(e,d,g.held_ref,le);if(!s.ok){E(r,`held ${g.ref}: ${s.message}`),R++,f===0&&(f=1);continue}if(r.out(`committed ${s.ref} (${g.kind==="ADD"?"minted":"updated \u2014 old\u2192new redirect"})`),s.kind==="ADD"){let _=await i(s.ref,{yes:t,mode:w});if(_===3){r.out(`design session for ${s.ref} paused \u2014 resume with the "kane-cli design tests --resume <session>" command printed above`),m++,f===0&&(f=3),p("approved");continue}if(_!==0){E(r,`design run for ${s.ref} ended with exit code ${_}`),R++,f===0&&(f=1),p("approved");continue}}a++,p("approved"),I(e,g.ref,g.kind==="ADD"?"gap-resolved-create":"gap-resolved-evolve");continue}let h=S(e),k=ne(h,g.ref);if(!k.ok){r.out(`skipped ${g.ref} \u2014 ${k.message}`),c++;continue}let y=k.target;if(P.has(y.ucTip)){r.out(`skipped ${g.ref} \u2014 use-case ${y.display} already handled in this walk`),c++;continue}if(g.kind==="ADD"){let s=await i(y.seamRef,{yes:t,mode:w});if(s===3){r.out(`design session for ${y.display} paused \u2014 resume with the "kane-cli design tests --resume <session>" command printed above; this row lands when that session completes`),m++,f===0&&(f=3);continue}if(s!==0){E(r,`design run for ${y.display} ended with exit code ${s}`),R++,f===0&&(f=1);continue}P.add(y.ucTip),a++,p("approved"),I(e,g.ref,"gap-resolved-create")}else{let s=await te(e,y,{yes:!0,mode:w},r,i,"batch");s.outcome==="evolved"?(P.add(y.ucTip),a++,p("approved"),I(e,g.ref,"gap-resolved-evolve")):s.outcome==="paused"?(m++,f===0&&(f=s.code)):s.outcome==="failed"?(R++,f===0&&(f=s.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 g=ae(b.impact,"retiring drops");g&&r.out(` ${g}`)}r.out(" plan-only \u2014 retire belongs to the interactive session (never headless)"),u++}return r.out(`reconcile walk: ${a} applied, ${c} skipped, ${$} deferred, ${u} plan-only`+(R>0?`, ${R} failed`:"")+(m>0?`, ${m} paused`:"")),f}var Ue=new Set(z.map(e=>e.name));function q(e,n,t){let r=S(e),i=r.heads.get(n);if(i==null)return null;let l=r.mediaOf(i);if("remoteUrl"in t){let o=J(t.remoteUrl)?.name??"remote";return l.format!==o?`source '${n}' is backed by ${l.format} content, not a ${o} source \u2014 reconcile it with the --from it was originally ingested from`:null}return Ue.has(l.format)?`source '${n}' is a remote ${l.format} source \u2014 pass its URL to --from, not a file`:null}function de(e,n,t,r){return"remoteUrl"in n?ke(e,n.remoteUrl,{out:t.out,err:t.err},r.remoteFindProvider):ye(e,n.filePath)}function Ee(e){return e.remote_url!==void 0?{remoteUrl:e.remote_url}:e.backing_path!==void 0?{filePath:e.backing_path}:null}async function Pe(e,n,t,r,i,l=!1,o=!1){let w=i.seams??{reingest:de(e,t,r,i),reextract:se(e,{stage:l,hostOut:c=>r.out(c),hostEmit:c=>{c.type!=="run_start"&&i.emitEvent?.(c)},...i.emitEvent?{}:{hostProgress:c=>process.stderr.write(c+`
|
|
3
|
-
`)}})},d=null,v={reingest:w.reingest,reextract:async c=>d=await w.reextract(c)},a;try{r.out(`reconciling ${n}: re-reading the source and comparing against the graph\u2026`),a=await(i.buildPlan??oe)(e,n,v)}catch(c){return E(r,`reconcile failed: ${c instanceof Error?c.message:String(c)}`),null}return a.changed&&j(r,a,d,o,i.emitEvent),a}async function Ae(e){let[{render:n},t,{ScrollbackProvider:r},{ChatSurface:i},{makeChatController:l},{makeReconcileDeps:o}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./scrollback-JLPJR25X.js"),import("./ChatSurface-U37VZDCW.js"),import("./chat-controller-T2FAI55V.js"),import("./reconcile-deps-XIH75ZLY.js")]),w=t.default??t,d=l(),v=o({contextDir:e,note:a=>d.note(a)});return new Promise(a=>{let c=n(w.createElement(r,null,w.createElement(i,{controller:d,verb:"extract",reconcile:v,autoReview:!0,onReviewExit:()=>{c.unmount(),a(0)},onCtrlC:()=>{c.unmount(),a(v.pending()?3:0)}})),{exitOnCtrlC:!1})})}async function Me(e,n,t,r,i){let l=K(e,n);if("error"in l)return E(r,l.error),2;let{plan:o,path:w}=l,d=t==="override"||t==="ci";if(n===void 0&&t==="interactive"&&r.isTTY&&!await r.confirm(`apply plan ${W(w)} for ${o.source_id} (created ${o.created})?`))return r.out(`not applying ${W(w)}`),0;let v=i.runDesignForUc??re,a=i.runDesignForUc??null,c=i.sessionScript,$=(g,p)=>C(w,g,p),u=(g,p)=>N(w,g,p),R=F(e);if(R===o.head_pin){if(t==="agent"){let p=i.emitEvent??(()=>{});return B(e,T(o),w,v,p,r,x(t),$,o.archive_state)}let g=X(o);return t==="ci"&&g.length>0?(E(r,L(g.length)),2):(r.out(`applying stored plan ${W(w)} for ${o.source_id} (${o.rows.length} row(s))`),A(e,o.rows,d,r,v,$,o.changeset??[],x(t),o.held,o.archive_state,u,a,c))}if(r.out(`graph moved since this plan (${O(o.head_pin)} \u2192 ${O(R)}) \u2014 recomputing`),o.held)return be(e,o,r,i,t,v,!1);let m=Ee(o);if(m===null)return E(r,`stored plan for ${o.source_id} names no backing file or URL \u2014 re-run reconcile --from`),2;let f=q(e,o.source_id,m);if(f!==null)return E(r,`stored plan cannot replay: ${f}`),2;let P=await Pe(e,o.source_id,m,r,i,!1,t==="interactive");if(!P)return 1;if(!P.changed)return j(r,P,null,!1,i.emitEvent),0;if(t==="agent"){let g=i.emitEvent??(()=>{});return B(e,P,null,v,g,r,x(t))}let b=P.changeset.filter(g=>g.kind==="ARCHIVE");return t==="ci"&&b.length>0?(E(r,L(b.length)),2):A(e,P.rows,d,r,v,void 0,P.changeset,x(t),P.held,void 0,void 0,a,c)}function T(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 Fe(e,n,t,r,i,l,o){let w=r.runDesignForUc??null,d=r.sessionScript,v=pe(e,n);if(v===null)return null;if("error"in v)return E(t,v.error),2;let{plan:a,path:c}=v,$=a.rows.filter(f=>f.applied===void 0),u=X(a),R=r.emitEvent??(()=>{});if($.length===0&&u.length===0){t.out(`already reconciled \u2014 plan ${a.created} applied ${a.rows.length} row(s)`);let f=ve(S(e)).staleCount;return f>0&&(t.out(`${f} item(s) still stale \u2014 kane-cli maintain evolve --from-stale`),R({type:"stale_debt",count:f})),i==="agent"&&(M(R,T(a),c),R({...V})),0}let m=F(e);return m!==a.head_pin?(t.out(`plan ${a.created} superseded \u2014 graph moved (${O(a.head_pin)} \u2192 ${O(m)}); recomputing`),be(e,a,t,r,i,l,o)):(t.out(`resuming plan ${a.created} \u2014 ${$.length} pending row(s)${u.length>0?`, ${u.length} undecided archive item(s)`:""}`),o?(j(t,T(a),null,!1,r.emitEvent),t.out(`plan stored: ${c}`),i==="agent"&&(M(R,T(a),c),R({...V})),0):i==="agent"?B(e,T(a),c,l,R,t,x(i),(f,P)=>C(c,f,P),a.archive_state):i==="ci"&&u.length>0?(E(t,L(u.length)),2):A(e,a.rows,i==="override"||i==="ci",t,l,(f,P)=>C(c,f,P),a.changeset??[],x(i),a.held,a.archive_state,(f,P)=>N(c,f,P),w,d))}async function be(e,n,t,r,i,l,o){let w=r.runDesignForUc??null,d=r.sessionScript,v;if(n.held){let h=S(e),k=new Set(n.rows.filter(s=>s.held_ref!==void 0&&s.applied!==void 0).map(s=>s.held_ref)),y=[];for(let s of n.held.rows){if(k.has(s.temp_ref))continue;if(!s.matched_cid){y.push(s);continue}let _=h.tipOf(s.matched_cid);if(h.superseded.get(_)===null){t.out(`dropped held "${s.title}" \u2014 its use-case was retired meanwhile`),r.emitEvent?.({type:"held_dropped",ref:s.temp_ref,title:s.title,reason:"target_retired"});continue}y.push(_===s.matched_cid?s:{...s,matched_cid:_,uc:{...s.uc,matches_existing:{cid:_}}})}v={source_id:n.held.source_id,rows:y}}let a=Ee(n);if(a===null)return E(t,`stored plan for ${n.source_id} names no backing file or URL \u2014 re-run reconcile --from`),2;let c=q(e,n.source_id,a);if(c!==null)return E(t,`stored plan cannot replay: ${c}`),2;let $=r.seams??{reingest:de(e,a,t,r),reextract:se(e,{stage:v!==void 0,hostOut:h=>t.out(h),hostEmit:h=>{h.type!=="run_start"&&r.emitEvent?.(h)},...r.emitEvent?{}:{hostProgress:h=>process.stderr.write(h+`
|
|
4
|
-
`)}})},u;try{u=await(r.buildPlan??oe)(e,n.source_id,$,{resumeHeld:v})}catch(h){return E(t,`reconcile failed: ${h instanceof Error?h.message:String(h)}`),1}j(t,u,null,i==="interactive"&&!o,r.emitEvent);let R=F(e),m=null;if(R!=null){let h={},k=new Set(u.changeset.filter(y=>y.kind==="ARCHIVE").map(y=>y.ref));for(let[y,s]of Object.entries(n.archive_state??{}))k.has(y)&&(h[y]=s);m=Q(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:R,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(h).length>0?{archive_state:h}:{}}),t.out(`plan stored: ${m}`)}if(o){if(i==="agent"){let h=r.emitEvent??(()=>{});M(h,u,m),h({...V})}return 0}let f=r.emitEvent??(()=>{}),P=m?K(e,m).plan.archive_state:void 0,b=m?(h,k)=>C(m,h,k):void 0,g=m?(h,k)=>N(m,h,k):void 0;if(i==="agent")return B(e,u,m,l,f,t,x(i),b,P);let p=u.changeset.filter(h=>h.kind==="ARCHIVE"&&P?.[h.ref]===void 0);return i==="ci"&&p.length>0?(E(t,L(p.length)),2):A(e,u.rows,i==="override"||i==="ci",t,l,b,u.changeset,x(i),u.held,P,g,w,d)}async function $e(e,n,t={},r=process.cwd()){let{telemetryBootstrap:i,telemetryEnvName:l}=await import("./bootstrap-44YKVWWE.js"),o=i({verb:"reconcile",mode:typeof e.mode=="string"?e.mode:"interactive",contextRoot:G(r,".context"),env:l(),applyPlanPath:typeof e.apply=="string"?G(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 He(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 He(e,n,t={},r=process.cwd()){let i=e.apply!==void 0&&e.apply!==!1,l=typeof e.apply=="string"?e.apply:void 0;if(e.plan&&i)return E(n,"pass --plan OR --apply, not both"),2;let o=e.from!==void 0||!i,w=e.from!==void 0&&Z(e.from);if(o&&(!e.from||!e.sourceId&&!w))return E(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&&l!==void 0)return E(n,"pass --from OR --apply <path>, not both \u2014 a stored plan names its own source"),2;let d=ge(r,n);if(!d)return 2;if(e.mode!==void 0&&!_e.has(e.mode))return Re(`--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 E(n,"refusing to apply without a TTY to confirm \u2014 pass --mode override|ci"),2;let a=!e.plan,c="override";if(e.from){let k=Se(e,n.isTTY);if(typeof k=="object")return k.code==="MODE_USAGE"?Re(k.error):(E(n,k.error),2);c=k}let $=c==="override"||c==="ci";if(i&&!e.from){let{makeReconcileDeps:k}=await import("./reconcile-deps-XIH75ZLY.js"),y=l===void 0?k({contextDir:d}).pending():null;if(y?.kind==="cards"){let _=e.mode??"interactive";return!n.isTTY||_!=="interactive"?(E(n,`a held changeset for ${y.source} awaits review (${y.count} change(s)) \u2014 resume in a terminal: kane-cli maintain reconcile --apply [HELD_REVIEW]`),2):(t.cardApplyMount??Ae)(d)}let s=e.mode??"interactive";return Me(d,l===void 0?void 0:G(r,l),s,n,t)}let u=Oe(d,r,e.from,e.sourceId);if("error"in u)return E(n,u.error),2;if(!i){let{sessionsHoldingSource:k}=await import("./sessions-GIEXOCE4.js"),{holders:y,corrupt:s}=k(d,u.sourceId);if(s>0)return E(n,`cannot verify review holds \u2014 ${s} session file(s) unreadable; inspect with kane-cli context sessions list, clean with kane-cli context sessions clean, then retry [SESSIONS_UNREADABLE]`),2;if(y.length>0)return E(n,`session ${y[0]} holds item(s) for review pinned to ${u.sourceId} \u2014 finish that review first: kane-cli context extract --resume ${y[0]} [SOURCE_HELD]`),2}if(c==="interactive"&&!e.plan&&!i){let k=t.seams?.reingest??de(d,u,n,t),y;try{y=await k(u.sourceId)}catch(_){return E(n,_ instanceof Error?_.message:String(_)),1}let s=y.status==="unchanged"?null:we(d,u.sourceId);if(y.status!=="unchanged"&&!s)return n.out(`${u.sourceId} landed for the first time \u2014 extract it: kane-cli context extract --source ${u.sourceId}`),0;if(s){let D=await(t.chatMount??(async U=>{let{bindExtractInteractive:Y}=await import("./extract-bind-LLEASZAK.js");return Y(U)}))({mode:"interactive",posture:"reconcile",source:u.sourceId,changeContext:s});if(D===3){let{sessionsHoldingSource:U}=await import("./sessions-GIEXOCE4.js");if(U(d,u.sourceId).holders.length===0)return 0}return D}}let R="remoteUrl"in u?{remoteUrl:u.remoteUrl}:{filePath:u.filePath},m=await Pe(d,u.sourceId,R,n,t,!!e.plan||c==="interactive",c==="interactive"&&!e.plan);if(!m)return 1;let f=t.runDesignForUc??re,P=t.runDesignForUc??null,b=t.sessionScript;if(!m.changed){let k=await Fe(d,u.sourceId,n,t,c,f,!!e.plan);if(k!==null)return k;if(j(n,m,null,!1,t.emitEvent),c==="agent"){let y=t.emitEvent??(()=>{});M(y,m,null),y({...V})}return 0}let g=F(d),p=null;if(g!=null?p=Q(d,{version:2,source_id:m.source_id,..."remoteUrl"in R?{remote_url:R.remoteUrl}:{backing_path:R.filePath},head_pin:g,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}:{}}):E(n,"no chain head after extract \u2014 plan not stored"),c==="agent"){let k=t.emitEvent??(()=>{});if(!a)return M(k,m,p),k({...V}),0;let y=p?(s,_)=>C(p,s,_):void 0;return B(d,m,p,f,k,n,x(c),y)}if(!a)return p&&n.out(`plan stored: ${p}`),0;let h=m.changeset.filter(k=>k.kind==="ARCHIVE");if(c==="ci"&&h.length>0)return p&&n.out(`plan stored: ${p}`),E(n,L(h.length)),2;if(p){n.out(`plan stored: ${p}`);let k=p;return A(d,Te(d,k)??m.rows,$,n,f,(y,s)=>C(k,y,s),m.changeset,x(c),m.held,void 0,void 0,P,b)}return A(d,m.rows,$,n,f,void 0,m.changeset,x(c),m.held,void 0,void 0,P,b)}function Te(e,n){let t=K(e,n);return"error"in t?null:t.plan.rows}async function Xe(e,n={},t,r=process.cwd()){if(e.mode==="agent"){let{makeHeadlessIO:i}=await import("./headless-io-66RG5NN5.js"),l=t?i("ndjson","reconcile",t):i("ndjson","reconcile"),o={out:l.out,err:v=>l.event({type:"error",message:v}),isTTY:!1,confirm:async()=>!1,ask:async()=>""},{runWithChannel:w}=await import("./run-channel-RGH4WIQX.js"),d=2;try{d=await w({event:v=>l.event(v)},()=>$e(e,o,{...n,emitEvent:v=>l.event(v)},r))}catch(v){d=1,l.event({type:"error",message:v instanceof Error?v.message:String(v)})}return l.done(d)}return $e(e,he(),n,r)}export{Se as a,Oe as b,x as c,I as d,$e as e,Xe as f};
|
package/dist/chunk-MBF3FP5P.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
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-2WVKOZ6W.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 k}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 L}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]}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),O=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:O,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,O=_==="error";r.push({content_type:"generative_block",instruction_id:`generative_block_${c}`,generative_id:c,objective:u,status:_,children:f,error_message:O?I??null:null,error_code:O?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 N(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=L(t,r),l=L(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(L(l,d));_.length&&u.push({objective:e.objective??"",records:_})}if(u.length===0)continue;let{instructions:p}=N(u,e.vars??{},e.screenshotBaseUrl??"",e.extMap,{keepFailedActions:!0});if(p.length!==0)try{let d=L(o,"auteur");Ae(d,{recursive:!0}),Re(L(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 Ne,basename as Le}from"path";import{tmpdir as ke}from"os";var Oe=["**/screenshots/**","**/annotated/**","**/tcg/**","**/bifurcation/**"];async function ne(t){let e=Ne(ke(),`${Le(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:Oe}),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?N(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");k(_,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}),k(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?N(l,a,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{keepFailedActions:!0}):{instructions:[]},u=this.buildExecutionEnvelope(c),p=E(this.config.sessionDir,"execution.json");k(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();k(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();k(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};
|