@testmuai/kane-cli 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChatSurface-J777M5WC.js +8 -0
- package/dist/{ChromeProfilePicker-XXNZLSCC.js → ChromeProfilePicker-UUGUMJPI.js} +1 -1
- package/dist/{CliFeedbackPrompt-FJF5INQO.js → CliFeedbackPrompt-JZWESL7Z.js} +1 -1
- package/dist/{CliUploadProgress-5E3CCYPZ.js → CliUploadProgress-62U3LAUU.js} +1 -1
- package/dist/{ConfigView-TGVOKOUZ.js → ConfigView-WHEFCVHR.js} +1 -1
- package/dist/{EvidenceViewOffer-7O3RNBEE.js → EvidenceViewOffer-JQDEAE2T.js} +1 -1
- package/dist/{FolderPicker-T4JB4NNW.js → FolderPicker-HJUUHQEI.js} +1 -1
- package/dist/{HelpView-PSHKI7DD.js → HelpView-EWHP7LSJ.js} +1 -1
- package/dist/{InfoBox-PXWJ6BIX.js → InfoBox-GQQJVTI5.js} +1 -1
- package/dist/{LinksBox-IUOYRXYO.js → LinksBox-EWCPAZFN.js} +1 -1
- package/dist/{ProfilesView-UK5XX5WP.js → ProfilesView-5FJNQMUW.js} +1 -1
- package/dist/{ProjectPicker-3FE7UFXL.js → ProjectPicker-IN7GFN7I.js} +1 -1
- package/dist/{SaveSessionPrompt-P7NF5FDA.js → SaveSessionPrompt-ISODGFP7.js} +1 -1
- package/dist/SingleShotApp-QANGFAPO.js +2 -0
- package/dist/{SummaryBox-WVR4U3NN.js → SummaryBox-R6WHU7VD.js} +1 -1
- package/dist/TestMdRunView-74A3LCNE.js +2 -0
- package/dist/{WhoamiView-QVXJAVTC.js → WhoamiView-YRQNOSOH.js} +1 -1
- package/dist/{bind-SRZYTS4Q.js → bind-FZ4X4SOK.js} +2 -2
- package/dist/{bridge-I6N3YPXI.js → bridge-7UMWMIJJ.js} +1 -1
- package/dist/{changelog-HPSX3L7T.js → changelog-YQC2QDCO.js} +1 -1
- package/dist/chat-controller-QXFAB2DK.js +3 -0
- package/dist/{chunk-HUD7SPUF.js → chunk-2S4S2XJC.js} +1 -1
- package/dist/{chunk-DEYHK6ZC.js → chunk-2TVRHXRK.js} +1 -1
- package/dist/{chunk-6XKJH5ZE.js → chunk-326XAPMW.js} +2 -2
- package/dist/{chunk-TJRBV2V2.js → chunk-53VDR5DN.js} +3 -3
- package/dist/{chunk-X4QL2DAD.js → chunk-6RQAUK5F.js} +1 -1
- package/dist/{chunk-5ON7QQZO.js → chunk-7LFCSSPX.js} +10 -10
- package/dist/{chunk-2U5DZUC7.js → chunk-7MV5UF6O.js} +1 -1
- package/dist/{chunk-VL2UA23Z.js → chunk-7YQW4TFI.js} +1 -1
- package/dist/{chunk-KGFISJFM.js → chunk-ARS72637.js} +1 -1
- package/dist/{chunk-KRFGAVYU.js → chunk-AV5SUGRY.js} +1 -1
- package/dist/{chunk-K2MKBBI4.js → chunk-B5LJCGAY.js} +1 -1
- package/dist/{chunk-Z4K4AYEI.js → chunk-BFFCGEUH.js} +1 -1
- package/dist/{chunk-FU3OQXFH.js → chunk-BGGNBWAJ.js} +1 -1
- package/dist/{chunk-4PIMEZJW.js → chunk-BO3JA2GS.js} +3 -3
- package/dist/{chunk-D5DEWIAU.js → chunk-C5POEXSX.js} +2 -2
- package/dist/{chunk-HR7AGYV2.js → chunk-CIW2KP4C.js} +1 -1
- package/dist/{chunk-XN7PPLFS.js → chunk-DEEBPSJN.js} +1 -1
- package/dist/{chunk-QIE62H3J.js → chunk-E4OYR32M.js} +1 -1
- package/dist/{chunk-Q6TVDG3X.js → chunk-EEO4XWY6.js} +1 -1
- package/dist/{chunk-PJSCM6JX.js → chunk-EWFFJBAM.js} +1 -1
- package/dist/{chunk-S6GRW5ZA.js → chunk-F2K3XFFH.js} +2 -2
- package/dist/{chunk-M6DX4ENH.js → chunk-F66SSA4C.js} +1 -1
- package/dist/{chunk-44QUA6GV.js → chunk-FFL2TQEJ.js} +1 -1
- package/dist/{chunk-FOZVXYVG.js → chunk-G6AF2JUA.js} +1 -1
- package/dist/{chunk-GN3SZXZ5.js → chunk-ME5QSYWX.js} +1 -1
- package/dist/{chunk-52VLJKIN.js → chunk-NFGG5DA2.js} +1 -1
- package/dist/{chunk-YSK535OI.js → chunk-OE7TVGNB.js} +2 -2
- package/dist/{chunk-6UNTIXFW.js → chunk-OGVIHL5G.js} +1 -1
- package/dist/{chunk-35SRW4KA.js → chunk-P46TIMGQ.js} +1 -1
- package/dist/{chunk-N62EM6JX.js → chunk-PJDOXRLB.js} +1 -1
- package/dist/{chunk-IDDVO4UV.js → chunk-Q4HLQOJI.js} +1 -1
- package/dist/chunk-RE3BZVGE.js +3 -0
- package/dist/{chunk-YIOWO6WS.js → chunk-RLG5NUTE.js} +1 -1
- package/dist/{chunk-ZGH7T32S.js → chunk-RZFINU7J.js} +1 -1
- package/dist/{chunk-WM5QHLAP.js → chunk-SGU72YLH.js} +4 -4
- package/dist/{chunk-OZM4UU5F.js → chunk-SHSV64GX.js} +1 -1
- package/dist/{chunk-4G4HPMR2.js → chunk-SL7AJ7JQ.js} +1 -1
- package/dist/{chunk-LZKUF23A.js → chunk-SQFNMZJ2.js} +1 -1
- package/dist/{chunk-B2CIHKXG.js → chunk-TTSYHJLX.js} +1 -1
- package/dist/chunk-TY5LWU6I.js +14 -0
- package/dist/{chunk-L4AUCQVO.js → chunk-TZZYRDCF.js} +1 -1
- package/dist/{chunk-DCYTRYR2.js → chunk-UXJPCWGW.js} +1 -1
- package/dist/{chunk-MHQ6A2QZ.js → chunk-VXGOWBET.js} +1 -1
- package/dist/{chunk-BKGJGPDN.js → chunk-WFRL54GK.js} +1 -1
- package/dist/{chunk-EK2B2LZK.js → chunk-XBE7PGVY.js} +1 -1
- package/dist/{chunk-OZODSY6H.js → chunk-Y6LMHBLE.js} +1 -1
- package/dist/{chunk-LV5VRSPI.js → chunk-Y7KW5AEN.js} +1 -1
- package/dist/{chunk-U3JB76QP.js → chunk-YZKPZXHY.js} +1 -1
- package/dist/{chunk-NEZ4G7XR.js → chunk-YZSYXNMB.js} +1 -1
- package/dist/{config-KD62VH3R.js → config-5OOP2BO3.js} +1 -1
- package/dist/{credentials-NQNJR4E4.js → credentials-XCP6DJZZ.js} +1 -1
- package/dist/{evidence-FFOI2H3N.js → evidence-AX67Q6RN.js} +1 -1
- package/dist/{evolve-cmd-PHQ6FHRI.js → evolve-cmd-HR25DRTC.js} +1 -1
- package/dist/{extract-bind-6UMILP4U.js → extract-bind-ZDAXRQUS.js} +2 -2
- package/dist/{extract-cmd-MZR7PHGA.js → extract-cmd-5GGI6LAM.js} +1 -1
- package/dist/{generate-headless-XOBQS6RU.js → generate-headless-DRDE46ON.js} +2 -2
- package/dist/index.js +12 -12
- package/dist/{interactive-bind-5FWW3S53.js → interactive-bind-T6OBLZCT.js} +2 -2
- package/dist/{list-commands-PDTISP6T.js → list-commands-UDAL3SBY.js} +1 -1
- package/dist/login-flow-LJ4BH3OS.js +2 -0
- package/dist/{persist-recorded-session-5UNUINWF.js → persist-recorded-session-BW3YSFMP.js} +1 -1
- package/dist/{pipeline-F4WTOZ3Y.js → pipeline-TZJ652NT.js} +1 -1
- package/dist/{reconcile-cmd-MNMWAZF3.js → reconcile-cmd-242S7XNO.js} +2 -2
- package/dist/{recording-banner-IWY3GS6N.js → recording-banner-6FVTCUWQ.js} +1 -1
- package/dist/{require-project-folder-PFIDA5ZH.js → require-project-folder-AQUVEEJB.js} +1 -1
- package/dist/run-UGAOGR3B.js +2 -0
- package/dist/{run-test-md-7GONSVAM.js → run-test-md-AUK7NGLL.js} +2 -2
- package/dist/{skill-installer-YZP5DWWZ.js → skill-installer-2MNPCPRD.js} +1 -1
- package/dist/{spawner-YDYCSTZD.js → spawner-XCOMTJJC.js} +1 -1
- package/dist/tcg-generate-E5X23RVP.js +2 -0
- package/dist/{testmd-actions-7RNW76DN.js → testmd-actions-TU4KTO32.js} +1 -1
- package/dist/token-refresh-GGLARJV4.js +2 -0
- package/dist/{validate-basic-IQY5CRLP.js → validate-basic-IYMPP7C7.js} +1 -1
- package/dist/{version-check-U5UBPVX4.js → version-check-MUPSKONS.js} +1 -1
- package/package.json +6 -6
- package/dist/ChatSurface-HGP5EHZM.js +0 -9
- package/dist/SingleShotApp-UIDA54GB.js +0 -2
- package/dist/TestMdRunView-OH4Y6YD6.js +0 -2
- package/dist/chat-controller-VKGECDTU.js +0 -3
- package/dist/chunk-DM2GL24Z.js +0 -3
- package/dist/chunk-HW7Z5S2M.js +0 -14
- package/dist/login-flow-IXPJHTL2.js +0 -2
- package/dist/run-V2WMNHFK.js +0 -2
- package/dist/tcg-generate-ZRKSX2KC.js +0 -2
- package/dist/token-refresh-DH2L2IPP.js +0 -2
|
@@ -2,4 +2,4 @@ import { createRequire } from 'module'; const require = createRequire(import.met
|
|
|
2
2
|
import{a as D}from"./chunk-NNZV5RCE.js";import{a as p,b as U,d as G}from"./chunk-AD46OCZ4.js";import{a as _}from"./chunk-JFAFKHDX.js";import{a as x}from"./chunk-QPZRHAYK.js";import{d as w}from"./chunk-KHDUQ33H.js";import{a as O,b as C}from"./chunk-D5T4ARTB.js";import{d as f,e as m}from"./chunk-IACKIGPX.js";var y=(e,t)=>e.nameOf.get(t)??t;function B(e,t){let n=[];for(let{cid:o}of e.byLabel(f.SCENARIO))e.superseded.has(o)||e.edgesFrom(o).some(s=>s.type===m.BELONGS_TO&&e.tipOf(s.dst)===t)&&n.push(o);return n}function P(e,t){let n=[],o=[],s=[],c=B(e,t),i=new Set(c);for(let r of c){let d=e.getNode(r)?.content??{};n.push({ref:y(e,r),title:String(d.title??""),case_type:String(d.case_type??""),intent:String(d.intent??"")});for(let u of e.edgesInto(r)){if(u.type!==m.AUTOMATES||e.superseded.has(u.src))continue;let g=e.getNode(u.src)?.content??{},a=e.edgesFrom(u.src).filter(l=>l.type===m.VERIFIES&&!e.superseded.has(l.dst)).map(l=>y(e,l.dst));o.push({ref:y(e,u.src),title:String(g.title??""),check:g.check,verifies:a})}}for(let{cid:r}of e.byLabel(f.AC)){if(e.superseded.has(r))continue;let d=e.edgesFrom(r).find(l=>l.type===m.SCOPED_TO);if(!d)continue;let u=e.tipOf(d.dst);if(!(u===t||i.has(u)))continue;let a=e.getNode(r)?.content??{};s.push({ref:y(e,r),text:String(a.text??""),kind:String(a.kind??""),scope:u===t?"use-case":y(e,u)})}return{scenarios:n,tests:o,acs:s}}function A(e,t,n){let o=t.getNode(n)?.content.blob;if(typeof o!="string")return null;let s=w(e,o);return s===null?null:s.toString("utf8")}function M(e,t){let n=t.split(`
|
|
3
3
|
`).map(s=>s.replace(/^\d+\| /,"")),o=[];for(let s of e.split(`
|
|
4
4
|
`)){let c=s.trim();if(c.length===0)continue;let i=n.find(r=>r.includes(c));i!==void 0&&!o.includes(i.trim())&&o.push(i.trim())}return o.length>0?o.join(`
|
|
5
|
-
`):{removed:!0}}function j(e,t,n,o){if(o!==void 0&&o.trim().length>0)return{kind:"user-directive",text:o.trim()};let s=[n,...P(t,n).acs.map(r=>t.resolve(r.ref)?.cid??"")].filter(Boolean),c=[],i=new Set;for(let r of s){let d=new Map;for(let u of t.derivesInto(r))d.set(String(u.props.source_id),u);for(let[u,g]of d){let a=t.heads.get(u);if(a==null||a===g.props.source_cid)continue;let l=String(g.props.anchor),h=`${u}\0${l}`;if(i.has(h)||l==="img#whole")continue;i.add(h);let b=A(e,t,String(g.props.source_cid)),E=b===null?null:x(b,l);if(E===null)continue;let T=A(e,t,a);c.push({source_id:u,anchor:l,old_anchor_text:E,new_anchor_text:T===null?{removed:!0}:M(E,T)})}}return{kind:"source-change",changes:c}}function L(e,t,n,o){let s=P(t,n);if(s.scenarios.length===0&&s.tests.length===0&&s.acs.length===0)return;let c=j(e,t,n,o);if(!(c.kind==="source-change"&&c.changes.length===0))return{prior_design:s,change_delta:c}}var $=new Set([f.USECASE,f.SCENARIO,f.AC,f.TEST]);function v(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function S(e,t,n){let o=e.edgesFrom(t).find(s=>s.type===n);return o?e.tipOf(o.dst):null}function k(e,t,n){if(n===f.USECASE)return t;if(n===f.SCENARIO)return S(e,t,m.BELONGS_TO);if(n===f.AC){let o=S(e,t,m.SCOPED_TO);return o?e.nodeLabel.get(o)===f.USECASE?o:S(e,o,m.BELONGS_TO):null}if(n===f.TEST){let o=S(e,t,m.AUTOMATES);return o?S(e,o,m.BELONGS_TO):null}return null}function F(e,t){let n=e.nameOf.get(t);if(n)return n;for(let[o,s]of e.names)if(e.tipOf(s)===t)return o;return t}function N(e,t){return{ucTip:t,display:F(e,t),seamRef:e.nameOf.get(t)??t}}function V(e,t){let n=e.resolve(t);if(!n)return{ok:!1,message:`unknown ref '${t}' \u2014 no test/scenario/ac/use-case by that id or cid`};let o=n.tip,s=e.nodeLabel.get(o);if(!s||!$.has(s))return{ok:!1,message:`'${t}' is a ${s??"missing node"} \u2014 evolve takes a test, scenario, acceptance criterion, or use-case`};let c=k(e,o,s);return!c||e.nodeLabel.get(c)!==f.USECASE?{ok:!1,message:`cannot resolve '${t}' to a parent use-case \u2014 its ${s} chain is broken`}:e.superseded.has(c)?{ok:!1,message:`use-case ${F(e,c)} was removed \u2014 nothing to evolve`}:{ok:!0,target:N(e,c)}}function R(e,t){let n=[];for(let{cid:s}of e.byLabel(f.SCENARIO)){if(!v(e,s)||!e.edgesFrom(s).some(i=>i.type===m.BELONGS_TO&&e.tipOf(i.dst)===t))continue;let c=e.edgesInto(s).filter(i=>i.type===m.AUTOMATES&&v(e,i.src));if(c.length===0)n.push({scenario:s,test:null});else for(let i of c)n.push({scenario:s,test:i.src})}let o=new Map;for(let{cid:s}of e.byLabel(f.AC)){if(!v(e,s)||k(e,s,f.AC)!==t)continue;let c=e.edgesInto(s).filter(i=>i.type===m.VERIFIES&&v(e,i.src)).map(i=>i.src).sort();o.set(s,c)}return{pairs:n,verifies:o}}function q(e,t){let n=i=>`${i.scenario}\0${i.test??""}`,o=new Set(e.pairs.map(n)),s=new Set(t.pairs.map(n)),c=[];for(let[i,r]of e.verifies){let d=t.verifies.get(i);d&&(r.length===d.length&&r.every((u,g)=>u===d[g])||c.push({ac:i,before:r,after:d}))}return{superseded:e.pairs.filter(i=>!s.has(n(i))),minted:t.pairs.filter(i=>!o.has(n(i))),retained:t.pairs.filter(i=>o.has(n(i))),moves:c}}function Y(e,t,n,o,s){let c=r=>t.nameOf.get(r)??r,i=r=>` - ${c(r.scenario)} \xB7 ${r.test?c(r.test):"(no test)"}`;e.out(`evolved: use-case ${n} \u2014 design record ${o.before} \u2192 ${o.after}`),e.out(`superseded: ${s.superseded.length} pair(s)`);for(let r of s.superseded)e.out(i(r));e.out(`minted: ${s.minted.length} pair(s)`);for(let r of s.minted)e.out(i(r));e.out(`retained: ${s.retained.length} pair(s)`);for(let r of s.retained)e.out(i(r));if(s.moves.length===0)e.out("verifies moves: none");else{e.out("verifies moves:");for(let r of s.moves){let d=u=>u.length>0?u.map(c).join(" + "):"(none)";e.out(` - ${c(r.ac)}: ${d(r.before)} \u2192 ${d(r.after)}`)}}}async function I(e,t,n,o,s,c){let i=O(e),r=D(i,t.ucTip);if(!r)return c==="batch"?(o.out(`note: ${t.display} has no design output \u2014 nothing to evolve; run kane-cli design tests --use-case ${t.display} first`),{code:0,outcome:"no-design"}):(p(o,`nothing to evolve \u2014 run kane-cli design tests --use-case ${t.display} first (no design output)`),{code:2,outcome:"no-design"});let d=R(i,t.ucTip),u=`evolve re-designs the parent use-case ${t.display}; ${d.pairs.length} pair(s) affected`;if(n.yes)o.out(u);else if(!await o.confirm(`${u} \u2014 proceed?`))return o.out(c==="batch"?`skipped ${t.display}`:"declined \u2014 nothing evolved"),{code:0,outcome:"declined"};let g=L(e,i,t.ucTip,n.because),a=await s(t.seamRef,{yes:!!n.yes,...n.because?{because:n.because}:{},...g!==void 0?{changeDelta:g.change_delta,priorDesign:g.prior_design}:{}});if(a===3)return o.out(`design session for ${t.display} paused \u2014 resume with \`kane-cli design tests --resume\`, then re-run evolve for the diff`),{code:a,outcome:"paused"};if(a!==0)return p(o,`design run for ${t.display} ended with exit code ${a} \u2014 no diff to report`),{code:a,outcome:"failed"};let l=O(e),h=l.tipOf(t.ucTip),b=D(l,h)?.seq;return Y(o,l,t.display,{before:r.seq,after:b??"?"},q(d,R(l,h))),{code:0,outcome:"evolved"}}function H(e){let t=new Map,n=0;for(let{cid:s,state:c}of e.staleList()){if(c==="superseded")continue;let i=e.nodeLabel.get(s);if(!i||!$.has(i)||!v(e,s)||!C(e,s))continue;let r=k(e,s,i);!r||e.nodeLabel.get(r)!==f.USECASE||e.superseded.has(r)||(n++,t.has(r)||t.set(r,N(e,r)))}return{targets:[...t.values()].sort((s,c)=>s.display<c.display?-1:s.display>c.display?1:0),staleCount:n}}function z(e,t){for(let{cid:n,state:o}of e.staleList()){if(o==="superseded")continue;let s=e.nodeLabel.get(n);if(!(!s||!$.has(s)||!v(e,n))&&C(e,n)&&k(e,n,s)===t)return!0}return!1}async function J(e,t,n,o={},s=process.cwd()){if(e&&t.fromStale)return p(n,"pass a <ref> OR --from-stale, not both"),2;if(!e&&!t.fromStale)return p(n,"evolve needs a <ref> or --from-stale"),2;let c=U(s,n);if(!c)return 2;let i=o.runDesignForUc??K;n.out(`evolving ${e??"stale use-cases"}: reading the graph\u2026`);let r=O(c),d,u=null;if(e){let a=V(r,e);if(!a.ok)return p(n,a.message),2;if(!t.because&&D(r,a.target.ucTip)&&!z(r,a.target.ucTip))return p(n,`nothing changed underneath ${e} \u2014 its sources and requirements are current; use --because "<reason>" to re-design anyway`),2;d=[a.target]}else{let{targets:a,staleCount:l}=H(r);if(a.length===0)return n.out("nothing stale \u2014 nothing to evolve"),0;u=`from-stale: ${l} stale node(s) \u2192 ${a.length} use-case(s)`,d=a}if(!t.yes&&!n.isTTY)return p(n,"refusing to evolve without --yes (no TTY to confirm)"),2;if(u&&n.out(u),e){let a=await I(c,d[0],t,n,i,"single");return a.outcome==="evolved"&&t.because&&_(c,{ts:new Date().toISOString(),command:"evolve",id:e,verdict:"gap-resolved-evolve",polarity:"preference",by:{kind:"human",id:process.env.USER??"operator"},target:e,reason:t.because}),a.code}let g=0;for(let a of d){let{code:l}=await I(c,a,t,n,i,"batch");l!==0&&g===0&&(g=l)}return g}var K=async(e,t)=>{let{designTestsCommand:n}=await import("./bind-
|
|
5
|
+
`):{removed:!0}}function j(e,t,n,o){if(o!==void 0&&o.trim().length>0)return{kind:"user-directive",text:o.trim()};let s=[n,...P(t,n).acs.map(r=>t.resolve(r.ref)?.cid??"")].filter(Boolean),c=[],i=new Set;for(let r of s){let d=new Map;for(let u of t.derivesInto(r))d.set(String(u.props.source_id),u);for(let[u,g]of d){let a=t.heads.get(u);if(a==null||a===g.props.source_cid)continue;let l=String(g.props.anchor),h=`${u}\0${l}`;if(i.has(h)||l==="img#whole")continue;i.add(h);let b=A(e,t,String(g.props.source_cid)),E=b===null?null:x(b,l);if(E===null)continue;let T=A(e,t,a);c.push({source_id:u,anchor:l,old_anchor_text:E,new_anchor_text:T===null?{removed:!0}:M(E,T)})}}return{kind:"source-change",changes:c}}function L(e,t,n,o){let s=P(t,n);if(s.scenarios.length===0&&s.tests.length===0&&s.acs.length===0)return;let c=j(e,t,n,o);if(!(c.kind==="source-change"&&c.changes.length===0))return{prior_design:s,change_delta:c}}var $=new Set([f.USECASE,f.SCENARIO,f.AC,f.TEST]);function v(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function S(e,t,n){let o=e.edgesFrom(t).find(s=>s.type===n);return o?e.tipOf(o.dst):null}function k(e,t,n){if(n===f.USECASE)return t;if(n===f.SCENARIO)return S(e,t,m.BELONGS_TO);if(n===f.AC){let o=S(e,t,m.SCOPED_TO);return o?e.nodeLabel.get(o)===f.USECASE?o:S(e,o,m.BELONGS_TO):null}if(n===f.TEST){let o=S(e,t,m.AUTOMATES);return o?S(e,o,m.BELONGS_TO):null}return null}function F(e,t){let n=e.nameOf.get(t);if(n)return n;for(let[o,s]of e.names)if(e.tipOf(s)===t)return o;return t}function N(e,t){return{ucTip:t,display:F(e,t),seamRef:e.nameOf.get(t)??t}}function V(e,t){let n=e.resolve(t);if(!n)return{ok:!1,message:`unknown ref '${t}' \u2014 no test/scenario/ac/use-case by that id or cid`};let o=n.tip,s=e.nodeLabel.get(o);if(!s||!$.has(s))return{ok:!1,message:`'${t}' is a ${s??"missing node"} \u2014 evolve takes a test, scenario, acceptance criterion, or use-case`};let c=k(e,o,s);return!c||e.nodeLabel.get(c)!==f.USECASE?{ok:!1,message:`cannot resolve '${t}' to a parent use-case \u2014 its ${s} chain is broken`}:e.superseded.has(c)?{ok:!1,message:`use-case ${F(e,c)} was removed \u2014 nothing to evolve`}:{ok:!0,target:N(e,c)}}function R(e,t){let n=[];for(let{cid:s}of e.byLabel(f.SCENARIO)){if(!v(e,s)||!e.edgesFrom(s).some(i=>i.type===m.BELONGS_TO&&e.tipOf(i.dst)===t))continue;let c=e.edgesInto(s).filter(i=>i.type===m.AUTOMATES&&v(e,i.src));if(c.length===0)n.push({scenario:s,test:null});else for(let i of c)n.push({scenario:s,test:i.src})}let o=new Map;for(let{cid:s}of e.byLabel(f.AC)){if(!v(e,s)||k(e,s,f.AC)!==t)continue;let c=e.edgesInto(s).filter(i=>i.type===m.VERIFIES&&v(e,i.src)).map(i=>i.src).sort();o.set(s,c)}return{pairs:n,verifies:o}}function q(e,t){let n=i=>`${i.scenario}\0${i.test??""}`,o=new Set(e.pairs.map(n)),s=new Set(t.pairs.map(n)),c=[];for(let[i,r]of e.verifies){let d=t.verifies.get(i);d&&(r.length===d.length&&r.every((u,g)=>u===d[g])||c.push({ac:i,before:r,after:d}))}return{superseded:e.pairs.filter(i=>!s.has(n(i))),minted:t.pairs.filter(i=>!o.has(n(i))),retained:t.pairs.filter(i=>o.has(n(i))),moves:c}}function Y(e,t,n,o,s){let c=r=>t.nameOf.get(r)??r,i=r=>` - ${c(r.scenario)} \xB7 ${r.test?c(r.test):"(no test)"}`;e.out(`evolved: use-case ${n} \u2014 design record ${o.before} \u2192 ${o.after}`),e.out(`superseded: ${s.superseded.length} pair(s)`);for(let r of s.superseded)e.out(i(r));e.out(`minted: ${s.minted.length} pair(s)`);for(let r of s.minted)e.out(i(r));e.out(`retained: ${s.retained.length} pair(s)`);for(let r of s.retained)e.out(i(r));if(s.moves.length===0)e.out("verifies moves: none");else{e.out("verifies moves:");for(let r of s.moves){let d=u=>u.length>0?u.map(c).join(" + "):"(none)";e.out(` - ${c(r.ac)}: ${d(r.before)} \u2192 ${d(r.after)}`)}}}async function I(e,t,n,o,s,c){let i=O(e),r=D(i,t.ucTip);if(!r)return c==="batch"?(o.out(`note: ${t.display} has no design output \u2014 nothing to evolve; run kane-cli design tests --use-case ${t.display} first`),{code:0,outcome:"no-design"}):(p(o,`nothing to evolve \u2014 run kane-cli design tests --use-case ${t.display} first (no design output)`),{code:2,outcome:"no-design"});let d=R(i,t.ucTip),u=`evolve re-designs the parent use-case ${t.display}; ${d.pairs.length} pair(s) affected`;if(n.yes)o.out(u);else if(!await o.confirm(`${u} \u2014 proceed?`))return o.out(c==="batch"?`skipped ${t.display}`:"declined \u2014 nothing evolved"),{code:0,outcome:"declined"};let g=L(e,i,t.ucTip,n.because),a=await s(t.seamRef,{yes:!!n.yes,...n.because?{because:n.because}:{},...g!==void 0?{changeDelta:g.change_delta,priorDesign:g.prior_design}:{}});if(a===3)return o.out(`design session for ${t.display} paused \u2014 resume with \`kane-cli design tests --resume\`, then re-run evolve for the diff`),{code:a,outcome:"paused"};if(a!==0)return p(o,`design run for ${t.display} ended with exit code ${a} \u2014 no diff to report`),{code:a,outcome:"failed"};let l=O(e),h=l.tipOf(t.ucTip),b=D(l,h)?.seq;return Y(o,l,t.display,{before:r.seq,after:b??"?"},q(d,R(l,h))),{code:0,outcome:"evolved"}}function H(e){let t=new Map,n=0;for(let{cid:s,state:c}of e.staleList()){if(c==="superseded")continue;let i=e.nodeLabel.get(s);if(!i||!$.has(i)||!v(e,s)||!C(e,s))continue;let r=k(e,s,i);!r||e.nodeLabel.get(r)!==f.USECASE||e.superseded.has(r)||(n++,t.has(r)||t.set(r,N(e,r)))}return{targets:[...t.values()].sort((s,c)=>s.display<c.display?-1:s.display>c.display?1:0),staleCount:n}}function z(e,t){for(let{cid:n,state:o}of e.staleList()){if(o==="superseded")continue;let s=e.nodeLabel.get(n);if(!(!s||!$.has(s)||!v(e,n))&&C(e,n)&&k(e,n,s)===t)return!0}return!1}async function J(e,t,n,o={},s=process.cwd()){if(e&&t.fromStale)return p(n,"pass a <ref> OR --from-stale, not both"),2;if(!e&&!t.fromStale)return p(n,"evolve needs a <ref> or --from-stale"),2;let c=U(s,n);if(!c)return 2;let i=o.runDesignForUc??K;n.out(`evolving ${e??"stale use-cases"}: reading the graph\u2026`);let r=O(c),d,u=null;if(e){let a=V(r,e);if(!a.ok)return p(n,a.message),2;if(!t.because&&D(r,a.target.ucTip)&&!z(r,a.target.ucTip))return p(n,`nothing changed underneath ${e} \u2014 its sources and requirements are current; use --because "<reason>" to re-design anyway`),2;d=[a.target]}else{let{targets:a,staleCount:l}=H(r);if(a.length===0)return n.out("nothing stale \u2014 nothing to evolve"),0;u=`from-stale: ${l} stale node(s) \u2192 ${a.length} use-case(s)`,d=a}if(!t.yes&&!n.isTTY)return p(n,"refusing to evolve without --yes (no TTY to confirm)"),2;if(u&&n.out(u),e){let a=await I(c,d[0],t,n,i,"single");return a.outcome==="evolved"&&t.because&&_(c,{ts:new Date().toISOString(),command:"evolve",id:e,verdict:"gap-resolved-evolve",polarity:"preference",by:{kind:"human",id:process.env.USER??"operator"},target:e,reason:t.because}),a.code}let g=0;for(let a of d){let{code:l}=await I(c,a,t,n,i,"batch");l!==0&&g===0&&(g=l)}return g}var K=async(e,t)=>{let{designTestsCommand:n}=await import("./bind-FZ4X4SOK.js");return n({useCase:e,force:!0,...t.yes?{mode:"override"}:{},...t.because?{because:t.because}:{},...t.changeDelta!==void 0?{changeDelta:t.changeDelta}:{},...t.priorDesign!==void 0?{priorDesign:t.priorDesign}:{}})};async function ie(e,t){return J(e,t,G(),{})}export{V as a,I as b,J as c,K as d,ie as e};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as
|
|
2
|
+
import{a as Ue}from"./chunk-KHU7C6EE.js";import{a as Me,b as Ge}from"./chunk-NNZV5RCE.js";import{a as me,b as Te,c as Oe,d as Ie,g as Ne,h as je}from"./chunk-SGU72YLH.js";import{a as qe,b as Fe,g as Be,h as Pe}from"./chunk-FXPPQL4D.js";import{a as Ae}from"./chunk-RE3BZVGE.js";import{b as Re,c as De}from"./chunk-FTD3B7QA.js";import{c as Ce}from"./chunk-VJUIW2ES.js";import{a as Le}from"./chunk-Z56AWGVY.js";import{b as _e,c as be,d as ye,e as ee,f as J,g as re,h as ve,i as le}from"./chunk-RGEAEAZB.js";import{a as de}from"./chunk-L5LI2JF4.js";import{a as Y}from"./chunk-D5T4ARTB.js";import{a as xe,b as ue}from"./chunk-GIRXJOJI.js";import{e as $e,g as Ee}from"./chunk-B2PZAB7J.js";import{d as S,e as E,f as we,g as Se,h as ke}from"./chunk-IACKIGPX.js";import{mkdirSync as Et,appendFileSync as Rt}from"fs";import{randomBytes as Dt}from"crypto";import{join as ct}from"path";import{existsSync as ge,readFileSync as pe,readdirSync as dt}from"fs";import{join as te}from"path";var ze=`
|
|
3
3
|
version: 1
|
|
4
4
|
techniques:
|
|
5
5
|
- id: eqp
|
|
@@ -82,7 +82,7 @@ techniques:
|
|
|
82
82
|
name: "Notification / async-effect"
|
|
83
83
|
applies_hint: "AC produces an out-of-band effect (email/SMS/push)"
|
|
84
84
|
emits: [presence, delta]
|
|
85
|
-
`;var
|
|
85
|
+
`;var He={"web-form":`
|
|
86
86
|
id: web-form
|
|
87
87
|
name: "Web form"
|
|
88
88
|
version: 1
|
|
@@ -312,7 +312,7 @@ candidate_checks:
|
|
|
312
312
|
family: i18n
|
|
313
313
|
measurable_example: "Locale-correct collation/casing"
|
|
314
314
|
emits: presence
|
|
315
|
-
`};var
|
|
315
|
+
`};var We=`
|
|
316
316
|
version: 1
|
|
317
317
|
principles:
|
|
318
318
|
- "Each step is one complete OBJECTIVE the browser agent achieves autonomously \u2014 state the goal and the path, never low-level actions (the agent emits its own actions)."
|
|
@@ -336,9 +336,9 @@ pitfalls:
|
|
|
336
336
|
- "A test without a starting URL cannot run \u2014 the first step names it."
|
|
337
337
|
- "'Test the checkout flow' has no end state \u2014 state what done looks like."
|
|
338
338
|
- "Do not cram many unrelated operations into one step; do not reference data outside the step."
|
|
339
|
-
`;var
|
|
340
|
-
`),C=(await Xe(i,y,S.SCENARIO,10,e.embedSearch)).filter(b=>!h.has(b.cid)),L=[],f=new Set,q=[],F=[d],P=new Set([d]);for(;F.length>0;){let b=F.shift();for(let p of i.edgesFrom(b)){if(p.type!==E.DEPENDS_ON||i.nodeLabel.get(p.dst)!==S.USECASE)continue;let o=i.tipOf(p.dst);P.has(o)||(P.add(o),q.push(o),F.push(o))}}for(let b of q){let p=`depends_on ${i.nameOf.get(b)??b.slice(0,19)}`;for(let{cid:o}of i.byLabel(S.SCENARIO))if(se(i,o)&&i.edgesFrom(o).some(r=>r.type===E.BELONGS_TO&&r.dst===b))for(let r of i.edgesInto(o)){if(r.type!==E.AUTOMATES||!se(i,r.src)||f.has(r.src))continue;f.add(r.src);let u=String(i.getNode(r.src)?.content.title??"");L.push({cid:r.src,logical_id:i.nameOf.get(r.src)??null,title:u,via:p})}}for(let b of await Xe(i,y,S.TEST,5,e.embedSearch)){let{cid:p,title:o}=b;f.has(p)||(f.add(p),L.push({cid:p,logical_id:i.nameOf.get(p)??null,title:o??"",via:"similar"}))}let I=i.byLabel(S.STYLENOTE).filter(b=>se(i,b.cid)).sort((b,p)=>b.cid<p.cid?-1:1).slice(0,5).map(b=>`${String(b.content.statement)} [${String(b.content.learned_from_kind)}]`);return{usecase:pe(i,d,D.content),cites:N,committed_acs:O,existing:{scenarios:x,reuse_candidates:C},import_candidates:L,style_notes:I,techniques:Qe(s),profiles:Ke(s),runner_grammar:Je(s),budget:{...e.max!=null?{max_pairs:e.max}:{},...e.strength!=null?{strength_override:e.strength}:{}},design_of:(()=>{let b=je(i,d);return b?{engine:b.engine,seq:b.seq}:null})()}}function et(s){let t=e=>{if(Array.isArray(e))return e.map(t);if(e!==null&&typeof e=="object"){let i={};for(let a of Object.keys(e).sort())i[a]=t(e[a]);return i}return e};return JSON.stringify(t(s),null,1)}var ne=s=>({record:null,errors:s,minted:{},logicalIds:{},superseded:[],warnings:[],finalizedTests:{}});function ie(s){return s.toLowerCase().trim().replace(/\s+/g," ")}function fe(s,t){let e=s.resolve(t);if(!e||s.nodeLabel.get(e.cid)!==S.USECASE||e.superseded)return[];let i=new Set;for(let{cid:a}of s.byLabel(S.SCENARIO))if(!s.superseded.has(a)&&s.edgesFrom(a).some(d=>d.type===E.BELONGS_TO&&s.tipOf(d.dst)===e.cid)){i.add(a);for(let d of s.edgesInto(a))d.type!==E.AUTOMATES||s.superseded.has(d.src)||i.add(d.src)}return[...i]}function tt(s){let{contextDir:t,graph:e,sections:i,by:a}=s,d=s.engine??"design@1",D=xe(t);if(e.latestHash!==D)return ne([{code:"STALE_BASIS",detail:`graph opened at ${String(e.latestHash)} but chain head is ${String(D)} \u2014 re-open and retry`}]);let N=e.resolve(s.ucRef);if(!N||e.nodeLabel.get(N.cid)!==S.USECASE||N.superseded)return ne([{code:"UNKNOWN_UC",detail:`${s.ucRef} is not a live use-case`}]);let x=N.cid,h=[],O=[],m=[],y=[],C=[],L=[],f={},q={},F={},P=[],I=[],b=new Set,p=[],o=new Set,r=new Set,u=[];{let n=s.forceScope??(s.force?fe(e,s.ucRef):[]),l=new Set;s.sections.scenarios?.length&&l.add(S.SCENARIO),s.sections.tests?.length&&l.add(S.TEST);for(let c of n)e.superseded.has(c)||(l.has(e.nodeLabel.get(c)??"")?r.add(c):u.push(c))}let A=new Set,$=n=>!e.superseded.has(n)&&(!r.has(n)||A.has(n)),j=(n,l,c)=>{if(f[n])return f[n];let w=e.resolve(n),_=w?$(w.cid)?w.cid:e.tipOf(w.cid):null;return!w||!_||!$(_)?(h.push({code:"UNKNOWN_REF",detail:`${l}: '${n}' is neither in this payload nor a live committed node`}),null):c&&e.nodeLabel.get(_)!==c?(h.push({code:"ILLEGAL_EDGE",detail:`${l}: '${n}' is a ${e.nodeLabel.get(_)}, expected ${c}`}),null):_},H=(n,l,c,w)=>{if(e.nameOf.has(l)){q[w]=e.nameOf.get(l);return}let _=Ee(n,c,B=>b.has(B)||e.names.has(B)&&!e.superseded.has(e.names.get(B)));_!==null&&(b.add(_),C.push({cid:l,slug:_,by:a}),q[w]=_)},U=(n,l,c,w)=>{for(let B of ve(n,c))h.push({code:B.code,detail:`${l}: ${B.detail}`});let _=ke(n,c);return e.hasNode(_)&&!e.superseded.has(_)?(r.has(_)&&A.add(_),f[l]=_,_):(O.push({cid:_,label:n,content:c}),f[l]=_,H(n,_,w,l),_)},M=(n,l,c,w,_)=>{let B=ue(n,l,c,w);if(e.edgesFrom(l).some(g=>g.ecid===B&&!e.superseded.has(g.ecid))){n===E.AUTOMATES&&o.add(c);return}let Q=e.nodeLabel.get(l)??O.find(g=>g.cid===l)?.label??"(unknown)",R=e.nodeLabel.get(c)??O.find(g=>g.cid===c)?.label??"(unknown)";for(let g of Se(n,Q,R,w))h.push({code:g.code,detail:`${_}: ${g.detail}`});let T=Re(e,n,l,c,p);if(T){h.push({code:T.code,detail:`${_}: ${T.detail}`});return}if(n===E.AUTOMATES){if(o.has(c)){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: two automates onto ${c} in one record (strict 1:1)`});return}if(o.add(c),!r.has(c)||A.has(c)){let g=G=>r.has(G)&&!A.has(G);if(e.edgesFrom(l).some(G=>G.type===E.AUTOMATES&&G.dst!==c&&!e.superseded.has(G.dst)&&!g(G.dst))&&e.hasNode(l)){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: automates from ${l} already has a live edge \u2014 supersede it first`});return}if(e.edgesInto(c).some(G=>G.type===E.AUTOMATES&&G.src!==l&&!e.superseded.has(G.src)&&!g(G.src))){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: automates onto ${c} already has a live edge \u2014 strict 1:1, supersede it first`});return}}}m.push({ecid:ue(n,l,c,w),type:n,src:l,dst:c,props:w}),p.push({src:l,dst:c,type:n})},W=new Set;for(let n of i.gaps??[]){let l=n.temp_ref??n.ref??"gap",c=n.question;if(!c||typeof c!="object"||!c.header||!Array.isArray(c.options)||c.options.length===0||!Number.isInteger(c.recommended_index)){h.push({code:"GAP_QUESTION_INCOMPLETE",detail:`${l}: design gaps carry a full ranked question object (header/options/recommended_index)`});continue}n.kind==="budget-evicted"&&n.ref&&W.add(n.ref);let w={kind:n.kind,question:c,derived:!0,uc:x,...n.risk?{risk:n.risk}:{},...n.risk_rationale?{risk_rationale:n.risk_rationale}:{},...n.text?{text:n.text}:{},...n.ref?{ref:n.ref}:{}};U(S.GAP,l,w,String(c.header))}let K=new Map;for(let{cid:n,content:l}of e.byLabel(S.SCENARIO))$(n)&&e.edgesFrom(n).some(c=>c.type===E.BELONGS_TO&&e.tipOf(c.dst)===x)&&K.set(ie(String(l.title??"")),n);for(let n of i.scenarios??[]){let l=K.get(ie(n.title));if(l){h.push({code:"DUPLICATE_SCENARIO",detail:`${n.temp_ref}: '${n.title}' duplicates live scenario ${e.nameOf.get(l)??l} \u2014 exercise/link it instead (reuse before minting)`});continue}let c={title:n.title,intent:n.intent,case_type:n.case_type,derived:!0,...n.technique_notes?{technique_notes:n.technique_notes}:{},...n.description?{description:n.description}:{},...n.parameters?{parameters:n.parameters}:{},...n.tags?{tags:n.tags}:{}};U(S.SCENARIO,n.temp_ref,c,n.title)}for(let n of i.scenarios??[]){let l=f[n.temp_ref];if(l){M(E.BELONGS_TO,l,x,{},n.temp_ref);for(let c of n.depends_on??[]){let w=j(c,`${n.temp_ref}.depends_on`,S.SCENARIO);w&&M(E.DEPENDS_ON,l,w,{},`${n.temp_ref}.depends_on`)}}}for(let n of i.acs??[]){let l={text:n.text,kind:n.kind,risk:n.risk,derived:!0,...n.expected_answer?{expected_answer:n.expected_answer}:{},...n.measurable!==void 0?{measurable:n.measurable}:{}},c=U(S.AC,n.temp_ref,l,n.text);if(!c)continue;let w=n.scope?.type==="scenario"&&n.scope.ref?j(n.scope.ref,`${n.temp_ref}.scope`,S.SCENARIO):x;w&&!e.edgesFrom(c).some(_=>_.type===E.SCOPED_TO&&!e.superseded.has(_.ecid))&&M(E.SCOPED_TO,c,w,{},`${n.temp_ref}.scope`);for(let _ of n.cites??[]){let B={source_id:_.source_id,source_cid:_.source_cid,anchor:_.anchor,..._.quote?{quote:_.quote}:{}};M(E.DERIVES,_.source_cid,c,B,`${n.temp_ref}.cite`)}}for(let n of i.exercises??[]){let l=j(n.scenario,"exercises.scenario",S.SCENARIO),c=j(n.ac,"exercises.ac",S.AC);l&&c&&M(E.EXERCISES,l,c,{},`exercises ${n.scenario}\u2192${n.ac}`)}for(let n of i.scoped_to_repoints??[]){let l=j(n.ac,"scoped_to_repoints.ac",S.AC),c=j(n.to,"scoped_to_repoints.to");if(!l||!c)continue;let w=e.edgesFrom(l).find(_=>_.type===E.SCOPED_TO&&!e.superseded.has(_.ecid));w&&y.push({kind:"edge",ecid:w.ecid,reason:`re-scoped to ${n.to} by ${a.id}`,by:a}),M(E.SCOPED_TO,l,c,{},`scoped_to_repoints ${n.ac}`)}let X=new Map;if(s.finalizeTestBody)for(let[n,l]of e.nameOf)X.set(e.tipOf(n),l);let V=n=>e.nameOf.get(n)??X.get(e.tipOf(n))??null,Z=n=>{let l=f[n];if(l)return q[n]??V(l);if(e.names.has(n))return e.resolve(n)?n:null;let c=e.resolve(n);return c?V(e.tipOf(c.cid)):null};for(let n of i.tests??[]){for(let R of n.reuses??[])W.has(R)&&h.push({code:"REUSES_EVICTED",detail:`${n.temp_ref}: reuses '${R}' which was budget-evicted \u2014 drop the edge; the dependent gap names the missing @import`});let l=n.test_md_blob,c=n.definitionId,w=n.objectives_blob;if(s.finalizeTestBody){let R;try{R=s.finalizeTestBody({temp_ref:n.temp_ref,test_md_blob:n.test_md_blob,verifies:n.verifies,reuses:n.reuses??[]},Z)}catch(T){return ne([{code:"FINALIZE_BODY",detail:`${n.temp_ref}: ${T instanceof Error?T.message:String(T)}`}])}R&&(l=R.test_md_blob,c=R.definitionId,w=R.objectives_blob??w,F[n.temp_ref]=c)}let _={title:n.title,check:n.check,definitionId:c,derived:!0,...n.config?{config:n.config}:{},...l?{test_md_blob:l}:{},...w?{objectives_blob:w}:{},...n.surface_required!==void 0?{surface_required:n.surface_required}:{}},B=U(S.TEST,n.temp_ref,_,n.title);if(!B)continue;let Q=j(n.automates,`${n.temp_ref}.automates`,S.SCENARIO);Q&&M(E.AUTOMATES,B,Q,{},`${n.temp_ref}.automates`);for(let R of n.verifies){let T=j(R,`${n.temp_ref}.verifies`,S.AC);T&&M(E.VERIFIES,B,T,{},`${n.temp_ref}.verifies`)}for(let R of n.reuses??[]){if(W.has(R))continue;let T=j(R,`${n.temp_ref}.reuses`,S.TEST);T&&M(E.REUSES,B,T,{},`${n.temp_ref}.reuses`)}for(let R of n.verifies){let T=f[R]??e.resolve(R)?.cid;T&&(e.trust.get(T)??"derived")==="derived"&&!O.some(g=>g.cid===T)?P.push(`${n.temp_ref}: verifies ${R} which is still DERIVED (unapproved) \u2014 committed anyway; approve it in chat or via review`):T&&f[R]===T&&(i.acs??[]).some(g=>g.temp_ref===R)&&P.push(`${n.temp_ref}: verifies ${R} minted in this same record (unapproved) \u2014 committed anyway; approve it in chat`)}if(n.verifies.length>1){let R=n.check?.verified_against;P.push(`${n.temp_ref}: verifies ${n.verifies.length} ACs but machine-asserts only 1 (check.verified_against=${R!=null?String(R):"?"}) \u2014 the rest ride prose only`)}}let ce=[];{let n=(g,v)=>`${g??""}\0${ie(String(v??""))}`,l=(g,v)=>s.reason?`${s.reason} \u2014 evolve by ${a.id}${v?` (${v})`:""}`:g,c=new Map;for(let g of O){if(g.label!==S.SCENARIO&&g.label!==S.TEST)continue;let v=n(g.label,g.content.title);c.set(v,[...c.get(v)??[],g.cid])}let w=new Map;for(let g of r){if(A.has(g))continue;let v=n(e.nodeLabel.get(g),e.getNode(g)?.content.title);w.set(v,[...w.get(v)??[],g])}for(let[g,v]of w){let k=c.get(g)??[],G=v.length===1&&k.length===1;for(let z of v)G?(y.push({kind:"node",old:z,new:k[0],reason:l(`--force redesign of ${s.ucRef} by ${a.id} (title-matched successor)`,"title-matched successor"),by:a}),ce.push({old:z,next:k[0]})):y.push({kind:"node",old:z,new:null,reason:l(`--force redesign of ${s.ucRef} by ${a.id}`),by:a}),I.push(z)}let _=g=>e.edgesFrom(g).some(v=>v.type!==E.SCOPED_TO?!1:v.dst===x||e.tipOf(v.dst)===x?!0:e.nodeLabel.get(v.dst)===S.SCENARIO&&e.edgesFrom(v.dst).some(k=>k.type===E.BELONGS_TO&&e.tipOf(k.dst)===x)),B=new Map;for(let{cid:g,content:v}of e.byLabel(S.AC)){if(e.superseded.has(g)||!_(g))continue;let k=ie(String(v.text??""));B.set(k,[...B.get(k)??[],g])}let Q=new Map;for(let g of O){if(g.label!==S.AC)continue;let v=ie(String(g.content.text??""));Q.set(v,[...Q.get(v)??[],g.cid])}for(let[g,v]of B){let k=Q.get(g)??[];v.length!==1||k.length!==1||(y.push({kind:"node",old:v[0],new:k[0],reason:l(`AC re-emitted with changed content by ${a.id} (text-matched successor)`,"AC text-matched successor"),by:a}),ce.push({old:v[0],next:k[0]}),I.push(v[0]))}let R=new Set(I),T=new Set;for(let g of y)g.kind==="edge"&&T.add(g.ecid);for(let{old:g,next:v}of ce)for(let k of e.edgesInto(g))we(k.type)?.pin?.comparesTo!=="dst_tip"||e.superseded.has(k.src)||R.has(k.src)||T.has(k.ecid)||(y.push({kind:"edge",ecid:k.ecid,reason:`re-blessed onto ${v} (redirect successor of ${g}) by ${a.id}`,by:a}),T.add(k.ecid),m.some(z=>z.type===k.type&&z.src===k.src&&z.dst===v)||e.edgesFrom(k.src).some(z=>z.type===k.type&&z.dst===v))||k.type===E.AUTOMATES&&o.has(v)||M(k.type,k.src,v,k.props,`rebless ${k.type} from ${e.nameOf.get(k.src)??k.src}`)}return h.length>0?ne(h):O.length===0&&m.length===0&&y.length===0&&L.length===0?Object.keys(f).length>0?(P.push("everything in this phase is already current \u2014 nothing re-committed"),{record:null,errors:null,minted:f,logicalIds:q,superseded:[],warnings:P,finalizedTests:F,...s.force||s.forceScope?{forceScopeRemaining:u}:{}}):ne([{code:"EMPTY_DESIGN",detail:"finalize_design produced nothing to commit"}]):{record:$e(t,{ts:new Date().toISOString(),proposal_id:null,nodes:O,edges:m,review:[],supersessions:y,source_head_moves:{},...C.length>0?{names:C}:{},...(()=>{for(let n of i.judgements??[]){let l=n.target?f[n.target]??e.resolve(n.target)?.cid??x:x;L.push({about:l,rationale:`[${n.kind}] ${n.rationale}`,by:a})}return L.length>0?{judgements:L}:{}})(),design_of:{uc_cid:x,engine:d}}).record,errors:null,minted:f,logicalIds:q,superseded:I,warnings:P,finalizedTests:F,...s.force||s.forceScope?{forceScopeRemaining:u}:{}}}import{existsSync as st,mkdirSync as lt,readdirSync as ut,readFileSync as nt,renameSync as mt,writeFileSync as gt}from"fs";import{join as oe}from"path";var pt=/^@import\s+(\S+)\s*$/;function ft(s){return oe(s,".testmuai","tests")}function ht(s){let t=new Map;if(!st(s))return t;for(let e of ut(s)){if(!e.endsWith("_test.md"))continue;let i=oe(s,e);try{let a=le(nt(i,"utf8"))?.id;a&&t.set(a,[...t.get(a)??[],i])}catch{}}return t}function _t(s,t){let e=`${s}.tmp-mint`;gt(e,t),mt(e,s)}function it(s){let{graph:t,cids:e,cwd:i}=s,a=ft(i),d=[],D=[],N=ht(a),x=new Set,h=(m,y)=>{let C=N.get(m);if(C&&C.length>1)return D.push({id:m,reason:`two files claim assurance.id ${m}: ${C.join(" \xB7 ")} \u2014 resolve the duplicate first`}),null;if(x.has(m))return O(m);if(y.includes(m))return O(m)??`${m}_test.md`;let L=t.resolve(m),f=L?t.getNode(L.tip):void 0,q=f?.content.test_md_blob,F=f?.content.definitionId;if(!q||!F)return D.push({id:m,reason:`${m} has no test definition in the graph`}),null;let I=q.split(`
|
|
341
|
-
`).map(o=>{let r=
|
|
339
|
+
`;var lt=["presence","forbidden-presence","count","delta","state-transition","absolute","bound","propagation","latency","graded"];function Qe(s,t){for(let e of s)if(!lt.includes(e))throw new Error(`${t}: emits '${e}' is not an oracle kind`)}function Ve(s,t){let e=de(s);if(!e||!Array.isArray(e.techniques))throw new Error(`${t}: expected { techniques: [...] }`);for(let i of e.techniques){if(!i.id||!i.name||!i.applies_hint||!Array.isArray(i.emits))throw new Error(`${t}: technique '${i?.id??"?"}' missing id/name/applies_hint/emits`);Qe(i.emits,`${t}: technique '${i.id}'`)}return e.techniques}function Ye(s,t){let e=de(s);if(!e||!e.id||!e.name||!e.applies_when||!Array.isArray(e.candidate_checks))throw new Error(`${t}: profile missing id/name/applies_when/candidate_checks`);for(let i of e.candidate_checks){if(!i.id||!i.family||!i.measurable_example||!i.emits)throw new Error(`${t}: candidate_check '${i?.id??"?"}' missing id/family/measurable_example/emits`);Qe([i.emits],`${t}: check '${i.id}'`)}return e}function Ke(s){let t=new Map(Ve(ze,"packaged techniques").map(i=>[i.id,i])),e=te(s,"design","techniques.yaml");if(ge(e))for(let i of Ve(pe(e,"utf8"),e))t.set(i.id,i);return[...t.values()]}function Je(s){let t=new Map(Object.entries(He).map(([i,a])=>[i,Ye(a,`packaged profile '${i}'`)])),e=te(s,"design","profiles");if(ge(e))for(let i of dt(e).filter(a=>a.endsWith(".yaml")||a.endsWith(".yml")).sort()){let a=Ye(pe(te(e,i),"utf8"),te(e,i));t.set(a.id,a)}return[...t.values()]}function Xe(s){let t=te(s,"design","runner-grammar.yaml");return ge(t)?pe(t,"utf8"):We}function se(s,t){return!s.superseded.has(t)}function fe(s,t,e){return{cid:t,logical_id:s.nameOf.get(t)??null,content:e}}async function Ze(s,t,e,i,a){let d=await Te(s,"search_similar",{text:t,label:e,k:i},a);return d.ok&&Array.isArray(d.result)?d.result:[]}async function et(s,t,e={}){let i=Y(s),a=i.resolve(t);if(!a)throw new Error(`assembleDesignContext: unknown use-case '${t}' (run designGate first)`);let d=a.tip,D=i.getNode(d);if(!D||D.label!==S.USECASE)throw new Error(`assembleDesignContext: '${t}' is not a use-case (run designGate first)`);let N=i.derivesInto(d).map(b=>({source_id:b.props.source_id??null,anchor:b.props.anchor??null})),x=[],h=new Set;for(let{cid:b,content:p}of i.byLabel(S.SCENARIO))se(i,b)&&i.edgesFrom(b).some(o=>o.type===E.BELONGS_TO&&o.dst===d)&&(x.push(fe(i,b,p)),h.add(b));let O=[];for(let{cid:b,content:p}of i.byLabel(S.AC)){if(!se(i,b))continue;let o=i.edgesFrom(b).find(r=>r.type===E.SCOPED_TO);!o||o.dst!==d&&!h.has(o.dst)||O.push({...fe(i,b,p),scoped_to:o.dst})}let m=Array.isArray(D.content.criteria)?D.content.criteria:[],y=[D.content.title,D.content.description,...m].filter(Boolean).join(`
|
|
340
|
+
`),C=(await Ze(i,y,S.SCENARIO,10,e.embedSearch)).filter(b=>!h.has(b.cid)),B=[],f=new Set,q=[],F=[d],P=new Set([d]);for(;F.length>0;){let b=F.shift();for(let p of i.edgesFrom(b)){if(p.type!==E.DEPENDS_ON||i.nodeLabel.get(p.dst)!==S.USECASE)continue;let o=i.tipOf(p.dst);P.has(o)||(P.add(o),q.push(o),F.push(o))}}for(let b of q){let p=`depends_on ${i.nameOf.get(b)??b.slice(0,19)}`;for(let{cid:o}of i.byLabel(S.SCENARIO))if(se(i,o)&&i.edgesFrom(o).some(r=>r.type===E.BELONGS_TO&&r.dst===b))for(let r of i.edgesInto(o)){if(r.type!==E.AUTOMATES||!se(i,r.src)||f.has(r.src))continue;f.add(r.src);let u=String(i.getNode(r.src)?.content.title??"");B.push({cid:r.src,logical_id:i.nameOf.get(r.src)??null,title:u,via:p})}}for(let b of await Ze(i,y,S.TEST,5,e.embedSearch)){let{cid:p,title:o}=b;f.has(p)||(f.add(p),B.push({cid:p,logical_id:i.nameOf.get(p)??null,title:o??"",via:"similar"}))}let I=i.byLabel(S.STYLENOTE).filter(b=>se(i,b.cid)).sort((b,p)=>b.cid<p.cid?-1:1).slice(0,5).map(b=>`${String(b.content.statement)} [${String(b.content.learned_from_kind)}]`);return{usecase:fe(i,d,D.content),cites:N,committed_acs:O,existing:{scenarios:x,reuse_candidates:C},import_candidates:B,style_notes:I,techniques:Ke(s),profiles:Je(s),runner_grammar:Xe(s),budget:{...e.max!=null?{max_pairs:e.max}:{},...e.strength!=null?{strength_override:e.strength}:{}},design_of:(()=>{let b=Me(i,d);return b?{engine:b.engine,seq:b.seq}:null})()}}function tt(s){let t=e=>{if(Array.isArray(e))return e.map(t);if(e!==null&&typeof e=="object"){let i={};for(let a of Object.keys(e).sort())i[a]=t(e[a]);return i}return e};return JSON.stringify(t(s),null,1)}var ne=s=>({record:null,errors:s,minted:{},logicalIds:{},superseded:[],warnings:[],finalizedTests:{}});function ie(s){return s.toLowerCase().trim().replace(/\s+/g," ")}function he(s,t){let e=s.resolve(t);if(!e||s.nodeLabel.get(e.cid)!==S.USECASE||e.superseded)return[];let i=new Set;for(let{cid:a}of s.byLabel(S.SCENARIO))if(!s.superseded.has(a)&&s.edgesFrom(a).some(d=>d.type===E.BELONGS_TO&&s.tipOf(d.dst)===e.cid)){i.add(a);for(let d of s.edgesInto(a))d.type!==E.AUTOMATES||s.superseded.has(d.src)||i.add(d.src)}return[...i]}function st(s){let{contextDir:t,graph:e,sections:i,by:a}=s,d=s.engine??"design@1",D=$e(t);if(e.latestHash!==D)return ne([{code:"STALE_BASIS",detail:`graph opened at ${String(e.latestHash)} but chain head is ${String(D)} \u2014 re-open and retry`}]);let N=e.resolve(s.ucRef);if(!N||e.nodeLabel.get(N.cid)!==S.USECASE||N.superseded)return ne([{code:"UNKNOWN_UC",detail:`${s.ucRef} is not a live use-case`}]);let x=N.cid,h=[],O=[],m=[],y=[],C=[],B=[],f={},q={},F={},P=[],I=[],b=new Set,p=[],o=new Set,r=new Set,u=[];{let n=s.forceScope??(s.force?he(e,s.ucRef):[]),l=new Set;s.sections.scenarios?.length&&l.add(S.SCENARIO),s.sections.tests?.length&&l.add(S.TEST);for(let c of n)e.superseded.has(c)||(l.has(e.nodeLabel.get(c)??"")?r.add(c):u.push(c))}let A=new Set,$=n=>!e.superseded.has(n)&&(!r.has(n)||A.has(n)),j=(n,l,c)=>{if(f[n])return f[n];let w=e.resolve(n),_=w?$(w.cid)?w.cid:e.tipOf(w.cid):null;return!w||!_||!$(_)?(h.push({code:"UNKNOWN_REF",detail:`${l}: '${n}' is neither in this payload nor a live committed node`}),null):c&&e.nodeLabel.get(_)!==c?(h.push({code:"ILLEGAL_EDGE",detail:`${l}: '${n}' is a ${e.nodeLabel.get(_)}, expected ${c}`}),null):_},H=(n,l,c,w)=>{if(e.nameOf.has(l)){q[w]=e.nameOf.get(l);return}let _=Re(n,c,L=>b.has(L)||e.names.has(L)&&!e.superseded.has(e.names.get(L)));_!==null&&(b.add(_),C.push({cid:l,slug:_,by:a}),q[w]=_)},U=(n,l,c,w)=>{for(let L of we(n,c))h.push({code:L.code,detail:`${l}: ${L.detail}`});let _=xe(n,c);return e.hasNode(_)&&!e.superseded.has(_)?(r.has(_)&&A.add(_),f[l]=_,_):(O.push({cid:_,label:n,content:c}),f[l]=_,H(n,_,w,l),_)},M=(n,l,c,w,_)=>{let L=ue(n,l,c,w);if(e.edgesFrom(l).some(g=>g.ecid===L&&!e.superseded.has(g.ecid))){n===E.AUTOMATES&&o.add(c);return}let Q=e.nodeLabel.get(l)??O.find(g=>g.cid===l)?.label??"(unknown)",R=e.nodeLabel.get(c)??O.find(g=>g.cid===c)?.label??"(unknown)";for(let g of ke(n,Q,R,w))h.push({code:g.code,detail:`${_}: ${g.detail}`});let T=De(e,n,l,c,p);if(T){h.push({code:T.code,detail:`${_}: ${T.detail}`});return}if(n===E.AUTOMATES){if(o.has(c)){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: two automates onto ${c} in one record (strict 1:1)`});return}if(o.add(c),!r.has(c)||A.has(c)){let g=G=>r.has(G)&&!A.has(G);if(e.edgesFrom(l).some(G=>G.type===E.AUTOMATES&&G.dst!==c&&!e.superseded.has(G.dst)&&!g(G.dst))&&e.hasNode(l)){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: automates from ${l} already has a live edge \u2014 supersede it first`});return}if(e.edgesInto(c).some(G=>G.type===E.AUTOMATES&&G.src!==l&&!e.superseded.has(G.src)&&!g(G.src))){h.push({code:"CARDINALITY_VIOLATION",detail:`${_}: automates onto ${c} already has a live edge \u2014 strict 1:1, supersede it first`});return}}}m.push({ecid:ue(n,l,c,w),type:n,src:l,dst:c,props:w}),p.push({src:l,dst:c,type:n})},W=new Set;for(let n of i.gaps??[]){let l=n.temp_ref??n.ref??"gap",c=n.question;if(!c||typeof c!="object"||!c.header||!Array.isArray(c.options)||c.options.length===0||!Number.isInteger(c.recommended_index)){h.push({code:"GAP_QUESTION_INCOMPLETE",detail:`${l}: design gaps carry a full ranked question object (header/options/recommended_index)`});continue}n.kind==="budget-evicted"&&n.ref&&W.add(n.ref);let w={kind:n.kind,question:c,derived:!0,uc:x,...n.risk?{risk:n.risk}:{},...n.risk_rationale?{risk_rationale:n.risk_rationale}:{},...n.text?{text:n.text}:{},...n.ref?{ref:n.ref}:{}};U(S.GAP,l,w,String(c.header))}let K=new Map;for(let{cid:n,content:l}of e.byLabel(S.SCENARIO))$(n)&&e.edgesFrom(n).some(c=>c.type===E.BELONGS_TO&&e.tipOf(c.dst)===x)&&K.set(ie(String(l.title??"")),n);for(let n of i.scenarios??[]){let l=K.get(ie(n.title));if(l){h.push({code:"DUPLICATE_SCENARIO",detail:`${n.temp_ref}: '${n.title}' duplicates live scenario ${e.nameOf.get(l)??l} \u2014 exercise/link it instead (reuse before minting)`});continue}let c={title:n.title,intent:n.intent,case_type:n.case_type,derived:!0,...n.technique_notes?{technique_notes:n.technique_notes}:{},...n.description?{description:n.description}:{},...n.parameters?{parameters:n.parameters}:{},...n.tags?{tags:n.tags}:{}};U(S.SCENARIO,n.temp_ref,c,n.title)}for(let n of i.scenarios??[]){let l=f[n.temp_ref];if(l){M(E.BELONGS_TO,l,x,{},n.temp_ref);for(let c of n.depends_on??[]){let w=j(c,`${n.temp_ref}.depends_on`,S.SCENARIO);w&&M(E.DEPENDS_ON,l,w,{},`${n.temp_ref}.depends_on`)}}}for(let n of i.acs??[]){let l={text:n.text,kind:n.kind,risk:n.risk,derived:!0,...n.expected_answer?{expected_answer:n.expected_answer}:{},...n.measurable!==void 0?{measurable:n.measurable}:{}},c=U(S.AC,n.temp_ref,l,n.text);if(!c)continue;let w=n.scope?.type==="scenario"&&n.scope.ref?j(n.scope.ref,`${n.temp_ref}.scope`,S.SCENARIO):x;w&&!e.edgesFrom(c).some(_=>_.type===E.SCOPED_TO&&!e.superseded.has(_.ecid))&&M(E.SCOPED_TO,c,w,{},`${n.temp_ref}.scope`);for(let _ of n.cites??[]){let L={source_id:_.source_id,source_cid:_.source_cid,anchor:_.anchor,..._.quote?{quote:_.quote}:{}};M(E.DERIVES,_.source_cid,c,L,`${n.temp_ref}.cite`)}}for(let n of i.exercises??[]){let l=j(n.scenario,"exercises.scenario",S.SCENARIO),c=j(n.ac,"exercises.ac",S.AC);l&&c&&M(E.EXERCISES,l,c,{},`exercises ${n.scenario}\u2192${n.ac}`)}for(let n of i.scoped_to_repoints??[]){let l=j(n.ac,"scoped_to_repoints.ac",S.AC),c=j(n.to,"scoped_to_repoints.to");if(!l||!c)continue;let w=e.edgesFrom(l).find(_=>_.type===E.SCOPED_TO&&!e.superseded.has(_.ecid));w&&y.push({kind:"edge",ecid:w.ecid,reason:`re-scoped to ${n.to} by ${a.id}`,by:a}),M(E.SCOPED_TO,l,c,{},`scoped_to_repoints ${n.ac}`)}let X=new Map;if(s.finalizeTestBody)for(let[n,l]of e.nameOf)X.set(e.tipOf(n),l);let V=n=>e.nameOf.get(n)??X.get(e.tipOf(n))??null,Z=n=>{let l=f[n];if(l)return q[n]??V(l);if(e.names.has(n))return e.resolve(n)?n:null;let c=e.resolve(n);return c?V(e.tipOf(c.cid)):null};for(let n of i.tests??[]){for(let R of n.reuses??[])W.has(R)&&h.push({code:"REUSES_EVICTED",detail:`${n.temp_ref}: reuses '${R}' which was budget-evicted \u2014 drop the edge; the dependent gap names the missing @import`});let l=n.test_md_blob,c=n.definitionId,w=n.objectives_blob;if(s.finalizeTestBody){let R;try{R=s.finalizeTestBody({temp_ref:n.temp_ref,test_md_blob:n.test_md_blob,verifies:n.verifies,reuses:n.reuses??[]},Z)}catch(T){return ne([{code:"FINALIZE_BODY",detail:`${n.temp_ref}: ${T instanceof Error?T.message:String(T)}`}])}R&&(l=R.test_md_blob,c=R.definitionId,w=R.objectives_blob??w,F[n.temp_ref]=c)}let _={title:n.title,check:n.check,definitionId:c,derived:!0,...n.config?{config:n.config}:{},...l?{test_md_blob:l}:{},...w?{objectives_blob:w}:{},...n.surface_required!==void 0?{surface_required:n.surface_required}:{}},L=U(S.TEST,n.temp_ref,_,n.title);if(!L)continue;let Q=j(n.automates,`${n.temp_ref}.automates`,S.SCENARIO);Q&&M(E.AUTOMATES,L,Q,{},`${n.temp_ref}.automates`);for(let R of n.verifies){let T=j(R,`${n.temp_ref}.verifies`,S.AC);T&&M(E.VERIFIES,L,T,{},`${n.temp_ref}.verifies`)}for(let R of n.reuses??[]){if(W.has(R))continue;let T=j(R,`${n.temp_ref}.reuses`,S.TEST);T&&M(E.REUSES,L,T,{},`${n.temp_ref}.reuses`)}for(let R of n.verifies){let T=f[R]??e.resolve(R)?.cid;T&&(e.trust.get(T)??"derived")==="derived"&&!O.some(g=>g.cid===T)?P.push(`${n.temp_ref}: verifies ${R} which is still DERIVED (unapproved) \u2014 committed anyway; approve it in chat or via review`):T&&f[R]===T&&(i.acs??[]).some(g=>g.temp_ref===R)&&P.push(`${n.temp_ref}: verifies ${R} minted in this same record (unapproved) \u2014 committed anyway; approve it in chat`)}if(n.verifies.length>1){let R=n.check?.verified_against;P.push(`${n.temp_ref}: verifies ${n.verifies.length} ACs but machine-asserts only 1 (check.verified_against=${R!=null?String(R):"?"}) \u2014 the rest ride prose only`)}}let ce=[];{let n=(g,v)=>`${g??""}\0${ie(String(v??""))}`,l=(g,v)=>s.reason?`${s.reason} \u2014 evolve by ${a.id}${v?` (${v})`:""}`:g,c=new Map;for(let g of O){if(g.label!==S.SCENARIO&&g.label!==S.TEST)continue;let v=n(g.label,g.content.title);c.set(v,[...c.get(v)??[],g.cid])}let w=new Map;for(let g of r){if(A.has(g))continue;let v=n(e.nodeLabel.get(g),e.getNode(g)?.content.title);w.set(v,[...w.get(v)??[],g])}for(let[g,v]of w){let k=c.get(g)??[],G=v.length===1&&k.length===1;for(let z of v)G?(y.push({kind:"node",old:z,new:k[0],reason:l(`--force redesign of ${s.ucRef} by ${a.id} (title-matched successor)`,"title-matched successor"),by:a}),ce.push({old:z,next:k[0]})):y.push({kind:"node",old:z,new:null,reason:l(`--force redesign of ${s.ucRef} by ${a.id}`),by:a}),I.push(z)}let _=g=>e.edgesFrom(g).some(v=>v.type!==E.SCOPED_TO?!1:v.dst===x||e.tipOf(v.dst)===x?!0:e.nodeLabel.get(v.dst)===S.SCENARIO&&e.edgesFrom(v.dst).some(k=>k.type===E.BELONGS_TO&&e.tipOf(k.dst)===x)),L=new Map;for(let{cid:g,content:v}of e.byLabel(S.AC)){if(e.superseded.has(g)||!_(g))continue;let k=ie(String(v.text??""));L.set(k,[...L.get(k)??[],g])}let Q=new Map;for(let g of O){if(g.label!==S.AC)continue;let v=ie(String(g.content.text??""));Q.set(v,[...Q.get(v)??[],g.cid])}for(let[g,v]of L){let k=Q.get(g)??[];v.length!==1||k.length!==1||(y.push({kind:"node",old:v[0],new:k[0],reason:l(`AC re-emitted with changed content by ${a.id} (text-matched successor)`,"AC text-matched successor"),by:a}),ce.push({old:v[0],next:k[0]}),I.push(v[0]))}let R=new Set(I),T=new Set;for(let g of y)g.kind==="edge"&&T.add(g.ecid);for(let{old:g,next:v}of ce)for(let k of e.edgesInto(g))Se(k.type)?.pin?.comparesTo!=="dst_tip"||e.superseded.has(k.src)||R.has(k.src)||T.has(k.ecid)||(y.push({kind:"edge",ecid:k.ecid,reason:`re-blessed onto ${v} (redirect successor of ${g}) by ${a.id}`,by:a}),T.add(k.ecid),m.some(z=>z.type===k.type&&z.src===k.src&&z.dst===v)||e.edgesFrom(k.src).some(z=>z.type===k.type&&z.dst===v))||k.type===E.AUTOMATES&&o.has(v)||M(k.type,k.src,v,k.props,`rebless ${k.type} from ${e.nameOf.get(k.src)??k.src}`)}return h.length>0?ne(h):O.length===0&&m.length===0&&y.length===0&&B.length===0?Object.keys(f).length>0?(P.push("everything in this phase is already current \u2014 nothing re-committed"),{record:null,errors:null,minted:f,logicalIds:q,superseded:[],warnings:P,finalizedTests:F,...s.force||s.forceScope?{forceScopeRemaining:u}:{}}):ne([{code:"EMPTY_DESIGN",detail:"finalize_design produced nothing to commit"}]):{record:Ee(t,{ts:new Date().toISOString(),proposal_id:null,nodes:O,edges:m,review:[],supersessions:y,source_head_moves:{},...C.length>0?{names:C}:{},...(()=>{for(let n of i.judgements??[]){let l=n.target?f[n.target]??e.resolve(n.target)?.cid??x:x;B.push({about:l,rationale:`[${n.kind}] ${n.rationale}`,by:a})}return B.length>0?{judgements:B}:{}})(),design_of:{uc_cid:x,engine:d}}).record,errors:null,minted:f,logicalIds:q,superseded:I,warnings:P,finalizedTests:F,...s.force||s.forceScope?{forceScopeRemaining:u}:{}}}import{existsSync as nt,mkdirSync as ut,readdirSync as mt,readFileSync as it,renameSync as gt,writeFileSync as pt}from"fs";import{join as oe}from"path";var ft=/^@import\s+(\S+)\s*$/;function ht(s){return oe(s,".testmuai","tests")}function _t(s){let t=new Map;if(!nt(s))return t;for(let e of mt(s)){if(!e.endsWith("_test.md"))continue;let i=oe(s,e);try{let a=le(it(i,"utf8"))?.id;a&&t.set(a,[...t.get(a)??[],i])}catch{}}return t}function bt(s,t){let e=`${s}.tmp-mint`;pt(e,t),gt(e,s)}function rt(s){let{graph:t,cids:e,cwd:i}=s,a=ht(i),d=[],D=[],N=_t(a),x=new Set,h=(m,y)=>{let C=N.get(m);if(C&&C.length>1)return D.push({id:m,reason:`two files claim assurance.id ${m}: ${C.join(" \xB7 ")} \u2014 resolve the duplicate first`}),null;if(x.has(m))return O(m);if(y.includes(m))return O(m)??`${m}_test.md`;let B=t.resolve(m),f=B?t.getNode(B.tip):void 0,q=f?.content.test_md_blob,F=f?.content.definitionId;if(!q||!F)return D.push({id:m,reason:`${m} has no test definition in the graph`}),null;let I=q.split(`
|
|
341
|
+
`).map(o=>{let r=ft.exec(o.trim());if(!r)return o;let u=r[1];if(!t.resolve(u))return o;let A=h(u,[...y,m]);if(!A)throw new ae(`dependency ${u} could not be minted/located`);return`@import ./${A}`}).join(`
|
|
342
342
|
`),b=`---
|
|
343
343
|
assurance:
|
|
344
344
|
id: ${m}
|
|
@@ -346,11 +346,11 @@ assurance:
|
|
|
346
346
|
---
|
|
347
347
|
${I.endsWith(`
|
|
348
348
|
`)?I:I+`
|
|
349
|
-
`}`,p=C?.[0];if(p){let o=
|
|
349
|
+
`}`,p=C?.[0];if(p){let o=it(p,"utf8"),r=le(o)?.base,u=ee(J(o,ve(a,t)));if(!r||u!==r)return D.push({id:m,reason:`${p} was edited since the engine last wrote it \u2014 keeping yours (reconcile via a run or maintain)`}),null}else{let o=oe(a,`${m}_test.md`);for(let r=2;nt(o);r++)o=oe(a,`${m}-${r}_test.md`);p=o}return ut(a,{recursive:!0}),bt(p,b),x.add(m),N.set(m,[p]),d.push({id:m,path:p}),p.split("/").pop()},O=m=>N.get(m)?.[0]?.split("/").pop()??null;for(let m of e){let y=t.nameOf.get(m);if(!y){D.push({id:m,reason:"minted test has no logical id"});continue}try{h(y,[])}catch(C){if(C instanceof ae)D.push({id:y,reason:C.message});else throw C}}return{wrote:d,refused:D}}var ae=class extends Error{};import{basename as yt,dirname as vt,resolve as wt}from"path";var St=new Set(["narrative","acs","scenarios","tests","exercises","gaps","scoped_to_repoints","judgements","phase"]);function kt(s){let t=/strength=(\d+)\s*(?:—|-)?\s*(.*)/.exec(s??"");return t?{strength:Number(t[1]),reason:t[2]||s||""}:{strength:2,reason:s??""}}function xt(s,t,e=new Set,i=0){return J(t,re(s),e,i)}function $t(s,t,e,i){let a=t.scenarios?.find(m=>m.temp_ref===e.automates)??(()=>{let m=s.resolve(e.automates),y=m?s.getNode(m.tip)?.content:void 0;return y?{title:String(y.title??""),intent:String(y.intent??""),technique_notes:String(y.technique_notes??"")}:{}})(),d=[...(t.acs??[]).map(m=>({ref:m.temp_ref,text:m.text})),...e.verifies.filter(m=>!(t.acs??[]).some(y=>y.temp_ref===m)).map(m=>{let y=s.resolve(m);return{ref:m,text:y?String(s.getNode(y.tip)?.content.text??""):""}})],{test_md:D,objectives_yaml:N}=ye({title:e.title,steps:e.steps,check:e.check,check_prose:e.check_prose,reuses:e.reuses},{title:a.title,intent:a.intent},d),x=ee(xt(s,D)),h=e.check,O={technique:a.technique_notes??"",profile_family:t.judgements?.find(m=>m.kind==="profile_family"&&(m.target===e.temp_ref||m.target===e.automates))?.rationale??"unspecified",anchor:h.verified_against,expected_how:t.judgements?.find(m=>m.kind==="expected_how"&&m.target===h.verified_against)?.rationale??`expected_mode: ${h.expected_mode??"inferred"}`,combinatorial:kt(a.technique_notes),surface_state:"absent",deferred_bindings:h.expected_mode==="runtime-derived"?1:0};return i.push({definitionId:x,rationale:O,anchorRef:h.verified_against,tempRef:e.temp_ref}),{temp_ref:e.temp_ref,title:e.title,automates:e.automates,verifies:e.verifies,check:e.check,definitionId:x,test_md_blob:D,objectives_blob:N,...e.reuses?.length?{reuses:e.reuses}:{},...e.surface_required!==void 0?{surface_required:e.surface_required}:{}}}function ot(s){let t=0,e=s.forceScope??null;return{terminalEventType:"design",async onProposalEvent(i){let a=r=>s.steer?(s.steer(`[auto-repair] ${r} \u2014 please re-finalize with this fixed.`),{proposal:null,error:null}):{proposal:null,error:r};if(i==null||typeof i!="object")return a("finalize_design payload is not an object");let d=i,D=Object.keys(d).filter(r=>!St.has(r));if(D.length>0)return a(`finalize_design carries ungated/unknown section(s): ${D.join(", ")} \u2014 mintable here: acs, scenarios, tests (+gaps)`);let N=new Map;for(let r of d.tests??[]){let u=N.get(r.automates);if(u)return a(`strict 1:1 violated in-payload: ${u} and ${r.temp_ref} both automate ${r.automates}`);N.set(r.automates,r.temp_ref)}let x=Y(s.contextDir);s.force&&!s.resuming&&t===0&&e===null&&(e=he(x,s.ucRef));let h=x.resolve(s.ucRef),O=h?String(x.getNode(h.tip)?.content.risk??"med"):"med",m=[],y=new Set([s.ucRef,h?.cid,h?.tip].filter(Boolean)),C=r=>{if(y.has(r))return!0;let u=x.resolve(r);return u!=null&&(y.has(u.cid)||y.has(u.tip))},B;try{B={...d.acs?.length?{acs:d.acs.map(r=>({temp_ref:r.temp_ref,text:r.text,kind:r.kind,risk:r.risk??O,...r.expected_answer?{expected_answer:r.expected_answer}:{},...r.scoped_to&&!C(r.scoped_to)?{scope:{type:"scenario",ref:r.scoped_to}}:{}}))}:{},...d.scenarios?.length?{scenarios:d.scenarios}:{},...d.tests?.length?{tests:d.tests.map(r=>$t(x,d,r,m))}:{},...d.exercises?.length?{exercises:d.exercises}:{},...d.gaps?.length?{gaps:d.gaps}:{},...d.scoped_to_repoints?.length?{scoped_to_repoints:d.scoped_to_repoints}:{},...d.judgements?.length?{judgements:d.judgements}:{}}}catch(r){return a(r instanceof Error?r.message:String(r))}let f=st({contextDir:s.contextDir,graph:x,ucRef:s.ucRef,sections:B,by:s.by,...s.engine?{engine:s.engine}:{},...e?.length?{forceScope:e}:{},...s.because?{reason:s.because}:{},finalizeTestBody:(()=>{let r=new Map((B.tests??[]).map($=>[$.temp_ref,$])),u=new Map,A=($,j,H)=>{let U=r.get($);if(!U?.test_md_blob)return null;let M=u.get($);if(M!==void 0)return M;if(H.has($))return U.test_md_blob;H.add($);let W=new Map;for(let V of U.reuses??[]){A(V,j,H);let Z=j(V);Z!==null&&Z!==V&&W.set(V,Z)}let K=U.verifies.map(j).filter(V=>V!==null),X=_e(be(U.test_md_blob,W),K);return u.set($,X),X};return($,j)=>{if(!$.test_md_blob)return null;let H=A($.temp_ref,j,new Set)??$.test_md_blob;if(H===$.test_md_blob)return null;let U=M=>{for(let W of r.keys())if(j(W)===M){let K=A(W,j,new Set);if(K!==null)return{body:K,cycleKey:`batch:${M}`,next:U}}return re(x)(M)};return{test_md_blob:H,definitionId:ee(J(H,U))}}})()});if(f.errors)return a("design commit failed: "+f.errors.map(r=>`${r.code}: ${r.detail}`).join("; "));let q=f.warnings.filter(r=>r.includes("\u2014 committed anyway; approve"));for(let r of f.warnings)(!q.includes(r)||q.length===1)&&s.note(`warning: ${r}`);q.length>1&&s.note(`warning: ${q.length} verifies edges target not-yet-approved items \u2014 committed anyway; approve them in chat or via review`);let F=(r,u)=>r?`${r} ${u}${r>1?"s":""}`:null,P=[F(d.acs?.length,"AC"),F(d.scenarios?.length,"scenario"),F(d.tests?.length,"test"),F(d.gaps?.length,"gap")].filter(Boolean);{let r=`saved ${P.join(" \xB7 ")||"judgements/wiring"} as drafts`;(s.commitLine??s.note)(r)}s.aliases?.(Object.entries(f.minted).map(([r,u])=>({ref:r,cid:u})));let I=Y(s.contextDir);s.onCommitted?.(I);for(let r of m){let u=f.logicalIds[r.anchorRef]??f.minted[r.anchorRef];Ue(s.contextDir,f.finalizedTests[r.tempRef]??r.definitionId,{...r.rationale,anchor:u??r.rationale.anchor})}try{let r=Object.values(f.minted).filter(u=>I.getNode(u)?.label==="test");if(r.length>0){let u=vt(wt(s.contextDir)),A=rt({graph:I,cids:r,cwd:u});A.wrote.length>0&&s.note(`\u2692 wrote ${A.wrote.map($=>yt($.path)).join(" \xB7 ")}`);for(let $ of A.refused)s.note(`warning: mint refused ${$.id} \u2014 ${$.reason}`)}}catch(r){s.note(`warning: file mint failed (${r instanceof Error?r.message:String(r)}) \u2014 the design commit stands`)}s.event?.({type:"commit",acs:d.acs?.length??0,scenarios:d.scenarios?.length??0,tests:d.tests?.length??0,gaps:d.gaps?.length??0,warnings:f.warnings.length,minted:Object.entries(f.minted).map(([r,u])=>({temp_ref:r,cid:u,...f.logicalIds[r]?{logical_id:f.logicalIds[r]}:{}}))}),t+=1,e!==null&&(e=f.forceScopeRemaining??e,s.onForceScope?.(e));let b=Ae({verb:"design",commitN:t,ucRef:s.ucRef,phase:d.phase??(d.tests?.length?"tests":d.scenarios?.length?"scenarios":d.acs?.length?"acs":"design"),committed:Object.entries(f.minted).map(([r,u])=>({temp_ref:r,cid:u,...f.logicalIds[r]?{logical_id:f.logicalIds[r]}:{}})),warnings:f.warnings},I),p=b.event.parity?.missing??[],o=!!d.tests?.length&&p.length===0;return{proposal:f,error:null,receipt:b,...o?{sessionComplete:o}:{}}}}}function at(s,t){return{type:"run_config",version:1,session_id:t.session_id,mode:t.mode,source:{source_id:`design:${s.usecase.logical_id??t.ucCid.slice(0,19)}`,source_cid:t.ucCid,kind:"design_context",numbered_text:tt({...s,session_mode:t.mode})},existing_use_cases:[],read_basis:t.readBasis,max_free_text_rounds:2,graph_reads:!0,verb:"design",chat:!0,design_budget:s.budget,topology:t.topology}}function Ct(s,t){return{terminalEventType:"design",async onProposalEvent(e){let i=e??{},a=["acs","scenarios","tests","gaps"].map(d=>i[d]?.length?`${i[d].length} ${d}`:null).filter(Boolean).join(" \xB7 ");return s(`plan: finalize_design \u2014 ${a||"wiring/judgements only"} (nothing committed)`),s(JSON.stringify(i,null,2)),t?.({type:"plan",payload:i}),{proposal:i,error:null}}}}async function Ts(s,t){let e=Y(t.contextDir),i=null,a=s.useCase;if(s.resume){try{let u=Pe(t.contextDir,s.resume,e);i=u.handle,u.staleBasis.length>0&&(t.out(`note: sources changed since the pause: ${u.staleBasis.join(", ")} \u2014 the design continues against the current versions`),t.emit?.({type:"stale_basis",sources:u.staleBasis}))}catch(u){if(u instanceof qe)return t.out(`error: ${u.message}`),t.emit?.({type:"error",message:`error: ${u.message}`}),u.code==="SESSION_MISSING"||u.code==="SESSION_EXPIRED"?2:1;throw u}let o=i.state;if(o.verb&&o.verb!=="design")return t.out(`error: session ${s.resume} is a ${o.verb} session \u2014 resume it with kane-cli context extract --resume ${s.resume}`),t.emit?.({type:"error",message:`error: session ${s.resume} is a ${o.verb} session \u2014 resume it with kane-cli context extract --resume ${s.resume}`}),i.release(),2;if(a=a??o.use_case,o.uc_tip&&a){let u=e.resolve(a)?.tip;u&&u!==o.uc_tip&&(t.out("note: the use-case changed since the pause \u2014 the design continues against the new version"),t.emit?.({type:"stale_basis",usecase:a}))}let r=i.state.held_receipts??[];if(r.length>0)if(t.chat?.holdReceipt)for(let u of r)t.chat.holdReceipt(u);else t={...t,initialMessage:[r.join(`
|
|
350
350
|
|
|
351
351
|
`),t.initialMessage].filter(Boolean).join(`
|
|
352
352
|
|
|
353
|
-
`)};if(!a)return t.out(`error: session ${s.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`),t.emit?.({type:"error",message:`error: session ${s.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`}),i.release(),2}let d=!!(s.force||i?.state.force),D=!!(s.resume&&i),N=
|
|
353
|
+
`)};if(!a)return t.out(`error: session ${s.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`),t.emit?.({type:"error",message:`error: session ${s.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`}),i.release(),2}let d=!!(s.force||i?.state.force),D=!!(s.resume&&i),N=Ge(e,a,d||D);if(!N.ok)return t.out(`design: ${N.message}`),t.emit?.({type:"gate_refused",message:N.message}),i?.release(),N.code;if(t.preflightTurn){let o=await t.preflightTurn();if(!o.ok)return t.out(o.message??"error: turn-endpoint preflight failed"),t.emit?.({type:"error",message:o.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),i?.release(),2}let x={contextDir:t.contextDir,resolveAlias:o=>Oe(o,{env:process.env,auth:t.auth}),embed:(o,r)=>Ie(o,r,{env:process.env,auth:t.auth})};t.chat?.setWorking?.("assembling context\u2026");let h=await et(t.contextDir,a,{max:s.max,strength:s.strength,embedSearch:x});s.priorDesign!==void 0&&(h.prior_design=s.priorDesign),s.changeDelta!==void 0&&(h.change_delta=s.changeDelta),s.because&&(h.because=s.because);let O=t.now?.()??new Date,m=`${O.toISOString().replace(/[-:]/g,"").slice(0,15)}-${Dt(2).toString("hex")}`,y=s.mode??"interactive",C=at(h,{session_id:s.resume??`design-${m}`,mode:y,ucCid:h.usecase.cid,readBasis:e.latestHash,topology:Le("design")});s.plan?C.chat=!1:C.chat=!0,s.resume&&i&&(C.resume={agent_state:i.state.agent_state},t.out(`resuming design session ${s.resume}`),i.state.assumed.length>0&&t.out(`note: ${i.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${s.resume} lists them`),s.message&&(t={...t,initialMessage:[t.initialMessage,s.message].filter(Boolean).join(`
|
|
354
354
|
|
|
355
|
-
`)}));let
|
|
356
|
-
`)}catch{}},F=null,P={current:e};t.chat?.attachOnCommitted?.(o=>{P.current=o});let I="";if(t.chat&&!s.plan){let o=
|
|
355
|
+
`)}));let B=ct(t.contextDir,"logs");Et(B,{recursive:!0});let f=ct(B,`design-${m}.log`);t.out(`trace: ${me(f)}`),t.emit?.({type:"run_start",mode:y,trace:f,use_case:a});let q=(o,r,u)=>{try{Rt(f,JSON.stringify({ts:new Date().toISOString(),kind:o,session_id:u,data:r})+`
|
|
356
|
+
`)}catch{}},F=null,P={current:e};t.chat?.attachOnCommitted?.(o=>{P.current=o});let I="";if(t.chat&&!s.plan){let o=Ce({contextDir:t.contextDir,graph:Y(t.contextDir),sessionStamp:C.session_id,by:t.by??{kind:"human",id:"owner"}});o.errors===null||o.errors[0]?.code==="CONV_SOURCE_EXISTS"?(I=o.sourceId,t.chat.attachConversationSource?.(I),P.current=Y(t.contextDir)):t.out(`warning: conversation source unavailable (${o.errors[0]?.detail}) \u2014 chat adds will not land this session`)}let b=s.plan?Ct(t.out,t.emit):ot({contextDir:t.contextDir,ucRef:a,by:{kind:"ai",id:"design-agent"},force:d,engine:"design@1",note:o=>t.chat?t.chat.note(o):t.out(o),commitLine:o=>t.chat?t.chat.ledger({kind:"commit",ok:!0,line:o}):t.out(o),steer:t.chat?o=>t.chat.submit(o):void 0,event:t.emit,resuming:D,...i?.state.force_scope?.length?{forceScope:i.state.force_scope}:{},onForceScope:o=>{F=o},...s.because?{because:s.because}:{},aliases:t.chat?o=>t.chat.registerAliases?.(o):void 0,onCommitted:o=>{P.current=o}});t.chat||t.out(`designing: ${h.usecase.logical_id??a} (budget ${h.budget.max_pairs!=null?`${h.budget.max_pairs} pairs`:"no ceiling"}${h.budget.strength_override?`, strength ${h.budget.strength_override}`:""})`),t.chat?.setWorking?.(`designing ${h.usecase.logical_id??a}\u2026`);let p;try{p=await Ne(C,{...t,graphSlot:P},new Map,e,q,b)}catch(o){throw q("error",{message:o instanceof Error?o.message:String(o),stack:o instanceof Error?o.stack:void 0},C.session_id),i?.release(),o}finally{t.chat?.setWorking?.(null)}if(p.highRisk)return t.out(`error: ${p.highRisk.length} high-risk decision${p.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),t.emit?.({type:"error",message:`error: high-risk question(s) in ci mode (fail-closed): ${p.highRisk.map(o=>o.id).join(", ")}`,code:"HIGH_RISK_CI"}),i?.release(),1;if(p.paused){let o=i;o||(o=Fe(t.contextDir,{sid:C.session_id,mode:"agent",created_at:O.toISOString(),expires_at:new Date(O.getTime()+1440*60*1e3).toISOString(),agent_state:p.paused.agent_state,pending:{questions:[],proposals:[]},read_basis:Object.fromEntries((e.resolve(a)?e.edgesInto(e.resolve(a).tip):[]).filter($=>$.type==="DERIVES"&&typeof $.props.source_id=="string").map($=>[String($.props.source_id),e.heads.get(String($.props.source_id))??null])),assumed:[],corpus_cursor:{remaining:[]},conv_source:I,verb:"design",use_case:a,...e.resolve(a)?.tip?{uc_tip:e.resolve(a).tip}:{},...d?{force:!0}:{}})),d&&!o.state.force&&o.save({force:!0}),I&&o.state.conv_source!==I&&o.save({conv_source:I});let r=t.chat?.drainHeldReceipts?.()??[];(r.length>0||(o.state.held_receipts?.length??0)>0)&&o.save({held_receipts:r}),F!==null&&o.save({force_scope:F}),Be(o,p.paused),q("session_paused",{sid:o.state.sid},C.session_id);let u=y!=="interactive"?` --mode ${y}`:"",A=`kane-cli design tests --resume ${o.state.sid}${u}`;return t.out(`paused \u2014 resume with: ${A}`),t.emit?.({type:"session_paused",sid:o.state.sid,mode:y,resume:A,expires_at:o.state.expires_at,pending_questions:p.paused.pending.questions}),t.chat?.ledger?.({kind:"pause",sid:o.state.sid,expires_at:o.state.expires_at,resume:A,messageForm:`${A} --message "<your words>"`}),3}if(p.error)return t.out(`error: design agent failed: ${p.error}`),t.emit?.({type:"error",message:`error: design agent failed: ${p.error}`}),i?.release(),1;if(p.proposal==null&&y!=="interactive")return t.out(`error: the design agent ended without a finalize event \u2014 nothing committed (trace: ${f})`),t.emit?.({type:"error",message:`error: the design agent ended without a finalize event \u2014 nothing committed (trace: ${f})`}),i?.release(),1;p.proposal==null&&t.out("done \u2014 nothing designed this session (no finalize before the session ended)"),p.assumedDefaults&&t.out(`assumed: ${p.assumedDefaults} default(s) auto-taken (flagged)`),i&&t.emit?.({type:"session_complete",sid:s.resume}),i?.complete();{let o=t.chat?.state.ledger.filter(A=>A.kind==="answer"&&A.receipt.form==="assumed").length??0,r=(p.assumedDefaults??0)+o,u=t.chat?.state.credits?.total??p.creditsTotal;t.chat?.ledger?.({kind:"summary",lines:[`designed: ${h.usecase.logical_id??a}${p.proposal==null?" (nothing committed this session)":""}`,...r>0?[`${r} assumed default(s)`]:[],...u!==void 0?[`credits used: ${u.toFixed(1)}`]:[],`trace: ${me(f)}`]})}return s.plan||je(t.contextDir),0}export{Ts as a};
|
|
@@ -1,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-E4OYR32M.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{a as H}from"./chunk-
|
|
2
|
+
import{a as H}from"./chunk-XBE7PGVY.js";import{a as q}from"./chunk-SL7AJ7JQ.js";import{a as j}from"./chunk-FPFOW6BS.js";import{a as V}from"./chunk-YCCUBQY4.js";import{a as Y}from"./chunk-RLG5NUTE.js";import{a as X}from"./chunk-VE3SUJMA.js";import{a as D}from"./chunk-AV5SUGRY.js";import{x as r}from"./chunk-E4OYR32M.js";import{a as z}from"./chunk-HCBYKLMW.js";import{a as d,b as l,i as $}from"./chunk-C44QQJR4.js";import{a as ne}from"./chunk-6YGTRKDT.js";import{e as G}from"./chunk-UR6MHSHU.js";var f=G(ne(),1);var e=G(z(),1);function re(s){let t=[{id:"method",label:"Auth method",options:[{label:"Basic Auth",value:"basic"},{label:"OAuth (browser)",value:"oauth"}]}];return s&&t.push({id:"env",label:"Environment",options:[{label:"prod",value:"prod"},{label:"stage",value:"stage"}]}),t.push({id:"profile",label:"Profile"}),t.push({id:"credentials",label:"Credentials"}),t}function ce({devMode:s,profiles:t,onBasicLogin:n,onOAuthLogin:o,onComplete:A,onCancel:p}){let v=re(s),[x,h]=(0,f.useState)(0),[m,S]=(0,f.useState)(0),[C,R]=(0,f.useState)({}),[c,g]=(0,f.useState)("select"),[N,b]=(0,f.useState)(""),[_,w]=(0,f.useState)("username"),[I,O]=(0,f.useState)(""),[k,B]=(0,f.useState)(null),[Q,F]=(0,f.useState)(null),P=v[x],K=C.method??"basic",E=C.env??"prod",M=(0,f.useCallback)(()=>{let i=t.filter(a=>a.env===E).map(a=>({label:`${a.profile} [${a.env}]`,value:a.profile}));return i.push({label:"+ Create new",value:"__new__"}),i},[t,E]),W=(0,f.useCallback)(()=>{x===0?p():(h(u=>u-1),S(0),g("select"),b(""),B(null))},[x,p]),U=(0,f.useCallback)(u=>{K==="basic"?(g("text-input"),w("username"),b("")):(g("waiting"),o(u,E).then(()=>{F(`Logged in via OAuth as ${u} [${E}]`),g("done")}).catch(i=>{B(i.message),g("error")}))},[K,E,o]),Z=(0,f.useCallback)(u=>{let i=u.trim();if(i){if(_==="profileName"){let a=i;R(T=>({...T,profile:a})),U(a);return}if(_==="username"){O(i),b(""),w("accessKey"),g("text-input-masked");return}if(_==="accessKey"){let a=C.profile??"default";g("waiting"),(async()=>{try{await n(a,E,I,i),F(`Logged in as ${a} [${E}] via basic auth`),g("done")}catch{B("Credentials not valid. Please use valid credentials."),O(""),b(""),w("username"),g("text-input")}})()}}},[_,C.profile,E,n,I,U]),ee=(0,f.useCallback)(u=>{b(u),k&&B(null)},[k]);$((u,i)=>{if(c==="done"){let T=C.profile??"default";A(T,E);return}if(c==="error"){p();return}if(c==="waiting"){i.escape&&p();return}if(c==="text-input"||c==="text-input-masked")return;if(i.escape){W();return}let a=P?.id==="profile"?M():P?.options??[];if(i.upArrow){S(T=>Math.max(0,T-1));return}if(i.downArrow){S(T=>Math.min(a.length-1,T+1));return}if(i.return&&a[m]){let T=a[m];if(P.id==="profile"){if(T.value==="__new__"){g("text-input"),w("profileName"),b("");return}R(y=>({...y,profile:T.value})),h(y=>y+1),S(0),U(T.value);return}R(y=>({...y,[P.id]:T.value})),h(y=>y+1),S(0)}});let L="Login";if(c==="done")return(0,e.jsxs)(d,{flexDirection:"column",borderStyle:"round",borderColor:r.green,paddingX:2,paddingY:1,children:[(0,e.jsxs)(l,{color:r.green,bold:!0,children:["\u2713 ",Q]}),(0,e.jsx)(d,{marginTop:1,children:(0,e.jsx)(l,{color:r.dim,children:"press any key"})})]});if(c==="error")return(0,e.jsxs)(d,{flexDirection:"column",borderStyle:"round",borderColor:r.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:r.red,bold:!0,children:"Login failed"}),(0,e.jsx)(d,{marginTop:1,children:(0,e.jsx)(l,{color:r.red,children:k})}),(0,e.jsx)(d,{marginTop:1,children:(0,e.jsx)(l,{color:r.dim,children:"press any key"})})]});if(c==="waiting")return(0,e.jsxs)(d,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(l,{color:r.orange,bold:!0,children:[L," \u203A OAuth"]}),(0,e.jsx)(d,{marginTop:1,children:(0,e.jsx)(l,{color:r.secondary,children:"Opening browser for login..."})}),(0,e.jsx)(d,{marginTop:1,children:(0,e.jsx)(l,{color:r.orange,children:"Waiting for callback \u27F3"})}),(0,e.jsx)(D,{bindings:[],escBackLabel:"cancel"})]});if(c==="text-input"||c==="text-input-masked"){let u=_==="username"?"Username":_==="accessKey"?"Access Key":"Profile name",i=_==="username"||_==="accessKey"?`${L} \u203A Basic Auth`:`${L} \u203A New Profile`;return(0,e.jsxs)(d,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[k&&(_==="username"||_==="accessKey")&&(0,e.jsx)(d,{marginBottom:1,children:(0,e.jsxs)(l,{color:r.red,children:["\u2717 ",k]})}),(0,e.jsx)(l,{color:r.orange,bold:!0,children:i}),_==="accessKey"&&(0,e.jsxs)(d,{marginTop:1,children:[(0,e.jsx)(l,{color:r.secondary,children:"Username: "}),(0,e.jsx)(l,{children:I})]}),(0,e.jsxs)(d,{marginTop:1,children:[(0,e.jsxs)(l,{color:r.secondary,children:[u,": "]}),(0,e.jsx)(V,{value:N,onChange:ee,onSubmit:Z,onCancel:W,masked:c==="text-input-masked"})]}),(0,e.jsx)(D,{bindings:[{keys:"\u21B5",label:"confirm"}],escBackLabel:"back"})]})}let te=P?.id==="profile"?M():P?.options??[];return(0,e.jsxs)(d,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:r.orange,bold:!0,children:L}),(0,e.jsx)(d,{marginTop:1,children:(0,e.jsxs)(l,{color:r.secondary,children:[P?.label,":"]})}),(0,e.jsx)(d,{flexDirection:"column",marginTop:1,children:te.map((u,i)=>{let a=i===m,T=a?"\u276F ":" ",y=u.value==="__new__"?r.green:a?r.orange:void 0;return(0,e.jsxs)(l,{color:y,children:[T,u.label]},u.value)})}),(0,e.jsx)(D,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}async function J(s,t,n,o){let A=s.loadBasicAuth(t,n),p=s.loadCredentials(t,n);if(!A&&!p)return o("info","STARTUP_GATE_NO_CREDS","Profile has no credentials",{profile:t,env:n}),{status:"needs_login",profile:t,env:n};let v=Y(n),x=async()=>s.loadCredentials(t,n)?.access_token??null,h=new j(v.controllerBaseUrl,x,A,o);o("info","STARTUP_GATE_VALIDATE","Validating credentials with controller",{profile:t,env:n,method:A?"basic":"oauth"});let m=await h.resolve(!0);if(m)return o("info","STARTUP_GATE_VALID","Credentials validated",{profile:t,env:n,username:m.username,org_id:m.org_id}),{status:"authenticated",result:{profile:t,env:n,credentials:p,basicAuth:A,tmsCreds:m,resolver:h}};if(!A&&p){let S=p.refresh_token,R=s.loadClient(t,n)?.client_id;if(S&&R){o("info","STARTUP_GATE_REFRESH","Attempting token refresh",{profile:t,env:n});try{let g=await new q(n).refreshToken(S,R);if(g.access_token){s.saveCredentials(t,n,{...p,...g,expires_at:Date.now()/1e3+(g.expires_in??3600)});let b=await h.resolve(!0);if(b)return o("info","STARTUP_GATE_REFRESH_OK","Token refreshed and validated",{profile:t,env:n,username:b.username}),{status:"authenticated",result:{profile:t,env:n,credentials:{...p,...g},basicAuth:null,tmsCreds:b,resolver:h}}}o("warn","STARTUP_GATE_REFRESH_INVALID","Refreshed token still invalid",{profile:t,env:n})}catch(c){o("warn","STARTUP_GATE_REFRESH_FAILED","Token refresh failed",{profile:t,env:n,error:c instanceof Error?c.message:String(c)})}}else o("info","STARTUP_GATE_NO_REFRESH","No refresh_token or client_id \u2014 login required",{profile:t,env:n})}return o("info","STARTUP_GATE_INVALID","Credentials invalid \u2014 login required",{profile:t,env:n}),{status:"needs_login",profile:t,env:n}}async function Te(s,t,n=new H){let o=s.listProfiles();if(t("info","STARTUP_GATE_START","Auth startup gate",{profile_count:o.length}),o.length===0)return t("info","STARTUP_GATE_NONE","No profiles found \u2014 login required"),{status:"needs_login"};if(o.length>1){let v=s.getActiveProfile(),x=s.getDefaultEnv();if(v&&o.some(m=>m.profile===v&&m.env===x)){t("info","STARTUP_GATE_TRY_ACTIVE","Multiple profiles \u2014 trying active first",{activeProfile:v,activeEnv:x});let m=await J(s,v,x,t);if(m.status==="authenticated")return m;t("info","STARTUP_GATE_ACTIVE_FAILED","Active profile invalid \u2014 showing picker",{activeProfile:v,activeEnv:x})}return t("info","STARTUP_GATE_MULTI","Multiple profiles \u2014 picker required",{profiles:o.map(h=>`${h.profile}/${h.env}`)}),{status:"needs_pick",profiles:o}}let{profile:A,env:p}=o[0];return s.setActiveProfile(A),s.setDefaultEnv(p),X(s,n,A,p),J(s,A,p,t)}export{ce as a,J as b,Te as c};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as b}from"./chunk-
|
|
2
|
+
import{a as b}from"./chunk-SHSV64GX.js";import{x as l}from"./chunk-E4OYR32M.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
3
|
`),n=Math.max(0,g.length-i),a=n>0?g.slice(-i).join(`
|
|
4
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
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(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{x as n}from"./chunk-
|
|
2
|
+
import{x as n}from"./chunk-E4OYR32M.js";import{a as s}from"./chunk-HCBYKLMW.js";import{a,b as i}from"./chunk-C44QQJR4.js";import{e as r}from"./chunk-UR6MHSHU.js";var o=r(s(),1);function g({bindings:c,suppressEscBack:p=!1,escBackLabel:m="back to chat"}){let e=c.map(t=>`${t.keys} ${t.label}`);return p||e.push(`esc \xB7 ${m}`),(0,o.jsx)(a,{marginTop:1,children:(0,o.jsx)(i,{color:n.dim,children:e.join(" \xB7 ")})})}export{g as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as L}from"./chunk-RFHMDQXZ.js";import{Q as O,S}from"./chunk-
|
|
2
|
+
import{c as L}from"./chunk-RFHMDQXZ.js";import{Q as O,S}from"./chunk-OE7TVGNB.js";import{e as P,f as R}from"./chunk-M5JQXOCE.js";import{x as s}from"./chunk-E4OYR32M.js";import{a as y}from"./chunk-HCBYKLMW.js";import{a as E,b as o,i as h}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as d}from"./chunk-UR6MHSHU.js";var n=d(B(),1);import{basename as D}from"path";var r=d(y(),1),U="evidence-view-server";function Q({packPath:m,viewerBase:w,onDone:V,openUrl:k}){let[t,a]=(0,n.useState)("ask"),[g,b]=(0,n.useState)(null),[l,p]=(0,n.useState)(null),f=(0,n.useRef)(null),u=(0,n.useRef)(!1),x=async()=>{let e=f.current;f.current=null,e&&(R(U),await e.close())},v=()=>{u.current||(u.current=!0,V())};return h((e,i)=>{u.current||(t==="ask"?e==="y"||e==="Y"?a("starting"):(e==="n"||e==="N"||i.return||i.escape)&&v():t==="serving"&&(e==="q"||e==="Q"||i.escape)&&x().then(v))}),(0,n.useEffect)(()=>{if(t!=="starting")return;let e=!1;return(async()=>{try{let i=D(m),c=await O({packs:new Map([[i,m]]),allowedOrigins:[new URL(w).origin]});if(e){await c.close();return}f.current=c,P(U,()=>{c.close()});let T=S(c.urlFor(i),w);b(T);try{await(k??(q=>L(q)))(T)}catch{p("could not open browser \u2014 open the URL manually")}a("serving")}catch(i){p(`evidence view failed \u2014 ${i.message}`),a("failed")}})(),()=>{e=!0}},[t]),(0,n.useEffect)(()=>{if(t!=="failed")return;let e=setTimeout(v,0);return()=>clearTimeout(e)},[t]),(0,n.useEffect)(()=>()=>{x()},[]),t==="ask"?(0,r.jsxs)(o,{children:["View evidence in browser? ",(0,r.jsx)(o,{color:s.dim,children:"(y/N)"})]}):t==="serving"||t==="starting"?(0,r.jsxs)(E,{flexDirection:"column",children:[g?(0,r.jsxs)(o,{children:["viewer ",(0,r.jsx)(o,{color:s.orange,children:g})]}):(0,r.jsx)(o,{color:s.dim,children:"starting\u2026"}),l?(0,r.jsx)(o,{color:"yellow",children:l}):null,t==="serving"?(0,r.jsx)(o,{color:s.dim,children:"Press q when done"}):null]}):l?(0,r.jsx)(o,{color:"yellow",children:l}):null}export{Q as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as h}from"./chunk-
|
|
2
|
+
import{a as h}from"./chunk-AV5SUGRY.js";import{x as l}from"./chunk-E4OYR32M.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as c,b as f,i as P}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as x}from"./chunk-UR6MHSHU.js";var L=x(B(),1);var n=x(A(),1);function S(r,d,s,u,m){let p=s==="basic"&&u?`basic (${u})`:s,i=20,a=`${r} [${d}]`,g="\xB7".repeat(Math.max(2,i-a.length+3));return{label:`${a} ${g} ${p}`,profile:r,env:d,isActive:m}}function M({creds:r,onSwitch:d,onCancel:s}){let u=r.listProfiles(),m=r.getActiveProfile(),p=r.getDefaultEnv(),i=u.map(e=>{let o=r.loadBasicAuth(e.profile,e.env),t=r.loadCredentials(e.profile,e.env)!==null,v=o?"basic":t?"oauth":"none",b=o?o.username:null,w=e.profile===m&&e.env===p;return S(e.profile,e.env,v,b,w)}),[a,g]=(0,L.useState)(()=>{let e=i.findIndex(o=>o.isActive);return e>=0?e:0});return P((e,o)=>{if(o.escape){s();return}if(o.upArrow){g(t=>Math.max(0,t-1));return}if(o.downArrow){g(t=>Math.min(i.length-1,t+1));return}if(o.return&&i[a]){let t=i[a];t.isActive||d(t.profile,t.env),s();return}}),i.length===0?(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{marginTop:1,children:(0,n.jsx)(f,{color:l.dim,children:"No profiles \u2014 use Login to create one"})}),(0,n.jsx)(h,{bindings:[],escBackLabel:"back"})]}):(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{flexDirection:"column",marginTop:1,children:i.map((e,o)=>{let t=o===a,v=t?"\u276F ":" ",b=e.isActive?l.green:t?l.orange:void 0;return(0,n.jsxs)(f,{color:b,children:[v,e.label,e.isActive?" \u25CF active":""]},`${e.profile}-${e.env}`)})}),(0,n.jsx)(h,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"switch"}],escBackLabel:"back"})]})}export{S as a,M as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-
|
|
2
|
+
import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-YZKPZXHY.js";import{a as k}from"./chunk-2WVKOZ6W.js";import{a as B}from"./chunk-RLG5NUTE.js";import{a as R}from"./chunk-AV5SUGRY.js";import{x as c}from"./chunk-E4OYR32M.js";import{a as P}from"./chunk-HCBYKLMW.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,i,y,m){return{id:n,label:`${i} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:i,currentFolderId:y,env:m,onSelect:x,onCancel:w}){let[I,M]=(0,t.useState)([]),[$,d]=(0,t.useState)(!0),[O,g]=(0,t.useState)(!1),[U,N]=(0,t.useState)(null),[p,b]=(0,t.useState)("list"),[S,v]=(0,t.useState)(""),[E,f]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){N("Login first to browse folders"),d(!1);return}let o=new AbortController;return d(!0),g(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){N("Login first to browse folders"),d(!1),g(!1);return}let a=B(m),T=new k(a.tmsBaseUrl,r.username,r.access_key),F=(async function*(){if(o.signal.aborted)return;let s=await T.listFolders(i);yield{page:1,folders:s,totalLoaded:s.length,done:!0}})();for await(let s of F){if(d(!1),s.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(s.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),s.done&&g(!1)}}catch(r){if(r?.name==="AbortError")return;N(r instanceof Error?r.message:String(r)),d(!1),g(!1)}})(),()=>o.abort()},[n,i,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!i){f("No project selected \u2014 pick a project first");return}f(null),b("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let T=B(m),s=await new k(T.tmsBaseUrl,a.username,a.access_key).createFolder(i,r);x(s.id,s.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,i,m,x]),H=(0,t.useCallback)(()=>{v(""),f(null),h.current?w():b("list")},[w]);return p==="naming"||p==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:c.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.orange,bold:!0,children:"Create new folder"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"No folders yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(l,{color:c.dim,children:"Name: "}),p==="naming"?(0,e.jsx)(A,{value:S,onChange:o=>{v(o),E&&f(null)},onSubmit:D,onCancel:H}):(0,e.jsx)(l,{children:S})]}),E&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.red,children:E})}),p==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"Creating..."})}),p==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(_,{title:"Folders",items:I,loading:$,loadingMore:O,preserveSelectionById:!0,error:U,itemNoun:"folders",onTab:()=>{h.current=!1,b("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.split(" (")[0];x(o.id,r)},onCancel:w})}export{X as a,W as b};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as sn}from"./chunk-GIGD4M7V.js";import{c as Tt,d as Qr}from"./chunk-
|
|
2
|
+
import{c as sn}from"./chunk-GIGD4M7V.js";import{c as Tt,d as Qr}from"./chunk-C5POEXSX.js";import{d as Wr}from"./chunk-2YQ6TW77.js";import{a as Lt,b as Zr,c as et,d as tt,e as Xr,f as Dt,g as rn,h as nn}from"./chunk-LMJTY32X.js";import{a as Te,b as ne,e as _e,f as xt,k as Yr,p as he,q as Pt,t as Jr}from"./chunk-RKWJG3WW.js";import{b as Se}from"./chunk-7MV5UF6O.js";import{a as Ze,b as At}from"./chunk-FFL2TQEJ.js";import{a as Or,b as Et}from"./chunk-Q4HLQOJI.js";import{a as Le,b as en}from"./chunk-C5UNZ6ZY.js";import{c as tn}from"./chunk-S3DAAAE5.js";import{a as we}from"./chunk-WAOCHXJ5.js";import{B as jr,C as Fr,D as Nr,F as $r,G as Mr,I as Vr,J as Kr,K as Hr,X as qr,aa as Gr,ba as zr,j as Xe,x as Ur}from"./chunk-OE7TVGNB.js";import{a as Br}from"./chunk-BC7UVJJB.js";import{a as xr,c as kt,d as Ct,e as Qe,f as Pr,g as Tr}from"./chunk-M5JQXOCE.js";import{g as Lr,h as Dr}from"./chunk-CIW2KP4C.js";import{a as Je}from"./chunk-2WVKOZ6W.js";import{a as We,b as Ar}from"./chunk-NLCCBXXV.js";import{a as M}from"./chunk-RZ4F3BHX.js";import{a as re}from"./chunk-RLG5NUTE.js";import{a as Cr}from"./chunk-E47GFYXA.js";import{a as ze,c as _t,i as Er,j as Ye,k as It,l as Rt}from"./chunk-E4OYR32M.js";import{join as le,basename as as}from"path";import{existsSync as Ro,readFileSync as cs}from"fs";function on(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
|
|
3
3
|
`):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
|
|
4
4
|
`)}}function Ie(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function an(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;Ie(`[replay-trace] phase: replay ${r}, author ${n}
|
|
5
5
|
`)}function ln(e,t){Ie(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
@@ -15,7 +15,7 @@ import{c as sn}from"./chunk-GIGD4M7V.js";import{c as Tt,d as Qr}from"./chunk-D5D
|
|
|
15
15
|
`):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
|
|
16
16
|
`):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
|
|
17
17
|
`)}function Bs(e){let t=Ne(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function Vs(e){return new Promise(t=>{let r=js({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function Ks(){for(let e=It;e<=Rt;e++)if(!await Vs(e))return e;throw new Error(`All CDP ports ${It}-${Rt} are in use. Close other Chrome instances.`)}var Fe=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Hs(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await M(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new Fe(`Chrome CDP not ready after ${t}ms on port ${e}`)}var qs=3e4,Gs=2;function Dn(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let s=Number(n);return!Number.isInteger(s)||s<r?t:s}function zs(e){return Math.min(500*e,3e3)}function On(e,t){try{if(e.pid)if(t==="win32")Un("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-e.pid,"SIGKILL")}catch{e.kill("SIGKILL")}else e.kill("SIGKILL")}catch{}}async function jn(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Fs.has(t.toLowerCase()))&&!$s())throw kt()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new it(Ms());let n=Ne(),s=Ns(),o=Dn("KANE_CLI_CDP_TIMEOUT_MS",qs,1),f=Dn("KANE_CLI_CDP_RETRIES",Gs,0)+1,a;for(let c=1;c<=f;c++){let y=await Ks(),w=Bs({port:y,...e});e.startUrl&&w.push(e.startUrl);let A=Un(s,w,{stdio:"ignore",detached:!0});A.unref();try{let R=await new Promise((x,k)=>{A.on("error",C=>{k(new Error(`Failed to launch Chrome: ${C.message}. Is Chrome installed at ${s}?`))}),A.on("close",C=>{C!==null&&C!==0&&k(new Fe(`Chrome exited during startup with code ${C}`))}),Hs(y,o).then(x,k)});return{process:A,port:y,cdpEndpoint:R,kill(){On(A,n)}}}catch(R){if(a=R,!(R instanceof Fe))throw R;On(A,n),kt()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${f} failed`,{attempt:c,max_attempts:f,port:y,timeout_ms:o,headless:e.headless??!1,error:R.message}),c<f&&await new Promise(x=>setTimeout(x,zs(c)))}}throw a??new Error("Chrome launch failed after retries")}async function Fn(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await M(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=Ys(Js(Qs(),"kane-clean-")),t=r;let s=r;Qe("tempDir",()=>{try{Ws(s,{recursive:!0,force:!0})}catch{}})}let n=await jn({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}function Nn(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.evidence&&(t.evidence=Xe(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as Zs,readFileSync as Mn,existsSync as Bn}from"fs";import{join as Xs}from"path";function $n(e,t){if(!Bn(e))return{};let r={},n;try{n=Zs(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=Mn(Xs(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[f,a]of Object.entries(i))if(a&&typeof a=="object"&&"value"in a){let c=a;r[f]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${f}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
|
|
18
|
-
`)}return r}function Vn(e){if(!Bn(e))throw new Error(`Variables file not found: ${e}`);let t=Mn(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function Kn(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function Hn(e,t,r){let n=$n(e,r),s=$n(t,r);return{...n,...s}}var Re=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=We(t.username,t.accessKey),n=await M(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var ke=class extends Ar{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await M(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok)
|
|
18
|
+
`)}return r}function Vn(e){if(!Bn(e))throw new Error(`Variables file not found: ${e}`);let t=Mn(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function Kn(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function Hn(e,t,r){let n=$n(e,r),s=$n(t,r);return{...n,...s}}var Re=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=We(t.username,t.accessKey),n=await M(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var ke=class extends Ar{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await M(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let a=await n.json().catch(()=>({}));if(a.type==="Success"&&a.id!=null)return{id:Number(a.id)||0}}let s=await M(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await M(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function qn(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,s]of Object.entries(e)){let o=s.syntax??`{{${n}}}`;t.includes(o)&&(r[n]=s)}return r}function Gn(e){let t=Hn(e.globalDir,e.localDir,e.onLoadError),r=e.file?Vn(e.file):{},n=e.inline?Kn(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:f}=o?Se(s,e.objective):{variables:{},objective:e.objective},a=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:f,secretEntries:a,nonSecretEntries:c}}async function zn(e){if(e.localMode)return{};let t=re(e.env);if(e.variables.secretEntries.length>0){let n=new Re(t.secretsBaseUrl);for(let[s,o]of e.variables.secretEntries)n.pushSecret({secretKey:s,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:s})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:s,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new ke(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as eo,existsSync as to}from"fs";function Bt(e){if(!to(e))return null;try{return eo(e,"utf-8").trim()||null}catch{return null}}var ro=()=>{};async function Yn(e,t,r){let n=t.log??ro,s=e.session.testId??null,o=null,i=null,f=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(a){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(a)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(a=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(a)})})}catch(a){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(a)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{f=Lt({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(a){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(a)})}try{Pt({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??Te(r.sourcePath),plan:e.session.plan??void 0})}catch(a){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(a)})}if(o?.codeExportDir)try{let a=e.tuiConfig.code_export?.language??"python";Dt(o.codeExportDir,xt(r.sourcePath,"playwright",a))}catch(a){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(a)})}}else if(e.session.recorder?.lastWrittenPath){let a=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((R,x)=>({index:x+1,heading:`Step ${x+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:R.objective}})),w=c.map((R,x)=>({rootStepIndex:x+1,status:R.status==="passed"?"passed":R.status==="failed"?"failed":"skipped",duration_s:R.duration,reason:R.reason})),A=w.some(R=>R.status==="failed")?"failed":"passed";try{f=Lt({sourcePath:a,title:e.session.sessionName??"Session",rootSteps:y,outcomes:w,overallStatus:A,startedISO:e.session.startedAt,durationS:w.reduce((R,x)=>R+(x.duration_s??0),0),sessionId:e.session.sessionId})}catch(R){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(R)})}try{Pt({sourcePath:a,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(R){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(R)})}if(o?.codeExportDir)try{let R=e.tuiConfig.code_export?.language??"python";Dt(o.codeExportDir,xt(a,"playwright",R))}catch(R){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(R)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${a} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
19
19
|
`)}try{t.runCleanup?.()}catch(a){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(a)})}try{await e.session.finish("complete")}catch(a){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(a)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:f}}import{readFileSync as Vt,writeFileSync as Kt,existsSync as Jn}from"fs";function Wn(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let f=t[i];if(!f||f.kind!=="author"||f.reason==="downstream-of-divergence"||f.reason==="no-result-md")continue;let a=no(e,e.steps[i]);switch(f.reason){case"structure-mismatch":n.push(`added/removed: ${a}`);break;case"md5-mismatch":n.push(`modified: ${a}`);break;case"missing-recording":n.push(`re-recorded: ${a}`);break;case"recorded-failed":n.push(`re-authored after failure: ${a}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,f)=>f===0||n[f-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function no(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let s=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?s?`imported step in "${s}"`:`imported step ${r}`:s||`step ${r}`}function so(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await rn({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let s of r){let o=ne(s);if(Jn(`${o}.staging`)){Yr(o);let i=n.find(f=>f.unitFile===s);i&&nn(i.dirs)}}}}function oo(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=Wn(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),n=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await Nt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=_e(e.sourcePath);try{let i=JSON.parse(Vt(o,"utf8"));i.commit_id=e.newCommitId,Kt(o,JSON.stringify(i,null,2)+`
|
|
20
20
|
`,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
|
|
21
21
|
`)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await De({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),be(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),f=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),a=await Nt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:i.length,timeTaken:0,objectives:f},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(a.ok){let c=_e(o.file);try{let y=JSON.parse(Vt(c,"utf8"));y.commit_id=e.newCommitId,Kt(c,JSON.stringify(y,null,2)+`
|
|
@@ -44,7 +44,7 @@ import{c as sn}from"./chunk-GIGD4M7V.js";import{c as Tt,d as Qr}from"./chunk-D5D
|
|
|
44
44
|
`);else if(_r&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
45
45
|
`);else if(Ir){let d=c.basicAuth,u=L,g=F,b=await ss({controller:new we(A.controllerBaseUrl,{username:d.username,accessKey:d.access_key}),tms:new Je(A.tmsBaseUrl,c.resolvedCreds?.username??d.username,c.resolvedCreds?.access_key??d.access_key),testId:m.testId,sessionId:l.sessionId,executionId:u.executionId,sealedPackPath:Z.pack,projectId:g});b.ok?l.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:g}):(l.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
|
|
46
46
|
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await Lo(n,m,l,z.outcomes,z.overallStatus,Ve,ge,oe.uploadResult,j,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},_,J);try{let d=he(n);if(Qr({shouldUploadPipeline:He,uploadSucceeded:!!oe.uploadResult?.success,metaCommitId:d?.commit_id,metaTestId:d?.test_id})){let u=await Tt({sourcePath:n,testId:d.test_id,sessionId:l.sessionId,commitId:d.commit_id,controller:new we(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?l.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:d.commit_id,bytes:u.bytes}):(l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:d.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
|
|
47
|
-
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(He&&oe.uploadResult?.success)for(let d of m.unitLocks)try{let u=he(d.file);if(u?.commit_id!==l.sessionId||!u?.test_id)continue;let g=await Tt({sourcePath:d.file,testId:String(u.test_id),sessionId:l.sessionId,commitId:String(u.commit_id),controller:new we(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});g.ok?l.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:g.bytes}):l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:d.file,stage:g.stage,error:g.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:g.ok?"ok":"failed",commit_id:u.commit_id,path:d.file,...g.ok?{bytes:g.bytes}:{stage:g.stage}})}catch(u){l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let Rr=re(w),qe=oe.uploadResult?.testcaseId,Ge=qe&&oe.uploadResult?.shareId&&F?ot(Rr.testManagerUiUrl,F,qe,oe.uploadResult.shareId):void 0,Ss=a.unitFiles.filter(d=>d.file!==a.rootPath).map(d=>{let u=a.steps.filter(p=>p.owningFile===d.file),g=u.filter(p=>ce.has(p.flatIndex)).length,h=(d.kind==="test"?he(d.file):null)?.commit_id===l.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-g,authored:g,committed:h,...h?{commit_id:l.sessionId}:{}}}),kr={overallStatus:z.overallStatus,durationS:ge,decisions:m.decisions,outcomes:z.outcomes,cancelled:J,retryTriggered:X,lockHeld:_,anyAuthorStepRan:D,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:oe.uploadResult,shouldUploadArtifacts:ve,shouldReplaceLocalOutput:D&&!J,shouldCommit:(_||m.isFirstRun)&&!J&&z.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:Ge,imports:Ss},{buildSummaryEvent:ws}=await import("./SummaryBox-
|
|
47
|
+
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(He&&oe.uploadResult?.success)for(let d of m.unitLocks)try{let u=he(d.file);if(u?.commit_id!==l.sessionId||!u?.test_id)continue;let g=await Tt({sourcePath:d.file,testId:String(u.test_id),sessionId:l.sessionId,commitId:String(u.commit_id),controller:new we(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});g.ok?l.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:g.bytes}):l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:d.file,stage:g.stage,error:g.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:g.ok?"ok":"failed",commit_id:u.commit_id,path:d.file,...g.ok?{bytes:g.bytes}:{stage:g.stage}})}catch(u){l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let Rr=re(w),qe=oe.uploadResult?.testcaseId,Ge=qe&&oe.uploadResult?.shareId&&F?ot(Rr.testManagerUiUrl,F,qe,oe.uploadResult.shareId):void 0,Ss=a.unitFiles.filter(d=>d.file!==a.rootPath).map(d=>{let u=a.steps.filter(p=>p.owningFile===d.file),g=u.filter(p=>ce.has(p.flatIndex)).length,h=(d.kind==="test"?he(d.file):null)?.commit_id===l.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-g,authored:g,committed:h,...h?{commit_id:l.sessionId}:{}}}),kr={overallStatus:z.overallStatus,durationS:ge,decisions:m.decisions,outcomes:z.outcomes,cancelled:J,retryTriggered:X,lockHeld:_,anyAuthorStepRan:D,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:oe.uploadResult,shouldUploadArtifacts:ve,shouldReplaceLocalOutput:D&&!J,shouldCommit:(_||m.isFirstRun)&&!J&&z.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:Ge,imports:Ss},{buildSummaryEvent:ws}=await import("./SummaryBox-R6WHU7VD.js");if(i?t.onAgentEvent(ws(kr)):await t.onSummary(kr),!i){let d=qe&&F?Ln(Rr.testManagerUiUrl,F,qe):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:Ge,testCaseLink:d,codeExportDir:oe.uploadResult?.codeExportDir})}if(ae.ownsLifecycle&&Z&&wr){let{offerEvidenceView:d}=await import("./evidence-AX67Q6RN.js");await d({packPath:Z.pack,env:w,isTTY:!i&&!J&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
48
48
|
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:z.overallStatus,duration_s:ge,session_id:l.sessionId,...Ge?{share_url:Ge}:{}}),{overallStatus:z.overallStatus,exitCode:z.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:ge,uploadResult:oe.uploadResult,anyAuthorStepRan:D,resultCode:Ur(Ke),...St.length?{pendingInvestigations:St}:{}}}function Ao(e,t){let r={...e,...t},n=Object.keys(r).length>0?Se(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function Ce(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=Se(n,r);return{raw:n,variables:qn(s.variables,s.objective),objective:s.objective}}function xo(e,t,r){let n=Ce(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function ls(e,t){let r=new Set(dt),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function Po(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function To(e,t,r,n,s,o){let i=Zr(t);on(t,i);let f=_e(e),a=Ro(f)?JSON.parse(cs(f,"utf8")):null,c=a?.testcase_id,y=a?.test_id,w=a?.commit_id,A=r.push===!0,R=r.retry===!0||r.retryCount!==void 0,x=r.author===!0;A&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
49
49
|
`),x&&(c=void 0,y=void 0,w=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let N=await n.resolvedAuth.resolver.resolve(!0);N?.username&&N?.access_key&&(k={username:N.username,access_key:N.access_key},n.resolvedAuth.basicAuth=k)}let C=!!k,l=!r.local&&C&&y!=null&&w!=null&&c!=null,H=l&&(et(i)||A);if(A&&!l)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
50
50
|
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:C,canLock:l,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(R&&!l)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as H,d as z}from"./chunk-2YQ6TW77.js";import{b as p,c as E,d as j,e as y,f as M,g as C,i as A,l as D,m as F,p as T,r as $,s as O}from"./chunk-RKWJG3WW.js";import{a as B}from"./chunk-
|
|
2
|
+
import{c as H,d as z}from"./chunk-2YQ6TW77.js";import{b as p,c as E,d as j,e as y,f as M,g as C,i as A,l as D,m as F,p as T,r as $,s as O}from"./chunk-RKWJG3WW.js";import{a as B}from"./chunk-XBE7PGVY.js";import{h as R,i as k}from"./chunk-M5JQXOCE.js";import{a as P}from"./chunk-E4OYR32M.js";import{e as q}from"./chunk-UR6MHSHU.js";import{existsSync as f,mkdirSync as V,readFileSync as Z,renameSync as N,writeFileSync as K}from"fs";import{join as Q}from"path";function fe(e){D(p(e));let t=p(e);if(!f(t))return;let n=Q(t,"meta.json"),r=y(e);if(f(n)&&!f(r))try{V(j(e),{recursive:!0}),N(n,r)}catch(o){process.stderr.write(`warn: meta.json migration failed: ${o.message}
|
|
3
3
|
`)}let i=C(e);if(f(i)){let o="python";try{let c=new B().load();c.code_export?.language&&(o=c.code_export.language)}catch{}let a=M(e,"playwright",o);if(!f(a))try{N(i,a)}catch(c){process.stderr.write(`warn: generated-code migration failed: ${c.message}
|
|
4
4
|
`)}}if(f(r))try{let o=JSON.parse(Z(r,"utf8"));"md5sum"in o&&(delete o.md5sum,K(r,JSON.stringify(o,null,2)+`
|
|
5
5
|
`,"utf8"))}catch(o){process.stderr.write(`warn: meta.json md5sum strip failed: ${o.message}
|
|
6
|
-
`)}}async function ye(e){if(!e.isInteractive)return{recovered:!1};if(W(e.creds))return{recovered:!1};let{SingleShotApp:t}=await import("./SingleShotApp-
|
|
6
|
+
`)}}async function ye(e){if(!e.isInteractive)return{recovered:!1};if(W(e.creds))return{recovered:!1};let{SingleShotApp:t}=await import("./SingleShotApp-QANGFAPO.js"),{ScrollbackProvider:n}=await import("./scrollback-JLPJR25X.js"),{render:r}=await import("./build-JIKYOZUH.js"),i=await import("./react-QWOAB3TB.js"),o={current:null},a={current:!1},{waitUntilExit:c,unmount:l}=r(i.default.createElement(n,null,i.default.createElement(t,{resultRef:o,mode:"login",loginCompleteRef:a})),{exitOnCtrlC:!1});k(()=>l()),await c();try{process.stdin.setRawMode?.(!1)}catch{}return process.stdout.write("\x1B[?25h"),a.current?{recovered:!0}:(R(0,"Startup gate cancelled"),{recovered:!1})}function W(e){let t=e.getActiveProfile(),n=e.getDefaultEnv();if(!t||!!!(e.loadBasicAuth(t,n)||e.loadCredentials(t,n)))return!1;let i=e.loadProfileConfig(t,n)??{};return!!i.project_id&&!!i.folder_id}var J=q(H(),1);import{existsSync as v,readFileSync as U,readdirSync as X,statSync as Y}from"fs";import{dirname as ee,isAbsolute as te,join as g,relative as x,resolve as re,sep as h}from"path";import{createHash as ne}from"crypto";var S="testmd-bundle.json",d=class extends Error{constructor(t){super(t),this.name="BundleUsageError"}},_=e=>e.split(h).join("/");function I(e){if(!v(e))return[];let t=[];for(let n of X(e).sort()){let r=g(e,n);Y(r).isDirectory()?t.push(...I(r)):t.push(r)}return t}function se(e){let t=e.map(r=>ee(r).split(h)),n=t[0];for(let r of t.slice(1)){let i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i++;n=n.slice(0,i)}return n.join(h)||h}function ie(e){for(let t of e){let n=F(t,U(t,"utf8"));for(let r of n.steps)if(r.body.kind==="import_ref"&&te(r.body.path))throw new d(`bundle sync: absolute @import is not portable after unzip: ${t} step ${r.index} (@import ${r.body.path})`)}}function G(e){let t=re(e),n=T(t);if(!n?.commit_id||!n?.test_id)throw new d(`bundle sync: ${t} is not authored \u2014 run \`kane-cli testmd run\` first (output-<stem>/.internal/meta.json needs commit_id + test_id)`);let r;try{r=O(t)}catch(s){throw s instanceof $?new d(`bundle sync: ${s.message}`):s}let i=[t];for(let s of r.steps)for(let u of s.trace.slice(1))i.includes(u.file)||i.push(u.file);ie(i);let o=[];for(let s of r.unitFiles){if(s.file===t)continue;let u=p(s.file);o.includes(u)||o.push(u)}let a=[...i],c=s=>{v(s)&&a.push(s)};c(E(t)),a.push(y(t)),c(g(p(t),".internal","execution.json")),a.push(...I(A(t)));for(let s of o)c(g(s,"Result.md")),a.push(...I(g(s,".internal","steps")));let l=se(a);if(v(g(l,S)))throw new d(`bundle sync: a real file named ${S} exists at the zip root (${l}) \u2014 it would collide with the generated manifest`);let b=a.map(s=>{let u=U(s);return{abs:s,rel:_(x(l,s)),sha256:ne("sha256").update(u).digest("hex"),bytes:u.length}}).sort((s,u)=>s.rel<u.rel?-1:1),m=_(x(l,t)),L={schema_version:2,entry:m,commit_id:n.commit_id,test_id:n.test_id,testcase_id:n.testcase_id??null,project_id:n.project_id??null,folder_id:n.folder_id??null,org_id:n.org_id??null,created_at:new Date().toISOString(),producer:{name:"kane-cli",version:P},files:b.map(s=>({path:s.rel,sha256:s.sha256,bytes:s.bytes})),units:r.unitFiles.filter(s=>s.file!==t).map(s=>({path:_(x(l,s.file)),kind:s.kind}))};return{zipRoot:l,entry:m,files:b,manifest:L}}var w=e=>e instanceof Error?e.message:String(e);function oe(e){return new Promise((t,n)=>{let r=(0,J.default)("zip",{zlib:{level:6}}),i=[];r.on("data",o=>i.push(o)),r.on("error",n),r.on("end",()=>t(Buffer.concat(i))),r.append(JSON.stringify(e.manifest,null,2)+`
|
|
7
7
|
`,{name:S});for(let o of e.files)r.file(o.abs,{name:o.rel});r.finalize()})}async function ae(e){let{plan:t,controller:n,testId:r,sessionId:i,commitId:o}=e,a;try{a=await oe(t)}catch(l){return{ok:!1,stage:"zip",error:w(l)}}let c;try{let l={key:"testmd",content_type:"application/zip",filename:`${o}-testmd.zip`},m=(await n.getPresignedUrls(r,i,[l])).urls?.testmd?.upload_url;if(!m)return{ok:!1,stage:"presign",error:"presign response missing testmd upload_url"};c=m}catch(l){return{ok:!1,stage:"presign",error:w(l)}}try{await z(c,a,"application/zip")}catch(l){return{ok:!1,stage:"upload",error:w(l)}}return{ok:!0,bytes:a.length}}async function Ee(e){let t;try{t=G(e.sourcePath)}catch(n){return n instanceof d?{ok:!1,stage:"collect",error:n.message}:{ok:!1,stage:"collect",error:w(n)}}return ae({...e,plan:t})}function je(e){return e.shouldUploadPipeline&&e.uploadSucceeded&&!!e.metaCommitId&&!!e.metaTestId}export{fe as a,ye as b,Ee as c,je as d};
|
|
@@ -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{a as g}from"./chunk-
|
|
2
|
+
import{a as m}from"./chunk-2WVKOZ6W.js";import{a as g}from"./chunk-RLG5NUTE.js";import{b as f,c as j}from"./chunk-VE3SUJMA.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
|