workspai 0.78.0 → 0.79.1
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/README.md +117 -236
- package/contracts/create-planner-capabilities.v1.json +1 -1
- package/dist/analyze-SKOIUD6F.js +1 -0
- package/dist/autopilot-release-E7ADQH2B.js +1 -0
- package/dist/{chunk-5FVREPQC.js → chunk-2ZVE7VE2.js} +1 -1
- package/dist/{chunk-4KAYWMNE.js → chunk-3O344BX3.js} +1 -1
- package/dist/{chunk-HMWZWT7B.js → chunk-5MRDPZU7.js} +1 -1
- package/dist/{chunk-RJESUJQF.js → chunk-5NS322HT.js} +28 -28
- package/dist/{chunk-B6FJ6RG6.js → chunk-6CZQXEZ7.js} +1 -1
- package/dist/{chunk-75WJOYWT.js → chunk-CAGOLU4Q.js} +1 -1
- package/dist/{chunk-2CUT4GLE.js → chunk-DYSFGHV5.js} +1 -1
- package/dist/{chunk-4AAXIWYY.js → chunk-ETTZXKAS.js} +1 -1
- package/dist/{chunk-FLAGHVSH.js → chunk-FJMUBFXO.js} +1 -1
- package/dist/{chunk-RHF2IZOW.js → chunk-GIP7YFWR.js} +1 -1
- package/dist/{chunk-YWC5MKIL.js → chunk-IF2OWXNY.js} +1 -1
- package/dist/{chunk-UVIBPWOG.js → chunk-L3O2QXKH.js} +2 -2
- package/dist/{chunk-ONUFNCRN.js → chunk-LQYMYRGI.js} +1 -1
- package/dist/{chunk-YHQK4S3H.js → chunk-MJYWGRCY.js} +1 -1
- package/dist/{chunk-MN5S462C.js → chunk-MNZAJ6PP.js} +1 -1
- package/dist/{chunk-VRZAN3WS.js → chunk-NZQKHGPE.js} +1 -1
- package/dist/{chunk-QDM6TWFK.js → chunk-O4TZKLEC.js} +1 -1
- package/dist/{chunk-5OKNWBAN.js → chunk-R7R5FX4B.js} +1 -1
- package/dist/{chunk-HB3ZYG2Z.js → chunk-RRZQPFFR.js} +69 -60
- package/dist/{chunk-VEMGICT4.js → chunk-SKHRUHXO.js} +1 -1
- package/dist/{chunk-AMGIXK6Z.js → chunk-TQW2SZHH.js} +1 -1
- package/dist/{chunk-TJRVWVAZ.js → chunk-U5WP4HDH.js} +1 -1
- package/dist/{chunk-QMNJTI65.js → chunk-VT4WPXTO.js} +1 -1
- package/dist/chunk-WJKQTX4V.js +2 -0
- package/dist/{chunk-MD4CHXV3.js → chunk-WU5M6UP7.js} +1 -1
- package/dist/{chunk-IQJL3LBM.js → chunk-ZONAHZBG.js} +1 -1
- package/dist/{chunk-ZQ36CTLF.js → chunk-ZXYTWF2R.js} +1 -1
- package/dist/{create-WB5YQ7C6.js → create-2ETTECFU.js} +1 -1
- package/dist/{doctor-HOSHQ7II.js → doctor-3F7OUVYQ.js} +1 -1
- package/dist/{goal-interactive-selection-6YJOK4WC.js → goal-interactive-selection-EMHAM5TM.js} +1 -1
- package/dist/{goal-lifecycle-UEJMTUFV.js → goal-lifecycle-PR5O7T6B.js} +1 -1
- package/dist/{goal-pack-YGZMG3RQ.js → goal-pack-TEK2PHAV.js} +1 -1
- package/dist/index.js +159 -159
- package/dist/{pipeline-Z4JOJ4PX.js → pipeline-E6YY65GU.js} +1 -1
- package/dist/{project-agent-entry-ZMDQWJ6I.js → project-agent-entry-MXAHZSQR.js} +1 -1
- package/dist/{project-intelligence-lens-FSWQKY3E.js → project-intelligence-lens-IUM66OV2.js} +1 -1
- package/dist/{proof-carrying-change-M2RNYQ7E.js → proof-carrying-change-XA5HRGSB.js} +1 -1
- package/dist/{verified-goal-UAUCEDZZ.js → verified-goal-V5OVULY7.js} +1 -1
- package/dist/{workspace-J5QYWAE3.js → workspace-XVPKQG5W.js} +1 -1
- package/dist/{workspace-agent-sync-GLG36KQZ.js → workspace-agent-sync-46L7ZOQQ.js} +1 -1
- package/dist/{workspace-context-BZV4ZFKZ.js → workspace-context-VVZARI5K.js} +1 -1
- package/dist/{workspace-contract-XDNIB5JX.js → workspace-contract-N2BJCAJ7.js} +1 -1
- package/dist/{workspace-explain-V3XDMONQ.js → workspace-explain-5WKK6ENK.js} +1 -1
- package/dist/{workspace-foundation-EDTKW2RB.js → workspace-foundation-PZNZWUJ4.js} +1 -1
- package/dist/{workspace-graph-stream-UPASFCAF.js → workspace-graph-stream-26ME2JJS.js} +1 -1
- package/dist/{workspace-intelligence-24MZRG2S.js → workspace-intelligence-ZTET7JHS.js} +1 -1
- package/dist/{workspace-intelligence-runner-HISKHQLG.js → workspace-intelligence-runner-NZFRFCPN.js} +1 -1
- package/dist/{workspace-knowledge-graph-5EECTGXQ.js → workspace-knowledge-graph-4RSZTEFJ.js} +1 -1
- package/dist/workspace-knowledge-graph-snapshot-UTJHALST.js +1 -0
- package/dist/{workspace-mcp-serve-S3TWO4RI.js → workspace-mcp-serve-TIYCW364.js} +1 -1
- package/dist/{workspace-model-J757KSDE.js → workspace-model-LBICKRVI.js} +1 -1
- package/dist/{workspace-onboarding-3TLME4HP.js → workspace-onboarding-WUO6KCLF.js} +1 -1
- package/dist/{workspace-registry-summary-ZC5CFZXP.js → workspace-registry-summary-3PXZENLC.js} +1 -1
- package/dist/{workspace-repair-engine-C26C7OIB.js → workspace-repair-engine-V4Z7TJGS.js} +1 -1
- package/dist/workspace-run-T65CCZIN.js +1 -0
- package/dist/{workspace-verify-KFBWQ37C.js → workspace-verify-UQWAFGNQ.js} +1 -1
- package/dist/{workspace-watch-LNP5JPD4.js → workspace-watch-BKIZQ2SM.js} +1 -1
- package/docs/README.md +48 -116
- package/docs/agent-framework-adapters.md +32 -26
- package/docs/ci-workflows.md +8 -2
- package/docs/commands-reference.md +13 -12
- package/docs/create-planner-capabilities.md +1 -1
- package/docs/creating-workspaces-and-projects.md +29 -22
- package/docs/model-gateways.md +23 -23
- package/package.json +2 -2
- package/dist/analyze-X76YV667.js +0 -1
- package/dist/autopilot-release-6OV2FLRS.js +0 -1
- package/dist/chunk-3PGXGAHC.js +0 -2
- package/dist/workspace-knowledge-graph-snapshot-T6ZJGWLC.js +0 -1
- package/dist/workspace-run-2KBTMGG7.js +0 -1
- /package/dist/{chunk-QLHRGWUW.js → chunk-GOOY7I36.js} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {k,f,e as e$3,j as j$1,l}from'./chunk-WJKQTX4V.js';import {b as b$4}from'./chunk-5MRDPZU7.js';import {b as b$7,a as a$4}from'./chunk-D5LLTUTY.js';import {b as b$2}from'./chunk-6CZQXEZ7.js';import {a as a$3}from'./chunk-MNZAJ6PP.js';import {U,e as e$1,g,h as h$1,c as c$2,i as i$1,f as f$1,b as b$6,d as d$3}from'./chunk-RRZQPFFR.js';import {g as g$1}from'./chunk-WU5M6UP7.js';import {e,c as c$1}from'./chunk-252EKOR6.js';import {i,b as b$5,k as k$1,j,m,z,y,w}from'./chunk-6BO4QHKA.js';import {h,e as e$2,b as b$3,d as d$1}from'./chunk-EFHSRPW7.js';import {a}from'./chunk-TQEMLBAG.js';import {b as b$1,a as a$1,c,d as d$2}from'./chunk-VQZ5PI5J.js';import {promises}from'fs';import*as b from'fs-extra';import d from'path';import a$2 from'chalk';import {execa}from'execa';function mt(e){let t=e.projectCount??0,n=t===1?"project":"projects",o=e.pythonEngine==="installed"?`Python ${e.pythonVersion||"3.10+"} \xB7 ${e.installMethod||"local environment"}`:e.pythonEngine==="skipped"?"Python engine not installed":"Runtime-neutral foundation";return ["","\u2713 Workspace ready",`${e.workspaceName} \xB7 ${e.profile} \xB7 ${t} registered ${n}`,`Location ${e.workspacePath}`,`Runtime ${o}`,...e.note?[`Note ${e.note}`]:[],"","Workspace Intelligence"," \u2713 Contract and project registry"," \u2713 Canonical model and proof-backed graph"," \u2713 Agent context, grounding, and evidence index","","Next",` ${l(e.workspacePath)}`," npx workspai create"," npx workspai workspace intelligence run --for-agent generic --strict --json","","Evidence .workspai/reports/INDEX.json","Guide README.md",""]}function J(e){let t=mt(e);for(let n of t)n==="\u2713 Workspace ready"?console.log(a$2.green.bold(n)):n==="Workspace Intelligence"||n==="Next"?console.log(a$2.cyan.bold(n)):n.startsWith(" \u2713")?console.log(a$2.green(n)):n.startsWith("Location")||n.startsWith("Runtime")?console.log(a$2.gray(n)):console.log(n);}function M(){return i()}var yt="transactions";function gt(){return d.join(w(),yt)}async function Ye(){let e=gt();return await b$7(e),a$4({journalDirectory:e})}async function ze(e){for(let t of y())await e.captureFile(t);}async function le(e){let t=await Ye();try{return await ze(t),await t.captureOwnedTree(e),t}catch(n){return F(t,n)}}async function ht(e){let t=await Ye();try{return await Be(t,e),t}catch(n){return F(t,n)}}async function Be(e,t){await ze(e),await e.captureOwnedTree(d.join(t,a$1)),await e.captureOwnedTree(d.join(t,".venv"));for(let o of [".agents",".amazonq",".claude",".cursor",".github",".grok",".vscode",".windsurf"])await e.captureOwnedTree(d.join(t,o));let n=[c,".gitignore",d.join(a$1,"workspace.json"),d.join(a$1,"toolchain.lock"),d.join(a$1,"policies.yml"),d.join(a$1,"cache-config.yml"),g$1,a$3,"pyproject.toml","poetry.toml","poetry.lock","rapidkit","rapidkit.cmd","README.md","AGENTS.md","CLAUDE.md","GEMINI.md","QWEN.md",".windsurfrules",".rapidkit-global"];for(let o of n)await e.captureFile(d.join(t,o));}async function Q(e){await e.commit(),e.journalPath&&await promises.rm(d.dirname(e.journalPath),{recursive:true,force:true}).catch(t=>e$2.debug(`Could not remove committed lifecycle journal: ${t}`));}async function F(e,t){try{await e.rollback();}catch(n){throw new AggregateError([t,n],"Workspace lifecycle failed and rollback was incomplete.")}throw t}async function X(e$1,t,n,o,i){let r=e(t,h(),n,i?.pythonEngine?{coreStatus:i.pythonEngine,...i.pythonEngineReason?{coreReason:i.pythonEngineReason}:{},...o?{pythonVersion:o}:{}}:void 0);o&&!i?.pythonEngine&&(r.metadata||(r.metadata={}),r.metadata.python={pythonVersion:o}),await c$1(e$1,r);}async function G(e){await b.outputFile(d.join(e,".gitignore"),`.venv/
|
|
2
2
|
__pycache__/
|
|
3
3
|
*.pyc
|
|
4
4
|
.env
|
|
5
5
|
${d$2}
|
|
6
6
|
${b$1}/
|
|
7
7
|
|
|
8
|
-
`,"utf-8");}async function
|
|
9
|
-
`)}function
|
|
8
|
+
`,"utf-8");}async function Je(e){try{let t=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a()});return t.stdout.trim()?d.resolve(e,t.stdout.trim()):null}catch{return null}}function ft(e){if(!e||typeof e!="object")return String(e??"");let t=e;return [t.message,t.shortMessage,t.stderr].filter(n=>typeof n=="string").join(`
|
|
9
|
+
`)}function wt(e){return /(?:gpg|sign(?:ed|ing|ature)?|pinentry|cancel(?:led|ed))/i.test(ft(e))}async function Z(e,t,n){if(await Je(e)){t.warn("Git initialization skipped because target is already inside a git worktree");return}t.start("Initializing git repository");try{await execa("git",["init"],{cwd:e,env:a()});}catch{t.warn("Could not initialize git repository");return}try{await execa("git",["add","."],{cwd:e,env:a()});}catch{t.warn("Git repository initialized, but generated files could not be staged");return}try{await execa("git",["-c","user.name=Workspai","-c","user.email=workspai@localhost","commit","-m",n],{cwd:e,env:a()}),t.succeed("Git repository initialized");}catch(i){t.warn(wt(i)?"Git repository initialized; signed initial commit was not created. Files remain staged.":"Git repository initialized; initial commit was not created. Files remain staged.");}}async function Qe(e,t){let n=t.replace(/[^a-z0-9-]/gi,"-").toLowerCase();await b.outputFile(d.join(e,"poetry.toml"),`[virtualenvs]
|
|
10
10
|
in-project = true
|
|
11
11
|
`,"utf-8"),await b.outputFile(d.join(e,"pyproject.toml"),`[tool.poetry]
|
|
12
12
|
name = "${n}"
|
|
@@ -22,7 +22,7 @@ rapidkit-core = "*"
|
|
|
22
22
|
[build-system]
|
|
23
23
|
requires = ["poetry-core"]
|
|
24
24
|
build-backend = "poetry.core.masonry.api"
|
|
25
|
-
`,"utf-8");}function
|
|
25
|
+
`,"utf-8");}function Xe(e,t,n,o,i){return JSON.stringify({schema_version:"1.0",workspace_name:e,workspai_version:h(),rapidkit_version:h(),created_at:new Date().toISOString(),created_by:"workspai",profile:o||"minimal",...i?.profileRequested?{profile_requested:i.profileRequested}:{},...i?.bootstrapNote?{bootstrap_note:i.bootstrapNote}:{},engine:{install_method:t,python_version:n||null,...i?.pythonEngine?{python_core:{status:i.pythonEngine,...i.pythonEngineReason?{reason:i.pythonEngineReason}:{}}}:{}}},null,2)}function Ze(e,t,n,o,i,r){return JSON.stringify({schema_version:"1.0",generated_by:"workspai",generated_at:new Date().toISOString(),runtime:{python:{version:t||null,install_method:e,...r?.pythonEngine?{core:{status:r.pythonEngine,...r.pythonEngineReason?{reason:r.pythonEngineReason}:{}}}:{}},node:{version:n||process.version},go:{version:o||null},java:{version:null,build_tool:null,build_tool_version:null},dotnet:{version:i||null,sdk:i||null}}},null,2)}function et(){return `version: "1.0"
|
|
26
26
|
mode: warn # "warn" or "strict"
|
|
27
27
|
dependency_sharing_mode: isolated # "isolated" or "shared-runtime-caches" or "shared-node-deps"
|
|
28
28
|
# change profile (recommended): npx workspai bootstrap --profile polyglot
|
|
@@ -31,20 +31,20 @@ rules:
|
|
|
31
31
|
enforce_workspace_marker: true
|
|
32
32
|
enforce_toolchain_lock: false
|
|
33
33
|
disallow_untrusted_tool_sources: false
|
|
34
|
-
`}function
|
|
34
|
+
`}function tt(){return `version: "1.0"
|
|
35
35
|
cache:
|
|
36
36
|
strategy: shared # "shared" or "on-demand"
|
|
37
37
|
prune_on_bootstrap: false
|
|
38
38
|
self_heal: true
|
|
39
39
|
verify_integrity: false
|
|
40
|
-
`}async function
|
|
41
|
-
`,"utf-8"),e$2.debug(`Created .python-version with ${t}`);}catch(n){e$2.warn(`Failed to create .python-version: ${n}`);}}function ce(){let n=[...(process.env.PATH||"").split(d.delimiter).filter(Boolean)];for(let o of z())n.includes(o)||n.unshift(o);process.env.PATH=n.join(d.delimiter);}async function
|
|
40
|
+
`}async function nt(){try{let{stdout:e}=await execa("go",["version"],{timeout:3e3,stdio:"pipe"}),t=e.match(/go(\d+\.\d+(?:\.\d+)?)/i);return t?t[1]:void 0}catch{return}}async function ot(){try{let{stdout:e}=await execa("dotnet",["--version"],{timeout:3e3,stdio:"pipe"}),t=e.trim();return t.length>0?t:void 0}catch{return}}async function ee(e,t,n,o,i,r){let[u,h]=await Promise.all([nt(),ot()]),l=[{fileName:"workspace.json",content:Xe(t,n,o,i,r)},{fileName:"toolchain.lock",content:Ze(n,o,process.version,u,h,r)},{fileName:"policies.yml",content:et()},{fileName:"cache-config.yml",content:tt()}];for(let w of l)await b.outputFile(d.join(e,a$1,w.fileName),w.content,"utf-8");}async function ln(e$1,t){let{workspaceName:n=d.basename(e$1),installMethod:o="venv",pythonVersion:i,profile:r,writeMarker:u=true,writeGitignore:h$1=true,onlyIfMissing:l=true}=t||{},w=[],[g,f]=await Promise.all([nt(),ot()]),c$2=[{relPath:d.join(a$1,"workspace.json"),legacyRelPath:d.join(b$1,"workspace.json"),content:Xe(n,o,i,r)},{relPath:d.join(a$1,"toolchain.lock"),legacyRelPath:d.join(b$1,"toolchain.lock"),content:Ze(o,i,process.version,g,f)},{relPath:d.join(a$1,"policies.yml"),legacyRelPath:d.join(b$1,"policies.yml"),content:et()},{relPath:d.join(a$1,"cache-config.yml"),legacyRelPath:d.join(b$1,"cache-config.yml"),content:tt()}];for(let m of c$2){let p=d.join(e$1,m.relPath),s=d.join(e$1,m.legacyRelPath),$=await b.pathExists(p),k=await b.pathExists(s);l&&$||(l&&k?(await b.copy(s,p),w.push(m.relPath)):(await b.outputFile(p,m.content,"utf-8"),w.push(m.relPath)));}if(u&&(!await b.pathExists(d.join(e$1,c))||!l)){let p=e(n,h(),o);i&&(p.metadata||(p.metadata={}),p.metadata.python={pythonVersion:i}),await c$1(e$1,p),w.push(c);}if(h$1){let m=d.join(e$1,".gitignore");(!l||!await b.pathExists(m))&&(await G(e$1),w.push(".gitignore"));}return w}var vt={"python-only":"minimal",polyglot:"node-only",enterprise:"polyglot"};function kt(e){let t=e,n=new Set;for(;!U(t);){if(n.has(t))return "minimal";n.add(t);let o=vt[t];if(!o)return "minimal";t=o;}return t}var V="3.10",it=["3.10","3.11","3.12"];async function Ie(e){try{let{stdout:t}=await execa(e,["--version"],{timeout:3e3}),n=t.match(/Python (\d+\.\d+\.\d+)/);if(n)return n[1]}catch{}return null}async function Pt(e,t){try{await promises.writeFile(d.join(e,".python-version"),`${t}
|
|
41
|
+
`,"utf-8"),e$2.debug(`Created .python-version with ${t}`);}catch(n){e$2.warn(`Failed to create .python-version: ${n}`);}}function ce(){let n=[...(process.env.PATH||"").split(d.delimiter).filter(Boolean)];for(let o of z())n.includes(o)||n.unshift(o);process.env.PATH=n.join(d.delimiter);}async function fe(e,t){ce(),e.start("Checking pipx installation");try{return await execa("pipx",["--version"]),e.succeed("pipx found"),{kind:"binary"}}catch{}let n=M();try{return await execa(n,["-m","pipx","--version"]),e.succeed("pipx found"),{kind:"python-module",pythonCmd:n}}catch{}if(t)throw new d$3;try{await execa(n,["-m","pip","--version"],{timeout:2500});}catch{throw new h$1}e.stop?.();let{installPipx:o}=await b$2([{type:"confirm",name:"installPipx",message:"pipx is not installed. Install it now (user install via python -m pip)?",default:true}]);if(!o)throw new d$3;e.start("Installing pipx (user install)");try{try{await execa(n,["-m","pip","install","--user","--upgrade","pip"]);}catch{}await execa(n,["-m","pip","install","--user","--upgrade","pipx"]);}catch(i){let r=i,u=String(r?.stderr||r?.shortMessage||r?.message||"");throw new f$1("Install pipx with python -m pip",i instanceof Error?i:new Error(u))}e.succeed("pipx installed"),ce();try{return await execa(n,["-m","pipx","--version"]),{kind:"python-module",pythonCmd:n}}catch(i){let r=i,u=String(r?.stderr||r?.shortMessage||r?.message||"pipx not runnable after install");throw new f$1("Verify pipx after install",new Error(`${u}
|
|
42
42
|
|
|
43
|
-
Try reopening your terminal or run: ${n} -m pipx ensurepath`))}}async function H(e,t){return e.kind==="binary"?execa("pipx",t):execa(e.pythonCmd,["-m","pipx",...t])}function
|
|
44
|
-
${c.stderr||""}`);m&&te(m,V)&&t.add(m);}catch{}let o=null;try{let f=await execa(M(),["--version"],{timeout:2500}),c=
|
|
45
|
-
${f.stderr||""}`);c&&te(c,V)&&(o=c,t.add(c));}catch{}let i=
|
|
43
|
+
Try reopening your terminal or run: ${n} -m pipx ensurepath`))}}async function H(e,t){return e.kind==="binary"?execa("pipx",t):execa(e.pythonCmd,["-m","pipx",...t])}function at(e){let t=e.match(/^(\d+)\.(\d+)/);return t?`${t[1]}.${t[2]}`:null}function qe(e){if(!e)return null;let t=e.match(/Python\s+(\d+)\.(\d+)(?:\.\d+)?/i);return t?`${t[1]}.${t[2]}`:null}function Ee(e,t){let[n,o]=e.split(".").map(u=>Number(u)),[i,r]=t.split(".").map(u=>Number(u));return n!==i?n-i:o-r}function te(e,t){return Ee(e,t)>=0}async function bt(e){let t=new Set,n=k$1(14,10);for(let f of n)try{let c=await execa(f.command,f.args,{timeout:2500}),m=qe(`${c.stdout||""}
|
|
44
|
+
${c.stderr||""}`);m&&te(m,V)&&t.add(m);}catch{}let o=null;try{let f=await execa(M(),["--version"],{timeout:2500}),c=qe(`${f.stdout||""}
|
|
45
|
+
${f.stderr||""}`);c&&te(c,V)&&(o=c,t.add(c));}catch{}let i=it.filter(f=>te(f,V)),r=new Set([...i,...t]),u=Array.from(r).sort((f,c)=>Ee(c,f)),h=e?at(e):null,l=h&&te(h,V)?h:o||u[0]||V;return r.has(l)||r.add(l),{choices:Array.from(r).sort((f,c)=>Ee(c,f)).map(f=>{let c=[];return f===o&&c.push("current system"),f===V&&c.push("minimum supported"),t.has(f)&&f!==o&&c.push("detected"),{name:c.length>0?`${f} (${c.join(", ")})`:f,value:f}}),defaultValue:l}}async function Rt(){ce();let e=false,t=false,n=false,o=false;try{await execa("poetry",["--version"],{timeout:2500}),e=true;}catch{e=false;}try{await execa("pipx",["--version"],{timeout:2500}),t=true;}catch{let r=i();try{await execa(r,["-m","pipx","--version"],{timeout:2500}),t=true;}catch{t=false;}}let i$1=i();try{await execa(i$1,["-m","pip","--version"],{timeout:2500}),n=true;}catch{n=false;}try{await execa(i$1,["-c","import venv, ensurepip"],{timeout:2500}),o=true;}catch{o=false;}return {poetry:e,pipx:t,pip:n,venv:o}}function xt(e,t){return e==="poetry"&&t.poetry?"poetry":e==="pipx"&&t.pipx?"pipx":e==="venv"&&t.venv?"venv":t.poetry?"poetry":t.venv?"venv":"pipx"}async function It(e,t){ce(),e.start("Checking Poetry installation");try{await execa("poetry",["--version"]),e.succeed("Poetry found");return}catch{}if(t)throw new c$2;let{installPoetry:n}=await b$2([{type:"confirm",name:"installPoetry",message:"Poetry is not installed. Install it now using pipx?",default:true}]);if(!n)throw new c$2;let o=await fe(e,t);e.start("Installing Poetry with pipx");try{await H(o,["install","poetry"]);}catch(i){let r=i,u=String(r?.stderr||r?.shortMessage||r?.message||"");if(/already\s+installed|already\s+seems\s+to\s+be\s+installed|exists/i.test(u))try{await H(o,["upgrade","poetry"]);}catch{}else throw new f$1("Install Poetry with pipx",i instanceof Error?i:new Error(u))}e.succeed("Poetry installed"),ce();try{await execa("poetry",["--version"]);}catch(i){let r=i,u=String(r?.stderr||r?.shortMessage||r?.message||"Poetry not found on PATH");throw new f$1("Verify Poetry after pipx install",new Error(`${u}
|
|
46
46
|
|
|
47
|
-
Poetry may be installed but not on PATH yet. Try reopening your terminal or run: pipx ensurepath`))}}function
|
|
47
|
+
Poetry may be installed but not on PATH yet. Try reopening your terminal or run: pipx ensurepath`))}}function Et(e,t={}){let n=e==="poetry",o=t.pythonEngineSkipped?`echo "- Python engine installation was intentionally skipped for this workspace." 1>&2
|
|
48
48
|
echo "- For npm-owned workspace commands, run: npx workspai <command>" 1>&2
|
|
49
49
|
echo "- To install the local Python engine later, create a RapidKit Core module-enabled project, then run: npx workspai workspace run init" 1>&2
|
|
50
50
|
`:`echo "- If you used venv: ensure .venv exists (or re-run the installer)." 1>&2
|
|
@@ -80,7 +80,7 @@ ${o}${t.pythonEngineSkipped?"":n?`echo "- If you used Poetry: run 'poetry instal
|
|
|
80
80
|
`:""}${t.pythonEngineSkipped?`echo "Tip: use 'npx workspai workspace model --json' for Workspace Intelligence without the Python engine." 1>&2
|
|
81
81
|
`:`echo "Tip: you can also run: ./.venv/bin/rapidkit --help" 1>&2
|
|
82
82
|
`}exit 1
|
|
83
|
-
`}function
|
|
83
|
+
`}function _t(e,t={}){let n=e==="poetry",o=t.pythonEngineSkipped?`echo - Python engine installation was intentionally skipped for this workspace. 1>&2
|
|
84
84
|
echo - For npm-owned workspace commands, run: npx workspai ^<command^> 1>&2
|
|
85
85
|
echo - To install the local Python engine later, create a RapidKit Core module-enabled project, then run: npx workspai workspace run init 1>&2
|
|
86
86
|
`:`echo Tip: run .venv\\Scripts\\rapidkit.exe --help 1>&2
|
|
@@ -120,7 +120,7 @@ for %%R in ("%USERPROFILE%\\.local\\bin\\rapidkit.exe" "%APPDATA%\\Python\\Scrip
|
|
|
120
120
|
echo RapidKit launcher could not find a local Python CLI. 1>&2
|
|
121
121
|
${o}echo Tip: for npm-owned workspace commands, run npx --yes --package workspai workspai %* from a shell where npm is on PATH. 1>&2
|
|
122
122
|
exit /b 1
|
|
123
|
-
`}async function
|
|
123
|
+
`}async function he(e,t,n={}){await b.outputFile(d.join(e,"rapidkit"),Et(t,n),{encoding:"utf-8",mode:493}),await b.outputFile(d.join(e,"rapidkit.cmd"),_t(t,n),"utf-8");}async function cn(e,t){let{skipGit:n=false,skipPythonEngine:o=false,testMode:i$1=false,demoMode:r=false,dryRun:u=false,yes:h=false,userConfig:l={},installMethod:w,profile:g$1,parentDirectory:f$1,suppressReceipt:c=false,json:m=false}=t,p=e||"rapidkit",s=f$1?d.resolve(f$1,p):d.resolve(process.cwd(),p);if(await b.pathExists(s))throw new e$1(p);if(await k(s),u){if(!m){let v=g$1||(h?"minimal":void 0),I=w||l.defaultInstallMethod||"poetry",E=l.pythonVersion||"3.10";await At(s,p,r,l,v,I,E,n,o);}return}if(r){await Ct(s,p,n);return}let $=new Set(["python-only","polyglot","enterprise"]),k$1=g$1||"";if(!h&&!g$1){let{selectedProfile:v}=await f([{type:"rawlist",name:"selectedProfile",message:"Select workspace profile:",choices:[{name:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)",value:"minimal"},{name:"java-only \u2014 Java runtime (Spring Boot services)",value:"java-only"},{name:"python-only \u2014 Python + Poetry (FastAPI, Django, ML pipelines)",value:"python-only"},{name:"node-only \u2014 Node.js runtime (NestJS, Express, Next.js)",value:"node-only"},{name:"go-only \u2014 Go runtime (Fiber, Gin, gRPC, microservices)",value:"go-only"},{name:"dotnet-only \u2014 .NET runtime (ASP.NET Core services)",value:"dotnet-only"},{name:"polyglot \u2014 Python + Node.js + Go + Java + .NET multi-runtime workspace",value:"polyglot"},{name:"enterprise \u2014 Polyglot + governance + Sigstore verification",value:"enterprise"}],default:1}],b$2);k$1=v;}else k$1||(k$1="minimal");let U$1=!h&&$.has(k$1),q=$.has(k$1)?o?"skip":U$1?(await f([{type:"confirm",name:"installPythonEngine",message:"Install the optional RapidKit Python engine now? (needed for Python-backed kits/modules)",default:true}],b$2)).installPythonEngine!==false?"install":"skip":"install":"skip",Ce=U$1&&q==="install",ct=typeof l.pythonVersion=="string"&&l.pythonVersion.trim().length>0?l.pythonVersion.trim():void 0,pt=w||l.defaultInstallMethod||"poetry",C=q==="install"?await Rt():{poetry:true,pipx:true,pip:true,venv:true},Ae=Ce?await bt(ct):{choices:it.map(v=>({name:v,value:v})),defaultValue:V},dt=xt(pt,C),ut=[{name:C.poetry?"\u{1F3AF} Poetry (Recommended - includes virtual env + dependency mgmt)":C.pipx||C.pip?"\u{1F3AF} Poetry (Recommended) \u2014 not detected (can be installed)":"\u{1F3AF} Poetry (Recommended) \u2014 unavailable (system pipx package required)",value:"poetry"},{name:C.venv?"\u{1F4E6} pip with venv (Standard, zero extra tools)":"\u{1F4E6} pip with venv \u2014 unavailable (system venv package required)",value:"venv"},{name:C.pipx?"\u{1F527} pipx (Global isolated - RapidKit Core only, no local venv)":C.pip?"\u{1F527} pipx (Global isolated) \u2014 not detected (can be installed)":"\u{1F527} pipx (Global isolated) \u2014 unavailable (system pipx package required)",value:"pipx"}],x=Ce?await f([{type:"rawlist",name:"pythonVersion",message:"Select minimum Python version for RapidKit:",choices:Ae.choices,default:Ae.defaultValue},{type:"rawlist",name:"installMethod",message:"How would you like to manage the workspace environment?",choices:ut,default:dt}],b$2):await(async()=>{if(q==="skip")return {pythonVersion:l.pythonVersion||"3.10",installMethod:"venv"};let v=w||l.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return e$2.warn("Poetry not found \u2014 auto-selecting venv. Pass --install-method poetry to override."),"venv"}})();return {pythonVersion:l.pythonVersion||"3.10",installMethod:v}})();if(e$3(),U(k$1)){let v=b$3("Creating workspace",{component:"create",phase:"workspace.python-free"}),I=await le(s);try{await b.ensureDir(s),v.succeed("Directory created"),await X(s,p,"venv",void 0),await ee(s,p,"venv",void 0,k$1,{bootstrapNote:"python-engine-skipped",pythonEngine:"skipped",pythonEngineReason:"workspace-profile-does-not-install-python-at-create"}),await G(s);let E=await b$4(s,{workspaceName:p,silent:true});await Q(I),n||await Z(s,v,"Initial commit: Workspai workspace"),c||J({workspaceName:p,workspacePath:s,profile:k$1,projectCount:E?.projectCount??0});}catch(E){return v.fail("Failed to create workspace"),F(I,E)}return}if($.has(k$1)&&q==="skip"){let v=b$3("Creating workspace",{component:"create",phase:"workspace.python-engine-skipped"}),I=await le(s);try{await b.ensureDir(s),v.succeed("Directory created");let E={bootstrapNote:"python-engine-skipped",pythonEngine:"skipped",pythonEngineReason:"user-opted-out"};await X(s,p,"venv",void 0,E),await ee(s,p,"venv",void 0,k$1,E),await G(s),await he(s,"venv",{pythonEngineSkipped:true});let R=await b$4(s,{workspaceName:p,silent:true});await Q(I),n||await Z(s,v,`Initial commit: Workspai workspace (${k$1})`),c||J({workspaceName:p,workspacePath:s,profile:k$1,projectCount:R?.projectCount??0,pythonEngine:"skipped",note:"Install the optional Python engine later only when a Python-backed kit needs it."});return}catch(E){return v.fail("Failed to create workspace"),F(I,E)}}{let v=M(),I=false;try{await execa(v,["--version"],{timeout:5e3}),I=true;}catch{try{await execa("python",["--version"],{timeout:5e3}),I=true;}catch{I=false;}}if(!I){let E=k$1,R=kt(k$1);if(U$1&&!h){console.log(a$2.yellow(`
|
|
124
124
|
\u26A0\uFE0F Python 3.10+ is not detected on this system.
|
|
125
125
|
`)),console.log(a$2.cyan(`You have 3 options:
|
|
126
126
|
`));let{pythonAction:D}=await b$2([{type:"rawlist",name:"pythonAction",message:"What would you like to do?",choices:[{name:"\u{1F4E5} Install Python now (I'll show you the command for your OS)",value:"install"},{name:`\u{1F504} Switch to "${R}" profile (no Python required)`,value:"fallback"},{name:"\u274C Cancel and install Python manually",value:"cancel"}]}]);if(D==="cancel"&&(console.log(a$2.cyan(`
|
|
@@ -136,9 +136,9 @@ exit /b 1
|
|
|
136
136
|
`))),console.log(a$2.gray(` After installing, run: npx workspai ${p}
|
|
137
137
|
`)),process.exit(0);}if(D==="fallback"&&(console.log(a$2.green(`
|
|
138
138
|
\u2705 Switching to "${R}" profile (no Python required).
|
|
139
|
-
`)),k=R,U(R))){let A=b$3("Creating workspace",{component:"create",phase:"workspace.python-free"}),Y=await le(s);try{await b.ensureDir(s),A.succeed("Directory created"),await X(s,p,"venv",void 0),await ee(s,p,"venv",void 0,R,{profileRequested:E,bootstrapNote:"python-free-fallback",pythonEngine:"skipped",pythonEngineReason:"python-runtime-unavailable"}),await G(s);let
|
|
139
|
+
`)),k$1=R,U(R))){let A=b$3("Creating workspace",{component:"create",phase:"workspace.python-free"}),Y=await le(s);try{await b.ensureDir(s),A.succeed("Directory created"),await X(s,p,"venv",void 0),await ee(s,p,"venv",void 0,R,{profileRequested:E,bootstrapNote:"python-free-fallback",pythonEngine:"skipped",pythonEngineReason:"python-runtime-unavailable"}),await G(s);let we=await b$4(s,{workspaceName:p,silent:true});await Q(Y),n||await Z(s,A,`Initial commit: Workspai workspace (${R} profile)`),c||J({workspaceName:p,workspacePath:s,profile:R,projectCount:we?.projectCount??0,note:`Requested ${E}; used ${R} because Python was unavailable.`});return}catch(we){return A.fail("Failed to create workspace"),F(Y,we)}}}else if(console.log(a$2.yellow(`
|
|
140
140
|
\u26A0\uFE0F Python not detected. Auto-switching to "${R}" profile (no Python required).
|
|
141
|
-
`)),k=R,U(R)){let D=b$3("Creating workspace",{component:"create",phase:"workspace.python-free"}),A=await le(s);try{await b.ensureDir(s),D.succeed("Directory created"),await X(s,p,"venv",void 0),await ee(s,p,"venv",void 0,R,{profileRequested:E,bootstrapNote:"python-free-fallback",pythonEngine:"skipped",pythonEngineReason:"python-runtime-unavailable"}),await G(s);let Y=await b$4(s,{workspaceName:p,silent:true});await Q(A),n||await Z(s,D,`Initial commit: Workspai workspace (${R})`),c||J({workspaceName:p,workspacePath:s,profile:R,projectCount:Y?.projectCount??0,note:`Requested ${E}; used ${R} because Python was unavailable.`});return}catch(Y){return D.fail("Failed to create workspace"),F(A,Y)}}}}if(x.installMethod==="venv"&&!C.venv){let v=await
|
|
141
|
+
`)),k$1=R,U(R)){let D=b$3("Creating workspace",{component:"create",phase:"workspace.python-free"}),A=await le(s);try{await b.ensureDir(s),D.succeed("Directory created"),await X(s,p,"venv",void 0),await ee(s,p,"venv",void 0,R,{profileRequested:E,bootstrapNote:"python-free-fallback",pythonEngine:"skipped",pythonEngineReason:"python-runtime-unavailable"}),await G(s);let Y=await b$4(s,{workspaceName:p,silent:true});await Q(A),n||await Z(s,D,`Initial commit: Workspai workspace (${R})`),c||J({workspaceName:p,workspacePath:s,profile:R,projectCount:Y?.projectCount??0,note:`Requested ${E}; used ${R} because Python was unavailable.`});return}catch(Y){return D.fail("Failed to create workspace"),F(A,Y)}}}}if(x.installMethod==="venv"&&!C.venv){let v=await Ie(i()),I=v?at(v):null;throw new g(`python${I||x.pythonVersion}-venv`,d.basename(s))}if(x.installMethod==="pipx"&&!C.pipx&&!C.pip)throw new h$1;if(x.installMethod==="poetry"&&!C.poetry&&!C.pipx&&!C.pip)throw new c$2;let _=b$3("Creating directory",{component:"create",phase:"workspace.directory"}),Se=await le(s);try{await b.ensureDir(s),_.succeed("Directory created"),_.start("Detecting Python version");let v=null,I=await rt(x.pythonVersion);if(I)v=await Ie(I),v?(e$2.info(` Detected Python ${v}`),_.succeed(`Python ${v} detected`)):_.warn("Could not detect exact Python version");else {let R=M();v=await Ie(R),v?_.succeed(`Python ${v} detected`):_.warn("Could not detect Python version, proceeding with defaults");}if(await X(s,p,x.installMethod,v||void 0),await ee(s,p,x.installMethod,v||x.pythonVersion,k$1||g$1),await G(s),await Qe(s,p),x.installMethod==="poetry")try{await st(s,x.pythonVersion,_,i$1,l,h);}catch(R){let ne=R?.details||R?.message||String(R);if(ne.includes("pyenv")||ne.includes("exit status 127")||ne.includes("returned non-zero exit status 127")){_.warn("Poetry encountered Python discovery issues, trying venv method"),e$2.debug(`Poetry error (attempting venv fallback): ${ne}`);try{await _e(s,x.pythonVersion,_,i$1,l),x.installMethod="venv";}catch(A){throw A}}else throw R}else x.installMethod==="venv"?await _e(s,x.pythonVersion,_,i$1,l):await lt(s,_,i$1,l,h);v&&await Pt(s,v),await he(s,x.installMethod),_.succeed("Workspai environment ready!");let E=await b$4(s,{workspaceName:p,silent:true});await Q(Se),t.skipGit||await Z(s,_,"Initial commit: Workspai environment"),c||J({workspaceName:p,workspacePath:s,profile:k$1,projectCount:E?.projectCount??0,pythonEngine:"installed",pythonVersion:x.pythonVersion,installMethod:x.installMethod});}catch(v){return _.fail("Failed to create Workspai environment"),F(Se,v)}}async function rt(e){let t=[];if(!b$5())try{let{stdout:r}=await execa("pyenv",["which","python"]),u=r.trim();u&&t.push(u);}catch{}let n=Number(e.split(".")[1]),o=k$1(n,10).map(r=>r.command).filter(Boolean);t.push(`python${e}`,...o,...j());let i=[...new Set(t)];for(let r of i)try{let u=r==="py"?["-3","--version"]:["--version"],h=r==="py"?["-3","-c","import sys; sys.exit(0)"]:["-c","import sys; sys.exit(0)"],{stdout:l}=await execa(r,u,{timeout:2e3}),w=l.match(/Python (\d+\.\d+)/)?.[1];if(w&&te(w,e))return await execa(r,h,{timeout:2e3}),r}catch{continue}return null}async function st(e,t,n,o,i,r=false){await It(n,r),n.start("Finding Python interpreter");let u=await rt(t);u?(e$2.debug(`Found working Python: ${u}`),n.succeed("Python found")):n.warn("Could not verify Python path, proceeding with default"),n.start("Initializing Poetry project");let h=d.join(e,"pyproject.toml"),w=(await b.pathExists(h)?await promises.readFile(h,"utf-8"):"").includes("rapidkit-core");if(w)n.succeed("Poetry project initialized");else {await execa("poetry",["init","--no-interaction","--python",`^${t}`],{cwd:e}),n.succeed("Poetry project initialized");let m=await promises.readFile(h,"utf-8");m.includes("[tool.poetry]")?m=m.replace("[tool.poetry]",`[tool.poetry]
|
|
142
142
|
package-mode = false`):m.includes("[project]")&&(m.includes("[build-system]")?m=m.replace("[build-system]",`
|
|
143
143
|
[tool.poetry]
|
|
144
144
|
package-mode = false
|
|
@@ -147,27 +147,27 @@ package-mode = false
|
|
|
147
147
|
|
|
148
148
|
[tool.poetry]
|
|
149
149
|
package-mode = false
|
|
150
|
-
`),await promises.writeFile(h,m,"utf-8");}n.start("Configuring Poetry");try{await execa("poetry",["config","virtualenvs.in-project","true","--local"],{cwd:e}),n.succeed("Poetry configured");}catch{n.warn("Could not configure Poetry virtualenvs.in-project");}n.start("Creating virtualenv");let g=u||M(),f
|
|
150
|
+
`),await promises.writeFile(h,m,"utf-8");}n.start("Configuring Poetry");try{await execa("poetry",["config","virtualenvs.in-project","true","--local"],{cwd:e}),n.succeed("Poetry configured");}catch{n.warn("Could not configure Poetry virtualenvs.in-project");}n.start("Creating virtualenv");let g=u||M(),f=m(d.join(e,".venv"));try{await execa(g,["-m","venv",".venv"],{cwd:e,timeout:6e4}),n.succeed("Virtualenv created");}catch(c){e$2.debug(`python -m venv failed: ${c}`),n.warn("Could not pre-create virtualenv, Poetry will try"),f=u||M();}try{await execa("poetry",["env","use",f||M()],{cwd:e}),e$2.debug(`Poetry env set to: ${f}`);}catch(c){e$2.debug(`Could not set Poetry env: ${c}`);}if(n.start("Installing RapidKit"),w&&!o){let c=j$1(i||{}),m=c?await b.pathExists(c):false,p=m&&c?c:"rapidkit-core";c&&!m&&e$2.warn(`WORKSPAI_DEV_PATH/RAPIDKIT_DEV_PATH points to a path that does not exist: ${c}. Falling back to PyPI.`),n.text=m?"Installing RapidKit from local path":"Installing RapidKit from PyPI";let s=false,$=null;for(let k=1;k<=3;k++)try{m||d$1({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:k,maxAttempts:3}),await execa(f,["-m","pip","install",p,"--quiet"],{cwd:e,timeout:18e4}),s=true,m||d$1({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:k,maxAttempts:3});break}catch(U){$=U,e$2.debug(`pip install rapidkit-core attempt ${k} failed: ${U}`),k<3&&(n.text=`Retrying installation (attempt ${k+1}/3)`,await new Promise(q=>setTimeout(q,2e3)));}if(!s){let k=$?.stderr||$?.message||"Unknown error";throw e$2.debug(`All pip install attempts failed. Last error: ${k}`),k.includes("Could not find")||k.includes("No matching distribution")?new i$1:new f$1("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
|
|
151
151
|
Error: ${k}
|
|
152
152
|
|
|
153
153
|
Possible solutions:
|
|
154
154
|
1. Check your internet connection
|
|
155
155
|
2. Try installing manually: cd ${d.basename(e)} && poetry add rapidkit-core
|
|
156
|
-
3. Use venv method instead: npx workspai ${d.basename(e)} --install-method=venv`))}}else {n.text="Syncing Poetry environment";try{await execa("poetry",["install","--no-root"],{cwd:e,timeout:12e4}),n.succeed("Poetry environment synced");}catch(c){e$2.debug(`poetry install --no-root failed: ${c}`),n.warn("Could not sync Poetry environment, proceeding with add command");}if(n.start("Installing RapidKit"),o){let c=
|
|
156
|
+
3. Use venv method instead: npx workspai ${d.basename(e)} --install-method=venv`))}}else {n.text="Syncing Poetry environment";try{await execa("poetry",["install","--no-root"],{cwd:e,timeout:12e4}),n.succeed("Poetry environment synced");}catch(c){e$2.debug(`poetry install --no-root failed: ${c}`),n.warn("Could not sync Poetry environment, proceeding with add command");}if(n.start("Installing RapidKit"),o){let c=j$1(i||{});if(!c)throw new f$1("Test mode installation",new Error("No local RapidKit path configured. Set WORKSPAI_DEV_PATH (or legacy RAPIDKIT_DEV_PATH)."));e$2.debug(`Installing from local path: ${c}`),n.text="Installing RapidKit from local path (test mode)",await execa("poetry",["add",c],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let c=false,m=null;for(let p=1;p<=3;p++)try{d$1({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:p,maxAttempts:3}),await execa("poetry",["add","rapidkit-core"],{cwd:e,timeout:6e4*p}),c=true,d$1({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:p,maxAttempts:3});break}catch(s){m=s,e$2.debug(`Poetry add attempt ${p} failed: ${s}`),p<3&&(n.text=`Retrying installation (attempt ${p+1}/3)`,await new Promise($=>setTimeout($,2e3)));}if(!c){let p=m?.stderr||m?.message||"Unknown error";throw e$2.debug(`All Poetry install attempts failed. Last error: ${p}`),p.includes("Could not find")||p.includes("No matching distribution")?new i$1:new f$1("Install rapidkit-core with Poetry",new Error(`Failed to install rapidkit-core after 3 attempts.
|
|
157
157
|
Error: ${p}
|
|
158
158
|
|
|
159
159
|
Possible solutions:
|
|
160
160
|
1. Check your internet connection
|
|
161
161
|
2. Try installing manually: cd ${d.basename(e)} && poetry add rapidkit-core
|
|
162
|
-
3. Use venv method instead: npx workspai ${d.basename(e)} --install-method=venv`))}}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:c}=await import('./pythonRapidkitExec-S35OEIEF.js');if(!await c()&&!o){n.start("Checking optional global pipx installation");let p=await
|
|
162
|
+
3. Use venv method instead: npx workspai ${d.basename(e)} --install-method=venv`))}}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:c}=await import('./pythonRapidkitExec-S35OEIEF.js');if(!await c()&&!o){n.start("Checking optional global pipx installation");let p=await fe(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await H(p,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(s){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),e$2.debug(`pipx install failed: ${s}`);}}}catch(c){n.succeed("Skipped optional global pipx installation"),e$2.debug(`Global install check skipped: ${c}`);}}async function _e(e,t,n,o,i,r=false){n.start(`Checking Python ${t}`);let u=M();try{let{stdout:l}=await execa(u,["--version"]),w=l.match(/Python (\d+\.\d+)/)?.[1];if(w&&!te(w,t))throw new b$6(t,w);n.succeed(`Python ${w} found`);}catch(l){throw l instanceof b$6?l:new b$6(t)}n.start("Creating virtual environment");try{await execa(u,["-m","venv",".venv"],{cwd:e}),n.succeed("Virtual environment created");}catch(l){if(n.fail("Failed to create virtual environment"),(g=>typeof g=="object"&&g!==null&&"stdout"in g&&typeof g.stdout=="string")(l)&&l.stdout.includes("ensurepip is not")){let g$1=l.stdout.match(/apt install (python[\d.]+-venv)/),f=g$1?g$1[1]:"python3-venv";throw new g(f,d.basename(e))}throw new f$1("Virtual environment creation",l instanceof Error?l:new Error(String(l)))}n.start("Installing RapidKit");let h=m(d.join(e,".venv"));if(await execa(h,["-m","pip","install","--upgrade","pip"],{cwd:e}),o){let l=j$1(i||{});if(!l)throw new f$1("Test mode installation",new Error("No local RapidKit path configured. Set WORKSPAI_DEV_PATH (or legacy RAPIDKIT_DEV_PATH)."));e$2.debug(`Installing from local path: ${l}`),n.text="Installing RapidKit from local path (test mode)",await execa(h,["-m","pip","install","-e",l],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let l=false,w=null;for(let g=1;g<=3;g++)try{d$1({status:"started",message:"Installing RapidKit from PyPI",installMethod:"venv",attempt:g,maxAttempts:3}),await execa(h,["-m","pip","install","rapidkit-core"],{cwd:e,timeout:6e4*g}),l=true,d$1({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"venv",attempt:g,maxAttempts:3});break}catch(f){w=f,e$2.debug(`pip install attempt ${g} failed: ${f}`),g<3&&(n.text=`Retrying installation (attempt ${g+1}/3)`,await new Promise(c=>setTimeout(c,2e3)));}if(!l){let g=w?.stderr||w?.message||"Unknown error";throw e$2.debug(`All pip install attempts failed. Last error: ${g}`),g.includes("Could not find")||g.includes("No matching distribution")?new i$1:new f$1("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
|
|
163
163
|
Error: ${g}
|
|
164
164
|
|
|
165
165
|
Possible solutions:
|
|
166
166
|
1. Check your internet connection
|
|
167
167
|
2. Try installing manually: cd ${d.basename(e)} && ${m(".venv")} -m pip install rapidkit-core
|
|
168
|
-
3. Use Poetry instead: npx workspai ${d.basename(e)} --install-method=poetry`))}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:l}=await import('./pythonRapidkitExec-S35OEIEF.js');if(!await l()&&!o){n.start("Checking optional global pipx installation");let g=await
|
|
169
|
-
`,"utf-8");return}h.reason==="constraint-missing"?e$2.debug('Version-aware global reuse skipped: no explicit rapidkit-core version constraint found. Set RAPIDKIT_CORE_PYTHON_PACKAGE (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core>=0.4.0,<0.9.0") to enable version-aware reuse. Proceeding with pipx install/upgrade.'):h.reason==="constraint-unsupported"&&e$2.debug('Version-aware global reuse skipped: RAPIDKIT_CORE_PYTHON_PACKAGE uses an unsupported spec (path/url/git). Use a version range instead (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core==0.4.0" or "rapidkit-core>=0.4.0,<0.9.0"). Proceeding with pipx install/upgrade.'),e$2.debug(`Global RapidKit install is not reusable via version-aware policy (reason=${h.reason}, installed=${h.installedVersion??"unknown"}, expected=${h.expectedConstraint??"none"}). Proceeding with pipx install/upgrade.`);}catch(u){e$2.debug(`Global RapidKit version-aware check failed before pipx install: ${u}`);}let r=await
|
|
170
|
-
`,"utf-8");}async function
|
|
168
|
+
3. Use Poetry instead: npx workspai ${d.basename(e)} --install-method=poetry`))}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:l}=await import('./pythonRapidkitExec-S35OEIEF.js');if(!await l()&&!o){n.start("Checking optional global pipx installation");let g=await fe(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await H(g,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(f){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),e$2.debug(`pipx install failed: ${f}`);}}}catch(l){n.succeed("Skipped optional global pipx installation"),e$2.debug(`Global install check skipped: ${l}`);}}async function lt(e,t,n,o,i=false){if(!n)try{let{checkRapidkitCoreVersionCompatible:u}=await import('./pythonRapidkitExec-S35OEIEF.js'),h=await u();if(h.isCompatible){t.succeed(`RapidKit ${h.installedVersion??""} already compatible globally; skipping pipx installation`),await b.outputFile(d.join(e,".rapidkit-global"),`RapidKit already available globally (version ${h.installedVersion??"unknown"}) and satisfies expected constraint ${h.expectedConstraint??"n/a"}; workspace will reuse the existing installation
|
|
169
|
+
`,"utf-8");return}h.reason==="constraint-missing"?e$2.debug('Version-aware global reuse skipped: no explicit rapidkit-core version constraint found. Set RAPIDKIT_CORE_PYTHON_PACKAGE (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core>=0.4.0,<0.9.0") to enable version-aware reuse. Proceeding with pipx install/upgrade.'):h.reason==="constraint-unsupported"&&e$2.debug('Version-aware global reuse skipped: RAPIDKIT_CORE_PYTHON_PACKAGE uses an unsupported spec (path/url/git). Use a version range instead (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core==0.4.0" or "rapidkit-core>=0.4.0,<0.9.0"). Proceeding with pipx install/upgrade.'),e$2.debug(`Global RapidKit install is not reusable via version-aware policy (reason=${h.reason}, installed=${h.installedVersion??"unknown"}, expected=${h.expectedConstraint??"none"}). Proceeding with pipx install/upgrade.`);}catch(u){e$2.debug(`Global RapidKit version-aware check failed before pipx install: ${u}`);}let r=await fe(t,i);if(t.start("Installing RapidKit globally with pipx"),n){let u=j$1(o||{});if(!u)throw new f$1("Test mode installation",new Error("No local RapidKit path configured. Set WORKSPAI_DEV_PATH (or legacy RAPIDKIT_DEV_PATH)."));e$2.debug(`Installing from local path: ${u}`),t.text="Installing RapidKit from local path (test mode)",await H(r,["install","-e",u]);}else {t.text="Installing RapidKit from PyPI",d$1({status:"started",message:"Installing RapidKit from PyPI",installMethod:"pipx"});try{await H(r,["install","rapidkit-core"]),d$1({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"pipx"});}catch(u){try{t.text="RapidKit already installed globally, upgrading to match expected version",await H(r,["upgrade","rapidkit-core"]),d$1({status:"succeeded",message:"RapidKit upgraded from PyPI",installMethod:"pipx"});}catch(h){throw e$2.debug(`pipx install/upgrade failed: install=${u}, upgrade=${h}`),new i$1}}}t.succeed("RapidKit installed globally"),await b.outputFile(d.join(e,".rapidkit-global"),`RapidKit installed globally with pipx
|
|
170
|
+
`,"utf-8");}async function pn(e,t){let{skipGit:n=false,installPythonEngine:o=false,testMode:i=false,userConfig:r={},yes:u=false,installMethod:h,pythonVersion:l="3.10"}=t||{},w="venv";o&&(w=h||r.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return e$2.warn("Poetry not found \u2014 auto-selecting venv. Pass --install-method poetry to override."),"venv"}})());let g=b$3("Registering workspace",{component:"create",phase:"workspace.register"}),f=!t?.lifecycleTransaction,c=t?.lifecycleTransaction??await ht(e);f||await Be(c,e);try{let m=d.basename(e),p=o?void 0:{bootstrapNote:"python-engine-skipped",pythonEngine:"skipped",pythonEngineReason:"project-workspace-foundation"};await X(e,m,w,o?l:void 0,p),await G(e),await ee(e,m,w,o?l:void 0,t?.profile??"minimal",p),o?w==="poetry"?(await Qe(e,m),await st(e,l,g,i,r,u)):w==="venv"?await _e(e,l,g,i,r):await lt(e,g,i,r,u):await he(e,w,{pythonEngineSkipped:true}),o&&await he(e,w),g.succeed(o?"Workspace registered":"Workspace registered (Python engine skipped)"),await b$4(e,{workspaceName:d.basename(e),silent:i}),f&&await Q(c),n||await Z(e,g,"Initial commit: Workspai workspace");}catch(m){if(g.fail("Failed to register workspace"),f)return F(c,m);throw m}}async function Ct(e,t,n){let o=b$3("Creating demo workspace",{component:"create",phase:"workspace.demo"});try{await b.ensureDir(e),o.succeed("Directory created"),o.start("Setting up demo kit generator");let i=JSON.stringify({name:`${t}-workspace`,version:"1.0.0",private:true,description:"Workspai demo workspace",scripts:{generate:"node generate-demo.js"}},null,2);await promises.writeFile(d.join(e,"package.json"),i,"utf-8"),await promises.writeFile(d.join(e,"generate-demo.js"),`#!/usr/bin/env node
|
|
171
171
|
/**
|
|
172
172
|
* Demo Kit Generator - Create FastAPI demo projects
|
|
173
173
|
*
|
|
@@ -652,7 +652,7 @@ ${t}/
|
|
|
652
652
|
---
|
|
653
653
|
|
|
654
654
|
**Generated with Workspai** | [GitHub](https://github.com/chistiq/workspai)
|
|
655
|
-
`;if(await promises.writeFile(d.join(e,"README.md"),u,"utf-8"),o.succeed("Demo workspace setup complete"),!n)if(await
|
|
655
|
+
`;if(await promises.writeFile(d.join(e,"README.md"),u,"utf-8"),o.succeed("Demo workspace setup complete"),!n)if(await Je(e))o.warn("Git initialization skipped because target is already inside a git worktree");else {o.start("Initializing git repository");try{await execa("git",["init"],{cwd:e,env:a()}),await b.outputFile(d.join(e,".gitignore"),`# Dependencies
|
|
656
656
|
node_modules/
|
|
657
657
|
|
|
658
658
|
# Generated projects
|
|
@@ -668,14 +668,14 @@ __pycache__/
|
|
|
668
668
|
`,"utf-8"),await execa("git",["add","."],{cwd:e,env:a()}),await execa("git",["commit","-m","Initial commit: Demo workspace"],{cwd:e,env:a()}),o.succeed("Git repository initialized");}catch{o.warn("Could not initialize git repository");}}console.log(a$2.green(`
|
|
669
669
|
\u2728 Demo workspace created successfully!
|
|
670
670
|
`)),console.log(a$2.cyan("\u{1F4C2} Location:"),a$2.white(e)),console.log(a$2.cyan(`\u{1F680} Get started:
|
|
671
|
-
`)),console.log(a$2.white(` ${
|
|
671
|
+
`)),console.log(a$2.white(` ${l(e)}`)),console.log(a$2.white(" node generate-demo.js my-api")),console.log(a$2.white(" cd my-api")),console.log(a$2.white(" workspai init")),console.log(a$2.white(" workspai dev")),console.log(),console.log(a$2.yellow("\u{1F4A1} Note:"),"This is a demo workspace. For Python engine features:"),console.log(a$2.cyan(" pipx install rapidkit-core")),console.log();}catch(i){throw o.fail("Failed to create demo workspace"),i}}async function At(e,t,n,o,i,r,u,h=false,l$1=false){if(console.log(a$2.cyan(`
|
|
672
672
|
\u{1F50D} Dry-run mode - what would be created:
|
|
673
673
|
`)),console.log(a$2.white("\u{1F4C2} Workspace path:"),e),console.log(a$2.white("\u{1F4DB} Name:"),a$2.cyan(t)),n)console.log(a$2.white("\u{1F4E6} Type:"),"Demo environment"),console.log(a$2.white(`
|
|
674
674
|
\u{1F4DD} Files to create:`)),console.log(a$2.gray(" - package.json")),console.log(a$2.gray(" - generate-demo.js (project generator)")),console.log(a$2.gray(" - README.md")),console.log(a$2.gray(" - .gitignore")),console.log(a$2.white(`
|
|
675
|
-
\u{1F3AF} Capabilities:`)),console.log(a$2.gray(" - Generate FastAPI/NestJS demo projects")),console.log(a$2.gray(" - No Python RapidKit installation required")),console.log(a$2.gray(" - Bundled templates"));else {let w=i||"minimal",g=r,f=u,m=new Set(["python-only","polyglot","enterprise"]).has(w);console.log(a$2.white("\u{1F4E6} Profile:"),a$2.cyan(w)),console.log(a$2.white("\u{1F4DD} Configuration:")),m?(console.log(a$2.gray(` - Python version: ${f}`)),console.log(a$2.gray(` - Python engine: ${l?"Skipped":`Install with ${g}`}`)),console.log(a$2.gray(` - Git init: ${h?"No":"Yes"}`))):(console.log(a$2.gray(" - Python-free profile (no Python needed)")),console.log(a$2.gray(` - Git init: ${h?"No":"Yes"}`))),console.log(a$2.white(`
|
|
676
|
-
\u{1F4CB} Files to create:`)),console.log(a$2.gray(" - .workspai-workspace (workspace marker)")),console.log(a$2.gray(" - .workspai/ (workspace config directory)")),console.log(a$2.gray(" - README.md")),console.log(a$2.gray(" - .gitignore")),m&&!l&&console.log(a$2.gray(` - ${g==="poetry"?"pyproject.toml + poetry.lock":".venv/ (virtual environment)"}`)),console.log(a$2.white(`
|
|
677
|
-
\u2699\uFE0F Environment setup:`)),m&&l?console.log(a$2.gray(" - Python engine setup skipped")):m&&console.log(g==="poetry"?a$2.gray(" - Poetry virtual environment created (recommended, includes dependency management)"):g==="venv"?a$2.gray(" - Python venv created in .venv/ (standard, zero extra tools)"):a$2.gray(" - Global pipx install (isolated, not local to workspace)")),console.log(a$2.white(`
|
|
678
|
-
\u{1F680} Next steps:`)),console.log(a$2.gray(` 1. ${
|
|
675
|
+
\u{1F3AF} Capabilities:`)),console.log(a$2.gray(" - Generate FastAPI/NestJS demo projects")),console.log(a$2.gray(" - No Python RapidKit installation required")),console.log(a$2.gray(" - Bundled templates"));else {let w=i||"minimal",g=r,f=u,m=new Set(["python-only","polyglot","enterprise"]).has(w);console.log(a$2.white("\u{1F4E6} Profile:"),a$2.cyan(w)),console.log(a$2.white("\u{1F4DD} Configuration:")),m?(console.log(a$2.gray(` - Python version: ${f}`)),console.log(a$2.gray(` - Python engine: ${l$1?"Skipped":`Install with ${g}`}`)),console.log(a$2.gray(` - Git init: ${h?"No":"Yes"}`))):(console.log(a$2.gray(" - Python-free profile (no Python needed)")),console.log(a$2.gray(` - Git init: ${h?"No":"Yes"}`))),console.log(a$2.white(`
|
|
676
|
+
\u{1F4CB} Files to create:`)),console.log(a$2.gray(" - .workspai-workspace (workspace marker)")),console.log(a$2.gray(" - .workspai/ (workspace config directory)")),console.log(a$2.gray(" - README.md")),console.log(a$2.gray(" - .gitignore")),m&&!l$1&&console.log(a$2.gray(` - ${g==="poetry"?"pyproject.toml + poetry.lock":".venv/ (virtual environment)"}`)),console.log(a$2.white(`
|
|
677
|
+
\u2699\uFE0F Environment setup:`)),m&&l$1?console.log(a$2.gray(" - Python engine setup skipped")):m&&console.log(g==="poetry"?a$2.gray(" - Poetry virtual environment created (recommended, includes dependency management)"):g==="venv"?a$2.gray(" - Python venv created in .venv/ (standard, zero extra tools)"):a$2.gray(" - Global pipx install (isolated, not local to workspace)")),console.log(a$2.white(`
|
|
678
|
+
\u{1F680} Next steps:`)),console.log(a$2.gray(` 1. ${l(e)}`)),console.log(a$2.gray(" 2. npx workspai create project")),console.log(a$2.gray(" 3. npx workspai init")),console.log(a$2.gray(" 4. npx workspai dev")),console.log(a$2.white(`
|
|
679
679
|
\u{1F4A1} Learn more:`)),console.log(a$2.gray(" \u2022 Change profile later: workspai bootstrap --profile <profile>")),console.log(a$2.gray(" \u2022 Profile options: minimal|java-only|python-only|node-only|go-only|dotnet-only|polyglot|enterprise")),console.log(a$2.gray(" \u2022 Help: npx workspai --help"));}console.log(a$2.white(`
|
|
680
680
|
\u2728 To proceed: remove --dry-run flag
|
|
681
|
-
`));}export{Z as a,
|
|
681
|
+
`));}export{Z as a,Xe as b,ln as c,kt as d,he as e,cn as f,pn as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {a as a$1}from'./chunk-J7G3YL4O.js';import {b}from'./chunk-UJXE4UAX.js';import {intro,confirm,isCancel,password,text,multiselect,select,cancel}from'@clack/prompts';var c=false;function
|
|
1
|
+
import {a as a$1}from'./chunk-J7G3YL4O.js';import {b}from'./chunk-UJXE4UAX.js';import {intro,confirm,isCancel,password,text,multiselect,select,cancel}from'@clack/prompts';var c=false;function L(n){if(b()||c)return;c=true;let i=`${a$1.brand("\u25C6")} ${a$1.white("Workspai")}${n?a$1.dim(` ${n}`):""}`;intro(i);}function a(n="Cancelled"){b()||(cancel(a$1.dim(n)),c=false);}function m(n){if(n)return i=>{let e=n(i);if(e!==true)return e===false?"Invalid value":e}}function v(n){return n.replace(/^[\p{Emoji_Presentation}\p{Extended_Pictographic}\s]+/u,"").trim()}function E(n){let i=v(n);for(let e of [" \u2014 "," \u2013 "," - "]){let t=i.indexOf(e);if(t>0)return {label:i.slice(0,t).trim(),hint:i.slice(t+e.length).trim()}}return {label:i}}function g(n){if(n.label)return {label:n.label,hint:n.hint};let i=E(n.name??String(n.value));return {label:i.label,hint:n.hint??i.hint}}function w(n,i){if(typeof n=="number")return n;if(n===void 0)return;let e=i.findIndex(t=>t.value===n);return e>=0?e:void 0}function h(n,i){return n.when===void 0?true:typeof n.when=="function"?n.when(i):n.when}async function Q(n,i){let e=n,t=v(e.message??e.name);if(e.type==="confirm"){let r=await confirm({message:t,initialValue:typeof e.default=="boolean"?e.default:false,active:a$1.success("yes"),inactive:a$1.dim("no")});return isCancel(r)&&(a(),process.exit(130)),r}if(e.type==="password"){let r=await password({message:t,validate:m(e.validate)});return isCancel(r)&&(a(),process.exit(130)),r}if(e.type==="input"){let r=await text({message:t,defaultValue:typeof e.default=="string"?e.default:void 0,initialValue:e.initialValue??(typeof e.default=="string"?e.default:void 0),validate:m(e.validate),placeholder:typeof e.default=="string"?e.default:void 0});return isCancel(r)&&(a(),process.exit(130)),r}if(e.type==="checkbox"){let r=[...e.choices??[]],l=await multiselect({message:t,options:r.map(u=>{let s=g(u);return {value:u.value,label:s.label,hint:s.hint}}),required:false});return isCancel(l)&&(a(),process.exit(130)),l}if(e.type==="rawlist"||e.type==="list"){let r=[...e.choices??[]].filter(s=>!s.disabled),l=w(e.default,r),u=await select({message:t,options:r.map(s=>{let p=g(s);return {value:s.value,label:p.label,hint:p.hint}}),initialValue:l!==void 0?r[l]?.value:void 0});return isCancel(u)&&(a(),process.exit(130)),u}throw new Error(`Unsupported prompt type: ${e.type}`)}async function A(n){if(b()){let e={};for(let t of n)if(h(t,e))if(t.default!==void 0)e[t.name]=t.default;else if(t.type==="confirm")e[t.name]=false;else if(t.type==="checkbox")e[t.name]=[];else if(t.choices?.length){let r=w(t.default,[...t.choices]);e[t.name]=r!==void 0?t.choices[r]?.value:t.choices[0]?.value;}else e[t.name]="";return e}let i={};for(let e of n)h(e,i)&&(i[e.name]=await Q(e));return i}export{L as a,A as b};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {a as a$2}from'./chunk-AMGIXK6Z.js';import {j,l as l$1}from'./chunk-ZQ36CTLF.js';import {g}from'./chunk-UVIBPWOG.js';import {a as a$1}from'./chunk-QMNJTI65.js';import {v}from'./chunk-VRZAN3WS.js';import {j as j$1,e}from'./chunk-RU3UT7GJ.js';import {b,c as c$1}from'./chunk-4KAYWMNE.js';import {c,d}from'./chunk-TJRVWVAZ.js';import {a}from'./chunk-COICGD62.js';import {f as f$1,g as g$1,h as h$2}from'./chunk-IQJL3LBM.js';import {k,l,h as h$1,m,n,p as p$1,q as q$1}from'./chunk-VEMGICT4.js';import {a as a$3}from'./chunk-4AAXIWYY.js';import {o as o$1,r as r$1,u}from'./chunk-QDM6TWFK.js';import {o,r as r$2,s}from'./chunk-MD4CHXV3.js';import {f,h}from'./chunk-BLEIUQL6.js';import {b as b$1}from'./chunk-VN2MKTQO.js';import {c as c$2}from'./chunk-EFHSRPW7.js';import {p,q,z,A,y,x}from'./chunk-ODK4LCEL.js';import ge from'path';import pe from'fs-extra';function r(t,s){if(!t)throw new Error(`Workspace Intelligence run semantic violation: ${s}`)}function de(t,s){return t.length===s.length&&t.every((m,u)=>m===s[u])}function ue(t){b$1(p.intelligenceRun,t,"Workspace Intelligence run report"),r(t.chainSchemaVersion===a,`chainSchemaVersion must be ${a}`),r(t.artifactPath===p.intelligenceRun,`artifactPath must be ${p.intelligenceRun}`),r(t.preflight.length===y.length,`preflight must contain exactly ${y.length} entries`);for(let[d,n]of y.entries()){let a=t.preflight[d];r(a?.id===n,`preflight[${d}].id must be ${n}`),r(de(a.artifacts,z[n]),`${n} preflight artifacts must match the runtime registry`),n==="sync"?r(a.status==="passed"&&a.result==="synchronized"||a.status==="failed"&&a.result==="failed","sync preflight status and result are incoherent"):r(a.status==="passed"&&(a.result==="created"||a.result==="reused")||a.status==="failed"&&a.result==="failed"||a.status==="skipped"&&a.result==="skipped","baseline preflight status and result are incoherent");}let s=t.preflight[1];r(t.baselineCreated===(s?.result==="created"),"baselineCreated must match the baseline preflight result"),r(t.stages.length===x.length,`stages must contain exactly ${x.length} canonical steps`);let m=t.preflight[0],u=m?.status==="failed";for(let[d,n]of x.entries()){let a=t.stages[d];r(a?.id===n,`stages[${d}].id must be ${n}`),r(de(a.artifacts,A[n].produces),`${n} artifacts must match the runtime registry`),u&&r(a.status==="skipped",`${n} must be skipped after a hard failure`),a.status==="passed"?r(a.exitCode===0,`${n} passed stage must have exitCode 0`):a.status==="blocked"?r(a.exitCode!==0,`${n} blocked stage must have a non-zero exitCode`):a.status==="failed"?(r(a.exitCode===1,`${n} failed stage must have exitCode 1`),u=true):(r(a.exitCode===0,`${n} skipped stage must have exitCode 0`),r(a.durationMs===0,`${n} skipped stage must have durationMs 0`)),d===0&&((m?.status==="failed"||a.status==="failed")&&r(s?.status==="skipped","baseline must be skipped when sync or model fails"),s?.status==="skipped"&&r(m?.status==="failed"||a.status==="failed"||a.status==="skipped","baseline may be skipped only after an upstream failure"),s?.status!=="passed"&&(u=true));}let h=t.preflight.some(d=>d.status==="failed")||t.stages.some(d=>d.status==="failed"),y$1=t.stages.some(d=>d.status==="blocked"),l=h?"failed":y$1?"blocked":"passed",p$1=l==="failed"?1:l==="blocked"?2:0;r(t.status===l,`status must be ${l}`),r(t.exitCode===p$1,`exitCode must be ${p$1}`);}var we=p.intelligenceRun,Ee=q.intelligenceRun,L=we;function I(t){c$2({action:"intelligence",status:t.status==="started"?"started":t.status==="passed"?"succeeded":t.status==="failed"?"failed":"warn",message:t.message,metadata:{phase:`workspace.intelligence.${t.kind}.${t.id}`,intelligenceMilestoneId:t.id,intelligenceMilestoneKind:t.kind,intelligenceMilestoneStatus:t.status}});}async function Ue(t){let s=ge.resolve(t.workspacePath);return f(s,L,()=>ye({...t,workspacePath:s}),{timeoutMs:15*6e4,staleAfterMs:3e4})}async function ye(t){let s$1=t.workspacePath,m$1=[],u$1=[],h$3=false,y=async(e,o)=>{let c=[...z[e]];if(h$3){I({id:e,kind:"preflight",status:"skipped",message:`${e} prerequisite skipped after an upstream failure`}),m$1.push({id:e,status:"skipped",result:"skipped",durationMs:0,artifacts:c,message:"skipped because a required upstream operation failed"});return}let k=Date.now();I({id:e,kind:"preflight",status:"started",message:`${e} prerequisite started`});try{let i=await o();I({id:e,kind:"preflight",status:"passed",message:i.message}),m$1.push({id:e,status:"passed",result:i.result,durationMs:Date.now()-k,artifacts:c,message:i.message});}catch(i){h$3=true;let f=i instanceof Error?i.message:String(i);I({id:e,kind:"preflight",status:"failed",message:f}),m$1.push({id:e,status:"failed",result:"failed",durationMs:Date.now()-k,artifacts:c,message:f});}},l$2=async(e,o)=>{let c=[...A[e].produces];if(h$3){I({id:e,kind:"stage",status:"skipped",message:`${e} skipped after an upstream failure`}),u$1.push({id:e,status:"skipped",durationMs:0,artifacts:c,exitCode:0,message:"skipped because a required upstream stage failed"});return}let k=Date.now();I({id:e,kind:"stage",status:"started",message:`${e} started`});try{let i=await o(),f=i.exitCode??0,w=i.blocked||f!==0?"blocked":"passed";I({id:e,kind:"stage",status:w,message:i.message}),u$1.push({id:e,status:w,durationMs:Date.now()-k,artifacts:c,exitCode:f,message:i.message});}catch(i){h$3=true;let f=i instanceof Error?i.message:String(i);I({id:e,kind:"stage",status:"failed",message:f}),u$1.push({id:e,status:"failed",durationMs:Date.now()-k,artifacts:c,exitCode:1,message:f});}};await y("sync",async()=>{let e=await g(s$1,true),o$1=await o({workspacePath:s$1});return {result:"synchronized",message:`registry ${e.added.length} added/${e.skipped} existing; contract ${o$1.contract.projects.length} projects`}});let p$2,d$1=()=>{if(!p$2)throw new Error("canonical workspace model is unavailable");return p$2};await l$2("model",async()=>(p$2={...await r$1({workspacePath:s$1,includeEvidence:true}),build:o$1({mode:"full",engineStatus:"disabled"})},await u(p$2,s$1),{message:`${p$2.summary.projectCount} projects modeled`}));let n$1=ge.join(s$1,p.snapshot),a$4=false;await y("baseline",async()=>{if(!await pe.pathExists(n$1)){let c=await k({workspacePath:s$1,model:d$1()});return await l(c,s$1),a$4=true,{result:"created",message:"initial structural baseline created"}}let e=await pe.readJson(n$1),o=h$1(e);return o?(await l(o,s$1),{result:"reused",message:"legacy structural baseline migrated and reused"}):{result:"reused",message:"existing structural baseline reused"}}),await l$2("diff",async()=>{let e=await m({workspacePath:s$1,fromPath:p.snapshot,model:d$1()});return await n(e,s$1),{message:e.summary.changed?"workspace changes detected":"no workspace changes"}}),await l$2("impact",async()=>{let e=await p$1({workspacePath:s$1,fromPath:p.diff});return await q$1(e,s$1),{message:`${e.summary.risk} risk; ${e.summary.affectedProjects} affected`}}),await l$2("doctor-evidence",async()=>{let e=await v({workspace:s$1,json:true,quiet:true,profile:t.strict===true?"enterprise-strict":"local"});return {exitCode:e,blocked:e!==0,message:`doctor exit ${e}`}}),await l$2("contract-evidence",async()=>{let e=await r$2({workspacePath:s$1,strict:true});return await s({workspacePath:s$1,result:e}),{exitCode:e.status==="passed"?0:1,blocked:e.status!=="passed",message:`contract ${e.status}`}}),await l$2("analyze-evidence",async()=>{let e=await a$1({workspacePath:s$1,json:true,strict:t.strict===true});return {blocked:e.summary.verdict==="blocked"||t.strict===true&&e.summary.verdict==="needs-attention",exitCode:e.summary.verdict==="blocked"||t.strict===true&&e.summary.verdict==="needs-attention"?1:0,message:`analyze ${e.summary.verdict} (${e.summary.score}/100)`}}),await l$2("readiness-evidence",async()=>{let e=await a$2({startPath:s$1,writeReport:true,skipVerify:true});return {blocked:e.overallStatus==="fail"||t.strict===true&&e.overallStatus==="warn",exitCode:e.overallStatus==="fail"||t.strict===true&&e.overallStatus==="warn"?1:0,message:`pre-verify readiness ${e.overallStatus}`}}),await l$2("verify",async()=>{let e$1=await f$1({workspacePath:s$1,fromImpactPath:p.impact});await g$1(e$1,s$1);let o=h$2(e$1,{strict:t.strict===true});return await j$1(s$1,e(e$1,o.passed)),{blocked:!o.passed,exitCode:o.exitCode,message:`${e$1.summary.verdict}; gate ${o.passed?"passed":"blocked"}`}}),await l$2("context",async()=>{let e=await c({workspacePath:s$1,model:d$1(),agent:t.agent??"generic",includeEvidence:true});return await d(e,s$1),{message:`context grounded for ${e.agent}`}}),await l$2("agent-sync",async()=>{let e=await l$1({workspacePath:s$1,agent:t.agent??"generic",targets:["all"],write:true,refreshContext:false,strict:t.strict===true,preset:"enterprise"}),o=false,c$1=await a$3(s$1);if(c$1.status==="miss"){if(c$1.reason!=="live-input-mismatch")throw new Error(`Agent grounding left canonical evidence invalid (${c$1.reason}).`);p$2={...await r$1({workspacePath:s$1,includeEvidence:true}),build:o$1({mode:"full",engineStatus:"disabled"})},await u(p$2,s$1);let f=await c({workspacePath:s$1,model:p$2,agent:t.agent??"generic",includeEvidence:true});await d(f,s$1);let w=await l$1({workspacePath:s$1,agent:t.agent??"generic",targets:["all"],write:true,refreshContext:false,strict:t.strict===true,preset:"enterprise"});e={...w,writtenFiles:[...new Set([...e.writtenFiles,...w.writtenFiles])].sort(),strictViolations:[...new Set([...e.strictViolations??[],...w.strictViolations??[]])].sort()};let O=await a$3(s$1);if(O.status==="miss")throw new Error(`Agent grounding reconciliation did not produce fresh canonical evidence (${O.reason}).`);o=true;}let k=e.strictViolations??[],i=t.strict===true&&k.length>0;return {blocked:i,exitCode:i?2:0,message:i?`${e.writtenFiles.length} grounding files written; ${k.length} strict grounding violation(s): ${k.join("; ")}`:`${e.writtenFiles.length} grounding files written; portable entry surfaces prepared for all supported hosts${o?"; canonical Model/Graph freshness sealed":""}`}}),await l$2("explain",async()=>{let e=await b({workspacePath:s$1,target:{kind:"release-blocked"}});await c$1(e,s$1);let o=t.strict===true?u$1.filter(c=>c.status==="blocked").map(c=>c.id):[];return {message:o.length>0&&e.blocking!==true?`Strict policy blocked advisory or incomplete evidence in ${o.join(", ")}. ${e.summary}`:e.summary}});let me=u$1.some(e=>e.status==="blocked"),G=h$3?"failed":me?"blocked":"passed",fe=h$3?1:G==="blocked"?2:0,b$1={schemaVersion:Ee,chainSchemaVersion:a,generatedAt:new Date().toISOString(),workspacePath:s$1,baselineCreated:a$4,preflight:m$1,status:G,exitCode:fe,stages:u$1,artifactPath:L};ue(b$1),await h(s$1,L,b$1);let ke=await j({workspacePath:s$1});return await h(s$1,p.agentIndex,ke),b$1}export{we as a,Ee as b,Ue as c};
|
|
1
|
+
import {a as a$2}from'./chunk-TQW2SZHH.js';import {j,l as l$1}from'./chunk-ZXYTWF2R.js';import {g}from'./chunk-L3O2QXKH.js';import {a as a$1}from'./chunk-VT4WPXTO.js';import {v}from'./chunk-NZQKHGPE.js';import {j as j$1,e}from'./chunk-RU3UT7GJ.js';import {b,c as c$1}from'./chunk-3O344BX3.js';import {c,d}from'./chunk-U5WP4HDH.js';import {a}from'./chunk-COICGD62.js';import {f as f$1,g as g$1,h as h$2}from'./chunk-ZONAHZBG.js';import {k,l,h as h$1,m,n,p as p$1,q as q$1}from'./chunk-SKHRUHXO.js';import {a as a$3}from'./chunk-ETTZXKAS.js';import {o as o$1,r as r$1,u}from'./chunk-O4TZKLEC.js';import {o,r as r$2,s}from'./chunk-WU5M6UP7.js';import {f,h}from'./chunk-BLEIUQL6.js';import {b as b$1}from'./chunk-VN2MKTQO.js';import {c as c$2}from'./chunk-EFHSRPW7.js';import {p,q,z,A,y,x}from'./chunk-ODK4LCEL.js';import ge from'path';import pe from'fs-extra';function r(t,s){if(!t)throw new Error(`Workspace Intelligence run semantic violation: ${s}`)}function de(t,s){return t.length===s.length&&t.every((m,u)=>m===s[u])}function ue(t){b$1(p.intelligenceRun,t,"Workspace Intelligence run report"),r(t.chainSchemaVersion===a,`chainSchemaVersion must be ${a}`),r(t.artifactPath===p.intelligenceRun,`artifactPath must be ${p.intelligenceRun}`),r(t.preflight.length===y.length,`preflight must contain exactly ${y.length} entries`);for(let[d,n]of y.entries()){let a=t.preflight[d];r(a?.id===n,`preflight[${d}].id must be ${n}`),r(de(a.artifacts,z[n]),`${n} preflight artifacts must match the runtime registry`),n==="sync"?r(a.status==="passed"&&a.result==="synchronized"||a.status==="failed"&&a.result==="failed","sync preflight status and result are incoherent"):r(a.status==="passed"&&(a.result==="created"||a.result==="reused")||a.status==="failed"&&a.result==="failed"||a.status==="skipped"&&a.result==="skipped","baseline preflight status and result are incoherent");}let s=t.preflight[1];r(t.baselineCreated===(s?.result==="created"),"baselineCreated must match the baseline preflight result"),r(t.stages.length===x.length,`stages must contain exactly ${x.length} canonical steps`);let m=t.preflight[0],u=m?.status==="failed";for(let[d,n]of x.entries()){let a=t.stages[d];r(a?.id===n,`stages[${d}].id must be ${n}`),r(de(a.artifacts,A[n].produces),`${n} artifacts must match the runtime registry`),u&&r(a.status==="skipped",`${n} must be skipped after a hard failure`),a.status==="passed"?r(a.exitCode===0,`${n} passed stage must have exitCode 0`):a.status==="blocked"?r(a.exitCode!==0,`${n} blocked stage must have a non-zero exitCode`):a.status==="failed"?(r(a.exitCode===1,`${n} failed stage must have exitCode 1`),u=true):(r(a.exitCode===0,`${n} skipped stage must have exitCode 0`),r(a.durationMs===0,`${n} skipped stage must have durationMs 0`)),d===0&&((m?.status==="failed"||a.status==="failed")&&r(s?.status==="skipped","baseline must be skipped when sync or model fails"),s?.status==="skipped"&&r(m?.status==="failed"||a.status==="failed"||a.status==="skipped","baseline may be skipped only after an upstream failure"),s?.status!=="passed"&&(u=true));}let h=t.preflight.some(d=>d.status==="failed")||t.stages.some(d=>d.status==="failed"),y$1=t.stages.some(d=>d.status==="blocked"),l=h?"failed":y$1?"blocked":"passed",p$1=l==="failed"?1:l==="blocked"?2:0;r(t.status===l,`status must be ${l}`),r(t.exitCode===p$1,`exitCode must be ${p$1}`);}var we=p.intelligenceRun,Ee=q.intelligenceRun,L=we;function I(t){c$2({action:"intelligence",status:t.status==="started"?"started":t.status==="passed"?"succeeded":t.status==="failed"?"failed":"warn",message:t.message,metadata:{phase:`workspace.intelligence.${t.kind}.${t.id}`,intelligenceMilestoneId:t.id,intelligenceMilestoneKind:t.kind,intelligenceMilestoneStatus:t.status}});}async function Ue(t){let s=ge.resolve(t.workspacePath);return f(s,L,()=>ye({...t,workspacePath:s}),{timeoutMs:15*6e4,staleAfterMs:3e4})}async function ye(t){let s$1=t.workspacePath,m$1=[],u$1=[],h$3=false,y=async(e,o)=>{let c=[...z[e]];if(h$3){I({id:e,kind:"preflight",status:"skipped",message:`${e} prerequisite skipped after an upstream failure`}),m$1.push({id:e,status:"skipped",result:"skipped",durationMs:0,artifacts:c,message:"skipped because a required upstream operation failed"});return}let k=Date.now();I({id:e,kind:"preflight",status:"started",message:`${e} prerequisite started`});try{let i=await o();I({id:e,kind:"preflight",status:"passed",message:i.message}),m$1.push({id:e,status:"passed",result:i.result,durationMs:Date.now()-k,artifacts:c,message:i.message});}catch(i){h$3=true;let f=i instanceof Error?i.message:String(i);I({id:e,kind:"preflight",status:"failed",message:f}),m$1.push({id:e,status:"failed",result:"failed",durationMs:Date.now()-k,artifacts:c,message:f});}},l$2=async(e,o)=>{let c=[...A[e].produces];if(h$3){I({id:e,kind:"stage",status:"skipped",message:`${e} skipped after an upstream failure`}),u$1.push({id:e,status:"skipped",durationMs:0,artifacts:c,exitCode:0,message:"skipped because a required upstream stage failed"});return}let k=Date.now();I({id:e,kind:"stage",status:"started",message:`${e} started`});try{let i=await o(),f=i.exitCode??0,w=i.blocked||f!==0?"blocked":"passed";I({id:e,kind:"stage",status:w,message:i.message}),u$1.push({id:e,status:w,durationMs:Date.now()-k,artifacts:c,exitCode:f,message:i.message});}catch(i){h$3=true;let f=i instanceof Error?i.message:String(i);I({id:e,kind:"stage",status:"failed",message:f}),u$1.push({id:e,status:"failed",durationMs:Date.now()-k,artifacts:c,exitCode:1,message:f});}};await y("sync",async()=>{let e=await g(s$1,true),o$1=await o({workspacePath:s$1});return {result:"synchronized",message:`registry ${e.added.length} added/${e.skipped} existing; contract ${o$1.contract.projects.length} projects`}});let p$2,d$1=()=>{if(!p$2)throw new Error("canonical workspace model is unavailable");return p$2};await l$2("model",async()=>(p$2={...await r$1({workspacePath:s$1,includeEvidence:true}),build:o$1({mode:"full",engineStatus:"disabled"})},await u(p$2,s$1),{message:`${p$2.summary.projectCount} projects modeled`}));let n$1=ge.join(s$1,p.snapshot),a$4=false;await y("baseline",async()=>{if(!await pe.pathExists(n$1)){let c=await k({workspacePath:s$1,model:d$1()});return await l(c,s$1),a$4=true,{result:"created",message:"initial structural baseline created"}}let e=await pe.readJson(n$1),o=h$1(e);return o?(await l(o,s$1),{result:"reused",message:"legacy structural baseline migrated and reused"}):{result:"reused",message:"existing structural baseline reused"}}),await l$2("diff",async()=>{let e=await m({workspacePath:s$1,fromPath:p.snapshot,model:d$1()});return await n(e,s$1),{message:e.summary.changed?"workspace changes detected":"no workspace changes"}}),await l$2("impact",async()=>{let e=await p$1({workspacePath:s$1,fromPath:p.diff});return await q$1(e,s$1),{message:`${e.summary.risk} risk; ${e.summary.affectedProjects} affected`}}),await l$2("doctor-evidence",async()=>{let e=await v({workspace:s$1,json:true,quiet:true,profile:t.strict===true?"enterprise-strict":"local"});return {exitCode:e,blocked:e!==0,message:`doctor exit ${e}`}}),await l$2("contract-evidence",async()=>{let e=await r$2({workspacePath:s$1,strict:true});return await s({workspacePath:s$1,result:e}),{exitCode:e.status==="passed"?0:1,blocked:e.status!=="passed",message:`contract ${e.status}`}}),await l$2("analyze-evidence",async()=>{let e=await a$1({workspacePath:s$1,json:true,strict:t.strict===true});return {blocked:e.summary.verdict==="blocked"||t.strict===true&&e.summary.verdict==="needs-attention",exitCode:e.summary.verdict==="blocked"||t.strict===true&&e.summary.verdict==="needs-attention"?1:0,message:`analyze ${e.summary.verdict} (${e.summary.score}/100)`}}),await l$2("readiness-evidence",async()=>{let e=await a$2({startPath:s$1,writeReport:true,skipVerify:true});return {blocked:e.overallStatus==="fail"||t.strict===true&&e.overallStatus==="warn",exitCode:e.overallStatus==="fail"||t.strict===true&&e.overallStatus==="warn"?1:0,message:`pre-verify readiness ${e.overallStatus}`}}),await l$2("verify",async()=>{let e$1=await f$1({workspacePath:s$1,fromImpactPath:p.impact});await g$1(e$1,s$1);let o=h$2(e$1,{strict:t.strict===true});return await j$1(s$1,e(e$1,o.passed)),{blocked:!o.passed,exitCode:o.exitCode,message:`${e$1.summary.verdict}; gate ${o.passed?"passed":"blocked"}`}}),await l$2("context",async()=>{let e=await c({workspacePath:s$1,model:d$1(),agent:t.agent??"generic",includeEvidence:true});return await d(e,s$1),{message:`context grounded for ${e.agent}`}}),await l$2("agent-sync",async()=>{let e=await l$1({workspacePath:s$1,agent:t.agent??"generic",targets:["all"],write:true,refreshContext:false,strict:t.strict===true,preset:"enterprise"}),o=false,c$1=await a$3(s$1);if(c$1.status==="miss"){if(c$1.reason!=="live-input-mismatch")throw new Error(`Agent grounding left canonical evidence invalid (${c$1.reason}).`);p$2={...await r$1({workspacePath:s$1,includeEvidence:true}),build:o$1({mode:"full",engineStatus:"disabled"})},await u(p$2,s$1);let f=await c({workspacePath:s$1,model:p$2,agent:t.agent??"generic",includeEvidence:true});await d(f,s$1);let w=await l$1({workspacePath:s$1,agent:t.agent??"generic",targets:["all"],write:true,refreshContext:false,strict:t.strict===true,preset:"enterprise"});e={...w,writtenFiles:[...new Set([...e.writtenFiles,...w.writtenFiles])].sort(),strictViolations:[...new Set([...e.strictViolations??[],...w.strictViolations??[]])].sort()};let O=await a$3(s$1);if(O.status==="miss")throw new Error(`Agent grounding reconciliation did not produce fresh canonical evidence (${O.reason}).`);o=true;}let k=e.strictViolations??[],i=t.strict===true&&k.length>0;return {blocked:i,exitCode:i?2:0,message:i?`${e.writtenFiles.length} grounding files written; ${k.length} strict grounding violation(s): ${k.join("; ")}`:`${e.writtenFiles.length} grounding files written; portable entry surfaces prepared for all supported hosts${o?"; canonical Model/Graph freshness sealed":""}`}}),await l$2("explain",async()=>{let e=await b({workspacePath:s$1,target:{kind:"release-blocked"}});await c$1(e,s$1);let o=t.strict===true?u$1.filter(c=>c.status==="blocked").map(c=>c.id):[];return {message:o.length>0&&e.blocking!==true?`Strict policy blocked advisory or incomplete evidence in ${o.join(", ")}. ${e.summary}`:e.summary}});let me=u$1.some(e=>e.status==="blocked"),G=h$3?"failed":me?"blocked":"passed",fe=h$3?1:G==="blocked"?2:0,b$1={schemaVersion:Ee,chainSchemaVersion:a,generatedAt:new Date().toISOString(),workspacePath:s$1,baselineCreated:a$4,preflight:m$1,status:G,exitCode:fe,stages:u$1,artifactPath:L};ue(b$1),await h(s$1,L,b$1);let ke=await j({workspacePath:s$1});return await h(s$1,p.agentIndex,ke),b$1}export{we as a,Ee as b,Ue as c};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {a as a$1}from'./chunk-FIK343LI.js';import {c as c$1}from'./chunk-
|
|
1
|
+
import {a as a$1}from'./chunk-FIK343LI.js';import {c as c$1}from'./chunk-CAGOLU4Q.js';import {l,q}from'./chunk-FJMUBFXO.js';import {f,h as h$2,g}from'./chunk-ZONAHZBG.js';import {a as a$3}from'./chunk-ETTZXKAS.js';import {i,h as h$1,d,b as b$1,a as a$2,c as c$2,k as k$1}from'./chunk-BLEIUQL6.js';import {b as b$3}from'./chunk-VN2MKTQO.js';import {a}from'./chunk-AFIFZTOY.js';import {a as a$4}from'./chunk-XWKGZRHN.js';import {c,d as d$1}from'./chunk-EWZZUQBR.js';import {b as b$2}from'./chunk-25AWHAB5.js';import {h,i as i$1,m,k,n,o,g as g$1,l as l$1,j as j$1,s,e,f as f$1}from'./chunk-ODK4LCEL.js';import {a as a$5}from'./chunk-FB7SCXAZ.js';import {randomUUID,createHash}from'crypto';import b from'path';import z from'fs-extra';var nt=new Set(["committed","rejected","aborted","superseded"]);function u(e,t){if(!e)throw new Error(`Decision protocol violation: ${t}`)}function st(e){return [...new Set(e)].sort()}function We(e,t){return t.digestCanonical(e.effects.map(a=>({id:a.id,status:a.status,key:a.idempotencyKey})))}function Me(e,t,a){u(!e.some(r=>r.id===t),`${a} receipt '${t}' already exists`);}function it(e,t){Me(e.effects,t.id,"effect");let a=e.effects.find(r=>r.idempotencyKey===t.idempotencyKey);return u(!a,`effect idempotency key '${t.idempotencyKey}' was already recorded by '${a?.id}'`),[...e.effects,t]}function ot(e,t,a){return Me(e.verifications,t.id,"verification"),u(t.target.effectHeadDigest===We(e,a),`verification '${t.id}' does not bind the current effect head`),[...e.verifications,t]}function ct(e){return e.requiredCriteria.every(t=>{let a=e.verifications.filter(r=>r.criterionId===t);return a.length>0&&a.at(-1)?.status==="passed"})}function dt(e$1,t,a){if(t.kind==="created"){u(e$1===null,"created must be the first event");let y=t.payload.references?.[0];u(y,"created must bind an intent artifact");let p=t.payload.references?.filter(k=>k.role==="success-criterion").map(k=>k.artifact)??[];return {schemaVersion:e,id:t.transactionId,purpose:"proof-carrying-change",createdAt:t.occurredAt,updatedAt:t.occurredAt,state:"draft",generation:1,eventCount:t.sequence,eventHeadDigest:t.digest,intent:y,requiredCriteria:st(p),scope:null,evidence:[],plans:[],authorization:null,effects:[],verifications:[],blockers:[]}}u(e$1,`${t.kind} cannot occur before created`),u(!nt.has(e$1.state),`${t.kind} cannot follow terminal state ${e$1.state}`);let r=e$1.state,n=e$1.scope,s=e$1.evidence,d=e$1.plans,f=e$1.authorization,l=e$1.effects,o=e$1.verifications,c=e$1.blockers,h=e$1.terminalReason;switch(t.kind){case "scope-bound":u(e$1.state==="draft"||e$1.state==="scoped","scope-bound requires draft or scoped state"),u(t.payload.scope,"scope-bound requires scope"),n=t.payload.scope,r="scoped";break;case "evidence-attached":u(e$1.state==="scoped"||e$1.state==="evidence-ready","evidence-attached requires scoped state"),u((t.payload.references?.length??0)>0,"evidence-attached requires references"),s=[...s,...t.payload.references??[]],r="evidence-ready";break;case "plan-attached":u(e$1.state==="evidence-ready","plan-attached requires evidence-ready state"),u((t.payload.references?.length??0)>0,"plan-attached requires references"),d=[...d,...t.payload.references??[]];break;case "authorized":u(e$1.state==="evidence-ready","authorization requires evidence-ready state"),u(t.payload.authorization,"authorized requires a bounded authorization grant"),f=t.payload.authorization,r="authorized";break;case "effect-requested":u(e$1.state==="authorized"||e$1.state==="executing","effect-requested requires authorization"),r="executing";break;case "effect-recorded":u(e$1.state==="authorized"||e$1.state==="executing","effect-recorded requires authorization"),u(t.payload.effect,"effect-recorded requires a receipt"),u(f?.effectClasses.includes(t.payload.effect.effectClass),`effect class '${t.payload.effect.effectClass}' is outside the authorization grant`),l=it(e$1,t.payload.effect),r=t.payload.effect.status==="succeeded"?"executing":"blocked",t.payload.effect.status!=="succeeded"&&(c=[...c,{code:t.payload.effect.status==="uncertain"?"decision.effect.uncertain":"decision.effect.failed",actionable:true,details:t.payload.effect.summary}]);break;case "effect-uncertain":u(e$1.state==="authorized"||e$1.state==="executing","effect-uncertain requires an active execution"),r="blocked",c=[...c,t.payload.blocker??{code:"decision.effect.uncertain",actionable:true}];break;case "verification-started":u(e$1.state==="authorized"||e$1.state==="executing","verification-started requires authorized or executing state"),r="verifying";break;case "verification-recorded":{u(e$1.state==="verifying","verification-recorded requires verifying state"),u(t.payload.verification,"verification-recorded requires a receipt"),o=ot(e$1,t.payload.verification,a),r=t.payload.verification.status==="failed"?"blocked":t.payload.verification.status==="inconclusive"?"awaiting-human":"verifying";break}case "human-required":r="awaiting-human";break;case "blocked":u(t.payload.blocker,"blocked requires a structured blocker"),c=[...c,t.payload.blocker],r="blocked";break;case "resumed":u(e$1.state==="blocked"||e$1.state==="awaiting-human","resumed requires a paused state"),u(t.payload.resumeTo,"resumed requires an explicit target state"),r=t.payload.resumeTo,c=[];break;case "committed":u(e$1.state==="verifying","commit requires verifying state"),u(ct(e$1),"every required criterion needs a latest passing receipt"),u(!e$1.effects.some(y=>y.status!=="succeeded"),"all effects must be certainly successful"),r="committed",h=t.payload.reason??t.payload.summary;break;case "rejected":case "aborted":case "superseded":r=t.kind,h=t.payload.reason??t.payload.summary;break;default:throw new Error(`Decision protocol violation: unsupported event ${t.kind}`)}return {...e$1,updatedAt:t.occurredAt,state:r,generation:e$1.generation+1,eventCount:t.sequence,eventHeadDigest:t.digest,scope:n,evidence:s,plans:d,authorization:f,effects:l,verifications:o,blockers:c,...h?{terminalReason:h}:{}}}function Be(e,t,a,r){let n=(t?.sequence??0)+1,s={schemaVersion:f$1,transactionId:e,sequence:n,kind:a.kind,occurredAt:a.occurredAt,actor:a.actor,previousEventDigest:t?.digest??null,payload:a.payload};return {...s,digest:r.digestCanonical(s)}}function ee(e,t){u(e.length>0,"at least one event is required");let a=null,r=null;for(let n of e){u(n.schemaVersion===f$1,`unsupported event schema ${n.schemaVersion}`),u(n.sequence===(r?.sequence??0)+1,`event sequence ${n.sequence} is not contiguous`),u(n.previousEventDigest===(r?.digest??null),`event ${n.sequence} has an invalid previous digest`);let{digest:s,...d}=n;u(n.digest===t.digestCanonical(d),`event ${n.sequence} digest is invalid`),u(!r||n.transactionId===r.transactionId,"events cross transaction boundaries"),a=dt(a,n,t),r=n;}return a}function he(e,t,a){return {schemaVersion:g$1,transactionId:e.id,generatedAt:t,generation:e.generation,eventCount:e.eventCount,eventHeadDigest:e.eventHeadDigest,state:e.state,transactionDigest:a.digestCanonical(e)}}function te(e,t){return We(e,t)}var M={digestCanonical:c};function ft(e){let t=e.trim();if(!/^change-[a-z0-9][a-z0-9-]{7,95}$/.test(t))throw new Error(`Invalid decision transaction id: ${e}`);return t}function L(e){let a=`.workspai/decisions/${ft(e)}`;return {directory:a,transaction:`${a}/transaction.json`,checkpoint:`${a}/checkpoint.json`,events:`${a}/events.jsonl`,lock:`${a}.lock`}}function gt(e,t){return e.split(/\r?\n/).filter(r=>r.trim().length>0).map((r,n)=>{try{return JSON.parse(r)}catch(s){throw new Error(`Decision event log is corrupt at ${t}:${n+1}: ${s.message}`)}})}async function Le(e,t){let a=L(t),r=await b$1(e,a.events);return r?gt(await z.readFile(r,"utf8"),r):[]}function Ue(e,t){let a=L(t);return {directory:a$2(e,a.directory),transaction:a$2(e,a.transaction),checkpoint:a$2(e,a.checkpoint),events:a$2(e,a.events)}}async function ht(e,t,a$1,r){let n=L(t.id),s=he(t,r,M);for(let[d,f]of a$1.entries())a(f,"contracts/workspace-intelligence/decision-event.v1.json",`Decision event ${d+1}`);return b$3(n.transaction,t),b$3(n.checkpoint,s),await k$1(e,n.events,`${a$1.map(d=>JSON.stringify(d)).join(`
|
|
2
2
|
`)}
|
|
3
3
|
`),await h$1(e,n.transaction,t),await h$1(e,n.checkpoint,s),{transaction:t,checkpoint:s,events:a$1,paths:Ue(e,t.id)}}async function Fe(e){let t=L(e.transactionId),a=a$2(e.workspacePath,t.lock);return a$4(a,async()=>{let r=await Le(e.workspacePath,e.transactionId),n=r.at(-1)??null;if((n?.digest??null)!==e.expectedHeadDigest)throw new Error(`Decision transaction head changed: expected ${e.expectedHeadDigest??"<empty>"}, observed ${n?.digest??"<empty>"}`);r.length>0&&ee(r,M);let s=Be(e.transactionId,n,e.event,M),d=[...r,s],f=ee(d,M);return ht(e.workspacePath,f,d,e.event.occurredAt)},{purpose:`decision:${e.transactionId}`,timeoutMs:3e4,staleMs:6e4})}async function Je(e,t){let a=await Le(e,t);if(a.length===0)throw new Error(`Decision transaction not found: ${t}`);let r=ee(a,M),n=he(r,r.updatedAt,M);return {transaction:r,checkpoint:n,events:a,paths:Ue(e,t)}}function U(e){return L(e).directory}var me={digestCanonical:c},ut="workspai.deleted-artifact-tombstone.v1";function mt(e){let t=e.trim();if(!/^change-[a-z0-9][a-z0-9-]{7,95}$/.test(t))throw new Error(`Invalid proof-carrying change id: ${e}`);return t}function V(e){let a=`.workspai/changes/${mt(e)}`;return {directory:a,lease:`${a}/lease.json`,prediction:`${a}/predicted-overlay.json`,actualOverlay:`${a}/actual-overlay.json`,surprises:`${a}/architecture-surprises.json`,workspaceVerification:`${a}/verification/workspace-verify.json`,capsule:`${a}/capsule.json`,privateBaselineGraph:`${a}/private/baseline-graph.json`}}function wt(e,t){return {kind:e,id:t}}function T(e){return {role:e.role,artifact:e.artifact,schemaVersion:e.schemaVersion,digest:{algorithm:"sha256",semantics:e.semantics??"canonical-json-v1",value:e.value}}}async function A(e,t){let a=await b$1(e,t);return a?await z.readJson(a):null}async function Qe(e,t){let a=await d(e,v(t));return !a||!(await z.stat(a).catch(()=>null))?.isFile()?null:createHash("sha256").update(await z.readFile(a)).digest("hex")}async function yt(e,t){let a=new Map;await Promise.all(t.proofs.map(async n=>{let s=v(n.artifact),d=a.get(s);d||(d=Qe(e,s),a.set(s,d)),await d;}));let r=Object.fromEntries((await Promise.all([...a.entries()].map(async([n,s])=>[n,await s]))).filter(n=>typeof n[1]=="string"));return {...t,pccArtifactContentHashes:r}}async function vt(e){let a=(await A(e,s.workspaceContract.artifactPath))?.workspace?.name;if(typeof a=="string"&&a.trim())return a.trim();let r=await A(e,".workspai/workspace.json"),n=r?.workspace_name??r?.name;return typeof n=="string"&&n.trim()?n.trim():b.basename(e)}async function F(e,t){let a=await c$2(e,t.artifact);if(!a)return false;if(t.digest.semantics==="raw-bytes-v1"){let s=await z.readFile(a);return createHash("sha256").update(s).digest("hex")===t.digest.value}let r=await z.readJson(a).catch(()=>null);return r?(t.digest.semantics==="workspace-model-structural-v1"?d$1(r):c(r))===t.digest.value:false}function Ze(e){return c({schemaVersion:ut,artifact:v(e),deleted:true})}function kt(e){let t=v(e.artifact);if(!t||t==="."||t===".."||t.startsWith("../"))throw new Error(`Deleted artifact identity must be a contained relative path: ${e.artifact}`);return {artifact:t,observedAt:e.observedAt??new Date().toISOString(),digest:{algorithm:"sha256",semantics:"deletion-tombstone-v1",value:Ze(t)}}}async function et(e,t){if(t.digest.algorithm!=="sha256"||t.digest.semantics!=="deletion-tombstone-v1"||t.digest.value!==Ze(t.artifact))return false;let a=await d(e,t.artifact);return a!==null&&!await z.pathExists(a)}async function Pt(e,t){let a=await A(e,V(t).lease);if(!a||a.schemaVersion!==h)throw new Error(`Architecture lease is missing or unsupported for ${t}.`);if(a.changeId!==t)throw new Error(`Architecture lease binding failed for ${t}.`);return a}async function J(e){let t=await a$3(e);if(t.status==="miss")throw new Error(`A current canonical Model and Graph are required (${t.reason}). Run workspai workspace intelligence run --for-agent generic --strict --json.`);return t}function Ct(e,t,a){return c({modelHash:e,graphHash:t,inputHash:a})}function Y(e){let t=d$1(e.model),a=c(e.graph),r=e.graph.source.inputs?.hash;if(!r)throw new Error("The canonical Graph has no live input fingerprint.");return {modelHash:t,graphHash:a,inputHash:r,generation:Ct(t,a,r)}}async function we(e,t){let a=await J(e),r=Y(a);if(r.generation!==t.generation)throw new Error(`Architecture lease ${t.changeId} is stale. Expected generation ${t.generation}, observed ${r.generation}. Abort or begin a new change from current evidence.`);return a}function C(e,t,a,r,n=new Date().toISOString()){return {kind:e,payload:t,occurredAt:n,actor:wt(a,r)}}async function I(e,t,a,r){return Fe({workspacePath:e,transactionId:a,expectedHeadDigest:t?.transaction.eventHeadDigest??null,event:r})}function D(e,t,a){return `${e}\0${t}\0${a}`}var tt="agent-framework-change-plan",It=new Set(["init","test","build"]);function At(e){if(!e.record.transaction.plans.some(n=>n.role===tt))return false;let a=new Set(e.lease.scope.projects),r=e.verify.steps.filter(n=>{if(n.scope!=="project"||!n.project||!a.has(n.project))return false;let s=n.id.split(".").at(-1);return s!==void 0&&It.has(s)});return r.some(n=>n.status==="fail")?false:r.length===0||r.some(n=>n.status==="missing")}function bt(e){let t=[];for(let[a,r]of [["entity",e.entities],["relation",e.relations],["proof",e.proofs]])t.push(...r.added.map(n=>({operation:"add",targetKind:a,targetId:n.id}))),t.push(...r.removed.map(n=>({operation:"remove",targetKind:a,targetId:n.id}))),t.push(...r.changed.map(n=>({operation:"change",targetKind:a,targetId:n.id})));return t.push(...e.changedArtifacts.map(a=>({operation:"change",targetKind:"artifact",targetId:a}))),t.sort((a,r)=>D(a.operation,a.targetKind,a.targetId).localeCompare(D(r.operation,r.targetKind,r.targetId)))}function Et(e,t){let a=new Set(t.filter(o=>o.targetKind==="artifact").map(o=>v(o.targetId)));if(a.size===0)return new Set;let r=new Set,n=new Set,s=(o,c)=>{a.has(v(c.artifact))&&(n.add(c.id),r.add(D(o,"proof",c.id)));};e.proofs.added.forEach(o=>s("add",o)),e.proofs.removed.forEach(o=>s("remove",o)),e.proofs.changed.forEach(o=>{let c=o.after??o.before;c&&s("change",c);});let d=new Set,f=(o,c)=>{c.proofIds.some(h=>n.has(h))&&(d.add(c.id),r.add(D(o,"entity",c.id)));};e.entities.added.forEach(o=>f("add",o)),e.entities.removed.forEach(o=>f("remove",o)),e.entities.changed.forEach(o=>{let c=o.after??o.before;c&&f("change",c);});let l=(o,c)=>{!c.proofIds.some(h=>n.has(h))&&!d.has(c.from)&&!d.has(c.to)||r.add(D(o,"relation",c.id));};return e.relations.added.forEach(o=>l("add",o)),e.relations.removed.forEach(o=>l("remove",o)),e.relations.changed.forEach(o=>{let c=o.after??o.before;c&&l("change",c);}),r}function Dt(e){let t=e.prediction?.operations.map(c=>({operation:c.operation,targetKind:c.targetKind,targetId:c.targetId}))??[],a=bt(e.actual),r=new Set(t.map(c=>D(c.operation,c.targetKind,c.targetId))),n=new Set(a.map(c=>D(c.operation,c.targetKind,c.targetId))),s=Et(e.actual,t),d=a.filter(c=>r.has(D(c.operation,c.targetKind,c.targetId))||s.has(D(c.operation,c.targetKind,c.targetId))),f=a.filter(c=>!r.has(D(c.operation,c.targetKind,c.targetId))&&!s.has(D(c.operation,c.targetKind,c.targetId))),l=t.filter(c=>!n.has(D(c.operation,c.targetKind,c.targetId))),o=e.prediction?f.length===0&&l.length===0&&s.size===0?"exact":f.length===0?"within-expectation":"surprising":"no-prediction";return {schemaVersion:j$1,changeId:e.changeId,generatedAt:e.generatedAt,prediction:e.predictionReference,actual:e.actualReference,matched:d,unpredicted:f,missing:l,summary:{predicted:t.length,actual:a.length,matched:d.length,unpredicted:f.length,missing:l.length,verdict:o}}}async function pe(e){let t=await A(e.workspacePath,e.relativePath);return t?T({role:e.role,artifact:e.relativePath,schemaVersion:e.schemaVersion,value:c(t)}):null}function Rt(e){let{integrity:t,...a}=e;return a}async function ye(e){let t=V(e.lease.changeId),[a,r,n]=await Promise.all([pe({workspacePath:e.workspacePath,relativePath:t.prediction,role:"prediction",schemaVersion:i$1}),pe({workspacePath:e.workspacePath,relativePath:t.actualOverlay,role:"actual-architecture-overlay",schemaVersion:a$5}),pe({workspacePath:e.workspacePath,relativePath:t.surprises,role:"architecture-surprises",schemaVersion:j$1})]),s=T({role:"decision-transaction",artifact:`${U(e.lease.changeId)}/transaction.json`,schemaVersion:e.record.transaction.schemaVersion,value:c(e.record.transaction)}),d=e.record.transaction.effects.flatMap(g=>g.artifacts),f=e.record.transaction.effects.flatMap(g=>g.deletedArtifacts??[]),l=e.record.transaction.verifications.flatMap(g=>g.artifacts),o=await A(e.workspacePath,t.actualOverlay),c$1=o?!ue(o):false,h=[{id:"intent-bound",status:"passed",summary:"The transaction is hash-bound to its immutable Goal Pack."},{id:"baseline-pinned",status:"passed",summary:"The architecture lease pins exact Model, Graph, and live-input identities."},{id:"effects-receipted",status:e.record.transaction.effects.length>0&&e.record.transaction.effects.every(g=>g.status==="succeeded")||e.record.transaction.effects.length===0&&c$1?"passed":e.record.transaction.effects.length===0?"pending":"failed",summary:e.record.transaction.effects.length===0&&c$1?"Fresh Graph observation proves this was a no-effect change.":`${e.record.transaction.effects.length} typed effect receipt(s) are bound to the transaction ledger.`},{id:"architecture-reobserved",status:r?"passed":"pending",summary:r?"The actual architecture delta was derived from a fresh canonical Graph.":"No post-effect architecture overlay has been observed yet."},{id:"independently-verified",status:e.record.transaction.state==="committed"?"passed":e.record.transaction.verifications.some(g=>g.status==="failed")?"failed":"pending",summary:`${e.record.transaction.verifications.length} independent verification receipt(s) are recorded.`}],y=await A(e.workspacePath,t.surprises),p=[...e.record.transaction.effects.length===0&&o&&ue(o)?["No typed effect receipt explains the observed architecture generation."]:[],...y?.summary.unpredicted?[`${y.summary.unpredicted} actual architecture operation(s) were not predicted.`]:[],...e.record.transaction.blockers.map(g=>g.details??g.code)],k$1=e.record.transaction.state==="committed"?"sealed":e.record.transaction.state==="aborted"?"aborted":e.record.transaction.state==="blocked"||e.record.transaction.state==="awaiting-human"?"blocked":e.record.transaction.state==="verifying"&&e.record.transaction.verifications.some(g=>g.status==="passed")?"verified":"open",i={schemaVersion:k,changeId:e.lease.changeId,goalId:e.lease.goalId,generatedAt:e.record.transaction.updatedAt,status:k$1,workspace:e.lease.workspace,scope:e.lease.scope,decision:{transaction:s,eventHeadDigest:e.record.transaction.eventHeadDigest,effectHeadDigest:te(e.record.transaction,me),state:e.record.transaction.state,generation:e.record.transaction.generation},intent:e.record.transaction.intent,baseline:e.lease.baseline,prediction:a,actualOverlay:r,surpriseReport:n,effects:d,deletedArtifacts:f,verification:l,assurances:h,remainingUncertainty:[...new Set(p)]};return {...i,integrity:{algorithm:"sha256",semantics:"canonical-json-v1",capsuleDigest:c(i)}}}async function O(e,t,a){let r=await ye({workspacePath:e,lease:t,record:a});return await h$1(e,V(t.changeId).capsule,r),r}function j(e){let t=V(e.lease.changeId),a$1={schemaVersion:l$1,operation:e.operation,changeId:e.lease.changeId,state:e.record.transaction.state,capsule:e.capsule,artifacts:{lease:t.lease,prediction:e.capsule.prediction?.artifact??null,actualOverlay:e.capsule.actualOverlay?.artifact??null,surpriseReport:e.capsule.surpriseReport?.artifact??null,transaction:`${U(e.lease.changeId)}/transaction.json`,events:`${U(e.lease.changeId)}/events.jsonl`,capsule:t.capsule},nextActions:e.nextActions};return a(a$1,"contracts/workspace-intelligence/change-operation-result.v1.json","Proof-Carrying Change operation result"),b$2({kind:"operation.completed",status:e.record.transaction.state==="blocked"||e.record.transaction.state==="awaiting-human"?"blocked":e.record.transaction.state==="aborted"?"cancelled":"succeeded",component:"proof-carrying-change",correlationId:e.lease.changeId,message:`${e.operation}: ${e.record.transaction.state}`,evidenceBindings:[{kind:"artifact",ref:t.capsule,role:"output",provenance:"authoritative"},{kind:"artifact",ref:`${U(e.lease.changeId)}/transaction.json`,role:"subject",provenance:"authoritative"}],attributes:{operation:e.operation,changeId:e.lease.changeId,goalId:e.lease.goalId,decisionState:e.record.transaction.state,assurancePassed:e.capsule.assurances.filter(r=>r.status==="passed").length,assuranceTotal:e.capsule.assurances.length}}),a$1}async function R(e,t){let a=await Pt(e,t),r=await Je(e,t);return {lease:a,record:r}}async function da(e){let t=b.resolve(e.workspacePath),a=await l({workspacePath:t,goalId:e.goalId,validateBindings:true}),r=a.goalPack;if(!r||!a.active)throw new Error("No active Goal Pack is available, or the named Goal is not active.");if(r.state!=="ready-to-plan")throw new Error(`Goal ${r.id} cannot begin a change while its state is ${r.state}.`);let n=await J(t),s=Y(n);if(s.modelHash!==r.sourceBinding.model.hash||(r.sourceBinding.graph.inputHash?s.inputHash!==r.sourceBinding.graph.inputHash:s.graphHash!==r.sourceBinding.graph.hash))throw new Error(`Goal ${r.id} is no longer bound to the current architecture generation.`);let d=`change-${r.intent.category}-${randomUUID().replace(/-/g,"").slice(0,16)}`,f=V(d),l$1=new Date().toISOString(),o=await yt(t,n.graph),c$1=c(o),h$1={schemaVersion:h,changeId:d,goalId:r.id,createdAt:l$1,workspace:r.workspace,scope:{kind:r.scope.kind,projects:[...r.scope.projects]},baseline:{model:T({role:"baseline-model",artifact:r.sourceBinding.model.artifact,schemaVersion:r.sourceBinding.model.schemaVersion,value:r.sourceBinding.model.hash,semantics:"workspace-model-structural-v1"}),graph:{...T({role:"baseline-graph",artifact:r.sourceBinding.graph.artifact,schemaVersion:r.sourceBinding.graph.schemaVersion,value:s.graphHash}),inputHash:s.inputHash}},generation:s.generation,semantics:"optimistic-generation-guard",privateMaterialization:{artifact:f.privateBaselineGraph,role:"hash-bound-baseline-cache",portable:false,authoritative:false,digest:{algorithm:"sha256",semantics:"canonical-json-v1",value:c$1}}};await i(t,f.lease,[{relativePath:f.privateBaselineGraph,payload:o},{relativePath:f.lease,payload:h$1}]);let y=e.actorKind??"cli",p=e.actorId??"workspai-change",k=T({role:"intent",artifact:a.active.goalPack,schemaVersion:r.schemaVersion,value:c(r)}),i$1=r.successCriteria.map(E=>T({role:"success-criterion",artifact:E.id,schemaVersion:"workspai.goal-success-criterion.v1",value:c(E)})),g=await I(t,null,d,C("created",{summary:`Begin proof-carrying change for ${r.id}.`,references:[k,...i$1]},y,p,l$1));g=await I(t,g,d,C("scope-bound",{summary:"Bind immutable Goal scope.",scope:h$1.scope},y,p)),g=await I(t,g,d,C("evidence-attached",{summary:"Attach exact architecture generation and lease.",references:[h$1.baseline.model,{role:h$1.baseline.graph.role,artifact:h$1.baseline.graph.artifact,schemaVersion:h$1.baseline.graph.schemaVersion,digest:h$1.baseline.graph.digest},T({role:"architecture-lease",artifact:f.lease,schemaVersion:h$1.schemaVersion,value:c(h$1)})]},y,p)),await q({workspacePath:t,goalId:r.id,changeId:d});let P=await O(t,h$1,g);return j({operation:"begin",lease:h$1,record:g,capsule:P,nextActions:[`workspai change predict --change ${d} --file <prediction.json> --json`,`workspai change authorize --change ${d} --effects filesystem,command --json`]})}async function la(e){let{lease:t,record:a}=await R(e.workspacePath,e.changeId);if(await we(e.workspacePath,t),a.transaction.state!=="evidence-ready")throw new Error(`Prediction requires evidence-ready state, observed ${a.transaction.state}.`);let r={...e.prediction,schemaVersion:i$1,changeId:e.changeId,goalId:t.goalId,baselineGeneration:t.generation,nonCanonical:true,proofEligible:false,operations:[...e.prediction.operations].sort((f,l)=>D(f.operation,f.targetKind,f.targetId).localeCompare(D(l.operation,l.targetKind,l.targetId)))};await h$1(e.workspacePath,V(e.changeId).prediction,r);let n=T({role:"noncanonical-prediction",artifact:V(e.changeId).prediction,schemaVersion:r.schemaVersion,value:c(r)}),s=await I(e.workspacePath,a,e.changeId,C("plan-attached",{summary:"Attach an explicitly noncanonical architecture prediction.",references:[n]},e.actorKind??"agent",e.actorId??"workspai-agent")),d=await O(e.workspacePath,t,s);return j({operation:"predict",lease:t,record:s,capsule:d,nextActions:[`workspai change authorize --change ${e.changeId} --effects filesystem,command --json`]})}async function fa(e){let{lease:t,record:a$1}=await R(e.workspacePath,e.changeId);if(await we(e.workspacePath,t),a$1.transaction.state!=="evidence-ready")throw new Error(`Plan attachment requires evidence-ready state, observed ${a$1.transaction.state}.`);let r=e.role.trim().toLowerCase();if(!/^[a-z0-9](?:[a-z0-9.-]{0,62}[a-z0-9])?$/.test(r))throw new Error(`Invalid proof-carrying plan role: ${e.role}`);if(!e.schemaVersion.trim())throw new Error("Plan schema version is required.");let n=e.contractPath.replace(/\\/g,"/");if(!n.startsWith("contracts/")||n.split("/").some(l=>l===".."||l==="."))throw new Error(`Plan contract path must resolve inside the published contract root: ${e.contractPath}`);if(!e.payload||typeof e.payload!="object"||e.payload.schemaVersion!==e.schemaVersion)throw new Error("Plan payload schema version does not match its PCC reference.");a(e.payload,n,`${r} plan`);let s=c(e.payload),d=`${V(e.changeId).directory}/plans/${r}-${s}.json`;await h$1(e.workspacePath,d,e.payload);let f=await I(e.workspacePath,a$1,e.changeId,C("plan-attached",{summary:`Attach ${r} execution plan.`,references:[T({role:r,artifact:d,schemaVersion:e.schemaVersion,value:s})]},e.actorKind??"cli",e.actorId??"workspai-plan"));return await O(e.workspacePath,t,f),{changeId:e.changeId,state:f.transaction.state,artifact:d,digest:s}}async function ga(e){let{lease:t,record:a}=await R(e.workspacePath,e.changeId);if(await we(e.workspacePath,t),e.effectClasses.length===0)throw new Error("Authorization requires at least one effect class.");let r=await I(e.workspacePath,a,e.changeId,C("authorized",{summary:`Authorize bounded effect classes: ${e.effectClasses.join(", ")}.`,authorization:{grantedBy:e.grantedBy,grant:"bounded-effects",effectClasses:[...new Set(e.effectClasses)].sort()}},e.actorKind??"human",e.grantedBy)),n=await O(e.workspacePath,t,r);return j({operation:"authorize",lease:t,record:r,capsule:n,nextActions:[`workspai change effect record --change ${e.changeId} --file <effect-receipt.json> --json`,`workspai change verify --change ${e.changeId} --json`]})}async function ha(e){let{lease:t,record:a}=await R(e.workspacePath,e.changeId);if(a.transaction.state!=="blocked"&&a.transaction.state!=="awaiting-human")throw new Error(`Resume requires blocked or awaiting-human state, observed ${a.transaction.state}.`);let r=await I(e.workspacePath,a,e.changeId,C("resumed",{summary:e.reason,reason:e.reason,resumeTo:e.resumeTo},"human",e.actorId)),n=await O(e.workspacePath,t,r);return j({operation:"resume",lease:t,record:r,capsule:n,nextActions:e.resumeTo==="verifying"?[`workspai change verification record --change ${e.changeId} --file <verification-receipt.json> --json`]:[`workspai change effect record --change ${e.changeId} --file <effect-receipt.json> --json`]})}async function pa(e){let{lease:t,record:a}=await R(e.workspacePath,e.changeId),r=new Set(e.receipt.artifacts.map(f=>v(f.artifact))),n=(e.receipt.deletedArtifacts??[]).map(f=>v(f.artifact));if(new Set(n).size!==n.length)throw new Error("Effect receipt contains duplicate deleted-artifact identities.");if(n.some(f=>r.has(f)))throw new Error("An effect artifact cannot be both present and deleted in one receipt.");if(n.length>0&&e.receipt.status!=="succeeded")throw new Error("Only a succeeded effect may carry deleted-artifact tombstones.");for(let f of e.receipt.artifacts)if(!await F(e.workspacePath,f))throw new Error(`Effect artifact is missing or corrupt: ${f.artifact}`);for(let f of e.receipt.deletedArtifacts??[])if(!await et(e.workspacePath,f))throw new Error(`Deleted effect artifact is present, outside the governed scope, or has an invalid tombstone: ${f.artifact}`);let s=await I(e.workspacePath,a,e.changeId,C("effect-recorded",{summary:e.receipt.summary,effect:e.receipt},e.actorKind??"agent",e.actorId??"workspai-agent")),d=await O(e.workspacePath,t,s);return j({operation:"effect-record",lease:t,record:s,capsule:d,nextActions:s.transaction.state==="blocked"?[`workspai change status --change ${e.changeId} --json`]:[`workspai change verify --change ${e.changeId} --json`]})}async function ua(e){let t=b.resolve(e.workspacePath),{lease:a,record:r}=await R(t,e.changeId);if(!r.transaction.requiredCriteria.includes(e.receipt.criterionId))throw new Error(`Verification criterion '${e.receipt.criterionId}' is outside the immutable Goal contract.`);let n=await J(t),s=V(e.changeId),[d,f]=await Promise.all([A(t,s.actualOverlay),A(t,s.surprises)]),l=r.transaction.verifications.some(i=>i.criterionId==="workspace-verify"&&i.status==="passed");if(!d||!f||!l)throw new Error("Domain verification can be admitted only after change verify re-observes the Graph and records a passing Workspace Verify receipt.");let o=Y(n),c=te(r.transaction,me);if(e.receipt.target.modelHash!==o.modelHash||e.receipt.target.graphHash!==o.graphHash||e.receipt.target.effectHeadDigest!==c)throw new Error("Verification receipt does not target the current Model, Graph, and effect head.");for(let i of e.receipt.artifacts)if(!await F(t,i))throw new Error(`Verification artifact is missing or corrupt: ${i.artifact}`);let h=e.actorKind??"ci",y=e.actorId??"workspai-verifier",p=r;if(p.transaction.state==="blocked"){if(!p.transaction.blockers.every(g=>g.code==="change.verification.criteria_missing"))throw new Error("The change is blocked by a condition that a verification receipt cannot resume.");p=await I(t,p,e.changeId,C("resumed",{summary:"Resume to admit a missing verification receipt.",resumeTo:"verifying"},h,y));}else if(p.transaction.state!=="verifying")throw new Error(`Verification receipt requires verifying or criteria-blocked state; observed ${p.transaction.state}.`);p=await I(t,p,e.changeId,C("verification-recorded",{summary:e.receipt.summary,verification:e.receipt},h,y)),p.transaction.state==="verifying"&&p.transaction.requiredCriteria.every(g=>p.transaction.verifications.filter(E=>E.criterionId===g).at(-1)?.status==="passed")&&(p=await I(t,p,e.changeId,C("committed",{summary:"Seal the independently verified proof-carrying change."},h,y)));let k=await O(t,a,p);return j({operation:"verification-record",lease:a,record:p,capsule:k,nextActions:p.transaction.state==="committed"?[`workspai change capsule validate --change ${e.changeId} --json`]:[`workspai change status --change ${e.changeId} --json`]})}function ae(e,t,a,r="verification"){return T({role:r,artifact:e,schemaVersion:t,value:c(a)})}function ue(e){return e.summary.entityAdds+e.summary.entityRemovals+e.summary.entityChanges+e.summary.relationAdds+e.summary.relationRemovals+e.summary.relationChanges+e.summary.proofAdds+e.summary.proofRemovals+e.summary.proofChanges>0}function v(e){return e.replace(/\\/g,"/").replace(/^\.\//,"")}function $t(e){if(e.scope.kind==="workspace")return e.overlay;let t=new Set(e.scope.projects),a=i=>!!(i.projectId&&t.has(i.projectId)),r={added:e.overlay.entities.added.filter(a),removed:e.overlay.entities.removed.filter(a),changed:e.overlay.entities.changed.filter(i=>a(i.after??i.before??{}))},n=i=>e.scopedEntityIds.has(i.from)||e.scopedEntityIds.has(i.to),s={added:e.overlay.relations.added.filter(n),removed:e.overlay.relations.removed.filter(n),changed:e.overlay.relations.changed.filter(i=>{let g=i.after??i.before;return !!(g&&n(g))})},d=new Set([...r.added.flatMap(i=>i.proofIds),...r.removed.flatMap(i=>i.proofIds),...r.changed.flatMap(i=>[...i.before?.proofIds??[],...i.after?.proofIds??[]]),...s.added.flatMap(i=>i.proofIds),...s.removed.flatMap(i=>i.proofIds),...s.changed.flatMap(i=>[...i.before?.proofIds??[],...i.after?.proofIds??[]])]),f=i=>{let g=v(i);return e.projectPrefixes.includes(".")?true:e.projectPrefixes.some(P=>g===P||g.startsWith(`${P}/`))},l=i=>d.has(i.id)||f(i.artifact),o={added:e.overlay.proofs.added.filter(l),removed:e.overlay.proofs.removed.filter(l),changed:e.overlay.proofs.changed.filter(i=>{let g=i.after??i.before;return !!(g&&l(g))})},c=e.overlay.impactedEntityIds.filter(i=>e.scopedEntityIds.has(i)),h=e.overlay.changedArtifacts.filter(f),y=r.removed.length+s.removed.length+o.removed.length,p=y+r.added.length+r.changed.length+s.added.length+s.changed.length+o.added.length+o.changed.length,k=p===0?"none":y>0||c.length>=10?"high":c.length>=5||p>=5?"medium":"low";return {...e.overlay,entities:r,relations:s,proofs:o,impactedEntityIds:c,changedArtifacts:h,summary:{entityAdds:r.added.length,entityRemovals:r.removed.length,entityChanges:r.changed.length,relationAdds:s.added.length,relationRemovals:s.removed.length,relationChanges:s.changed.length,proofAdds:o.added.length,proofRemovals:o.removed.length,proofChanges:o.changed.length,impactedEntities:c.length,changedArtifacts:h.length,risk:k}}}function Ye(e){let t=b.normalize(b.resolve(e));return process.platform==="win32"?t.toLowerCase():t}async function St(e){let t=new Set(e.receiptedArtifacts.map(v)),a=new Set;for(let n of t){let s=await d(e.workspacePath,n);s&&a.add(Ye(s));}let r=[];for(let n of e.changedArtifacts){let s=v(n);if(t.has(s))continue;let d$1=await d(e.workspacePath,s);d$1&&a.has(Ye(d$1))||r.push(n);}return r}function Vt(e){let t=v(e.artifact);return e.receiptedArtifacts.has(t)||e.scope.kind==="workspace"||e.projectPrefixes.includes(".")?true:e.projectPrefixes.some(a=>t===a||t.startsWith(`${a}/`))}async function xt(e){let t=v(e.artifact),a=f=>{let l=f.proofs.filter(o=>v(o.artifact)===t);return l.length===0?[]:l.some(o=>!o.contentHash)?null:[...new Set(l.map(o=>o.contentHash))].sort()},r=a(e.baseline),n=a(e.head),s=await Qe(e.workspacePath,t),d=e.baseline.pccArtifactContentHashes?.[t];return d?s===null||s!==d:r&&r.length>0?s===null||!r.includes(s):r&&r.length===0?s!==null||!!n?.length:r===null||n===null?true:c(r)!==c(n)}async function ma(e){let t=b.resolve(e.workspacePath),{lease:a,record:r}=await R(t,e.changeId);if(r.transaction.state!=="authorized"&&r.transaction.state!=="executing")throw new Error(`Verification requires authorized or executing state, observed ${r.transaction.state}.`);e.refresh!==false&&await c$1({workspacePath:t,strict:false,agent:"generic"});let n=await J(t),s=await A(t,a.privateMaterialization.artifact);if(!s||c(s)!==a.privateMaterialization.digest.value)throw new Error(`The hash-bound baseline materialization is missing or corrupt for ${e.changeId}.`);let d=new Date().toISOString(),f$1=n.model.projects.filter(w=>a.scope.projects.includes(w.name)).map(w=>v(w.path).replace(/\/$/u,"")).filter(Boolean),l=$t({overlay:a$1(s,n.graph,new Date(d)),scope:a.scope,projectPrefixes:f$1,scopedEntityIds:new Set([...s.entities,...n.graph.entities].filter(w=>w.projectId&&a.scope.projects.includes(w.projectId)).map(w=>w.id))}),o=V(e.changeId);await h$1(t,o.actualOverlay,l);let c$2=ae(o.actualOverlay,l.schemaVersion,l,"actual-architecture-overlay"),h=await A(t,o.prediction),y=h?ae(o.prediction,h.schemaVersion,h,"noncanonical-prediction"):null,p=Dt({changeId:e.changeId,generatedAt:d,prediction:h,predictionReference:y,actual:l,actualReference:c$2});await h$1(t,o.surprises,p);let k=ae(o.surprises,p.schemaVersion,p,"architecture-surprises"),i=r,g$1=e.actorKind??"cli",P=e.actorId??"workspai-change-verify";if(ue(l)&&i.transaction.effects.length===0){i=await I(t,i,e.changeId,C("blocked",{summary:"Observed architecture change has no typed effect receipt.",blocker:{code:"change.effect_receipt.missing",actionable:true,details:"Record the actual mutation effect before verification can claim causality."}},g$1,P));let w=await O(t,a,i);return j({operation:"verify",lease:a,record:i,capsule:w,nextActions:[`workspai change resume --change ${e.changeId} --to authorized --reason "Record missing effect receipt" --json`]})}let E=i.transaction.effects.filter(w=>w.status==="succeeded").flatMap(w=>[...w.artifacts.map(x=>x.artifact),...(w.deletedArtifacts??[]).map(x=>x.artifact)]),G=new Set(E.map(v)),$=(await Promise.all(l.changedArtifacts.map(async w=>({artifact:w,contentChanged:await xt({workspacePath:t,artifact:w,baseline:s,head:n.graph})})))).filter(({artifact:w,contentChanged:x})=>x&&Vt({artifact:w,scope:a.scope,projectPrefixes:f$1,receiptedArtifacts:G})).map(({artifact:w})=>w),S=await St({workspacePath:t,changedArtifacts:$,receiptedArtifacts:E});if(S.length>0){i=await I(t,i,e.changeId,C("blocked",{summary:"Observed architecture artifacts are not covered by typed effect receipts.",blocker:{code:"change.effect_receipt.coverage_missing",actionable:true,details:`Uncovered artifacts: ${S.slice(0,20).join(", ")}`}},g$1,P));let w=await O(t,a,i);return j({operation:"verify",lease:a,record:i,capsule:w,nextActions:[`workspai change resume --change ${e.changeId} --to authorized --reason "Cover observed artifacts" --json`]})}let K=await f({workspacePath:t});if(!h$2(K,{strict:e.strict===true}).passed&&At({record:i,lease:a,verify:K})){await g(K,t);let w=await O(t,a,i),x=a.scope.projects[0];return j({operation:"verify",lease:a,record:i,capsule:w,nextActions:[...x?[`workspai workspace run init --workspace ${JSON.stringify(t)} --scope ${JSON.stringify(x)} --json`,`workspai workspace run test --workspace ${JSON.stringify(t)} --scope ${JSON.stringify(x)} --json`,`workspai workspace run build --workspace ${JSON.stringify(t)} --scope ${JSON.stringify(x)} --json`]:[],`workspai change verify --change ${e.changeId} --json`]})}i=await I(t,i,e.changeId,C("verification-started",{summary:"Begin independent post-effect verification."},g$1,P));let X=await g(K,t),ke=b.relative(t,X).split(b.sep).join("/"),re=await A(t,ke);if(!re)throw new Error(`Workspace Verify evidence was not persisted at ${ke}.`);await h$1(t,o.workspaceVerification,re);let Q=await A(t,o.workspaceVerification);if(!Q)throw new Error(`Change-scoped Workspace Verify evidence was not persisted at ${o.workspaceVerification}.`);let N=h$2(re,{strict:e.strict===true}),Pe=Y(n),Ce={id:`verify-workspace-${c({generatedAt:d,verify:Q,gate:N}).slice(0,16)}`,criterionId:"workspace-verify",status:N.passed?"passed":"failed",summary:N.passed?`Workspace Verify passed in ${N.mode} mode.`:`Workspace Verify blocked in ${N.mode} mode: ${N.reasons.join("; ")}`,target:{modelHash:Pe.modelHash,graphHash:Pe.graphHash,effectHeadDigest:te(i.transaction,me)},artifacts:[ae(o.workspaceVerification,Q.schemaVersion,Q),c$2,k],observedAt:d};if(i=await I(t,i,e.changeId,C("verification-recorded",{summary:Ce.summary,verification:Ce},g$1,P)),i.transaction.state==="verifying"){let w=i.transaction.requiredCriteria.filter(x=>i.transaction.verifications.filter(rt=>rt.criterionId===x).at(-1)?.status!=="passed");w.length>0?i=await I(t,i,e.changeId,C("blocked",{summary:"Required outcome verification is incomplete.",blocker:{code:"change.verification.criteria_missing",actionable:true,details:`Missing passing receipts: ${w.join(", ")}`}},g$1,P)):i=await I(t,i,e.changeId,C("committed",{summary:"Seal the independently verified proof-carrying change."},g$1,P));}let at=await O(t,a,i);return j({operation:"verify",lease:a,record:i,capsule:at,nextActions:i.transaction.state==="committed"?[`workspai change capsule validate --change ${e.changeId} --json`]:[`workspai change status --change ${e.changeId} --json`]})}async function wa(e){let{lease:t,record:a}=await R(e.workspacePath,e.changeId),r=await ye({workspacePath:e.workspacePath,lease:t,record:a});return j({operation:e.operation??"status",lease:t,record:a,capsule:r,nextActions:a.transaction.state==="evidence-ready"?[`workspai change authorize --change ${e.changeId} --effects filesystem,command --json`]:a.transaction.state==="authorized"||a.transaction.state==="executing"?[`workspai change verify --change ${e.changeId} --json`]:[]})}async function ya(e){let t=b.resolve(e.workspacePath),a$1=await b$1(t,".workspai/changes","directory"),n=(a$1?await z.readdir(a$1,{withFileTypes:true}):[]).filter(l=>l.isDirectory()&&/^change-[a-z0-9][a-z0-9-]{7,95}$/.test(l.name)).map(l=>l.name).sort(),s=[],d=null;for(let l of n)try{let{lease:o,record:c}=await R(t,l);d??=o.workspace.name;let h=await ye({workspacePath:t,lease:o,record:c}),y=await ve({workspacePath:t,changeId:l}),p=c.transaction.blockers.map(i=>i.details??i.code),k=h.status==="blocked"?h.assurances.filter(i=>i.status==="failed").map(i=>`${i.id}: ${i.summary}`):[];s.push({changeId:l,goalId:o.goalId,state:c.transaction.state,status:h.status,createdAt:c.transaction.createdAt,updatedAt:c.transaction.updatedAt,scope:o.scope,assurance:{passed:h.assurances.filter(i=>i.status==="passed").length,total:h.assurances.length},blockers:[...new Set([...p,...k])],capsuleArtifact:V(l).capsule,valid:y.valid,errors:y.errors});}catch(o){s.push({changeId:l,goalId:null,state:null,status:"invalid",createdAt:null,updatedAt:null,scope:null,assurance:{passed:0,total:5},blockers:[],capsuleArtifact:V(l).capsule,valid:false,errors:[o instanceof Error?o.message:String(o)]});}s.sort((l,o)=>(o.updatedAt??"").localeCompare(l.updatedAt??"")||l.changeId.localeCompare(o.changeId));let f={schemaVersion:m,generatedAt:new Date().toISOString(),workspace:{name:d??await vt(t)},changes:s,summary:{total:s.length,open:s.filter(l=>l.status==="open"||l.status==="verified").length,blocked:s.filter(l=>l.status==="blocked").length,sealed:s.filter(l=>l.status==="sealed").length,aborted:s.filter(l=>l.status==="aborted").length,invalid:s.filter(l=>!l.valid).length}};return a(f,"contracts/workspace-intelligence/proof-carrying-change-list.v1.json","Proof-Carrying Change list"),f}async function va(e){let{lease:t,record:a}=await R(e.workspacePath,e.changeId),r=await I(e.workspacePath,a,e.changeId,C("aborted",{summary:e.reason,reason:e.reason},"human",e.actorId)),n=await O(e.workspacePath,t,r);return j({operation:"abort",lease:t,record:r,capsule:n,nextActions:[]})}async function ve(e){let t=V(e.changeId),a$1=await A(e.workspacePath,t.capsule);if(!a$1)throw new Error(`Proof-carrying change capsule not found: ${e.changeId}`);let r=[];a$1.schemaVersion!==k&&r.push(`Unsupported capsule schema: ${a$1.schemaVersion}`),a$1.changeId!==e.changeId&&r.push("Capsule change binding does not match."),c(Rt(a$1))!==a$1.integrity.capsuleDigest&&r.push("Capsule integrity digest does not match its canonical content.");let{lease:n$1,record:s}=await R(e.workspacePath,e.changeId),d=s.transaction.evidence.find(o=>o.role==="architecture-lease");(!d||d.digest.value!==c(n$1))&&r.push("Architecture lease does not match the decision-ledger evidence binding."),(n$1.goalId!==a$1.goalId||n$1.generation!==c({modelHash:n$1.baseline.model.digest.value,graphHash:n$1.baseline.graph.digest.value,inputHash:n$1.baseline.graph.inputHash}))&&r.push("Architecture lease identity or generation binding is invalid."),s.transaction.eventHeadDigest!==a$1.decision.eventHeadDigest&&r.push("Capsule does not bind the current decision event head."),c(s.transaction)!==a$1.decision.transaction.digest.value&&r.push("Decision transaction projection digest does not match the capsule.");let f=await A(e.workspacePath,n$1.privateMaterialization.artifact);(!f||c(f)!==n$1.privateMaterialization.digest.value)&&r.push("Hash-bound baseline materialization is missing or corrupt.");for(let o of [a$1.intent,a$1.decision.transaction,a$1.prediction,a$1.actualOverlay,a$1.surpriseReport,...a$1.effects,...a$1.verification].filter(c=>!!c))await F(e.workspacePath,o)||r.push(`Referenced artifact is missing or corrupt: ${o.artifact}`);for(let o of a$1.deletedArtifacts??[])await et(e.workspacePath,o)||r.push(`Deleted artifact tombstone is invalid or the artifact exists again: ${o.artifact}`);let l={schemaVersion:n,changeId:e.changeId,validatedAt:new Date().toISOString(),valid:r.length===0,errors:r,capsule:a$1};return a(l,"contracts/workspace-intelligence/proof-carrying-change-capsule-validation.v1.json","Proof-Carrying Change capsule validation"),l}async function ka(e){let t=await ve(e);if(!t.valid)throw new Error(`Cannot export an invalid capsule: ${t.errors.join("; ")}`);let a$1=b.resolve(e.workspacePath),r=b.resolve(a$1,e.outputPath),n=b.relative(a$1,r);if(n===".."||n.startsWith(`..${b.sep}`)||b.isAbsolute(n))throw new Error("Capsule export path must remain inside the workspace.");let s=n.split(b.sep).join("/"),d=await h$1(a$1,s,t.capsule),f={schemaVersion:o,changeId:e.changeId,outputPath:d,validation:t};return a(f,"contracts/workspace-intelligence/proof-carrying-change-capsule-export.v1.json","Proof-Carrying Change capsule export"),f}function Pa(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Prediction input must be a JSON object.");let t=e;if(!Array.isArray(t.operations)||!Array.isArray(t.assumptions))throw new Error("Prediction input requires operations[] and assumptions[].");let a=new Set(["add","remove","change"]),r=new Set(["entity","relation","proof","artifact"]),n=new Set(["high","medium","low"]);for(let d of t.operations)if(!d||!a.has(d.operation)||!r.has(d.targetKind)||typeof d.targetId!="string"||d.targetId.trim().length===0||typeof d.rationale!="string"||!n.has(d.confidence))throw new Error("Prediction contains an invalid operation.");let s=t.predictedRisk;if(!s||!["none","low","medium","high"].includes(s))throw new Error("Prediction requires predictedRisk: none, low, medium, or high.");return {schemaVersion:i$1,changeId:t.changeId??"change-placeholder",goalId:t.goalId??"goal-placeholder",generatedAt:t.generatedAt??new Date().toISOString(),baselineGeneration:t.baselineGeneration??"pending-binding",nonCanonical:true,proofEligible:false,operations:t.operations,assumptions:t.assumptions.filter(d=>typeof d=="string"),predictedRisk:s}}function Ca(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Effect receipt input must be a JSON object.");let t=e;if(typeof t.id!="string"||!["filesystem","command","configuration","dependency","external"].includes(String(t.effectClass))||!["succeeded","failed","uncertain"].includes(String(t.status))||typeof t.summary!="string"||typeof t.observedAt!="string"||typeof t.idempotencyKey!="string"||!Array.isArray(t.artifacts))throw new Error("Effect receipt is missing required typed fields.");if(t.deletedArtifacts!==void 0&&(!Array.isArray(t.deletedArtifacts)||t.deletedArtifacts.some(r=>!r||typeof r.artifact!="string"||r.observedAt!==void 0&&typeof r.observedAt!="string"||r.digest!==void 0&&(r.digest.algorithm!=="sha256"||r.digest.semantics!=="deletion-tombstone-v1"||typeof r.digest.value!="string"))))throw new Error("Effect receipt contains an invalid deleted-artifact tombstone.");let a=t;return {...a,...a.deletedArtifacts?{deletedArtifacts:a.deletedArtifacts.map(r=>r.digest?r:kt({artifact:r.artifact,observedAt:r.observedAt??a.observedAt}))}:{}}}function Ia(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Verification receipt input must be a JSON object.");let t=e;if(typeof t.id!="string"||typeof t.criterionId!="string"||!["passed","failed","inconclusive"].includes(String(t.status))||typeof t.summary!="string"||typeof t.observedAt!="string"||!t.target||typeof t.target.modelHash!="string"||typeof t.target.graphHash!="string"||typeof t.target.effectHeadDigest!="string"||!Array.isArray(t.artifacts))throw new Error("Verification receipt is missing required typed fields.");return t}function Aa(e,t){return e.decision.eventHeadDigest===t.eventHeadDigest&&e.decision.transaction.digest.value===c(t)}async function ba(e){let{lease:t,record:a}=await R(e.workspacePath,e.changeId);if(t.goalId!==e.goalId)throw new Error(`Proof-carrying change ${e.changeId} is not bound to Goal ${e.goalId}.`);let r=new Set(["authorized","executing","verifying"]),n=a.transaction.state==="blocked"&&a.transaction.blockers.length>0&&a.transaction.blockers.every(i=>i.code==="change.verification.criteria_missing");if(!r.has(a.transaction.state)&&!n)throw new Error(`Proof-carrying change ${e.changeId} is not an applied scaffold pending verification.`);let s=a.transaction.effects.filter(i=>i.effectClass==="filesystem");if(s.length===0)throw new Error(`Proof-carrying change ${e.changeId} has no succeeded filesystem effect receipt.`);if(s.some(i=>i.status!=="succeeded"||i.artifacts.length===0))throw new Error(`Proof-carrying change ${e.changeId} has incomplete or unsuccessful filesystem effects.`);for(let i of s)for(let g of i.artifacts)if(!await F(e.workspacePath,g))throw new Error(`Proof-carrying change ${e.changeId} no longer matches effect artifact ${g.artifact}.`);let d=a.transaction.plans.find(i=>i.role===tt);if(d){let i=await A(e.workspacePath,d.artifact);if(!i||c(i)!==d.digest.value)throw new Error(`Proof-carrying change ${e.changeId} has a missing or corrupt agent framework plan.`);let g=i.target,P=typeof g?.artifactPrefix=="string"?v(g.artifactPrefix).replace(/\/$/u,""):"",E=Array.isArray(i.files)?i.files.flatMap(S=>{if(!S||typeof S!="object")return [];let K=S.path;if(typeof K!="string")return [];let X=v(K);return [P?`${P}/${X}`:X]}):[],G=new Set(s.flatMap(S=>S.artifacts.map(K=>v(K.artifact)))),$=E.filter(S=>!G.has(S));if(E.length===0||$.length>0)throw new Error(`Proof-carrying change ${e.changeId} has a partial filesystem effect receipt.`)}let f=await J(e.workspacePath),l=Y(f),o=await A(e.workspacePath,t.privateMaterialization.artifact);if(!o||c(o)!==t.privateMaterialization.digest.value)throw new Error(`Proof-carrying change ${e.changeId} has a missing or corrupt architecture baseline.`);let c$1=a$1(o,f.graph),h=new Set,y=await b$1(e.workspacePath,".workspai/changes","directory"),p=y?await z.readdir(y,{withFileTypes:true}):[];for(let i of p){if(!i.isDirectory()||!/^change-[a-z0-9][a-z0-9-]{7,95}$/.test(i.name))continue;let g=await R(e.workspacePath,i.name).catch(()=>null);if(!g||g.record.transaction.createdAt<t.createdAt)continue;let P=g.record.transaction.effects.filter($=>$.effectClass==="filesystem"&&$.status==="succeeded");if(P.length===0)continue;for(let $ of P)for(let S of $.artifacts)await F(e.workspacePath,S)&&h.add(v(S.artifact));let E=g.record.transaction.plans.find($=>$.role==="noncanonical-prediction");if(!E)continue;let G=await A(e.workspacePath,E.artifact);if(!(!G||c(G)!==E.digest.value))for(let $ of G.operations)$.targetKind==="artifact"&&h.add(v($.targetId));}let k=c$1.changedArtifacts.map(v).filter(i=>!h.has(i));if(k.length>0)throw new Error(`Proof-carrying change ${e.changeId} does not explain current architecture artifacts: ${k.slice(0,3).join(", ")}.`);return {modelHash:l.modelHash,graphHash:l.graphHash}}async function Ea(e){let t=await ve({workspacePath:e.workspacePath,changeId:e.changeId});if(!t.valid)throw new Error(`Proof-carrying change ${e.changeId} failed capsule validation.`);let{lease:a,record:r}=await R(e.workspacePath,e.changeId);if(a.goalId!==e.goalId||r.transaction.state!=="committed"||t.capsule.status!=="sealed")throw new Error(`Proof-carrying change ${e.changeId} is not a sealed change for ${e.goalId}.`);let n=[...r.transaction.verifications].reverse().find(s=>s.status==="passed");if(!n)throw new Error(`Proof-carrying change ${e.changeId} has no passing verification receipt.`);return {modelHash:n.target.modelHash,graphHash:n.target.graphHash}}
|
|
4
4
|
export{Je as a,kt as b,da as c,la as d,fa as e,ga as f,ha as g,pa as h,ua as i,St as j,ma as k,wa as l,ya as m,va as n,ve as o,ka as p,Pa as q,Ca as r,Ia as s,Aa as t,ba as u,Ea as v};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {b,d}from'./chunk-
|
|
1
|
+
import {b,d}from'./chunk-R7R5FX4B.js';import {g as g$1}from'./chunk-BLEIUQL6.js';import {p,q}from'./chunk-ODK4LCEL.js';import A from'fs-extra';function t(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function S(e){let s=t(e);return !!(s&&s.schemaVersion===q.model&&t(s.workspace)&&Array.isArray(s.projects)&&(t(s.projectTopology)||t(s.graph)))}function W(e){let s=t(e);return !!(s&&s.schemaVersion===q.knowledgeGraph&&t(s.source)&&t(s.workspace)&&Array.isArray(s.entities)&&Array.isArray(s.relations)&&Array.isArray(s.proofs)&&Array.isArray(s.providers)&&t(s.quality))}async function g(e){try{return await A.readJson(e)}catch{return null}}async function I(e){let[s,i]=await Promise.all([g$1(e,p.model),g$1(e,p.knowledgeGraph)]);if(!s)return {status:"miss",reason:"missing-model"};if(!i)return {status:"miss",reason:"missing-graph"};let[n,o]=await Promise.all([g(s),g(i)]);if(!S(n))return {status:"miss",reason:"invalid-model"};if(!W(o))return {status:"miss",reason:"invalid-graph"};if(o.proofs.some(r=>r.freshness==="stale"))return {status:"miss",reason:"stale-proof"};try{b(o,n);}catch{return {status:"miss",reason:"source-mismatch"}}let a=o.source.inputs;if(!a)return {status:"miss",reason:"missing-input-fingerprint"};let f=a.scopes.filter(r=>r.kind==="workspace"),m=a.scopes.filter(r=>r.kind==="project"),k=n.projects.map(r=>r.name).sort(),w=m.map(r=>r.id).sort(),y=new Set(m.map(r=>r.fileLimit));if(a.schemaVersion!=="workspace-knowledge-graph-inputs.v1"||a.strategy!=="hybrid-git-content-v2"||a.hashAlgorithm!=="sha256"||f.length!==1||y.size>1||JSON.stringify(k)!==JSON.stringify(w))return {status:"miss",reason:"invalid-input-fingerprint"};let u;try{u=await d({workspacePath:e,projects:n.projects.map(r=>({id:r.name,path:r.path,...r.absolutePath?{absolutePath:r.absolutePath}:{}})),expected:a});}catch{return {status:"miss",reason:"input-scan-failed"}}return u?{status:"hit",model:n,graph:o,modelPath:s,graphPath:i}:{status:"miss",reason:"live-input-mismatch"}}export{I as a};
|