@testmuai/kane-cli 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChatSurface-I6PFL3OE.js +9 -0
- package/dist/{ChromeProfilePicker-PIWZY4WH.js → ChromeProfilePicker-YG7TKHM5.js} +1 -1
- package/dist/{CliFeedbackPrompt-URXCHBZ5.js → CliFeedbackPrompt-5RUIP4KA.js} +1 -1
- package/dist/CliUploadProgress-YQYPZNEV.js +2 -0
- package/dist/{ConfigView-NWNDNTKW.js → ConfigView-HZ7MFCAJ.js} +1 -1
- package/dist/EvidenceViewOffer-N4UED7VY.js +2 -0
- package/dist/FolderPicker-NAFYP7ES.js +2 -0
- package/dist/HelpView-BLWTCQ6T.js +2 -0
- package/dist/{InfoBox-FPAWQZGQ.js → InfoBox-7ZZGMYHY.js} +1 -1
- package/dist/{LinksBox-O5ZFYSK2.js → LinksBox-63Q5YS5X.js} +1 -1
- package/dist/{ProfilesView-SPECXHZE.js → ProfilesView-AVYB43ES.js} +1 -1
- package/dist/{ProjectPicker-ANJ6NGNY.js → ProjectPicker-EINNALUG.js} +1 -1
- package/dist/{SaveSessionPrompt-W2GWELOP.js → SaveSessionPrompt-C3LCI2KZ.js} +1 -1
- package/dist/ScrollbackTap-Q3IOKNMS.js +2 -0
- package/dist/SingleShotApp-PS42WWT7.js +2 -0
- package/dist/{SummaryBox-DJUDYML7.js → SummaryBox-NRPQ2AMW.js} +1 -1
- package/dist/TestMdRunView-5FVCEQZI.js +2 -0
- package/dist/{WhoamiView-DH25ZD4C.js → WhoamiView-YLMIEJQN.js} +1 -1
- package/dist/archive-committer-3NI773TP.js +2 -0
- package/dist/bind-QYQ5IT4S.js +6 -0
- package/dist/bridge-QENVIWWC.js +2 -0
- package/dist/{changelog-RCKUVBFL.js → changelog-4RSI7UIO.js} +1 -1
- package/dist/chat-committer-RTJCKQMM.js +2 -0
- package/dist/chat-controller-OTBYHB4Y.js +3 -0
- package/dist/chunk-22A2ECA2.js +2 -0
- package/dist/{chunk-6E5UYAEB.js → chunk-25YSMNUP.js} +1 -1
- package/dist/{chunk-R5RHRG65.js → chunk-3SK5GXQM.js} +1 -1
- package/dist/chunk-427OQS2N.js +2 -0
- package/dist/chunk-5446YVGQ.js +4 -0
- package/dist/chunk-5ILXUQIX.js +2 -0
- package/dist/chunk-5Q46BEG7.js +2 -0
- package/dist/chunk-5U3GOEGG.js +7 -0
- package/dist/chunk-5Y2G4NC7.js +2 -0
- package/dist/{chunk-I4B2KY4X.js → chunk-6BQD2BXI.js} +1 -1
- package/dist/chunk-6PS65QFF.js +2 -0
- package/dist/chunk-ABSEKYIB.js +13 -0
- package/dist/chunk-AD46OCZ4.js +4 -0
- package/dist/chunk-AE6SS34N.js +4 -0
- package/dist/chunk-B2OAEEKI.js +14 -0
- package/dist/chunk-B2PZAB7J.js +4 -0
- package/dist/chunk-BC7UVJJB.js +2 -0
- package/dist/{chunk-T4PKTWZ6.js → chunk-BV3EARZO.js} +1 -1
- package/dist/{chunk-7IBNOVML.js → chunk-C5NNT7Y3.js} +1 -1
- package/dist/{chunk-NLIOFVMP.js → chunk-CBIW5DTU.js} +1 -1
- package/dist/chunk-CE664P73.js +2 -0
- package/dist/{chunk-GEAWRRR7.js → chunk-D5SHVZGD.js} +1 -1
- package/dist/chunk-D5T4ARTB.js +2 -0
- package/dist/chunk-DFS4RMVP.js +2 -0
- package/dist/chunk-DM2GL24Z.js +3 -0
- package/dist/chunk-FAXRERS6.js +6 -0
- package/dist/{chunk-QO6PAA7Q.js → chunk-FPGOV4AQ.js} +2 -2
- package/dist/chunk-FXPPQL4D.js +6 -0
- package/dist/chunk-FYOCF7DY.js +2 -0
- package/dist/chunk-GIGD4M7V.js +5 -0
- package/dist/chunk-GIRXJOJI.js +2 -0
- package/dist/{chunk-TPG2T5GH.js → chunk-GNGGFK7C.js} +1 -1
- package/dist/{chunk-THEZSXZM.js → chunk-H7ZQ4AWL.js} +1 -1
- package/dist/{chunk-TJWU7DOO.js → chunk-HYW5VDEC.js} +1 -1
- package/dist/chunk-I2S6KNZW.js +2 -0
- package/dist/chunk-IACKIGPX.js +2 -0
- package/dist/chunk-IF2R3AR4.js +6 -0
- package/dist/{chunk-UOGJUJCF.js → chunk-INP7FG6V.js} +1 -1
- package/dist/{chunk-C4LYBQT3.js → chunk-IPCC3P6T.js} +2 -2
- package/dist/chunk-JFAFKHDX.js +4 -0
- package/dist/chunk-KHDUQ33H.js +2 -0
- package/dist/chunk-KHU7C6EE.js +2 -0
- package/dist/chunk-LBBPMEO2.js +2 -0
- package/dist/chunk-LKXVYWKG.js +356 -0
- package/dist/chunk-LMJTY32X.js +6 -0
- package/dist/chunk-M5JQXOCE.js +12 -0
- package/dist/chunk-ME3GYVBV.js +2 -0
- package/dist/{chunk-7AEC572G.js → chunk-MESFNOY3.js} +1 -1
- package/dist/{chunk-HFXQU7UZ.js → chunk-MKD3KZPM.js} +1 -1
- package/dist/{chunk-LOQV5GME.js → chunk-MQ7DJ2XC.js} +1 -1
- package/dist/{chunk-YSIYPC4R.js → chunk-N2BUF6YU.js} +1 -1
- package/dist/chunk-NNZV5RCE.js +2 -0
- package/dist/{chunk-HZ46P2GR.js → chunk-NOOHQBUD.js} +1 -1
- package/dist/chunk-NTJDMMLC.js +61 -0
- package/dist/chunk-NWZTYAJB.js +9 -0
- package/dist/{chunk-IECUFWIZ.js → chunk-OXARXMMD.js} +1 -1
- package/dist/{chunk-ELBPBHTE.js → chunk-PGEMGGBS.js} +2 -2
- package/dist/{chunk-4IOOBSNB.js → chunk-QI6WZ56Y.js} +1 -1
- package/dist/{chunk-ZWAZ4QU4.js → chunk-QK6KZMYG.js} +1 -1
- package/dist/chunk-QPZRHAYK.js +4 -0
- package/dist/{chunk-3FN66LTP.js → chunk-RFHMDQXZ.js} +1 -1
- package/dist/chunk-RGEAEAZB.js +20 -0
- package/dist/chunk-RKWJG3WW.js +19 -0
- package/dist/chunk-RTWWPEQ7.js +8 -0
- package/dist/chunk-TZVURR5H.js +5 -0
- package/dist/chunk-VJUIW2ES.js +4 -0
- package/dist/chunk-VK7RF53I.js +2 -0
- package/dist/{chunk-XDERMCAU.js → chunk-VXS23M67.js} +1 -1
- package/dist/{chunk-IU53F4ZV.js → chunk-WFAMF4SG.js} +1 -1
- package/dist/chunk-WFSQZG26.js +11 -0
- package/dist/chunk-WG3BBXJF.js +7 -0
- package/dist/chunk-WUMNIGPR.js +2 -0
- package/dist/{chunk-AFCEFOIK.js → chunk-WUNN5OCH.js} +1 -1
- package/dist/{chunk-PISZLYS5.js → chunk-XQDDUVD3.js} +1 -1
- package/dist/{chunk-DTM4ZMMJ.js → chunk-Y2S3PW7N.js} +1 -1
- package/dist/chunk-YANCBRER.js +3 -0
- package/dist/{chunk-AM5WZPPY.js → chunk-YWWKKKXY.js} +1 -1
- package/dist/chunk-Z56AWGVY.js +2 -0
- package/dist/chunk-ZKYYZ5NO.js +6 -0
- package/dist/{chunk-PTP3WS3N.js → chunk-ZO7ROBPR.js} +1 -1
- package/dist/chunk-ZXDA4K6G.js +2 -0
- package/dist/chunk-ZZOSDBYN.js +23 -0
- package/dist/cover-cmd-Y5L4O4Q3.js +2 -0
- package/dist/{credentials-52QRPGET.js → credentials-WUEKK7FI.js} +1 -1
- package/dist/descriptor-SL5A7RQE.js +2 -0
- package/dist/distill-cmd-EYCCCFL3.js +2 -0
- package/dist/evidence-4BSNTVND.js +2 -0
- package/dist/evolve-cmd-VUWLH3CO.js +2 -0
- package/dist/{exit-manager-IUHAXFJ6.js → exit-manager-VCSIUYBR.js} +1 -1
- package/dist/explain-JIXUWEFJ.js +2 -0
- package/dist/explain-cmd-55WRDIMW.js +9 -0
- package/dist/explain-cmd-RIDEMDMY.js +3 -0
- package/dist/extract-bind-T7SUAID6.js +5 -0
- package/dist/extract-cmd-LZW7CRT3.js +6 -0
- package/dist/gaps-cmd-P2DRK6FW.js +2 -0
- package/dist/gate-FACZRGOC.js +2 -0
- package/dist/{generate-headless-WG6ZPINI.js → generate-headless-C55T3GGR.js} +2 -2
- package/dist/headless-io-GXHKDPHB.js +2 -0
- package/dist/index.js +55 -54
- package/dist/ingest-4CGBXC2L.js +2 -0
- package/dist/ingest-cmd-FJ3SLTT4.js +3 -0
- package/dist/interactive-bind-P6AGLUMM.js +7 -0
- package/dist/interrupt-guard-UREUWNRL.js +2 -0
- package/dist/lifecycle-cmd-56OZT4LY.js +2 -0
- package/dist/list-cmd-JB2ABACD.js +3 -0
- package/dist/list-commands-M34USUNO.js +2 -0
- package/dist/logical-ids-QRRUXV5E.js +2 -0
- package/dist/login-flow-GMLHK6JT.js +2 -0
- package/dist/maintenance-cmd-E3HEEVQW.js +2 -0
- package/dist/open-MQLQKFAW.js +2 -0
- package/dist/{persist-recorded-session-XKPZX7HW.js → persist-recorded-session-L2KAY37H.js} +1 -1
- package/dist/pipeline-FJXQIFW7.js +2 -0
- package/dist/readmodel-MPTENJ2R.js +2 -0
- package/dist/reconcile-cmd-KTCH4KZQ.js +8 -0
- package/dist/{recording-banner-2TNKQHP2.js → recording-banner-2KIVZAXY.js} +1 -1
- package/dist/{require-project-folder-SJG5FQY6.js → require-project-folder-NOGEHZTS.js} +1 -1
- package/dist/revert-3TKLOYQA.js +2 -0
- package/dist/review-cmd-SL52N4TM.js +4 -0
- package/dist/run-P4CHG2VH.js +2 -0
- package/dist/run-test-md-ICLG4OPX.js +17 -0
- package/dist/{scrollback-6GINSTL2.js → scrollback-JLPJR25X.js} +1 -1
- package/dist/sessions-cmd-STHKGDX4.js +23 -0
- package/dist/signals-cmd-LXHZQLXZ.js +2 -0
- package/dist/{skill-installer-M6AREQQW.js → skill-installer-KGPXQRCE.js} +1 -1
- package/dist/spawner-DDD3ICOX.js +2 -0
- package/dist/tcg-generate-KBXZIIHB.js +2 -0
- package/dist/testmd-actions-45BY3YFO.js +2 -0
- package/dist/token-refresh-OCFALJ7U.js +2 -0
- package/dist/turn-preflight-I5SM4UIZ.js +2 -0
- package/dist/ui-JEJGTURD.js +4 -0
- package/dist/{validate-basic-FO7C2URG.js → validate-basic-QCD4VN37.js} +1 -1
- package/dist/{version-check-PHZX5WS7.js → version-check-55YZMQUI.js} +1 -1
- package/dist/view-cmd-QE2FS3GB.js +436 -0
- package/package.json +6 -6
- package/dist/CliUploadProgress-DMH3C3UZ.js +0 -2
- package/dist/EvidenceViewOffer-HEBQ7C4H.js +0 -2
- package/dist/FolderPicker-5S23OTSY.js +0 -2
- package/dist/HelpView-YYKTP4JH.js +0 -2
- package/dist/SingleShotApp-5TYM356H.js +0 -2
- package/dist/TestMdRunView-BIVXQE54.js +0 -2
- package/dist/chunk-54TKNWXF.js +0 -5
- package/dist/chunk-5MTRNUAK.js +0 -2
- package/dist/chunk-7KDNH6JP.js +0 -10
- package/dist/chunk-7YRNLGUT.js +0 -11
- package/dist/chunk-C6S4IEBC.js +0 -2
- package/dist/chunk-DJL47DYJ.js +0 -8
- package/dist/chunk-H6QJ4YU7.js +0 -2
- package/dist/chunk-J75KVNX5.js +0 -18
- package/dist/chunk-MUPHP5W6.js +0 -27
- package/dist/chunk-NAYAVVTP.js +0 -6
- package/dist/chunk-P5XBCJYQ.js +0 -7
- package/dist/chunk-Q2I65L2W.js +0 -6
- package/dist/chunk-QCEWUUE6.js +0 -55
- package/dist/chunk-V2GYBVSM.js +0 -2
- package/dist/chunk-Y44AETOW.js +0 -2
- package/dist/chunk-YCNCW4O4.js +0 -8
- package/dist/evidence-O4AON5FU.js +0 -2
- package/dist/list-commands-VJAL4J3O.js +0 -2
- package/dist/login-flow-VZ2MITFA.js +0 -2
- package/dist/pipeline-CADTHPDV.js +0 -2
- package/dist/run-test-md-INJKPE2I.js +0 -13
- package/dist/tcg-generate-VKFXR5JT.js +0 -2
- package/dist/testmd-actions-4QLHD74A.js +0 -2
- package/dist/token-refresh-2HKIYD4Y.js +0 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{b,c as ge,d as ct,f as ve,g as he}from"./chunk-FYOCF7DY.js";import{a as at,e as N,f as J,g as dt,h as te,i as U,j as ut}from"./chunk-RGEAEAZB.js";import{a as oe}from"./chunk-BC7UVJJB.js";import{a as K,b as W,d as st}from"./chunk-NFOBDHZK.js";import{d as ft}from"./chunk-KHDUQ33H.js";import{a as T,b as S}from"./chunk-L5LI2JF4.js";import{a as O}from"./chunk-D5T4ARTB.js";import{b as ie}from"./chunk-AE6SS34N.js";import{a as pt}from"./chunk-GIRXJOJI.js";import{e as re,g as ne}from"./chunk-B2PZAB7J.js";import{d as R,e as H,f as lt}from"./chunk-IACKIGPX.js";import{a as ot}from"./chunk-INP7FG6V.js";import{a as it}from"./chunk-MKD3KZPM.js";function M(e){if(e===null)return"broken";let t=Math.floor(e/100);return t===1?"passed":t===7?"failed":t===2?"skipped":"broken"}var j={failed:3,broken:2,passed:1,skipped:0};function we(e){let t="skipped";for(let r of e)j[r]>j[t]&&(t=r);return t}import{createHash as Wt}from"crypto";import{basename as Jt}from"path";function ye(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return t.length>0?t:"session"}function _e(e){return Wt("sha256").update(e).digest("hex").slice(0,8)}function xe(e){let t=Jt(e).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${ye(t)}-${_e(e)}`}function Se(e,t){return`${ye(e)}-${_e(t)}`}function be(e){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&n.length>0&&(t[r]=n);return t}var Xt={darwin:"macOS",linux:"Linux",win32:"Windows"};function ke(e){return Xt[e]??e}function Ee(e,t){let r={},n=(i,o)=>{o!==void 0&&o!==""&&(r[i]=o)};return n("model",t.model),n("os",e.os),n("browser",e.browser),n("browser_version",e.browser_version),n("resolution",e.resolution),n("platform",t.platform),n("platform_type",t.platform_type),n("run_kind",t.run_kind),n("os_version",e.os_version),e.device!==void 0&&e.device!==""?r.device=e.device:t.platform_type&&t.platform_type!=="web"&&(r.device=null),r}function Zt(e,t){return{pack_test_dir:e,ordinal_offset:t}}import{promises as P}from"fs";import{join as D}from"path";function Ie(e){let t={evidence:"0.1",run_id:e.execution_id,status:"running",title:e.title,started:e.started,environment:{producer:{name:"kane-cli",version:e.producerVersion},...e.surfaces?{surfaces:e.surfaces}:{},run_kind:e.run_kind,origin:e.origin,pid:e.pid},...e.credits!==void 0?{metrics:{credits:{value:e.credits,type:"count"}}}:{}};return S(t,{lineWidth:-1})}async function Re(e,t,r,n=process.cwd(),i){let o=i??b(e.execution_id,n),a=D(o,"tests",t);return await P.mkdir(D(o,"coverage"),{recursive:!0}),await P.writeFile(D(o,"coverage",".keep"),""),await P.mkdir(a,{recursive:!0}),await P.writeFile(D(o,"run.yaml"),Ie(e)),r&&await P.writeFile(D(a,r.path),r.content),o}async function Qt(e,t=process.cwd()){let r=b(e.execution_id,t);await P.mkdir(D(r,"coverage"),{recursive:!0}),await P.writeFile(D(r,"coverage",".keep"),"");let n=T(Ie(e));return n.environment&&delete n.environment.run_kind,await P.writeFile(D(r,"run.yaml"),S(n,{lineWidth:-1})),r}async function qt(e,t=process.cwd()){return W(b(e,t),new Date().toISOString())}async function Pe(e,t=process.cwd()){await P.rm(b(e,t),{recursive:!0,force:!0})}import{promises as Ce}from"fs";import{join as Ae}from"path";function Oe(e){let t={evidence:"0.1",test:e.testId,status:e.status,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{},...e.definitionPath?{definition:{path:e.definitionPath}}:{},...e.definitionId?{definition_id:e.definitionId}:{},...e.assuranceId?{assurance_id:e.assuranceId}:{},...Object.keys(e.externalId).length?{external_id:e.externalId}:{},...e.tags&&e.tags.length?{tags:e.tags}:{},...Object.keys(e.environment).length?{environment:e.environment}:{},steps:e.steps};return S(t,{lineWidth:-1})}function De(e){return S({logs:e},{lineWidth:-1})}async function $e(e,t,r){await Ce.writeFile(Ae(e,"tests",t,"result.yaml"),r)}async function Fe(e,t,r){let n=Ae(e,"tests",t,"logs");await Ce.mkdir(n,{recursive:!0}),await Ce.writeFile(Ae(n,"meta.yaml"),r)}import{promises as se}from"fs";import{join as mt}from"path";function gt(e){return mt(e,".internal","meta.json")}async function vt(e){let t;try{t=await se.readFile(gt(e),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function Le(e,t){let r;try{r=await vt(e)??{}}catch(a){console.warn(`evidence: meta.json at ${e} unreadable \u2014 skipping execution-pointer append to preserve identity`,a);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(t),r.executions=n,await se.mkdir(mt(e,".internal"),{recursive:!0});let i=gt(e),o=`${i}.tmp-${process.pid}-${Date.now()}`;await se.writeFile(o,JSON.stringify(r,null,2)+`
|
|
3
|
+
`),await se.rename(o,i)}async function er(e){try{let t=await vt(e);return t&&Array.isArray(t.executions)?t.executions:[]}catch{return[]}}async function tr(e,t,r=process.cwd()){let n=await ve(e,r);if(!n){let o=`evidence: no pack found for "${e}"`;return t.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:e})):console.error(o),2}let i=await K(n,t.profile??"L1");return t.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${t.profile??"L1"}, status ${i.status})`),i.valid?0:1}function Te(e){let t=[];for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)t.push(M(i))}return we(t)}function rr(e){let t=null;for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(t==null||j[M(i)]>j[M(t)]||j[M(i)]===j[M(t)]&&i>t)&&(t=i)}return t}import{promises as nr}from"fs";import{extname as ht,basename as ir}from"path";var or={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function Ne(e){let t;try{t=await nr.readdir(e)}catch{return[]}return t.filter(r=>r!=="meta.yaml").sort().map(r=>({name:ir(r,ht(r)),file:r,format:or[ht(r)]??"txt"}))}import{mkdirSync as sr,appendFileSync as cr}from"fs";import{join as wt}from"path";function je(e,t){return wt(e,"tests",t,"logs")}function Me(e,t,r,n={},i){try{i?.(t,r,r,n)}catch{}if(e)try{sr(e,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:t,event:r,...n})+`
|
|
4
|
+
`;cr(wt(e,"diagnostics.ndjson"),o)}catch{}}import{promises as $}from"fs";import{join as G}from"path";async function ar(e){try{let t=G(e,"tests"),r=await $.readdir(t).catch(()=>[]);for(let n of r){let i=G(t,n,"steps"),o=await $.readdir(i).catch(()=>[]);for(let a of o){let s=await $.readFile(G(i,a,"failure.yaml"),"utf8").catch(()=>null);if(s!=null)try{let u=T(s);if(u&&typeof u=="object"&&u.triage)return!0}catch{}}}}catch{}return!1}async function yt(e,t,r){let n=G(e,"tests",t,"logs");if(r)try{await $.mkdir(n,{recursive:!0}),await $.copyFile(r,G(n,"tui.log"))}catch{}let i=await Ne(n);i.length&&await Fe(e,t,De(i))}async function Ve(e){let t=e.cwd??process.cwd(),r=e.packDir??b(e.executionId,t);if(!e.saved&&!e.packDir)return await Pe(e.executionId,t),{sealed:!1};await yt(r,e.testId,e.tuiLogPath);let n=G(r,"run.yaml"),i=T(await $.readFile(n,"utf8"));i.environment={...i.environment??{},saved:e.saved,run_kind:e.runKind},await $.writeFile(n,S(i,{lineWidth:-1}));let o=await $.open(n,"r+");try{await o.sync()}finally{await o.close()}let a=await ar(r);await W(r,new Date().toISOString());let s;try{let c=await K(r,"L1");s=c.valid;let p=(c.diagnostics??[]).filter(l=>String(l?.code??"").includes("failure.status_disagrees"));if(p.length>0)if(e.expectStatusDisagrees||a){let l=e.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 ${l}`)}else console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,p);if(!c.valid){console.warn(`evidence: sealed pack ${e.executionId} failed L1 validation`,c.diagnostics);let l=String(c.diagnostics?.[0]?.code??"");Me(je(r,e.testId),"warn","EVIDENCE_INVALID",{execution_id:e.executionId,first_code:l,surface:e.surface??"testmd"},e.log)}}catch(c){console.warn(`evidence: validation error for ${e.executionId}`,c)}let u;if(e.saved&&e.packDir)try{u=await ct(r,e.executionId,t)}catch(c){console.warn(`evidence: store install failed for ${e.executionId}`,c)}if(e.outputStemDir)try{await Le(e.outputStemDir,{execution_id:e.executionId,run_kind:e.runKind,status:e.verdict,valid:s,at:new Date().toISOString()})}catch(c){console.warn(`evidence: execution-pointer append failed for ${e.executionId} (pack is sealed)`,c)}return{sealed:!0,valid:s,storePath:u}}import{release as _t}from"os";import{execFileSync as dr}from"child_process";var xt=!1,ce;function ur(){if(!xt)if(xt=!0,process.platform==="darwin")try{ce=dr("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{ce=_t()||void 0}else ce=_t()||void 0;return ce}function Be(e){let t={os:ke(process.platform)},r=ur();if(r&&(t.os_version=r),e.cdpBrowser){let n=/^([A-Za-z]+)\/(\d+)/.exec(e.cdpBrowser);n&&(t.browser=n[1].replace(/^Headless/,""),t.browser_version=n[2])}return e.resolution&&(t.resolution=e.resolution),t}async function St(e){if(e)try{let t=await fetch(`${e}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return;let r=await t.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function lr(e){let t;return()=>(t||(t=St(e)),t)}import{promises as Ue,existsSync as He,readFileSync as gr}from"fs";import{basename as vr,join as F}from"path";import{readFileSync as pr}from"fs";import{dirname as fr,resolve as mr}from"path";function bt(e,t){let r=mr(e),n=pr(r,"utf8");return N(t?J(n,te(fr(r),t)):n)}var X=class e{constructor(t){this.opts=t}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_packDirOverride;_attached=!1;get attached(){return this._attached}static async attach(t){let r=vr(t.packDir).replace(/\.evidence$/,""),n=new e({origin:"testrun",runKind:"author",pid:process.pid,title:t.testId,started:new Date().toISOString(),producerVersion:it,cwd:t.cwd});n.executionId=r,n.testId=t.testId,n._packDirOverride=t.packDir,n._attached=!0;let i=F(t.packDir,"tests",t.testId);return await Ue.mkdir(i,{recursive:!0}),t.definition&&(await Ue.writeFile(F(i,t.definition.path),t.definition.content),n.definitionPath=t.definition.path,n.definitionContent=t.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=ge(),this.testId=this.opts.testmdRelPath?xe(this.opts.testmdRelPath):Se(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let t=this.opts.definition??null;return await Re({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,t,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),t&&(this.definitionPath=t.path,this.definitionContent=t.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?F(this.opts.packRootDir,`${this.executionId}.evidence`):b(this.executionId,this.opts.cwd)}get packTestDir(){return F(this.pack,"tests",this.testId)}async writeDefinition(t,r="test.md"){await Ue.writeFile(F(this.packTestDir,r),t),this.definitionPath=r,this.definitionContent=t}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=F(this.opts.cwd,this.opts.testmdRelPath);if(He(t))return U(gr(t,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=F(this.opts.cwd,this.opts.testmdRelPath),r=F(this.opts.cwd,".context"),n=He(r)?O(r):void 0;if(He(t))return bt(t,n)}if(this.definitionContent!=null)return N(this.definitionContent)}catch{}}noteSpawn(t){this.accumulatedSteps.push(...t.steps),this.maxOrdinal=Math.max(this.maxOrdinal,t.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}async writeResult(t){let r=Te(t.spawns),n=this.pack;await $e(n,this.testId,Oe({testId:this.testId,status:r,durationMs:t.durationMs,definitionPath:this.definitionPath,definitionId:this.computeDefinitionId(),assuranceId:this.computeAssuranceId(),externalId:be(t.externalIdInput),environment:Ee(t.runnerEnv,t.intentEnv),steps:t.steps,tags:t.tags}));let i=t.externalIdInput;return t.log&&(i.commit_id||i.test_id||i.testcase_id)&&t.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:i.commit_id??null,test_id:i.test_id??null,testcase_id:i.testcase_id??null,project_id:i.project_id??null,session_id:i.session_id??null,session_name:i.session_name??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function hr(e,t,r=he){try{let n=await r(e);if(n.aborted.length>0||n.removed.length>0)try{t?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as Jr}from"fs";import{existsSync as Ye,mkdirSync as Ur,readdirSync as Hr,readFileSync as Gr,rmSync as zr,statSync as Yr,writeFileSync as Kr}from"fs";import{join as z}from"path";var wr={window:10,latest_only:!1,stale_at_run_weight:.5,counted_verdicts:["passed","failed"],accepted_oracle_modes:["authored","inferred","runtime-derived"],verified_threshold:.5,min_passes:1,risk_weights:{high:3}},yr={window:10,latest_only:!0,stale_at_run_weight:0,counted_verdicts:["passed","failed"],accepted_oracle_modes:["authored","inferred"],verified_threshold:1,min_passes:1,risk_weights:{high:3}},_r={lenient:wr,strict:yr};function xr(e,t){let r=e.slice(-t.window),n=new Map;for(let c of r)n.set(c.execution_id,c);let i=[...n.values()].sort((c,d)=>c.ts<d.ts?-1:c.ts>d.ts?1:c.execution_id<d.execution_id?-1:1).filter(c=>t.counted_verdicts.includes(c.verdict)&&t.accepted_oracle_modes.includes(c.oracle_mode));t.latest_only&&i.length>1&&(i=[i[i.length-1]]);let o=0,a=0,s=0;for(let c of i){let d=c.stale_at_run?t.stale_at_run_weight:1;o+=d,c.verdict==="passed"&&(a+=d,s++)}let u=o>0?Math.round(a/o*100)/100:0;return{score:u,verified:u>=t.verified_threshold&&s>=t.min_passes,passes:s,counted:i.length}}function kt(e,t){let r=0,n=0;for(let i of e){let o=t.risk_weights[i.risk]??1;r+=o,i.verified&&(n+=o)}return r>0?Math.round(n/r*100):0}function Sr(e,t){let r={},n={},i=[],o=0;for(let a of e.usecases){let s=[];for(let d of a.acceptance_criteria){let p=xr(d.executions??[],t);r[d.id]=p;let l={risk:d.risk,verified:p.verified};s.push(l),i.push(l)}let u=s.filter(d=>d.verified).length,c=s.length>0&&u===s.length?"covered":u>0?"partial":"uncovered";c==="covered"&&o++,n[a.id]={status:c,pct:kt(s,t)}}return{config:t,acs:r,usecases:n,summary:{coverage_pct:kt(i,t),acs_verified:`${i.filter(a=>a.verified).length}/${i.length}`,usecases_covered:`${o}/${e.usecases.length}`,uncovered:Object.values(n).filter(a=>a.status==="uncovered").length}}}function Et(e,t=_r){return{rollup_version:1,stale_sources:new Set(e.usecases.flatMap(r=>r.stale_sources??[])).size,high_risk_gaps:(e.gaps??[]).filter(r=>r.risk==="high").length,aspects:Object.fromEntries(Object.entries(t).map(([r,n])=>[r,Sr(e,n)]))}}var C=(e,t)=>e.nameOf.get(t)??t,V=(e,t)=>!e.superseded.has(t);function br(e,t){return e.byLabel(R.SCENARIO).filter(({cid:r})=>V(e,r)).filter(({cid:r})=>e.edgesFrom(r).some(n=>n.type===H.BELONGS_TO&&e.tipOf(n.dst)===t)).map(({cid:r})=>r)}function kr(e,t,r){let n=[];for(let{cid:i}of e.byLabel(R.AC)){if(!V(e,i))continue;let o=e.edgesFrom(i).find(s=>s.type===H.SCOPED_TO);if(!o)continue;let a=e.tipOf(o.dst);a===t?n.push({cid:i,scope:{type:"usecase",ref:C(e,t)}}):r.has(a)&&n.push({cid:i,scope:{type:"scenario",ref:C(e,a)}})}return n}function Er(e){let t=e.filter(r=>r!==void 0).map(r=>r.execution);return t.includes("failed")?"failed":t.includes("blocked")?"blocked":t.includes("passed")?"passed":"not-run"}var Ir={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"};function Rr(e,t){let r=t.flatMap(n=>n?.acs??[]).filter(n=>n.ref===e).map(n=>Ir[n.verdict]??"not-run");return r.length===0?Er(t):r.includes("failed")?"failed":r.includes("blocked")?"blocked":r.includes("passed")?"passed":"not-run"}function It(e,t,r){let n=r?.scope==="run",i=[],o=new Set,a=new Map;for(let[c,d]of e.nameOf)a.set(e.tipOf(c)??c,d);let s=c=>a.get(c)??C(e,c);for(let{cid:c,content:d}of e.byLabel(R.USECASE)){if(!V(e,c)||e.trust.get(c)==="archived")continue;let p=e.tipOf(c),l=e.derivesInto(p).filter(f=>!e.superseded.has(f.ecid)),v=[...new Set(l.map(f=>String(f.props?.source_id??"")).filter(Boolean))].sort(),g=v.map(f=>{let y=e.heads.get(f);if(typeof y!="string")return{id:f};let m=e.getNode(y)?.content.blob;return{id:f,media_type:e.mediaOf(y).media_type,...typeof m=="string"?{cid:m}:{}}}),w=l[0],E=new Map;for(let f of l)f.props?.source_id&&f.props?.source_cid&&E.set(String(f.props.source_id),String(f.props.source_cid));let I=v.filter(f=>{let y=e.heads.get(f),m=E.get(f);return y!=null&&m!==void 0&&y!==m}).sort(),_=e.edgesFrom(c).filter(f=>f.type===H.DEPENDS_ON&&!e.superseded.has(f.ecid)).map(f=>Cr(e,f.dst)).filter(f=>f!==null).sort(),A=br(e,p),B=new Set(A),Y=A.map(f=>{let y=e.getNode(f)?.content??{},m=e.edgesFrom(f).filter(k=>k.type===H.EXERCISES&&!e.superseded.has(k.ecid)&&V(e,e.tipOf(k.dst))).map(k=>C(e,e.tipOf(k.dst))).sort();return{id:C(e,f),case_type:String(y.case_type??""),intent:String(y.intent??""),exercises:m}}).sort((f,y)=>f.id<y.id?-1:1),ue=!1,L=new Set([p]);for(let f of A)L.add(f);let q=kr(e,p,B).map(({cid:f,scope:y})=>{let m=e.getNode(f)?.content??{},k=[...new Set(e.edgesInto(f).filter(h=>h.type===H.VERIFIES&&!e.superseded.has(h.ecid)).map(h=>e.tipOf(h.src)).filter(h=>!!h&&V(e,h)))].sort((h,x)=>s(h)<s(x)?-1:1),le=k.length>0,pe=k.map(h=>t.get(`id:${s(h)}`)??t.get(`def:${String(e.getNode(h)?.content.definitionId??"")}`)),tt=pe.some(h=>h!==void 0);tt&&(ue=!0),L.add(f);for(let h of k)L.add(h);let Kt=le&&!tt?"unknown":e.stale(f)==="fresh"?"fresh":"stale",ee=m.expected_answer??{},fe=C(e,f),rt=k.flatMap(h=>(e.execHistory?.(s(h))??[]).map(x=>({execution_id:String(x.execution_id),ts:String(x.started_at),verdict:String(x.per_ac?.find(me=>me.ac_ref===fe)?.verdict??x.verdict),stale_at_run:!!x.stale_at_run,oracle_mode:String(x.oracle_mode),...x.via_parent?{via_parent:String(x.via_parent)}:{}}))).sort((h,x)=>h.ts<x.ts?-1:1).slice(-10);return{id:fe,text:String(m.text??""),risk:String(m.risk??""),scope:y,covered_by:k.map(h=>s(h)),...le?{link_type:"verifies"}:{},execution:Rr(fe,pe),fresh:Kt,derived:!!m.derived,...m.kind||m.expected_answer?{expected_answer:{...m.kind?{kind:String(m.kind)}:{},statement:String(m.text??""),...ee.operator!==void 0?{operator:ee.operator}:{},...ee.operand!==void 0?{operand:ee.operand}:{}}}:{},...le?{satisfied_by:k.map((h,x)=>{let me=e.getNode(h)?.content.check??{},nt=pe[x]?.steps?.checkStepId??me.verified_against;return{test:s(h),...nt?{step:nt}:{}}})}:{},...rt.length?{executions:rt}:{}}}).sort((f,y)=>f.id<y.id?-1:1);if(!(n&&!ue)){for(let f of L)o.add(f);i.push({id:C(e,c),title:String(d.title??""),...d.description||d.summary?{description:String(d.description??d.summary)}:{},...Array.isArray(d.actors)&&d.actors.length?{actors:d.actors.map(String)}:{},...d.value?{value:String(d.value)}:{},risk:String(d.risk??""),status:e.trust.get(c)==="trusted"?"approved":"draft",sources:g,...I.length?{stale_sources:I}:{},..._.length?{depends_on:_}:{},...w?{provenance:{derived_from:`${String(w.props?.source_id??"")}#${String(w.props?.anchor??"")}`}}:{},scenarios:Y,acceptance_criteria:q})}}i.sort((c,d)=>c.id<d.id?-1:1);let u=e.byLabel(R.GAP).filter(({cid:c})=>V(e,c)&&e.trust.get(c)!=="archived").filter(({content:c})=>{if(!n||typeof c.uc=="string"&&o.has(e.tipOf(c.uc)))return!0;let d=typeof c.ref=="string"?e.resolve(c.ref):null;return d!==null&&o.has(e.tipOf(d.cid))}).map(({cid:c,content:d})=>({ref:C(e,c),kind:String(d.kind??""),...d.risk?{risk:String(d.risk)}:{},...d.question?{question:Pr(d.question)}:{}})).sort((c,d)=>c.ref<d.ref?-1:1);return{usecases:i,...u.length?{gaps:u}:{},...n?{scope:"run"}:{}}}function Pr(e){if(typeof e=="string")return e;let t=e?.header;return typeof t=="string"?t:""}function Cr(e,t){let r=e.tipOf(t);return e.nodeLabel.get(r)!==R.USECASE||!V(e,r)?null:C(e,r)}import{mkdirSync as Ar,renameSync as Or,rmSync as Dr,writeFileSync as $r}from"fs";import{join as Rt}from"path";var Fr=5e6;function Pt(e,t,r){let n=Rt(e,"coverage","sources"),i=new Map,o=!1;try{for(let a of r.usecases)for(let s of a.sources){if(i.has(s.id)){s.file=i.get(s.id);continue}if(!s.cid)continue;let u=ft(t,s.cid);if(u===null||u.byteLength>Fr)continue;o||(Ar(n,{recursive:!0}),o=!0);let c=Rt(n,s.id),d=`${c}.tmp-${process.pid}`;$r(d,u),Or(d,c);let p=`coverage/sources/${s.id}`;i.set(s.id,p),s.file=p}}catch{for(let a of r.usecases)for(let s of a.sources)delete s.file;if(o)try{Dr(n,{recursive:!0,force:!0})}catch{}}}import{existsSync as ze,readFileSync as Z,renameSync as Nr,writeFileSync as jr}from"fs";import{dirname as $t,isAbsolute as Ft,resolve as Lt}from"path";var Lr=new Set(["inline","testmd","testrun"]),Tr=new Set(["inferred","authored","runtime-derived"]),Ge=new Set(["passed","failed","broken","skipped"]);function Ct(e,t,r){let n=[];if(r.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"a run with no designed units attaches no facts \u2014 skip the call"}]};let i=re(e);if(t.latestHash!==i)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(t.latestHash)} but chain head is ${String(i)} \u2014 re-open and retry`}]};let o=[];for(let s of r.facts){let u=`executions[${s.ref}]`,c=t.resolve(s.ref),d=c?t.tipOf(c.cid):null;if(!c||!d||t.superseded.has(d)){n.push({code:"UNKNOWN_REF",detail:`${u}: '${s.ref}' is not a live committed node`});continue}if(t.nodeLabel.get(d)!==R.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${u}: execution facts attach to tests \u2014 '${s.ref}' is a ${t.nodeLabel.get(d)}`});continue}if(!Lr.has(s.mode)){n.push({code:"BAD_MODE",detail:`${u}: mode '${s.mode}' not in inline|testmd|testrun`});continue}if(!Ge.has(s.verdict)){n.push({code:"BAD_VERDICT",detail:`${u}: verdict '${s.verdict}' not in ${[...Ge].join("|")}`});continue}if(!Tr.has(s.oracle_mode)){n.push({code:"BAD_ORACLE_MODE",detail:`${u}: oracle_mode '${s.oracle_mode}' not in inferred|authored|runtime-derived`});continue}if(typeof s.drift_flag!="boolean"||typeof s.stale_at_run!="boolean"){n.push({code:"MISSING_FIELD",detail:`${u}: drift_flag and stale_at_run are required booleans`});continue}if(!s.execution_id||!s.started_at||!s.definition_id_at_run){n.push({code:"MISSING_FIELD",detail:`${u}: execution_id, started_at and definition_id_at_run are required`});continue}let p=[];for(let l of s.per_ac??[]){let v=t.resolve(l.ac_ref),g=v?t.tipOf(v.cid):null;if(!v||!g||t.superseded.has(g)||t.nodeLabel.get(g)!==R.AC){n.push({code:"UNKNOWN_REF",detail:`${u}.per_ac: '${l.ac_ref}' is not a live AC`});continue}if(!Ge.has(l.verdict)){n.push({code:"BAD_VERDICT",detail:`${u}.per_ac['${l.ac_ref}']: verdict '${l.verdict}'`});continue}p.push({ac_ref:t.nameOf.get(g)??g,verdict:l.verdict})}o.push({about:d,definition_id_at_run:s.definition_id_at_run,verdict:s.verdict,...p.length?{per_ac:p}:{},drift_flag:s.drift_flag,oracle_mode:s.oracle_mode,stale_at_run:s.stale_at_run,...s.unresolved_acs?.length?{unresolved_acs:s.unresolved_acs}:{},execution_id:s.execution_id,...s.evidence_id?{evidence_id:s.evidence_id}:{},...s.duration_ms!==void 0?{duration_ms:s.duration_ms}:{},started_at:s.started_at,mode:s.mode,local:s.local,...s.via_parent?{via_parent:s.via_parent}:{}})}if(n.length>0)return{record:null,errors:n};let a=ne(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:o,source_head_moves:{}});return ie(e),{record:a.record,errors:null}}function Tt(e){let t={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of e)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(t[n.status]??0)>(t[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function Nt(e){let t=[],r=oe(e.cwd);if(!ze(r))return{synced:0,superseded:0,skipped:"no-context",warnings:t};let n=e.by??{kind:"ai",id:"exec-sync"},i=O(r),o=[],a=0,s=new Set;for(let c of e.members){let d=Ft(c.path)?c.path:Lt(e.cwd,c.path);for(let p of Mr(d)){if(s.has(p.path))continue;s.add(p.path);let l=p.path===d?void 0:U(Z(d,"utf8"))?.id,v=Z(p.path,"utf8"),g=U(v);if(!g?.id)continue;let w=i.resolve(g.id),E=w?i.tipOf(w.cid):null;if(!w||!E||i.superseded.has(E)){t.push(`sync: ${g.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let I=N(J(v,te($t(p.path),i))),_=String(i.getNode(E)?.content.test_md_blob??""),A=N(J(_,dt(i))),B=!1,Y=E;if(I===A)g.base!==A&&Dt(p.path,v,A,t);else if(g.base===A){let m=Vr(r,i,E,v,I,n);m.error?(t.push(`sync: could not supersede ${g.id}: ${m.error}`),B=!0):(a++,Y=m.newCid,B=m.oracleTier,Dt(p.path,Z(p.path,"utf8"),I,t),i=O(r))}else B=!0,t.push(g.base?`sync: ${g.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${g.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);let L=i.getNode(Y)?.content.check,q=p.path===d?c.acs??[]:[],f=q.filter(m=>At(i,m.ref)),y=q.filter(m=>!At(i,m.ref)).map(m=>m.ref);o.push({ref:g.id,definition_id_at_run:I,verdict:c.verdict,...f.length?{per_ac:f.map(m=>({ac_ref:m.ref,verdict:m.verdict}))}:{},drift_flag:B,oracle_mode:L?.expected_mode??(at(L?.operand)?"runtime-derived":"inferred"),stale_at_run:i.stale(Y)!=="fresh",...y.length?{unresolved_acs:y}:{},execution_id:c.executionId,...c.evidenceId?{evidence_id:c.evidenceId}:{},...c.durationMs!==void 0?{duration_ms:c.durationMs}:{},started_at:c.startedAt,mode:c.mode,local:c.local,...l?{via_parent:l}:{}})}}if(o.length===0)return{synced:0,superseded:a,warnings:t};let u=Ct(r,O(r),{facts:o,by:n});return u.errors?(t.push(...u.errors.map(c=>`sync facts: ${c.code}: ${c.detail}`)),{synced:0,superseded:a,warnings:t}):{synced:o.length,superseded:a,warnings:t}}function Mr(e){let t=[],r=new Set,n=i=>{if(r.has(i)||!ze(i))return;r.add(i);let o=Z(i,"utf8");for(let a of o.split(`
|
|
5
|
+
`)){let s=/^@import\s+(\S+)\s*$/.exec(a.trim());if(!s)continue;let u=Ft(s[1])?s[1]:Lt($t(i),s[1]);ze(u)&&U(Z(u,"utf8"))?.id&&n(u)}t.push({path:i})};return n(e),t}function At(e,t){let r=e.resolve(t),n=r?e.tipOf(r.cid):null;return!!(r&&n&&!e.superseded.has(n)&&e.nodeLabel.get(n)==="ac")}function Vr(e,t,r,n,i,o){let a=t.getNode(r);if(!a)return{oracleTier:!1,error:"tip unreadable"};let s=ut(n),u=String(a.content.test_md_blob??""),c=/^#\s+(.+?)\s*$/m.exec(s)?.[1]??String(a.content.title??""),d={...a.content,test_md_blob:s,definitionId:i,title:c},p=lt("test",d);if(p.length>0)return{oracleTier:!1,error:p.map(w=>w.detail).join("; ")};let l=pt("test",d);if(l===r)return{newCid:r,oracleTier:!1};let v=Ot(u)!==Ot(s),g=re(e);if(t.latestHash!==g)return{oracleTier:v,error:`store advanced under the sync (basis ${String(t.latestHash)} vs head ${String(g)}) \u2014 re-run to retry`};try{ne(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:l,label:"test",content:d}],edges:[],review:[{id:l,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:o}],supersessions:[{kind:"node",old:r,new:l,reason:"edited on disk (run sync)",by:o}],source_head_moves:{}},{expectPrev:g})}catch(w){return{oracleTier:v,error:w instanceof Error?w.message:String(w)}}return ie(e),{newCid:l,oracleTier:v}}var Br=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function Ot(e){let t=[],r=e.split(`
|
|
6
|
+
`),n=!1;for(let i of r){if(/^##\s/.test(i)){n=/\bassert\b/i.test(i);let o=Br.exec(i);o&&t.push(`v:${o[1].trim()}`);continue}n&&i.trim()!==""&&t.push(i.trim())}return t.join(`
|
|
7
|
+
`)}function Dt(e,t,r,n){try{let i=t.split(`
|
|
8
|
+
`),o=-1;if(i[0]?.trim()==="---"){for(let u=1;u<i.length;u++)if(i[u].trim()==="---"){o=u;break}}if(o<0)return;let a=!1;for(let u=1;u<o;u++){if(/^\s+base:\s*sha256:[0-9a-f]+\s*$/.test(i[u])){i[u]=i[u].replace(/sha256:[0-9a-f]+/,r),a=!0;break}if(/^assurance:\s*$/.test(i[u])&&!i.slice(u,Math.min(u+3,o)).some(c=>/^\s+base:/.test(c))){i.splice(u+2,0,` base: ${r}`),a=!0;break}}if(!a)return;let s=`${e}.tmp-sync`;jr(s,i.join(`
|
|
9
|
+
`)),Nr(s,e)}catch(i){n.push(`sync: pin refresh failed for ${e} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var Wr={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},jt=(e,t)=>{try{if(!Ye(t))return{status:"skipped",reason:"no context store at the project root"};let r=z(e,"tests");if(!Ye(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let s of Hr(r)){let u=z(r,s,"result.yaml");if(!Ye(u)||!Yr(z(r,s)).isDirectory())continue;let c=T(Gr(u,"utf8"));if(!c?.definition_id&&!c?.assurance_id)continue;let d=Tt(c.steps??[]),p={testShortId:String(c.test??s),execution:Wr[String(c.status)]??"not-run",...d.length?{acs:d}:{}};c.assurance_id&&n.set(`id:${c.assurance_id}`,p),c.definition_id&&n.set(`def:${c.definition_id}`,p)}let i=It(O(t),n,{scope:"run"}),o=Et(i);Pt(e,t,i);let a=S({...i,rollup:o},{lineWidth:-1});return Ur(z(e,"coverage"),{recursive:!0}),Kr(z(e,"coverage","usecases.yaml"),a),{status:"written"}}catch(r){try{zr(z(e,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function Xr(e){try{let t=new X({origin:"inline",runKind:"author",pid:e.pid,title:e.title,started:new Date().toISOString(),producerVersion:e.producerVersion,surfaces:e.surfaces,objectiveOrName:e.objectiveOrName,sessionId:e.sessionId,cwd:e.cwd,packRootDir:e.packRootDir}),r=await t.start();return{session:t,...r,packDir:t.pack,spawns:[],startedAtMs:Date.now(),cwd:e.cwd}}catch(t){return console.warn("evidence: inline pack creation failed",t),null}}function Zr(e,t,r){if(!e)return;e.session.noteSpawn(t),t.resolution&&(e.resolution=t.resolution);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));e.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function Qr(e){if(e)return{packTestDir:e.packTestDir,ordinalOffset:e.session.nextOrdinalOffset()}}async function qr(e,t){if(!e)return null;if(e.finalized)return e.finalized;let r=(n,i,o)=>t.log?t.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(t.recordedTestPath)try{await e.session.writeDefinition(await Jr.readFile(t.recordedTestPath,"utf8"))}catch(a){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(a)})}let n=t.cdpBrowserCapture?await t.cdpBrowserCapture():void 0,i=await e.session.writeResult({steps:e.session.steps,spawns:e.spawns.length?e.spawns:[{resultCode:null}],externalIdInput:{...t.externalIdInput,execution_id:e.executionId},runnerEnv:Be({cdpBrowser:n,resolution:e.resolution}),intentEnv:{model:t.model,platform:"Desktop",platform_type:"web"},durationMs:t.durationMs??Date.now()-e.startedAtMs,log:t.log});try{if(t.recordedTestPath){let a=Nt({cwd:t.cwd??e.cwd??process.cwd(),members:[{path:t.recordedTestPath,verdict:i,executionId:e.executionId,startedAt:new Date(e.startedAtMs).toISOString(),mode:"inline",local:t.local??!1}]});for(let s of a.warnings)r("EXEC_SYNC",s)}}catch(a){r("EXEC_SYNC","exec-sync failed",{error:String(a)})}try{let a=(t.coverageWriter??jt)(e.packDir,oe(t.cwd??e.cwd??process.cwd()));a.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${a.reason}`)}catch(a){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(a)})}let o=await Ve({executionId:e.executionId,testId:e.testId,saved:t.saved,runKind:"author",verdict:i,cwd:t.cwd??e.cwd,packDir:e.packDir,tuiLogPath:t.tuiLogPath,log:t.log,surface:"inline"});return e.finalized=o,t.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:e.executionId,verdict:i,valid:o.valid,pack:e.packDir,store_copy:o.storePath??null}),o}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as sn,openSync as cn,readSync as an,closeSync as dn}from"fs";import{basename as un,resolve as ln}from"path";import{createServer as en}from"http";import{createReadStream as tn,promises as rn}from"fs";import{randomBytes as nn}from"crypto";var ae="127.0.0.1";function Mt(e,t){if(!e)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(e.trim());if(!r)return null;let[,n,i]=r;if(n===""&&i==="")return null;if(n===""){let s=Number(i);return s===0||t===0?"unsatisfiable":{start:Math.max(0,t-s),end:t-1}}let o=Number(n);if(o>=t)return"unsatisfiable";let a=i===""?t-1:Math.min(Number(i),t-1);return a<o?null:{start:o,end:a}}async function Ke(e){let t=nn(16).toString("hex"),r=en((i,o)=>{on(i,o,e,t).catch(()=>o.destroy())});await new Promise((i,o)=>{r.once("error",o),r.listen(e.port??0,ae,()=>{r.removeListener("error",o),i()})});let n=r.address().port;return{port:n,urlFor:i=>`http://${ae}:${n}/${t}/${encodeURIComponent(i)}`,close:()=>new Promise(i=>{r.close(()=>i()),r.closeAllConnections()})}}async function on(e,t,r,n){let i=e.url??"/",o=_=>{try{r.log?.("warn","EVIDENCE_SERVE_DENIED",{reason:_,path:i})}catch{}};if(e.headers.host!==`${ae}:${e.socket.localPort}`){o("host_mismatch"),t.writeHead(403).end();return}let a=e.headers.origin;if(a!==void 0&&!r.allowedOrigins.includes(a)){o("origin_denied"),t.writeHead(403).end();return}let s=a?{"Access-Control-Allow-Origin":a,Vary:"Origin","Access-Control-Expose-Headers":"Content-Range, Content-Length"}:{};if(e.method==="OPTIONS"){let _={...s,"Access-Control-Allow-Methods":"GET, HEAD, OPTIONS","Access-Control-Allow-Headers":"range","Access-Control-Max-Age":"86400"};e.headers["access-control-request-private-network"]==="true"&&(_["Access-Control-Allow-Private-Network"]="true"),t.writeHead(204,_).end();return}if(e.method!=="GET"&&e.method!=="HEAD"){t.writeHead(405,s).end();return}let u;try{let _=new URL(e.url??"/",`http://${ae}`).pathname.split("/");if(_.length!==3||_[1]!==n){o("bad_token"),t.writeHead(404,s).end();return}u=decodeURIComponent(_[2])}catch{o("not_found"),t.writeHead(404,s).end();return}let c=r.packs.get(u);if(!c){o("not_found"),t.writeHead(404,s).end();return}let d;try{let _=await rn.stat(c);if(!_.isFile())throw new Error("not a file");d=_.size}catch{o("not_found"),t.writeHead(404,s).end();return}let p={...s,"Accept-Ranges":"bytes","Content-Type":"application/zip","Cache-Control":"no-store"};if(e.method==="HEAD"){t.writeHead(200,{...p,"Content-Length":String(d)}).end();return}let l=Mt(e.headers.range,d);if(l==="unsatisfiable"){o("unsatisfiable"),t.writeHead(416,{...s,"Content-Range":`bytes */${d}`}).end();return}let[v,g,w]=l===null?[0,d-1,200]:[l.start,l.end,206],E={...p,"Content-Length":String(g-v+1)};if(w===206&&(E["Content-Range"]=`bytes ${v}-${g}/${d}`),t.writeHead(w,E),d===0){t.end();return}let I=tn(c,{start:v,end:g});I.on("error",()=>t.destroy()),t.on("close",()=>I.destroy()),I.pipe(t)}function Q(e,t){return(t??ot(e).evidenceViewerUrl).replace(/\/+$/,"")}function We(e,t){return`${t}/?pack=${encodeURIComponent(e)}`}function Je(e){return`evidence: view locally with \`kane-cli evidence serve ${e}\``}async function pn(e,t,r={}){let n=r.out??(d=>process.stdout.write(d+`
|
|
10
|
+
`)),i=d=>(n(`error: ${d}`),2);if(t.env!=="prod"&&t.env!=="stage")return i(`invalid --env: ${String(t.env)} (expected prod or stage)`);if(t.port!==void 0&&(!Number.isInteger(t.port)||t.port<1||t.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=Q(t.env,t.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${t.viewerUrl}`)}if(e.length===0)return i("no pack paths given");let a=new Map;for(let d of e){let p=ln(d),l;try{l=sn(p)}catch{return i(`${d}: not found`)}if(l.isDirectory())return i(`${d}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!l.isFile())return i(`${d}: not a regular file`);let v=Buffer.alloc(2),g=cn(p,"r");try{an(g,v,0,2,0)}finally{dn(g)}if(v.toString("latin1")!=="PK")return i(`${d}: not a sealed evidence pack (zip magic missing)`);let w=un(p);if(a.has(w))return i(`duplicate pack basename: ${w} (URL names collide \u2014 rename one)`);a.set(w,p)}let s=r.log??((d,p,l)=>process.stderr.write(`warn: ${p} reason=${l.reason} path=${l.path}
|
|
11
|
+
`)),u;try{u=await Ke({packs:a,allowedOrigins:[new URL(o).origin],port:t.port,log:s})}catch(d){return i(`could not bind 127.0.0.1${t.port?`:${t.port}`:""} \u2014 ${d.message}`)}n(`serving ${a.size} pack${a.size===1?"":"s"} on http://127.0.0.1:${u.port}`);for(let d of a.keys()){let p=u.urlFor(d);n(d),n(` pack ${p}`),n(` viewer ${We(p,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??fn)(),await u.close(),0}function fn(){return new Promise(e=>{let t=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of t)process.on("SIGINT",r);e()})})}import{promises as de}from"fs";import{tmpdir as vn}from"os";import{join as Ut,resolve as Ze}from"path";var mn=["error","prefer_first","prefer_latest","discard"];function Vt(e){let t=e.replace(/-/g,"_");return mn.includes(t)?t:null}function Bt(e="error"){return S({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:{on_collision:e},rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function Xe(e){try{if(!e.isTTY){e.log(Je(e.packPath));return}let t=Q(e.env);await(e.renderPrompt??gn)(e.packPath,t)}catch(t){try{e.log(`evidence view failed \u2014 ${t.message}`)}catch{}}}async function gn(e,t){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-N4UED7VY.js");await new Promise(o=>{let a=n(r.default.createElement(i,{packPath:e,viewerBase:t,onDone:()=>{a.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function hn(e,t,r=process.cwd(),n={}){let i=n.out??(l=>process.stdout.write(l+`
|
|
12
|
+
`)),o=n.err??(l=>process.stderr.write(l+`
|
|
13
|
+
`)),a=l=>(o(`evidence merge: ${l}`),2);if(!t.runId)return a("--run-id is required (merged identity is the caller's fact)");if(t.rules&&t.onCollision)return a("--rules and --on-collision are mutually exclusive");let s="error";if(t.onCollision!==void 0&&(s=Vt(t.onCollision),!s))return a(`invalid --on-collision: ${t.onCollision} (expected error | prefer-first | prefer-latest | discard)`);let u=[];for(let l of e){let v=await wn(l,r);if(!v)return a(`no pack found for "${l}"`);u.push(v)}let c=t.out?Ze(r,t.out):b(t.runId,r),d=null,p;t.rules?p=Ze(r,t.rules):(d=await de.mkdtemp(Ut(vn(),"kane-merge-rules-")),p=Ut(d,"merge-rules.yaml"),await de.writeFile(p,Bt(s)));try{let l=await(n.mergeFn??st)(u,{runId:t.runId,out:c,rulesPath:p,title:t.title,finalize:t.finalize});return t.json?i(JSON.stringify(l)):yn(i,l),l.output.finalized&&!t.json&&await(n.offer??Xe)({packPath:c,env:t.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(l){let v=l instanceof Error?l.message:String(l);return l?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${v}`),1):a(v)}finally{d&&await de.rm(d,{recursive:!0,force:!0}).catch(()=>{})}}async function wn(e,t){let r=Ze(t,e);if(await Ht(r))return r;let n=b(e,t);return await Ht(n)?n:null}async function Ht(e){try{return await de.stat(e),!0}catch{return!1}}function yn(e,t){let{packs:r,tests:n,output:i}=t;e(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)e(` skipped ${o.runId}: ${o.rule} \u2014 ${o.reason}`);for(let o of n.collisions)e(` collision ${o.test}: winner ${o.winner} (${o.rule})`);for(let o of n.discarded)e(` discarded ${o}`)}import{copyFileSync as _n,existsSync as Qe,mkdirSync as xn}from"fs";import{join as Gt}from"path";function Sn(e,t,r){try{let n=Gt(e,"auteur","execution.json");if(Qe(n))return!0;for(let i of t)if(!(!i||!Qe(i)))return xn(Gt(e,"auteur"),{recursive:!0}),_n(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:t.find(i=>i&&Qe(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as bn}from"fs";import{join as kn}from"path";function et(e){let t=[],r=!0,n=o=>{if(o===null||typeof o!="object")return;let a=o;if(Array.isArray(a.operations))for(let s of a.operations){let u=s?.operation_id;typeof u=="string"&&u&&t.push(u)}if(Array.isArray(a.children)){a.content_type!=="generative_block"&&(r=!1);for(let s of a.children)n(s)}if(Array.isArray(a.branches)){r=!1;for(let s of a.branches){let u=s?.children;if(Array.isArray(u))for(let c of u)n(c)}}},i=e?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:t,linear:r}}function En(e){return et(e).ids}function qe(e,t){let r=new Set(t.map(s=>s.action_id).filter(Boolean)),n=-1;for(let s of r){let u=e.indexOf(s);u>n&&(n=u)}let i=t.reduce((s,u)=>Math.max(s,u.ordinal),0),o=new Set,a=[];for(let s of e.slice(n+1))r.has(s)||o.has(s)||(o.add(s),a.push({id:s,ordinal:++i,status:"skipped",action_id:s}));return a}function zt(e,t){let r=new Set(t),n=e.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>t.length)return null;let i=0;return e.map(o=>o.action_id?{...o,action_id:t[i++]}:o)}function In(e,t){if(e.length>t.length)return!1;for(let r=0;r<e.length;r++)if(t[r]!==e[r].action_id)return!1;return!0}function Rn(e,t,r,n=!0){if(t.length===0)return{steps:e,tail:[]};let i=(r&&n?zt(e,t):null)??e,o=i.filter(s=>s.action_id),a=new Set(t);return o.length>0&&o.every(s=>a.has(s.action_id))?{steps:i,tail:qe(t,i)}:o.length>0&&!In(o,t)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:qe(t,i)}}function Yt(e){try{let t=bn(kn(e,"auteur","execution.json"),"utf8");return et(JSON.parse(t))}catch{return{ids:[],linear:!0}}}function Pn(e){return Yt(e).ids}export{M as a,we as b,ye as c,_e as d,xe as e,Se as f,be as g,ke as h,Ee as i,Zt as j,Ie as k,Re as l,Qt as m,qt as n,Pe as o,Oe as p,De as q,$e as r,Fe as s,Le as t,er as u,tr as v,Te as w,rr as x,Ne as y,je as z,Me as A,yt as B,Ve as C,Be as D,St as E,lr as F,X as G,hr as H,Tt as I,Nt as J,jt as K,Xr as L,Zr as M,Qr as N,qr as O,Mt as P,Ke as Q,Q as R,We as S,Je as T,pn as U,Xe as V,hn as W,Sn as X,et as Y,En as Z,qe as _,zt as $,Rn as aa,Yt as ba,Pn as ca};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{c as o}from"./chunk-ZKYYZ5NO.js";import{a as n}from"./chunk-BC7UVJJB.js";import{existsSync as c}from"fs";function s(t,r){(t.err??t.out)(`error: ${r}`)}function a(t,r){let e=n(t);return c(e)?e:(s(r,"no context store here (run `kane-cli context ingest <files>` first)"),null)}async function p(t,r,e){return e?!0:t.isTTY?t.confirm(`${r}?`):(s(t,`refusing to ${r} without --yes (no TTY to confirm)`),!1)}function d(){return{out:t=>process.stdout.write(t+`
|
|
3
|
+
`),err:t=>process.stderr.write(t+`
|
|
4
|
+
`),isTTY:o(),confirm:async t=>{let{createInterface:r}=await import("readline/promises"),e=r({input:process.stdin,output:process.stdout});try{let i=await e.question(`${t} [y/N] `);return/^y(es)?$/i.test(i.trim())}finally{e.close()}},ask:async t=>{let{createInterface:r}=await import("readline/promises"),e=r({input:process.stdin,output:process.stdout});try{return await e.question(t)}finally{e.close()}}}}export{s as a,a as b,p as c,d};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as j}from"./chunk-GIRXJOJI.js";import{c as m,d as _,f as L}from"./chunk-B2PZAB7J.js";import{a as w,e as N,f as k,g as O,h as I}from"./chunk-IACKIGPX.js";import{existsSync as v,mkdirSync as M,readFileSync as S,renameSync as T,rmSync as P,writeFileSync as J}from"fs";import{dirname as W,join as b}from"path";var $=s=>b(s,"derived"),q=s=>b($(s),"index.json");function x(s,n){let t=n.startsWith("sha256:")?n.slice(7):n;return b($(s),"nodes",t.slice(0,2),t.slice(2)+".json")}function A(){return{applied:{seq:0,hash:null},heads:{},trust:{},nodeLabel:{},forward:{},extracted:[],design_of:{},exec:{},superseded:{},names:{},archivedReason:{},appliedEvents:[],conv:{},media:{}}}function D(s){let n=q(s);if(!v(n))return null;try{let t=JSON.parse(S(n,"utf8"));return t.superseded===void 0||t.names===void 0||t.archivedReason===void 0||t.appliedEvents===void 0||t.conv===void 0||t.media===void 0||t.exec===void 0||t.reverse!==void 0?null:t}catch{return null}}function U(s,n){M(W(s),{recursive:!0});let t=`${s}.tmp-${process.pid}`;J(t,n),T(t,s)}function y(s,n,t,l,a={}){let p=a.writeNodeFiles!==!1,g=new Set(n.extracted),h=new Set(n.appliedEvents);t.forEach((i,o)=>{for(let e of i.nodes){let r=x(s,e.cid);p&&!v(r)&&U(r,JSON.stringify({label:e.label,content:e.content})+`
|
|
3
|
+
`),!(e.cid in n.trust)&&e.content.derived===!0&&(n.trust[e.cid]="derived"),n.nodeLabel[e.cid]=e.label}i.proposal_id!=null&&typeof i.extraction_of=="string"&&g.add(i.extraction_of),i.design_of&&((n.design_of??={})[i.design_of.uc_cid]={engine:i.design_of.engine,seq:i.seq});for(let e of i.executions??[])((n.exec??={})[e.about]??=[]).push(e);for(let e of i.edges){let{quote:r,...d}=e.props,c=n.forward[e.src]??=[];c.some(u=>u.ecid===e.ecid)||c.push({...e,props:d}),i.proposal_id!=null&&e.type===N.DERIVES&&typeof e.props.source_cid=="string"&&g.add(e.props.source_cid)}for(let e of i.review)e.resolution==="approved"||e.resolution==="edited"?(n.trust[e.id]="trusted",delete n.archivedReason[e.id]):e.resolution==="rejected"?(n.trust[e.id]="archived",e.reason?n.archivedReason[e.id]=e.reason:delete n.archivedReason[e.id]):e.resolution==="reset"&&(n.trust[e.id]="derived",delete n.archivedReason[e.id]);for(let e of i.supersessions)e.kind==="node"?e.new===e.old?delete n.superseded[e.old]:n.superseded[e.old]=e.new:n.superseded[e.ecid]=null;for(let e of i.names??[])n.names[e.slug]=e.cid;for(let[e,r]of Object.entries(i.source_head_moves))n.heads[e]=r;for(let e of i.event_ids??[])h.add(e);if(i.media)for(let[e,r]of Object.entries(i.media)){let d=i.source_head_moves[e];typeof d=="string"&&(n.media[d]=r)}if(i.conv){let e=i.source_head_moves[i.conv.source_id];if(typeof e=="string"){let r=n.conv[i.conv.source_id],d=r&&r.chain.length>0?r.chain[r.chain.length-1]:null;i.conv.append_of===d?n.conv[i.conv.source_id]={turns:i.conv.turn,chain:[...r?.chain??[],e]}:n.conv[i.conv.source_id]={turns:i.conv.turn,chain:[e]}}}for(let[e,r]of Object.entries(i.source_head_moves))i.conv?.source_id!==e&&n.conv[e]!==void 0&&(n.conv[e]=typeof r=="string"?{turns:n.conv[e].turns,chain:[r]}:{turns:n.conv[e].turns,chain:[]});n.applied={seq:i.seq,hash:l[o]}}),n.extracted=[...g].sort(),n.appliedEvents=[...h].sort()}function F(s,n){U(q(s),JSON.stringify(n)+`
|
|
4
|
+
`)}function K(s){let n=b(s,"meta.json");if(v(n))try{let t=JSON.parse(S(n,"utf8"));if(t.schema!==w||t.canonicalizer!=="v1")throw new m(`schema fence: store is ${t.schema}/${t.canonicalizer}, this build is ${w}/${"v1"} \u2014 migrate explicitly (kane-cli context rebuild after upgrading)`)}catch(t){throw t instanceof m?t:new m(`corrupt meta.json in ${s} \u2014 fix or remove it`)}}function V(s){K(s);let n=D(s);if(n===null){n=A();let{records:a,hashes:p}=_(s);return y(s,n,a,p),F(s,n),n}let{records:t,hashes:l}=L(s,n.applied.seq,n.applied.hash);return t.length>0&&(y(s,n,t,l),F(s,n)),n}function Z(s){return P($(s),{recursive:!0,force:!0}),V(s)}function Q(s){let n=[],t=[],l=[];try{({records:t,hashes:l}=_(s))}catch(o){return{ok:!1,issues:[o instanceof m?o.message:String(o)],records:0}}let a=A();y(s,a,t,l,{writeNodeFiles:!1});let p=D(s);if(p===null)n.push("derived/index.json missing or corrupt (run kane-cli context rebuild)");else{let o=e=>JSON.stringify(R(e));for(let e of["applied","heads","trust","nodeLabel","forward","extracted","superseded","names","archivedReason","appliedEvents","conv","media","design_of","exec"])o(a[e])!==o(p[e])&&n.push(`derived drift in index.${e} (run kane-cli context rebuild)`)}let g=new Set;for(let o of Object.values(a.forward))for(let e of o)g.add(e.ecid);let h=new Set;for(let o of t)for(let e of o.supersessions)e.kind==="node"?(e.old in a.nodeLabel||n.push(`SUPERSEDE_UNKNOWN_OLD: ${e.old} (record ${o.seq})`),e.new!==null&&e.new!==e.old&&!(e.new in a.nodeLabel)&&n.push(`SUPERSEDE_UNKNOWN_NEW: ${String(e.new)} (record ${o.seq})`),e.new===e.old?h.delete(e.old):(h.has(e.old)&&n.push(`DOUBLE_SUPERSEDE: ${e.old} re-superseded while live (record ${o.seq})`),h.add(e.old))):g.has(e.ecid)||n.push(`SUPERSEDE_UNKNOWN_ECID: ${e.ecid} (record ${o.seq})`);for(let o of Object.keys(a.superseded)){let e=new Set,r=o;for(;r!==null&&r in a.superseded;){if(e.has(r)){n.push(`SUPERSEDE_CYCLE: chain from ${o} revisits ${r}`);break}e.add(r),r=a.superseded[r]}}for(let[o,e]of Object.entries(a.names))e in a.nodeLabel||n.push(`NAME_UNKNOWN_TARGET: slug ${o} \u2192 ${e} not in the graph`);for(let o of t)for(let e of o.edges){let r=a.nodeLabel[e.src]??"(unknown)",d=a.nodeLabel[e.dst]??"(unknown)";for(let c of I(e.type,r,d,e.props))n.push(`${c.code}: ${e.ecid} ${c.detail}`)}let i=new Map;for(let o of Object.values(a.forward))for(let e of o){if(e.ecid in a.superseded)continue;let r=i.get(e.type)??[];r.push(e),i.set(e.type,r)}for(let[o,e]of i){let r=O(o);if(r?.acyclic){let d=new Map;for(let f of e)d.set(f.src,[...d.get(f.src)??[],f.dst]);let c=new Map,u=f=>{c.set(f,1);for(let E of d.get(f)??[])if(c.get(E)===1||c.get(E)===void 0&&u(E))return!0;return c.set(f,2),!1};for(let f of d.keys())if(c.get(f)===void 0&&u(f)){n.push(`EDGE_CYCLE: live ${o} edges form a cycle reachable from ${f}`);break}}if(r?.cardinality==="one-live-per-src"||r?.cardinality==="one-live-per-src-and-dst"){let d=new Map;for(let c of e)c.dst in a.superseded||d.set(c.src,(d.get(c.src)??0)+1);for(let[c,u]of d)u>1&&n.push(`CARDINALITY_VIOLATION: ${u} live ${o} edges from ${c} (one-live-per-src)`)}if(r?.cardinality==="one-live-per-src-and-dst"){let d=new Map;for(let c of e)c.src in a.superseded||c.dst in a.superseded||d.set(c.dst,(d.get(c.dst)??0)+1);for(let[c,u]of d)u>1&&n.push(`CARDINALITY_VIOLATION: ${u} live ${o} edges onto ${c} (one-live-per-dst)`)}}for(let[o,e]of Object.entries(a.nodeLabel)){let r=x(s,o);if(!v(r)){n.push(`missing node file for ${o} (run kane-cli context rebuild)`);continue}try{let d=JSON.parse(S(r,"utf8"));(d.label!==e||j(d.label,d.content)!==o)&&n.push(`node file content mismatch for ${o} (run kane-cli context rebuild)`);for(let c of k(d.label,d.content))n.push(`${c.code}: ${o} ${c.detail}`)}catch{n.push(`corrupt node file for ${o} (run kane-cli context rebuild)`)}}return{ok:n.length===0,issues:n,records:t.length}}function R(s){return Array.isArray(s)?s.map(R):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).sort(([n],[t])=>n<t?-1:1).map(([n,t])=>[n,R(t)])):s}export{x as a,V as b,Z as c,Q as d};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{d as Ie,f as Te,g as Ue}from"./chunk-NWZTYAJB.js";import{a as Ce}from"./chunk-DM2GL24Z.js";import{a as Oe,b as Pe}from"./chunk-JFAFKHDX.js";import{e as L,f as re}from"./chunk-5ILXUQIX.js";import{c as Ee}from"./chunk-VJUIW2ES.js";import{b as Me,f as Fe,g as je,h as Be}from"./chunk-FXPPQL4D.js";import{b as Ae}from"./chunk-5446YVGQ.js";import{a as Ne}from"./chunk-Z56AWGVY.js";import{a as ee,d as te}from"./chunk-KHDUQ33H.js";import{a as E}from"./chunk-D5T4ARTB.js";import{b as Re}from"./chunk-B2PZAB7J.js";import{d as j}from"./chunk-IACKIGPX.js";import{appendFileSync as Qe,mkdirSync as fe,writeFileSync as ge}from"fs";import{extname as Ze,join as A}from"path";var O=class extends Error{code;constructor(e,c){super(`${e}: ${c}`),this.name="ProposalAdapterError",this.code=e}};function Ge(s){return s.version===2}function He(s,e){if(s.read_basis.length!==1)throw new O("READ_BASIS_COUNT",`read_basis must have exactly 1 element, got ${s.read_basis.length}`);let c=s.read_basis[0],h=s.use_cases.map(i=>{if(i.cite.length!==1)throw new O("CITE_COUNT",`${i.temp_ref}: cite must have exactly 1 element, got ${i.cite.length}`);let l=i.cite[0];if(l.source_id!==c.source_id)throw new O("SOURCE_MISMATCH",`${i.temp_ref}: cite source ${l.source_id} != read_basis source ${c.source_id} (single-source)`);return{temp_ref:i.temp_ref,title:i.title,...i.description!==void 0?{description:i.description}:{},...i.summary!==void 0?{summary:i.summary}:{},...i.actors!==void 0?{actors:i.actors}:{},...i.value!==void 0?{value:i.value}:{},risk:i.risk,cite:{anchor:l.anchor,quote:l.quote},...i.criteria!=null&&i.criteria.length>0?{criteria:i.criteria.map((d,p)=>{if(d.cite.source_id!==c.source_id)throw new O("SOURCE_MISMATCH",`${i.temp_ref}.criteria[${p}]: cite source ${d.cite.source_id} != read_basis source ${c.source_id} (single-source)`);return{text:d.text,cite:{anchor:d.cite.anchor,quote:d.cite.quote}}})}:{},depends_on_hint:i.depends_on_hint,matches_existing:i.matches_existing,...i.conflicts_with!=null?{conflicts_with:i.conflicts_with}:{},...i.changed?{changed:!0}:{},...i.updated!=null?{updated:i.updated}:{}}});return{version:1,read_basis:e,source:{source_id:c.source_id,source_cid:c.source_cid},use_cases:h}}function qe(s){let{contextDir:e,graph:c}=s,h=s.maxDigestBytes??4096,i={},l=[];for(let[u,m]of c.heads){if(i[u]=m,typeof m!="string")continue;let _=c.mediaOf(m),w=c.getNode(m)?.content?.blob;if(typeof w=="string")if(_.format==="image")l.push({source_id:u,cid:m,format:"image",blobRef:{path:ee(e,w),cid:w}});else{let n=te(e,w)?.toString("utf8")??"";l.push({source_id:u,cid:m,format:_.format,text:n})}}l.sort((u,m)=>u.source_id<m.source_id?-1:1);let d=[];for(let u of c.byLabel(j.STYLENOTE).sort((m,_)=>m.cid<_.cid?-1:1))c.superseded.has(u.cid)||d.push(`\u2022 ${String(u.content.statement)} [${String(u.content.learned_from_kind)}]`);let p="";for(let u of d){if(Buffer.byteLength(p+u+`
|
|
3
|
+
`,"utf8")>h)break;p+=u+`
|
|
4
|
+
`}return{read_basis:i,sources:l,styleNoteDigest:p}}function Le(s,e){let c=qe({contextDir:s,graph:e}).styleNoteDigest;return c.length>0?c:void 0}function et(s){return s.length>8&&s[0]===137&&s[1]===80&&s[2]===78&&s[3]===71?"image/png":s.length>3&&s[0]===255&&s[1]===216&&s[2]===255?"image/jpeg":s.length>12&&s.toString("ascii",0,4)==="RIFF"&&s.toString("ascii",8,12)==="WEBP"?"image/webp":null}function tt(s){return s.toString("utf8").replace(/\n$/,"").split(`
|
|
5
|
+
`).map((c,h)=>`${String(h+1).padStart(4,"0")}| ${c}`).join(`
|
|
6
|
+
`)}function We(s){return s.toISOString().replace(/[-:]/g,"").slice(0,15)}function rt(s){return s.startsWith("su-conv-")?`conv-${Re(Buffer.from(s,"utf8")).slice(0,8)}`:s}function W(s){return s.toLowerCase().trim().replace(/\s+/g," ")}function ze(s,e){let c=new Map,h=new Map,i=new Map;for(let{cid:d,content:p}of e.byLabel(j.USECASE)){if(e.superseded.has(d))continue;(e.trust.get(d)==="archived"?i:h).set(W(String(p.title??"")),d)}let l=d=>e.trust.get(d)==="archived"?{cid:d,archived:!0,reason:e.archivedReason.get(d)}:{cid:d};for(let d of s.use_cases){if(d.matches_existing){let m=d.matches_existing.cid;if(e.superseded.has(m)){let _=e.tipOf(m);m=e.superseded.has(_)?null:_}if(m!==null){c.set(d.temp_ref,l(m));continue}}let p=h.get(W(d.title));if(p){c.set(d.temp_ref,{cid:p});continue}let u=i.get(W(d.title));u&&c.set(d.temp_ref,l(u))}return c}var Ve=/^(\S+)\.criteria\[(\d+)\]/;function st(s,e,c){if(e.length===0||!e.every(i=>Ve.test(i.detail)))return!1;let h=new Map;for(let i of e){let l=Ve.exec(i.detail),d=h.get(l[1])??new Set;d.add(Number(l[2])),h.set(l[1],d)}for(let i of s.use_cases){let l=h.get(i.temp_ref);l?.size&&(i.criteria=(i.criteria??[]).filter((d,p)=>!l.has(p)),c(`${i.temp_ref}: dropped ${l.size} criteria with unverifiable cites \u2014 committed without them (criteria are hints; P2 blast-radius rule)`))}return!0}async function Je(s,e,c,h,i=()=>{},l){let d=(p,u)=>i(p,u,s.session_id);return Te(s,e,c,h,i,{async onProposalEvent(p){let u=p,m=null,_=null;if(Ge(u))try{m=He(u,s.read_basis),d("adapter",{ok:!0,use_cases:m.use_cases.length})}catch(w){_=w instanceof O?w.message:String(w),d("adapter",{ok:!1,error:_})}else m=u;return m&&m.use_cases.length===0&&e.out("warning: the agent proposed ZERO use-cases for this source"),m&&l&&await l(m),{proposal:m,error:_}}})}var ot=new Set(["agent","ci","override"]);async function It(s,e){let c=s.mode??"interactive";if(c==="interactive"){if(!e.isTTY)return e.out("extract: --mode interactive needs a TTY (use --mode agent|ci|override headless)"),2}else if(!ot.has(c))return e.out(`extract: unknown mode "${c}" \u2014 interactive | agent | ci | override`),2;let h=We(e.now?.()??new Date),i=A(e.contextDir,"logs");fe(i,{recursive:!0});let l=A(i,`extract-${h}.log`),d=`run-${h}-${Math.random().toString(36).slice(2,8)}`,p=t=>t==="error"||t==="failed_proposal"?"error":t==="repair_respawn"?"warn":"info",u=(t,a,x)=>{try{Qe(l,JSON.stringify({ts:new Date().toISOString(),level:p(t),run_id:d,...x?{session_id:x}:{},kind:t,data:a})+`
|
|
7
|
+
`)}catch{}};e.out(`trace: ${l}`),e.emit?.({type:"run_start",mode:c,trace:l});let m=Ae();if(m&&e.out(m),e.preflightTurn){let t=await e.preflightTurn();if(u("preflight",t),!t.ok)return e.out(t.message??"error: turn-endpoint preflight failed"),e.emit?.({type:"error",message:t.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),2}let _=E(e.contextDir),w=Le(e.contextDir,_);if(s.source){if(s.resume){let a="error: --source cannot be combined with --resume (the resumed session already has its scope)";return e.out(a),e.emit?.({type:"error",message:a,code:"SOURCE_WITH_RESUME"}),2}let t=_.heads.get(s.source);if(typeof t!="string"){let a=t===null?`error: --source ${s.source} was ingested but is retired \u2014 re-ingest it to extract again`:`error: --source ${s.source} is not an ingested source (kane-cli context list shows them)`;return e.out(a),e.emit?.({type:"error",message:a,code:"SOURCE_UNKNOWN"}),2}}let n=null;if(s.resume){try{n=Be(e.contextDir,s.resume,_)}catch(a){return e.out(`error: ${a instanceof Error?a.message:String(a)}`),e.emit?.({type:"error",message:`error: ${a instanceof Error?a.message:String(a)}`}),1}n.staleBasis.length>0&&e.out(`note: changed since the pause: ${n.staleBasis.join(", ")} \u2014 re-presented items may be stale`);let t=n.handle.state.held_receipts??[];if(t.length>0)if(e.chat?.holdReceipt)for(let a of t)e.chat.holdReceipt(a);else e={...e,initialMessage:[t.join(`
|
|
8
|
+
|
|
9
|
+
`),e.initialMessage].filter(Boolean).join(`
|
|
10
|
+
|
|
11
|
+
`)};n.handle.state.assumed.length>0&&e.out(`note: ${n.handle.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${s.resume} lists them`)}let pe=_.extractedSourceCids,z=!!(s.force||n?.handle.state.force),$=[],I=[];for(let[t,a]of _.heads.entries())if(a!=null&&!(s.source&&t!==s.source)){if(!s.source&&!n&&t.startsWith("su-conv-")){e.out(`skipped: ${t} \u2014 conversation source (extract it explicitly with --source ${t})`),I.push({source_id:t,reason:"conversation"});continue}if(n){let x=t in n.handle.state.read_basis,P=n.handle.state.corpus_cursor.remaining.includes(t);if(!x&&!P)continue;if(P&&!z&&pe.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),I.push({source_id:t,reason:"cached"});continue}}else if(!z&&pe.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),I.push({source_id:t,reason:"cached"});continue}$.push({source_id:t,cid:a})}if(e.emit?.({type:"corpus",sources:$,skipped:I}),$.length===0){if(n){let x=`error: resumed session's paused source (${Object.keys(n.handle.state.read_basis).join(", ")||"unknown"}) is no longer in the corpus \u2014 restore/re-ingest it and re-run --resume ${s.resume}, or discard with: kane-cli context sessions clean ${s.resume}`;return e.out(x),e.emit?.({type:"error",message:x,code:"SOURCE_MISSING"}),n.handle.release(),2}let t=I.length>0&&I.every(a=>a.reason==="conversation");return e.out(s.source?`extract: nothing to do \u2014 ${s.source} is already extracted at its current snapshot (--force to re-run)`:t?"extract: nothing to do \u2014 only conversation sources here (extract one explicitly with --source <id>)":"extract: nothing to do \u2014 every ingested source is already extracted"),0}let V=new Map;if(n&&n.questions.length>0&&!s.message){e.out(`re-presenting ${n.questions.length} unanswered question(s) from the paused session`);let t=await e.ask(n.questions.map(Fe));for(let a of t)V.set(a.id,a)}let B=e.by??{kind:"human",id:"owner"},T=c==="interactive"&&!s.plan&&!!e.chat,he=0,_e=0;try{for(let t of $){let a=E(e.contextDir),x={current:a};e.chat?.attachOnCommitted?.(r=>{x.current=r});let P=a.getNode(t.cid),U=String(P?.content.blob??""),se=te(e.contextDir,U);if(!se)return e.out(`error: ${t.source_id}: blob ${U} missing from .context/blobs`),e.emit?.({type:"error",source_id:t.source_id,message:`error: ${t.source_id}: blob ${U} missing from .context/blobs`,code:"BLOB_MISSING"}),1;let xe=a.mediaOf(t.cid),oe=xe.media_type.startsWith("image/");if(!oe){let r=et(se);if(r){e.out(`skipping ${t.source_id}: binary ${r} ingested before image support \u2014 re-ingest it (kane-cli context ingest) to extract from it`),e.emit?.({type:"source_skipped",source_id:t.source_id,reason:"binary_pre_media"});continue}}let G=oe?`0001| (image source ${t.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:tt(se),ye=We(e.now?.()??new Date),M=`${ye}-${t.source_id}`,ve=!!(n&&t.source_id in n.handle.state.read_basis)?s.resume:`ext-${ye}-${rt(t.source_id)}`,N="";if(T){let r=Ee({contextDir:e.contextDir,graph:E(e.contextDir),sessionStamp:ve,by:B});r.errors===null||r.errors[0]?.code==="CONV_SOURCE_EXISTS"?(N=r.sourceId,e.chat.attachConversationSource?.(N),x.current=E(e.contextDir)):e.out(`warning: conversation source unavailable (${r.errors[0]?.detail}) \u2014 chat adds will not land this session`)}let b={type:"run_config",version:1,session_id:ve,mode:c,source:{source_id:t.source_id,source_cid:t.cid,kind:Ze(t.source_id)||"md",numbered_text:G},existing_use_cases:a.byLabel(j.USECASE).filter(({cid:r})=>a.trust.get(r)!=="archived"&&!a.superseded.has(r)).map(({cid:r,content:o})=>({id:r,title:String(o.title??""),summary:String(o.summary??"")})),read_basis:x.current.latestHash,max_free_text_rounds:Ie,graph_reads:!0,verb:"extract",...w!==void 0?{style_note_digest:w}:{},topology:Ne(),...T?{chat:!0}:{},...oe?{image_sources:[{source_id:t.source_id,source_cid:t.cid,media_type:xe.media_type,blob_ref:{path:ee(e.contextDir,U),cid:U}}]}:{},...n&&t.source_id in n.handle.state.read_basis?{resume:{agent_state:n.handle.state.agent_state}}:{}};e.out(n&&t.source_id in n.handle.state.read_basis?`resuming: ${t.source_id} (session ${s.resume})`:`extracting: ${t.source_id} @ ${t.cid.slice(0,19)}`),e.emit?.({type:"source_start",source_id:t.source_id,cid:t.cid,index:$.indexOf(t)+1,total:$.length,resumed:!!(n&&t.source_id in n.handle.state.read_basis)}),e.chat?.ledger?.({kind:"banner",text:`source ${$.indexOf(t)+1}/${$.length} \xB7 ${t.source_id} @ ${t.cid.slice(0,19)}`}),e.chat?.setWorking?.(`extracting ${t.source_id}\u2026`);let $e=new Map;u("spawn",{source_id:t.source_id,source_cid:t.cid,resume:!!n,chat:T},b.session_id);let be=!1,Xe=async r=>{let o=L(r,G,E(e.contextDir));if(u("kane_validate",{errors:o.map(g=>g.code)},b.session_id),o.length>0){e.chat.submit("[auto-repair] the proposal failed validation: "+o.map(g=>`${g.code}: ${g.detail}`).join("; ")+" \u2014 please re-finalize with these fixed.");return}let y=E(e.contextDir),k=ze(r,y),Y=A(e.contextDir,"proposals",M);fe(Y,{recursive:!0}),ge(A(Y,"proposal.json"),JSON.stringify(r,null,2)+`
|
|
12
|
+
`);let Ke=new Map(r.use_cases.map(g=>[g.temp_ref,{resolution:"skipped"}])),K=re({contextDir:e.contextDir,graph:y,proposal:r,proposalId:M,verdicts:Ke,by:{kind:"ai",id:"extract-agent"},autoName:!0});if(K.errors){e.chat.ledger?.({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:K.errors.map(g=>`${g.code}: ${g.detail}`)});return}be=!0;let Q=K.record.nodes.length;he+=Q;let Z=r.use_cases.length-Q;{let g=E(e.contextDir),we=new Map;for(let{cid:v,content:R}of g.byLabel(j.USECASE))g.superseded.has(v)||we.set(W(String(R.title??"")),v);let me=[];for(let v of r.use_cases){let R=null;if(v.matches_existing?.cid&&g.hasNode(v.matches_existing.cid)){let q=g.tipOf(v.matches_existing.cid);R=g.superseded.has(q)?null:q}R=R??we.get(W(v.title))??null,R&&me.push({ref:v.temp_ref,cid:R})}me.length>0&&e.chat.registerAliases?.(me),x.current=g;let De=v=>{for(let[R,q]of g.names)if(q===v&&!g.superseded.has(q))return R},ke=Ce({verb:"extract",commitN:1,phase:"proposal",committed:K.record.nodes.map(v=>({cid:v.cid,...De(v.cid)?{logical_id:De(v.cid)}:{}})),reused:Z},g);e.emit?.(ke.event),e.chat.holdReceipt?.(ke.text)}u("commit",{derived:Q,evidence_matched:Z,chat:!0},b.session_id),e.chat.ledger?.({kind:"commit",ok:!0,line:`committed: ${Q} new use-case(s) as derived`+(Z>0?` \xB7 ${Z} matched existing (evidence attached, no duplicate)`:"")}),e.chat.note('chat to refine ("looks good" approves; "done" finishes)')},Se=!!(n&&t.source_id in n.handle.state.read_basis),J=Se&&V.size>0?{...e,ask:async r=>r.every(o=>V.has(o.id))?(n.handle.markApplied(r.map(o=>`resolveq:${s.resume}:${o.id}`)),e.out(`answered ${r.length} re-asked question(s) from the held resume answers`),r.map(o=>V.get(o.id))):e.ask(r)}:e;Se&&s.message&&(J={...J,initialMessage:s.message});let f=await Je(b,{...J,graphSlot:x},$e,a,u,T?Xe:void 0);if(e.chat?.setWorking?.(null),f.error)return e.out(`error: agent failed for ${t.source_id}: ${f.error}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: agent failed for ${t.source_id}: ${f.error}`}),1;if(f.highRisk)return e.out(`error: ${f.highRisk.length} high-risk decision${f.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),e.emit?.({type:"error",source_id:t.source_id,message:`error: high-risk question(s) in ci mode (fail-closed): ${f.highRisk.map(r=>r.id).join(", ")}`,code:"HIGH_RISK_CI"}),1;if(f.paused){let r=$.slice($.indexOf(t)+1).map(Y=>Y.source_id),o=n?.handle??Me(e.contextDir,{sid:b.session_id,mode:"agent",created_at:(e.now?.()??new Date).toISOString(),expires_at:new Date((e.now?.()??new Date).getTime()+1440*60*1e3).toISOString(),agent_state:f.paused.agent_state,pending:{questions:[],proposals:[]},assumed:[],read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},conv_source:N,verb:"extract",...z?{force:!0}:{}});N&&o.state.conv_source!==N&&o.save({conv_source:N});let y=e.chat?.drainHeldReceipts?.()??[];(y.length>0||(o.state.held_receipts?.length??0)>0)&&o.save({held_receipts:y}),n?.handle&&o.save({read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},...z&&!o.state.force?{force:!0}:{}}),je(o,f.paused),u("session_paused",{sid:o.state.sid},b.session_id);let k=`kane-cli context extract --resume ${o.state.sid} --mode ${c}`;return e.out(`paused: session ${o.state.sid} saved \u2014 resume with: ${k}`),e.emit?.({type:"session_paused",sid:o.state.sid,source_id:t.source_id,mode:c,resume:k,expires_at:o.state.expires_at,pending_questions:f.paused.pending.questions}),e.chat?.ledger?.({kind:"pause",sid:o.state.sid,expires_at:o.state.expires_at,resume:k,messageForm:`${k} --message "<your words>"`}),3}if(T){if(_e+=f.assumedDefaults??0,f.error)return 1;if(!be){let r=$.length-$.indexOf(t)-1;return e.out(`done \u2014 nothing committed for ${t.source_id} (no finalize before the session ended)`+(r>0?`; stopping here \u2014 ${r} remaining source(s) not extracted (re-run kane-cli context extract to continue)`:"")),n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),n=null),0}n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),n=null);continue}if(!f.proposal)return e.out(`error: agent ended without a proposal for ${t.source_id}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: agent ended without a proposal for ${t.source_id}`}),1;let D=L(f.proposal,G,a);if(u("kane_validate",{errors:D.map(r=>r.code)},b.session_id),D.length>0&&st(f.proposal,D,r=>e.out(r))&&(u("criteria_dropped",{source_id:t.source_id},b.session_id),D=L(f.proposal,G,a)),D.length>0){if(e.out("the agent's proposal didn't validate \u2014 retrying once"),e.emit?.({type:"validate_failed",source_id:t.source_id,codes:D.map(r=>r.code),repairing:!0}),u("repair_respawn",{source_id:t.source_id},b.session_id),f=await Je(b,{...J,graphSlot:x},$e,a,u),f.error||!f.proposal)return e.out(`error: repair run failed for ${t.source_id}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: repair run failed for ${t.source_id}`}),1;if(D=L(f.proposal,G,a),D.length>0){for(let r of D)e.out(` ${r.detail}`);return e.emit?.({type:"validate_failed",source_id:t.source_id,codes:D.map(r=>r.code),repairing:!1}),e.emit?.({type:"error",source_id:t.source_id,message:`error: proposal failed validation after repair (${D.map(r=>r.code).join(", ")})`}),1}}let S=f.proposal,X=ze(S,a),ie=A(e.contextDir,"proposals",M);if(fe(ie,{recursive:!0}),ge(A(ie,"proposal.json"),JSON.stringify(S,null,2)+`
|
|
13
|
+
`),s.plan){e.out(`plan: ${S.use_cases.length} use-case(s) proposed from ${t.source_id} (nothing committed)`);for(let r of S.use_cases){let o=X.get(r.temp_ref),y=o?o.archived?` \u2248 matches ARCHIVED ${o.cid.slice(0,19)}${o.reason?` \u2014 previously rejected: "${o.reason}"`:" \u2014 previously rejected"}`:` \u2248 matches ${o.cid.slice(0,19)}`:"";e.out(` [${r.risk}] ${r.title} \u2014 cite ${r.cite.anchor}${y}`)}e.emit?.({type:"plan",source_id:t.source_id,use_cases:S.use_cases.map(r=>{let o=X.get(r.temp_ref);return{risk:r.risk,title:r.title,anchor:r.cite.anchor,...o?{match:o.cid,match_archived:!!o.archived}:{}}})}),f.assumedDefaults&&e.out(`assumed: ${f.assumedDefaults} default(s) auto-taken (flagged)`);continue}for(let r of S.use_cases){if(!r.conflicts_with?.length)continue;let o=r.conflicts_with.filter(k=>a.resolve(k)!==null),y=r.conflicts_with.filter(k=>a.resolve(k)===null);y.length>0&&(e.out(`note: ${r.temp_ref}: dropped unresolvable conflict hint(s): ${y.join(", ")}`),r.conflicts_with=o.length>0?o:void 0)}u("review_start",{use_cases:S.use_cases.length,flags:X.size},b.session_id);let H=await e.review(S.use_cases,X);u("review_verdicts",[...H.entries()].map(([r,o])=>({ref:r,resolution:o.resolution})),b.session_id),ge(A(ie,"review.json"),JSON.stringify(S.use_cases.map(r=>{let o=H.get(r.temp_ref)??{resolution:"skipped"};return{id:r.temp_ref,kind:"review-item",resolution:o.resolution,edit:o.edit??null,reason:o.reason??null,...o.supersedeTarget?{supersede_target:o.supersedeTarget}:{},by:B}}),null,2)+`
|
|
14
|
+
`);let ne=a,C=re({contextDir:e.contextDir,graph:ne,proposal:S,proposalId:M,verdicts:H,by:B,autoName:!0});if(C.errors&&C.errors[0]?.code==="STALE_BASIS"){if(!await e.confirmStale(`the context changed while you reviewed (${C.errors[0].detail}) \u2014 commit against the new head anyway?`))return e.out("aborted: proposal not committed"),e.emit?.({type:"error",source_id:t.source_id,message:"aborted: proposal not committed",code:"STALE_BASIS"}),e.emit?.({type:"done",status:"aborted",exit_code:1}),1;ne=E(e.contextDir),C=re({contextDir:e.contextDir,graph:ne,proposal:S,proposalId:M,verdicts:H,by:B,allowStaleBasis:!0,autoName:!0})}if(C.errors){for(let r of C.errors)e.out(` ${r.detail}`);return e.emit?.({type:"error",source_id:t.source_id,message:`error: commit failed: ${C.errors.map(r=>`${r.code}: ${r.detail}`).join("; ")}`}),1}let Ye=new Date().toISOString();for(let r of S.use_cases){let o=H.get(r.temp_ref)??{resolution:"skipped"};for(let y of Pe({ts:Ye,command:"context extract",id:r.temp_ref,by:B},o.resolution))Oe(e.contextDir,y)}let F=C.record,ae=new Map(F.review.map(r=>[r.id,r.resolution])),ce=[...ae.values()].filter(r=>r==="approved"||r==="edited").length,ue=[...ae.values()].filter(r=>r==="rejected").length,de=F.nodes.filter(r=>!ae.has(r.cid)).length,le=F.supersessions.filter(r=>r.kind==="node"&&r.new!==r.old).length;u("commit",{trusted:ce,derived:de,archived:ue},b.session_id),e.out(`committed: ${ce} trusted, ${de} derived (queued), ${ue} archived`+(le>0?`, ${le} superseded`:"")),f.assumedDefaults&&e.out(`assumed: ${f.assumedDefaults} default(s) auto-taken (flagged)`),e.emit?.({type:"commit",source_id:t.source_id,proposal_id:M,trusted:ce,derived:de,archived:ue,superseded:le,assumed:f.assumedDefaults??0,evidence_matched:Math.max(0,S.use_cases.length-F.nodes.length),minted:F.nodes.map(r=>{let o=F.names?.find(y=>y.cid===r.cid)?.slug;return{cid:r.cid,...o?{logical_id:o}:{}}})}),n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),e.out(`session ${s.resume} complete`),e.emit?.({type:"session_complete",sid:s.resume,source_id:t.source_id}),n=null)}}finally{n?.handle.release()}if(T){let t=e.chat?.state.ledger.filter(P=>P.kind==="answer"&&P.receipt.form==="assumed").length??0,a=_e+t,x=e.chat?.state.credits?.total;e.chat?.ledger?.({kind:"summary",lines:[`committed ${he} across ${$.length} source(s)`,...a>0?[`${a} assumed default(s)`]:[],...x!==void 0?[`credits used: ${x.toFixed(1)}`]:[],`trace: ${l}`]})}return s.plan||Ue(e.contextDir),0}export{rt as a,ze as b,It as c};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as g}from"./chunk-IACKIGPX.js";import{createHash as E}from"crypto";function w(e){if(e===null)return"null";let r=typeof e;if(r==="string")return JSON.stringify(e.normalize("NFC"));if(r==="boolean")return e?"true":"false";if(r==="number"){if(!Number.isFinite(e))throw new Error("non-finite number is not canonicalizable");return JSON.stringify(e)}if(Array.isArray(e))return"["+e.map(n=>n===void 0?"null":w(n)).join(",")+"]";if(r==="object"){let n=e,s=new Map;for(let t of Object.keys(n)){if(n[t]===void 0)continue;let c=t.normalize("NFC");if(s.has(c))throw new Error(`canonicalization collision: NFC-equivalent duplicate key ${JSON.stringify(c)}`);s.set(c,n[t])}return"{"+[...s.keys()].sort((t,c)=>Buffer.compare(Buffer.from(t,"utf8"),Buffer.from(c,"utf8"))).map(t=>JSON.stringify(t)+":"+w(s.get(t))).join(",")+"}"}throw new Error("unsupported type for canonicalization: "+r)}function k(e){return E("sha256").update(e).digest("hex")}import{closeSync as $,existsSync as O,fsyncSync as x,mkdirSync as b,openSync as S,readFileSync as R,readdirSync as j,renameSync as F,rmSync as J,writeFileSync as _}from"fs";import{join as f}from"path";var a=class extends Error{};function v(e,r){if(e.schema_version!==void 0&&e.schema_version!==g)throw new a(`record ${r} is stamped ${e.schema_version}, this build reads ${g} \u2014 migrate explicitly`);if(e.parents!==void 0&&!(e.prev_hash===null?e.parents.length===0:e.parents.length===1&&e.parents[0]===e.prev_hash))throw new a(`record ${r}: parents does not mirror prev_hash \u2014 multi-parent records need a DAG-aware reader`)}function z(e){b(e,{recursive:!0});let r=f(e,".lock"),n=Date.now()+2e3;for(;;)try{let s=S(r,"wx");return _(s,`${process.pid}
|
|
3
|
+
`),$(s),()=>{try{J(r)}catch{}}}catch(s){if(s.code!=="EEXIST")throw s;if(Date.now()>n)throw new a(`.context is locked by another process \u2014 remove ${r} if that process is gone`);Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,25)}}var A=/^\d{6}-[0-9a-f]{12}\.json$/,p=e=>f(e,"commits");function y(e){return"sha256:"+k(Buffer.from(w(e),"utf8"))}function q(e){let r=p(e);return O(r)?j(r).filter(n=>A.test(n)).sort():[]}function T(e){let r=q(e),n=[],s=[],i=null;return r.forEach((t,c)=>{let d=R(f(p(e),t),"utf8"),o;try{o=JSON.parse(d)}catch(l){throw new a(`corrupt commit record ${t}: ${String(l)}`)}if(o.seq!==c+1)throw new a(`sequence gap: expected seq ${c+1}, ${t} has ${o.seq}`);if(o.prev_hash!==i)throw new a(`broken chain at ${t}: prev_hash ${String(o.prev_hash)} != ${String(i)}`);v(o,t);let m=y(o),h=t.slice(7,19);if(!m.slice(7).startsWith(h))throw new a(`tampered record ${t}: content hash ${m} does not match filename`);n.push(o),s.push(m),i=m}),{records:n,hashes:s}}function N(e){let r=q(e);if(r.length===0)return null;let n=r[r.length-1],s=R(f(p(e),n),"utf8"),i;try{i=JSON.parse(s)}catch(c){throw new a(`corrupt tail record ${n}: ${String(c)}`)}v(i,n);let t=y(i);if(!t.slice(7).startsWith(n.slice(7,19)))throw new a(`tampered tail record ${n}: content hash ${t} does not match filename`);if(i.seq!==r.length)throw new a(`sequence gap at tail: ${r.length} record files but tail seq is ${i.seq}`);return{seq:i.seq,hash:t}}function G(e){return N(e)?.hash??null}function V(e,r,n){let s=q(e);if(s.length<r)throw new a(`derived state is ahead of the record log (applied seq ${r}, ${s.length} records) \u2014 run kane-cli context rebuild`);let i=[],t=[],c=n;for(let d=r;d<s.length;d++){let o=s[d],m=R(f(p(e),o),"utf8"),h;try{h=JSON.parse(m)}catch(u){throw new a(`corrupt commit record ${o}: ${String(u)}`)}if(h.seq!==d+1)throw new a(`sequence gap: expected seq ${d+1}, ${o} has ${h.seq}`);if(h.prev_hash!==c)throw new a(`broken chain at ${o}: prev_hash ${String(h.prev_hash)} != ${String(c)}`);v(h,o);let l=y(h);if(!l.slice(7).startsWith(o.slice(7,19)))throw new a(`tampered record ${o}: content hash ${l} does not match filename`);i.push(h),t.push(l),c=l}return{records:i,hashes:t}}function X(e,r,n={}){let s=z(e);try{return B(e,r,n)}finally{s()}}function B(e,r,n){let s=N(e),i=(s?.seq??0)+1,t=s?.hash??null;if(n.expectPrev!==void 0&&n.expectPrev!==t)throw new a(`concurrent append detected: validated against ${String(n.expectPrev)} but the chain head is ${String(t)} \u2014 re-open and retry`);let c={seq:i,prev_hash:t,...r,schema_version:g,parents:t===null?[]:[t]},d=y(c),o=p(e);b(o,{recursive:!0});let m=`${String(i).padStart(6,"0")}-${d.slice(7,19)}.json`,h=f(o,m),l=h+".tmp",u=S(l,"w");try{_(u,JSON.stringify(c)+`
|
|
4
|
+
`),x(u)}finally{$(u)}F(l,h);try{let C=S(o,"r");x(C),$(C)}catch{}return{seq:i,hash:d,file:h,record:c}}export{w as a,k as b,a as c,T as d,G as e,V as f,X as g};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as m}from"./chunk-L5LI2JF4.js";import{c as p}from"./chunk-
|
|
2
|
+
import{b as m}from"./chunk-L5LI2JF4.js";import{c as p}from"./chunk-MKD3KZPM.js";import{randomUUID as E}from"crypto";import{mkdirSync as F,writeFileSync as f,appendFileSync as O,existsSync as v}from"fs";import{join as u}from"path";import{writeFileSync as w,mkdirSync as x,existsSync as I}from"fs";import{join as h,relative as j}from"path";function _(n){let t=Object.keys(n.frontmatter).length>0?m(n.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${n.heading}`,""),n.steps.forEach((i,r)=>{s.push(`## Step ${r+1}`,i,"")}),s.join(`
|
|
3
3
|
`)}function C(n,e){let t={},s={},i=e;for(let[r,l]of Object.entries(n)){if(r.startsWith("global.")||r.startsWith("secrets.user.")||r.startsWith("environment.")){let o=r.startsWith("secrets.user.");t[r]={value:l.value,secret:o,syntax:`{{${r}}}`,type:o?"secret":r.startsWith("environment.")?"environment":"global"},s[r]=r;continue}if(l.secret){let o=`secrets.user.${r}`;t[o]={value:l.value,secret:!0,syntax:`{{secrets.user.${r}}}`,type:"secret"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{secrets.user.${r}}}`)}else{let o=`global.${r}`;t[o]={value:l.value,secret:!1,syntax:`{{global.${r}}}`,type:"global"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{global.${r}}}`)}}return{variables:t,objective:i,keyMap:s}}var y=/\{\{\s*(?:global|secrets\.user|environment)\.([^{}]+?)\s*\}\}/g;function c(n){return typeof n!="string"||!n.includes("{{")?n:n.replace(y,"{{$1}}")}function d(n){if(typeof n=="string")return c(n);if(Array.isArray(n))return n.map(e=>d(e));if(n&&typeof n=="object"){let e={};for(let[t,s]of Object.entries(n))e[t]=d(s);return e}return n}var L=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),N=new Set(["model","env"]),g=class{constructor(e){this.opts=e}objectives=[];flushed=!1;lastWrittenPath=null;lastCollisionSuffixed=!1;appendObjective(e){this.objectives.push(e)}flush(){if(this.flushed||(this.flushed=!0,this.objectives.length===0))return;let e=this.opts.getName();if(!e)return;let t=h(this.opts.cwd,".testmuai","tests");try{x(t,{recursive:!0})}catch(a){process.stderr.write(`
|
|
4
4
|
\u26A0 Failed to create ${j(this.opts.cwd,t)}/
|
|
5
5
|
${a.message}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{x as o}from"./chunk-
|
|
2
|
+
import{x as o}from"./chunk-MKD3KZPM.js";import{a as m}from"./chunk-HCBYKLMW.js";import{a as e,b as i}from"./chunk-C44QQJR4.js";import{e as d}from"./chunk-UR6MHSHU.js";var r=d(m(),1),s={default:o.muted,error:o.red,success:o.green,info:o.orange,warning:o.orange};function h({title:t,titleColor:a,borderColor:l,variant:n="default",children:c,width:u,paddingX:x=2,paddingY:g=0,marginBottom:f=0}){let p=l??s[n],B=a??(n==="default"?o.orange:s[n]);return(0,r.jsxs)(e,{flexDirection:"column",marginBottom:f,children:[t&&(0,r.jsx)(e,{marginBottom:0,children:(0,r.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,r.jsx)(e,{borderStyle:"round",borderColor:p,flexDirection:"column",paddingX:x,paddingY:g,width:u,children:c})]})}function k({label:t,value:a,labelColor:l=o.dim,valueColor:n,labelWidth:c=14}){return(0,r.jsxs)(e,{children:[(0,r.jsx)(e,{width:c,flexShrink:0,children:(0,r.jsx)(i,{color:l,children:t})}),(0,r.jsx)(e,{flexShrink:1,children:(0,r.jsx)(i,{color:n,wrap:"wrap",children:a})})]})}function I({label:t}){return(0,r.jsx)(e,{marginTop:1,marginBottom:0,children:(0,r.jsx)(i,{bold:!0,children:t})})}export{h as a,k as b,I as c};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{x as m}from"./chunk-
|
|
2
|
+
import{x as m}from"./chunk-MKD3KZPM.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{d,e as f}from"./chunk-IACKIGPX.js";var G={high:3,med:2,low:1},R={create:0,evolve:1,"reuse-candidate":2},_=.75;function a(e,n){return!e.superseded.has(n)&&e.trust.get(n)!=="archived"}function m(e,n="med"){let t=e.risk;return t==="high"||t==="med"||t==="low"?t:n}function l(e,n){return e.nameOf.get(n)??n}function y(e,n){return`kane-cli design tests --use-case ${l(e,n)}`}function b(e,n){let t=e.edgesFrom(n).find(i=>i.type===f.SCOPED_TO&&a(e,i.dst));if(!t)return null;let s=e.nodeLabel.get(t.dst);if(s===d.USECASE)return t.dst;if(s===d.SCENARIO){let i=e.edgesFrom(t.dst).find(r=>r.type===f.BELONGS_TO&&a(e,r.dst));return i?i.dst:null}return null}function v(e,n){let t=b(e,n);return t?y(e,t):w(e,n)}function w(e,n){return`kane-cli design explain ${l(e,n)}`}function E(e,n){let t=e.edgesFrom(n).find(i=>i.type===f.AUTOMATES&&a(e,i.dst));if(!t)return null;let s=e.edgesFrom(t.dst).find(i=>i.type===f.BELONGS_TO&&a(e,i.dst));return s?s.dst:null}function S(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.AC))!a(e,t)||e.edgesInto(t).filter(r=>r.type===f.VERIFIES&&a(e,r.src)).length>0||n.push({ref:l(e,t),kind:"no-verifies",why:"no live test verifies this acceptance criterion",risk:m(s),stage:"design",tag:"create",ready_command:v(e,t)});return n}function h(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.USECASE)){if(!a(e,t))continue;let i=e.edgesInto(t).filter(o=>o.type===f.BELONGS_TO&&a(e,o.src));if(i.length===0){n.push({ref:l(e,t),kind:"zero-scenario",why:"use-case has no scenarios",risk:m(s),stage:"design",tag:"create",ready_command:y(e,t)});continue}i.every(o=>e.getNode(o.src)?.content.case_type==="happy")&&n.push({ref:l(e,t),kind:"happy-only",why:"use-case is exercised by happy-path scenarios only",risk:m(s),stage:"design",tag:"create",ready_command:y(e,t)})}return n}function x(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.GAP)){if(!a(e,t))continue;let i=s.ref,r=typeof i=="string"?e.resolve(i):null,o=r&&a(e,r.tip)?r.tip:null,u=o?e.nodeLabel.get(o):null,p=u===d.USECASE?y(e,o):u===d.AC?v(e,o):w(e,t),c=s.question&&typeof s.question=="object"?s.question:void 0,k=typeof s.text=="string"&&s.text||(c&&typeof c.header=="string"?c.header:"")||"design gap";n.push({ref:l(e,t),kind:String(s.kind),why:k,risk:m(s),stage:"design",tag:"create",ready_command:p,...typeof s.risk_rationale=="string"?{risk_rationale:s.risk_rationale}:{},...c?{question:c}:{}})}return n}function L(e){let n=[];for(let{cid:t,content:s}of e.byLabel(d.AC)){if(!a(e,t))continue;let i=e.stale(t);i==="fresh"||i==="superseded"||n.push({ref:l(e,t),kind:"stale-ac",why:`acceptance criterion is ${i} \u2014 its source moved since this was authored`,risk:m(s),stage:"design",tag:"evolve",ready_command:v(e,t)})}for(let{cid:t,content:s}of e.byLabel(d.TEST)){if(!a(e,t))continue;let i=e.stale(t);if(i==="fresh"||i==="superseded")continue;let r=e.edgesFrom(t).filter(g=>g.type===f.VERIFIES&&a(e,g.dst)),o=r.map(g=>m(e.getNode(g.dst)?.content??{})),u=o.includes("high")?"high":o.includes("med")?"med":o.includes("low")?"low":"med",p=r[0]?.dst??null,c=p?null:E(e,t),k=p?v(e,p):c?y(e,c):w(e,t);n.push({ref:l(e,t),kind:"stale-test",why:`test is ${i} \u2014 its source moved since this was authored`,risk:u,stage:"design",tag:"evolve",ready_command:k})}return n}async function C(e,n,t){for(let s of e)if(s.tag==="create"){if(!t){s.meta={embed_arm:"skipped"};continue}try{let i=n.resolve(s.ref),r=i?n.getNode(i.tip):null,o=r&&(String(r.content.title??"")||String(r.content.text??""))||s.why,u=r?.label===d.USECASE?"scenario":"test",c=(await t.searchSimilar(o,{label:u,k:1}))[0];c&&c.score>=_?(s.tag="reuse-candidate",s.meta={embed_arm:"used",near_hit:{ref:l(n,c.cid),score:c.score}}):s.meta={embed_arm:"used",near_hit:null}}catch{s.meta={embed_arm:"skipped"}}}}function O(e,n){let t=G[n.risk]-G[e.risk];if(t!==0)return t;let s=R[e.tag]-R[n.tag];return s!==0?s:e.ref<n.ref?-1:e.ref>n.ref?1:0}function A(e,n){let t=[],s=r=>{let o=e.resolve(r);return o&&!o.superseded?m(e.getNode(o.tip)?.content??{}):"med"},i=r=>{let o=e.resolve(r),u=o&&!o.superseded?b(e,o.tip):null;return u?l(e,u):r};for(let r of n.usecases??[])for(let o of r.acceptance_criteria??[])(o.covered_by??[]).length>0&&(o.execution==="failed"?t.push({ref:o.id,kind:"execution-failed",stage:"cover",tag:"evolve",risk:s(o.id),why:`covering test failed against this AC (tests: ${(o.covered_by??[]).join(", ")})`,ready_command:`kane-cli maintain evolve ${i(o.id)}`}):o.execution==="blocked"?t.push({ref:o.id,kind:"execution-blocked",stage:"cover",tag:"reuse-candidate",risk:s(o.id),why:"the oracle could not run (infrastructure) \u2014 the covering test exists and is reusable",ready_command:"kane-cli testrun run"}):o.execution==="not-run"&&t.push({ref:o.id,kind:"covered-not-run",stage:"cover",tag:"reuse-candidate",risk:s(o.id),why:"a covering test exists but never joined this pack \u2014 run it",ready_command:"kane-cli testrun run"}));return t}async function I(e,n,t,s){if(n!=="design"&&!s)throw new Error(`gaps-engine: stage "${n}" requires a pack's usecases doc`);let i=[];return(n==="design"||n==="all")&&i.push(...S(e),...h(e),...x(e),...L(e)),(n==="cover"||n==="all")&&i.push(...A(e,s)),await C(i,e,t),i.sort(O),i}export{I as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as c}from"./chunk-
|
|
2
|
+
import{a as c}from"./chunk-INP7FG6V.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{u as s,v as a}from"./chunk-MKD3KZPM.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as L,b as N}from"./chunk-AE6SS34N.js";import{c as G}from"./chunk-B2PZAB7J.js";import{e as _,g as v}from"./chunk-IACKIGPX.js";import{existsSync as k,readFileSync as q}from"fs";function J(a){let s=N(a),u=new Map(Object.entries(s.heads)),d=new Map(Object.entries(s.trust)),r=new Map(Object.entries(s.nodeLabel)),i=new Map(Object.entries(s.superseded)),g=new Map(Object.entries(s.names)),R=new Map(Object.entries(s.archivedReason)),I=new Set(s.appliedEvents),S=new Map(Object.entries(s.conv)),T=e=>s.media[e]??{format:"text",media_type:"text/plain",anchors_supported:["L-L"]},M=new Map;for(let[e,t]of g)M.set(t,e);let h=new Map,E=e=>{if(h.has(e))return h.get(e);if(!r.has(e))return h.set(e,null),null;let t=L(a,e);if(!k(t))throw new G(`derived node file missing for ${e} \u2014 run kane-cli context rebuild`);let n=JSON.parse(q(t,"utf8"));return h.set(e,n),n},m=e=>{let t=e,n=new Set;for(;i.has(t)&&!n.has(t);){n.add(t);let o=i.get(t);if(typeof o!="string")break;t=o}return t},x=e=>{let t=u.get(e),n=r.has(e)?e:g.get(e)??(typeof t=="string"?t:void 0);if(n===void 0||!r.has(n))return null;let o=m(n);return{cid:n,tip:o,superseded:i.has(n)||i.has(o)}},b=new Map;for(let e of Object.values(s.forward))for(let t of e){let n=b.get(t.dst);n?n.push(t):b.set(t.dst,[t])}let w=e=>(e??[]).filter(t=>!i.has(t.ecid)),C=e=>w(b.get(e)),O=e=>C(e).filter(t=>t.type===_.DERIVES),y=e=>w(s.forward[e]).some(t=>v(t.type)?.pin?.comparesTo==="dst_tip"&&i.has(t.dst)),F=e=>{if(i.has(e))return"superseded";let t=O(e);if(t.length===0)return y(e)?"stale":"fresh";let n=new Map;for(let p of t)n.set(p.props.source_id,p);let o=!1,f=!1;for(let[p,c]of n){let l=u.get(p);if(l!=null&&(o=!0,l!==c.props.source_cid)){let j=S.get(p)?.chain;(!j||!j.includes(c.props.source_cid))&&(f=!0)}}return o?f||y(e)?"stale":"fresh":"orphaned"};return{heads:u,trust:d,nodeLabel:r,superseded:i,names:g,nameOf:M,archivedReason:R,appliedEvents:I,convChains:S,mediaOf:T,extractedSourceCids:new Set(s.extracted),designOf:new Map(Object.entries(s.design_of??{})),latestHash:s.applied.hash,lastSeq:s.applied.seq,hasNode:e=>r.has(e),getNode:E,byLabel:e=>[...r.entries()].filter(([,t])=>t===e).map(([t])=>({cid:t,content:E(t)?.content??{}})),edgesFrom:e=>w(s.forward[e]),edgesInto:C,derivesInto:O,resolve:x,tipOf:m,stale:F,staleList:()=>[...r.keys()].map(e=>({cid:e,state:F(e)})).filter(e=>e.state!=="fresh"),execHistory:e=>{let t=x(e);if(!t)return[];let n=m(t.cid),o=new Set([n]),f=!0;for(;f;){f=!1;for(let[c,l]of i)l!==null&&o.has(l)&&!o.has(c)&&(o.add(c),f=!0)}let p=[];for(let c of Object.entries(s.exec??{}))o.has(c[0])&&p.push(...c[1]);return p.sort((c,l)=>c.started_at<l.started_at?-1:1)}}}function V(a,s){if(a.stale(s)!=="stale")return!1;let u=new Map;for(let d of a.derivesInto(s))u.set(d.props.source_id,d);for(let[d,r]of u){let i=a.heads.get(d);if(i==null||i===r.props.source_cid)continue;let g=a.convChains.get(d)?.chain;if(!g||!g.includes(r.props.source_cid))return!0}for(let d of a.edgesFrom(s)){if(v(d.type)?.pin?.comparesTo!=="dst_tip"||!a.superseded.has(d.dst))continue;let r=a.tipOf(d.dst);if(a.superseded.has(r)||a.nodeLabel.get(r)==="usecase")return!0}return!1}export{J as a,V as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as R}from"./chunk-HCBYKLMW.js";import{a as h,d as k}from"./chunk-C44QQJR4.js";import{a as A}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var e=p(A(),1);var a=p(R(),1),g=(0,e.createContext)(null),T=250;function C({children:d}){let[s,x]=(0,e.useState)([]),m=(0,e.useRef)(0),f=(0,e.useRef)([]),c=(0,e.useRef)(null),u=(0,e.useRef)(new Map),b=(0,e.useRef)(0),S=(0,e.useRef)(0);(0,e.useEffect)(()=>{for(let r=S.current;r<s.length;r++){let i=s[r];b.current=i.seq;let t=u.current.get(i.seq);if(t){u.current.delete(i.seq);for(let n of t)n()}}S.current=s.length},[s]),(0,e.useEffect)(()=>()=>{c.current&&clearTimeout(c.current)},[]);let P=(0,e.useMemo)(()=>{let r=()=>{c.current&&(clearTimeout(c.current),c.current=null);let t=f.current;t.length!==0&&(f.current=[],x(n=>[...n,...t]))},i=()=>{c.current||(c.current=setTimeout(()=>{c.current=null,r()},0))};return{append:(t,n)=>{let o=++m.current;if(n){let l=u.current.get(o)??[];l.push(n),u.current.set(o,l)}f.current.push({id:`sb-${o}`,seq:o,content:t}),i()},flush:()=>{r();let t=m.current;return t===0||b.current>=t?Promise.resolve():new Promise(n=>{let o=!1,l=()=>{o||(o=!0,clearTimeout(q),n())},q=setTimeout(l,T),v=u.current.get(t)??[];v.push(l),u.current.set(t,v)})}}},[]);return(0,a.jsxs)(g.Provider,{value:P,children:[s.length>0&&(0,a.jsx)(k,{items:s,children:r=>(0,a.jsx)(h,{children:r.content},r.id)}),d]})}function I(){let d=(0,e.useContext)(g);if(!d)throw new Error("useScrollback must be used within a ScrollbackProvider. Wrap this Ink render() root in <ScrollbackProvider>. Never render <Static> directly \u2014 push via append().");return d}export{C as a,I as b};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{b as u}from"./chunk-6PS65QFF.js";function g(t,e){return t.byLabel(e).filter(({cid:n})=>!t.superseded.has(n)&&t.trust.get(n)!=="archived")}function f(t,e,n){for(let[a,c]of t.names)if(c===e&&!t.superseded.has(c))return a;return String(n.title??n.text??e)}function v(t,e){let n=g(t,"scenario");if(e){let i=t.resolve(e);if(i){let s=new Set([i.cid,i.tip,t.tipOf(i.cid)]);n=n.filter(({cid:o})=>t.edgesFrom(o).some(d=>d.type==="belongs_to"&&(s.has(d.dst)||s.has(t.tipOf(d.dst)))))}}let a=new Set;for(let{cid:i}of n)a.add(i),a.add(t.tipOf(i));let c=g(t,"test").filter(({cid:i})=>!e||t.edgesFrom(i).some(s=>s.type==="automates"&&(a.has(s.dst)||a.has(t.tipOf(s.dst))))),r=new Set;for(let i of c)for(let s of t.edgesFrom(i.cid))s.type==="automates"&&r.add(t.tipOf(s.dst));let m=n.filter(({cid:i})=>!r.has(i)&&!r.has(t.tipOf(i))).map(({cid:i,content:s})=>f(t,i,s));return{live_scenarios:n.length,live_tests:c.length,missing:m}}function l(t){return t.length<=12?t.join(", "):`${t.slice(0,12).join(", ")} +${t.length-12} more`}function b(t,e){let n=t.committed.length===0?"committed: nothing new":`committed: ${l(t.committed.map(o=>o.temp_ref?`${o.temp_ref} \u2192 ${o.logical_id??o.cid}`:o.logical_id??o.cid))}`,a=[];t.reused&&a.push(`reused: ${t.reused}`),t.rejected?.length&&a.push(`rejected: ${l(t.rejected.map(o=>`${o.ref} (${o.reason})`))}`),t.warnings?.length&&a.push(`warnings: ${l(t.warnings)}`);let c=[`RECEIPT (commit ${t.commitN}, ${t.phase})`,n,...a],r,m;if(t.verb==="design")r=v(e,t.ucRef),c.push(`parity: ${r.live_scenarios} scenario(s) live \xB7 ${r.live_tests} test(s) live`+(r.missing.length?` \xB7 missing tests: ${l(r.missing)}`:"")),m=r.missing.length>0?`next: emit tests for the ${r.missing.length} scenario(s) listed \u2014 1:1, strict. Never re-emit committed items; reference them by the ids above.`:"next: every live scenario has a test. Address open gaps, or finish.";else{let o=g(e,"usecase").length;c.push(`parity: ${o} use-case(s) live`),m="next: refine via chat ops using the ids above. Never re-emit committed items."}c.push(m);let i=c.join(`
|
|
3
|
+
`);for(;Buffer.byteLength(i,"utf8")>6e3;)i=i.slice(0,Math.floor(i.length*.9))+"\u2026";let s={type:"receipt",verb:t.verb,commit_n:t.commitN,phase:t.phase,committed:t.committed,reused:t.reused??0,rejected:t.rejected??[],warnings:t.warnings??[],...r?{parity:{live_scenarios:r.live_scenarios,live_tests:r.live_tests,missing:r.missing}}:{},next:m};return{text:i,event:s}}function A(){return{currentAttempt:null,liveThinking:"",thinkingLog:[],activity:[]}}var p={dedup_candidate:"checking a possible duplicate",ambiguity:"asking to resolve an ambiguity",validation_repair:"repairing a validation failure",finalize:"finalizing the proposal"};function h(t){return p[t.reason_code]??t.reason_code.replace(/_/g," ")}function y(t){let e=u({name:t.name});return t.status==="started"?`\u2192 ${e}\u2026`:t.status==="error"||t.status==="aborted"?`\u2717 ${e}`:`\u2713 ${e}`}function _(t,e){return e.turn_id!==t.turn_id?e.turn_id<t.turn_id:e.attempt<t.attempt}function x(t,e){let n=t.currentAttempt;if(n===null||n.turn_id!==e.turn_id||n.attempt!==e.attempt){if(n!==null&&_(n,e))return t;t={...t,currentAttempt:{turn_id:e.turn_id,attempt:e.attempt},liveThinking:""}}switch(e.type){case"reasoning_delta":return{...t,liveThinking:t.liveThinking+e.text};case"reasoning_done":return e.present?{...t,thinkingLog:[...t.thinkingLog,{text:t.liveThinking,tookMs:e.took_ms}],liveThinking:""}:{...t,liveThinking:""};case"tool_activity":return{...t,activity:[...t.activity,{name:e.name,status:e.status,label:y(e)}]};case"decision_activity":return{...t,activity:[...t.activity,{name:e.action,status:"decision",label:h(e)}]}}}export{b as a,A as b,h as c,x as d};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as b}from"./chunk-C5NNT7Y3.js";import{x as l}from"./chunk-MKD3KZPM.js";import{a as f}from"./chunk-HCBYKLMW.js";import{a as m,b as s}from"./chunk-C44QQJR4.js";import{e as p}from"./chunk-UR6MHSHU.js";var u=p(f(),1),T=5;function _({thinking:t,expanded:e,thinkingDone:o,maxLines:i=T}){if(!e)return(0,u.jsxs)(m,{paddingX:1,children:[(0,u.jsx)(s,{color:l.dim,children:o?"\u2237 thinking complete ":"\u2237 thinking\u2026 "}),(0,u.jsx)(s,{color:l.muted,children:o?"(ctrl+t to view)":"(ctrl+t to show)"})]});let g=t.split(`
|
|
3
|
+
`),n=Math.max(0,g.length-i),a=n>0?g.slice(-i).join(`
|
|
4
|
+
`):t;return(0,u.jsxs)(b,{variant:"default",paddingX:1,children:[n>0&&(0,u.jsxs)(s,{color:l.muted,children:["\u22EE (",n," earlier line",n===1?"":"s"," hidden)"]}),(0,u.jsx)(s,{color:l.dim,children:a}),o&&(0,u.jsx)(s,{color:l.muted,children:"\u2014 thinking complete"})]})}function k(t){let e=t;return e=e.replace(/@TS\{([^}]+)\}/g,"@S{$1}"),e=e.replace(/@TS-(\d+)/g,(o,i)=>`@S${parseInt(i,10)}.C1`),e=e.replace(/@TS(\d+)/g,(o,i)=>`@S${parseInt(i,10)}`),e=e.replace(/\\n/g,`
|
|
5
|
+
`),e}var c=p(f(),1),B=t=>t!==void 0&&/[A-Za-z0-9]/.test(t);function x(t){let e=[],o="",i=()=>{o&&(e.push({text:o}),o="")},g=(a,d,r)=>(a===0||!B(t[a-1]))&&(d+r>=t.length||!B(t[d+r])),n=0;for(;n<t.length;){let a=t.slice(n,n+2),d=t[n];if(a==="**"||a==="__"){let r=t.indexOf(a,n+2);if(r!==-1&&r>n+2&&(a==="**"||g(n,r,2))){i(),e.push({text:t.slice(n+2,r),bold:!0}),n=r+2;continue}}if(d==="`"){let r=t.indexOf("`",n+1);if(r!==-1&&r>n+1){i(),e.push({text:t.slice(n+1,r),code:!0}),n=r+1;continue}}if(d==="*"||d==="_"){let r=t.indexOf(d,n+1);if(r!==-1&&r>n+1&&(d==="*"||g(n,r,1))){i(),e.push({text:t.slice(n+1,r),italic:!0}),n=r+1;continue}}o+=d,n+=1}return i(),e.length===0&&e.push({text:""}),e}function h(t){return t.map((e,o)=>(0,c.jsx)(s,{bold:e.bold,italic:e.italic,color:e.code?l.dim:void 0,children:e.text},o))}function S(t){return t.split(`
|
|
6
|
+
`).map(e=>{if(e.trim()==="")return{kind:"blank"};let o=e.match(/^\s*[-*+]\s+(.*)$/);if(o)return{kind:"bullet",segs:x(o[1])};let i=e.match(/^\s*(\d+)\.\s+(.*)$/);if(i)return{kind:"numbered",n:i[1],segs:x(i[2])};let g=e.match(/^#{1,6}\s+(.*)$/);return g?{kind:"heading",segs:x(g[1])}:{kind:"para",segs:x(e)}})}function R(t,e,o=""){switch(t.kind){case"blank":return(0,c.jsx)(s,{children:o||" "},e);case"heading":return(0,c.jsxs)(s,{bold:!0,children:[o,h(t.segs)]},e);case"bullet":return(0,c.jsx)(m,{marginLeft:1,children:(0,c.jsxs)(s,{children:[o,"\u2022 ",h(t.segs)]})},e);case"numbered":return(0,c.jsx)(m,{marginLeft:1,children:(0,c.jsxs)(s,{children:[o,`${t.n}. `,h(t.segs)]})},e);default:return(0,c.jsxs)(s,{children:[o,h(t.segs)]},e)}}function E({text:t}){let e=S(k(t));return(0,c.jsxs)(m,{marginBottom:1,children:[(0,c.jsx)(s,{color:l.generateAccent,children:"\u2503 "}),(0,c.jsx)(m,{flexDirection:"column",children:e.map((o,i)=>R(o,i))})]})}export{E as a,_ as b};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as m}from"./chunk-2WVKOZ6W.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as g}from"./chunk-
|
|
2
|
+
import{a as m}from"./chunk-2WVKOZ6W.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as g}from"./chunk-INP7FG6V.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new m(g(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
|
|
3
3
|
|
|
4
4
|
discover IDs:
|
|
5
5
|
kane-cli projects list --search "<keyword>" --limit 10
|
|
@@ -14,4 +14,4 @@ set them:
|
|
|
14
14
|
kane-cli config folder <folder-id>
|
|
15
15
|
`;function C(e,r){return k(e,r)}function D(e){return`info: auto-configured project "${e.projectName}" (${e.projectId}) and folder "${e.folderName}" (${e.folderId}). Change with: kane-cli config project <id> / kane-cli config folder <id>.`}function S(e){return`${JSON.stringify(T(e))}
|
|
16
16
|
`}function T(e){return{type:"project_folder_auto_defaulted",project_id:e.projectId,project_name:e.projectName,folder_id:e.folderId,folder_name:e.folderName}}async function x(e){if(e.isLocal)return e.log("info","GATE_SKIP_LOCAL","Gate skipped (--local)",{}),{status:"skip",reason:"local"};j(e.creds,e.config,e.profile,e.env,e.log);let r=A(e.creds,e.profile,e.env),d=null;if(r.projectId!==null){let o=g(e.env);d=await new m(o.tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key).validateProjectFolder(r.projectId,r.folderId??""),e.log("info","GATE_VALIDATE","TMS project/folder validation",{project:d.project,folder:d.folder,folder_was_cached:r.folderId!==null})}else r.folderId!==null&&(f(e.creds,e.config,e.profile,e.env,{folderId:null,folderName:null}),e.log("warn","GATE_CLEARED_ORPHAN_FOLDER","Cleared orphan folder (no project cached)",{folder_id:r.folderId}),r.folderId=null);let n=N(r,d);if(n==="ok")return{status:"ok",projectId:r.projectId,folderId:r.folderId};if(n==="ok-tms-degraded")return e.log("warn","GATE_TMS_DEGRADED","TMS validation failed; using cached IDs",{project_id:r.projectId,folder_id:r.folderId}),{status:"ok",projectId:r.projectId,folderId:r.folderId};if(d){let o={};d.project==="missing"?(o.projectId=null,o.projectName=null,o.folderId=null,o.folderName=null):d.folder==="missing"&&(o.folderId=null,o.folderName=null),Object.keys(o).length>0&&(f(e.creds,e.config,e.profile,e.env,o),e.log("info","GATE_CLEARED_STALE","Cleared stale cached IDs before re-resolve",{project_cleared:d.project==="missing",folder_cleared:d.folder==="missing"||d.project==="missing"}))}try{let o=await p({creds:e.creds,config:e.config,profile:e.profile,env:e.env,tmsCreds:e.tmsCreds,log:e.log}),t={projectId:o.projectId,projectName:o.projectName,folderId:o.folderId,folderName:o.folderName};return e.log("info","GATE_AUTO_DEFAULTED","Auto-configured project/folder",{project_id:t.projectId,project_name:t.projectName,folder_id:t.folderId,folder_name:t.folderName}),e.onAnnounce?e.onAnnounce(t):process.stderr.write(`${D(t)}
|
|
17
|
-
`),{status:"ok",projectId:t.projectId,folderId:t.folderId,autoDefaulted:t}}catch(o){let t=C(e.profile,e.env);if(e.log("error","GATE_FATAL","Auto-default failed",{profile:e.profile,env:e.env,cached_project_id:r.projectId,cached_folder_id:r.folderId,validation:d,error:o instanceof Error?o.message:String(o)}),e.onFatalExit)e.onFatalExit(t);else{process.stderr.write(t);let{shutdown:s}=await import("./exit-manager-
|
|
17
|
+
`),{status:"ok",projectId:t.projectId,folderId:t.folderId,autoDefaulted:t}}catch(o){let t=C(e.profile,e.env);if(e.log("error","GATE_FATAL","Auto-default failed",{profile:e.profile,env:e.env,cached_project_id:r.projectId,cached_folder_id:r.folderId,validation:d,error:o instanceof Error?o.message:String(o)}),e.onFatalExit)e.onFatalExit(t);else{process.stderr.write(t);let{shutdown:s}=await import("./exit-manager-VCSIUYBR.js");s(2,"Project/folder gate failed")}return{status:"cancelled"}}}export{p as a,A as b,N as c,C as d,D as e,S as f,T as g,x as h};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{existsSync as f,mkdirSync as C,readFileSync as S,readdirSync as T,renameSync as y,rmSync as m,writeFileSync as P,openSync as H,closeSync as F}from"fs";import{randomBytes as K}from"crypto";import{join as w}from"path";var d=class extends Error{constructor(t,r){super(`${t}: ${r}`);this.code=t}},D=1440*60*1e3,J=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,v=e=>w(e,"sessions"),h=(e,n)=>w(v(e),n),l=(e,n)=>w(h(e,n),"state.json"),_=(e,n)=>w(h(e,n),".lock"),N=e=>(e?.now??(()=>new Date))();function L(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(n){return n.code==="EPERM"}}function E(e,n){let t=`${e}.tmp-${process.pid}`;P(t,n,{mode:384}),y(t,e)}function b(e,n,t,r=0){if(r>20)throw new d("SESSION_LOCKED",`${n}: lock contention did not settle`);let o=_(e,n),s=K(8).toString("hex"),a=JSON.stringify({pid:process.pid,ts:t.toISOString(),nonce:s})+`
|
|
3
|
+
`;try{let i=H(o,"wx",384);return P(i,a),F(i),s}catch(i){if(i.code!=="EEXIST")throw i;let p=!1,u;try{let c=JSON.parse(S(o,"utf8")),O=t.getTime()-new Date(c.ts).getTime();p=!L(c.pid)||O>=D,u=c.nonce}catch{p=!0}if(!p)throw new d("SESSION_LOCKED",`${n} is held by another live process`);let g=`${o}.break-${s}`;try{y(o,g);let c;try{c=JSON.parse(S(g,"utf8"))}catch{c=null}if(c===null||c.nonce===u)m(g,{force:!0});else try{y(g,o)}catch{m(g,{force:!0})}}catch(c){if(c.code!=="ENOENT")throw c}return b(e,n,t,r+1)}}function A(e,n,t,r,o){let s=()=>{try{if(JSON.parse(S(_(e,n),"utf8")).nonce!==r)throw new d("SESSION_LOCK_LOST",`${n} lock was taken over`)}catch(i){throw i instanceof d?i:new d("SESSION_LOCK_LOST",`${n} lock file unreadable/gone`)}},a=()=>E(l(e,n),JSON.stringify(t)+`
|
|
4
|
+
`);return{get state(){return t},isApplied:i=>t.applied_events.includes(i),markApplied(i){s(),t={...t,applied_events:[...new Set([...t.applied_events,...i])].sort()},a()},save(i){s();let{agent_state:p,pending:u,assumed:g,read_basis:c,corpus_cursor:O,expires_at:x,force:k,conv_source:I,held_receipts:R,force_scope:$}=i;t={...t,...p!==void 0?{agent_state:p}:{},...u!==void 0?{pending:u}:{},...g!==void 0?{assumed:g}:{},...c!==void 0?{read_basis:c}:{},...O!==void 0?{corpus_cursor:O}:{},...x!==void 0?{expires_at:x}:{},...k!==void 0?{force:k}:{},...I!==void 0?{conv_source:I}:{},...R!==void 0?{held_receipts:R}:{},...$!==void 0?{force_scope:$}:{}},a()},complete(){s(),m(h(e,n),{recursive:!0,force:!0})},release(){try{s(),m(_(e,n),{force:!0})}catch(i){if(i instanceof d||i.code==="ENOENT")return;throw i}}}}function X(e,n,t){if(!J.test(n.sid))throw new d("SESSION_MISSING",`bad sid ${JSON.stringify(n.sid)}`);let r=N(t);if(f(l(e,n.sid)))throw new d("SESSION_LOCKED",`${n.sid} already exists \u2014 resume it`);C(h(e,n.sid),{recursive:!0,mode:448});let o=b(e,n.sid,r),s={schema:1,applied_events:[],...n};return E(l(e,n.sid),JSON.stringify(s)+`
|
|
5
|
+
`),A(e,n.sid,s,o,t)}function Q(e,n,t){if(!J.test(n)||!f(l(e,n)))throw new d("SESSION_MISSING",`no session ${n}`);let r=N(t),o=b(e,n,r),s=JSON.parse(S(l(e,n),"utf8"));if(new Date(s.expires_at).getTime()<=r.getTime())throw m(_(e,n),{force:!0}),new d("SESSION_EXPIRED",`${n} expired at ${s.expires_at}`);let a={...s,expires_at:new Date(r.getTime()+D).toISOString()};return E(l(e,n),JSON.stringify(a)+`
|
|
6
|
+
`),A(e,n,a,o,t)}function z(e,n){let t=l(e,n);return f(t)?JSON.parse(S(t,"utf8")):null}function Z(e){let n=v(e);if(!f(n))return[];let t=[];for(let r of T(n)){let o=l(e,r);if(f(o))try{let s=JSON.parse(S(o,"utf8"));t.push({sid:s.sid,mode:s.mode,created_at:s.created_at,expires_at:s.expires_at,pendingCount:s.pending.questions.length+s.pending.proposals.length,verb:s.verb,use_case:s.use_case})}catch{t.push({sid:r,mode:"?",created_at:"",expires_at:"",pendingCount:0,corrupt:!0})}}return t.sort((r,o)=>r.created_at<o.created_at?-1:1)}function W(e,n){let t=N(n),r=[],o=[],s=v(e);if(!f(s))return{removed:r,skipped:o};for(let a of T(s)){if(n?.sid&&a!==n.sid)continue;let i=!1,p=!1;try{let u=JSON.parse(S(l(e,a),"utf8"));i=new Date(u.expires_at).getTime()<=t.getTime()}catch{p=!0}if(n?.sid||n?.all||i||p&&n?.all){try{let u=JSON.parse(S(_(e,a),"utf8"));if(L(u.pid)&&u.pid!==process.pid){o.push({sid:a,reason:`in use by live pid ${u.pid}`});continue}}catch{}m(h(e,a),{recursive:!0,force:!0}),r.push(a)}}return{removed:r,skipped:o}}function Y(e){return{id:e.id,text:e.question,risk:["high","med","low"].includes(e.risk)?e.risk:"med",rationale:e.rationale,options:e.options.map(n=>({label:n.label,detail:n.description??""})),recommended_index:e.recommendedOptionIndex,allow_free_text:e.allowFreeText,kind:e.kind,consequence:e.consequence,evidence_count:e.evidence_count,multi_select:e.multiSelect}}function j(e){return{id:e.id,header:e.kind??"question",question:e.text,kind:e.kind??"clarify",multiSelect:e.multi_select??!1,options:e.options.map((n,t)=>({id:`o${t}`,label:n.label,description:n.detail||void 0})),recommendedOptionIndex:e.recommended_index,risk:e.risk,rationale:e.rationale,consequence:e.consequence??"",evidence_count:e.evidence_count,allowFreeText:e.allow_free_text}}function q(e,n){e.save({agent_state:n.agent_state,pending:{questions:n.pending.questions.map(j),proposals:n.pending.proposals??[]},assumed:n.assumed.map(t=>({questionId:t.question_id,optionId:t.option_id,flagged:!0,eventId:`assumed:${n.sid}:${t.question_id}`}))}),e.release()}function ee(e,n,t){let r=Q(e,n),o=[];for(let[a,i]of Object.entries(r.state.read_basis))(t.heads.get(a)??null)!==i&&o.push(a);let s=r.state.pending.questions.filter(a=>!r.isApplied(`resolveq:${n}:${a.id}`)&&!r.isApplied(`assumed:${n}:${a.id}`));return{handle:r,represent:[...r.state.pending.proposals],questions:s,staleBasis:o}}export{d as a,X as b,z as c,Z as d,W as e,Y as f,q as g,ee as h};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{c as h}from"./chunk-NFOBDHZK.js";import{a as y,b as v}from"./chunk-L5LI2JF4.js";import{randomUUID as k,randomBytes as D}from"crypto";import{promises as i}from"fs";import{join as c}from"path";function p(t=process.cwd()){return c(t,".testmuai","evidence")}function b(t,e=process.cwd()){return c(p(e),`${t}.evidence`)}function W(){return k()}var S=/\.evidence\.tmp-(\d+)-[0-9a-f]+$/;async function _(t,e,r=process.cwd()){let n=p(r);await i.mkdir(n,{recursive:!0});let o=b(e,r),a=c(n,`${e}.evidence.tmp-${process.pid}-${D(6).toString("hex")}`);return await i.copyFile(t,a),await i.rename(a,o),o}async function I(t=process.cwd()){let e=p(t),r;try{r=await i.readdir(e)}catch{return[]}return r.filter(n=>n.endsWith(".evidence")).sort().map(n=>c(e,n))}async function L(t,e=process.cwd()){if(await P(t))return t;let r=b(t,e);return await P(r)?r:null}async function P(t){try{return await i.stat(t),!0}catch{return!1}}function E(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function M(t=process.cwd(),e=E){let r=p(t);await h(r).catch(()=>({restored:[],removed:[]}));let n=[],o=[],a;try{a=await i.readdir(r,{withFileTypes:!0})}catch{return{aborted:n,removed:o}}for(let u of a){let d=u.name.match(S);if(d){let g=Number(d[1]);if(Number.isFinite(g)&&e(g))continue;let w=c(r,u.name);await i.rm(w,{force:!0}),o.push(w);continue}if(!u.isDirectory()||!u.name.endsWith(".evidence"))continue;let m=c(r,u.name),f=c(m,"run.yaml"),s;try{s=y(await i.readFile(f,"utf8"))}catch{continue}if(s?.status!=="running")continue;let l=s?.environment?.pid;if(typeof l=="number"&&e(l))continue;let x=s?.environment?.saved===!0;s?.environment?.origin==="inline"&&!x?(await i.rm(m,{recursive:!0,force:!0}),o.push(m)):(s.status="aborted",await i.writeFile(f,v(s,{lineWidth:-1})),n.push(m))}return{aborted:n,removed:o}}export{p as a,b,W as c,_ as d,I as e,L as f,M as g};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as F,b as z,c as ne,d as R}from"./chunk-2YQ6TW77.js";import{a as D}from"./chunk-WAOCHXJ5.js";import{b as U}from"./chunk-FYOCF7DY.js";import{a as j}from"./chunk-2WVKOZ6W.js";import{a as C}from"./chunk-NLCCBXXV.js";import{a as O}from"./chunk-RZ4F3BHX.js";import{e as te}from"./chunk-UR6MHSHU.js";import{readFileSync as Z,existsSync as w,readdirSync as Ee,mkdirSync as T,writeFileSync as x}from"fs";import{readFile as ee,unlink as be}from"fs/promises";import{join as E}from"path";import{randomUUID as P}from"crypto";function V(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 L(t,e){return!t||!e?t:t.replace(/\{\{(.+?)\}\}/g,(s,n)=>{let o=e[n];return o?o.value:s}).replace(/\$\{(.+?)\}/g,(s,n)=>{let o=e[n];return o?o.value:s})}var ie={click:"CLICK",double_click:"CLICK",type:"TYPE",fill:"TYPE",select:"SELECT",hover:"HOVER",drag:"DRAG_DROP",upload_files:"UPLOAD",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"},q={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"},se=new Set(["CLICK","TYPE","FILL","HOVER","SCROLL_UNTIL_ELEMENT","UPLOAD","VISION_QUERY","DRAG_DROP","SELECT"]);function $(t,e){if(t==="analyze"){let n=e?.action_params?.analyzer_type??"";return q[n]}let s=ie[t];return s||console.warn(`[migrator] UNKNOWN action_type "${t}" \u2014 falling back to "${t.toUpperCase()}"; explicit mapping required`),s??t.toUpperCase()}function K(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 G(t){try{return JSON.parse(t.output_value??"{}")}catch{return{}}}function oe(t){let e=t.output_variable??"";if(!e)return"[]";let n={...G(t)};return delete n.body,JSON.stringify([{name:e,unique_key:(t.action_id??"").replace(/-/g,"").slice(0,8)||P().replace(/-/g,"").slice(0,8),value:n,variable_description:"API Response"}])}function re(t,e,s){let n=t.action_params??{},o=se.has(e)?"Vision Agent":"Operation Agent",l={operation_type:e};e==="OPEN"&&(l.url=n.url??""),e==="SET_VARIABLE"&&(l.variable_name=t.output_variable??n.key??"",l.variable_value=t.output_value??"");let i={},r={},a=t.action_instruction??"",u=n.text??"",d=n.url??"",g=[["intent",a],["value",u],["url",d]];for(let[h,m]of Object.entries(s)){let b=String(m);if(h.startsWith("secrets."))for(let[I,v]of g)v.includes(b)&&(r[I]=h);for(let[I,v]of g)v.includes(b)&&!(I in i)&&(i[I]=v)}let _=t.action_type,c={operation:t.action_instruction??"",agent:o,operation_dict:l,reasoning:_==="analyze"?n.query??"":t.intent??t.action_instruction??"",variable:i,secrets:r,params:{}};_==="analyze"&&typeof n.code=="string"&&n.code&&(c.code=n.code),_==="analyze"&&typeof n.code_js=="string"&&n.code_js&&(c.code_js=n.code_js),_==="analyze"&&typeof n.condition_expression=="string"&&n.condition_expression&&(c.condition_expression=n.condition_expression),n.uses_websocket===!0&&(c.uses_websocket=!0),n.uses_sse===!0&&(c.uses_sse=!0),_==="analyze"&&n.analyzer_type==="textual_visual"&&(typeof n.wrapped_js=="string"&&(c.wrapped_js=n.wrapped_js),Array.isArray(n.locators)&&(c.locators=n.locators),typeof n.operator=="string"&&(c.operator=n.operator),Array.isArray(n.transforms)&&(c.transforms=n.transforms),typeof n.query=="string"&&(c.query=n.query),typeof n.expected_value=="string"&&(c.expected_value=n.expected_value),typeof n.needs_unit_conversion=="boolean"&&(c.needs_unit_conversion=n.needs_unit_conversion));let f={set_cookies:"cookies",set_clipboard:"text",delete_cookies:"names",set_local_storage:"items",delete_local_storage:"keys"}[_];return f&&n[f]!==void 0&&(c[f]=n[f]),_==="set_clipboard"&&typeof n.html=="string"&&n.html&&(c.html=n.html),c}function ae(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(o=>o.passed===!0):s.every(o=>o.passed===!0)}function X(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 le(t){let e=t.assertion_tree??{},s=e.sub_results??[],n=X(s);return{operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[],sub_results:s,sub_checks:n,composite_operator:e.composite_operator??"and",verification:e.verification??"",claim:e.description??""}}function ce(t){let s=(t.action_params??{}).assertion_tree??{},n=s.sub_results??[],o=X(n);return[{operation:t.action_instruction??"",agent:"Operation Agent",operation_dict:{operation_type:"ASSERTION",assertion_tree:{sub_results:n,sub_checks:o,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 ue(t,e,s,n){let o=t.visual_data;if(!o||o.x==null||o.y==null)return null;let l=e?`${e}/test_screenshots`:"";return{x:o.x,y:o.y,confidence:0,bbox:o.bbox??null,bbox_source:o.bbox?"accessibility_tree":"fallback",viewport_width:o.viewport_width??1280,viewport_height:o.viewport_height??800,scale_factor:null,raw_image_url:l?`${l}/untagged_screenshot/${s}.${n?.get(s)??"png"}`:"",raw_image_sas_url:"",annotated_image_url:"",annotated_image_sas_url:""}}function B(t,e={},s="",n){let o=t.action_type,l=$(o,t),i=t.action_params??{},r=t.coordinates??null,a=t.selectors??null,u=!!(a&&a.length>0),d=t.timestamp??"",g=t.duration_ms??0,_=t.variables_used??{},c=t.action_id??P(),p=P(),f=K(d,g),h="",m="";o==="navigate"?(m=i.url??"",h=m):o==="type"||o==="fill"?h=i.text??"":o==="press_key"?h=i.key??"":o==="wait"?h=String(i.ms??i.timeout_ms??""):o==="evaluate_js"?h=i.script??"":o==="analyze"&&l==="SET_VARIABLE"&&(h=t.output_value??"");let b="";o==="go_back"?b="back":o==="go_forward"&&(b="forward");let I=L(h,e),v=L(m,e),A=L(t.action_instruction??"",e),y=re(t,l,_);return{operation_id:c,instruction_id:p,instruction:A,intent:A,operation_start:d,operation_end:f,status:t.status??"",command:l,name:"",target:"",value:I,message:"",operation_dict:"",frame:t.frame_info?JSON.stringify(t.frame_info):"",error_message:t.error??"",code_snippet:"",sub_instruction_obj:JSON.stringify(y),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/${c}.${n?.get(c)??"png"}`:"",alternative_xpaths:[],attribute:"",value_description:"",url:v,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:l==="ASSERTION"?ae(i):"",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(i.tab_index??""),tab_identifier:String(i.tab_identifier??""),scroll_value:i.amount??1,scroll_direction:i.direction??"",mi_scroll_payload:{},sleep_duration:0,app_id:"",manual_interaction_tag:"",string_to_float_list:[],js_snippet:o==="evaluate_js"?i.script??"":"",code_error:"",hide:!1,dismiss_dialog:!1,use_v2_mobile_tagging:!1,multiple_inputs:!1,dialog_action:"",dialog_type:"",is_coordinates_used_for_interaction:r!==null&&!u,element_coordinates_ratio:[],element_bounds_ratio:[],x_coord:u?null:r?.x??null,y_coord:u?null:r?.y??null,target_x_coord:i.target_x??null,target_y_coord:i.target_y??null,source_description:i.source_description??null,target_description:i.target_description??null,use_coordinates:r!==null&&!u,kaneaiMobileTaggingImageLimit:1,clicks_order_code:"se_js_ac",selector:u?a.map(k=>({type:k.isXPath?"xpath":"css",...k})):"",selector_target:"",math_result_variable_name:"",math_result_variable_value:"",expression_tree:l==="ASSERTION"?le(i):i.expression_tree??{},assertion_tree:i.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:l==="ASSERTION"?"Fail test immediately":"",screenshot_command:"",smartui_contents:{},smartui_results:{},result_type:"",result_hint:"",drag_offset:{},start_coordinates:i.source_coordinates?{x:i.source_coordinates[0],y:i.source_coordinates[1]}:{},end_coordinates:i.target_coordinates?{x:i.target_coordinates[0],y:i.target_coordinates[1]}:{},element_rect:null,is_canvas:!1,until_condition:"",until_max_retries:0,until_settle_ms:0,api_data:o==="api"?{request:t.action_params?.api_data?.request??{}}:{},output_variables:o==="api"?t.output_variable?{[t.output_variable]:null}:{}:t.output_variable?{[t.output_variable]:t.output_value??""}:{},visual_context:ue(t,s,c,n),reasoning:o==="analyze"?i.query??"":t.intent??t.action_instruction??""}}function M(t,e,s={}){let n=t.action_type,o=$(n,t),l=t.timestamp??"",i=t.duration_ms??0,r=K(l,i),a=o==="ASSERTION"||o==="MATHEMATICAL_OPERATION";return{instruction_id:e.instruction_id,instruction_class:a?"non_driver_action":"driver_action",module_id:"",instruction:L(t.action_instruction??"",s),command:o,error:null,parent_instruction_id:"",classification_layer_resp:o==="ASSERTION"?ce(t):[],classification_error:{},operations:[e],status:t.status??"",start_timestamp:l,end_timestamp:r,type:"agent_generated",tags:[],html_paths:[],optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,content_type:n==="api"?"api":n==="analyze"&&t.action_params?.analyzer_type==="api_response"?"api_calls_query":n==="analyze"&&t.action_params?.analyzer_type?.startsWith("devtool_")?t.action_params.analyzer_type.replace("devtool_","devtools_"):"instruction",js_snippet:n==="evaluate_js"?t.action_params?.script??"":"",user_variables:n==="api"?oe(t):"[]",api_data:n==="api"?{request:t.action_params?.api_data?.request??{},response:G(t)}:{},params_used:!1,hard_assertion:o==="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:n==="analyze"?t.action_params?.query??"":t.intent??t.action_instruction??""}}function de(t,e=[]){let s=t.action_params??{},n=s.branches??[],o=s.winning_index??-1,l=s.sub_results??[],i={};for(let a of l){let u=a.sub_results;if(u)for(let d of u){let g=d.store_key;g&&(i[g]=d)}}let r=n.map((a,u)=>{let d=u===o,g=(a.sub_checks??[]).map(_=>{let c=i[_.store_key];return{description:_.description,store_key:_.store_key,expected_value:_.expected_value,stored_value:c?.extracted_value??_.stored_value,operator:_.operator??c?.operator??"equals",transforms:_.transforms??c?.transforms??[]}});if(g.length===0&&a.condition&&l.length>0){let c=l.find(p=>p.branch_index===u)?.sub_results??[];c.length>0&&(g=c.map(p=>({description:p.description??a.condition,store_key:p.store_key??"",expected_value:p.expected??"true",stored_value:p.extracted_value??void 0,operator:p.operator??"equals",transforms:p.transforms??[]})))}return{branch_index:u,condition:a.condition??null,branch_type:a.branch_type??"sub_objective",passed:d,sub_objective:null,custom_event:a.custom_event??null,children:d?e:[],sub_checks:a.condition?g:[],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:o,branches:r,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 Y(t,e,s){for(let n of t)n.content_type==="instruction"&&"generative_id"in n&&(n.generative_id=e,n.generative_objective=s)}function N(t,e={},s="",n,o){let l=[],i=0;for(;i<t.length;){let r=t[i],a=r.action_type;if(!o?.keepFailedActions&&r.status==="error"&&a!=="assert"&&a!=="if_else"&&a!=="child_agent_start"&&a!=="child_agent_end"&&!(r.until_condition&&!r.error)){i+=1;continue}if(a==="analyze"&&!q[r.action_params?.analyzer_type??""]){i+=1;continue}if(a==="child_agent_start"){let u=r.action_params?.child_id??"",d=r.action_params?.objective??"",g=[];i+=1;let _=1,c="error",p;for(;i<t.length&&_>0;){let y=t[i],k=y.action_type;if(k==="child_agent_start")_+=1;else if(k==="child_agent_end"&&(_-=1,_===0)){c=y.status??"success",p=y,i+=1;break}_>0&&g.push(y),i+=1}let f=N(g,e,s,n);Y(f,u,d);let h=p?.action_params?.result_code??null,m=p?.action_params?.reason_code??null,b=p?.action_params?.error_message??null,I=p?.action_params?.summary??null,v=p?.action_params?.one_liner??null,A=c==="error";l.push({content_type:"generative_block",instruction_id:`generative_block_${u}`,generative_id:u,objective:d,status:c,children:f,error_message:A?b??null:null,error_code:A?m??null:null,result_code:h??null,bifurcation_context:[],approach_reason:V(I),one_liner:v??null});continue}else if(a==="child_agent_end"){i+=1;continue}else if(a==="if_else"){i+=1;let u=[];for(;i<t.length&&t[i].action_type==="child_agent_start";){let d=t[i],g=d.action_params?.child_id??"",_=d.action_params?.objective??"",c=[];i+=1;let p=1,f="error";for(;i<t.length&&p>0;){let m=t[i];if(m.action_type==="child_agent_start")p+=1;else if(m.action_type==="child_agent_end"&&(p-=1,p===0)){f=m.status??"success",i+=1;break}p>0&&c.push(m),i+=1}let h=N(c,e,s,n);u.push(...h)}l.push(de(r,u));continue}else if(a==="query_tool"){i+=1;continue}else if(r.until_condition){let u=B(r,e,s,n),d=M(r,u,e),g=typeof r.until_condition_met=="boolean"?r.until_condition_met:r.status==="success";l.push({content_type:"until_block",instruction_id:`until_${P().slice(0,8)}`,condition:r.until_condition,max_retries:r.until_max_retries??10,settle_ms:r.until_settle_ms??500,current_count:0,condition_met:g,children:[d],generative_id:"",generative_objective:"",variables_used:{},status:r.status??"success"})}else{let u=B(r,e,s,n),d=M(r,u,e);l.push(d)}i+=1}return l}function S(t,e={},s="",n,o){let l=[];for(let i of t){let r=N(i.records,e,s,n,o);if(r.length===0)continue;let a=P().replace(/-/g,"");Y(r,a,i.objective);let u=r.some(c=>"status"in c&&typeof c.status=="string"?c.status==="error"||c.status==="failed":!1),d=i.resultCode?parseInt(i.resultCode,10):null,g=d!==null&&!isNaN(d)&&d>=200,_=u||g?"error":"success";l.push({content_type:"generative_block",instruction_id:`generative_block_${a}`,generative_id:a,objective:i.objective,status:_,children:r,error_message:_==="error"?i.errorMessage??null:null,error_code:_==="error"?i.reasonCode??null:null,result_code:i.resultCode??null,bifurcation_context:[],approach_reason:V(i.summary),one_liner:i.oneLiner??null})}return{instructions:l}}var H=te(ne(),1);import{createWriteStream as _e}from"fs";import{readFile as pe}from"fs/promises";import{join as ge,basename as fe}from"path";import{tmpdir as he}from"os";var me=["**/screenshots/**","**/annotated/**","**/tcg/**","**/bifurcation/**"];async function W(t){let e=ge(he(),`${fe(t)}_artifacts.zip`);return new Promise((s,n)=>{let o=_e(e),l=(0,H.default)("zip",{zlib:{level:6}});o.on("close",()=>s(e)),l.on("error",n),l.pipe(o),l.glob("**/*",{cwd:t,ignore:me}),l.finalize()})}async function J(t){return pe(t)}async function Ie(t,e){return ee(U(t,e))}function ve(t){return{key:"artifacts",content_type:"application/zip",filename:`${t}.evidence`}}var Q=class{config;controller;testId;constructor(e){this.config=e,this.controller=new D(e.controllerBaseUrl,e.auth),this.testId=e.testId}log(e,s,n,o){this.config.log?.(e,s,n,o)}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,n=null;if(this.config.shouldUploadArtifacts!==!1){e("convert","running");let r=this.collectNdjsonPerRun(),a=r.reduce((f,h)=>f+h.records.length,0);this.log("info","PIPELINE_CONVERT","Collected NDJSON records",{total_records:a,run_groups:r.length});let u=this.config.variables??{};this.log("info","PIPELINE_CONVERT_VARS","Variables for template resolution",{keys:Object.keys(u)});let{instructions:d}=r.length>0?S(r,u,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap):{instructions:[]};this.log("info","PIPELINE_CONVERT_INSTRUCTIONS","Auteur instructions produced",{count:d.length});let g=this.buildExecutionEnvelope(d),_=Buffer.from(JSON.stringify(g));this.log("info","PIPELINE_CONVERT_BLOB","Blob created",{size_kb:+(_.length/1024).toFixed(1)});let c=E(this.config.sessionDir,"execution.json");x(c,JSON.stringify(g,null,2)),this.log("info","PIPELINE_CONVERT_LOCAL_SAVE","Execution blob saved locally",{path:c});let p=s?.packTestDir??this.config.evidenceRead?.packTestDir;if(p){let f=E(p,"auteur");T(f,{recursive:!0}),x(E(f,"execution.json"),JSON.stringify(g,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack",{path:E(f,"execution.json")})}if(e("convert","done"),s)n=_;else{e("zip","running"),this.log("info","PIPELINE_ZIP_START","Zipping session",{session_dir:this.config.sessionDir});let f=null,h;try{f=await W(this.config.sessionDir),h=await J(f),this.log("info","PIPELINE_ZIP_DONE","Zip complete",{size_mb:+(h.length/1024/1024).toFixed(1),path:f}),e("zip","done",`${(h.length/1024/1024).toFixed(1)}MB`)}finally{f&&await be(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 m=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:m.urls.artifacts?.blob_url,blob_url:m.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading artifacts and blob",{artifact_size_mb:+(h.length/1024/1024).toFixed(1),blob_size_kb:+(_.length/1024).toFixed(1)}),await Promise.all([R(m.urls.artifacts.upload_url,h,"application/zip"),R(m.urls.blob.upload_url,_,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}}else{let r=this.collectNdjsonPerRun(),a=this.config.variables??{},{instructions:u}=r.length>0?S(r,a,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{keepFailedActions:!0}):{instructions:[]},d=this.buildExecutionEnvelope(u),g=E(this.config.sessionDir,"execution.json");x(g,JSON.stringify(d,null,2)),this.log("info","PIPELINE_LOCAL_SAVE","Execution blob saved locally (no upload)",{path:g});let _=this.config.evidence?.packTestDir??this.config.evidenceRead?.packTestDir;if(_){let c=E(_,"auteur");T(c,{recursive:!0});let p=this.readAuthoredExecution();x(E(c,"execution.json"),p??JSON.stringify(d,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack (gated)",{path:E(c,"execution.json"),source:p?"authored":"run_envelope"})}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(r){let a=r instanceof Error?r.message:String(r);throw this.log("error","PIPELINE_ATOMIC_REPLACE_FAILED","Atomic-replace failed",{error:a}),e("atomic_replace","failed",a),r}}else e("atomic_replace","skipped");let o,l;if(this.config.shouldCommit&&!this.config.isFirstRun&&this.config.onCommitLock){e("commit_lock","running");let r=await this.config.onCommitLock();if(r.ok)o=r.testcaseId,this.log("info","PIPELINE_COMMIT_LOCK_OK","Commit lock acquired",{testcase_id:o??"none"}),e("commit_lock","done");else return this.log("error","PIPELINE_COMMIT_LOCK_FAILED","Commit lock failed",{reason:r.reason,message:r.message}),e("commit_lock","failed",`${r.reason??"unknown"}: ${r.message??""}`),{success:!1,testId:this.testId,error:`commit-lock failed: ${r.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 r=new j(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(o=(await r.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:o??"none"}),this.config.onFinalizeSuccess)try{await this.config.onFinalizeSuccess(o)}catch(d){this.log("warn","PIPELINE_FINALIZE_META_FAILED","Meta-rewrite after endTest failed",{error:String(d)})}e("finalize","done")}else e("finalize","skipped"),this.log("info","PIPELINE_FINALIZE_SKIPPED","Finalize skipped (evolve flow or first-run disabled)");if(o&&this.config.shareApiBaseUrl)try{l=await this.generateShareLink(o),this.log("info","PIPELINE_SHARE_OK","Share link generated",{share_id:l})}catch(r){this.log("warn","PIPELINE_SHARE_FAILED","Share link failed",{error:String(r)})}if(s&&n){let r=null;e("zip","running");try{await s.sealFn({testcaseId:o,shareId:l}),r=s.sealedPackPath?await ee(s.sealedPackPath):await Ie(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:+(r.length/1024/1024).toFixed(1)})}catch(a){let u=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:u})}if(r){e("zip","done",`${(r.length/1024/1024).toFixed(1)}MB`),e("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[ve(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:+(r.length/1024/1024).toFixed(1),blob_size_kb:+(n.length/1024).toFixed(1)}),await Promise.all([R(a.urls.artifacts.upload_url,r,"application/zip"),R(a.urls.blob.upload_url,n,"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:+(n.length/1024).toFixed(1)}),await R(a.urls.blob.upload_url,n,"application/json"),this.log("info","PIPELINE_UPLOAD_OK","Blob upload complete (pack skipped)"),e("upload","done")}}let i;if(this.config.codeExport?.enabled&&o){let r=!1;try{await this.triggerCodeExport(o),this.log("info","PIPELINE_CODE_EXPORT_START","Code export triggered"),r=!0}catch(a){let u=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export trigger failed; skipping poll",{error:u}),e("code_export","failed",`trigger failed: ${u}`)}if(r){e("code_export","running","Waiting for code generation\u2026");try{i=await this.pollAndDownloadCode(o,e),this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:i}),e("code_export","done",i)}catch(a){let u=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:u}),e("code_export","failed",u)}}}else e("code_export","skipped");return this.log("info","PIPELINE_COMPLETE","Pipeline complete"),{success:!0,testId:this.testId,testcaseId:o,shareId:l,codeExportDir:i}}catch(s){return{success:!1,testId:this.testId,error:s instanceof Error?s.message:String(s)}}}async runCodeExport(e,s){let n=s??this.config.onProgress,o=!1;try{await this.triggerCodeExport(e),this.log("info","PIPELINE_CODE_EXPORT_TRIGGER","Code export triggered",{testcase_id:e}),o=!0}catch(l){let i=l instanceof Error?l.message:String(l);this.log("error","PIPELINE_CODE_EXPORT_TRIGGER_FAILED","Code export trigger failed; skipping poll",{error:i}),n("code_export","failed",`trigger failed: ${i}`)}if(o){n("code_export","running","Waiting for code generation\u2026");try{let l=await this.pollAndDownloadCode(e,n);return this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:l}),n("code_export","done",l),l}catch(l){let i=l instanceof Error?l.message:String(l);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:i}),n("code_export","failed",i);return}}}collectNdjsonPerRun(){let e=[],s=this.config.runObjectives??[],n=this.config.runMetadata??[],o=this.config.evidence??this.config.evidenceRead;for(let l=0;l<this.config.runDirs.length;l++){let i=this.config.runDirs[l],r=s[l]||this.config.firstObjective,a=n[l],u=o?this.readNdjsonFromFile(E(o.packTestDir,"logs",`${o.runIndices?.[l]??l}-actions.ndjson`)):this.readNdjsonFromDir(i);u.length>0&&e.push({objective:r,records:u,resultCode:a?.resultCode,reasonCode:a?.reasonCode,errorMessage:a?.errorMessage,summary:a?.summary,oneLiner:a?.oneLiner})}if(e.length===0){let l=E(this.config.sessionDir,"runs");if(w(l))try{let r=Ee(l,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort();for(let a of r){let u=E(l,a),d=this.readNdjsonFromDir(u);d.length>0&&e.push({objective:this.config.firstObjective,records:d})}}catch{}}return e}readNdjsonFromDir(e){let s=[E(e,"run-test","actions.ndjson"),E(e,"actions.ndjson")];for(let n of s)if(w(n))return this.readNdjsonFromFile(n);return[]}readNdjsonFromFile(e){let s=[];if(!w(e))return s;this.log("debug","PIPELINE_COLLECT_READ","Reading NDJSON file",{path:e});let n=Z(e,"utf-8");for(let o of n.split(`
|
|
5
|
+
`)){let l=o.trim();if(l)try{s.push(JSON.parse(l))}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 n={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({entityIds:[e],entityType:"Test Case Details",expiresAt:7})},o=!!this.config.authResolver;this.log("debug","PIPELINE_SHARE_AUTH","Share link auth config",{resolver:o,fallback_auth_type:typeof this.config.auth=="string"?"bearer":"basic",tms_user:this.config.tmsUsername});let l=o?await this.config.authResolver.fetch(s,n):await O(s,{...n,headers:{...n.headers,Authorization:this.buildAuthHeader()}});if(!l.ok)throw new Error(`Share link API failed: ${l.status} ${await l.text()}`);let i=await l.json();if(!i.shareId)throw new Error("Share link API returned no shareId");return i.shareId}async triggerCodeExport(e){if(!this.config.codeExport)throw new Error("triggerCodeExport called without resolved codeExport config");let{url:s,body:n}=F({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e,codeExport:this.config.codeExport});this.log("info","PIPELINE_CODE_EXPORT_POST","Triggering code export",{url:s});let o={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(n)},l=this.config.authResolver?await this.config.authResolver.fetch(s,o):await O(s,{...o,headers:{...o.headers,Authorization:this.buildAuthHeader()}});if(!l.ok)throw new Error(`Code export failed: ${l.status} ${await l.text()}`)}async pollAndDownloadCode(e,s){let n=z({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e}),o=this.config.exitTimeoutMs??3e5,l=5e3,i=Date.now()+o;this.log("info","PIPELINE_CODE_EXPORT_POLL","Polling for code export",{url:n,timeout_ms:o});let r=(a,u)=>this.config.authResolver?this.config.authResolver.fetch(a,u):O(a,{...u,headers:{...u?.headers,Authorization:this.buildAuthHeader()}});for(;Date.now()<i;){let a=await r(n,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok){let c=await a.text().catch(()=>"");throw this.log("warn","PIPELINE_CODE_EXPORT_POLL_FAILED","Code export poll non-200; skipping",{status:a.status,body:c.slice(0,200)}),new Error(`code export poll skipped: HTTP ${a.status}`)}let d=(await a.json()).data?.find(c=>c.code_name==="kane-cli-trigger");if(!d){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(l);continue}let g=d.status.toLowerCase();if(g==="in progress"||g==="in_progress"||g==="pending"){this.log("debug","PIPELINE_CODE_EXPORT_IN_PROGRESS","Code export in progress",{status:d.status}),s("code_export","running","Generating code\u2026"),await this.sleep(l);continue}if(!d.url||d.url.length===0)throw new Error(`Code export status=${d.status} but no files returned`);let _=this.config.codeExportDir??E(this.config.sessionDir,"code-export");T(_,{recursive:!0}),this.log("info","PIPELINE_CODE_EXPORT_DOWNLOAD","Downloading code files",{file_count:d.url.length,dir:_}),s("code_export","running",`Downloading ${d.url.length} files\u2026`);for(let c of d.url){let p=E(_,c.file_name),f=await O(c.file_url);if(!f.ok){this.log("warn","PIPELINE_CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:c.file_name,status:f.status});continue}let h=await f.text();x(p,h,"utf-8"),this.log("info","PIPELINE_CODE_EXPORT_FILE_SAVED","File saved",{file_name:c.file_name,size_bytes:h.length})}return _}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}`:C(this.config.auth.username,this.config.auth.accessKey)}readAuthoredExecution(){let e=this.config.authoredExecutionPath;if(!e)return null;try{let s=Z(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(i=>i==="passed")?"success":"error",n=this.config.variableIds??{},o=[];if(this.config.variables)for(let[i,r]of Object.entries(this.config.variables)){if(r.secret)continue;let a=i.startsWith("global.")?i.slice(7):i;o.push({id:n[a]??0,name:a,value:r.value,session_value:r.value,is_persist:!1,environment_id:0,environment_name:"No Env"})}let l=[];for(let i of this.collectNdjsonPerRun())for(let r of i.records)r.output_variable&&r.output_value!=null&&l.push({name:r.output_variable,value:String(r.output_value),value_type:"test_level",variable_description:"ANALYZE result"});return{test_id:this.testId,version:"v4",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:[],test_params:[],test_level_variables:JSON.stringify(l),test_global_variables:o,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{Ie as a,ve as b,Q as c};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as t,b as i}from"./chunk-B2PZAB7J.js";import{i as s,j as e}from"./chunk-IACKIGPX.js";function a(r,n){return"sha256:"+i(Buffer.from("assurance."+r+"\0"+t(s(r,n)),"utf8"))}function f(r,n,o,u){return"sha256:"+i(Buffer.from("assurance.edge\0"+t({type:r,src:n,dst:o,props:e(r,u)}),"utf8"))}function d(r,n){return{source_id:r,blob:n}}function p(r){return{...r,derived:!0}}export{a,f as b,d as c,p as d};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as h}from"./chunk-FPFOW6BS.js";import{a as f}from"./chunk-
|
|
2
|
+
import{a as h}from"./chunk-FPFOW6BS.js";import{a as f}from"./chunk-QI6WZ56Y.js";import{a as m}from"./chunk-INP7FG6V.js";var o=class extends Error{constructor(a,l){super(a);this.code=l;this.name="AuthError"}};async function k(c){let{creds:i,env:a,usernameFlag:l,accessKeyFlag:p,log:t}=c,e=null,u=null;if(l&&p)e={username:l,access_key:p},t("info","AUTH_RESOLVE_FLAGS","Auth resolved via CLI flags",{username:l});else{let r=i.resolveAuth();r?.method==="basic"&&(e={username:r.username,access_key:r.access_key},t("info","AUTH_RESOLVE_CONFIG","Auth resolved via config",{username:r.username}))}if(!e){let{credentials:r,profile:E}=i.getActiveCredentials();if(!r)throw new o("Not authenticated \u2014 no credentials found","not_authenticated");if(u=r.access_token,r.expires_at-Date.now()/1e3<300)try{let n=await f({creds:i,profile:E,env:a,credentials:r});n&&(u=n.accessToken,t("info","AUTH_TOKEN_REFRESHED","OAuth token refreshed"))}catch(n){let d=n instanceof Error?n.message:String(n);throw t("error","TOKEN_REFRESH_FAILED","Token refresh failed",{error:d}),new o(`Token refresh failed: ${d}`,"refresh_failed")}}let v=m(a),b=async()=>u,y=e?{username:e.username,access_key:e.access_key}:null,g=new h(v.controllerBaseUrl,b,y,t),s=await g.resolve();return s&&!e&&(e={username:s.username,access_key:s.access_key},t("info","AUTH_RESOLVE_CONTROLLER","Auth resolved via controller",{username:s.username})),{basicAuth:e,token:u,resolver:g,resolvedCreds:s}}export{o as a,k as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{
|
|
2
|
+
import{a as f}from"./chunk-5Q46BEG7.js";import{x as t}from"./chunk-MKD3KZPM.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as r,b as n}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var c=p(B(),1);var e=p(x(),1);function v(){return[{name:"convert",label:"Converting session data",status:"pending"},{name:"zip",label:"Compressing artifacts",status:"pending"},{name:"presign",label:"Requesting upload URLs",status:"pending"},{name:"upload",label:"Uploading to KaneAI",status:"pending"},{name:"atomic_replace",label:"Replacing local output",status:"pending"},{name:"commit_lock",label:"Committing to TMS",status:"pending"},{name:"finalize",label:"Finalizing test case",status:"pending"},{name:"code_export",label:"Downloading test code",status:"pending"}]}function U(s,o,d,a){return s.map(l=>l.name===o?{...l,status:d,detail:a}:l)}function R(s){let o=s/1e3;if(o<60)return`${o.toFixed(1)}s`;let d=Math.floor(o/60),a=Math.round(o%60);return`${d}m ${a}s`}function D(s){let[o,d]=(0,c.useState)(0),a=c.default.useRef(Date.now());return(0,c.useEffect)(()=>{if(!s)return;a.current=Date.now();let l=setInterval(()=>{d(Date.now()-a.current)},100);return()=>clearInterval(l)},[s]),o}function h({steps:s,status:o,testUrl:d,error:a}){let l=D(o==="uploading");return o==="uploading"?(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.orange,children:"\u2601 "}),(0,e.jsx)(n,{color:t.orange,bold:!0,children:"Saving to KaneAI"}),(0,e.jsxs)(n,{color:t.dim,children:[" ",R(l)]})]}),(0,e.jsx)(r,{flexDirection:"column",marginTop:1,children:s.filter(i=>i.status!=="skipped").map((i,S,T)=>{let b=S===T.length-1?"\u2514\u2500":"\u251C\u2500",u=i.status==="done",m=i.status==="running",g=i.status==="failed";return(0,e.jsxs)(r,{children:[(0,e.jsxs)(n,{color:t.dim,children:[" ",b," "]}),(0,e.jsx)(r,{width:3,children:m?(0,e.jsx)(f,{}):u?(0,e.jsx)(n,{color:t.green,children:"\u2713"}):g?(0,e.jsx)(n,{color:t.red,children:"\u2717"}):(0,e.jsx)(n,{color:t.muted,children:"\u25CB"})}),(0,e.jsx)(n,{color:u?t.dim:m?void 0:g?t.red:t.muted,children:i.label}),i.detail&&(0,e.jsxs)(n,{color:t.dim,children:[" ",i.detail]})]},i.name)})}),(0,e.jsx)(r,{marginTop:1,children:(0,e.jsx)(n,{color:t.muted,children:" press Ctrl+C twice to force exit"})})]}):o==="success"?(0,e.jsx)(e.Fragment,{}):(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.red,children:"\u2601 "}),(0,e.jsx)(n,{color:t.red,bold:!0,children:"Save failed"})]}),a&&(0,e.jsxs)(r,{marginTop:0,children:[(0,e.jsx)(n,{color:t.dim,children:" "}),(0,e.jsx)(n,{color:t.dim,children:a})]})]})}export{v as a,U as b,h as c};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as l}from"./chunk-RZ4F3BHX.js";import{a,c,e as o}from"./chunk-
|
|
2
|
+
import{a as l}from"./chunk-RZ4F3BHX.js";import{a,c,e as o}from"./chunk-MKD3KZPM.js";import{readFileSync as f,writeFileSync as d,mkdirSync as h,realpathSync as g}from"fs";import{join as y}from"path";var C="npm install -g @testmuai/kane-cli@latest",b="brew upgrade lambdatest/kane/kane-cli";function w(){try{let t=process.argv[1];if(t&&g(t).includes("/Cellar/"))return b}catch{}return C}var m=y(c,"version-check.json"),S=1440*60*1e3;function k(){try{let t=JSON.parse(f(m,"utf-8"));if(Date.now()-t.checkedAt<S)return t}catch{}return null}function A(t){try{h(c,{recursive:!0}),d(m,JSON.stringify({latest:t,checkedAt:Date.now()}))}catch{}}function u(t,r){let i=t.split(".").map(Number),n=r.split(".").map(Number);for(let s=0;s<3;s++){let e=(n[s]??0)-(i[s]??0);if(e!==0)return e}return 0}function p(t,r){let i=t.split(".").map(Number),n=r.split(".").map(Number);return(n[0]??0)!==(i[0]??0)?"major":(n[1]??0)!==(i[1]??0)?"minor":"patch"}async function j(){try{let t=k();if(t)return u(a,t.latest)>0?{current:a,latest:t.latest,severity:p(a,t.latest)}:null;let r=new AbortController,i=setTimeout(()=>r.abort(),5e3),n=await l(o,{headers:{Accept:"application/json"},signal:r.signal});if(clearTimeout(i),!n.ok)return null;let e=(await n.json())["dist-tags"]?.latest;return e?(A(e),u(a,e)>0?{current:a,latest:e,severity:p(a,e)}:null):null}catch{return null}}export{w as a,u as b,p as c,j as d};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{d as f}from"./chunk-JFAFKHDX.js";import{a as v}from"./chunk-GIRXJOJI.js";import{g}from"./chunk-B2PZAB7J.js";import{d as m,f as u}from"./chunk-IACKIGPX.js";var w=3,S={edit:"edit",reject:"mistake",dedup_dropped:"mistake",approve:"usage",enhance:"directed-edit",add:"directed-edit",default_accepted:"usage",default_overridden:"edit",gap_resolution:"usage",dedup_kept:"usage"};function T(y){let{contextDir:i,graph:o,watermark:_,by:N}=y,{signals:$}=f(i,_),h=$.filter(e=>e.event_id===void 0||o.appliedEvents.has(e.event_id)),s=new Map;for(let e of h){let t=e.event_id??`${e.ts}|${e.id}|${e.verdict}|${e.polarity}`;s.has(`${t}|${e.polarity}|${e.verdict}`)||s.set(`${t}|${e.polarity}|${e.verdict}`,e)}let k=[...s.values()].sort((e,t)=>(e.event_id??e.ts)<(t.event_id??t.ts)?-1:1),n=new Map;for(let e of k){let t=`${e.verdict}|${e.tag??""}`,r=n.get(t)??{verdict:e.verdict,tag:e.tag,events:new Set};r.events.add(e.event_id??e.ts),n.set(t,r)}let d=[],a=0;for(let[,e]of[...n.entries()].sort(([t],[r])=>t<r?-1:1)){if(e.events.size<w)continue;let r={derived:!0,statement:`${e.verdict}${e.tag?`/${e.tag}`:""} recurs (${e.events.size} distinct events) \u2014 bias future proposals ${e.verdict==="approve"?"toward":"away from"} this pattern`,learned_from_kind:S[e.verdict]??"usage",learned_from:[...e.events].sort()},c=u("stylenote",r);if(c.length>0)return{record:null,errors:c.map(l=>({code:l.code,detail:l.detail})),minted:0};let p=v("stylenote",r);o.hasNode(p)||(d.push({cid:p,label:m.STYLENOTE,content:r}),a+=1)}return d.length===0?{record:null,errors:null,minted:0}:{record:g(i,{ts:new Date().toISOString(),proposal_id:null,nodes:d,edges:[],review:[],supersessions:[],source_head_moves:{}},{expectPrev:o.latestHash}).record,errors:null,minted:a}}export{T as a};
|