@testmuai/kane-cli 0.6.2 → 0.6.4
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-VXYU6KFW.js +8 -0
- package/dist/{ChromeProfilePicker-XXNZLSCC.js → ChromeProfilePicker-QWTM7DK6.js} +1 -1
- package/dist/{CliFeedbackPrompt-FJF5INQO.js → CliFeedbackPrompt-6NVWMONO.js} +1 -1
- package/dist/{CliUploadProgress-5E3CCYPZ.js → CliUploadProgress-2YRQLECI.js} +1 -1
- package/dist/{ConfigView-TGVOKOUZ.js → ConfigView-I4R5M7BO.js} +1 -1
- package/dist/EvidenceViewOffer-54GEARRX.js +2 -0
- package/dist/{FolderPicker-T4JB4NNW.js → FolderPicker-5VWBYTAK.js} +1 -1
- package/dist/{HelpView-PSHKI7DD.js → HelpView-OJZW4XWX.js} +1 -1
- package/dist/{InfoBox-PXWJ6BIX.js → InfoBox-TGELGCBR.js} +1 -1
- package/dist/{LinksBox-IUOYRXYO.js → LinksBox-B5EBRY26.js} +1 -1
- package/dist/{ProfilesView-UK5XX5WP.js → ProfilesView-3SJRIBHQ.js} +1 -1
- package/dist/{ProjectPicker-3FE7UFXL.js → ProjectPicker-72HKMBEY.js} +1 -1
- package/dist/{SaveSessionPrompt-P7NF5FDA.js → SaveSessionPrompt-CK5SGNRO.js} +1 -1
- package/dist/SingleShotApp-AJBIWW74.js +2 -0
- package/dist/{SummaryBox-WVR4U3NN.js → SummaryBox-ABB7ST26.js} +1 -1
- package/dist/TestMdRunView-5PMLLLFT.js +2 -0
- package/dist/{WhoamiView-QVXJAVTC.js → WhoamiView-OF354UGC.js} +1 -1
- package/dist/bind-BWILBZGR.js +6 -0
- package/dist/{bridge-I6N3YPXI.js → bridge-LNDJS3HH.js} +1 -1
- package/dist/{changelog-HPSX3L7T.js → changelog-BWCEZQ23.js} +1 -1
- package/dist/{chat-committer-GHDZY5XF.js → chat-committer-ADJJTDUT.js} +1 -1
- package/dist/chat-controller-VAC57IEV.js +3 -0
- package/dist/{chunk-M6DX4ENH.js → chunk-2K4XOHVK.js} +1 -1
- package/dist/{chunk-KHDUQ33H.js → chunk-2PQXEEVY.js} +1 -1
- package/dist/{chunk-NNZV5RCE.js → chunk-3C5GMAM4.js} +1 -1
- package/dist/{chunk-VL2UA23Z.js → chunk-3HEPW6SN.js} +1 -1
- package/dist/{chunk-BKGJGPDN.js → chunk-3WJJ43MT.js} +1 -1
- package/dist/{chunk-4G4HPMR2.js → chunk-4MUHS3UL.js} +1 -1
- package/dist/{chunk-DEYHK6ZC.js → chunk-5CTMOJG4.js} +1 -1
- package/dist/{chunk-6UNTIXFW.js → chunk-5KSB5MOF.js} +1 -1
- package/dist/chunk-5YPBPZUR.js +2 -0
- package/dist/chunk-64LC36AF.js +2 -0
- package/dist/{chunk-HR7AGYV2.js → chunk-64QURIT6.js} +1 -1
- package/dist/{chunk-6XKJH5ZE.js → chunk-652FEDL4.js} +2 -2
- package/dist/{chunk-Z56AWGVY.js → chunk-6AYUSR7X.js} +1 -1
- package/dist/{chunk-VJUIW2ES.js → chunk-6GTOYTCQ.js} +1 -1
- package/dist/chunk-6LRKYF67.js +14 -0
- package/dist/{chunk-AE6SS34N.js → chunk-74RUSHIB.js} +1 -1
- package/dist/chunk-ACEODVSC.js +14 -0
- package/dist/{chunk-44QUA6GV.js → chunk-ADOXYGZE.js} +1 -1
- package/dist/chunk-ANIVHX3P.js +5 -0
- package/dist/{chunk-K2MKBBI4.js → chunk-AXABTFCD.js} +1 -1
- package/dist/{chunk-5ON7QQZO.js → chunk-BNN6ZDJW.js} +10 -10
- package/dist/{chunk-L4AUCQVO.js → chunk-BOO7YXAV.js} +1 -1
- package/dist/{chunk-OZODSY6H.js → chunk-BYUARJE7.js} +1 -1
- package/dist/{chunk-FYOCF7DY.js → chunk-CJJXT5DO.js} +1 -1
- package/dist/{chunk-S6GRW5ZA.js → chunk-CLTANA4L.js} +2 -2
- package/dist/{chunk-NEZ4G7XR.js → chunk-CT2I5KUM.js} +1 -1
- package/dist/{chunk-ZGH7T32S.js → chunk-CY5NDMO7.js} +1 -1
- package/dist/{chunk-YIOWO6WS.js → chunk-DNOBOZPO.js} +1 -1
- package/dist/chunk-DXK55KGR.js +9 -0
- package/dist/{chunk-IDDVO4UV.js → chunk-E3BO7OVR.js} +1 -1
- package/dist/chunk-EHN5HTUD.js +147 -0
- package/dist/{chunk-RGEAEAZB.js → chunk-FJTWJ243.js} +1 -1
- package/dist/{chunk-FOZVXYVG.js → chunk-FV4LLU3T.js} +1 -1
- package/dist/{chunk-CE664P73.js → chunk-GBBVP2JW.js} +1 -1
- package/dist/{chunk-AD46OCZ4.js → chunk-GRB66C5S.js} +1 -1
- package/dist/{chunk-22A2ECA2.js → chunk-GYW7LVVL.js} +1 -1
- package/dist/{chunk-QIE62H3J.js → chunk-HJGUEZLW.js} +1 -1
- package/dist/{chunk-XN7PPLFS.js → chunk-HNE4TDOZ.js} +1 -1
- package/dist/{chunk-2U5DZUC7.js → chunk-I2JUBAPU.js} +1 -1
- package/dist/chunk-IJPFAWBH.js +5 -0
- package/dist/{chunk-TJRBV2V2.js → chunk-IOTJZTHX.js} +3 -3
- package/dist/{chunk-OZM4UU5F.js → chunk-IRRGSC7B.js} +1 -1
- package/dist/{chunk-Z4K4AYEI.js → chunk-IXVR66NS.js} +1 -1
- package/dist/chunk-K5JGCJ2K.js +6 -0
- package/dist/{chunk-D5T4ARTB.js → chunk-MCQXRJGH.js} +1 -1
- package/dist/{chunk-DCYTRYR2.js → chunk-MK2G7VIF.js} +1 -1
- package/dist/{chunk-35SRW4KA.js → chunk-MVF4KRHA.js} +1 -1
- package/dist/{chunk-KGFISJFM.js → chunk-O66EU5UV.js} +1 -1
- package/dist/{chunk-LV5VRSPI.js → chunk-OB6CKLEL.js} +1 -1
- package/dist/{chunk-HUD7SPUF.js → chunk-OLXOZJ7X.js} +1 -1
- package/dist/{chunk-U3JB76QP.js → chunk-PICCLJSO.js} +1 -1
- package/dist/{chunk-PJSCM6JX.js → chunk-POI6DCP6.js} +1 -1
- package/dist/{chunk-D5DEWIAU.js → chunk-PYB2EXRE.js} +2 -2
- package/dist/{chunk-YSK535OI.js → chunk-QNNBNIR7.js} +3 -3
- package/dist/{chunk-B2CIHKXG.js → chunk-QZI43UNV.js} +1 -1
- package/dist/chunk-RE3BZVGE.js +3 -0
- package/dist/{chunk-LMJTY32X.js → chunk-RHNKYNNZ.js} +1 -1
- package/dist/{chunk-ZKYYZ5NO.js → chunk-RN4OSVTG.js} +2 -2
- package/dist/chunk-SJ2KQKOV.js +3 -0
- package/dist/{chunk-FU3OQXFH.js → chunk-STH6I3UB.js} +1 -1
- package/dist/{chunk-N62EM6JX.js → chunk-UZSG54OY.js} +1 -1
- package/dist/{chunk-EK2B2LZK.js → chunk-W36P7S5W.js} +1 -1
- package/dist/{chunk-Q6TVDG3X.js → chunk-WE57PD6K.js} +1 -1
- package/dist/{chunk-52VLJKIN.js → chunk-WFEGGQJ4.js} +1 -1
- package/dist/chunk-WIA7TPK3.js +2 -0
- package/dist/{chunk-LZKUF23A.js → chunk-WT3SMSY5.js} +1 -1
- package/dist/{chunk-KRFGAVYU.js → chunk-XUJ5EPVW.js} +1 -1
- package/dist/{chunk-4PIMEZJW.js → chunk-YI4XULHR.js} +3 -3
- package/dist/{chunk-MHQ6A2QZ.js → chunk-YMSN25DX.js} +1 -1
- package/dist/{chunk-B2PZAB7J.js → chunk-ZG2V2ODK.js} +1 -1
- package/dist/{chunk-GN3SZXZ5.js → chunk-ZQP3MCZW.js} +1 -1
- package/dist/{chunk-GIRXJOJI.js → chunk-ZZLR3O5A.js} +1 -1
- package/dist/{config-KD62VH3R.js → config-OJF53CHL.js} +1 -1
- package/dist/{cover-cmd-Y5L4O4Q3.js → cover-cmd-K3LCXHAQ.js} +1 -1
- package/dist/{credentials-NQNJR4E4.js → credentials-NLJHSVBY.js} +1 -1
- package/dist/descriptor-EHK3DRCZ.js +2 -0
- package/dist/{evidence-FFOI2H3N.js → evidence-UPOFW3XC.js} +1 -1
- package/dist/evolve-cmd-MVALOB3G.js +2 -0
- package/dist/explain-VFIZTHFN.js +2 -0
- package/dist/{explain-cmd-RIDEMDMY.js → explain-cmd-KV5YUXKB.js} +1 -1
- package/dist/{explain-cmd-55WRDIMW.js → explain-cmd-U367SD4N.js} +1 -1
- package/dist/{extract-bind-6UMILP4U.js → extract-bind-SSTKQGTV.js} +2 -2
- package/dist/{extract-cmd-MZR7PHGA.js → extract-cmd-GO4UV7ER.js} +2 -2
- package/dist/{gaps-cmd-P2DRK6FW.js → gaps-cmd-DTVDIOED.js} +1 -1
- package/dist/{gate-FACZRGOC.js → gate-B6C6KLFA.js} +1 -1
- package/dist/{generate-headless-XOBQS6RU.js → generate-headless-2HYMSVN5.js} +2 -2
- package/dist/{headless-io-GXHKDPHB.js → headless-io-PWW6YKH2.js} +1 -1
- package/dist/index.js +43 -43
- package/dist/ingest-C5ANIN7S.js +2 -0
- package/dist/ingest-cmd-LLC5CDQ5.js +3 -0
- package/dist/interactive-bind-Q5TQFQ6N.js +7 -0
- package/dist/{lifecycle-cmd-55NZL3UO.js → lifecycle-cmd-BXE5IMFN.js} +1 -1
- package/dist/{list-cmd-JB2ABACD.js → list-cmd-KBWPYJMV.js} +1 -1
- package/dist/{list-commands-PDTISP6T.js → list-commands-6WDXAECV.js} +1 -1
- package/dist/{logical-ids-ATVR6PF2.js → logical-ids-3Y6RX5C2.js} +1 -1
- package/dist/login-flow-XQMJFC4H.js +2 -0
- package/dist/{maintenance-cmd-E3HEEVQW.js → maintenance-cmd-VS3APIUN.js} +1 -1
- package/dist/{persist-recorded-session-5UNUINWF.js → persist-recorded-session-KHIMN4A3.js} +1 -1
- package/dist/pipeline-2HRAWT5U.js +2 -0
- package/dist/readmodel-XOGOELUP.js +2 -0
- package/dist/reconcile-cmd-DH4VV6PG.js +2 -0
- package/dist/{recording-banner-IWY3GS6N.js → recording-banner-SADVYNEP.js} +1 -1
- package/dist/{require-project-folder-PFIDA5ZH.js → require-project-folder-LP7V26IU.js} +1 -1
- package/dist/{revert-3TKLOYQA.js → revert-AQQ2VHRM.js} +1 -1
- package/dist/{review-cmd-RXPPC5GK.js → review-cmd-4WZUUOE4.js} +1 -1
- package/dist/run-RT2VMPTQ.js +2 -0
- package/dist/run-XAZMT7WO.js +2 -0
- package/dist/{run-test-md-7GONSVAM.js → run-test-md-ATB2HZRG.js} +2 -2
- package/dist/{skill-installer-YZP5DWWZ.js → skill-installer-DE2LSSKU.js} +1 -1
- package/dist/{spawner-YDYCSTZD.js → spawner-GOTVIFR5.js} +1 -1
- package/dist/tcg-generate-7PUXJ5R4.js +2 -0
- package/dist/{testmd-actions-7RNW76DN.js → testmd-actions-RYQHBX4K.js} +1 -1
- package/dist/token-refresh-F5KRV7ER.js +2 -0
- package/dist/{validate-basic-IQY5CRLP.js → validate-basic-6BQ2L7TT.js} +1 -1
- package/dist/{version-check-U5UBPVX4.js → version-check-YW3FUWDH.js} +1 -1
- package/dist/{view-cmd-QE2FS3GB.js → view-cmd-FRMQF76B.js} +1 -1
- package/dist/walk-session-O4TMVORI.js +2 -0
- package/package.json +7 -7
- package/dist/ChatSurface-HGP5EHZM.js +0 -9
- package/dist/EvidenceViewOffer-7O3RNBEE.js +0 -2
- package/dist/SingleShotApp-UIDA54GB.js +0 -2
- package/dist/TestMdRunView-OH4Y6YD6.js +0 -2
- package/dist/archive-committer-3NI773TP.js +0 -2
- package/dist/bind-SRZYTS4Q.js +0 -6
- package/dist/chat-controller-VKGECDTU.js +0 -3
- package/dist/chunk-DM2GL24Z.js +0 -3
- package/dist/chunk-FTD3B7QA.js +0 -2
- package/dist/chunk-GIGD4M7V.js +0 -5
- package/dist/chunk-HW7Z5S2M.js +0 -14
- package/dist/chunk-I2S6KNZW.js +0 -2
- package/dist/chunk-IACKIGPX.js +0 -2
- package/dist/chunk-NFOBDHZK.js +0 -147
- package/dist/chunk-WM5QHLAP.js +0 -9
- package/dist/chunk-X4QL2DAD.js +0 -5
- package/dist/chunk-YANCBRER.js +0 -3
- package/dist/descriptor-SL5A7RQE.js +0 -2
- package/dist/distill-cmd-EYCCCFL3.js +0 -2
- package/dist/evolve-cmd-PHQ6FHRI.js +0 -2
- package/dist/explain-JIXUWEFJ.js +0 -2
- package/dist/ingest-4CGBXC2L.js +0 -2
- package/dist/ingest-cmd-X7BWGIN7.js +0 -3
- package/dist/interactive-bind-5FWW3S53.js +0 -7
- package/dist/login-flow-IXPJHTL2.js +0 -2
- package/dist/pipeline-F4WTOZ3Y.js +0 -2
- package/dist/readmodel-MPTENJ2R.js +0 -2
- package/dist/reconcile-cmd-MNMWAZF3.js +0 -8
- package/dist/run-V2WMNHFK.js +0 -2
- package/dist/signals-cmd-LXHZQLXZ.js +0 -2
- package/dist/tcg-generate-ZRKSX2KC.js +0 -2
- package/dist/token-refresh-DH2L2IPP.js +0 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as k}from"./chunk-FPFOW6BS.js";import{h as a}from"./chunk-M5JQXOCE.js";import{a as m}from"./chunk-2WVKOZ6W.js";import{a as y}from"./chunk-
|
|
2
|
+
import{a as k}from"./chunk-FPFOW6BS.js";import{h as a}from"./chunk-M5JQXOCE.js";import{a as m}from"./chunk-2WVKOZ6W.js";import{a as y}from"./chunk-DNOBOZPO.js";import{a as h}from"./chunk-BOO7YXAV.js";var $=10,u=200,N=1e4,S=1e6;function T(t,e,r="streaming"){let n=r==="full-fetch"?S:N,o=$,i=0;if(t!==void 0){let s=Number(t);if(!Number.isInteger(s)||s<1||s>u)return{error:`--limit must be an integer in [1, ${u}] (got "${t}")`};o=s}if(e!==void 0){let s=Number(e);if(!Number.isInteger(s)||s<0||s>n)return{error:`--offset must be an integer in [0, ${n}] (got "${e}")`};i=s}return{limit:o,offset:i}}function C(t,e){if(!e)return t;let r=e.toLowerCase();return t.filter(n=>n.name.toLowerCase().includes(r))}function j(t,{limit:e,offset:r}){let n=t.slice(r,r+e),o=t.length>r+e;return{slice:n,hasMore:o}}function v(t,e,r=n=>process.stdout.write(`${n}
|
|
3
3
|
`)){for(let n of t)r(JSON.stringify(n));r(JSON.stringify({_meta:"page",limit:e.limit,offset:e.offset,returned:t.length,has_more:e.has_more}))}function b(t,e,r=n=>process.stdout.write(`${n}
|
|
4
|
-
`)){if(t.length===0){r("(no results)");return}let n=Math.max(2,...t.map(s=>s.id.length)),o=`${"ID".padEnd(n)} NAME`;r(o),r(`${"-".repeat(n)} ----`);for(let s of t)r(`${s.id.padEnd(n)} ${s.name}`);r("");let i=e.offset+t.length;if(e.hasMore){let s=e.totalIsLowerBound?`${e.total}+`:`${e.total}`;r(`${i} of ${s} \u2014 next: --offset ${e.offset+e.limit}`)}else r(`${t.length} shown (${e.total} total)`)}async function B(t,e,r){if(r.username&&r.accessKey)return{ok:!0,creds:{username:r.username,access_key:r.accessKey}};let n=new h,o=n.loadBasicAuth(t,e);if(o)return{ok:!0,creds:{username:o.username,access_key:o.access_key}};let i=n.loadCredentials(t,e);if(!i)return{ok:!1,reason:"no_credentials"};let s=i.access_token;try{let{refreshOAuthToken:d}=await import("./token-refresh-
|
|
4
|
+
`)){if(t.length===0){r("(no results)");return}let n=Math.max(2,...t.map(s=>s.id.length)),o=`${"ID".padEnd(n)} NAME`;r(o),r(`${"-".repeat(n)} ----`);for(let s of t)r(`${s.id.padEnd(n)} ${s.name}`);r("");let i=e.offset+t.length;if(e.hasMore){let s=e.totalIsLowerBound?`${e.total}+`:`${e.total}`;r(`${i} of ${s} \u2014 next: --offset ${e.offset+e.limit}`)}else r(`${t.length} shown (${e.total} total)`)}async function B(t,e,r){if(r.username&&r.accessKey)return{ok:!0,creds:{username:r.username,access_key:r.accessKey}};let n=new h,o=n.loadBasicAuth(t,e);if(o)return{ok:!0,creds:{username:o.username,access_key:o.access_key}};let i=n.loadCredentials(t,e);if(!i)return{ok:!1,reason:"no_credentials"};let s=i.access_token;try{let{refreshOAuthToken:d}=await import("./token-refresh-F5KRV7ER.js"),w=await d({creds:n,profile:t,env:e,credentials:i});w&&(s=w.accessToken)}catch(d){return{ok:!1,reason:"refresh_failed",detail:d instanceof Error?d.message:String(d)}}let c=y(e),f=await new k(c.controllerBaseUrl,async()=>s,null).resolve();return f?{ok:!0,creds:{username:f.username,access_key:f.access_key}}:{ok:!1,reason:"exchange_failed"}}function E(t,e,r){switch(r.reason){case"no_credentials":return{message:`error: no credentials for profile "${t}" [${e}]. Run \`kane-cli login\` or pass --username/--access-key.
|
|
5
5
|
`,exitCode:2};case"refresh_failed":return{message:`error: OAuth token refresh failed for profile "${t}" [${e}]${r.detail?`: ${r.detail}`:""}. Run \`kane-cli login\` to re-auth.
|
|
6
6
|
`,exitCode:2};case"exchange_failed":return{message:`error: TMS credential exchange failed for profile "${t}" [${e}]. Token may be revoked \u2014 try \`kane-cli login\`; if the problem persists, TMS may be down.
|
|
7
7
|
`,exitCode:2}}}function O(t){return{id:t.project_id,name:t.name}}function M(t){return{id:t.id,name:t.name}}async function P(t,e,r,n){let o=r+n+1,i=[],s=!0;for await(let c of t.listProjectsStream({name:e})){if(i.push(...c.projects),c.done){s=!0;break}if(i.length>=o){s=!1;break}}return{items:i,doneStreaming:s}}function g(t){return!!t.agent||!process.stdin.isTTY||!process.stdout.isTTY}function _(t,e=r=>process.stdout.write(`${r}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as n}from"./chunk-427OQS2N.js";import{a as i,b as s,c as t}from"./chunk-
|
|
2
|
+
import{a as n}from"./chunk-427OQS2N.js";import{a as i,b as s,c as t}from"./chunk-5YPBPZUR.js";function y(o="extract"){let a=new Set(n(o)),c=Object.fromEntries(Object.keys(s).map(r=>{let e=s[r];return[r,{hashed:[...e.hashed],required:[...e.required],enums:Object.fromEntries(Object.entries(e.enums).map(([p,g])=>[p,[...g]])),mintable:a.has(r)}]})),d=Object.fromEntries(Object.keys(t).map(r=>{let e=t[r];return[r,{src:[...e.src],dst:[...e.dst],salient:[...e.salient],props:[...e.props],cardinality:e.cardinality,acyclic:e.acyclic,direction:"dependent->dependency"}]}));return{schema_version:i,nodes:c,edges:d,mint_gate:n(o),blob_fingerprint:{algo:"sha256",domain:"assurance.blob\0",prefix:"sha256:"}}}export{y as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as b,d as _}from"./chunk-
|
|
2
|
+
import{c as b,d as _}from"./chunk-2PQXEEVY.js";import{a as g,c as h}from"./chunk-ZZLR3O5A.js";import{g as S}from"./chunk-ZG2V2ODK.js";import{d as f,f as v}from"./chunk-5YPBPZUR.js";var V=n=>`conv#turn=${n}`;function E(n,o){for(let t of n.split(`
|
|
3
3
|
`))if(t.trim())try{let r=JSON.parse(t);if(r.turn===o)return r.text}catch{}return null}var y={format:"conversation",media_type:"text/x-conversation",anchors_supported:["#turn="]};function $(n){let{contextDir:o,graph:t,sessionStamp:r}=n,e=`su-conv-${r}`,u=t.heads.get(e);if(typeof u=="string")return{record:null,errors:[{code:"CONV_SOURCE_EXISTS",detail:`${e} already exists \u2014 resume it`}],sourceId:e,cid:u};let i=b(o,Buffer.from("","utf8")),c=h(e,i),a=v("source",c);if(a.length>0)return{record:null,errors:a.map(s=>({code:s.code,detail:s.detail})),sourceId:e,cid:""};let d=g("source",c);return{record:S(o,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:d,label:f.SOURCE,content:c}],edges:[],review:[],supersessions:[],source_head_moves:{[e]:d},media:{[e]:y},conv:{source_id:e,turn:0,append_of:null}},{expectPrev:t.latestHash}).record,errors:null,sourceId:e,cid:d}}function G(n){let{contextDir:o,graph:t,sourceId:r,text:e,force:u}=n,i=t.heads.get(r),c=t.convChains.get(r);if(typeof i!="string"||!c)return{record:null,errors:[{code:"CONV_SOURCE_MISSING",detail:`${r} is not a live conversation source`}]};let d=t.getNode(i)?.content?.blob;if(typeof d!="string")return{record:null,errors:[{code:"CONV_SOURCE_MISSING",detail:`${r} head node unreadable`}]};let l=_(o,d)?.toString("utf8")??"",s=c.turns;if(!u&&s>0&&E(l,s)===e)return{record:null,errors:null,turn:s,cid:i,idempotent:!0};let p=s+1,C=`${l}${JSON.stringify({turn:p,text:e})}
|
|
4
4
|
`,O=b(o,Buffer.from(C,"utf8")),x=h(r,O),m=g("source",x);return{record:S(o,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:m,label:f.SOURCE,content:x}],edges:[],review:[],supersessions:[],source_head_moves:{[r]:m},media:{[r]:y},conv:{source_id:r,turn:p,append_of:i}},{expectPrev:t.latestHash}).record,errors:null,turn:p,cid:m,idempotent:!1}}export{V as a,E as b,$ as c,G as d};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as U}from"./chunk-GBBVP2JW.js";import{b as F}from"./chunk-ANIVHX3P.js";import{e as P,f as G}from"./chunk-WIA7TPK3.js";import{a as L}from"./chunk-QPZRHAYK.js";import{d as N}from"./chunk-2PQXEEVY.js";import{a as $}from"./chunk-MCQXRJGH.js";import{d as I}from"./chunk-ZG2V2ODK.js";import{d as R,e as x,g as V}from"./chunk-5YPBPZUR.js";function Q(e,s,t,r,n){let a=t.rows.filter(f=>{let g=r.get(f.temp_ref);return g!==void 0&&g!=="reject"});if(a.length===0)return{record:null,errors:null};let o={version:1,read_basis:s.latestHash,source:{source_id:t.source_id,source_cid:s.heads.get(t.source_id)??""},use_cases:a.map(f=>f.uc)},p=new Map;for(let f of a){let g=r.get(f.temp_ref);typeof g=="object"?p.set(f.temp_ref,{resolution:"edited",edit:g.edited}):p.set(f.temp_ref,{resolution:f.uc.matches_existing&&f.uc.changed?"edited":"approved"})}let m=o,i=o.source.source_cid?D(e,s,o.source.source_cid):null;if(i!==null){m=W(o,i);let f=P(m,X(i),s);if(f.length>0)return{record:null,errors:[{code:"HELD_CITES_STALE",detail:"the source moved after this plan staged \u2014 its quotes no longer verify against the current head; re-run kane-cli maintain reconcile to re-stage"},...f]}}let u=`held-${(s.latestHash??"root").slice(-12)}-${a.length}`;return G({contextDir:e,graph:s,proposal:m,proposalId:u,verdicts:p,by:n,autoName:!0})}function X(e){return e.replace(/\n$/,"").split(`
|
|
3
|
+
`).map((t,r)=>`${String(r+1).padStart(4,"0")}| ${t}`).join(`
|
|
4
|
+
`)}function W(e,s){let t=s.replace(/\n$/,""),r=X(s),n=a=>{if(!a?.quote)return a;let o=L(r,a.anchor);if(o!==null&&o.includes(a.quote))return a;let p=t.indexOf(a.quote);if(p===-1||t.indexOf(a.quote,p+1)!==-1)return a;let m=t.slice(0,p).split(`
|
|
5
|
+
`).length,i=m+a.quote.replace(/\n$/,"").split(`
|
|
6
|
+
`).length-1;return{...a,anchor:`L${m}-L${i}`}};return{...e,use_cases:e.use_cases.map(a=>({...a,cite:n(a.cite)??a.cite,...a.criteria?{criteria:a.criteria.map(o=>({...o,cite:n(o.cite)??o.cite}))}:{},...a.updated?.criteria?{updated:{...a.updated,criteria:a.updated.criteria.map(o=>({...o,cite:n(o.cite)??o.cite}))}}:{}}))}}function z(e,s,t=[]){let r=F(e,s),n=new Set,a=[],o=u=>{!u||n.has(u)||(n.add(u),a.push(b(e,u)))};for(let u of r.pairs)o(u.scenario),o(u.test);for(let[u,f]of r.verifies){o(u);for(let g of f)o(g)}if(t.length===0)return{stale_refs:a};let p=u=>`${String(u.props.source_id)}\0${String(u.props.anchor)}`,m=new Set;for(let{cid:u}of e.byLabel(R.USECASE))if(e.tipOf(u)===s)for(let f of e.edgesInto(u)){if(f.type!==x.DERIVES)continue;let g=f.props.claim;typeof g=="string"&&t.includes(g)&&m.add(p(f))}if(m.size===0)return{stale_refs:a};let i=new Set;for(let[u,f]of r.verifies)if(e.edgesInto(u).some(d=>d.type===x.DERIVES&&m.has(p(d)))){i.add(b(e,u));for(let d of f)i.add(b(e,d))}return{stale_refs:a,...i.size>0?{direct_refs:[...i]}:{}}}var j="this release plans changes only \u2014 blast-radius impact and drift meaning-checks are not measured, and REMOVE rows are never executed automatically",Z="suite untouched; graph updated";function M(e,s){return!e.superseded.has(s)&&e.trust.get(s)!=="archived"}function b(e,s,t=new Set){let r=e.nameOf.get(s);if(r!==void 0)return r;if(t.has(s))return s;t.add(s);for(let[n,a]of e.superseded){if(a!==s)continue;let o=b(e,n,t);if(o!==n)return o}return s}function O(e){return String(e).slice(0,19)}function A(e,s,t){let r=e.edgesFrom(s).find(n=>n.type===t);return r?e.tipOf(r.dst):null}function B(e,s){let t=e.nodeLabel.get(s);if(t===R.USECASE)return s;if(t===R.SCENARIO)return A(e,s,x.BELONGS_TO);if(t===R.AC){let r=A(e,s,x.SCOPED_TO);return r?e.nodeLabel.get(r)===R.USECASE?r:A(e,r,x.BELONGS_TO):null}if(t===R.TEST){let r=A(e,s,x.AUTOMATES);return r?A(e,r,x.BELONGS_TO):null}return null}function Y(e,s){let t=[],r=new Map;for(let n of e.derivesInto(s))r.set(String(n.props.source_id),n);for(let[n,a]of r){let o=e.heads.get(n);if(o==null){t.push(`DERIVES pin ${n} @ ${O(a.props.source_cid)} \u2014 source retired`);continue}if(o!==a.props.source_cid){let p=e.convChains.get(n)?.chain;if(p&&p.includes(String(a.props.source_cid)))continue;t.push(`DERIVES pin ${n} @ ${O(a.props.source_cid)} \u2014 source head moved to ${O(o)}`)}}for(let n of e.edgesFrom(s))V(n.type)?.pin?.comparesTo==="dst_tip"&&e.superseded.has(n.dst)&&t.push(`${n.type} pin \u2192 ${b(e,n.dst)} \u2014 target superseded`);return t.join("; ")||"structural pin broken"}var ee=new Set([R.USECASE,R.SCENARIO,R.AC,R.TEST]);function k(e,s){return e.ref<s.ref?-1:e.ref>s.ref?1:0}function D(e,s,t){let r=s.getNode(t)?.content.blob;if(typeof r!="string")return null;let n=N(e,r);return n===null?null:n.toString("utf8")}function te(e,s,t,r,n){let a=t.props.quote;if(typeof a=="string"&&a.length>0)return r.includes(a);let o=String(t.props.source_cid);n.has(o)||n.set(o,D(e,s,o));let p=n.get(o);if(p===null)return!1;let m=L(p,String(t.props.anchor));return m===null?!1:m.split(`
|
|
7
|
+
`).some(i=>i.trim().length>0&&r.includes(i.trim()))}var q=128*1024,K=64*1024;function ne(e,s){let t=e.split(`
|
|
8
|
+
`),r=s.split(`
|
|
9
|
+
`),n=0;for(;n<t.length&&n<r.length&&t[n]===r[n];)n++;let a=t.length,o=r.length;for(;a>n&&o>n&&t[a-1]===r[o-1];)a--,o--;if(a===n&&o===n)return"";let p=t.slice(n,a),m=r.slice(n,o),u=se(p,m,2e3),f=[];if(u===null)f.push(`@@ old L${n+1}-L${a} \u2192 new L${n+1}-L${o} @@`,...p.map(g=>`- ${g}`),...m.map(g=>`+ ${g}`));else{let g=u.map((c,w)=>c.op==="="?-1:w).filter(c=>c>=0),d=0;for(;d<g.length;){let c=d;for(;c+1<g.length&&g[c+1]-g[c]<=3;)c++;let w=Math.max(g[d]-1,0),y=Math.min(g[c]+1,u.length-1),_=u.slice(w,y+1),E=n+(_[0].ai??0)+1,h=n+(_[0].bi??0)+1,l=_.filter(v=>v.op!=="+").length,S=_.filter(v=>v.op!=="-").length;f.push(`@@ old L${E}-L${E+Math.max(l-1,0)} \u2192 new L${h}-L${h+Math.max(S-1,0)} @@`);for(let v of _)f.push(v.op==="="?` ${v.line}`:`${v.op} ${v.line}`);d=c+1}}return f.join(`
|
|
10
|
+
`)}function se(e,s,t){let r=e.length,n=s.length,a=Math.min(r+n,t),o=new Map([[1,0]]),p=[],m=!1;for(let g=0;g<=a&&!m;g++){p.push(new Map(o));for(let d=-g;d<=g;d+=2){let c=d===-g||d!==g&&(o.get(d-1)??0)<(o.get(d+1)??0)?o.get(d+1)??0:(o.get(d-1)??0)+1,w=c-d;for(;c<r&&w<n&&e[c]===s[w];)c++,w++;if(o.set(d,c),c>=r&&w>=n){m=!0;break}}}if(!m)return null;let i=r,u=n,f=[];for(let g=p.length-1;g>0;g--){let d=p[g],c=i-u,w=c===-g||c!==g&&(d.get(c-1)??0)<(d.get(c+1)??0)?c+1:c-1,y=d.get(w)??0,_=y-w;for(;i>y&&u>_;)f.push({op:"=",line:e[i-1],ai:i-1,bi:u-1}),i--,u--;g>0&&(i===y?(f.push({op:"+",line:s[u-1],ai:i,bi:u-1}),u--):(f.push({op:"-",line:e[i-1],ai:i-1,bi:u}),i--))}for(;i>0&&u>0;)f.push({op:"=",line:e[i-1],ai:i-1,bi:u-1}),i--,u--;for(;i>0;)f.push({op:"-",line:e[i-1],ai:i-1,bi:0}),i--;for(;u>0;)f.push({op:"+",line:s[u-1],ai:0,bi:u-1}),u--;return f.reverse()}function oe(e){let s=Buffer.byteLength(e,"utf8");if(s<=q+K)return{diff:e,truncated:!1};let t=Buffer.from(e,"utf8"),r=q;for(;r>0&&(t[r]&192)===128;)r--;let n=s-K;for(;n<s&&(t[n]&192)===128;)n++;let a=t.subarray(0,r).toString("utf8"),o=t.subarray(n).toString("utf8");return{diff:`${a}
|
|
11
|
+
\u2026 [diff truncated: ${s-r-(s-n)} bytes omitted] \u2026
|
|
12
|
+
${o}`,truncated:!0}}function re(e,s){let t=$(e),r=t.heads.get(s);if(typeof r!="string")return null;let n=[];for(let d of I(e).records){let c=d.source_head_moves?.[s];c!==void 0&&c!==n[n.length-1]&&n.push(c)}let a=n.lastIndexOf(r),o=a>0?n[a-1]:null;if(typeof o!="string"||o===r)return null;let p=D(e,t,o),m=D(e,t,r);if(p===null||m===null)return null;let{diff:i,truncated:u}=oe(ne(p,m)),f=new Set,g=[];for(let d of t.edgesFrom(o))d.type!==x.DERIVES||t.nodeLabel.get(d.dst)!==R.USECASE||f.has(d.dst)||(f.add(d.dst),g.push({id:d.dst,title:String(t.getNode(d.dst)?.content.title??"")}));return{source_id:s,old_head:o,new_head:r,diff:i,...u?{truncated:!0}:{},prior_ucs:g}}function ie(e,s,t){let r=e.getNode(s)?.content??{},n=e.getNode(t)?.content??{},o=[...new Set([...Object.keys(r),...Object.keys(n)])].sort().filter(p=>JSON.stringify(r[p])!==JSON.stringify(n[p]));return o.length>0?`updated: ${o.join(", ")}`:"updated"}function ce(e,s,t,r,n,a,o){let p=new Set((o?.rows??[]).map(c=>c.matched_cid).filter(c=>!!c)),m=[];for(let[c,w]of t.superseded)w===null||c===w||s.superseded.has(c)||t.nodeLabel.get(c)===R.USECASE&&m.push({kind:"MODIFY",ref:b(t,c),old_cid:c,new_cid:w,summary:ie(t,c,w)});let i=a.map(c=>({kind:"ADD",ref:b(t,c),cid:c}));for(let c of o?.rows??[])c.kind==="MODIFY"&&c.matched_cid?m.push({kind:"MODIFY",ref:b(t,c.matched_cid),old_cid:c.matched_cid,new_cid:null,summary:`${c.why} (staged)`}):c.kind==="ADD"&&i.push({kind:"ADD",ref:c.title,cid:null});let u=[],f=D(e,t,n),g=new Map;for(let{cid:c}of t.byLabel(R.USECASE)){if(!M(t,c)||p.has(c))continue;let w=t.derivesInto(c),y=w.filter(h=>String(h.props.source_id)===r);y.length===0||y.some(h=>h.props.source_cid===n)||f!==null&&y.some(h=>String(h.props.anchor)!=="img#whole"&&te(e,t,h,f,g))||w.some(h=>{let l=String(h.props.source_id);if(l===r)return!1;let S=t.heads.get(l);return S!=null})||u.push({kind:"ARCHIVE",ref:b(t,c),cid:c,why:`evidence decayed: no quote from ${r} relocates into @${O(n)}, no other live source, no fresh evidence this run`,impact:z(t,t.tipOf(c))})}let d=(c,w)=>c.ref<w.ref?-1:c.ref>w.ref?1:0;return[...m.sort(d),...i.sort(d),...u.sort(d)]}function he(e,s,t,r,n){let a=s.rows.find(d=>d.temp_ref===t);if(!a)return{ok:!1,message:`held item ${t} missing from the plan artifact`};let o=a,p=$(e);if(o.matched_cid){let d=p.tipOf(o.matched_cid);if(p.superseded.get(d)===null)return{ok:!1,message:`use-case for "${o.title}" was retired meanwhile \u2014 nothing to update`};d!==o.matched_cid&&(o={...o,matched_cid:d,uc:{...o.uc,matches_existing:{cid:d}}})}let m=n?{edited:n}:"approve",i=Q(e,p,{source_id:s.source_id,rows:[o]},new Map([[o.temp_ref,m]]),r);if(i.errors)return{ok:!1,message:i.errors.map(d=>`${d.code}: ${d.detail}`).join("; ")};let u=$(e),f=o.matched_cid?u.tipOf(o.matched_cid):i.record?.nodes.find(d=>d.label==="usecase")?.cid??i.record?.review[0]?.id;return{ok:!0,ref:f?b(u,f):o.title,kind:o.kind}}async function we(e,s,t,r={}){let n=$(e),a=n.heads.get(s)??null,o=new Set(n.staleList().filter(l=>l.state==="stale").map(l=>l.cid)),p=await t.reingest(s);if(p.status==="unchanged"&&!r.resumeHeld)return{source_id:s,changed:!1,head:{status:p.status,before:a,after:p.cid},note:`nothing to reconcile \u2014 ${s} is unchanged`,skipped_arms:j,changeset:[],rows:[]};let m=r.resumeHeld?{minted:[],matched:[],held:r.resumeHeld}:await t.reextract(s),i=$(e),u=m.minted.map(l=>{let S=b(i,l);return{kind:"ADD",origin:"content-change",ref:S,reason:`new use-case extracted from ${s}`,provenance:`extraction commit \u2014 DERIVES ${s} @ ${O(p.cid)}`,action:`kane-cli design tests --use-case ${S}`}}),f=i.staleList().filter(l=>l.state==="stale"&&!o.has(l.cid)&&M(i,l.cid)).map(l=>l.cid),g=f.map(l=>{let S=b(i,l),v=ee.has(i.nodeLabel.get(l)??"");return{kind:"MODIFY",origin:"structural-stale",ref:S,reason:"stale (structural)",provenance:Y(i,l),action:v?`kane-cli maintain evolve ${S}`:`kane-cli design explain ${S}`}}),d=[],c=[];for(let l of m.held?.rows??[])if(l.kind==="ADD")d.push({kind:"ADD",origin:"content-change",ref:l.title,held_ref:l.temp_ref,reason:`${l.why} (staged \u2014 commits on approval)`,provenance:`staged extraction of ${s} @ ${O(p.cid)}`,action:"approve to commit + design"});else{let S=l.matched_cid?i.tipOf(l.matched_cid):null,v=S?i.getNode(S)?.content.criteria??[]:[],T=(l.uc.updated?.criteria??[]).map(C=>typeof C=="string"?C:C.text),J=[...T.filter(C=>!v.includes(C)),...l.uc.updated?.criteria!==void 0?v.filter(C=>!T.includes(C)):[]],H=S?z(i,S,J):void 0;c.push({kind:"MODIFY",origin:"content-change",ref:l.matched_cid?b(i,l.matched_cid):l.title,held_ref:l.temp_ref,reason:`${l.why} (staged \u2014 commits on approval)`,provenance:`staged extraction of ${s} @ ${O(p.cid)}`,action:"approve to commit the updated version (old\u2192new redirect)",...H?{impact:H}:{}})}let w=new Set;for(let l of[...m.minted,...m.matched])w.add(i.tipOf(l));for(let l of m.held?.rows??[])l.matched_cid&&w.add(i.tipOf(l.matched_cid));for(let l of f){let S=B(i,i.tipOf(l));S&&i.nodeLabel.get(S)===R.USECASE&&w.add(i.tipOf(S))}let y=[];for(let l of await U(i,"design")){if(l.kind!=="no-verifies")continue;let S=i.resolve(l.ref);if(!S)continue;let v=B(i,S.tip);!v||!w.has(i.tipOf(v))||y.push({kind:"ADD",origin:"content-change",ref:l.ref,reason:l.why,provenance:`gaps engine (design) \u2014 uncovered AC of touched use-case ${b(i,v)}`,action:l.ready_command})}let _=[];for(let{cid:l}of i.byLabel(R.USECASE))M(i,l)&&i.stale(l)==="orphaned"&&_.push({kind:"REMOVE",ref:b(i,l),reason:"orphaned \u2014 no live source evidences this use-case",provenance:Y(i,l),action:"plan-only \u2014 REMOVE is not executed in this release"});let E=new Set,h=[...u.sort(k),...d.sort(k),...y.sort(k),...c.sort(k),...g.sort(k),..._.sort(k)].filter(l=>{let S=`${l.kind}\0${l.ref}`;return E.has(S)?!1:(E.add(S),!0)});return{source_id:s,changed:!0,head:{status:p.status,before:a,after:p.cid},note:Z,skipped_arms:j,changeset:ce(e,n,i,s,p.cid,m.minted,m.held),rows:h,...m.held?{held:m.held}:{}}}function _e(e,s){return async t=>{let{ingestFile:r}=await import("./ingest-C5ANIN7S.js"),n=await r({contextDir:e,filePath:s,asId:t});return{status:n.status,cid:n.cid}}}function Se(e,s={}){return async t=>{let r=[],[{runExtract:n},{resolveAgentAuthEnv:a},{runAgent:o},{preflightTurn:p}]=await Promise.all([import("./run-RT2VMPTQ.js"),import("./spawner-GOTVIFR5.js"),import("./bridge-LNDJS3HH.js"),import("./turn-preflight-JGYT7LXP.js")]),m=await a(),i=new Set($(e).byLabel(R.USECASE).map(_=>_.cid)),u=re(e,t)??void 0,f=0,g=await n({mode:"override",...u?{changeContext:u}:{}},{contextDir:e,agent:o,preflightTurn:()=>p(m),ask:async()=>[],review:async _=>{if(!s.stage)return new Map(_.map(h=>[h.temp_ref,{resolution:h.matches_existing&&h.changed?"edited":"skipped"}]));let E=new Map;for(let h of _){if(h.matches_existing&&!h.changed){E.set(h.temp_ref,{resolution:"skipped"});continue}r.push({kind:h.matches_existing?"MODIFY":"ADD",temp_ref:h.temp_ref,title:h.title,why:h.matches_existing?`updated: ${Object.keys(h.updated??{}).join(", ")||"content"}`:`newly extracted from ${t}`,...h.matches_existing?{matched_cid:h.matches_existing.cid,updated:h.updated}:{},uc:h}),E.set(h.temp_ref,{resolution:"rejected"})}return E},confirmStale:async()=>!1,out:_=>process.stderr.write(_+`
|
|
13
|
+
`),progress:_=>process.stderr.write(_+`
|
|
14
|
+
`),emit:_=>{_.type==="commit"&&typeof _.assumed=="number"&&(f+=_.assumed)},isTTY:!1,auth:m});if(g!==0)throw new Error(`reconcile: re-extract of ${t} failed (exit ${g})`);let d=$(e),c=d.heads.get(t),w=[],y=[];if(typeof c=="string"){let _=new Set;for(let E of d.edgesFrom(c))E.type!==x.DERIVES||d.nodeLabel.get(E.dst)!==R.USECASE||_.has(E.dst)||(_.add(E.dst),!(s.stage&&d.trust.get(E.dst)==="archived")&&(i.has(E.dst)?y:w).push(E.dst))}return{minted:w,matched:y,defaultsTaken:f,...s.stage?{held:{source_id:t,rows:r}}:{}}}}export{he as a,we as b,_e as c,Se as d};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as j}from"./chunk-
|
|
2
|
+
import{a as j}from"./chunk-ZZLR3O5A.js";import{c as m,d as _,f as L}from"./chunk-ZG2V2ODK.js";import{a as w,e as N,f as k,g as O,h as I}from"./chunk-5YPBPZUR.js";import{existsSync as v,mkdirSync as M,readFileSync as S,renameSync as T,rmSync as P,writeFileSync as J}from"fs";import{dirname as W,join as b}from"path";var $=s=>b(s,"derived"),q=s=>b($(s),"index.json");function x(s,n){let t=n.startsWith("sha256:")?n.slice(7):n;return b($(s),"nodes",t.slice(0,2),t.slice(2)+".json")}function A(){return{applied:{seq:0,hash:null},heads:{},trust:{},nodeLabel:{},forward:{},extracted:[],design_of:{},exec:{},superseded:{},names:{},archivedReason:{},appliedEvents:[],conv:{},media:{}}}function D(s){let n=q(s);if(!v(n))return null;try{let t=JSON.parse(S(n,"utf8"));return t.superseded===void 0||t.names===void 0||t.archivedReason===void 0||t.appliedEvents===void 0||t.conv===void 0||t.media===void 0||t.exec===void 0||t.reverse!==void 0?null:t}catch{return null}}function U(s,n){M(W(s),{recursive:!0});let t=`${s}.tmp-${process.pid}`;J(t,n),T(t,s)}function y(s,n,t,l,a={}){let p=a.writeNodeFiles!==!1,g=new Set(n.extracted),h=new Set(n.appliedEvents);t.forEach((i,o)=>{for(let e of i.nodes){let r=x(s,e.cid);p&&!v(r)&&U(r,JSON.stringify({label:e.label,content:e.content})+`
|
|
3
3
|
`),!(e.cid in n.trust)&&e.content.derived===!0&&(n.trust[e.cid]="derived"),n.nodeLabel[e.cid]=e.label}i.proposal_id!=null&&typeof i.extraction_of=="string"&&g.add(i.extraction_of),i.design_of&&((n.design_of??={})[i.design_of.uc_cid]={engine:i.design_of.engine,seq:i.seq});for(let e of i.executions??[])((n.exec??={})[e.about]??=[]).push(e);for(let e of i.edges){let{quote:r,...d}=e.props,c=n.forward[e.src]??=[];c.some(u=>u.ecid===e.ecid)||c.push({...e,props:d}),i.proposal_id!=null&&e.type===N.DERIVES&&typeof e.props.source_cid=="string"&&g.add(e.props.source_cid)}for(let e of i.review)e.resolution==="approved"||e.resolution==="edited"?(n.trust[e.id]="trusted",delete n.archivedReason[e.id]):e.resolution==="rejected"?(n.trust[e.id]="archived",e.reason?n.archivedReason[e.id]=e.reason:delete n.archivedReason[e.id]):e.resolution==="reset"&&(n.trust[e.id]="derived",delete n.archivedReason[e.id]);for(let e of i.supersessions)e.kind==="node"?e.new===e.old?delete n.superseded[e.old]:n.superseded[e.old]=e.new:n.superseded[e.ecid]=null;for(let e of i.names??[])n.names[e.slug]=e.cid;for(let[e,r]of Object.entries(i.source_head_moves))n.heads[e]=r;for(let e of i.event_ids??[])h.add(e);if(i.media)for(let[e,r]of Object.entries(i.media)){let d=i.source_head_moves[e];typeof d=="string"&&(n.media[d]=r)}if(i.conv){let e=i.source_head_moves[i.conv.source_id];if(typeof e=="string"){let r=n.conv[i.conv.source_id],d=r&&r.chain.length>0?r.chain[r.chain.length-1]:null;i.conv.append_of===d?n.conv[i.conv.source_id]={turns:i.conv.turn,chain:[...r?.chain??[],e]}:n.conv[i.conv.source_id]={turns:i.conv.turn,chain:[e]}}}for(let[e,r]of Object.entries(i.source_head_moves))i.conv?.source_id!==e&&n.conv[e]!==void 0&&(n.conv[e]=typeof r=="string"?{turns:n.conv[e].turns,chain:[r]}:{turns:n.conv[e].turns,chain:[]});n.applied={seq:i.seq,hash:l[o]}}),n.extracted=[...g].sort(),n.appliedEvents=[...h].sort()}function F(s,n){U(q(s),JSON.stringify(n)+`
|
|
4
4
|
`)}function K(s){let n=b(s,"meta.json");if(v(n))try{let t=JSON.parse(S(n,"utf8"));if(t.schema!==w||t.canonicalizer!=="v1")throw new m(`schema fence: store is ${t.schema}/${t.canonicalizer}, this build is ${w}/${"v1"} \u2014 migrate explicitly (kane-cli context rebuild after upgrading)`)}catch(t){throw t instanceof m?t:new m(`corrupt meta.json in ${s} \u2014 fix or remove it`)}}function V(s){K(s);let n=D(s);if(n===null){n=A();let{records:a,hashes:p}=_(s);return y(s,n,a,p),F(s,n),n}let{records:t,hashes:l}=L(s,n.applied.seq,n.applied.hash);return t.length>0&&(y(s,n,t,l),F(s,n)),n}function Z(s){return P($(s),{recursive:!0,force:!0}),V(s)}function Q(s){let n=[],t=[],l=[];try{({records:t,hashes:l}=_(s))}catch(o){return{ok:!1,issues:[o instanceof m?o.message:String(o)],records:0}}let a=A();y(s,a,t,l,{writeNodeFiles:!1});let p=D(s);if(p===null)n.push("derived/index.json missing or corrupt (run kane-cli context rebuild)");else{let o=e=>JSON.stringify(R(e));for(let e of["applied","heads","trust","nodeLabel","forward","extracted","superseded","names","archivedReason","appliedEvents","conv","media","design_of","exec"])o(a[e])!==o(p[e])&&n.push(`derived drift in index.${e} (run kane-cli context rebuild)`)}let g=new Set;for(let o of Object.values(a.forward))for(let e of o)g.add(e.ecid);let h=new Set;for(let o of t)for(let e of o.supersessions)e.kind==="node"?(e.old in a.nodeLabel||n.push(`SUPERSEDE_UNKNOWN_OLD: ${e.old} (record ${o.seq})`),e.new!==null&&e.new!==e.old&&!(e.new in a.nodeLabel)&&n.push(`SUPERSEDE_UNKNOWN_NEW: ${String(e.new)} (record ${o.seq})`),e.new===e.old?h.delete(e.old):(h.has(e.old)&&n.push(`DOUBLE_SUPERSEDE: ${e.old} re-superseded while live (record ${o.seq})`),h.add(e.old))):g.has(e.ecid)||n.push(`SUPERSEDE_UNKNOWN_ECID: ${e.ecid} (record ${o.seq})`);for(let o of Object.keys(a.superseded)){let e=new Set,r=o;for(;r!==null&&r in a.superseded;){if(e.has(r)){n.push(`SUPERSEDE_CYCLE: chain from ${o} revisits ${r}`);break}e.add(r),r=a.superseded[r]}}for(let[o,e]of Object.entries(a.names))e in a.nodeLabel||n.push(`NAME_UNKNOWN_TARGET: slug ${o} \u2192 ${e} not in the graph`);for(let o of t)for(let e of o.edges){let r=a.nodeLabel[e.src]??"(unknown)",d=a.nodeLabel[e.dst]??"(unknown)";for(let c of I(e.type,r,d,e.props))n.push(`${c.code}: ${e.ecid} ${c.detail}`)}let i=new Map;for(let o of Object.values(a.forward))for(let e of o){if(e.ecid in a.superseded)continue;let r=i.get(e.type)??[];r.push(e),i.set(e.type,r)}for(let[o,e]of i){let r=O(o);if(r?.acyclic){let d=new Map;for(let f of e)d.set(f.src,[...d.get(f.src)??[],f.dst]);let c=new Map,u=f=>{c.set(f,1);for(let E of d.get(f)??[])if(c.get(E)===1||c.get(E)===void 0&&u(E))return!0;return c.set(f,2),!1};for(let f of d.keys())if(c.get(f)===void 0&&u(f)){n.push(`EDGE_CYCLE: live ${o} edges form a cycle reachable from ${f}`);break}}if(r?.cardinality==="one-live-per-src"||r?.cardinality==="one-live-per-src-and-dst"){let d=new Map;for(let c of e)c.dst in a.superseded||d.set(c.src,(d.get(c.src)??0)+1);for(let[c,u]of d)u>1&&n.push(`CARDINALITY_VIOLATION: ${u} live ${o} edges from ${c} (one-live-per-src)`)}if(r?.cardinality==="one-live-per-src-and-dst"){let d=new Map;for(let c of e)c.src in a.superseded||c.dst in a.superseded||d.set(c.dst,(d.get(c.dst)??0)+1);for(let[c,u]of d)u>1&&n.push(`CARDINALITY_VIOLATION: ${u} live ${o} edges onto ${c} (one-live-per-dst)`)}}for(let[o,e]of Object.entries(a.nodeLabel)){let r=x(s,o);if(!v(r)){n.push(`missing node file for ${o} (run kane-cli context rebuild)`);continue}try{let d=JSON.parse(S(r,"utf8"));(d.label!==e||j(d.label,d.content)!==o)&&n.push(`node file content mismatch for ${o} (run kane-cli context rebuild)`);for(let c of k(d.label,d.content))n.push(`${c.code}: ${o} ${c.detail}`)}catch{n.push(`corrupt node file for ${o} (run kane-cli context rebuild)`)}}return{ok:n.length===0,issues:n,records:t.length}}function R(s){return Array.isArray(s)?s.map(R):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).sort(([n],[t])=>n<t?-1:1).map(([n,t])=>[n,R(t)])):s}export{x as a,V as b,Z as c,Q as d};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{f as Be}from"./chunk-K5JGCJ2K.js";import{a as fe,e as Me,g as Te,h as Ge}from"./chunk-DXK55KGR.js";import{b as Ne,f as je,g as Ue,h as He}from"./chunk-FXPPQL4D.js";import{a as Oe}from"./chunk-RE3BZVGE.js";import{a as Pe,b as Ae}from"./chunk-JFAFKHDX.js";import{e as z,f as re}from"./chunk-WIA7TPK3.js";import{c as Ee}from"./chunk-6GTOYTCQ.js";import{b as Ie}from"./chunk-YKTYVJBN.js";import{a as Fe}from"./chunk-6AYUSR7X.js";import{a as ee,d as te}from"./chunk-2PQXEEVY.js";import{a as R}from"./chunk-MCQXRJGH.js";import{b as Re}from"./chunk-ZG2V2ODK.js";import{d as U}from"./chunk-5YPBPZUR.js";import{appendFileSync as rt,mkdirSync as he,writeFileSync as pe}from"fs";import{extname as st,join as M}from"path";var E=class extends Error{code;constructor(e,c){super(`${e}: ${c}`),this.name="ProposalAdapterError",this.code=e}};function qe(s){return s.version===2}function Le(s,e){if(s.read_basis.length!==1)throw new E("READ_BASIS_COUNT",`read_basis must have exactly 1 element, got ${s.read_basis.length}`);let c=s.read_basis[0],x=s.use_cases.map(o=>{if(o.cite.length!==1)throw new E("CITE_COUNT",`${o.temp_ref}: cite must have exactly 1 element, got ${o.cite.length}`);let m=o.cite[0];if(m.source_id!==c.source_id)throw new E("SOURCE_MISMATCH",`${o.temp_ref}: cite source ${m.source_id} != read_basis source ${c.source_id} (single-source)`);return{temp_ref:o.temp_ref,title:o.title,...o.description!==void 0?{description:o.description}:{},...o.summary!==void 0?{summary:o.summary}:{},...o.actors!==void 0?{actors:o.actors}:{},...o.value!==void 0?{value:o.value}:{},risk:o.risk,cite:{anchor:m.anchor,quote:m.quote},...o.criteria!=null&&o.criteria.length>0?{criteria:o.criteria.map((u,h)=>{if(u.cite.source_id!==c.source_id)throw new E("SOURCE_MISMATCH",`${o.temp_ref}.criteria[${h}]: cite source ${u.cite.source_id} != read_basis source ${c.source_id} (single-source)`);return{text:u.text,cite:{anchor:u.cite.anchor,quote:u.cite.quote}}})}:{},depends_on_hint:o.depends_on_hint,matches_existing:o.matches_existing,...o.conflicts_with!=null?{conflicts_with:o.conflicts_with}:{},...o.changed?{changed:!0}:{},...o.updated!=null?{updated:{...o.updated.title!=null?{title:o.updated.title}:{},...o.updated.description!=null?{description:o.updated.description}:{},...o.updated.summary!=null?{summary:o.updated.summary}:{},...o.updated.actors!=null?{actors:o.updated.actors}:{},...o.updated.value!=null?{value:o.updated.value}:{},...o.updated.risk!=null?{risk:o.updated.risk}:{},...o.updated.criteria!=null?{criteria:o.updated.criteria.map((u,h)=>{if(u.cite.source_id!==c.source_id)throw new E("SOURCE_MISMATCH",`${o.temp_ref}.updated.criteria[${h}]: cite source ${u.cite.source_id} != read_basis source ${c.source_id} (single-source)`);return{text:u.text,cite:{anchor:u.cite.anchor,quote:u.cite.quote}}})}:{}}}:{},...o.change_note!=null?{change_note:o.change_note}:{}}});return{version:1,read_basis:e,source:{source_id:c.source_id,source_cid:c.source_cid},use_cases:x}}function We(s){let{contextDir:e,graph:c}=s,x=s.maxDigestBytes??4096,o={},m=[];for(let[d,g]of c.heads){if(o[d]=g,typeof g!="string")continue;let _=c.mediaOf(g),w=c.getNode(g)?.content?.blob;if(typeof w=="string")if(_.format==="image")m.push({source_id:d,cid:g,format:"image",blobRef:{path:ee(e,w),cid:w}});else{let n=te(e,w)?.toString("utf8")??"";m.push({source_id:d,cid:g,format:_.format,text:n})}}m.sort((d,g)=>d.source_id<g.source_id?-1:1);let u=[];for(let d of c.byLabel(U.STYLENOTE).sort((g,_)=>g.cid<_.cid?-1:1))c.superseded.has(d.cid)||u.push(`\u2022 ${String(d.content.statement)} [${String(d.content.learned_from_kind)}]`);let h="";for(let d of u){if(Buffer.byteLength(h+d+`
|
|
3
|
+
`,"utf8")>x)break;h+=d+`
|
|
4
|
+
`}return{read_basis:o,sources:m,styleNoteDigest:h}}function ze(s,e){let c=We({contextDir:s,graph:e}).styleNoteDigest;return c.length>0?c:void 0}function ot(s){return s.length>8&&s[0]===137&&s[1]===80&&s[2]===78&&s[3]===71?"image/png":s.length>3&&s[0]===255&&s[1]===216&&s[2]===255?"image/jpeg":s.length>12&&s.toString("ascii",0,4)==="RIFF"&&s.toString("ascii",8,12)==="WEBP"?"image/webp":null}function it(s){return s.toString("utf8").replace(/\n$/,"").split(`
|
|
5
|
+
`).map((c,x)=>`${String(x+1).padStart(4,"0")}| ${c}`).join(`
|
|
6
|
+
`)}function Ve(s){return s.toISOString().replace(/[-:]/g,"").slice(0,15)}function nt(s){return s.startsWith("su-conv-")?`conv-${Re(Buffer.from(s,"utf8")).slice(0,8)}`:s}function Ke(s){return s.source_id.startsWith("su-conv-")?"the conversation":s.source_id}function at(s,e,c){return`reading ${Ke(s)}${c>1?` (source ${e} of ${c})`:""}`}function V(s){return s.toLowerCase().trim().replace(/\s+/g," ")}function Je(s,e){let c=new Map,x=new Map,o=new Map;for(let{cid:u,content:h}of e.byLabel(U.USECASE)){if(e.superseded.has(u))continue;(e.trust.get(u)==="archived"?o:x).set(V(String(h.title??"")),u)}let m=u=>e.trust.get(u)==="archived"?{cid:u,archived:!0,reason:e.archivedReason.get(u)}:{cid:u};for(let u of s.use_cases){if(u.matches_existing){let g=u.matches_existing.cid;if(e.superseded.has(g)){let _=e.tipOf(g);g=e.superseded.has(_)?null:_}if(g!==null){c.set(u.temp_ref,m(g));continue}}let h=x.get(V(u.title));if(h){c.set(u.temp_ref,{cid:h});continue}let d=o.get(V(u.title));d&&c.set(u.temp_ref,m(d))}return c}var Xe=/^(\S+)\.criteria\[(\d+)\]/;function ct(s,e,c){if(e.length===0||!e.every(o=>Xe.test(o.detail)))return!1;let x=new Map;for(let o of e){let m=Xe.exec(o.detail),u=x.get(m[1])??new Set;u.add(Number(m[2])),x.set(m[1],u)}for(let o of s.use_cases){let m=x.get(o.temp_ref);m?.size&&(o.criteria=(o.criteria??[]).filter((u,h)=>!m.has(h)),c(`${o.temp_ref}: dropped ${m.size} criteria with unverifiable cites \u2014 committed without them (criteria are hints, not oracles)`))}return!0}async function Ye(s,e,c,x,o=()=>{},m){let u=(h,d)=>o(h,d,s.session_id);return Te(s,e,c,x,o,{async onProposalEvent(h){let d=h,g=null,_=null;if(qe(d))try{g=Le(d,s.read_basis),u("adapter",{ok:!0,use_cases:g.use_cases.length})}catch(w){_=w instanceof E?w.message:String(w),u("adapter",{ok:!1,error:_})}else g=d;return g&&g.use_cases.length===0&&e.out("warning: the agent proposed ZERO use-cases for this source"),g&&m&&await m(g),{proposal:g,error:_}}})}var ut=new Set(["agent","ci","override"]);async function Ut(s,e){let c=s.mode??"interactive";if(c==="interactive"){if(!e.isTTY)return e.out("extract: --mode interactive needs a TTY (use --mode agent|ci|override headless)"),2}else if(!ut.has(c))return e.out(`extract: unknown mode "${c}" \u2014 interactive | agent | ci | override`),2;let x=Ve(e.now?.()??new Date),o=M(e.contextDir,"logs");he(o,{recursive:!0});let m=M(o,`extract-${x}.log`),u=`run-${x}-${Math.random().toString(36).slice(2,8)}`,h=t=>t==="error"||t==="failed_proposal"?"error":t==="repair_respawn"?"warn":"info",d=(t,a,l)=>{try{rt(m,JSON.stringify({ts:new Date().toISOString(),level:h(t),run_id:u,...l?{session_id:l}:{},kind:t,data:a})+`
|
|
7
|
+
`)}catch{}};e.out(`trace: ${fe(m)}`),e.emit?.({type:"run_start",mode:c,trace:m});let g=Ie();if(g&&e.out(g),e.preflightTurn){let t=await e.preflightTurn();if(d("preflight",t),!t.ok)return e.out(t.message??"error: turn-endpoint preflight failed"),e.emit?.({type:"error",message:t.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),2}let _=R(e.contextDir),w=ze(e.contextDir,_);if(s.source){if(s.resume){let a="error: --source cannot be combined with --resume (the resumed session already has its scope)";return e.out(a),e.emit?.({type:"error",message:a,code:"SOURCE_WITH_RESUME"}),2}let t=_.heads.get(s.source);if(typeof t!="string"){let a=t===null?`error: --source ${s.source} was ingested but is retired \u2014 re-ingest it to extract again`:`error: --source ${s.source} is not an ingested source (kane-cli context list shows them)`;return e.out(a),e.emit?.({type:"error",message:a,code:"SOURCE_UNKNOWN"}),2}}let n=null;if(s.resume){try{n=He(e.contextDir,s.resume,_)}catch(l){return e.out(`error: ${l instanceof Error?l.message:String(l)}`),e.emit?.({type:"error",message:`error: ${l instanceof Error?l.message:String(l)}`}),1}let t=n.handle.state.change_basis;if(t&&(_.heads.get(t.source_id)??null)!==t.new_head){let l=`error: ${t.source_id} moved while this reconcile extraction was paused \u2014 its recorded change context no longer matches; re-run kane-cli maintain reconcile against the current file (session ${s.resume} is defunct and can be ignored)`;return e.out(l),e.emit?.({type:"error",message:l,code:"CHANGE_BASIS_MOVED"}),n.handle.release(),2}n.staleBasis.length>0&&e.out(`note: changed since the pause: ${n.staleBasis.join(", ")} \u2014 re-presented items may be stale`);let a=n.handle.state.held_receipts??[];if(a.length>0)if(e.chat?.holdReceipt)for(let l of a)e.chat.holdReceipt(l);else e={...e,initialMessage:[a.join(`
|
|
8
|
+
|
|
9
|
+
`),e.initialMessage].filter(Boolean).join(`
|
|
10
|
+
|
|
11
|
+
`)};n.handle.state.assumed.length>0&&e.out(`note: ${n.handle.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${s.resume} lists them`)}let _e=_.extractedSourceCids,J=!!(s.force||n?.handle.state.force),v=[],P=[];for(let[t,a]of _.heads.entries())if(a!=null&&!(s.source&&t!==s.source)){if(!s.source&&!n&&t.startsWith("su-conv-")){e.out(`skipped: ${t} \u2014 conversation source (extract it explicitly with --source ${t})`),P.push({source_id:t,reason:"conversation"});continue}if(n){let l=t in n.handle.state.read_basis,I=n.handle.state.corpus_cursor.remaining.includes(t);if(!l&&!I)continue;if(I&&!J&&_e.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),P.push({source_id:t,reason:"cached"});continue}}else if(!J&&_e.has(a)){e.out(`cached: ${t} @ ${a.slice(0,19)} already extracted \u2014 skipping`),P.push({source_id:t,reason:"cached"});continue}v.push({source_id:t,cid:a})}let Qe=t=>{let a=Be(e.contextDir,t);a&&e.out(`note: a reconcile plan for ${t} is pending (${a.pending} item(s)) \u2014 resume with \`kane-cli maintain reconcile --apply ${a.path}\``)};for(let t of P)t.reason==="cached"&&Qe(t.source_id);if(e.emit?.({type:"corpus",sources:v,skipped:P}),v.length===0){if(n){let l=`error: resumed session's paused source (${Object.keys(n.handle.state.read_basis).join(", ")||"unknown"}) is no longer in the corpus \u2014 restore/re-ingest it and re-run --resume ${s.resume}, or discard with: kane-cli context sessions clean ${s.resume}`;return e.out(l),e.emit?.({type:"error",message:l,code:"SOURCE_MISSING"}),n.handle.release(),2}let t=P.length>0&&P.every(a=>a.reason==="conversation");return e.out(s.source?`extract: nothing to do \u2014 ${s.source} is already extracted at its current snapshot (--force to re-run)`:t?"extract: nothing to do \u2014 only conversation sources here (extract one explicitly with --source <id>)":"extract: nothing to do \u2014 every ingested source is already extracted"),0}let X=new Map;if(n&&n.questions.length>0&&!s.message){e.out(`re-presenting ${n.questions.length} unanswered question(s) from the paused session`);let t=await e.ask(n.questions.map(je));for(let a of t)X.set(a.id,a)}let H=e.by??{kind:"human",id:"owner"},A=c==="interactive"&&!s.plan&&!!e.chat,se=0,xe=0;try{for(let t of v){let a=R(e.contextDir),l={current:a};e.chat?.attachOnCommitted?.(r=>{l.current=r});let I=a.getNode(t.cid),G=String(I?.content.blob??""),oe=te(e.contextDir,G);if(!oe)return e.out(`error: ${t.source_id}: blob ${G} missing from .context/blobs`),e.emit?.({type:"error",source_id:t.source_id,message:`error: ${t.source_id}: blob ${G} missing from .context/blobs`,code:"BLOB_MISSING"}),1;let ve=a.mediaOf(t.cid),ie=ve.media_type.startsWith("image/");if(!ie){let r=ot(oe);if(r){e.out(`skipping ${t.source_id}: binary ${r} ingested before image support \u2014 re-ingest it (kane-cli context ingest) to extract from it`),e.emit?.({type:"source_skipped",source_id:t.source_id,reason:"binary_pre_media"});continue}}let q=ie?`0001| (image source ${t.source_id} \u2014 the content is attached as an image; cite it with anchor img#whole)`:it(oe),ye=Ve(e.now?.()??new Date),T=`${ye}-${t.source_id}`,$e=!!(n&&t.source_id in n.handle.state.read_basis)?s.resume:`ext-${ye}-${nt(t.source_id)}`,N="";if(A){let r=Ee({contextDir:e.contextDir,graph:R(e.contextDir),sessionStamp:$e,by:H});r.errors===null||r.errors[0]?.code==="CONV_SOURCE_EXISTS"?(N=r.sourceId,e.chat.attachConversationSource?.(N),l.current=R(e.contextDir)):e.out(`warning: conversation source unavailable (${r.errors[0]?.detail}) \u2014 chat adds will not land this session`)}let b={type:"run_config",version:1,session_id:$e,mode:c,source:{source_id:t.source_id,source_cid:t.cid,kind:st(t.source_id)||"md",numbered_text:q},existing_use_cases:a.byLabel(U.USECASE).filter(({cid:r})=>a.trust.get(r)!=="archived"&&!a.superseded.has(r)).map(({cid:r,content:i})=>({id:r,title:String(i.title??""),summary:String(i.summary??"")})),read_basis:l.current.latestHash,max_free_text_rounds:Me,graph_reads:!0,verb:"extract",...w!==void 0?{style_note_digest:w}:{},...s.changeContext&&s.changeContext.source_id===t.source_id?{change_context:s.changeContext}:{},topology:Fe(),...A?{chat:!0}:{},...ie?{image_sources:[{source_id:t.source_id,source_cid:t.cid,media_type:ve.media_type,blob_ref:{path:ee(e.contextDir,G),cid:G}}]}:{},...n&&t.source_id in n.handle.state.read_basis?{resume:{agent_state:n.handle.state.agent_state}}:{}};A||e.out(n&&t.source_id in n.handle.state.read_basis?`resuming: ${t.source_id} (session ${s.resume})`:`extracting: ${t.source_id} @ ${t.cid.slice(0,19)}`),e.emit?.({type:"source_start",source_id:t.source_id,cid:t.cid,index:v.indexOf(t)+1,total:v.length,resumed:!!(n&&t.source_id in n.handle.state.read_basis)}),e.chat?.ledger?.({kind:"banner",text:at(t,v.indexOf(t)+1,v.length)}),e.chat?.setWorking?.(`Reading ${Ke(t)}\u2026`);let be=new Map;d("spawn",{source_id:t.source_id,source_cid:t.cid,resume:!!n,chat:A},b.session_id);let Se=!1,Ze=async r=>{let i=z(r,q,R(e.contextDir));if(d("kane_validate",{errors:i.map(p=>p.code)},b.session_id),i.length>0){e.chat.submit("[auto-repair] the proposal failed validation: "+i.map(p=>`${p.code}: ${p.detail}`).join("; ")+" \u2014 please re-finalize with these fixed.");return}let y=R(e.contextDir),k=Je(r,y),Q=M(e.contextDir,"proposals",T);he(Q,{recursive:!0}),pe(M(Q,"proposal.json"),JSON.stringify(r,null,2)+`
|
|
12
|
+
`);let tt=new Map(r.use_cases.map(p=>[p.temp_ref,{resolution:"skipped"}])),Z=re({contextDir:e.contextDir,graph:y,proposal:r,proposalId:T,verdicts:tt,by:{kind:"ai",id:"extract-agent"},autoName:!0});if(Z.errors){e.chat.ledger?.({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:Z.errors.map(p=>`${p.code}: ${p.detail}`)});return}Se=!0;let B=Z.record.nodes.length;se+=B;let j=r.use_cases.length-B;{let p=R(e.contextDir),De=new Map;for(let{cid:$,content:C}of p.byLabel(U.USECASE))p.superseded.has($)||De.set(V(String(C.title??"")),$);let ge=[];for(let $ of r.use_cases){let C=null;if($.matches_existing?.cid&&p.hasNode($.matches_existing.cid)){let W=p.tipOf($.matches_existing.cid);C=p.superseded.has(W)?null:W}C=C??De.get(V($.title))??null,C&&ge.push({ref:$.temp_ref,cid:C})}ge.length>0&&e.chat.registerAliases?.(ge),l.current=p;let ke=$=>{for(let[C,W]of p.names)if(W===$&&!p.superseded.has(W))return C},Ce=Oe({verb:"extract",commitN:1,phase:"proposal",committed:Z.record.nodes.map($=>({cid:$.cid,...ke($.cid)?{logical_id:ke($.cid)}:{}})),reused:j},p);e.emit?.(Ce.event),e.chat.holdReceipt?.(Ce.text)}d("commit",{derived:B,evidence_matched:j,chat:!0},b.session_id),e.chat.ledger?.({kind:"commit",ok:!0,line:B===0&&j>0?`all ${j} matched existing \u2014 nothing new to save`:`saved ${B} use-case${B===1?"":"s"} as drafts`+(j>0?` \xB7 ${j} matched existing`:"")})},we=!!(n&&t.source_id in n.handle.state.read_basis),Y=we&&X.size>0?{...e,ask:async r=>r.every(i=>X.has(i.id))?(n.handle.markApplied(r.map(i=>`resolveq:${s.resume}:${i.id}`)),e.out(`answered ${r.length} re-asked question(s) from the held resume answers`),r.map(i=>X.get(i.id))):e.ask(r)}:e;we&&s.message&&(Y={...Y,initialMessage:s.message});let f=await Ye(b,{...Y,graphSlot:l},be,a,d,A?Ze:void 0);if(e.chat?.setWorking?.(null),f.error)return e.out(`error: agent failed for ${t.source_id}: ${f.error}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: agent failed for ${t.source_id}: ${f.error}`}),1;if(f.highRisk)return e.out(`error: ${f.highRisk.length} high-risk decision${f.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),e.emit?.({type:"error",source_id:t.source_id,message:`error: high-risk question(s) in ci mode (fail-closed): ${f.highRisk.map(r=>r.id).join(", ")}`,code:"HIGH_RISK_CI"}),1;if(f.paused){let r=v.slice(v.indexOf(t)+1).map(Q=>Q.source_id),i=n?.handle??Ne(e.contextDir,{sid:b.session_id,mode:"agent",created_at:(e.now?.()??new Date).toISOString(),expires_at:new Date((e.now?.()??new Date).getTime()+1440*60*1e3).toISOString(),agent_state:f.paused.agent_state,pending:{questions:[],proposals:[]},assumed:[],read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},conv_source:N,verb:"extract",...J?{force:!0}:{},...s.changeContext?{change_basis:{source_id:s.changeContext.source_id,new_head:s.changeContext.new_head}}:{}});N&&i.state.conv_source!==N&&i.save({conv_source:N});let y=e.chat?.drainHeldReceipts?.()??[];(y.length>0||(i.state.held_receipts?.length??0)>0)&&i.save({held_receipts:y}),n?.handle&&i.save({read_basis:{[t.source_id]:t.cid},corpus_cursor:{remaining:r},...J&&!i.state.force?{force:!0}:{}}),Ue(i,f.paused),d("session_paused",{sid:i.state.sid},b.session_id);let k=`kane-cli context extract --resume ${i.state.sid} --mode ${c}`;return e.out(`paused: session ${i.state.sid} saved \u2014 resume with: ${k}`),e.emit?.({type:"session_paused",sid:i.state.sid,source_id:t.source_id,mode:c,resume:k,expires_at:i.state.expires_at,pending_questions:f.paused.pending.questions}),e.chat?.ledger?.({kind:"pause",sid:i.state.sid,expires_at:i.state.expires_at,resume:k,messageForm:`${k} --message "<your words>"`}),3}if(A){if(xe+=f.assumedDefaults??0,f.error)return 1;if(!Se){let r=v.length-v.indexOf(t)-1;return e.out(`done \u2014 nothing committed for ${t.source_id} (no finalize before the session ended)`+(r>0?`; stopping here \u2014 ${r} remaining source(s) not extracted (re-run kane-cli context extract to continue)`:"")),n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),n=null),0}n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),n=null);continue}if(!f.proposal)return e.out(`error: agent ended without a proposal for ${t.source_id}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: agent ended without a proposal for ${t.source_id}`}),1;let D=z(f.proposal,q,a);if(d("kane_validate",{errors:D.map(r=>r.code)},b.session_id),D.length>0&&ct(f.proposal,D,r=>e.out(r))&&(d("criteria_dropped",{source_id:t.source_id},b.session_id),D=z(f.proposal,q,a)),D.length>0){if(e.out("the agent's proposal didn't validate \u2014 retrying once"),e.emit?.({type:"validate_failed",source_id:t.source_id,codes:D.map(r=>r.code),repairing:!0}),d("repair_respawn",{source_id:t.source_id},b.session_id),f=await Ye(b,{...Y,graphSlot:l},be,a,d),f.error||!f.proposal)return e.out(`error: repair run failed for ${t.source_id}`),e.emit?.({type:"error",source_id:t.source_id,message:`error: repair run failed for ${t.source_id}`}),1;if(D=z(f.proposal,q,a),D.length>0){for(let r of D)e.out(` ${r.detail}`);return e.emit?.({type:"validate_failed",source_id:t.source_id,codes:D.map(r=>r.code),repairing:!1}),e.emit?.({type:"error",source_id:t.source_id,message:`error: proposal failed validation after repair (${D.map(r=>r.code).join(", ")})`}),1}}let S=f.proposal,K=Je(S,a),ne=M(e.contextDir,"proposals",T);if(he(ne,{recursive:!0}),pe(M(ne,"proposal.json"),JSON.stringify(S,null,2)+`
|
|
13
|
+
`),s.plan){e.out(`plan: ${S.use_cases.length} use-case(s) proposed from ${t.source_id} (nothing committed)`);for(let r of S.use_cases){let i=K.get(r.temp_ref),y=i?i.archived?` \u2248 matches ARCHIVED ${i.cid.slice(0,19)}${i.reason?` \u2014 previously rejected: "${i.reason}"`:" \u2014 previously rejected"}`:` \u2248 matches ${i.cid.slice(0,19)}`:"";e.out(` [${r.risk}] ${r.title} \u2014 cite ${r.cite.anchor}${y}`)}e.emit?.({type:"plan",source_id:t.source_id,use_cases:S.use_cases.map(r=>{let i=K.get(r.temp_ref);return{risk:r.risk,title:r.title,anchor:r.cite.anchor,...i?{match:i.cid,match_archived:!!i.archived}:{}}})}),f.assumedDefaults&&e.out(`assumed: ${f.assumedDefaults} default(s) auto-taken (flagged)`);continue}for(let r of S.use_cases){if(!r.conflicts_with?.length)continue;let i=r.conflicts_with.filter(k=>a.resolve(k)!==null),y=r.conflicts_with.filter(k=>a.resolve(k)===null);y.length>0&&(e.out(`note: ${r.temp_ref}: dropped unresolvable conflict hint(s): ${y.join(", ")}`),r.conflicts_with=i.length>0?i:void 0)}d("review_start",{use_cases:S.use_cases.length,flags:K.size},b.session_id);let L=await e.review(S.use_cases,K);d("review_verdicts",[...L.entries()].map(([r,i])=>({ref:r,resolution:i.resolution})),b.session_id),pe(M(ne,"review.json"),JSON.stringify(S.use_cases.map(r=>{let i=L.get(r.temp_ref)??{resolution:"skipped"};return{id:r.temp_ref,kind:"review-item",resolution:i.resolution,edit:i.edit??null,reason:i.reason??null,...i.supersedeTarget?{supersede_target:i.supersedeTarget}:{},by:H}}),null,2)+`
|
|
14
|
+
`);let ae=a,O=re({contextDir:e.contextDir,graph:ae,proposal:S,proposalId:T,verdicts:L,by:H,autoName:!0});if(O.errors&&O.errors[0]?.code==="STALE_BASIS"){if(!await e.confirmStale(`the context changed while you reviewed (${O.errors[0].detail}) \u2014 commit against the new head anyway?`))return e.out("aborted: proposal not committed"),e.emit?.({type:"error",source_id:t.source_id,message:"aborted: proposal not committed",code:"STALE_BASIS"}),e.emit?.({type:"done",status:"aborted",exit_code:1}),1;ae=R(e.contextDir),O=re({contextDir:e.contextDir,graph:ae,proposal:S,proposalId:T,verdicts:L,by:H,allowStaleBasis:!0,autoName:!0})}if(O.errors){for(let r of O.errors)e.out(` ${r.detail}`);return e.emit?.({type:"error",source_id:t.source_id,message:`error: commit failed: ${O.errors.map(r=>`${r.code}: ${r.detail}`).join("; ")}`}),1}let et=new Date().toISOString();for(let r of S.use_cases){let i=L.get(r.temp_ref)??{resolution:"skipped"};for(let y of Ae({ts:et,command:"context extract",id:r.temp_ref,by:H},i.resolution))Pe(e.contextDir,y)}let F=O.record,ce=new Map(F.review.map(r=>[r.id,r.resolution])),ue=[...ce.values()].filter(r=>r==="approved"||r==="edited").length,de=[...ce.values()].filter(r=>r==="rejected").length,le=F.nodes.filter(r=>!ce.has(r.cid)).length,me=F.supersessions.filter(r=>r.kind==="node"&&r.new!==r.old).length;d("commit",{trusted:ue,derived:le,archived:de},b.session_id),e.out(`committed: ${ue} trusted, ${le} derived (queued), ${de} archived`+(me>0?`, ${me} superseded`:"")),f.assumedDefaults&&e.out(`assumed: ${f.assumedDefaults} default(s) auto-taken (flagged)`),e.emit?.({type:"commit",source_id:t.source_id,proposal_id:T,trusted:ue,derived:le,archived:de,superseded:me,assumed:f.assumedDefaults??0,evidence_matched:Math.max(0,S.use_cases.length-F.nodes.length),minted:F.nodes.map(r=>{let i=F.names?.find(y=>y.cid===r.cid)?.slug;return{cid:r.cid,...i?{logical_id:i}:{}}})}),n&&t.source_id in n.handle.state.read_basis&&(n.handle.complete(),e.out(`session ${s.resume} complete`),e.emit?.({type:"session_complete",sid:s.resume,source_id:t.source_id}),n=null)}}finally{n?.handle.release()}if(A){let t=e.chat?.state.ledger.filter(I=>I.kind==="answer"&&I.receipt.form==="assumed").length??0,a=xe+t,l=e.chat?.state.credits?.total;e.chat?.ledger?.({kind:"summary",lines:[`saved ${se} use-case${se===1?"":"s"} across ${v.length} source${v.length===1?"":"s"}`,...a>0?[`${a} assumed default(s)`]:[],...l!==void 0?[`credits used: ${l.toFixed(1)}`]:[],`trace: ${fe(m)}`]})}return s.plan||Ge(e.contextDir),0}export{nt as a,Ke as b,at as c,Je as d,Ut as e};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as J}from"./chunk-
|
|
2
|
+
import{b as J}from"./chunk-E3BO7OVR.js";import{e as H,g as P}from"./chunk-M5JQXOCE.js";import{a as ce}from"./chunk-6YGTRKDT.js";import{e as ue}from"./chunk-UR6MHSHU.js";var u=ue(ce(),1);function $(p,r){let f=null,R=(b,j)=>{for(let S=0;S<b.length;S++){let y=b[S],l=[...j,S];r(y)&&(f===null||l.length>f.length)&&(f=l),y.children&&y.children.length>0&&R(y.children,l)}};return R(p,[]),f}function T(p,r,f){if(r.length===0)return[...p];let R=r[0],b=[...p],j=b[R];if(r.length===1)b[R]=f(j);else{let S=r.slice(1),y=T(j.children??[],S,f);b[R]={...j,children:y}}return b}function K(){return{steps:[],maxOrdinal:0}}function le(p,r){if(r.type==="run_start"&&r.environment?.resolution)return{...p,resolution:r.environment.resolution};if(r.type==="step_end"&&typeof r.ordinal=="number"&&r.id){let f={id:r.id,ordinal:r.ordinal,status:r.status,...r.kind?{kind:r.kind}:{},...typeof r.duration=="number"?{duration_ms:Math.round(r.duration*1e3)}:{},...typeof r.action_id=="string"&&r.action_id?{action_id:r.action_id}:{}};return{...p,steps:[...p.steps,f],maxOrdinal:Math.max(p.maxOrdinal,r.ordinal)}}return p}function D(p){let r=p.indexOf(": ");return r>0&&r<15?p.slice(r+2):p}function W(p){return p.map(r=>{let f=r.children?W(r.children):r.children;return r.status==="running"?{...r,status:"stopped",phase:void 0,children:f}:f!==r.children?{...r,children:f}:r})}function Se(p,r,f,R,b){let[j,S]=(0,u.useState)(!1),[y,l]=(0,u.useState)([]),[Q,B]=(0,u.useState)(null),[X,F]=(0,u.useState)(null),[Y,w]=(0,u.useState)(null),[Z,L]=(0,u.useState)(null),[ee,q]=(0,u.useState)([]),[ne,G]=(0,u.useState)(null),[te,ie]=(0,u.useState)(void 0),m=(0,u.useRef)(null),x=(0,u.useRef)(null),_=(0,u.useRef)(0),A=(0,u.useRef)(!1),O=(0,u.useRef)(K()),re=(0,u.useCallback)(async(I,V)=>{let z=m.current;if(z){try{await z.exited}catch{}m.current=null}l([]),B(null),F(null),w(null),L(null),q([]),G(null),ie(I.max_steps),S(!0),x.current=null,_.current=0,O.current=K();let h;try{h=J(I,V)}catch(E){w(E instanceof Error?E.message:String(E)),S(!1);return}m.current=h,H("runner",()=>h.cancel()),(async()=>{A.current=!1;let E=!1;for await(let e of h.events){if(A.current)break;switch(O.current=le(O.current,e),e.type){case"run_start":if(e.child_id)break;if(x.current&&!x.current.isSingleFlow){let o=_.current;_.current++,l(d=>d.map((i,s)=>s===o?{...i,status:"running"}:i.status==="running"&&!i.children?.some(n=>n.status==="running")?{...i,status:i.children?.some(n=>n.status==="failed")?"failed":"passed"}:i))}break;case"bifurcation":{let o=e.flows??[],d=e.count??o.length,i={flows:o,isSingleFlow:e.is_single_flow??d<=1};L(i),x.current=i,_.current=0,l(o.map((s,n)=>({index:n+1,objective:s??`Flow ${n+1}`,status:"pending"})));break}case"step_start":{r?.("STEP_START",`Step ${e.index} started`,{index:e.index,objective:e.objective,child_id:e.child_id});let o=e.index,d=e.objective??`Step ${o}`,i=e.child_id,s=x.current&&!x.current.isSingleFlow;if(i)l(n=>{let t=$(n,a=>a.branchChildId===i)??$(n,a=>a.status==="running");return t?T(n,t,a=>{let c=(a.children??[]).map(g=>g.status==="running"&&g.childId===i?{...g,status:"stopped",phase:void 0}:g);return c.push({index:o,objective:d,status:"running",childId:i}),{...a,children:c}}):n});else if(s){let n=Math.max(0,_.current-1);l(t=>{let a=[...t];if(n>=a.length)return t;let c={...a[n]},k=[...c.children??[]].map(U=>U.status==="running"&&U.childId===void 0?{...U,status:"stopped",phase:void 0}:U);return k.push({index:o,objective:d,status:"running"}),c.children=k,c.status="running",a[n]=c,a})}else l(n=>{let t=W(n);return t.some(c=>c.index===o)?t.map(c=>c.index===o?{...c,status:"running",objective:d}:c):[...t,{index:o,objective:d,status:"running"}]});break}case"step_event":{r?.("STEP_EVENT",`Step ${e.index} ${e.event}`,{index:e.index,phase:e.event,action_type:e.action_type,detail:e.detail,child_id:e.child_id});let o=e.child_id,d=x.current&&!x.current.isSingleFlow;if(e.event==="cm_init"&&e.checkpoint_count!=null){q(i=>[...i,e.checkpoint_count]);break}if(e.event==="replay_started"){G({recordingLength:e.recording_length??0});break}if(e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&f?.(e.detail),o){let i=n=>{if(n.index!==e.index||n.childId!==o)return n;let t={phase:e.event};return e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&(t.objective=e.detail),e.action_type&&(t.actionType=e.action_type),{...n,...t}},s=n=>n.map(t=>{let a=i(t);return a!==t?a:t.children&&t.children.length>0?{...t,children:s(t.children)}:t});l(n=>n.map(t=>t.children?{...t,children:s(t.children)}:t))}else if(d){let i=Math.max(0,_.current-1);l(s=>{let n=[...s];if(i>=n.length)return s;let t={...n[i]},a=[...t.children??[]];if(!a.some(g=>g.index===e.index&&g.childId===void 0))a.push({index:e.index,objective:`Step ${e.index}`,status:"running",phase:e.event,actionType:e.action_type});else for(let g=0;g<a.length;g++){if(a[g].index!==e.index||a[g].childId!==void 0)continue;let k={phase:e.event};e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&(k.objective=e.detail),e.action_type&&(k.actionType=e.action_type),a[g]={...a[g],...k}}return t.children=a,n[i]=t,n})}else l(i=>i.some(n=>n.index===e.index)?i.map(n=>{if(n.index!==e.index)return n;let t={phase:e.event};return e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&(t.objective=e.detail),e.action_type&&(t.actionType=e.action_type),{...n,...t}}):[...W(i),{index:e.index,objective:`Step ${e.index}`,status:"running",phase:e.event,actionType:e.action_type}]);break}case"step_end":{r?.("STEP_END",`Step ${e.index} ${e.status}`,{index:e.index,status:e.status,duration:e.duration,summary:e.summary,child_id:e.child_id}),R?.();let o=e.child_id,d=x.current&&!x.current.isSingleFlow;if(o){let i=n=>n.index===e.index&&n.childId===o?{...n,status:e.status,duration:e.duration,phase:void 0,objective:n.objective.startsWith("Step ")?D(e.summary||n.objective):n.objective}:n,s=n=>n.map(t=>{let a=i(t);return a!==t?a:t.children&&t.children.length>0?{...t,children:s(t.children)}:t});l(n=>n.map(t=>t.children?{...t,children:s(t.children)}:t))}else if(d){let i=Math.max(0,_.current-1);l(s=>{let n=[...s];if(i>=n.length)return s;let t={...n[i]},a=(t.children??[]).map(c=>c.index===e.index&&c.childId===void 0?{...c,status:e.status,duration:e.duration,phase:void 0,objective:c.objective.startsWith("Step ")?D(e.summary||c.objective):c.objective}:c);return t.children=a,n[i]=t,n})}else l(i=>i.map(s=>s.index===e.index?{...s,status:e.status,duration:e.duration,phase:void 0,objective:s.objective.startsWith("Step ")?D(e.summary||s.objective):s.objective}:s));{let s=x.current&&!x.current.isSingleFlow?Math.max(0,_.current-1):0,n=typeof e.ordinal=="number"&&e.id?{ordinal:e.ordinal,id:e.id}:void 0;p?.(e.index,s,e.child_id,n)}break}case"child_agent_start":{let o=e.objective??"",d=e.child_id;l(i=>{let s=$(i,n=>n.status==="running");return s?T(i,s,n=>({...n,objective:`${o} (branch)`,phase:`child: ${o.slice(0,50)}`,branchObjective:o,branchChildId:d})):i});break}case"child_agent_end":{let o=e.child_id,d=`child ${e.success?"done":"failed"}`;l(i=>{let s=$(i,n=>n.branchChildId===o);return s?T(i,s,n=>({...n,phase:d})):i.map(n=>n.phase?.startsWith("child:")?{...n,phase:d}:n)});break}case"describe_trigger":b?.(e);break;case"ask_user":B(e.question??"");break;case"run_end":l(o=>o.map(d=>d.status==="running"?{...d,status:e.status,phase:void 0}:d)),S(!1),F(e),E=!0;break;case"error":S(!1),w(e.message??"Runner error"),l(o=>o.map(d=>d.status==="running"?{...d,status:"failed",phase:void 0}:d));break}}let{code:v,signal:M}=await h.exited,N=h.stderr,de=v===0&&!M,C=[];v!==null&&v!==0&&C.push(`Runner exited with code ${v}`),M&&C.push(`Runner killed by signal ${M}`),N&&(!de||!E?C.push(N):V?.log?.("debug","RUNNER_STDERR_BENIGN","Runner stderr on clean exit",{stderr:N})),m.current===h&&(C.length>0&&w(C.join(`
|
|
3
3
|
`)),S(!1),P("runner","Event stream ended"),m.current=null)})().catch(E=>{let v=[`Runner event loop error: ${E}`];h.exitCode!==null&&h.exitCode!==0&&v.push(`Exit code: ${h.exitCode}`),h.exitSignal&&v.push(`Signal: ${h.exitSignal}`),h.stderr&&v.push(h.stderr),m.current===h&&(w(v.join(`
|
|
4
4
|
`)),S(!1),P("runner","Event loop error"),m.current=null)})},[p,r,f,R,b]),se=(0,u.useCallback)(I=>{m.current?.sendUserResponse(I),B(null)},[]),ae=(0,u.useCallback)(()=>{let I=m.current;I&&(I.sendCancel("user"),S(!1),B(null),setTimeout(()=>{m.current===I&&(P("runner","User cancelled run"),m.current=null)},5e3))},[]),oe=(0,u.useCallback)(()=>{l([]),F(null),w(null)},[]);return(0,u.useEffect)(()=>()=>{A.current=!0,P("runner","Component unmounted"),m.current=null},[]),{isRunning:j,steps:y,askingUser:Q,lastRunEnd:X,runError:Y,bifurcationInfo:Z,cmInitCounts:ee,replayInfo:ne,maxSteps:te,startRun:re,sendAnswer:se,cancelRun:ae,clearLastRun:oe,getEvidenceState:()=>O.current}}export{K as a,le as b,Se as c};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as O}from"./chunk-3C5GMAM4.js";import{a as S,b as A,d as P}from"./chunk-GRB66C5S.js";import{a as U}from"./chunk-JFAFKHDX.js";import{a as G}from"./chunk-QPZRHAYK.js";import{d as T}from"./chunk-2PQXEEVY.js";import{a as E,b as $}from"./chunk-MCQXRJGH.js";import{d as g,e as m}from"./chunk-5YPBPZUR.js";var v=(e,t,n=new Set)=>{let o=e.nameOf.get(t);if(o!==void 0)return o;if(n.has(t))return t;n.add(t);for(let[s,r]of e.superseded){if(r!==t)continue;let c=v(e,s,n);if(c!==s)return c}return t};function M(e,t){let n=e.stale(t);if(n==="fresh")return;if(n==="orphaned")return"orphaned \u2014 no live source evidences this item";let o=[],s=new Map;for(let r of e.derivesInto(t))s.set(String(r.props.source_id),r);for(let[r,c]of s){let i=e.heads.get(r);if(i==null||i===c.props.source_cid)continue;let u=e.convChains.get(r)?.chain;u&&u.includes(String(c.props.source_cid))||o.push(`DERIVES pin ${r}@${String(c.props.source_cid).slice(0,19)} broke \u2014 the source head moved`)}for(let r of e.edgesFrom(t)){if(r.type===m.DERIVES||!e.superseded.has(r.dst))continue;let c=e.tipOf(r.dst);if(e.superseded.has(c)){o.push(`${r.type} pin \u2192 ${v(e,r.dst)} \u2014 target retired`);continue}let i=L(e,r.dst,c);o.push(i.length>0?`${v(e,r.dst)} updated: ${i.map(u=>u.field).join(", ")}`:`${r.type} pin \u2192 ${v(e,r.dst)} \u2014 target superseded`)}return o.length>0?o.join("; "):"stale \u2014 a pinned dependency moved"}function L(e,t,n){let o=e.getNode(t)?.content??{},s=e.getNode(n)?.content??{},r=i=>i===void 0?"":Array.isArray(i)?i.map(String).join(" \xB7 "):typeof i=="object"?JSON.stringify(i):String(i),c=[];for(let i of[...new Set([...Object.keys(o),...Object.keys(s)])].sort())JSON.stringify(o[i])!==JSON.stringify(s[i])&&c.push({field:i,old:r(o[i]),new:r(s[i])});return c}function V(e,t){let n=[];for(let{cid:o}of e.byLabel(g.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 R(e,t){let n=[],o=[],s=[],r=V(e,t),c=new Set(r),i=(u,f)=>{let d=M(e,f);return d===void 0?u:{...u,stale:!0,stale_reason:d}};for(let u of r){let f=e.getNode(u)?.content??{};n.push(i({ref:v(e,u),title:String(f.title??""),case_type:String(f.case_type??""),intent:String(f.intent??"")},u));for(let d of e.edgesInto(u)){if(d.type!==m.AUTOMATES||e.superseded.has(d.src))continue;let a=e.getNode(d.src)?.content??{},l=e.edgesFrom(d.src).filter(p=>p.type===m.VERIFIES&&!e.superseded.has(p.dst)).map(p=>v(e,p.dst));o.push(i({ref:v(e,d.src),title:String(a.title??""),check:a.check,verifies:l},d.src))}}for(let{cid:u}of e.byLabel(g.AC)){if(e.superseded.has(u))continue;let f=e.edgesFrom(u).find(p=>p.type===m.SCOPED_TO);if(!f)continue;let d=e.tipOf(f.dst);if(!(d===t||c.has(d)))continue;let l=e.getNode(u)?.content??{};s.push(i({ref:v(e,u),text:String(l.text??""),kind:String(l.kind??""),scope:d===t?"use-case":v(e,d)},u))}return{scenarios:n,tests:o,acs:s}}function I(e,t,n){let o=t.getNode(n)?.content.blob;if(typeof o!="string")return null;let s=T(e,o);return s===null?null:s.toString("utf8")}function q(e,t){let n=t.split(`
|
|
3
|
+
`).map(s=>s.replace(/^\d+\| /,"")),o=[];for(let s of e.split(`
|
|
4
|
+
`)){let r=s.trim();if(r.length===0)continue;let c=n.find(i=>i.includes(r));c!==void 0&&!o.includes(c.trim())&&o.push(c.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,...R(t,n).acs.map(u=>t.resolve(u.ref)?.cid??"")].filter(Boolean),r=[],c=new Set;for(let u of s){let f=new Map;for(let d of t.derivesInto(u))f.set(String(d.props.source_id),d);for(let[d,a]of f){let l=t.heads.get(d);if(l==null||l===a.props.source_cid)continue;let p=String(a.props.anchor),b=`${d}\0${p}`;if(c.has(b)||p==="img#whole")continue;c.add(b);let k=I(e,t,String(a.props.source_cid)),w=k===null?null:G(k,p);if(w===null)continue;let x=I(e,t,l);r.push({source_id:d,anchor:p,old_anchor_text:w,new_anchor_text:x===null?{removed:!0}:q(w,x)})}}let i;for(let[u,f]of t.superseded){if(f!==n||t.nodeLabel.get(u)!==g.USECASE)continue;let d=L(t,u,n);d.length>0&&(i=d);break}return{kind:"source-change",changes:r,...i?{uc_updated:i}:{}}}function N(e,t,n,o){let s=R(t,n);if(s.scenarios.length===0&&s.tests.length===0&&s.acs.length===0)return;let r=J(e,t,n,o);if(!(r.kind==="source-change"&&r.changes.length===0&&!r.uc_updated))return{prior_design:s,change_delta:r}}var _=new Set([g.USECASE,g.SCENARIO,g.AC,g.TEST]);function h(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function y(e,t,n){let o=e.edgesFrom(t).find(s=>s.type===n);return o?e.tipOf(o.dst):null}function D(e,t,n){if(n===g.USECASE)return t;if(n===g.SCENARIO)return y(e,t,m.BELONGS_TO);if(n===g.AC){let o=y(e,t,m.SCOPED_TO);return o?e.nodeLabel.get(o)===g.USECASE?o:y(e,o,m.BELONGS_TO):null}if(n===g.TEST){let o=y(e,t,m.AUTOMATES);return o?y(e,o,m.BELONGS_TO):null}return null}function j(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 B(e,t){return{ucTip:t,display:j(e,t),seamRef:e.nameOf.get(t)??t}}function Y(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 r=D(e,o,s);return!r||e.nodeLabel.get(r)!==g.USECASE?{ok:!1,message:`cannot resolve '${t}' to a parent use-case \u2014 its ${s} chain is broken`}:e.superseded.has(r)?{ok:!1,message:`use-case ${j(e,r)} was removed \u2014 nothing to evolve`}:{ok:!0,target:B(e,r)}}function de(e,t){return C(e,t)}function C(e,t){let n=[];for(let{cid:s}of e.byLabel(g.SCENARIO)){if(!h(e,s)||!e.edgesFrom(s).some(c=>c.type===m.BELONGS_TO&&e.tipOf(c.dst)===t))continue;let r=e.edgesInto(s).filter(c=>c.type===m.AUTOMATES&&h(e,c.src));if(r.length===0)n.push({scenario:s,test:null});else for(let c of r)n.push({scenario:s,test:c.src})}let o=new Map;for(let{cid:s}of e.byLabel(g.AC)){if(!h(e,s)||D(e,s,g.AC)!==t)continue;let r=e.edgesInto(s).filter(c=>c.type===m.VERIFIES&&h(e,c.src)).map(c=>c.src).sort();o.set(s,r)}return{pairs:n,verifies:o}}function H(e,t){let n=c=>`${c.scenario}\0${c.test??""}`,o=new Set(e.pairs.map(n)),s=new Set(t.pairs.map(n)),r=[];for(let[c,i]of e.verifies){let u=t.verifies.get(c);u&&(i.length===u.length&&i.every((f,d)=>f===u[d])||r.push({ac:c,before:i,after:u}))}return{superseded:e.pairs.filter(c=>!s.has(n(c))),minted:t.pairs.filter(c=>!o.has(n(c))),retained:t.pairs.filter(c=>o.has(n(c))),moves:r}}function z(e,t,n,o,s){let r=i=>t.nameOf.get(i)??i,c=i=>` - ${r(i.scenario)} \xB7 ${i.test?r(i.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 i of s.superseded)e.out(c(i));e.out(`minted: ${s.minted.length} pair(s)`);for(let i of s.minted)e.out(c(i));e.out(`retained: ${s.retained.length} pair(s)`);for(let i of s.retained)e.out(c(i));if(s.moves.length===0)e.out("verifies moves: none");else{e.out("verifies moves:");for(let i of s.moves){let u=f=>f.length>0?f.map(r).join(" + "):"(none)";e.out(` - ${r(i.ac)}: ${u(i.before)} \u2192 ${u(i.after)}`)}}}async function F(e,t,n,o,s,r){let c=E(e),i=O(c,t.ucTip);if(!i)return r==="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"}):(S(o,`nothing to evolve \u2014 run kane-cli design tests --use-case ${t.display} first (no design output)`),{code:2,outcome:"no-design"});let u=C(c,t.ucTip),f=`evolve re-designs the parent use-case ${t.display}; ${u.pairs.length} pair(s) affected`;if(n.yes)o.out(f);else if(!await o.confirm(`${f} \u2014 proceed?`))return o.out(r==="batch"?`skipped ${t.display}`:"declined \u2014 nothing evolved"),{code:0,outcome:"declined"};let d=N(e,c,t.ucTip,n.because),a=await s(t.seamRef,{yes:!!n.yes,...n.mode?{mode:n.mode}:{},...n.because?{because:n.because}:{},...d!==void 0?{changeDelta:d.change_delta,priorDesign:d.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 S(o,`design run for ${t.display} ended with exit code ${a} \u2014 no diff to report`),{code:a,outcome:"failed"};let l=E(e),p=l.tipOf(t.ucTip),b=O(l,p)?.seq;return z(o,l,t.display,{before:i.seq,after:b??"?"},H(u,C(l,p))),{code:0,outcome:"evolved"}}function K(e){let t=new Map,n=0;for(let{cid:s,state:r}of e.staleList()){if(r==="superseded")continue;let c=e.nodeLabel.get(s);if(!c||!_.has(c)||!h(e,s)||!$(e,s))continue;let i=D(e,s,c);!i||e.nodeLabel.get(i)!==g.USECASE||e.superseded.has(i)||(n++,t.has(i)||t.set(i,B(e,i)))}return{targets:[...t.values()].sort((s,r)=>s.display<r.display?-1:s.display>r.display?1:0),staleCount:n}}function Q(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)||!h(e,n))&&$(e,n)&&D(e,n,s)===t)return!0}return!1}async function W(e,t,n,o={},s=process.cwd()){if(e&&t.fromStale)return S(n,"pass a <ref> OR --from-stale, not both"),2;if(!e&&!t.fromStale)return S(n,"evolve needs a <ref> or --from-stale"),2;let r=A(s,n);if(!r)return 2;let c=o.runDesignForUc??X;n.out(`evolving ${e??"stale use-cases"}: reading the graph\u2026`);let i=E(r),u,f=null;if(e){let a=Y(i,e);if(!a.ok)return S(n,a.message),2;if(!t.because&&O(i,a.target.ucTip)&&!Q(i,a.target.ucTip))return S(n,`nothing changed underneath ${e} \u2014 its sources and requirements are current; use --because "<reason>" to re-design anyway`),2;u=[a.target]}else{let{targets:a,staleCount:l}=K(i);if(a.length===0)return n.out("nothing stale \u2014 nothing to evolve"),0;f=`from-stale: ${l} stale node(s) \u2192 ${a.length} use-case(s)`,u=a}if(!t.yes&&!n.isTTY)return S(n,"evolve needs a TTY \u2014 the blast-radius confirm is the point; headless evolution rides `kane-cli maintain reconcile`"),2;if(f&&n.out(f),e){let a=await F(r,u[0],t,n,c,"single");return a.outcome==="evolved"&&t.because&&U(r,{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 d=0;for(let a of u){let{code:l}=await F(r,a,t,n,c,"batch");l!==0&&d===0&&(d=l)}return d}var X=async(e,t)=>{let{designTestsCommand:n}=await import("./bind-BWILBZGR.js"),o=()=>n({useCase:e,force:!0,...t.mode?{mode:t.mode}:t.yes?{mode:"override"}:{},...t.because?{because:t.because}:{},...t.changeDelta!==void 0?{changeDelta:t.changeDelta}:{},...t.priorDesign!==void 0?{priorDesign:t.priorDesign}:{}});if(t.mode!=="agent")return o();let s=process.stdout.write;process.stdout.write=((...r)=>!0);try{return await o()}finally{process.stdout.write=s}};async function ae(e,t){return W(e,t,P(),{})}export{Y as a,de as b,F as c,K as d,W as e,X as f,ae as g};
|
|
@@ -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-QNNBNIR7.js";import{e as P,f as R}from"./chunk-M5JQXOCE.js";import{x as s}from"./chunk-HJGUEZLW.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,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-3C5GMAM4.js";import{a as me,b as Te,c as Oe,d as Ie,g as Ne,h as je}from"./chunk-DXK55KGR.js";import{a as qe,b as Fe,g as Be,h as Pe}from"./chunk-FXPPQL4D.js";import{a as Ae}from"./chunk-RE3BZVGE.js";import{b as Re,c as De}from"./chunk-WIA7TPK3.js";import{c as Ce}from"./chunk-6GTOYTCQ.js";import{a as Le}from"./chunk-6AYUSR7X.js";import{b as _e,c as be,d as ye,e as ee,f as J,g as re,h as ve,i as le}from"./chunk-FJTWJ243.js";import{a as de}from"./chunk-L5LI2JF4.js";import{a as Y}from"./chunk-MCQXRJGH.js";import{a as xe,b as ue}from"./chunk-ZZLR3O5A.js";import{e as $e,g as Ee}from"./chunk-ZG2V2ODK.js";import{d as S,e as E,f as we,g as Se,h as ke}from"./chunk-5YPBPZUR.js";import{mkdirSync as Et,appendFileSync as Rt}from"fs";import{randomBytes as Dt}from"crypto";import{join as ct}from"path";import{existsSync as ge,readFileSync as pe,readdirSync as dt}from"fs";import{join as te}from"path";var ze=`
|
|
3
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{c as g}from"./chunk-
|
|
2
|
+
import{c as g}from"./chunk-HJGUEZLW.js";import{readFileSync as o,writeFileSync as h,mkdirSync as u,readdirSync as a,unlinkSync as s,existsSync as l,chmodSync as f}from"fs";import{join as n,dirname as P}from"path";var d=class{baseDir;profilesDir;configFile;constructor(t=g){this.baseDir=t,this.profilesDir=n(t,"profiles"),this.configFile=n(t,"config.json")}readConfig(){try{return JSON.parse(o(this.configFile,"utf-8"))}catch{return{}}}writeConfig(t){u(this.baseDir,{recursive:!0,mode:448}),h(this.configFile,JSON.stringify(t,null,2)+`
|
|
3
3
|
`),f(this.configFile,384)}getActiveProfile(){return this.readConfig().active_profile??null}setActiveProfile(t){let i=this.readConfig();i.active_profile=t,this.writeConfig(i)}getDefaultEnv(){return this.readConfig().default_env??"prod"}setDefaultEnv(t){let i=this.readConfig();i.default_env=t,this.writeConfig(i)}credentialsPath(t,i){return n(this.profilesDir,t,i,"credentials")}clientPath(t,i){return n(this.profilesDir,t,i,"client.json")}basicAuthPath(t,i){return n(this.profilesDir,t,i,"basic-auth")}profileConfigPath(t,i){return n(this.profilesDir,t,i,"profile-config.json")}saveProfileConfig(t,i,r){let e=this.loadProfileConfig(t,i)??{};this.writeSecure(this.profileConfigPath(t,i),{...e,...r})}loadProfileConfig(t,i){try{return JSON.parse(o(this.profileConfigPath(t,i),"utf-8"))}catch{return null}}writeSecure(t,i){try{u(P(t),{recursive:!0,mode:448}),h(t,JSON.stringify(i,null,2)+`
|
|
4
4
|
`),f(t,384)}catch(r){let e=r instanceof Error?r.message:String(r);process.stderr.write(`[auth] Failed to save credentials: ${e}
|
|
5
5
|
`)}}saveCredentials(t,i,r){this.writeSecure(this.credentialsPath(t,i),r)}loadCredentials(t,i){try{return JSON.parse(o(this.credentialsPath(t,i),"utf-8"))}catch{return null}}saveClient(t,i,r){this.writeSecure(this.clientPath(t,i),r)}loadClient(t,i){try{return JSON.parse(o(this.clientPath(t,i),"utf-8"))}catch{return null}}getActiveCredentials(){let t=this.getActiveProfile();if(!t)return{credentials:null,profile:null,env:null};let i=this.getDefaultEnv();return{credentials:this.loadCredentials(t,i),profile:t,env:i}}saveBasicAuth(t,i,r){this.writeSecure(this.basicAuthPath(t,i),r)}loadBasicAuth(t,i){try{return JSON.parse(o(this.basicAuthPath(t,i),"utf-8"))}catch{return null}}deleteBasicAuth(t,i){try{s(this.basicAuthPath(t,i))}catch{}}resolveAuth(){let t=this.getActiveProfile();if(!t)return null;let i=this.getDefaultEnv(),r=this.loadBasicAuth(t,i);return r?{method:"basic",...r,profile:t,env:i}:this.loadCredentials(t,i)?{method:"oauth",profile:t,env:i}:null}listProfiles(){let t=[];try{for(let i of a(this.profilesDir)){let r=n(this.profilesDir,i);try{for(let e of a(r)){let c=n(r,e),v=l(n(c,"credentials")),p=l(n(c,"client.json")),y=l(n(c,"basic-auth"));(v||p||y)&&t.push({profile:i,env:e})}}catch{}}}catch{}return t}deleteProfile(t,i){try{s(this.credentialsPath(t,i))}catch{}if(this.getActiveProfile()===t){let r=this.readConfig();delete r.active_profile,this.writeConfig(r)}}deleteProfileFull(t,i){if(i){try{s(this.credentialsPath(t,i))}catch{}try{s(this.clientPath(t,i))}catch{}try{s(this.basicAuthPath(t,i))}catch{}try{s(this.profileConfigPath(t,i))}catch{}}else try{let r=n(this.profilesDir,t);for(let e of a(r)){try{s(n(r,e,"credentials"))}catch{}try{s(n(r,e,"client.json"))}catch{}try{s(n(r,e,"basic-auth"))}catch{}try{s(n(r,e,"profile-config.json"))}catch{}}}catch{}}};export{d as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as f}from"./chunk-
|
|
2
|
+
import{a as f}from"./chunk-MVF4KRHA.js";import{a as h}from"./chunk-FPFOW6BS.js";import{a as m}from"./chunk-DNOBOZPO.js";var o=class extends Error{constructor(a,l){super(a);this.code=l;this.name="AuthError"}};async function k(c){let{creds:i,env:a,usernameFlag:l,accessKeyFlag:p,log:t}=c,e=null,u=null;if(l&&p)e={username:l,access_key:p},t("info","AUTH_RESOLVE_FLAGS","Auth resolved via CLI flags",{username:l});else{let r=i.resolveAuth();r?.method==="basic"&&(e={username:r.username,access_key:r.access_key},t("info","AUTH_RESOLVE_CONFIG","Auth resolved via config",{username:r.username}))}if(!e){let{credentials:r,profile:E}=i.getActiveCredentials();if(!r)throw new o("Not authenticated \u2014 no credentials found","not_authenticated");if(u=r.access_token,r.expires_at-Date.now()/1e3<300)try{let n=await f({creds:i,profile:E,env:a,credentials:r});n&&(u=n.accessToken,t("info","AUTH_TOKEN_REFRESHED","OAuth token refreshed"))}catch(n){let d=n instanceof Error?n.message:String(n);throw t("error","TOKEN_REFRESH_FAILED","Token refresh failed",{error:d}),new o(`Token refresh failed: ${d}`,"refresh_failed")}}let v=m(a),b=async()=>u,y=e?{username:e.username,access_key:e.access_key}:null,g=new h(v.controllerBaseUrl,b,y,t),s=await g.resolve();return s&&!e&&(e={username:s.username,access_key:s.access_key},t("info","AUTH_RESOLVE_CONTROLLER","Auth resolved via controller",{username:s.username})),{basicAuth:e,token:u,resolver:g,resolvedCreds:s}}export{o as a,k as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as h}from"./chunk-
|
|
2
|
+
import{c as h}from"./chunk-EHN5HTUD.js";import{a as y,b as v}from"./chunk-L5LI2JF4.js";import{randomUUID as k,randomBytes as D}from"crypto";import{promises as i}from"fs";import{join as c}from"path";function p(t=process.cwd()){return c(t,".testmuai","evidence")}function b(t,e=process.cwd()){return c(p(e),`${t}.evidence`)}function W(){return k()}var S=/\.evidence\.tmp-(\d+)-[0-9a-f]+$/;async function _(t,e,r=process.cwd()){let n=p(r);await i.mkdir(n,{recursive:!0});let o=b(e,r),a=c(n,`${e}.evidence.tmp-${process.pid}-${D(6).toString("hex")}`);return await i.copyFile(t,a),await i.rename(a,o),o}async function I(t=process.cwd()){let e=p(t),r;try{r=await i.readdir(e)}catch{return[]}return r.filter(n=>n.endsWith(".evidence")).sort().map(n=>c(e,n))}async function L(t,e=process.cwd()){if(await P(t))return t;let r=b(t,e);return await P(r)?r:null}async function P(t){try{return await i.stat(t),!0}catch{return!1}}function E(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function M(t=process.cwd(),e=E){let r=p(t);await h(r).catch(()=>({restored:[],removed:[]}));let n=[],o=[],a;try{a=await i.readdir(r,{withFileTypes:!0})}catch{return{aborted:n,removed:o}}for(let u of a){let d=u.name.match(S);if(d){let g=Number(d[1]);if(Number.isFinite(g)&&e(g))continue;let w=c(r,u.name);await i.rm(w,{force:!0}),o.push(w);continue}if(!u.isDirectory()||!u.name.endsWith(".evidence"))continue;let m=c(r,u.name),f=c(m,"run.yaml"),s;try{s=y(await i.readFile(f,"utf8"))}catch{continue}if(s?.status!=="running")continue;let l=s?.environment?.pid;if(typeof l=="number"&&e(l))continue;let x=s?.environment?.saved===!0;s?.environment?.origin==="inline"&&!x?(await i.rm(m,{recursive:!0,force:!0}),o.push(m)):(s.status="aborted",await i.writeFile(f,v(s,{lineWidth:-1})),n.push(m))}return{aborted:n,removed:o}}export{p as a,b,W as c,_ as d,I as e,L as f,M as g};
|