workspai 0.69.0 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +43 -80
  2. package/contracts/workspace-intelligence/decision-event.v1.json +20 -0
  3. package/contracts/workspace-intelligence/goal-lifecycle-result.v1.json +19 -0
  4. package/contracts/workspace-intelligence/proof-carrying-change-capsule.v1.json +1 -0
  5. package/dist/analyze-4YQ67OCK.js +1 -0
  6. package/dist/{artifact-remediation-plan-JHHZ4L24.js → artifact-remediation-plan-URQL5MBN.js} +1 -1
  7. package/dist/autopilot-release-V3A3YCDD.js +1 -0
  8. package/dist/capabilities-command-NFGX42CH.js +1 -0
  9. package/dist/chunk-26VNCHVV.js +8 -0
  10. package/dist/{chunk-3G5FF2JZ.js → chunk-2KJNASF3.js} +1 -1
  11. package/dist/chunk-37SWTS2B.js +1 -0
  12. package/dist/{chunk-37ZLNFV5.js → chunk-4CE3GI4Y.js} +2 -2
  13. package/dist/chunk-554W2TXP.js +9 -0
  14. package/dist/{chunk-OU3BBWH5.js → chunk-5HURQABR.js} +5 -5
  15. package/dist/chunk-7V3YDKMG.js +4 -0
  16. package/dist/{chunk-MAWHHHU3.js → chunk-ACCWXKZW.js} +2 -2
  17. package/dist/{chunk-WZ5V5U2K.js → chunk-AUQLOQ2S.js} +1 -1
  18. package/dist/chunk-AUVWD3WV.js +2 -0
  19. package/dist/chunk-C563KVBD.js +1 -0
  20. package/dist/{chunk-N2Q4MSSP.js → chunk-CX6PAQTQ.js} +5 -5
  21. package/dist/chunk-FE5R6EUV.js +2 -0
  22. package/dist/{chunk-AD4ZY3RF.js → chunk-FFE2JZZJ.js} +8 -8
  23. package/dist/{chunk-EBEAJIBI.js → chunk-GL3KLNIG.js} +1 -1
  24. package/dist/{chunk-BM2F5C4J.js → chunk-H64KAPJJ.js} +1 -1
  25. package/dist/chunk-HMKDU7OU.js +2 -0
  26. package/dist/{chunk-IBJEQHJR.js → chunk-HV6EQMUJ.js} +24 -7
  27. package/dist/{chunk-EG6EZ7HW.js → chunk-IOKEF3DE.js} +1 -1
  28. package/dist/{chunk-A3MYO55A.js → chunk-IRLKWRLP.js} +2 -2
  29. package/dist/chunk-JK6XEF7K.js +6 -0
  30. package/dist/{chunk-ABMB6MJT.js → chunk-K2LKJBQ4.js} +1 -1
  31. package/dist/{chunk-V6TIT6M3.js → chunk-L5IV2SI4.js} +1 -1
  32. package/dist/{chunk-M37ALD4V.js → chunk-LOXR5QUX.js} +1 -1
  33. package/dist/{chunk-KFTJVVJR.js → chunk-M2R6UXJB.js} +1 -1
  34. package/dist/{chunk-XPGCFVGC.js → chunk-QHHSSIMZ.js} +1 -1
  35. package/dist/chunk-RMGSMDJW.js +5 -0
  36. package/dist/chunk-TD5TQZEG.js +2 -0
  37. package/dist/{chunk-YKY4JFCF.js → chunk-XVTN5DDV.js} +1 -1
  38. package/dist/chunk-XY537LCX.js +1 -0
  39. package/dist/chunk-YC676TPF.js +1 -0
  40. package/dist/chunk-YS34N35Y.js +2 -0
  41. package/dist/chunk-ZOE43SGQ.js +1 -0
  42. package/dist/{create-GWBQ74ZI.js → create-HSHAZYAK.js} +1 -1
  43. package/dist/{doctor-OQAXSMEM.js → doctor-VZ2MZ7EI.js} +1 -1
  44. package/dist/{dotnet-webapi-clean-XL4IBUQV.js → dotnet-webapi-clean-VJX6SGGP.js} +39 -33
  45. package/dist/{goal-lifecycle-YWBVQ2DF.js → goal-lifecycle-NKSCALES.js} +1 -1
  46. package/dist/{goal-pack-KUXPZVNO.js → goal-pack-MPKW4K6F.js} +1 -1
  47. package/dist/{gofiber-standard-OHHMCNMJ.js → gofiber-standard-I6ASLOEE.js} +77 -66
  48. package/dist/{gogin-standard-BAZXPOKL.js → gogin-standard-U2LSRLIP.js} +78 -67
  49. package/dist/index.js +102 -102
  50. package/dist/pipeline-RIA5UXUC.js +5 -0
  51. package/dist/{project-agent-entry-H3JAGNLS.js → project-agent-entry-GQAPCSOT.js} +1 -1
  52. package/dist/{project-intelligence-lens-7NMKHV5N.js → project-intelligence-lens-5I2GQBWC.js} +1 -1
  53. package/dist/{project-test-coverage-3DKZKLWY.js → project-test-coverage-4RRCHY5W.js} +1 -1
  54. package/dist/proof-carrying-change-T33C2SSD.js +1 -0
  55. package/dist/{rust-axum-CCJ6UCBW.js → rust-axum-JMV7UPO7.js} +25 -20
  56. package/dist/{springboot-standard-M5JQEJML.js → springboot-standard-OC2RS3KC.js} +41 -39
  57. package/dist/verified-goal-MK5MXGRY.js +1 -0
  58. package/dist/{workspace-TJHCETBV.js → workspace-AZKZPG45.js} +1 -1
  59. package/dist/{workspace-agent-sync-Z35NTXCB.js → workspace-agent-sync-CGK44F3O.js} +1 -1
  60. package/dist/{workspace-context-KNJQUJWC.js → workspace-context-S6ZWRUFZ.js} +1 -1
  61. package/dist/{workspace-contract-VIUQT5SZ.js → workspace-contract-Y7WRHLYR.js} +1 -1
  62. package/dist/{workspace-explain-HM6GMK26.js → workspace-explain-CSJL3GJR.js} +1 -1
  63. package/dist/{workspace-feedback-YSPEGCON.js → workspace-feedback-D6HJLKBQ.js} +1 -1
  64. package/dist/{workspace-foundation-PLXFPI3J.js → workspace-foundation-LLND2WIF.js} +1 -1
  65. package/dist/{workspace-graph-stream-FNRQ2FTB.js → workspace-graph-stream-PHFO2J2E.js} +1 -1
  66. package/dist/{workspace-history-HDDFG6LH.js → workspace-history-WWPS4U7H.js} +1 -1
  67. package/dist/{workspace-intelligence-QLSD5EEV.js → workspace-intelligence-ND2N3B2A.js} +1 -1
  68. package/dist/{workspace-intelligence-runner-4EW4T2OW.js → workspace-intelligence-runner-LHHJM2AT.js} +1 -1
  69. package/dist/{workspace-knowledge-graph-EEOW5VAJ.js → workspace-knowledge-graph-NOGGGENE.js} +1 -1
  70. package/dist/workspace-knowledge-graph-snapshot-7XHZNRFK.js +1 -0
  71. package/dist/workspace-mcp-serve-6NVF7AS6.js +3 -0
  72. package/dist/{workspace-model-NCOOY5LC.js → workspace-model-VOQOEDVU.js} +1 -1
  73. package/dist/{workspace-onboarding-JNC7ZFMR.js → workspace-onboarding-ZRLUMBLE.js} +1 -1
  74. package/dist/{workspace-readme-OV2ADTLW.js → workspace-readme-HA6XLDME.js} +2 -2
  75. package/dist/{workspace-registry-summary-ONT4VOJX.js → workspace-registry-summary-NWZK5IKS.js} +1 -1
  76. package/dist/workspace-repair-engine-VUOCH66O.js +3 -0
  77. package/dist/workspace-run-3YZTVOU6.js +1 -0
  78. package/dist/{workspace-verify-MLABQUWK.js → workspace-verify-4EQI3MCW.js} +1 -1
  79. package/dist/{workspace-watch-MJOG5AZ3.js → workspace-watch-BPRU2X7K.js} +1 -1
  80. package/docs/README.md +39 -34
  81. package/docs/README_CONTENT_CONTRACT.md +14 -9
  82. package/docs/ci-workflows.md +1 -1
  83. package/docs/commands-reference.md +41 -33
  84. package/docs/contracts/PROOF_CARRYING_CHANGE_CONTRACT_PLAN.md +6 -3
  85. package/docs/native-kit-baselines.md +82 -0
  86. package/docs/proof-carrying-change.implementation.v1.json +3 -2
  87. package/docs/proof-carrying-change.md +42 -8
  88. package/docs/real-world-qualification.md +8 -3
  89. package/docs/workspace-knowledge-graph.md +6 -2
  90. package/docs/workspace-run.md +16 -0
  91. package/package.json +1 -1
  92. package/dist/analyze-GPYPXXRT.js +0 -1
  93. package/dist/autopilot-release-FL47VMF7.js +0 -1
  94. package/dist/capabilities-command-MYSLJIYS.js +0 -1
  95. package/dist/chunk-2LZWBUJD.js +0 -1
  96. package/dist/chunk-3HFFKW4Q.js +0 -2
  97. package/dist/chunk-ERVWW5HX.js +0 -1
  98. package/dist/chunk-GSSJJS5M.js +0 -6
  99. package/dist/chunk-I3UCODXU.js +0 -1
  100. package/dist/chunk-MBICKDYP.js +0 -1
  101. package/dist/chunk-MHQHRMKU.js +0 -5
  102. package/dist/chunk-OZXCNVGW.js +0 -2
  103. package/dist/chunk-RVOW3BHQ.js +0 -2
  104. package/dist/chunk-UW4SESKD.js +0 -2
  105. package/dist/chunk-VNKAISFE.js +0 -8
  106. package/dist/chunk-W6WRT77T.js +0 -1
  107. package/dist/chunk-WHR5SL33.js +0 -4
  108. package/dist/chunk-YWZBGSFE.js +0 -9
  109. package/dist/chunk-YZL7ZY7J.js +0 -2
  110. package/dist/pipeline-PGB5TEV3.js +0 -5
  111. package/dist/proof-carrying-change-QFH7WI2E.js +0 -1
  112. package/dist/verified-goal-7XHRWYSE.js +0 -1
  113. package/dist/workspace-knowledge-graph-snapshot-X347REDB.js +0 -1
  114. package/dist/workspace-mcp-serve-NQ42PE2I.js +0 -3
  115. package/dist/workspace-repair-engine-WMJCYWO4.js +0 -3
  116. package/dist/workspace-run-3S35MDX6.js +0 -1
@@ -1,6 +0,0 @@
1
- import {a}from'./chunk-NS53IPAC.js';import {a as a$1}from'./chunk-MGL6DBOR.js';import {g}from'./chunk-OZXCNVGW.js';import {s,b,a as a$2,d,c}from'./chunk-ODK4LCEL.js';import pe from'path';import h from'chalk';import {createHash}from'crypto';var F="workspai.doctor-adapter.v1",D=["runtime","dependency","security","configuration","test","quality"];function A(e){return e.trim().toLowerCase().replace(/[^a-z0-9+.#-]+/g,"-")}function ae(e){if(e.contractVersion!==F)throw new Error(`Unsupported Doctor adapter contract: ${e.contractVersion}`);if(!e.id.trim())throw new Error("Doctor adapter id must not be empty.");if(e.runtimeFamilies.length===0)throw new Error(`Doctor adapter ${e.id} must own at least one runtime family.`);if(e.platforms.length===0)throw new Error(`Doctor adapter ${e.id} must declare supported platforms.`);let i=e.domains.map(t=>t.domain);if(i.length!==D.length||new Set(i).size!==D.length||D.some(t=>!i.includes(t)))throw new Error(`Doctor adapter ${e.id} must declare every canonical diagnostic domain exactly once.`);for(let t of e.domains)if(t.level==="unsupported"&&t.limitations.length===0)throw new Error(`Doctor adapter ${e.id} must explain unsupported ${t.domain} coverage.`)}var $=class{#e=new Map;#i=new Map;#t=new Map;register(i){ae(i);let t=A(i.id);if(this.#e.has(t))throw new Error(`Doctor adapter id is already registered: ${i.id}`);let s=[...i.runtimeFamilies,...i.aliases].map(A);for(let c of s){let a=this.#i.get(c);if(a)throw new Error(`Doctor runtime ${c} is already owned by adapter ${a}.`)}for(let c of i.frameworks.map(A)){let a=this.#t.get(c);if(a)throw new Error(`Doctor framework ${c} is already owned by adapter ${a}.`)}let r=structuredClone(i);this.#e.set(t,r);for(let c of s)this.#i.set(c,t);for(let c of i.frameworks.map(A))this.#t.set(c,t);return this}resolveWithDiagnostics(i){let t=i.runtimeFamily?this.#i.get(A(i.runtimeFamily)):void 0,s=i.framework?this.#t.get(A(i.framework)):void 0;if(t&&s&&t!==s)return {status:"conflict",descriptor:null,runtimeOwner:t,frameworkOwner:s};let r=t??s;return {status:r?"matched":"unresolved",descriptor:r?structuredClone(this.#e.get(r)??null):null,...t?{runtimeOwner:t}:{},...s?{frameworkOwner:s}:{}}}resolve(i){return this.resolveWithDiagnostics(i).descriptor}list(){return [...this.#e.values()].map(i=>structuredClone(i)).sort((i,t)=>i.id.localeCompare(t.id))}};var Y=[...D],W=["linux","darwin","win32"],re=[{id:"node",aliases:["nodejs","javascript","typescript"],frameworks:["NestJS","Next.js","Remix","Nuxt","React","Vue","Angular","SvelteKit","Svelte","Vite","Astro","Solid","Express","Fastify","Koa","Electron","VS Code Extension"],tier:"first-class",native:Y},{id:"python",aliases:["py"],frameworks:["FastAPI","Django","Flask","Python"],tier:"first-class",native:Y},{id:"go",aliases:["golang"],frameworks:["Go","Go/Fiber","Go/Gin","Echo"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"java",aliases:["jvm"],frameworks:["Java","Spring Boot"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"dotnet",aliases:[".net","csharp","c#"],frameworks:["ASP.NET"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"rust",aliases:["cargo"],frameworks:["Rust","Axum"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"php",aliases:["composer"],frameworks:["PHP","Laravel"],tier:"first-class",native:["runtime","dependency","security"],portable:["configuration","test","quality"]},{id:"ruby",aliases:["bundler"],frameworks:["Ruby","Ruby on Rails"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"elixir",aliases:["beam"],frameworks:["Elixir","Phoenix"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"clojure",frameworks:["Clojure"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"deno",frameworks:["Deno"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"bun",frameworks:["Bun"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"scala",frameworks:["Scala"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"kotlin",frameworks:["Kotlin"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"c",aliases:["c-lang"],frameworks:["C"],tier:"extended",portable:["runtime","dependency","test","quality"],observable:["configuration"],limitations:["Security diagnosis requires a declared native scanner or workspace adapter."]},{id:"cpp",aliases:["c++","cplusplus"],frameworks:["C++"],tier:"extended",portable:["runtime","dependency","test","quality"],observable:["configuration"],limitations:["Security diagnosis requires a declared native scanner or workspace adapter."]}];function oe(e,i){let t={runtime:["project markers","entrypoints","toolchain evidence"],dependency:["dependency manifests","lockfiles","installed-tree evidence"],security:["runtime-native audit","advisory evidence"],configuration:["environment contracts","deployment/container markers"],test:["test scripts","test configuration","coverage evidence"],quality:["lint/format/static-analysis contracts"]};return [`${e} adapter`,...t[i]]}function ce(e,i){return e.native?.includes(i)?"native":e.portable?.includes(i)?"portable":e.observable?.includes(i)?"observable":"unsupported"}function le(e){let i=D.map(t=>{let s=ce(e,t);return {domain:t,level:s,evidenceSources:s==="unsupported"?[]:oe(e.id,t),limitations:s==="unsupported"?[`${e.id} has no built-in ${t} provider; declare a workspace adapter.`]:s==="observable"?[`${t} evidence is observable but not runtime-native for ${e.id}.`]:[]}});return {contractVersion:F,id:`builtin.${e.id}`,runtimeFamilies:[e.id],aliases:e.aliases??[],frameworks:e.frameworks,projectKinds:["backend","frontend","desktop","extension","fullstack","generic"],tier:e.tier,platforms:[...W],domains:i,repairModes:["typed-operation","structured-invocation","manual-guidance"],source:"builtin",limitations:e.limitations??[]}}function de(){return {contractVersion:F,id:"builtin.unknown",runtimeFamilies:["unknown"],aliases:["generic","unrecognized"],frameworks:["Unknown"],projectKinds:["backend","frontend","desktop","extension","fullstack","generic"],tier:"fallback",platforms:[...W],domains:D.map(e=>({domain:e,level:e==="security"?"unsupported":"observable",evidenceSources:e==="security"?[]:["portable workspace markers","declared custom checks"],limitations:[e==="security"?"No safe security claim is possible without a runtime-native audit provider.":`Only portable ${e} evidence is available until a runtime adapter is registered.`]})),repairModes:["manual-guidance"],source:"builtin",limitations:["Unknown runtimes are fail-closed: missing domain evidence is reported as unknown, never healthy.","Automatic repair is unavailable until a typed adapter owns the runtime."]}}function P(){let e=new $;for(let i of re)e.register(le(i));return e.register(de()),e}function J(e,i=P()){let t=i.resolveWithDiagnostics(e),s=t.descriptor??i.resolve({runtimeFamily:"unknown"});if(!s)throw new Error("Doctor fallback adapter is not registered.");let r=c=>s.domains.filter(a=>a.level===c).map(a=>a.domain);return {registryVersion:b,adapterId:s.id,runtimeFamily:s.runtimeFamilies[0]??"unknown",tier:s.tier,confidence:s.tier==="first-class"?"high":s.tier==="extended"?"medium":"low",nativeDomains:r("native"),portableDomains:r("portable"),observableDomains:r("observable"),unsupportedDomains:r("unsupported"),limitations:[...t.status==="conflict"?[`Runtime/framework ownership conflict (${t.runtimeOwner} vs ${t.frameworkOwner}); Doctor failed closed instead of selecting an ambiguous adapter.`]:[],...s.limitations,...s.domains.flatMap(c=>c.limitations)]}}function K(e={}){let i=P(),t=i.list(),s=i.resolveWithDiagnostics({runtimeFamily:e.runtime,framework:e.framework}),r=e.runtime||e.framework?[s.descriptor]:t;if((e.runtime||e.framework)&&!r[0]){let a=i.resolve({runtimeFamily:"unknown"});a&&(s.status==="conflict"&&a.limitations.unshift(`Runtime/framework ownership conflict (${s.runtimeOwner} vs ${s.frameworkOwner}); Doctor failed closed instead of selecting an ambiguous adapter.`),r[0]=a);}let c=r.filter(a=>!!a);return {schemaVersion:a$2,registryVersion:b,generatedBy:"workspai",policy:{unknownIsHealthy:false,unsupportedIsHealthy:false,repairRequiresTypedOperation:true,canonicalDomains:[...D]},summary:{adapterCount:c.length,firstClassRuntimes:c.filter(a=>a.tier==="first-class").length,extendedRuntimes:c.filter(a=>a.tier==="extended").length,fallbackRuntimes:c.filter(a=>a.tier==="fallback").length,frameworkCount:new Set(c.flatMap(a=>a.frameworks)).size,platformCount:new Set(c.flatMap(a=>a.platforms)).size},adapters:c}}var me=["runtime","dependency","security","configuration","test","quality"];function I(e){return createHash("sha256").update(e).digest("hex").slice(0,12)}function S(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function Q(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g," ").replace(/\s+/g," ").trim()}function ge(e,i){let t=Q(e);return t?i.some(s=>[s.reason,s.recommendation??""].map(Q).filter(Boolean).some(c=>c===t||c.includes(t)||t.includes(c))):true}function fe(e){return e.status==="fail"?"blocking":e.status==="warn"?"advisory":"informational"}function X(e){return e.issueClass==="dependency"?"dependency":e.issueClass==="security"?"security":e.issueClass==="environment"||e.issueClass==="configuration"||e.issueClass==="container"||e.issueClass==="deployment"||e.issueClass==="workspace-contract"?"configuration":e.issueClass==="test"?"test":e.issueClass==="quality"||e.issueClass==="custom"?"quality":e.issueClass==="runtime"||e.issueClass==="framework"||e.issueClass==="source-tree"?"runtime":null}function ye(e,i){return me.map(t=>{let s=e.filter(o=>X(o)===t),r=e.filter(o=>o.applicability!=="not-applicable"&&X(o)===t),c=i.unsupportedDomains.includes(t);if(r.length===0){let o=s.some(d=>d.applicability==="not-applicable");return {id:t,status:o?"not-applicable":"not-run",observationCount:0,blockingFindings:0,advisoryFindings:0,reason:o?`${t} checks ran and found no declared intent requiring this domain.`:c?`${t} is unsupported by Doctor adapter ${i.adapterId}; no healthy claim is allowed.`:`No ${t} diagnostic observation was produced.`}}let a=r.some(o=>o.freshness?.status==="stale"||o.freshness?.status==="unknown"),p=r.filter(o=>o.status==="fail").length,m=r.filter(o=>o.status==="warn").length,C=p>0||m>0;return {id:t,status:a?"stale":C?"findings":c?"not-run":"clean",observationCount:r.length,blockingFindings:p,advisoryFindings:m,reason:a?`${t} evidence is stale or has unknown freshness.`:C?`${t} diagnostics produced findings.`:c?`${t} observations cannot establish complete health because adapter ${i.adapterId} declares the domain unsupported.`:`${t} diagnostics completed without findings.`}})}function De(e){if(e.status==="pass")return "not-needed";let i=e.repairCapability;return i?i.status==="manual"||i.requiresReview?"manual":i.status!=="available"||!i.canAutoFix?"unavailable":i.requiresApproval?"approval-required":"automatic":"unavailable"}function be(e){if(e.freshness?.status==="stale"||e.freshness?.status==="unknown")return {label:"low",score:.35,state:"unknown"};let i=!!(e.issueClass&&e.issueClass!=="unknown"),t=!!(e.repairCapability?.operation?.type||e.repairCapability?.invocation?.executable);return i&&t&&e.repairIntent?.confidence==="high"?{label:"high",score:.95,state:"confirmed"}:i&&(e.status==="fail"||e.status==="warn")?{label:"medium",score:t?.82:.68,state:"candidate"}:e.status==="pass"?{label:"high",score:.98,state:"confirmed"}:{label:"low",score:.3,state:"unknown"}}function ve(e,i){let t=[{kind:"probe",role:"observation",ref:`probe:${e.id}`,claim:e.reason}];for(let r of e.repairCapability?.files??[])t.push({kind:"file",role:"repair-target",ref:r.split(pe.sep).join("/"),claim:"Structured repair capability declared this path as an affected target."});if(e.repairCapability?.invocation?.executable){let r=e.repairCapability.invocation;t.push({kind:"command",role:"verification",ref:[r.executable,...r.args??[]].join(" "),claim:"Structured command invocation is available for this diagnostic path."});}if(e.issueClass==="security"&&/(?:dependency|audit|vulnerab|security-hygiene)/i.test(`${e.id} ${e.label}`))for(let r of i??[])t.push({kind:"dependency",role:"subject",ref:r.version?`${r.name}@${r.version}`:r.name,claim:r.advisoryIds&&r.advisoryIds.length>0?`Dependency is referenced by ${r.advisoryIds.join(", ")}.`:"Dependency is present in security audit evidence."});return t}function we(e,i){let t=i.issueClass?.trim()||"unknown",s=be(i);return {id:`${S(i.id)}:${I(`${e.projectPath}\0${i.id}`)}`,causalKey:[S(e.projectName),I(e.projectPath),S(t),S(i.id)].join(":"),projectName:e.projectName,projectPath:e.projectPath,probeId:i.id,label:i.label,status:fe(i),severity:i.severity,issueClass:t,operationalImpact:i.operationalImpact?.trim()||"developer-friction",applicability:i.applicability??"applicable",confidence:s.label,confidenceScore:s.score,diagnosisState:s.state,symptom:i.reason,...i.recommendation?{recommendation:i.recommendation}:{},proofs:ve(i,e.dependencySubjects),repair:{disposition:De(i),...i.repairCapability?.id?{capabilityId:i.repairCapability.id}:{},...i.repairCapability?.operation?.type?{operationType:i.repairCapability.operation.type}:{},...i.repairCapability?.verifyCommand?{verifyCommand:i.repairCapability.verifyCommand}:{},requiresFreshEvidence:i.repairIntent?.requiresFreshEvidence===true||i.freshness?.verifyBeforeUse===true}}}function he(e,i,t){let s=`legacy-runtime-issue-${t+1}`;return {id:`${s}:${I(`${e.projectPath}\0${i}`)}`,causalKey:[S(e.projectName),I(e.projectPath),"unknown",I(i)].join(":"),projectName:e.projectName,projectPath:e.projectPath,probeId:s,label:"Runtime diagnostic issue",status:"blocking",severity:"error",issueClass:"unknown",operationalImpact:"runtime-risk",applicability:"applicable",confidence:"low",confidenceScore:.25,diagnosisState:"unknown",symptom:i,proofs:[{kind:"unknown",role:"observation",ref:`legacy-issue:${t+1}`,claim:i}],repair:{disposition:"unavailable",requiresFreshEvidence:true}}}function Z(e){let i=[...e.probes],t=[...new Set((e.runtimeFamilies&&e.runtimeFamilies.length>0?e.runtimeFamilies:[e.runtimeFamily??"unknown"]).filter(Boolean))],s=e.runtimeFamily??t[0]??"unknown",r=t.filter(n=>n!==s&&n!=="unknown"),c=J({runtimeFamily:e.runtimeFamily,framework:e.framework},e.adapterRegistry),a$1=ye(i,c),p=(e.legacyIssues??[]).filter(n=>!ge(n,i)),m=new Map;for(let n of i){let l=m.get(n.id)??new Set;l.add(n.status),m.set(n.id,l);}let C=[...m.entries()].filter(([,n])=>n.size>1).map(([n,l])=>({probeId:n,statuses:[...l].sort(),reason:"The same diagnostic probe produced contradictory states in one project scan."})),o=[...i.filter(n=>n.applicability!=="not-applicable"&&n.status!=="pass").map(n=>we(e,n)),...p.map((n,l)=>he(e,n,l))],d={blocking:4,unknown:3,advisory:2,informational:1},O=new Map;for(let n of o){let l=O.get(n.causalKey)??[];l.push(n),O.set(n.causalKey,l);}let g=[...O.values()].map(n=>{let u=[...n].sort((f,j)=>d[j.status]-d[f.status]||j.confidenceScore-f.confidenceScore||f.id.localeCompare(j.id)).at(0);if(!u)throw new Error("Doctor diagnosis causal group cannot be empty.");let G=structuredClone(u);return G.proofs=[...new Map(n.flatMap(f=>f.proofs).map(f=>[`${f.kind}:${f.role}:${f.ref}:${f.claim}`,f])).values()],G}).sort((n,l)=>n.causalKey.localeCompare(l.causalKey)||n.id.localeCompare(l.id)),k=new Map;for(let n of g){let l=k.get(n.causalKey)??[];l.push(n),k.set(n.causalKey,l);}let b=[...k.entries()].map(([n,l])=>({causalKey:n,issueClass:l[0]?.issueClass??"unknown",status:l.some(u=>u.status==="blocking")?"blocking":l.some(u=>u.status==="advisory")?"advisory":l.some(u=>u.status==="unknown")?"unknown":"informational",findingIds:l.map(u=>u.id),projectPaths:[...new Set(l.map(u=>u.projectPath))],repairable:l.some(u=>u.repair.disposition==="automatic"||u.repair.disposition==="approval-required")})),v=[...g.filter(n=>n.diagnosisState==="unknown"||n.issueClass==="unknown"||n.applicability==="unknown").map(n=>({id:`unknown:${n.id}`,probeId:n.probeId,reason:n.issueClass==="unknown"?"The observation is real, but Doctor cannot yet bind it to a typed issue class.":"Evidence is insufficient or stale for a confirmed diagnosis."})),...a$1.filter(n=>n.status==="not-run"||n.status==="stale").map(n=>({id:`unknown:domain:${n.id}:${I(e.projectPath)}`,reason:n.reason})),...r.map(n=>({id:`unknown:runtime:${S(n)}:${I(e.projectPath)}`,reason:e.projectArchetype==="platform"?`${n} is part of this cross-language platform, but only portable evidence and the primary ${s} runtime adapter were evaluated. Add a typed ${n} adapter before making runtime-specific health claims.`:`${n} was detected inside this composite project boundary, but the ${s} adapter is the only runtime-specific adapter evaluated for this scan. Declare a nested project boundary or a typed Doctor adapter before treating ${n} as healthy.`}))],y=g.filter(n=>n.diagnosisState!=="unknown").length,x=g.length===0?100:y/g.length*100,ie=a$1.filter(n=>n.status!=="not-run"&&n.status!=="stale").length/a$1.length*100,U=t.filter(n=>n!=="unknown").length,te=s!=="unknown"&&t.includes(s)?1:0,ne=U===0?0:te/U*100,se=Math.round(Math.min(x,ie,ne)*100)/100;return {schemaVersion:a,engineVersion:"universal-diagnosis-v1",project:{name:e.projectName,path:e.projectPath,runtimeFamily:e.runtimeFamily??"unknown",runtimeFamilies:t,framework:e.framework??"Unknown",projectKind:e.projectKind??"generic"},capability:c,domains:a$1,coverage:{totalObservations:i.length+p.length,evaluatedObservations:i.filter(n=>n.applicability!=="not-applicable").length,passingObservations:i.filter(n=>n.applicability!=="not-applicable"&&n.status==="pass").length,blockingFindings:g.filter(n=>n.status==="blocking").length,advisoryFindings:g.filter(n=>n.status==="advisory").length,unknownFindings:v.length,repairableFindings:g.filter(n=>n.repair.disposition==="automatic"||n.repair.disposition==="approval-required").length,manualFindings:g.filter(n=>n.repair.disposition==="manual").length,unsupportedFindings:g.filter(n=>n.repair.disposition==="unavailable").length,contradictionCount:C.length,diagnosisCompleteness:se},findings:g,causalGroups:b,unknowns:v,contradictions:C}}function w(e){let i=e.severity??"error",t=e.repair??"unavailable";return {id:e.id,label:e.label,status:i==="error"?"fail":"warn",severity:i,reason:`${e.label} detected by the validation corpus.`,issueClass:e.issueClass,operationalImpact:i==="error"?"release-risk":"ci-risk",repairIntent:{confidence:e.confidence??"medium",requiresFreshEvidence:true},...t==="unavailable"?{}:{repairCapability:{id:`repair.${e.id}`,status:t==="manual"?"manual":"available",canAutoFix:t==="automatic"||t==="approval-required",requiresApproval:t==="approval-required",requiresReview:t==="manual",operation:{type:"validation-operation"},verifyCommand:"npx workspai doctor project --json"}}}}var Ce=[{id:"runtime-missing",diseaseClass:"runtime",description:"Required runtime is absent.",probe:w({id:"runtime-missing",label:"Runtime missing",issueClass:"runtime"}),expected:{finding:true,domain:"runtime",status:"blocking",diagnosisState:"candidate",repairDisposition:"unavailable"}},{id:"dependencies-missing",diseaseClass:"dependency",description:"Installed dependency tree is absent.",probe:w({id:"dependencies-missing",label:"Dependencies missing",issueClass:"dependency",repair:"automatic",confidence:"high"}),expected:{finding:true,domain:"dependency",status:"blocking",diagnosisState:"confirmed",repairDisposition:"automatic"}},{id:"security-advisory",diseaseClass:"security",description:"A runtime-native audit reports a blocking advisory.",probe:w({id:"security-advisory",label:"Security advisory",issueClass:"security",repair:"approval-required",confidence:"high"}),expected:{finding:true,domain:"security",status:"blocking",diagnosisState:"confirmed",repairDisposition:"approval-required"}},{id:"environment-contract",diseaseClass:"configuration",description:"Environment/configuration contract is incomplete.",probe:w({id:"environment-contract",label:"Environment contract incomplete",issueClass:"environment",severity:"warn",repair:"manual"}),expected:{finding:true,domain:"configuration",status:"advisory",diagnosisState:"candidate",repairDisposition:"manual"}},{id:"container-contract",diseaseClass:"configuration",description:"Container delivery contract is incomplete.",probe:w({id:"container-contract",label:"Container contract incomplete",issueClass:"container",severity:"warn"}),expected:{finding:true,domain:"configuration",status:"advisory",diagnosisState:"candidate",repairDisposition:"unavailable"}},{id:"tests-missing",diseaseClass:"test",description:"No deterministic test surface is declared.",probe:w({id:"tests-missing",label:"Tests missing",issueClass:"test",severity:"warn",repair:"manual"}),expected:{finding:true,domain:"test",status:"advisory",diagnosisState:"candidate",repairDisposition:"manual"}},{id:"quality-missing",diseaseClass:"quality",description:"No lint/format/static-analysis surface is declared.",probe:w({id:"quality-missing",label:"Quality tooling missing",issueClass:"quality",severity:"warn"}),expected:{finding:true,domain:"quality",status:"advisory",diagnosisState:"candidate",repairDisposition:"unavailable"}},{id:"stale-evidence",diseaseClass:"freshness",description:"Evidence is stale and must not be treated as confirmed.",probe:{...w({id:"stale-evidence",label:"Stale evidence",issueClass:"security"}),freshness:{status:"stale",verifyBeforeUse:true}},expected:{finding:true,domain:"security",status:"blocking",diagnosisState:"unknown",repairDisposition:"unavailable"}},{id:"unknown-disease",diseaseClass:"unknown",description:"A real symptom cannot be bound to a typed disease class.",probe:w({id:"unknown-disease",label:"Unknown disease",issueClass:"unknown"}),expected:{finding:true,status:"blocking",diagnosisState:"unknown",repairDisposition:"unavailable"}},{id:"healthy-runtime",diseaseClass:"healthy-control",description:"Healthy evidence must not become a finding.",probe:{id:"healthy-runtime",label:"Healthy runtime",status:"pass",severity:"info",reason:"Runtime evidence is healthy.",issueClass:"runtime",operationalImpact:"none"},expected:{finding:false,domain:"runtime"}}];function _(e){return Math.round(e*1e4)/1e4}function ee(){let i=P().list(),t=i.flatMap(o=>Ce.map(d=>{let O=o.runtimeFamilies[0]??"unknown",g=o.frameworks[0]??"Unknown",k=Z({projectName:`validation-${o.id}-${d.id}`,projectPath:`/virtual/doctor-validation/${o.id}/${d.id}`,runtimeFamily:O,framework:g,projectKind:"generic",probes:[d.probe]}),b=k.findings.find(x=>x.probeId===d.probe.id),N=k.domains.find(x=>x.observationCount>0)?.id,v={finding:!!b,...N?{domain:N}:{},...b?.status?{status:b.status}:{},...b?.diagnosisState?{diagnosisState:b.diagnosisState}:{},...b?.repair.disposition?{repairDisposition:b.repair.disposition}:{}},y=[];return v.finding!==d.expected.finding&&y.push("finding-presence"),d.expected.domain&&v.domain!==d.expected.domain&&y.push("domain"),d.expected.status&&v.status!==d.expected.status&&y.push("status"),d.expected.diagnosisState&&v.diagnosisState!==d.expected.diagnosisState&&y.push("diagnosis-state"),d.expected.repairDisposition&&v.repairDisposition!==d.expected.repairDisposition&&y.push("repair-disposition"),k.capability.adapterId!==o.id&&y.push("adapter-binding"),{id:`${o.id}:${d.id}`,passed:y.length===0,expected:d.expected,actual:v,failures:y}})),s=t.filter(o=>o.expected.finding),r=t.filter(o=>!o.expected.finding),c$1=s.filter(o=>o.actual.finding).length,a=s.length-c$1,p=r.filter(o=>!o.actual.finding).length,m=r.length-p,C=new Set(t.map(o=>o.actual.domain).filter(o=>!!o));return {schemaVersion:c,corpusVersion:d,capabilityRegistryVersion:b,scope:"synthetic-contract-corpus",summary:{totalCases:t.length,passedCases:t.filter(o=>o.passed).length,failedCases:t.filter(o=>!o.passed).length,truePositives:c$1,trueNegatives:p,falsePositives:m,falseNegatives:a,precision:_(c$1/Math.max(1,c$1+m)),recall:_(c$1/Math.max(1,c$1+a)),domainCoverage:_(C.size/D.length),runtimeAdapterCoverage:_(new Set(t.map(o=>o.id.split(":",1)[0])).size/Math.max(1,i.length)),runtimeAdaptersExercised:i.length,declaredPlatforms:new Set(i.flatMap(o=>o.platforms)).size},cases:t,limitations:["Precision and recall describe the versioned synthetic contract corpus, not every public repository.","Every registered runtime adapter is exercised against the same disease corpus; this proves contract behavior, not tool availability on a host.","Runtime-native fixture and real Linux, macOS, and Windows acceptance gates remain separate evidence surfaces."]}}async function Qe(e={}){let i=K({runtime:e.runtime,framework:e.framework}),t=e.validate?ee():void 0,s$1,r;if(e.write){let a=e.workspace?pe.resolve(e.workspace):a$1(process.cwd());if(!a)return e.json?console.log(JSON.stringify({schemaVersion:i.schemaVersion,status:"error",error:{code:"doctor.capabilities.workspace-not-found",message:"--write requires a Workspai workspace or --workspace <path>."}},null,2)):console.log(h.red("Doctor capabilities could not be written: no workspace found.")),1;let p=K();s$1=await g(a,s.doctorCapabilities.artifactPath,p),t&&(r=await g(a,s.doctorValidation.artifactPath,t));}let c={...i,...t?{validation:t}:{},...s$1?{artifactPath:s$1}:{},...r?{validationArtifactPath:r}:{}};if(e.json)e.quiet||console.log(JSON.stringify(c,null,2));else if(!e.quiet){console.log(h.bold.cyan(`
2
- \u{1FA7A} Workspai Doctor capabilities
3
- `)),console.log(`${i.summary.adapterCount} adapter(s) \xB7 ${i.summary.frameworkCount} framework mapping(s) \xB7 ${i.summary.platformCount} platform(s)`);for(let a of i.adapters){let p=a.domains.map(m=>`${m.domain}:${m.level}`).join(" \xB7 ");console.log(h.bold(`
4
- ${a.runtimeFamilies.join(", ")} \xB7 ${a.tier}`)),console.log(h.gray(p));for(let m of a.limitations)console.log(h.yellow(` ! ${m}`));}if(t){let a=t.summary,p=a.failedCases===0?h.green:h.red;console.log(p(`
5
- Validation ${a.passedCases}/${a.totalCases} \xB7 precision ${a.precision} \xB7 recall ${a.recall}`));}s$1&&console.log(h.gray(`
6
- Capabilities: ${s$1}`)),r&&console.log(h.gray(`Validation: ${r}`));}return t&&t.summary.failedCases>0?1:0}export{Z as a,Qe as b};
@@ -1 +0,0 @@
1
- import {a as a$1}from'./chunk-A5FBGRJA.js';import {g,p}from'./chunk-UW4SESKD.js';import {f as f$1,g as g$1}from'./chunk-OZXCNVGW.js';import {t,s}from'./chunk-ODK4LCEL.js';import {s as s$1,q}from'./chunk-RGNCL5OB.js';import {t as t$1}from'./chunk-VQZ5PI5J.js';import a from'path';import {existsSync}from'fs';import m from'fs-extra';var f=t.workspaceRegistry,w=s.workspaceRegistry.schemaVersion;function E(r){return {slug:r.slug,relativePath:r.relativePath,framework:r.framework,kit:r.kit,source:r.source}}async function b(r){let e=t$1(r,"workspace.json").find(t=>existsSync(t));if(!e)return {exists:false,legacyProjectCount:0};try{let t=await m.readJson(e),c=Array.isArray(t.projects)?t.projects.length:0,o=typeof t.workspace_name=="string"&&t.workspace_name.trim()||typeof t.name=="string"&&t.name.trim()||a.basename(r);return {exists:true,manifestPath:e,workspaceName:o,profile:typeof t.profile=="string"?t.profile:void 0,legacyProjectCount:c}}catch{return {exists:true,manifestPath:e,legacyProjectCount:0,workspaceName:a.basename(r)}}}async function _(r){let e=a$1(r);for(let t of s$1())if(await m.pathExists(t))try{let o=((await m.readJson(t)).workspaces||[]).find(s=>a$1(s.path)===e);if(o)return {exists:true,projectCount:Array.isArray(o.projects)?o.projects.length:0,registryPath:t}}catch{continue}return {exists:false,projectCount:0,registryPath:a.join(q(),"workspaces.json")}}async function T(r,e){let t=a.resolve(r),c=await f$1(t,g),o=await b(t),s=await _(t),i=e?.contract!==void 0||!!c,n=[];if(e?.contract)n=e.contract.projects||[];else if(i)try{let{contract:A}=await p({workspacePath:t});n=A.projects||[];}catch{n=[];}let d={contract:{exists:i,projectCount:n.length,path:g},globalRegistry:{exists:s.exists,projectCount:s.projectCount,path:s.registryPath},legacyWorkspaceJson:{exists:o.exists,projectCount:o.legacyProjectCount,path:o.manifestPath?a.relative(t,o.manifestPath):void 0}},p$1="none",u=[],y=0;return i?(p$1="workspace.contract.json",u=n.map(E),y=u.length):s.projectCount>0?(p$1="global-registry",y=s.projectCount):o.legacyProjectCount>0&&(p$1="legacy-workspace.json",y=o.legacyProjectCount),{contractExists:i,summary:{schemaVersion:w,kind:"rapidkit.workspace.registry",workspacePath:t,workspaceName:o.workspaceName||a.basename(t),profile:o.profile,projectCount:y,authority:p$1,contractPath:g,projects:u,sources:d}}}async function U(r){let e=await f$1(r,f);if(!e)return null;try{let t=await m.readJson(e);return t?.schemaVersion!==w?null:t}catch{return null}}async function D(r,e){let t=await M(r,e);return await g$1(r,f,t),t}async function M(r,e){return {...(await T(r,{contract:e?.contract})).summary,generatedAt:(e?.now??new Date).toISOString(),registrySummaryPath:f}}function F(r,e=""){return r.projectCount>0?r.authority==="workspace.contract.json"?`${r.projectCount} project(s) registered in workspace contract${e}.`:r.authority==="global-registry"?`${r.projectCount} project(s) registered in global workspace registry${e}.`:`${r.projectCount} project(s) registered in legacy workspace manifest${e}.`:`Workspace state exists, but no projects are registered yet${e}.`}export{f as a,w as b,T as c,U as d,D as e,M as f,F as g};
@@ -1 +0,0 @@
1
- import {b,d}from'./chunk-AD4ZY3RF.js';import {f}from'./chunk-OZXCNVGW.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([f(e,p.model),f(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$1=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$1.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};
@@ -1,5 +0,0 @@
1
- import {c as c$1,b as b$1}from'./chunk-WCJU3CFG.js';import {d,b,e}from'./chunk-ERVWW5HX.js';import {a}from'./chunk-TKXRP2B4.js';import {d as d$2}from'./chunk-S5KTATOU.js';import {a as a$1}from'./chunk-NMXGSVMD.js';import {q as q$1,z as z$1,u as u$1}from'./chunk-KFTJVVJR.js';import {k,m,g,f as f$1}from'./chunk-U5ENEDJA.js';import {f}from'./chunk-OZXCNVGW.js';import {p,t}from'./chunk-ODK4LCEL.js';import {a as a$2}from'./chunk-TQEMLBAG.js';import {c,d as d$1}from'./chunk-25AWHAB5.js';import {e as e$1,g as g$1}from'./chunk-RGNCL5OB.js';import {u,q,t as t$1}from'./chunk-VQZ5PI5J.js';import J from'fs';import w from'path';import T from'chalk';import {execa}from'execa';var ct={"python-fastapi":{runtime:"python",framework:"FastAPI",markers:["pyproject.toml","fastapi"],commands:{init:"python -m pip install -e .",test:"pytest",build:"python -m build",start:"uvicorn main:app --reload"},errorPatterns:{setup:["ModuleNotFoundError","No module named","pip: command not found"],"test-failure":["FAILED","ERROR","test session started"],dependency:["ImportError","missing.*dependency"],runtime:["TypeError","AttributeError","ValueError"],timeout:["timeout","Timeout","timed out"],unknown:[]},healthCheck:{stage:"start",type:"http",value:"http://localhost:8000/docs"},validation:{command:"python -m pip list | grep fastapi",error:"FastAPI not installed"}},"python-django":{runtime:"python",framework:"Django",markers:["manage.py","django"],commands:{init:"python manage.py migrate",test:"python manage.py test",build:"python manage.py collectstatic --noinput",start:"python manage.py runserver 0.0.0.0:8000"},errorPatterns:{setup:["ModuleNotFoundError","ProgrammingError.*migrate"],"test-failure":["FAILED","ERROR","Ran.*test"],dependency:["ImportError","missing.*dependency"],runtime:["DatabaseError","ImproperlyConfigured"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"node-nestjs":{runtime:"node",framework:"NestJS",markers:["package.json","@nestjs/core"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm run start"},errorPatterns:{setup:["npm ERR!","ENOENT","not found"],"test-failure":["Tests.*failed","FAIL","fail.*test"],dependency:["Cannot find module","ERR_MODULE_NOT_FOUND"],runtime:["TypeError","Error: ","ReferenceError"],timeout:["timeout","TIMEOUT"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3}},"node-express":{runtime:"node",framework:"Express",markers:["package.json","express"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm start"},errorPatterns:{setup:["npm ERR!","ENOENT"],"test-failure":["failed","FAIL"],dependency:["Cannot find module"],runtime:["Error","TypeError"],timeout:["timeout"],unknown:[]}},"go-fiber":{runtime:"go",framework:"Fiber",markers:["go.mod","fiber"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found","cannot find","go mod tidy"],"test-failure":["FAIL","--- FAIL"],dependency:["missing.*module"],runtime:["panic","fatal","Error"],timeout:["timeout","context deadline"],unknown:[]},dependencies:["init"]},"go-gin":{runtime:"go",framework:"Gin",markers:["go.mod","gin-gonic"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found"],"test-failure":["FAIL"],dependency:["missing.*module"],runtime:["panic"],timeout:["timeout"],unknown:[]}},"java-springboot":{runtime:"java",framework:"Spring Boot",markers:["pom.xml","build.gradle","spring-boot"],commands:{init:"mvn dependency:go-offline",test:"mvn test",build:"mvn package -DskipTests",start:"mvn spring-boot:run"},errorPatterns:{setup:["\\[ERROR\\]","BUILD FAILURE","missing dependencies"],"test-failure":["\\[ERROR\\] Tests run:","BUILD FAILURE"],dependency:["missing.*dependency"],runtime:["Exception","Error","NullPointerException"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8080}},"php-laravel":{runtime:"php",framework:"Laravel",markers:["composer.json","artisan","app/Models"],commands:{init:"composer install && php artisan migrate:fresh --seed",test:"php artisan test",build:"php artisan config:cache && php artisan route:cache && php artisan view:cache",start:"php artisan serve --host=0.0.0.0 --port=8000"},errorPatterns:{setup:["Composer.*lock","Fatal error","Class.*not found"],"test-failure":["FAILED","Tests.*failed"],dependency:["Class.*not found","require.*failed"],runtime:["Fatal error","Exception","Error"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"php-symfony":{runtime:"php",framework:"Symfony",markers:["composer.json","symfony.lock","bin/console"],commands:{init:"composer install && php bin/console doctrine:database:create",test:"php bin/phpunit",build:"php bin/console cache:clear --env=prod",start:"symfony serve --no-tls"},errorPatterns:{setup:["Composer.*error","Fatal error"],"test-failure":["FAILED","failure"],dependency:["Class.*not found"],runtime:["Fatal error","Exception"],timeout:["timeout"],unknown:[]},dependencies:["init"]},"rust-actix":{runtime:"rust",framework:"Actix-web",markers:["Cargo.toml","actix"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find","failed.*download"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E","thread.*panicked"],timeout:["timeout"],unknown:[]},validation:{command:"cargo --version",error:"Rust/Cargo not installed"}},"rust-axum":{runtime:"rust",framework:"Axum",markers:["Cargo.toml","axum"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"rust-rocket":{runtime:"rust",framework:"Rocket",markers:["Cargo.toml","rocket"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["FAILED"],dependency:["can.t find"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"dotnet-aspnetcore":{runtime:"dotnet",framework:"ASP.NET Core",markers:[".csproj",".sln","Program.cs"],commands:{init:"dotnet restore",test:"dotnet test",build:"dotnet build -c Release",start:"dotnet run"},errorPatterns:{setup:["error CS","CSPROJ.*not found","NuGet.*restore"],"test-failure":["Failed:.*test","FAILED"],dependency:["error NU1101"],runtime:["error CS","Exception"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:5e3}},"elixir-phoenix":{runtime:"elixir",framework:"Phoenix",markers:["mix.exs","phoenix"],commands:{init:"mix setup",test:"mix test",build:"mix compile --all-warnings",start:"mix phx.server"},errorPatterns:{setup:["\\*\\* \\(.*Error\\)","Mix.InstallError"],"test-failure":["\\d+\\sfailed","FAILED"],dependency:["dependencies are not available"],runtime:["\\*\\* \\(","RuntimeError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:4e3},dependencies:["init"]},"ruby-rails":{runtime:"ruby",framework:"Rails",markers:["Gemfile","config/application.rb","bin/rails"],commands:{init:"bundle install && rails db:prepare",test:"rails test",build:"rails assets:precompile",start:"rails server --binding=0.0.0.0 --port=3000"},errorPatterns:{setup:["Bundler::.*Error","Gem::.*Error"],"test-failure":["failures,","error,","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","Exception","NoMethodError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3},dependencies:["init"]},"ruby-sinatra":{runtime:"ruby",framework:"Sinatra",markers:["Gemfile","app.rb","sinatra"],commands:{init:"bundle install",test:"rspec",build:`echo "Sinatra apps don't require build"`,start:"ruby app.rb"},errorPatterns:{setup:["Bundler.*Error","Gem.*Error"],"test-failure":["failure","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","NoMethodError"],timeout:["timeout"],unknown:[]}}},dt={init:{python:["pip install -e .","poetry install","pip install -r requirements.txt"],node:["npm install","pnpm install","yarn install"],go:["go mod download && go mod tidy","go get ./..."],java:["mvn dependency:go-offline","gradle dependencies"],php:["composer install"],rust:["cargo fetch"],dotnet:["dotnet restore"],c:["cmake -S . -B build"],cpp:["cmake -S . -B build"],elixir:["mix deps.get"],ruby:["bundle install"],clojure:["clojure -P"],scala:["sbt update"],kotlin:["./gradlew dependencies","gradle dependencies"],deno:[],bun:["bun install"],"jvm-generic":["mvn dependency:go-offline","gradle dependencies"],unknown:[]},test:{python:["pytest","python -m unittest","python -m pytest"],node:["npm test","npm run test"],go:["go test ./...","make test"],java:["mvn test","gradle test"],php:["php artisan test","phpunit","pest"],rust:["cargo test"],dotnet:["dotnet test"],c:["ctest --test-dir build --output-on-failure"],cpp:["ctest --test-dir build --output-on-failure"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],clojure:["clojure -X:test"],scala:["sbt test"],kotlin:["./gradlew test","gradle test"],deno:["deno task test","deno test"],bun:["bun test","bun run test"],"jvm-generic":["mvn test","gradle test"],unknown:[]},build:{python:["python -m build","python setup.py build"],node:["npm run build"],go:["go build -o app .","go build ./..."],java:["mvn package -DskipTests","gradle build -x test"],php:['echo "PHP build: typically no build step"'],rust:["cargo build --release"],dotnet:["dotnet build -c Release"],c:["cmake --build build"],cpp:["cmake --build build"],elixir:["mix compile"],ruby:["gem build *.gemspec"],clojure:[],scala:["sbt compile"],kotlin:["./gradlew build","gradle build"],deno:["deno task build"],bun:["bun run build"],"jvm-generic":["mvn package -DskipTests","gradle build"],unknown:[]},start:{python:["python app.py","python main.py","uvicorn main:app --reload"],node:["npm start","node index.js","node src/index.js"],go:["./app","go run main.go","go run ./..."],java:["mvn spring-boot:run","gradle bootRun","java -jar target/*.jar"],php:["php -S 0.0.0.0:8000","php artisan serve"],rust:["cargo run --release","./target/release/app"],dotnet:["dotnet run"],c:[],cpp:[],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],clojure:["clojure -M:run"],scala:["sbt run"],kotlin:["./gradlew run","gradle run"],deno:["deno task start","deno task dev"],bun:["bun run start","bun run dev"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function oe(e,r){if(r){let t=r.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=f$1(r),s=`${e}-${n==="gofiber"?"fiber":n==="gogin"?"gin":n==="dotnet"?"aspnetcore":n!=="unknown"?n:t==="fiber"?"fiber":t==="aspnetcore"||t==="asp-net-core"?"aspnetcore":t}`;return ct[s]}}function Be(e,r,t){if(r){let n=oe(e,r);if(n&&n.commands[t])return n.commands[t]}if(["init","test","build","start"].includes(t)){let n=dt[t]?.[e]??[];return n.length>0?n[0]:void 0}}var lt={test:"test",build:"build",start:"start"};function fe(e){if(e.stage==="init")return e.runtime==="node"?c$1(e.projectPath):Be(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let r=lt[e.stage];if(r){let t=u$1(e.projectPath,r,{framework:e.framework});if(t)return b$1(e.projectPath,t.scriptName)}}return Be(e.runtime,e.framework,e.stage)}function pt(e){let r=k(e).map(t=>t==="python"?"python":t==="node"||t==="bun"?"node":t==="go"?"go":t==="java"?"java":t==="php"?"php":t==="rust"?"rust":t==="dotnet"?"dotnet":t==="elixir"?"elixir":t==="ruby"?"ruby":t==="clojure"||t==="scala"||t==="kotlin"?"jvm-generic":null).filter(t=>t!==null).filter((t,n,o)=>o.indexOf(t)===n);return {primary:r.length>0?r[0]:"unknown",secondary:r.slice(1)}}function ze(e){return pt(e).primary}function ge(e,r){if(!e)return "unknown";r||(r={setup:["ModuleNotFoundError","No module named","npm ERR!","error:","not found"],"test-failure":["FAILED","FAIL","failed"],dependency:["cannot find module","import.*error"],runtime:["Exception","Error:","panic","TypeError"],timeout:["timeout","Timeout","deadline exceeded"],unknown:[]});for(let[t,n]of Object.entries(r))for(let o of n)if(new RegExp(o,"i").test(e))return t;return "unknown"}async function se(e,r){let t=e.split(/[&|;]\s*/)[0].trim().split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(t))return {valid:true};if(t.includes("/")||t.includes("\\")){let o=w.isAbsolute(t)?t:w.resolve(r??process.cwd(),t);try{return await J.promises.access(o,process.platform==="win32"?J.constants.F_OK:J.constants.X_OK),{valid:true}}catch{return {valid:false,reason:`Command '${t}' not found or not executable in '${r??process.cwd()}'`}}}try{let o=process.platform==="win32"?"where":"which";if((await execa(o,[t],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${t}' not found or not executable`}}function Ve(e,r,t){if(!r)return e;let n=typeof r=="object"&&!Array.isArray(r)&&("dev"in r||"staging"in r||"prod"in r||"default"in r)&&!Object.keys(r).some(o=>["init","test","build","start"].includes(o))?r:{};return t&&typeof n[t]=="string"?n[t]:typeof n.default=="string"?n.default:e}async function Je(e,r){if(!e)return {healthy:true};switch(e.type){case "port":{let t=e.value;try{let n=await import('net');return new Promise(o=>{let s=new n.Socket,u=5e3;s.setTimeout(u),s.on("connect",()=>{s.destroy(),o({healthy:true,reason:`Port ${t} is listening`});}),s.on("timeout",()=>{s.destroy(),o({healthy:false,reason:`Port ${t} timeout after ${u}ms`});}),s.on("error",c=>{s.destroy(),o({healthy:false,reason:`Port ${t} error: ${String(c)}`});}),s.connect(t,"localhost");})}catch(n){return {healthy:false,reason:`Port check error: ${n instanceof Error?n.message:String(n)}`}}}case "http":{let t=e.value,n;try{let o=new AbortController;n=setTimeout(()=>o.abort(),5e3);let s=await fetch(t,{method:"GET",signal:o.signal});return {healthy:s.status===200,reason:`HTTP ${s.status}`,metadata:{status:s.status}}}catch(o){return {healthy:false,reason:`HTTP check error: ${o instanceof Error?o.message:String(o)}`}}finally{n&&clearTimeout(n);}}case "log":{let t=e.value;if(!r)return {healthy:true};try{let n=[w.join(r,".workspai","last-run.log"),w.join(r,".rapidkit","last-run.log")].find(o=>J.existsSync(o));if(n){let o=J.readFileSync(n,"utf-8"),s=new RegExp(t,"i");return {healthy:s.test(o),reason:s.test(o)?"Log pattern found":"Log pattern not found"}}return {healthy:true,reason:"No log file to check"}}catch(n){return {healthy:false,reason:`Log check error: ${n instanceof Error?n.message:String(n)}`}}}case "command":{let t=e.value;try{let n=await execa(t,[],{cwd:r,reject:false,shell:true});return {healthy:n.exitCode===0,reason:n.exitCode===0?"Health check passed":"Health check failed",metadata:{exitCode:n.exitCode}}}catch(n){return {healthy:false,reason:`Command check error: ${n instanceof Error?n.message:String(n)}`}}}default:return {healthy:true}}}var qe={init:"init",test:"test",build:"build",start:"start"};function mt(e){return e in qe?qe[e]:null}function ft(e,r){let n=q$1(e)?.contextJson?.commands;if(!n||typeof n!="object"||Array.isArray(n))return;let o=n[r];if(typeof o=="string"&&o.trim().length>0)return o.trim();if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,u=s.default??s.dev;if(typeof u=="string"&&u.trim().length>0)return u.trim()}}function Ye(e,r,t=z$1(e)){let n=mt(r);if(!n)return ft(e,r)?{supported:true}:{supported:false,reason:`Workspace stage "${r}" is not part of the Workspai fleet contract.`};if(!t.projectRoot)return {supported:false,reason:"No Workspai project metadata was detected for this target."};let o=t.commandMap[n];if(!o||o.status!=="supported"){let s=t.runtimeSupportTier==="observed"||t.frameworkSupportTier==="observed";return {supported:false,reason:o?.reason??`Command "${n}" is not supported for this project runtime/framework.`,shouldFail:!s}}return {supported:true}}var gt=new Set(["init","test","build","start"]),yt=new Set([".git","node_modules",".workspai",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function z(e){try{return await J.promises.access(e,J.constants.F_OK),true}catch{return false}}async function ht(e){for(let r of e)if(await z(r))return true;return false}async function kt(e,r,t){if(r==="python"){let o=[w.join(e,".workspai","cli.py"),w.join(e,".rapidkit","cli.py")];for(let s of o)if(await z(s))return {valid:true};return {valid:false,reason:"Project-local .workspai/cli.py is missing. Run `workspai init` in this project first."}}let n=t.trim().split(/\s+/)[0];if(n&&["npm","npx","pnpm","yarn"].includes(n)){let o=e$1(n);if((await execa(o.command,[...o.prefixArgs,"--version"],{reject:false,env:g$1()})).exitCode===0)return {valid:true}}return se(t,e)}async function ae(e){let r=await J.promises.readFile(e,"utf-8");return JSON.parse(r)}function I(e){return e.replace(/\\/g,"/")}function bt(e){let r=e?.trim();return r?r.startsWith("project:")?r.slice(8).trim()||null:r:null}async function wt(e){let r=w.join(e,p.model);if(await z(r))try{let n=((await ae(r)).projects??[]).map(o=>typeof o.path=="string"?w.resolve(e,o.path):null).filter(o=>!!o).filter((o,s,u)=>u.indexOf(o)===s).filter(o=>J.existsSync(o));if(n.length>0)return n.sort()}catch{}return a$1(e,{skipDirs:yt,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t,n)=>await ht([...u(t,"context.json"),...u(t,"project.json")])?true:w.resolve(t)===w.resolve(n)?false:k(t).length>0})}async function rt(e){for(let r of [w.join(".workspai","project.json"),w.join(".workspai","context.json"),w.join(".rapidkit","project.json"),w.join(".rapidkit","context.json")]){let t=w.join(e,r);if(await z(t))try{let n=await ae(t),o=n.name??n.projectName??n.slug;if(typeof o=="string"&&o.trim())return o.trim()}catch{}}return null}async function xt(e,r,t){let n=bt(t);if(!n)return {projects:r,normalizedScope:null};let o=I(n).toLowerCase(),s=[];for(let u of r){let c=I(w.relative(e,u)),m=w.basename(u),f=await rt(u);[c,m,f].filter(i=>typeof i=="string"&&i.length>0).map(i=>I(i).toLowerCase()).includes(o)&&s.push(u);}if(s.length===0)throw new Error(`Workspace run scope did not match any project: ${t}`);return {projects:s,normalizedScope:n}}async function vt(e,r,t){let n=await execa("git",["diff","--name-only",`${t}...HEAD`],{cwd:e,reject:false,env:a$2()});if(n.exitCode!==0)return new Set(r);let o=n.stdout.split(/\r?\n/).map(u=>u.trim()).filter(u=>u.length>0).map(u=>I(u));if(o.length===0)return new Set;let s=new Set;for(let u of r){let c=I(w.relative(e,u));if(!c||c===".")continue;let m=`${c}/`;o.some(f=>f===c||f.startsWith(m))&&s.add(u);}return s}async function Rt(e,r,t$1){let n=await f(e,t.workspaceContract)??q(e,"workspace.contract.json");if(await z(n))try{let d=await St(e,r,t$1,n);if(d.graphStatus!=="missing")return d}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let o=await f(e,".workspai/workspace-dependency-graph.json")??q(e,"workspace-dependency-graph.json");if(!await z(o))return {expanded:t$1,graphStatus:"missing",expansionDepth:0};let s;try{s=await ae(o);}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let u=new Set(r.map(d=>w.resolve(d))),c=new Map;if(!s||typeof s!="object"||Array.isArray(s))return {expanded:t$1,graphStatus:"invalid",expansionDepth:0};let m=Array.isArray(s.projects)?s.projects:[];for(let d of m){if(!d||typeof d!="object"||Array.isArray(d))continue;let i=d,l=typeof i.path=="string"?i.path:"",h=w.resolve(e,l);if(!u.has(h))continue;let k=Array.isArray(i.dependsOn)?i.dependsOn.filter(S=>typeof S=="string"):[];for(let S of k){let g=w.resolve(e,S);u.has(g)&&(c.has(g)||c.set(g,new Set),c.get(g)?.add(h));}}let f$1=d$2(c,t$1);return {expanded:f$1.reached,graphStatus:"loaded",expansionDepth:f$1.added}}async function St(e,r,t,n){let o=await ae(n);if(!o||typeof o!="object"||Array.isArray(o))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let s=o,u=Array.isArray(s.projects)?s.projects:null;if(!u)return {expanded:t,graphStatus:"invalid",expansionDepth:0};let c=new Map,m=new Map;for(let h of r){let k=I(w.relative(e,h));m.set(k,w.resolve(h));}let f=new Map,d=new Map,i=new Map;for(let h of u){if(!h||typeof h!="object"||Array.isArray(h))continue;let k=h,S=typeof k.slug=="string"?k.slug:"",g=typeof k.relativePath=="string"?I(k.relativePath):S,y=m.get(g);!S||!y||c.set(S,y);}for(let h of u){if(!h||typeof h!="object"||Array.isArray(h))continue;let k=h,S=typeof k.slug=="string"?k.slug:"",g=c.get(S);if(!g)continue;let y=k.contracts&&typeof k.contracts=="object"&&!Array.isArray(k.contracts)?k.contracts:{},P=Array.isArray(y.dependsOn)?y.dependsOn.filter(R=>typeof R=="string"):[],$=Array.isArray(y.publishes)?y.publishes.filter(R=>typeof R=="string"):[],L=Array.isArray(y.consumes)?y.consumes.filter(R=>typeof R=="string"):[];for(let R of P){let E=c.get(R);E&&(i.has(E)||i.set(E,new Set),i.get(E)?.add(g));}for(let R of $)f.has(R)||f.set(R,new Set),f.get(R)?.add(g);for(let R of L)d.has(R)||d.set(R,new Set),d.get(R)?.add(g);}for(let[h,k]of f.entries()){let S=d.get(h);if(S)for(let g of k){i.has(g)||i.set(g,new Set);for(let y of S)y!==g&&i.get(g)?.add(y);}}let l=d$2(i,t);return {expanded:l.reached,graphStatus:"loaded",expansionDepth:l.added}}async function Ct(e,r){if(typeof r=="boolean")return r;let t=t$1(e,"policies.yml").find(s=>J.existsSync(s))??q(e,"policies.yml");if(!await z(t))return true;let n="";try{n=await J.promises.readFile(t,"utf-8");}catch{return true}let o=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return o?o[1]==="true":true}function Et(e){let r=process.env.RAPIDKIT_WORKSPACE_RUN_STAGE_TIMEOUT_MS;if(r){let t=Number.parseInt(r,10);if(Number.isFinite(t)&&t>0)return t}return e==="init"?12e4:9e4}function jt(e){let r=e.trim();if(!/^\.\.?[\\/]/.test(r)||/[&|;<>()$`"']/.test(r))return null;let[t,...n]=r.split(/\s+/);return t?{file:t,args:n}:null}function Xe(e,r){let t=Number.parseInt(process.env[e]??"",10);return Number.isFinite(t)&&t>0?t:r}function ye(e){return new Promise(r=>setTimeout(r,e))}async function Pt(e){let r=process.argv[1];if(e.useRapidkitWrapper&&!r)return {exitCode:1,stdout:"",stderr:"Workspai entrypoint is unavailable for startup verification.",healthStatus:{healthy:false,reason:"Workspai entrypoint is unavailable."}};let t=e.useRapidkitWrapper&&r?execa(process.execPath,[r,"start"],{cwd:e.projectPath,reject:false,timeout:e.timeoutMs,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}}):execa(e.finalCommand,[],{cwd:e.projectPath,reject:false,shell:true,timeout:e.timeoutMs}),n=Promise.resolve(t).then(d=>({kind:"exit",result:d}),d=>({kind:"error",error:d})),o=Xe("WORKSPAI_WORKSPACE_RUN_STARTUP_GRACE_MS",2e3),s=await Promise.race([n,ye(o).then(()=>({kind:"alive"}))]);if(s.kind==="error"){let d=typeof s.error=="object"&&s.error!==null&&"timedOut"in s.error&&!!s.error.timedOut;return {exitCode:d?124:1,stdout:"",stderr:s.error instanceof Error?s.error.message:String(s.error),timedOut:d,healthStatus:{healthy:false,reason:"The start command failed before readiness."}}}if(s.kind==="exit"){let d=Number(s.result.exitCode??0);return {exitCode:d,stdout:String(s.result.stdout??""),stderr:String(s.result.stderr??""),healthStatus:{healthy:d===0,reason:d===0?"The start command completed successfully.":`The start command exited with code ${d} before readiness.`}}}let u=oe(e.runtime,e.framework)?.healthCheck,c=u?{healthy:false,reason:"The configured health check has not passed yet."}:{healthy:true,reason:`The service remained alive for ${o}ms (bounded startup smoke).`};if(u){let d=Xe("WORKSPAI_WORKSPACE_RUN_STARTUP_HEALTH_TIMEOUT_MS",15e3),i=Date.now()+d;for(;Date.now()<i;){let l=await Je(u,e.projectPath);if(c={healthy:l.healthy,reason:l.reason},l.healthy)break;if((await Promise.race([n,ye(350).then(()=>({kind:"alive"}))])).kind!=="alive"){c={healthy:false,reason:"The service exited before its configured health check passed."};break}}}try{t.kill?.("SIGTERM",{forceKillAfterDelay:1e3});}catch{try{t.kill?.();}catch{}}let m=await Promise.race([n,ye(2e3).then(()=>({kind:"alive"}))]),f=m.kind==="exit"?m.result:void 0;return {exitCode:c.healthy?0:1,stdout:String(f?.stdout??""),stderr:String(f?.stderr??""),healthStatus:c}}async function he(e,r,t){let n=process.argv[1];if(!n)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};try{let o=await execa(process.execPath,[n,...e],{cwd:r,reject:false,timeout:t,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});return {exitCode:Number(o.exitCode??1),stdout:o.stdout,stderr:o.stderr}}catch(o){return {exitCode:typeof o=="object"&&o!==null&&"timedOut"in o&&!!o.timedOut?124:1,stdout:typeof o=="object"&&o!==null&&"stdout"in o?String(o.stdout??""):"",stderr:typeof o=="object"&&o!==null&&"stderr"in o?String(o.stderr??""):o instanceof Error?o.message:String(o)}}}function At(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"||e==="rust"||e==="php"}function Ft(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}function Ot(e,r=8){if(e.length<=r)return e.join(`
2
- `);let t=3;return [...e.slice(0,t),...e.slice(-(r-t))].join(`
3
- `)}function Dt(e){let r=/(?:\bnot found\b|\bno such\b|\bmissing\b|\bfailed\b|\berror\b|\bexception\b|\bcannot\b|\bdenied\b|\btimeout\b|\btimed out\b|\benoent\b|\beacces\b|\beperm\b)/i;return [...e].reverse().find(t=>r.test(t))??e.at(-1)}async function Tt(e){let r=process.cwd();try{process.chdir(e);let{handleInitCommand:t}=await import('./index.js');return {exitCode:await t(["init"]),stdout:"",stderr:""}}finally{process.chdir(r);}}async function Qe(e){let r=i=>{let l=g(i);return l==="node"||l==="bun"?"node":l==="python"?"python":l==="go"?"go":l==="java"?"java":l==="php"?"php":l==="ruby"?"ruby":l==="rust"?"rust":l==="dotnet"?"dotnet":l==="elixir"?"elixir":l==="clojure"||l==="scala"||l==="kotlin"?"jvm-generic":ze(e)},t=i=>{if(!i)return;let l=f$1(i);if(new Set(["fastapi","django","flask","nestjs","express","fastify","koa","gofiber","gogin","echo","springboot","laravel","symfony","rails","sinatra","dotnet","actix","axum","rocket","phoenix"]).has(l))return l},n=q$1(e),o=n?.detection??m(e,n?.projectJson??null),s=n?.contextJson,u=r(o.runtime),c=t(o.key),m$1={},f=new Set(["init","test","build","start"]);if(s?.commands&&typeof s.commands=="object")for(let[i,l]of Object.entries(s.commands))typeof l=="string"&&f.has(i)&&(m$1[i]=l);let d;if(s?.commandEnvironments&&typeof s.commandEnvironments=="object"){let i=s.commandEnvironments;d={dev:typeof i.dev=="string"?i.dev:void 0,staging:typeof i.staging=="string"?i.staging:void 0,prod:typeof i.prod=="string"?i.prod:void 0,default:typeof i.default=="string"?i.default:void 0};}return {runtime:u,framework:c,commandOverrides:Object.keys(m$1).length>0?m$1:void 0,environmentCommandVariants:d,environment:typeof s?.environment=="string"?s.environment:void 0}}async function Ze(e,r,t,n,o,s,u){let c=!o?.[r]&&At(t),m;if(o&&o[r]?m=o[r]:c?m=`rapidkit ${r}`:m=fe({projectPath:e,runtime:t,framework:n,stage:r}),!m)return {exitCode:127,command:`<stage not supported for ${t}>`,message:`No stage command found for runtime '${t}' and framework '${n||"unknown"}'`,errorCategory:"runtime"};let f=Ve(m,s,u);if(!f)return {exitCode:127,command:m,message:"Failed to resolve stage command",errorCategory:"runtime"};let d=fe({projectPath:e,runtime:t,framework:n,stage:r});if(c){if(d){let v=c?await kt(e,t,d):await se(d,e);if(!v.valid)return {exitCode:127,command:f,message:v.reason||"Command not available",errorCategory:"setup"}}}else {let v=await se(f,e);if(!v.valid)return {exitCode:127,command:f,message:v.reason||"Command not available",errorCategory:"setup"}}let i=0,l="",h="",k,S,g=Et(r),y=Date.now();try{let v=r==="start"?await Pt({projectPath:e,finalCommand:f,useRapidkitWrapper:c,runtime:t,framework:n,timeoutMs:g}):c?r==="init"&&Ft()?await Tt(e):await he([r],e,g):await(async()=>{let A=jt(f);return A?execa(A.file,A.args,{cwd:e,reject:false,timeout:g,forceKillAfterDelay:1e3}):execa(f,[],{cwd:e,reject:false,shell:true,timeout:g,forceKillAfterDelay:1e3})})();if(i=Number(v.exitCode??0),l=v.stdout,h=v.stderr,S=r==="start"?v.healthStatus:void 0,i!==0){let A=`${l}
4
- ${h}`,G=Date.now()-y;k=i===124||ge(A)==="timeout"||i===143&&G>=Math.floor(g*.8)?"timeout":ge(A);}}catch(v){let A=typeof v=="object"&&v!==null&&"timedOut"in v&&!!v.timedOut;return {exitCode:A?124:1,command:f,message:A?`Stage timed out after ${g}ms`:v instanceof Error?v.message:"Command execution failed",errorCategory:A?"timeout":"runtime"}}let P=`${l}
5
- ${h}`.split(/\r?\n/).map(v=>v.trim()).filter(Boolean),$=Ot(P),L=Dt(P),R=Date.now()-y,E=i===124||k==="timeout"||i===143&&R>=Math.floor(g*.8),O=i===0?void 0:E?"timeout":k,M=i===0||!O?void 0:{category:O,exitCode:i,command:f,timedOut:E,timeoutMs:g,...$?{outputExcerpt:$}:{}};return {exitCode:i,command:f,errorCategory:O,healthStatus:S,failureDiagnostic:M,message:E?`Stage timed out after ${g}ms`:i!==0?L?`Stage failed with exit code ${i}: ${L}`:`Stage failed with exit code ${i}`:void 0}}function et(e){try{return JSON.parse(e)}catch{return null}}function Wt(e){switch(e){case "dotnet":return "Install .NET 8+ SDK, then rerun `npx workspai setup dotnet` or `npx workspai init`.";case "go":return "Install Go 1.21+, then rerun `npx workspai setup go` or `npx workspai init`.";case "java":case "jvm-generic":return "Install Java 21+ and Maven/Gradle, then rerun `npx workspai setup java` or `npx workspai init`.";case "node":return "Install Node.js LTS and npm/pnpm/yarn, then rerun `npx workspai setup node` or `npx workspai init`.";case "python":return "Install Python 3.10+ and pip/Poetry, then rerun `npx workspai setup python` or `npx workspai init`.";default:return null}}async function It(e){let r=[],t=await he(["doctor","workspace","--json"],e);if(t.exitCode!==0)r.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let s=et(t.stdout)?.healthScore,u=Number(s?.errors??0);Number.isFinite(u)&&u>0?r.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${u} error(s)`}):r.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let n=await he(["readiness","--json"],e);if(n.exitCode!==0)r.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let o=et(n.stdout),s=String(o?.overallStatus??"").toLowerCase();s==="fail"?r.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):s==="warn"?r.push({gate:"readiness",status:"warn",summary:"readiness overall status is warn"}):r.push({gate:"readiness",status:"pass",summary:"readiness overall status is pass"});}return r}var $t=new Set(["dev","stop"]);function Mt(e){let r=e.trim();return !r||$t.has(r.toLowerCase())?false:gt.has(r)?true:/^[a-z][a-z0-9_-]*$/i.test(r)}function tt(e,r,t){let n=I(w.relative(t,r));return (Array.isArray(e.projects)?e.projects:[]).some(s=>{if(!s||typeof s!="object")return false;let u=s,c=[u.relativePath,u.path].filter(m=>typeof m=="string"&&m.length>0).map(m=>I(m));return u.status==="passed"&&(c.includes(n)||c.some(m=>m.endsWith(`/${n}`)))})}function Nt(e,r){return oe(e,r)?.dependencies??[]}function _t(e,r){let t=Math.max(1,Math.min(4,r)),n=Number(e??t);return Number.isFinite(n)?Math.max(1,Math.min(16,Math.trunc(n))):t}async function br(e$1){if(!Mt(e$1.stage))throw new Error(`Unsupported workspace run stage: ${e$1.stage}`);let r=Date.now(),t=w.resolve(e$1.workspacePath);c({blockId:"workspace.run.resolve",status:"running",message:"Resolving workspace project fleet",component:"workspace-run"});let n=await d(t),o=await wt(t),{projects:s,normalizedScope:u}=await xt(t,o,e$1.scope),c$1=e$1.affected===true,m=e$1.blastRadius===true,f=e$1.since?.trim()||"HEAD~1",d$2=c$1?await vt(t,s,f):new Set(s),i,l="not-applicable",h=0,k="all";if(c$1&&m){let p=await Rt(t,o,d$2);i=p.expanded,l=p.graphStatus,h=p.expansionDepth,k="affected+blast-radius";}else c$1?(i=d$2,k="affected"):(i=d$2,k="all");c({blockId:"workspace.run.resolve",status:"succeeded",message:`Resolved ${s.length} project(s)`,component:"workspace-run",attributes:{projects:s.length,selectionMode:k}}),c({blockId:"workspace.run.gates",status:"running",message:"Evaluating workspace run gates",component:"workspace-run"});let S=e$1.stage==="init"||e$1.planOnly===true?false:await Ct(t,e$1.enforceGates),g=S?await It(t):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],y=g.find(p=>p.status==="fail");c({blockId:"workspace.run.gates",status:y?"blocked":"succeeded",message:y?`Blocked by ${y.gate}`:"Workspace run gates passed",component:"workspace-run",attributes:{gates:g}});let P=s.filter(p=>i.has(p)),$=e$1.continueOnError===true||e$1.stage==="init",L=e$1.parallel===true,R=_t(e$1.maxWorkers,P.length),E=P.length,O=0;c({blockId:"workspace.run.execute",status:y?"blocked":"running",message:y?`Execution blocked by ${y.gate}`:`Executing ${e$1.stage} across ${E} project(s)`,component:"workspace-run",progress:{completed:0,total:E},attributes:{stage:e$1.stage,parallel:L,maxWorkers:R}}),e$1.json||console.log(T.gray(`Workspace run (${e$1.stage}) started: ${E} target(s), ${L?`parallel x${R}`:"sequential"}`));let M=new Map;for(let p of o){let b=I(w.relative(t,p)),a=await rt(p),N=s.includes(p),j=N&&i.has(p);M.set(p,{path:p,relativePath:b,projectName:a??(w.basename(b)||w.basename(p)),selected:j,affected:j,status:"skipped",exitCode:null,durationMs:0,reason:j?void 0:N?"not affected":"outside scope",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});}if(y)for(let p of P){let b=M.get(p);b&&(b.status="skipped",b.reason=`blocked by ${y.gate}`);}else {let p=async b=>{let a$1=M.get(b);if(!a$1)return;let N=I(w.relative(t,b));e$1.json||console.log(T.gray(`\u23F3 [${O}/${E}] ${e$1.stage} ${N}`)),a$1.selected=true,a$1.affected=true;let j=Date.now(),W=a(b),D=e$1.runtime?.trim().toLowerCase(),B=W.units.filter(x=>!D||x.runtime===D).map(x=>({unit:x,stage:x.stages.find(F=>F.stage===e$1.stage)})).filter(x=>!!x.stage),Y=B.map(({unit:x,stage:F})=>({unitId:x.id,runtime:x.runtime,role:x.role,root:x.root,manifest:x.manifest,stage:F.stage,command:F.command,status:"planned",exitCode:null,durationMs:0}));if(a$1.runtimeExecutions=Y,e$1.planOnly){a$1.runtimeDetected=B[0]?.unit.runtime,a$1.status="skipped",a$1.reason=B.length>0?`plan only: ${B.length} runtime unit(s)`:D?`no ${D} runtime unit supports stage "${e$1.stage}"`:`no runtime unit supports stage "${e$1.stage}"`,a$1.durationMs=Date.now()-j,O+=1;return}if(W.polyglot||D){if(B.length===0){a$1.status="failed",a$1.reason=D?`No ${D} runtime unit supports stage "${e$1.stage}"`:`No runtime unit supports stage "${e$1.stage}"`,a$1.errorCategory="setup",a$1.errorMessage=a$1.reason,a$1.exitCode=127,a$1.durationMs=Date.now()-j,O+=1;return}let x;for(let C=0;C<B.length;C+=1){let{unit:xe,stage:ve}=B[C],V=Y[C],Re=w.resolve(b,xe.root),ut=Date.now(),de=await Qe(Re),U=await Ze(Re,e$1.stage,xe.runtime,de.framework,{[e$1.stage]:ve.command},de.environmentCommandVariants,de.environment);if(V.durationMs=Date.now()-ut,V.exitCode=U.exitCode,V.status=U.exitCode===0?"passed":"failed",V.reason=U.message,V.errorCategory=U.errorCategory,V.failureDiagnostic=U.failureDiagnostic,U.exitCode!==0&&!x&&(x=U.message??ve.command),U.exitCode!==0&&!$){for(let Se of Y.slice(C+1))Se.status="skipped",Se.reason="stopped after runtime-unit failure";break}}let F=Y.find(C=>C.status==="failed");a$1.runtimeDetected=B[0]?.unit.runtime,a$1.executionCommand=Y.filter(C=>C.status!=="skipped").map(C=>`[${C.runtime}:${C.root}] ${C.command}`).join(" && "),a$1.durationMs=Date.now()-j,a$1.exitCode=F?.exitCode??0,a$1.status=F?"failed":"passed",a$1.reason=F?x??"runtime-unit stage failed":void 0,a$1.errorCategory=F?F.errorCategory??"runtime":void 0,a$1.errorMessage=a$1.reason,a$1.failureDiagnostic=F?.failureDiagnostic,O+=1;return}let{runtime:ie,framework:ue,commandOverrides:st,environmentCommandVariants:at,environment:it}=await Qe(b);a$1.runtimeDetected=ie,a$1.framework=ue;let ce=Ye(b,e$1.stage);if(!ce.supported){a$1.status=ce.shouldFail===false?"skipped":"failed",a$1.reason=ce.reason??`stage "${e$1.stage}" unsupported for project`,a$1.durationMs=Date.now()-j,a$1.exitCode=a$1.status==="failed"?127:null,a$1.status==="failed"&&(a$1.errorCategory="setup",a$1.errorMessage=a$1.reason),O+=1;return}if(e$1.reusePassed&&n){let x=n.stages[e$1.stage]??n.stages[e$1.stage];if(x&&tt(x,b,t)){a$1.status="passed",a$1.reason="reused passed result from workspace-run-last.json",a$1.durationMs=Date.now()-j,a$1.exitCode=0,O+=1,e$1.json||console.log(T.gray(`\u21BA reused passed cache for ${N}`));return}}let we=Nt(ie,ue).filter(x=>x!==e$1.stage);if(we.length>0&&n){let x=we.find(F=>{let C=n.stages[F];return !C||!tt(C,b,t)});if(x){a$1.status="skipped",a$1.reason=`dependency stage "${x}" not satisfied in workspace-run-last.json`,a$1.durationMs=Date.now()-j,a$1.exitCode=null,O+=1;return}}let K=await Ze(b,e$1.stage,ie,ue,st,at,it);if(a$1.executionCommand=K.command,a$1.errorCategory=K.errorCategory,a$1.healthStatus=K.healthStatus,a$1.failureDiagnostic=K.failureDiagnostic,a$1.durationMs=Date.now()-j,a$1.exitCode=K.exitCode,K.exitCode===0?(a$1.status="passed",a$1.reason=void 0):(a$1.status="failed",a$1.reason=K.message||"stage command failed",a$1.errorMessage=K.message),O+=1,!e$1.json){let x=E>0?Math.round(O/E*100):100,F=a$1.status==="passed"?T.green("\u2705"):T.red("\u274C");if(console.log(T.gray(`${F} [${O}/${E}] (${x}%) ${N} ${a$1.durationMs}ms`)),a$1.status==="failed"){a$1.reason&&console.log(T.red(` Reason: ${a$1.reason}`)),a$1.executionCommand&&console.log(T.gray(` Command: ${a$1.executionCommand}`));let C=Wt(a$1.runtimeDetected);C&&a$1.errorCategory==="setup"&&console.log(T.gray(` Hint: ${C}`));}}};if(L&&P.length>1){let b=0,a=false,N=new Array(R).fill(null).map(async()=>{for(;b<P.length;){if(a&&!$)return;let j=b;b+=1;let W=P[j];await p(W),M.get(W)?.status==="failed"&&(a=true);}});if(await Promise.all(N),!$&&a){let j=false;for(let W of P){let D=M.get(W);if(D){if(D.status==="failed"){j=true;continue}j&&D.status==="skipped"&&(D.reason=D.reason||"stopped after failure");}}}}else for(let b of P){await p(b);let a=M.get(b);if(!$&&a?.status==="failed"){let N=P.slice(P.indexOf(b)+1);for(let j of N){let W=M.get(j);W&&(W.status="skipped",W.reason="stopped after failure");}break}}}let v=[];for(let p of o){let b=M.get(p);b&&v.push(b);}let A=v.filter(p=>p.status==="passed").length,G=v.filter(p=>p.status==="failed").length,q=v.filter(p=>p.status==="skipped").length;c({blockId:"workspace.run.execute",status:G>0?"failed":y?"blocked":"succeeded",message:`Workspace run finished: ${A} passed, ${G} failed, ${q} skipped`,component:"workspace-run",progress:{completed:E,total:E,percent:100},attributes:{passed:A,failed:G,skipped:q,stage:e$1.stage}});let ke=e$1.strict===true,nt=G>0||ke&&g.some(p=>p.status==="fail"||p.status==="warn")?1:0,be={schemaVersion:"1.0",workspacePath:t,stage:e$1.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-r,options:{affected:c$1,blastRadius:m,since:c$1?f:null,parallel:L,maxWorkers:R,continueOnError:$,strict:ke,enforceGates:S,scope:u,reusePassed:e$1.reusePassed===true,planOnly:e$1.planOnly===true,runtime:e$1.runtime?.trim()||null},selection:{mode:k,since:c$1?f:null,scope:u,graphStatus:l,expansionDepth:h},gates:{enforced:S,results:g,blocked:!!y,blockingGate:y?.gate},summary:{projectCount:o.length,selectedCount:P.length,passed:A,failed:G,skipped:q,exitCode:nt},projects:v,enterpriseControls:{jsonReady:true,evidencePath:b}},ot=w.join(t,b);c({blockId:"workspace.run.publish",status:"running",message:"Publishing workspace run evidence",component:"workspace.run"});try{await e(t,be),c({blockId:"workspace.run.publish",status:"succeeded",message:"Workspace run evidence published",component:"workspace.run"}),d$1({workspacePath:t,relativePath:b,blockId:"workspace.run.publish"});}catch(p){throw c({blockId:"workspace.run.publish",status:"failed",message:p instanceof Error?p.message:"Workspace run evidence publish failed",component:"workspace.run"}),p}return e$1.json||(y&&(console.log(T.red(`\u274C Workspace run blocked by ${y.gate}`)),console.log(T.gray(` ${y.summary}`))),console.log(T.cyan(`Workspace run (${e$1.stage}) => passed: ${A}, failed: ${G}, skipped: ${q}`)),console.log(T.gray(`Report: ${ot}`))),be}export{br as a};
@@ -1,2 +0,0 @@
1
- import {b}from'./chunk-K33JJVQZ.js';import {t}from'./chunk-ODK4LCEL.js';import {d}from'./chunk-25AWHAB5.js';import {w,x as x$1}from'./chunk-VQZ5PI5J.js';import l from'path';import {randomUUID}from'crypto';import {open,link,copyFile}from'fs/promises';import s from'fs-extra';function N(r,t){let o=l.resolve(r),e=t.trim();if(!e||l.isAbsolute(e))throw new Error(`Workspace artifact path must be non-empty and relative: ${t}`);let c=l.resolve(o,e),n=l.relative(o,c);if(n===".."||n.startsWith(`..${l.sep}`)||l.isAbsolute(n))throw new Error(`Workspace artifact path escapes workspace root: ${t}`);return c}function m(r,t){return N(r,w(t))}async function R(r,t,o="file"){let e=l.resolve(r),c=m(e,t);if(!await s.pathExists(e)||!await s.pathExists(c))return null;let[n,f,a]=await Promise.all([s.realpath(e),s.realpath(c),s.stat(c)]),u=l.relative(n,f);if(u===".."||u.startsWith(`..${l.sep}`)||l.isAbsolute(u))throw new Error(`Workspace artifact resolves outside workspace root: ${t}`);if(!(o==="file"?a.isFile():a.isDirectory()))throw new Error(`Workspace artifact is not a regular ${o}: ${t}`);return f}async function rt(r,t$1){let o=t$1.trim().replace(/\\/g,"/").replace(/^\.\//,"");if(!o||l.isAbsolute(o))return null;let e=await R(r,o);if(e)return e;let c=t.workspaceContract;for(let n of [c,x$1(c)]){let f=await R(r,n);if(!f)continue;let a=[];try{a=(await s.readJson(f)).projects??[];}catch{return null}let u=a.filter(i=>typeof i.relativePath=="string"&&typeof i.externalPath=="string"&&l.isAbsolute(i.externalPath)).map(i=>({prefix:i.relativePath.replace(/\\/g,"/").replace(/\/$/,""),root:l.resolve(i.externalPath)})).filter(({prefix:i})=>o.startsWith(`${i}/`)).sort((i,p)=>p.prefix.length-i.prefix.length);for(let i of u){let p=o.slice(i.prefix.length+1),w=l.resolve(i.root,p),d=l.relative(i.root,w);if(!d||d===".."||d.startsWith(`..${l.sep}`)||l.isAbsolute(d)||!await s.pathExists(i.root)||!await s.pathExists(w))continue;let[g,h,P]=await Promise.all([s.realpath(i.root),s.realpath(w),s.stat(w)]),A=l.relative(g,h);if(A===".."||A.startsWith(`..${l.sep}`)||l.isAbsolute(A))throw new Error(`External evidence resolves outside its contracted root: ${t$1}`);if(!P.isFile())throw new Error(`External evidence is not a regular file: ${t$1}`);return h}return null}return null}function D(r,t){return N(r,x$1(t))}async function _(r,t){let o=l.resolve(r);await s.ensureDir(o);let e=l.dirname(t);await s.ensureDir(e);let[c,n]=await Promise.all([s.realpath(o),s.realpath(e)]),f=l.relative(c,n);if(f===".."||f.startsWith(`..${l.sep}`)||l.isAbsolute(f))throw new Error(`Workspace artifact parent resolves outside workspace root: ${e}`)}async function C(r,t){let o=l.resolve(r),[e,c]=await Promise.all([s.realpath(o),s.realpath(t)]),n=l.relative(e,c);if(n===".."||n.startsWith(`..${l.sep}`)||l.isAbsolute(n))throw new Error(`Workspace artifact resolves outside workspace root: ${t}`)}function O(r){let t=r?.code;return process.platform==="win32"&&(t==="EPERM"||t==="EINVAL"||t==="ENOSYS")}function F(r,t=process.platform){if(t!=="win32")return false;let o=r?.code;return o==="EPERM"||o==="EACCES"||o==="EBUSY"}async function y(r){let t=process.platform==="win32"?6:1,o;for(let e=0;e<t;e+=1)try{await s.remove(r);return}catch(c){if(o=c,!F(c)||e===t-1)throw c;await new Promise(n=>setTimeout(n,10*2**e));}throw o}var v=new Map;async function j(r,t){let o=v.get(r)??Promise.resolve(),e,c=new Promise(f=>{e=f;}),n=o.catch(()=>{}).then(()=>c);v.set(r,n),await o.catch(()=>{});try{return await t()}finally{e(),v.get(r)===n&&v.delete(r);}}async function J(r){try{await r.sync();}catch(t){if(!O(t))throw t}}async function x(r,t,o){await _(r,t);let e=l.dirname(t),c=`${l.basename(t)}.`,n=Date.now();for(let a of await s.readdir(e)){if(!a.startsWith(c)||!a.endsWith(".tmp"))continue;let u=l.join(e,a),i=await s.stat(u).catch(()=>null);i&&n-i.mtimeMs>3e4&&await s.remove(u).catch(()=>{});}let f=`${t}.${process.pid}.${randomUUID()}.tmp`;try{await o(f);let a=await open(f,"r");try{await J(a);}finally{await a.close();}let u=Number(process.env.WORKSPAI_TEST_ATOMIC_WRITE_DELAY_MS??0);Number.isFinite(u)&&u>0&&await new Promise(i=>setTimeout(i,Math.min(u,3e4)));try{await s.rename(f,t);}catch(i){let p=i.code;if(p!=="EEXIST"&&p!=="EPERM")throw i;await s.move(f,t,{overwrite:true});}}finally{await s.remove(f).catch(()=>{});}}async function K(r,t,o,e={}){let c=m(r,t);await _(r,c);let n=`${c}.lock`;return j(n,()=>U(n,t,o,e))}async function U(r,t,o,e){let c=e.timeoutMs??1e4,n=e.staleAfterMs??3e4,f=Date.now(),a;for(;!a;)try{a=await open(r,"wx"),await a.writeFile(`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
2
- `),await J(a);}catch(u){if(!(u.code==="EEXIST"||F(u)))throw a&&(await a.close().catch(()=>{}),a=void 0,await y(r).catch(()=>{})),u;a&&(await a.close().catch(()=>{}),a=void 0,await y(r).catch(()=>{}));let[w,d]=await Promise.all([s.stat(r).catch(()=>null),s.readJson(r).catch(()=>null)]),g=Number(d?.pid),h=Number.isInteger(g)&&g>0,P=false;if(h)try{process.kill(g,0),P=true;}catch(k){P=k.code==="EPERM";}let A=!h&&!!(w&&Date.now()-w.mtimeMs>n);if(h&&!P||A){await y(r).catch(()=>{});continue}if(Date.now()-f>=c)throw new Error(`Timed out waiting for workspace artifact lock: ${t}`);await new Promise(k=>setTimeout(k,20));}try{return await o()}finally{await a.close().catch(()=>{}),await y(r);}}async function et(r,t){let o=[m(r,t),D(r,t)];for(let e of o)if(await s.pathExists(e))return await C(r,e),e;return null}async function at(r,t,o){b(t,o);let e=m(r,t);return await x(r,e,c=>s.writeJson(c,o,{spaces:2})),d({workspacePath:r,relativePath:t}),e}async function ot(r,t,o){return z(r,t,o.map(e=>({rootPath:r,...e})))}async function z(r,t,o){if(o.length===0)return [];let e=o.map(n=>({...n,rootPath:l.resolve(n.rootPath),path:m(n.rootPath,n.relativePath)})),c=e.find((n,f)=>e.findIndex(a=>a.path===n.path)!==f);if(c)throw new Error(`Duplicate workspace artifact transaction target: ${c.relativePath}`);for(let n of e)b(n.relativePath,n.payload);return K(r,t,async()=>{let n=randomUUID(),f=[];try{for(let a of e){let u=await s.pathExists(a.path),i={path:a.path,rootPath:a.rootPath,exists:u,backupPath:null};if(f.push(i),u){let p=`${a.path}.${process.pid}.${n}.rollback`;await C(a.rootPath,a.path);try{try{await link(a.path,p);}catch{await copyFile(a.path,p);}i.backupPath=p;}catch(w){throw await s.remove(p).catch(()=>{}),w}}}for(let a=0;a<e.length;a+=1){let u=e[a];await x(u.rootPath,u.path,p=>s.writeJson(p,u.payload,{spaces:2}));let i=Number(process.env.WORKSPAI_TEST_FAIL_ARTIFACT_SET_AFTER??0);if(Number.isInteger(i)&&i===a+1)throw new Error(`Injected artifact-set failure after ${i} write(s).`)}for(let a of e)d({workspacePath:a.rootPath,relativePath:a.relativePath});return e.map(a=>a.path)}catch(a){let i=(await Promise.allSettled(f.map(async p=>{if(!p.exists){await s.remove(p.path);return}p.backupPath&&await x(p.rootPath,p.path,w=>copyFile(p.backupPath,w));}))).filter(p=>p.status==="rejected");throw i.length>0?new AggregateError([a,...i.map(p=>p.reason)],"Workspace artifact transaction failed and rollback was incomplete."):a}finally{await Promise.all(f.map(a=>a.backupPath?s.remove(a.backupPath).catch(()=>{}):Promise.resolve()));}})}async function nt(r,t,o){let e=m(r,t);return await x(r,e,c=>s.writeFile(c,o,"utf-8")),d({workspacePath:r,relativePath:t}),e}export{m as a,R as b,rt as c,D as d,K as e,et as f,at as g,ot as h,z as i,nt as j};
@@ -1,2 +0,0 @@
1
- import {l}from'./chunk-BM2F5C4J.js';import {a as a$1}from'./chunk-MBICKDYP.js';import {b}from'./chunk-EBQS5T7Q.js';import {j as j$1}from'./chunk-2LZWBUJD.js';import {b as b$1}from'./chunk-K33JJVQZ.js';import {a}from'./chunk-AFIFZTOY.js';import {c}from'./chunk-EWZZUQBR.js';import {s,t,p}from'./chunk-ODK4LCEL.js';import Ae from'crypto';import H from'fs';import O from'fs/promises';import m from'path';var pe=s.projectAgentEntry.schemaVersion,M=t.projectAgentEntry,Ee="workspai.agent-bootstrap-receipt.v1",We="<!-- WORKSPAI:AGENT-ENTRY:START -->",Fe="<!-- WORKSPAI:AGENT-ENTRY:END -->",q=["generic","codex","claude","gemini","qwen","kimi","grok","copilot","cursor","windsurf","amazon-q"],qe=["CLAUDE.md","GEMINI.md","QWEN.md",".amazonq/rules/workspai-agent-entry.md"];function ve(t){let s=t?.trim().toLowerCase()||"generic";if(s==="orca")return "grok";if(q.includes(s))return s;throw new Error(`Unsupported agent host "${s}". Expected one of: ${q.join(", ")}.`)}function le(t){let s=t.map(i=>i.id).sort(),n=[...q].sort();if(s.length!==n.length||s.some((i,c)=>i!==n[c]))throw new Error("Project agent entry must define each supported host exactly once.")}function V(t){let{integrity:s,...n}=t;return n}function S(t){return c(t)}function Ve(t$1){le(t$1.hosts);let s={schemaVersion:pe,generatedAt:t$1.context.generatedAt,project:{name:t$1.context.project.name,relativePath:t$1.context.project.relativePath,...t$1.context.project.runtime?{runtime:t$1.context.project.runtime}:{},...t$1.context.project.framework?{framework:t$1.context.project.framework}:{}},workspace:{name:t$1.context.workspace.name,relationship:t$1.context.workspace.relationship,localBinding:t.projectWorkspaceLink,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"},canonical:{projectContext:t.projectContextAgent,projectGrounding:".workspai/PROJECT-GROUNDING.md",projectKnowledgeGraph:t.projectKnowledgeGraphReference,goalIndex:`workspace:${t.goalIndex}`,workspaceIndex:`workspace:${p.agentIndex}`,workspaceContext:`workspace:${p.agentContext}`,workspaceModel:`workspace:${p.model}`,knowledgeGraph:`workspace:${p.knowledgeGraph}`,workspaceSkillsIndex:`workspace:${p.skillsIndex}`,boundedGraphSearch:"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json"},protocol:{mode:"canonical-first",bootstrapCommand:"workspai agent bootstrap --for-agent generic --strict --json",verifyCommand:"workspai project agent-entry verify --for-agent all --strict --json",requiredReadOrder:[M,"command:workspai agent bootstrap --for-agent generic --strict --json","command:workspai project workspace status --json",t.projectContextAgent,`workspace:${t.goalIndex}`,`workspace:${p.skillsIndex}`,"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json","source:targeted-live-files"],sourcePolicy:{liveSourceAuthority:"exact-implementation",workspaceEvidenceAuthority:"identity-topology-readiness-goals",broadScanBeforeBootstrap:false,sourceMutation:"governed-only",verificationClaims:"cli-evidence-only"},degradedMode:{discloseMissingEvidence:true,allowCompleteArchitectureClaims:false,allowReadOnlySourceInspection:true}},hosts:[...t$1.hosts].sort((i,c)=>i.id.localeCompare(c.id))},n={...s,integrity:{algorithm:"sha256",projectContextHash:t$1.context.integrity.payloadHash,payloadHash:S(s),portable:true,absolutePathsEmitted:false}};if(!j(n))throw new Error("Project agent entry rejected a non-portable local path.");return a(n,"contracts/workspace-intelligence/project-agent-entry.v1.json","Project agent entry"),n}function j(t){return typeof t=="string"?!(/^[A-Za-z]:[\\/]/.test(t)||/(?:^|[\s("'`])[A-Za-z]:[\\/]/.test(t)||/(?:^|[\s("'`])file:\/\//i.test(t)||/(?:^|[\s("'`])\\\\[^\\\s]+[\\]/.test(t)||/(?:^|[\s("'`])\/(?:Users|home|private|var|opt|srv|mnt|Volumes|tmp)\//.test(t)):Array.isArray(t)?t.every(j):t&&typeof t=="object"?Object.values(t).every(j):true}async function Pe(t){let s=m.join(t,M),n=JSON.parse(await O.readFile(s,"utf8"));if(a(n,"contracts/workspace-intelligence/project-agent-entry.v1.json","Project agent entry"),n.integrity.payloadHash!==S(V(n)))throw new Error("Project agent entry integrity validation failed.");if(le(n.hosts),!j(n)||n.integrity.absolutePathsEmitted)throw new Error("Project agent entry contains a non-portable local path.");return n}async function Ce(t$1){let s=m.join(t$1,t.projectContextAgent),n=JSON.parse(await O.readFile(s,"utf8"));a(n,"contracts/workspace-intelligence/project-context-agent.v1.json","Project context agent");let i=V(n),c=Ae.createHash("sha256").update(JSON.stringify(i)).digest("hex");if(n.integrity.payloadHash!==c)throw new Error("Project context agent integrity validation failed.");if(!j(n)||n.integrity.absolutePathsEmitted)throw new Error("Project context agent contains a non-portable local path.");return n}function Te(t){return t.includes("blocked")?"blocked":t.includes("degraded")?"degraded":"ready"}async function Be(t$1){let s=b({startPath:m.resolve(t$1.startPath??process.cwd()),strict:true,requireProjectMembership:true});if(!s?.projectPath)throw new Error("No canonically bound Workspai project was resolved.");let n=s.projectPath,i=s.workspacePath,c$1=await Pe(n),o=await Ce(n);if(c$1.integrity.projectContextHash!==o.integrity.payloadHash||c$1.project.name!==o.project.name||c$1.workspace.name!==o.workspace.name)throw new Error("Project agent entry is not bound to the current project context.");let B=t$1.forAgent?.trim().toLowerCase()||"generic",U=B==="all",g=U?"all":ve(B),J=g,u=U?c$1.hosts:c$1.hosts.filter(e=>e.id===g),Y=c$1.hosts.find(e=>e.id==="generic");if(u.length===0&&Y&&u.push(Y),u.length===0)throw new Error("Project agent entry does not define generic host coverage.");let A=[],l$1=(e,r,C,h)=>A.push({id:e,status:r,message:C,...h?{artifact:h}:{}});l$1("workspace-binding","passed","Canonical workspace membership is resolved."),l$1("entry-integrity","passed","Project entry manifest integrity is valid.",M),l$1("project-context-integrity","passed","Project context integrity and manifest binding are valid.",t.projectContextAgent);let L=[...new Set(u.flatMap(e=>e.entryFiles))].sort(),de=L.filter(e=>!H.existsSync(m.join(n,e))),w=u.some(e=>e.status==="blocked")||de.length>0?"blocked":u.some(e=>e.status==="degraded")?"degraded":"ready";l$1("host-discovery",w==="ready"?"passed":w==="degraded"?"warning":"failed",w==="ready"?`${g} has discoverable Workspai entry coverage.`:w==="degraded"?u.find(e=>e.reason)?.reason??`${g} entry coverage is degraded.`:`${g} entry coverage is missing required files.`,L[0]);let D=[p.agentIndex,p.agentContext,p.skillsIndex,p.model,p.knowledgeGraph],R=D.filter(e=>!H.existsSync(m.join(i,e)));l$1("canonical-evidence",R.length===0?"passed":"failed",R.length===0?"Required canonical workspace evidence is present.":`Required canonical evidence is missing: ${R.join(", ")}.`);let E=[],x=null,y=null;for(let e of D)if(!R.includes(e))try{let r=JSON.parse(await O.readFile(m.join(i,e),"utf8"));b$1(e,r,e),e===p.model&&(x=r),e===p.knowledgeGraph&&(y=r);}catch{E.push(e);}l$1("canonical-contracts",E.length===0?"passed":"failed",E.length===0?"Canonical workspace evidence satisfies its published schemas.":`Canonical evidence failed contract validation: ${E.join(", ")}.`);let I=t.projectKnowledgeGraphReference,z=m.join(n,I),Z="failed",b$2="The project Knowledge Graph reference is missing.";if(H.existsSync(z)&&y)try{let e=JSON.parse(await O.readFile(z,"utf8"));b$1(I,e,I);let r=j$1(y,o.project.name),{integrity:C,...h}=e,f=y.source;e.project.name===o.project.name&&e.canonical.sourceHash===f?.hash&&e.canonical.projectionHash===c(r)&&e.integrity.payloadHash===c(h)?(Z="passed",b$2="The project reference integrity-binds the exact current projection of canonical workspace evidence."):b$2="The project Knowledge Graph reference is stale or does not match the canonical project projection.";}catch{b$2="The project Knowledge Graph reference failed schema or integrity validation.";}l$1("project-knowledge-graph",Z,b$2,I);let ge=x?.workspace,he=y?.workspace,fe=Array.isArray(y?.entities)?y.entities:[],me=Array.isArray(x?.projects)?x.projects:[],Q=E.length===0&&ge?.name===o.workspace.name&&he?.name===o.workspace.name&&me.some(e=>e.name===o.project.name)&&fe.some(e=>e.projectId===o.project.name);l$1("canonical-project-membership",Q?"passed":"failed",Q?"The project and workspace identities agree across the entry, Model, and Graph.":"The project or workspace identity is missing or inconsistent in canonical evidence.");let X=!o.intelligence.freshness.graphMatchesModel||["missing","stale"].includes(o.intelligence.freshness.model)||["missing","stale"].includes(o.intelligence.freshness.graph)?"failed":o.intelligence.freshness.model==="unknown"||o.intelligence.freshness.graph==="unknown"?"warning":"passed",k=false,G;if(t$1.validateLiveInputs!==false)try{let e=await a$1(i);k=e.status==="hit";let r=e.status==="hit"?"Live project inputs match the persisted Model and Knowledge Graph snapshot.":`Live project inputs require an intelligence refresh (${e.reason}).`;G={id:"live-inputs",status:k?"passed":"failed",message:r};}catch{G={id:"live-inputs",status:"failed",message:"Live project inputs could not be validated against canonical graph evidence."};}else G={id:"live-inputs",status:"warning",message:"Live input validation was skipped; persisted compatibility was checked only."};let K=X==="warning"&&o.intelligence.freshness.model==="unknown"&&o.intelligence.freshness.graph==="fresh"&&o.intelligence.freshness.graphMatchesModel&&k?"passed":X;l$1("persisted-freshness",K,K==="passed"?o.intelligence.freshness.model==="unknown"?"Model and Graph bindings are current; live input validation closes structural freshness while verify-before-use facts remain individually governed.":"Persisted Model and Knowledge Graph bindings are current.":K==="warning"?"Persisted evidence is compatible, but at least one freshness state is unknown.":"Persisted Model or Knowledge Graph evidence is missing, stale, or mismatched."),A.push(G);let d={present:false,appliesToProject:false,status:"none"},_=[],ue=m.join(i,t.goalIndex);if(H.existsSync(ue)){let e=null;try{e=await l({workspacePath:i,validateBindings:false});}catch{_.push("workspai goal --list --json"),l$1("active-goal","failed","The Goal index is present but invalid.");}if(e?.active&&(d={present:true,appliesToProject:e.active.scope.projects.includes(o.project.name),status:"invalid",id:e.active.id,objective:e.active.objective,lifecycle:e.active.lifecycle,goalPack:`workspace:${e.active.goalPack}`,agentHandoff:`workspace:${e.active.agentHandoff}`}),e)try{let r=await l({workspacePath:i,validateBindings:true});r.active&&(d={present:true,appliesToProject:r.active.scope.projects.includes(o.project.name),status:"ready",id:r.active.id,objective:r.active.objective,lifecycle:r.active.lifecycle,goalPack:`workspace:${r.active.goalPack}`,agentHandoff:`workspace:${r.active.agentHandoff}`}),l$1("active-goal","passed",r.active?"The active Goal Pack and agent handoff have valid canonical bindings.":"No active Goal Pack is selected.");}catch(r){let C=r instanceof Error?r.message:String(r),h=d.present&&/\bstale\b|--refresh/i.test(C);if(d.present&&(d.status=h?"stale":"invalid"),h&&d.objective){let f=e.active,re=f?.scope.kind==="project"&&f.scope.projects.length===1?`project:${f.scope.projects[0]}`:f?.scope.kind==="project-set"&&f.scope.projects.length>1?`projects:${f.scope.projects.join(",")}`:"workspace";_.push(`workspai goal ${JSON.stringify(d.objective)} --scope ${re} --for-agent generic --refresh --json`);}else _.push("workspai goal --status --json");l$1("active-goal","failed",h?"The selected Goal Pack is present but stale; regenerate it against current canonical evidence before acting.":d.present?"The selected Goal Pack is present but its canonical binding or handoff is invalid.":"The Goal index could not be validated.");}}else l$1("active-goal","passed","No Goal index is present for this workspace.");let ee=A.some(e=>e.status==="failed")?"blocked":A.some(e=>e.status==="warning")?"degraded":"ready",v=Te([w,ee]),P=o.blockers.some(e=>e.severity==="error")?"blocked":o.blockers.length>0?"degraded":"ready",ye=P==="blocked"?"blocked":P==="degraded"?"degraded":"not-verified",we=`command:workspai agent bootstrap --for-agent ${g} --strict --json`,ke=c$1.protocol.requiredReadOrder.map(e=>e==="command:workspai agent bootstrap --for-agent generic --strict --json"?we:e),te={schemaVersion:Ee,generatedAt:(t$1.now??new Date).toISOString(),status:v,statusScope:"agent-grounding",readiness:{agentGrounding:v,architectureEvidence:ee,projectEnvironment:P,release:ye},requestedAgent:J,resolvedHost:g,project:{name:o.project.name,relativePath:o.project.relativePath,...o.project.runtime?{runtime:o.project.runtime}:{},...o.project.framework?{framework:o.project.framework}:{}},workspace:{name:o.workspace.name,relationship:o.workspace.relationship,resolved:true,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"},entry:{artifact:M,schemaVersion:pe,hostStatus:w,entryFiles:L},canonicalEvidence:{projectContext:t.projectContextAgent,projectKnowledgeGraph:t.projectKnowledgeGraphReference,workspaceIndex:`workspace:${p.agentIndex}`,workspaceContext:`workspace:${p.agentContext}`,workspaceModel:`workspace:${p.model}`,knowledgeGraph:`workspace:${p.knowledgeGraph}`,workspaceSkillsIndex:`workspace:${p.skillsIndex}`,boundedGraphSearch:"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json",modelFreshness:k?"fresh":o.intelligence.freshness.model,graphFreshness:k?"fresh":o.intelligence.freshness.graph,graphMatchesModel:o.intelligence.freshness.graphMatchesModel,liveInputsValidated:k,blockerCount:o.blockers.length},activeGoal:d,requiredReadOrder:ke,claims:{architecture:v==="ready"?"allowed-with-citations":"prohibited",sourceInspection:"bounded-and-targeted",sourceMutation:"governed-cli-transaction-only",verification:"cli-evidence-only"},checks:A,nextActions:v==="ready"?[...d.present&&d.appliesToProject&&d.agentHandoff?[`read:${d.agentHandoff}`]:[],...P==="blocked"?["workspai doctor project --json","workspai workspace explain release-blocked --json"]:P==="degraded"?["workspai doctor project --json"]:[],`workspai workspace graph search <task-query> --scope project:${o.project.name} --limit 12 --json`,"inspect only the returned proof paths and target source files"]:[..._,"workspai workspace intelligence run --for-agent generic --strict --json",`workspai agent bootstrap --for-agent ${g} --strict --json`]},oe=S(V(c$1)),je=S({manifestHash:oe,projectContextHash:o.integrity.payloadHash,requestedAgent:J,status:v,generatedAt:te.generatedAt}),ne={...te,receiptId:je},$={...ne,integrity:{algorithm:"sha256",manifestHash:oe,projectContextHash:o.integrity.payloadHash,payloadHash:S(ne),portable:true,absolutePathsEmitted:false}};if(!j($))throw new Error("Agent bootstrap receipt rejected a non-portable local path.");return a($,"contracts/workspace-intelligence/agent-bootstrap-receipt.v1.json","Agent bootstrap receipt"),$}
2
- export{pe as a,M as b,Ee as c,We as d,Fe as e,q as f,qe as g,ve as h,Ve as i,Be as j};
@@ -1,2 +0,0 @@
1
- import {z as z$1}from'./chunk-KFTJVVJR.js';import {j,m as m$1}from'./chunk-U5ENEDJA.js';import {a as a$1}from'./chunk-GR6442P7.js';import {a as a$2,f,e,g}from'./chunk-OZXCNVGW.js';import {b}from'./chunk-K33JJVQZ.js';import {l}from'./chunk-OCGZNSOE.js';import {t,p,s,q}from'./chunk-ODK4LCEL.js';import {c}from'./chunk-64XWHDZ3.js';import {a}from'./chunk-XWKGZRHN.js';import {t as t$1,u,q as q$1}from'./chunk-VQZ5PI5J.js';import*as m from'path';import m__default from'path';import k from'fs-extra';import Ce from'crypto';var ye="unknown-run";function se(e){let t=c();return !t||t===ye?e:{...e,runId:t}}async function ce(e,t){await k.ensureDir(m.dirname(e));let r=`${e}.${process.pid}.${Date.now()}.${Ce.randomUUID()}.tmp`;try{await k.writeJSON(r,t,{spaces:2}),await k.move(r,e,{overwrite:true});}finally{await k.remove(r).catch(()=>{});}}function ie(e){return q$1(e,"imported-projects.json")}async function I(e){let t=(await Promise.all(t$1(e,"imported-projects.json").map(async r=>await k.pathExists(r)?r:null))).find(r=>typeof r=="string");if(!t)return [];try{let r=await k.readJSON(t);if(!r||typeof r!="object"||r.version!==1||!Array.isArray(r.projects))throw new Error("expected a version 1 registry with a projects array");let o=r.projects,n=o.filter(i=>{if(!i||typeof i!="object")return false;let c=i;return typeof c.name=="string"&&typeof c.path=="string"&&typeof c.stack=="string"&&typeof c.confidence=="string"&&typeof c.importedAt=="string"});if(n.length!==o.length)throw new Error("one or more project entries are invalid");return n}catch(r){throw new Error(`Imported-project registry is invalid: ${t}`,{cause:r})}}async function He(e,t){if(t.length===0)return;let r=ie(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Map;for(let c of o)n.set(c.path,c);for(let c of t)n.set(c.path,c);let i=Array.from(n.values()).sort((c,u)=>c.name.localeCompare(u.name)).map(c=>({...c}));await ce(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-upsert"});}async function Je(e,t){if(t.length===0)return;let r=ie(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Set(t.map(c=>m.resolve(c))),i=o.filter(c=>!n.has(m.resolve(c.path)));await ce(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-remove"});}var ze="workspace-dependency-graph.v1",pe=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],de=["inferred","contract","manual"];var v=t.workspaceContract,Ee=p.contractVerify,_=s.workspaceContract.schemaVersion,ve=q.contractVerify,N=class extends Error{constructor(r){super(`Workspace contract verification failed: ${r.violations.join("; ")}`);this.verification=r;this.name="WorkspaceContractVerificationError";}verification};function fe(e){return e.replace(/\\/g,"/")}function z(e){let t=fe(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(r=>r===".."||r===".")}function le(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function je(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ue(e){let r=(Array.isArray(e.ports)?e.ports:[]).map(i=>{if(!i||typeof i!="object"||Array.isArray(i))return null;let c=i,u=Number(c.port);if(!Number.isInteger(u)||u<1||u>65535)return null;let g=c.protocol==="https"||c.protocol==="grpc"||c.protocol==="tcp"||c.protocol==="udp"?c.protocol:"http";return {name:typeof c.name=="string"&&c.name.trim()?c.name:"http",port:u,protocol:g}}).filter(i=>i!==null);if(r.length>0)return r;let o=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,n=Number(e.port??o?.default_port);return Number.isInteger(n)&&n>=1&&n<=65535?[{name:"http",port:n,protocol:"http"}]:[]}async function be(e){let t=m__default.join(e,"Dockerfile");if(!await k.pathExists(t))return [];try{let r=await k.readFile(t,"utf8"),o=new Map;for(let n of r.matchAll(/^\s*EXPOSE\s+(.+)$/gim))for(let i of n[1].split(/\s+/)){let c=i.match(/^(\d{1,5})(?:\/(tcp|udp))?$/i),u=Number(c?.[1]);if(!c||!Number.isInteger(u)||u<1||u>65535)continue;let g=c[2]?.toLowerCase();o.set(u,{name:"http",port:u,protocol:g==="udp"?"udp":"http"});}return [...o.values()].sort((n,i)=>n.port-i.port)}catch{return []}}async function D(e){for(let t of e)if(await k.pathExists(t))return t;return null}async function We(e){for(let t of t$1(e,"workspace.json"))try{let r=await k.readJson(t);return {name:typeof r.workspace_name=="string"&&r.workspace_name.trim()||typeof r.name=="string"&&r.name.trim()||m__default.basename(e),profile:typeof r.profile=="string"?r.profile:void 0}}catch{}return {name:m__default.basename(e)}}async function Se(e){let t=[],r=[e],o=new Set,n=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;r.length>0;){let i=r.shift();if(!i||o.has(i))continue;o.add(i);let c=await D(u(i,"project.json")),u$1=await D(u(i,"context.json"));if(c||u$1){t.push(c??u$1??"");continue}let g;try{g=await k.readdir(i,{withFileTypes:true});}catch{continue}for(let d of g)!d.isDirectory()||n.has(d.name)||a$1(d.name)||r.push(m__default.join(i,d.name));}return t.sort()}function Ae(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function Re(e,t){let r=(e||"").toLowerCase(),o=(t||"").toLowerCase();return r.includes("vscode-extension")?null:r.includes("fastapi")?8e3:r.includes("nestjs")?3e3:r.includes("springboot")?8080:r.includes("gofiber")?3e3:r.includes("gogin")?8080:r.startsWith("adopted.")?null:o==="node"?3e3:o==="python"?8e3:o==="java"||o==="go"?8080:null}function U(e,t){let r=e;for(;t.has(r)&&r<65535;)r+=1;return r}function B(e,t,r){let o=e!==void 0&&e.source===void 0,n=Re(t.kit,t.runtime),i=e?.ports||[],c=t.ports||[],u=(t.kit||"").toLowerCase().includes("vscode-extension"),g=t.source==="adopted-local"&&e?.source!==void 0,d=t.source!==void 0&&e?.source!==void 0,p=(u&&c.length===0?[]:g?c.length>0?c:n?[{name:"http",port:U(n,r),protocol:"http"}]:[]:i.length>0?i:c.length>0?c:n?[{name:"http",port:U(n,r),protocol:"http"}]:[]).map(w=>({...w,port:U(w.port,r)}));for(let w of p)r.add(w.port);let f={...t,...e,slug:e?.slug||t.slug,relativePath:o&&e?.relativePath&&z(e.relativePath)?e.relativePath:t.relativePath,source:o&&e?.source||t.source,relationship:o&&e?.relationship||t.relationship,externalPath:o&&e?.externalPath||t.externalPath,runtime:d?t.runtime:e?.runtime||t.runtime,framework:d?t.framework:e?.framework||t.framework,kit:d?t.kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:p,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:e?.contracts?.env||[]}},h=JSON.stringify(e||null)!==JSON.stringify(f);return {project:f,changed:h}}async function he(e){let t=m__default.resolve(e.workspacePath),r=await We(t),o=await Se(t),n=await I(t),i=new Map(n.map(s=>[m__default.resolve(s.path),s])),c=[];for(let s of n){let p=m__default.resolve(s.path),f=await D(u(p,"project.json"))??await D(u(p,"context.json"));!f||o.some(h=>m__default.resolve(h)===m__default.resolve(f))||c.push({projectJsonPath:f,registryEntry:s});}let u$1=[],g=[...o.map(s=>({projectJsonPath:s,registryEntry:i.get(m__default.resolve(m__default.dirname(m__default.dirname(s))))})),...c];for(let{projectJsonPath:s,registryEntry:p}of g){let f=m__default.dirname(m__default.dirname(s)),h=fe(m__default.relative(t,f)),w=p!==void 0&&!z(h),C=le(p?.name||m__default.basename(f),m__default.basename(f)),b=w?`external/${C}`:h||C,P=await k.readJson(s),a=typeof P.kit_name=="string"&&P.kit_name||typeof P.kit=="string"&&P.kit||void 0,E=j(P)?m$1(f,P):void 0,j$1=E!==void 0&&E.key!=="unknown",T=j$1?E.runtime:typeof P.runtime=="string"?P.runtime:void 0,y=j$1?E.key:typeof P.framework=="string"&&P.framework||Ae(a),$=p?.relationship==="adopted"?"adopted":"imported",K=j$1?`${$}.${E.key}`:a;u$1.push({slug:p?.name||b||m__default.basename(f),relativePath:b,source:p?.source??"workspace",relationship:p?.relationship,externalPath:w?f:void 0,runtime:T,framework:y,kit:K,modules:je(P.modules),ports:ue(P).length>0?ue(P):await be(f),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}let d=new Map;for(let s of u$1){let p=le(s.slug,s.relativePath),f=d.get(p);(!f||f.source!=="workspace"&&s.source==="workspace")&&d.set(p,s);}return {schemaVersion:_,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:r,projects:[...d.values()]}}async function dt(e){let t=m__default.resolve(e.outputPath||a$2(e.workspacePath,v));if(await k.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let r=await he({workspacePath:e.workspacePath,now:e.now}),o=new Set,n={...r,projects:r.projects.map(c=>B(void 0,c,o).project)},i=await Pe({workspacePath:e.workspacePath,contractPath:t,contract:n});if(e.strict&&i.status==="failed")throw new N(i);return await ke({workspacePath:e.workspacePath,contractPath:t,contract:n,now:e.now}),{contractPath:t,contract:n}}async function lt(e){let t=m__default.resolve(e.workspacePath),r=a$2(t,v),o=await f(t,v)??r,n=await he({workspacePath:t,now:e.now}),i=await k.pathExists(o)?await k.readJson(o):null,c=new Map((i?.projects||[]).map(h=>[h.slug,h])),u=new Set,g=[],d=[],s=[];for(let h of n.projects){let w=c.get(h.slug),C=B(w,h,u);w?C.changed&&d.push(h.slug):g.push(h.slug),s.push(C.project),c.delete(h.slug);}for(let h of c.values()){if(h.source)continue;let w=B(h,h,u);s.push(w.project);}let p={schemaVersion:_,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...i?.workspace||{},...n.workspace,name:n.workspace.name||i?.workspace?.name||m__default.basename(t)},projects:s.sort((h,w)=>h.slug.localeCompare(w.slug))},f$1=await Pe({workspacePath:t,contractPath:r,contract:p});if(e.strict&&f$1.status==="failed")throw new N(f$1);return await ke({workspacePath:t,contractPath:r,contract:p,now:e.now}),{contractPath:r,contract:p,addedProjects:g,updatedProjects:d,verification:f$1}}async function me(e){return await k.pathExists(e)?{exists:true,contents:await k.readFile(e)}:{exists:false}}async function ge(e,t){if(!t.exists){await k.remove(e);return}await k.outputFile(e,t.contents);}async function ke(e$1){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:r}=await import('./workspace-registry-summary-ONT4VOJX.js'),o=await t(e$1.workspacePath,{now:e$1.now,contract:e$1.contract}),n=a$2(e$1.workspacePath,r),i=c=>{if(!c||typeof c!="object"||Array.isArray(c))return JSON.stringify(c);let{generatedAt:u,...g}=c;return JSON.stringify(g)};if(await k.pathExists(e$1.contractPath)&&await k.pathExists(n)){let[c,u]=await Promise.all([k.readJson(e$1.contractPath),k.readJson(n)]);if(i(c)===i(e$1.contract)&&i(u)===i(o))return}b(v,e$1.contract),b(r,o),await e(e$1.workspacePath,v,async()=>{let[c,u]=await Promise.all([me(e$1.contractPath),me(n)]);try{if(e$1.contractPath===a$2(e$1.workspacePath,v)?await g(e$1.workspacePath,v,e$1.contract):(await k.ensureDir(m__default.dirname(e$1.contractPath)),await k.writeJson(e$1.contractPath,e$1.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await g(e$1.workspacePath,r,o);}catch(g){let s=(await Promise.allSettled([ge(e$1.contractPath,c),ge(n,u)])).filter(p=>p.status==="rejected");throw s.length>0?new AggregateError([g,...s.map(p=>p.reason)],"Workspace contract publication failed and rollback was incomplete."):g}});}async function we(e){let t=e.contractPath??(await f(e.workspacePath,v)||a$2(e.workspacePath,v)),r=await k.readJson(t);return {contractPath:t,contract:r}}var xe={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function _e(e,t){return t.externalPath?m__default.resolve(t.externalPath):m__default.resolve(e,t.relativePath)}async function Ge(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[r,o]of Object.entries(xe))for(let n of o)await k.pathExists(m__default.join(e,n))&&t[r].push(n);try{let r=await k.readdir(e,{withFileTypes:true});for(let o of r)o.isFile()&&(o.name.endsWith(".csproj")||o.name.endsWith(".sln"))&&t.manifests.push(o.name),o.isFile()&&o.name.endsWith(".tf")&&t.infrastructure.push(o.name);}catch{}for(let r of Object.values(t))r.sort((o,n)=>o.localeCompare(n));return t}function x(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,r)=>t.localeCompare(r))}async function Oe(e){try{let t=await k.readJson(m__default.join(e,"package.json")),r={runtime:x(t.dependencies),development:x(t.devDependencies),peer:x(t.peerDependencies),optional:x(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:x(t.scripts),dependencies:r,dependencyCount:new Set(Object.values(r).flat()).size}}catch{return}}async function Ie(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await k.readFile(m__default.join(e,t),"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&o.includes("=")).map(o=>o.slice(0,o.indexOf("=")).trim()).filter(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o)).sort((o,n)=>o.localeCompare(n))}catch{}return []}function Ne(e,t){try{let r=z$1(e);if(r.engine!=="unknown")return r;let o=k.pathExistsSync(m__default.join(e,"package.json"))?"npm":k.pathExistsSync(m__default.join(e,"pyproject.toml"))?"python":k.pathExistsSync(m__default.join(e,"requirements.txt"))?"pip":"unknown";return {...r,engine:o,runtime:t.runtime??r.runtime,framework:t.framework??r.framework,frameworkDisplayName:t.framework??r.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",runtimeCandidates:["unknown"],compositeRuntime:false,lifecycleCoverage:"complete",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function De(e,t,r){let o=e.projects.map(n=>({id:n.slug,path:n.relativePath,runtime:n.runtime,framework:n.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:o,edges:[],stats:{nodeCount:o.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:o.length,connectedNodeCount:0,density:0,edgeCoverageRatio:o.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:r,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function ut(e){let{contractPath:t,contract:r}=await we(e),o=e.now??new Date,n=o.toISOString(),{buildWorkspaceModel:i,workspaceModelProjectTopology:c}=await import('./workspace-model-NCOOY5LC.js'),{hashWorkspaceModel:u}=await import('./workspace-model-hash-ZXYPIGCW.js'),g=await i({workspacePath:e.workspacePath,includeEvidence:false,now:o}),d=c(g)??De(r,n,"The canonical Workspace Model did not provide a project dependency topology."),s=new Map(d.nodes.map(a=>[a.id,a.operationalProfile])),{buildWorkspaceKnowledgeGraph:p$1}=await import('./workspace-knowledge-graph-EEOW5VAJ.js'),f=await p$1({workspacePath:e.workspacePath,workspace:{name:g.workspace.name,...g.workspace.profile?{profile:g.workspace.profile}:{}},contract:r,projectTopology:d,now:o,projects:g.projects.map(a=>({id:a.name,path:a.path,...a.absolutePath?{absolutePath:a.absolutePath}:{},runtime:a.runtime,runtimeCandidates:a.runtimeCandidates,framework:a.framework,...a.kit?{kit:a.kit}:{}})),source:{kind:"workspace-model",artifact:p.model,hashAlgorithm:"sha256",hash:u(g)}}),h=await Promise.all(r.projects.map(async a=>{let l=_e(e.workspacePath,a),[E,j,T]=await Promise.all([Ge(l),Oe(l),Ie(l)]),y=Ne(l,a);return {id:a.slug,label:a.slug,relativePath:a.relativePath,source:a.source,relationship:a.relationship,externalPath:a.externalPath,runtime:a.runtime??y.runtime,framework:a.framework??y.framework,kit:a.kit,modules:a.modules,ports:a.ports,apis:a.contracts.apis,owns:a.contracts.owns,env:[...new Set([...a.contracts.env,...T])].sort(($,K)=>$.localeCompare(K)),contracts:{owns:[...a.contracts.owns],apis:[...a.contracts.apis],publishes:[...a.contracts.publishes],consumes:[...a.contracts.consumes],dependsOn:[...a.contracts.dependsOn],env:[...a.contracts.env]},capabilities:{engine:y.engine,supportTier:y.frameworkSupportTier,runtimeSupportTier:y.runtimeSupportTier,doctorSupport:y.runtimeDoctorSupport,moduleSupport:y.moduleSupport,fleetStages:[...y.fleetStages],localOnlyCommands:[...y.localOnlyCommands],supportedCommands:[...y.supportedCommands]},files:E,...j?{package:j}:{},...s.get(a.slug)?{operationalProfile:s.get(a.slug)}:{}}})),w=new Set(h.map(a=>a.id)),C=new Map,b=[];for(let a of r.projects){for(let l of a.contracts.dependsOn||[])w.has(l)&&b.push({from:l,to:a.slug,type:"dependency",label:"dependsOn"});for(let l of a.contracts.publishes||[])C.has(l)||C.set(l,new Set),C.get(l)?.add(a.slug);}for(let a of r.projects)for(let l of a.contracts.consumes||[]){let E=C.get(l);if(E)for(let j of E)j!==a.slug&&b.push({from:j,to:a.slug,type:"event",label:l});}let P={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:r.workspace,generatedAt:n,nodes:h.sort((a,l)=>a.id.localeCompare(l.id)),edges:b.sort((a,l)=>`${a.from}:${a.to}:${a.type}:${a.label}`.localeCompare(`${l.from}:${l.to}:${l.type}:${l.label}`)),dependencyGraph:d,knowledgeGraph:f,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:h.length,dependencyEdges:b.filter(a=>a.type==="dependency").length,eventEdges:b.filter(a=>a.type==="event").length,portCount:h.reduce((a,l)=>a+l.ports.length,0),apiCount:h.reduce((a,l)=>a+l.apis.length,0),relationshipEdges:d.stats.edgeCount,inferredEdges:d.stats.inferredEdges,authoritativeEdges:d.stats.authoritativeEdges,orphanProjects:d.stats.orphanCount,hotspotProjects:d.stats.hotspotCount,evidenceCoverageRatio:d.stats.evidenceCoverageRatio,edgeCoverageRatio:d.stats.edgeCoverageRatio,connectedProjects:d.stats.connectedNodeCount,lowConfidenceEdges:d.stats.lowConfidenceEdges,hasCycle:d.stats.hasCycle,manifestCount:h.reduce((a,l)=>a+l.files.manifests.length,0),entrypointCount:h.reduce((a,l)=>a+l.files.entrypoints.length,0),diagnostics:d.diagnostics?.length??0,relationshipKinds:Object.fromEntries(pe.map(a=>[a,d.edges.filter(l=>l.kind===a).length])),relationshipSources:Object.fromEntries(de.map(a=>[a,d.edges.filter(l=>l.source===a).length])),entityCount:f.quality.entityCount,knowledgeRelations:f.quality.relationCount,proofCount:f.quality.proofCount,providerCount:f.providers.length,knowledgeUnknowns:f.quality.unknownCount}};return {contractPath:t,graph:P}}async function Pe(e){let t=e.contract?{contractPath:e.contractPath??a$2(e.workspacePath,v),contract:e.contract}:await we(e),{contractPath:r,contract:o}=t,n=[],i=[];o.kind!=="rapidkit.workspace.contract"&&n.push("Contract kind must be rapidkit.workspace.contract."),o.schemaVersion!==_&&n.push(`Contract schemaVersion must be ${_}.`),o.workspace?.name||n.push("Contract workspace.name is required."),Array.isArray(o.projects)||n.push("Contract projects must be an array.");let c=new Set,u=new Map;for(let s of o.projects||[]){if(!s.slug){n.push("Every project must declare slug.");continue}c.has(s.slug)&&n.push(`Duplicate project slug: ${s.slug}.`),c.add(s.slug),s.relativePath?z(s.relativePath)||n.push(`Project ${s.slug} declares unsafe relativePath: ${s.relativePath}.`):n.push(`Project ${s.slug} must declare relativePath.`),s.externalPath&&(s.relationship==="adopted"||s.source==="adopted-local"||s.source==="local-folder"||s.source==="git-url"||n.push(`Project ${s.slug} declares externalPath without imported/adopted provenance.`),m__default.isAbsolute(s.externalPath)||n.push(`Project ${s.slug} declares non-absolute externalPath.`));for(let p of s.ports||[]){(!Number.isInteger(p.port)||p.port<1||p.port>65535)&&n.push(`Project ${s.slug} declares invalid port: ${p.port}.`);let f=u.get(p.port);f&&n.push(`Port ${p.port} is claimed by both ${f} and ${s.slug}.`),u.set(p.port,s.slug);}for(let p of s.contracts?.apis||[])(!p.name?.trim()||!p.basePath?.startsWith("/"))&&n.push(`Project ${s.slug} declares invalid API contract.`);for(let p of [...s.contracts?.publishes||[],...s.contracts?.consumes||[]])p.trim()||n.push(`Project ${s.slug} declares an empty event contract.`);for(let p of s.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(p)||n.push(`Project ${s.slug} declares invalid env contract: ${p}.`);for(let p of s.contracts?.dependsOn||[])c.has(p);}for(let s of o.projects||[])for(let p of s.contracts?.dependsOn||[])c.has(p)||n.push(`Project ${s.slug} depends on unknown project: ${p}.`);i.push({id:"schema",status:o.kind==="rapidkit.workspace.contract"&&o.schemaVersion===_?"passed":"failed",message:"Contract schema and kind are valid."}),i.push({id:"projects",status:Array.isArray(o.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(o.projects)?o.projects.length:0} project(s).`}),i.push({id:"ports",status:n.some(s=>s.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),i.push({id:"dependencies",status:n.some(s=>s.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),i.push({id:"contracts",status:n.some(s=>s.includes("unsafe relativePath")||s.includes("invalid API contract")||s.includes("event contract")||s.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let g=await l(e.workspacePath);if(g.moduleCount>0){for(let s of g.issues)n.push(`${m__default.basename(s.projectRoot)}: ${s.message} (slug=${s.slug})`);i.push({id:"module-paths",status:g.status,message:g.status==="passed"?`All ${g.moduleCount} registered module(s) resolve under canonical paths.`:`${g.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&i.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:n.length>0?"failed":"passed",contractPath:r,projectCount:Array.isArray(o.projects)?o.projects.length:0,checks:i,violations:n}}async function mt(e){let t=m__default.resolve(e.workspacePath),r={schemaVersion:ve,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return g(t,Ee,se(r))}
2
- export{I as a,He as b,Je as c,se as d,ze as e,pe as f,v as g,Ee as h,_ as i,ve as j,N as k,Se as l,he as m,dt as n,lt as o,we as p,ut as q,Pe as r,mt as s};
@@ -1,8 +0,0 @@
1
- import {a as a$1}from'./chunk-MHQHRMKU.js';import {a as a$2,e}from'./chunk-ERVWW5HX.js';import {a as a$4}from'./chunk-MGL6DBOR.js';import {f,a,g}from'./chunk-OZXCNVGW.js';import {p,s}from'./chunk-ODK4LCEL.js';import a$3 from'chalk';import re from'fs';import b from'path';import {execa}from'execa';var V="autopilot-release-last-run.json",G="autopilot-release.json";function $(r){try{return JSON.parse(r)}catch{return null}}function Se(r){let e=b.resolve(r),n=a$4(e);if(!n)throw new Error("No Workspai workspace found in current directory or parents");return n}async function S(r,e){let n=process.argv[1];if(!n)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for autopilot execution.",crashed:true};try{let o=await execa(process.execPath,[n,...r],{cwd:e,reject:false,env:{...process.env,RAPIDKIT_AUTOPILOT_CHILD:"1"}});return {exitCode:Number(o.exitCode??1),stdout:o.stdout,stderr:o.stderr,crashed:false}}catch(o){return {exitCode:1,stdout:"",stderr:o instanceof Error?o.message:String(o),crashed:true}}}function oe(r){let e=r.toLowerCase();return e==="pass"?"pass":e==="warn"?"warn":e==="fail"?"fail":"warn"}function ae(r){return r.summary.failed>0||r.gates.results.some(e=>e.status==="fail")?"fail":r.gates.results.some(e=>e.status==="warn")?"warn":"pass"}function be(r){let e=r.filter(o=>o.status!=="skipped");if(e.length===0)return 100;let n=e.reduce((o,t)=>t.status==="pass"?o+1:t.status==="warn"?o+.6:o,0);return Math.round(n/e.length*100)}function Ae(r){return r.executionError?["Re-run: npx workspai autopilot release --mode audit --json","Inspect .workspai/reports/autopilot-release-last-run.json for execution failure details"]:r.blockers.length>0?["Run: npx workspai doctor workspace --plan","Run: npx workspai readiness --json --strict","Run: npx workspai workspace run test --affected --strict"]:r.hasWarnings&&r.mode!=="enforce"?["Review warning-level findings in autopilot report","Optionally run: npx workspai autopilot release --mode safe-fix"]:["Workspace is release-ready based on current autopilot policy"]}async function xe(r,e){await re.promises.mkdir(b.dirname(r),{recursive:true}),await re.promises.writeFile(r,`${JSON.stringify(e,null,2)}
2
- `,"utf-8");}async function ze(r){let e$1=Se(r.workspacePath),n=r.mode,o=[],t=[],L,H,N,q,Q,X=0,f$1=false,I=0,_=0,W=-1,T=-1,c="skipped",d="skipped",ne=n==="enforce"?["doctor","workspace","--json","--strict"]:["doctor","workspace","--json","--ci"];if(r.skipPipelineStages)o.push({name:"doctor-workspace",status:"skipped",durationMs:0,summary:"doctor stage skipped (pipeline already executed)"},{name:"analyze",status:"skipped",durationMs:0,summary:"analyze stage skipped (pipeline already executed)"},{name:"readiness",status:"skipped",durationMs:0,summary:"readiness stage skipped (pipeline already executed)"});else {let s=Date.now(),l=await S([...ne],e$1),m=Date.now()-s;if(c="pass",l.crashed)c="fail",f$1=true,t.push(`doctor workspace execution error: ${l.stderr||"unknown error"}`);else if(l.exitCode===1)c="fail",t.push("doctor workspace command failed or reported errors");else if(l.exitCode===2)c="warn",t.push("doctor workspace reported warnings");else if(l.exitCode!==0)c="fail",t.push("doctor workspace command failed");else {let p=$(l.stdout),E=p&&p.healthScore&&typeof p.healthScore=="object"?p.healthScore:{},k=Number(E.errors??0),C=Number(E.warnings??0);Number.isFinite(k)&&k>0?(c="fail",t.push(`doctor workspace reports ${k} error(s)`)):Number.isFinite(C)&&C>0&&(c="warn");}W=o.push({name:"doctor-workspace",status:c,durationMs:m,summary:c==="pass"?"doctor workspace passed":c==="warn"?"doctor workspace reported warnings":"doctor workspace reported errors"})-1,n==="enforce"&&c==="warn"&&t.push("doctor workspace reported warnings under enforce mode");let g=Date.now(),w=await S(["analyze","--json"],e$1),P=Date.now()-g;H=await f(e$1,p.analyze)??a(e$1,p.analyze);let i="pass";if(w.crashed)i="fail",f$1=true,t.push(`analyze execution error: ${w.stderr||"unknown error"}`);else if(w.exitCode!==0)i=w.exitCode===2?"warn":"fail",t.push(w.exitCode===2?"analyze reported needs-attention verdict":"analyze command failed or reported blocked verdict");else {let p=$(w.stdout),E=p&&p.summary&&typeof p.summary=="object"?p.summary:{},k=String(E.verdict??"ready");k==="blocked"?(i="fail",t.push("analyze reported blocked verdict")):k==="needs-attention"&&(i="warn");}o.push({name:"analyze",status:i,durationMs:P,summary:i==="pass"?"analyze passed":i==="warn"?"analyze reported needs-attention":"analyze reported blocked verdict"}),n==="enforce"&&i==="warn"&&t.push("analyze reported warnings under enforce mode");let v=Date.now(),h=await S(["readiness","--json"],e$1),y=Date.now()-v;if(d="fail",h.crashed)d="fail",f$1=true,t.push(`readiness execution error: ${h.stderr||"unknown error"}`);else if(h.exitCode!==0)d="fail",t.push("readiness command failed");else {let p=$(h.stdout),E=String(p?.overallStatus??"fail");if(d=oe(E),typeof p?.evidencePath=="string"&&p.evidencePath.trim().length>0&&(L=p.evidencePath),d==="fail"){let k=Array.isArray(p?.blockingReasons)?p?.blockingReasons.filter(C=>typeof C=="string"):[];k.length>0?t.push(...k.map(C=>`readiness: ${C}`)):t.push("readiness overall status is fail");}}T=o.push({name:"readiness",status:d,durationMs:y,summary:`readiness overall status is ${d}`})-1,n==="enforce"&&d==="warn"&&t.push("readiness reported warnings under enforce mode");}let ie=Date.now(),D=await S(["doctor","workspace","--plan","--json"],e$1),le=Date.now()-ie,R="warn";if(D.crashed)R="fail",f$1=true,t.push(`doctor remediation plan execution error: ${D.stderr||"unknown error"}`);else if(D.exitCode!==0)R="fail",t.push("doctor remediation plan command failed");else {let s=$(D.stdout),l=s&&s.remediationPlan&&typeof s.remediationPlan=="object"?s.remediationPlan:null,m=Number(l?.totalSteps??0),g=Number(l?.executableSteps??0);Number.isFinite(m)&&m>0&&(I=m),Number.isFinite(g)&&g>0&&(_=g),Number.isFinite(m)&&m===0?R="pass":R="warn";}if(o.push({name:"remediation-plan",status:R,durationMs:le,summary:R==="pass"?"no remediation steps required":"remediation steps available"}),n==="enforce"&&R==="warn"&&t.push("remediation plan has pending steps under enforce mode"),n==="safe-fix"){let s=Date.now(),l=await S(["doctor","workspace","--apply"],e$1),m=Date.now()-s,g=l.crashed||l.exitCode!==0?"fail":"pass";if(l.crashed)f$1=true,t.push(`doctor remediation apply execution error: ${l.stderr||"unknown error"}`);else if(g==="fail")t.push("doctor remediation apply failed");else {X=_>0?_:I>0?I:1;let w=await S(["doctor","workspace","--json"],e$1);if(w.crashed)c="fail",f$1=true,t.push(`post-apply doctor execution error: ${w.stderr||"unknown error"}`);else if(w.exitCode!==0)c="fail",t.push("post-apply doctor workspace command failed");else {let i=$(w.stdout),v=i&&i.healthScore&&typeof i.healthScore=="object"?i.healthScore:{},h=Number(v.errors??0),y=Number(v.warnings??0);Number.isFinite(h)&&h>0?(c="fail",t.push(`post-apply doctor reports ${h} error(s)`)):Number.isFinite(y)&&y>0?c="warn":c="pass";}W>=0&&(o[W].status=c,o[W].summary=`doctor workspace post-apply status is ${c}`);let P=await S(["readiness","--json"],e$1);if(P.crashed)d="fail",f$1=true,t.push(`post-apply readiness execution error: ${P.stderr||"unknown error"}`);else if(P.exitCode!==0)d="fail",t.push("post-apply readiness command failed");else {let i=$(P.stdout),v=String(i?.overallStatus??"fail");if(d=oe(v),typeof i?.evidencePath=="string"&&i.evidencePath.trim().length>0&&(L=i.evidencePath),d==="fail"){let h=Array.isArray(i?.blockingReasons)?i?.blockingReasons.filter(y=>typeof y=="string"):[];h.length>0?t.push(...h.map(y=>`post-apply readiness: ${y}`)):t.push("post-apply readiness overall status is fail");}}T>=0&&(o[T].status=d,o[T].summary=`readiness post-apply overall status is ${d}`);}o.push({name:"remediation-apply",status:g,durationMs:m,summary:g==="pass"?"safe remediation apply completed":"safe remediation apply failed"});}else o.push({name:"remediation-apply",status:"skipped",durationMs:0,summary:"remediation apply is skipped for this mode"});let ce=Date.now(),A="pass",x="workspace test/build completed for selected projects";try{let s=await a$1({workspacePath:e$1,stage:"test",affected:true,since:r.since,parallel:r.parallel,maxWorkers:r.maxWorkers,strict:true,json:true,enforceGates:false});N=a(e$1,b.join(".workspai","reports",a$2)),await e(e$1,s),q=N;let l=ae(s);if(l==="fail")A="fail",x="workspace test stage failed for selected projects",t.push("workspace run test failed for selected projects");else {l==="warn"&&(A="warn",x="workspace test stage completed with warnings",n==="enforce"&&t.push("workspace run test reported warnings under enforce mode"));let m=await a$1({workspacePath:e$1,stage:"build",affected:true,since:r.since,parallel:r.parallel,maxWorkers:r.maxWorkers,strict:true,json:true,enforceGates:false});await e(e$1,m),Q=N;let g=ae(m);g==="fail"?(A="fail",x="workspace build stage failed for selected projects",t.push("workspace run build failed for selected projects")):g==="warn"&&(A="warn",x="workspace test/build completed with warnings",n==="enforce"&&t.push("workspace run test/build reported warnings under enforce mode"));}}catch(s){A="fail",x="workspace test/build orchestration failed",f$1=true,t.push(`workspace run orchestration error: ${s instanceof Error?s.message:String(s)}`);}let pe=Date.now()-ce;o.push({name:"workspace-run-test-build",status:A,durationMs:pe,summary:x});let M=o.filter(s=>s.status==="warn").length,ue=o.filter(s=>s.status==="fail").length,F=n==="enforce"?o.some(s=>s.status==="warn"||s.status==="fail"):ue>0,j=[...new Set(t)],O=f$1||F?Math.max(1,j.length):0,de=O>0?j:[],fe=O===0?j:[],me=be(o),ge=f$1||F?"blocked":M>0?"partial":"approved",we=f$1?3:F?1:M>0?2:0,he=Ae({mode:n,executionError:f$1,blockers:j,hasWarnings:M>0}),Y=a(e$1,".workspai/reports"),ke=b.join(Y,V),ye=b.join(Y,G),u={schemaVersion:s.autopilotReleaseLastRun.schemaVersion,generatedAt:new Date().toISOString(),workspacePath:e$1,mode:n,summary:{releaseScore:me,verdict:ge,blockers:O,warnings:M,safeFixesApplied:X,manualActions:j.length,exitCode:we},stages:o,blockingReasons:de,warningReasons:fe,nextActions:he,artifacts:{reportPath:ke,aliasEvidencePath:ye,analyzeEvidencePath:H,readinessEvidencePath:L,workspaceRunEvidencePath:N,workspaceRunTestPath:q,workspaceRunBuildPath:Q},enterpriseControls:{jsonReady:true,evidencePath:`.workspai/reports/${V}`,aliasEvidencePath:`.workspai/reports/${G}`}};if(await g(e$1,`.workspai/reports/${V}`,u),await g(e$1,`.workspai/reports/${G}`,u),r.output&&await xe(b.resolve(r.output),u),!r.json){console.log(a$3.bold.cyan(`
3
- \u{1F680} Workspai Autopilot Release
4
- `)),console.log(a$3.bold(`Workspace: ${a$3.cyan(b.basename(e$1))}`)),console.log(a$3.gray(`Path: ${e$1}`)),console.log(a$3.white(`Mode: ${n}`)),console.log(a$3.white(`Verdict: ${u.summary.verdict==="approved"?a$3.green("approved"):u.summary.verdict==="partial"?a$3.yellow("partial"):a$3.red("blocked")}`)),console.log(a$3.white(`Release score: ${u.summary.releaseScore}`));for(let s of u.stages){let l=s.status==="pass"?a$3.green("PASS"):s.status==="warn"?a$3.yellow("WARN"):s.status==="skipped"?a$3.gray("SKIP"):a$3.red("FAIL");console.log(` - ${s.name}: ${l} ${s.summary} (${s.durationMs}ms)`);}if(u.blockingReasons.length>0){console.log(a$3.bold.red(`
5
- Blocking reasons:`));for(let s of u.blockingReasons)console.log(a$3.red(` - ${s}`));}if(u.warningReasons.length>0){console.log(a$3.bold.yellow(`
6
- Warning reasons:`));for(let s of u.warningReasons)console.log(a$3.yellow(` - ${s}`));}if(u.nextActions.length>0){console.log(a$3.bold(`
7
- Next actions:`));for(let s of u.nextActions)console.log(a$3.gray(` - ${s}`));}console.log(a$3.gray(`
8
- Report: ${u.artifacts.reportPath}`));}return u}export{V as a,G as b,ze as c};
@@ -1 +0,0 @@
1
- import {b,c,d as d$1}from'./chunk-3G5FF2JZ.js';import {a as a$3}from'./chunk-X7FYEKLI.js';import {c as c$2}from'./chunk-ERVWW5HX.js';import {c as c$1,d as d$4}from'./chunk-N4B2M44I.js';import {a as a$1,b as b$1}from'./chunk-PYCJWW4B.js';import {p as p$1,a,o,g as g$1,d as d$3,f as f$1}from'./chunk-3HFFKW4Q.js';import {q as q$1,m as m$1,d as d$5}from'./chunk-2LZWBUJD.js';import {d as d$2}from'./chunk-UW4SESKD.js';import {f,g}from'./chunk-OZXCNVGW.js';import {a as a$2}from'./chunk-AFIFZTOY.js';import {d}from'./chunk-EWZZUQBR.js';import {q,p,t,r,s}from'./chunk-ODK4LCEL.js';import m from'path';import v from'fs-extra';var fe="rapidkit-blocker-resolution-v1";function pe(e){let t=e.blockers.map(s=>s.trim()).filter(Boolean).slice(0,12),r=e.stderrTail?.trim().slice(-400)??"";return d$5({blockers:t,exitCode:e.exitCode??null,stderrTail:r})}function we(e){let t=e.trim().toLowerCase();return t?t.includes("missing evidence")||t.includes(": missing")||t.includes("artifact missing")||t.includes("not found on disk")?"artifact-missing":t.includes("policy.")||t.includes("contract")?"config-fixable":t.includes("impact")||t.includes("untracked")||t.includes("grounding")?"semantic-attention":t.includes("failed")||t.includes("blocked")||t.includes(": fail")?"command-failed-repeat":"config-fixable":"unresolvable-without-human"}function me(e){let t=we(e.reason),r=pe({blockers:[e.reason]}),s=t==="artifact-missing"?[{actionKind:"run-once",detail:e.sourceCommand?`Run the source command once: ${e.sourceCommand}`:"Run the mapped workspace intelligence command once to generate the missing artifact.",...e.sourceCommand?{}:{studioActionId:"run-analyze"}}]:t==="semantic-attention"?[{actionKind:"commit-files",detail:"Review workspace-level grounding files (AGENTS.md, agent-sync outputs) and commit or refresh the impact baseline."},{actionKind:"refresh-baseline",detail:"Refresh snapshot + diff + impact before re-running verify."}]:[{actionKind:"edit-file",detail:"Apply the smallest safe file or policy fix for this blocker before re-running verification.",studioActionId:"fix-lens"}];return {schemaVersion:fe,blockerId:e.blockerId,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,resolutionClass:t,blockerSignature:r,commandRetryHint:t==="artifact-missing"?e.sourceCommand?`Run the source command once: ${e.sourceCommand}, then verify.`:"Run the source command once, then verify.":"Do not re-run the same failing command; fix the source issue first, then verify.",fixHints:s,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}}function Re(e){let t=e.toLowerCase();return t.includes("stale")||t.includes("missing evidence")||t.includes("no projects")||t.includes("projects.empty")||t.includes("projects discovered")||t.includes("projects.missing")||t.includes("not yet run")||t.includes("doctor-last-run")||t.includes("doctor-project-last-run")||t.includes("doctor-remediation-plan-last-run")||t.includes("doctor-fix-result-last-run")||t.includes("pipeline-last-run")||t.includes("release-readiness")||t.includes("analyze-last-run")||t.includes("analyze reported")||t.includes("analyze verdict")||t.includes("analyze needs attention")||t.includes("toolchain.lock")||t.includes("not pinned")||t.includes("readiness:")||t.includes("env:")||t.includes("workspace-run-last")||t.includes("pre-project")||t.includes("before adding projects")||t.includes("workspace.projects.missing")||t.includes("no backend projects")||t.includes("index.json")||t.includes("workspace-intelligence-history")||t.includes("validation warning")||t.includes("workspace model validation")||t.includes("workspace.marker")||t.includes("no project roots")||t.includes("no infrastructure services")||t.includes("infra/overrides")||t.includes("infra dependencies")||t.includes("contract verify")||t.includes("contract inspect")||t.includes("publish verify evidence")}function Ce(e){return e.length===0||e.every(t=>Re(t))}function ge(e){return e.projectCount>0||e.policyErrorCount>0?{verdict:e.verdict,exitCode:e.exitCode}:e.verdict==="blocked"&&Ce(e.blockingReasons)?{verdict:"needs-attention",exitCode:1}:{verdict:e.verdict,exitCode:e.exitCode}}function tt(e,t){let r=t&&t!=="ready"?` (${t.replace(/-/g," ")})`:"";return e===0?`Workspace scaffold ready${r} \u2014 add your first project to continue.`:`Workspace scaffold${r}: ${e} pre-project signal(s) \u2014 add your first project to continue.`}var ye=q.verify,G=p.verify;function Ae(e,t){return m.isAbsolute(t)?t:m.join(e,t)}async function ke(e){let t=await v.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace impact input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==f$1)throw new Error(`Unsupported workspace impact schema: ${String(r.schemaVersion)}`);a$2(t,"contracts/workspace-intelligence/workspace-impact.v1.json",`Workspace impact ${e}`);let s=r;a$2(s.diff,"contracts/workspace-intelligence/workspace-model-diff.v1.json",`Embedded workspace diff in ${e}`);let i=[];s.summary.affectedProjects!==s.affectedProjects.length&&i.push("summary.affectedProjects does not match affectedProjects.length"),s.summary.workspaceItems!==s.workspaceImpact.length&&i.push("summary.workspaceItems does not match workspaceImpact.length"),s.summary.recommendedCommands!==s.verificationPlan.length&&i.push("summary.recommendedCommands does not match verificationPlan.length"),s.summary.blastRadius.directlyAffected!==s.affectedProjects.length&&i.push("blastRadius.directlyAffected does not match affectedProjects.length"),s.summary.blastRadius.transitivelyAffected!==s.transitiveImpact.length&&i.push("blastRadius.transitivelyAffected does not match transitiveImpact.length");let o=s.transitiveImpact.reduce((u,d)=>Math.max(u,d.distance??0),0);s.summary.blastRadius.maxDistance!==o&&i.push("blastRadius.maxDistance does not match transitive impact distances");let k=m$1(s.diff.currentModel)?.edges.length??0;if(s.summary.blastRadius.graphEdges!==k&&i.push("blastRadius.graphEdges does not match the embedded model graph"),s.summary.changed!==s.diff.summary.changed&&i.push("summary.changed does not match embedded diff summary"),s.fromRef!==s.diff.fromRef&&i.push("fromRef does not match embedded diff fromRef"),s.workspace.name!==s.diff.currentModel.workspace.name&&i.push("workspace.name does not match the embedded model"),s.diff.toHash!==d(s.diff.currentModel)&&i.push("embedded diff current-model hash does not match toHash"),i.length>0)throw new Error(`Workspace impact semantic integrity failed: ${i.join("; ")} (${e})`);return s}function Ee(e){let t=new Set,r=[];for(let s of e){let i=`${s.scope}:${s.project??""}:${s.display}`;t.has(i)||(t.add(i),r.push(s));}return r}function Se(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return t.scope==="workspace"?true:(t.project??"").trim().toLowerCase()===r}function We(e,t){if(e.id==="workspace.doctor")return m.join(t,p.doctor);if(e.id==="workspace.contract.verify")return m.join(t,p.contractVerify);if(e.id==="workspace.readiness")return m.join(t,p.readiness);if(e.id==="workspace.analyze")return m.join(t,".workspai","reports","analyze-last-run.json");if(e.id==="workspace.pipeline")return m.join(t,".workspai","reports","pipeline-last-run.json");if(e.id==="workspace.doctor-fix")return m.join(t,".workspai","reports","doctor-fix-result-last-run.json");if(e.id.startsWith("project.")&&e.id.includes("."))return m.join(t,".workspai","reports","workspace-run-last.json")}function C(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function je(e){if(!c$1(e,"workspace"))return {status:"fail",message:"Doctor evidence contract is missing or unsupported."};try{d$4(e);}catch(s){return {status:"fail",message:`Doctor evidence semantic validation failed: ${s instanceof Error?s.message:String(s)}`}}let t=a$3(e);return t.hasSystemErrors||t.blockingFindings>0?{status:"fail",message:`Doctor evidence reports ${t.blockingFindings} canonical blocking finding(s).`}:t.advisoryFindings+t.unknownFindings+t.contradictionCount+t.missingDiagnosisProjects>0||t.staleEvidence||t.unknownFreshness||t.minimumDiagnosisCompleteness<100?{status:"warn",message:`Doctor evidence needs attention (${t.advisoryFindings} advisory, ${t.unknownFindings} unknown, ${t.contradictionCount} contradictory; ${t.minimumDiagnosisCompleteness}% complete).`}:{status:"pass",message:"Canonical Doctor evidence is complete, fresh, and healthy."}}function xe(e){let t=typeof e.overallStatus=="string"?e.overallStatus:"unknown";return t==="fail"?{status:"fail",message:"Release readiness evidence reports blocking failures."}:t==="warn"?{status:"warn",message:"Release readiness evidence reports warnings."}:t==="pass"?{status:"pass",message:"Release readiness evidence passed."}:{status:"warn",message:`Release readiness evidence status is ${t}.`}}function Pe(e){let t=typeof e.status=="string"?e.status:"unknown";return t==="failed"||t==="fail"?{status:"fail",message:"Workspace contract verify evidence failed."}:t==="passed"||t==="pass"?{status:"pass",message:"Workspace contract verify evidence passed."}:{status:"warn",message:`Workspace contract verify evidence status is ${t}.`}}function Ie(e){let t=C(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Analyze evidence reports blocking findings."}:r==="needs-attention"?{status:"warn",message:"Analyze evidence reports warnings."}:{status:"pass",message:"Analyze evidence is ready."}}function Ve(e){let t=e.schemaVersion===s.doctorFixResult.schemaVersion?e:e.fixResult;if(!t||typeof t!="object"||Array.isArray(t))return {status:"skipped",message:"Doctor fix result not present; run doctor workspace --fix --json to record fixes."};let r=t,s$1=Array.isArray(r.remainingBlockers)?r.remainingBlockers:[];if(s$1.length>0)return {status:"fail",message:`Doctor fix result reports ${s$1.length} remaining blocker(s).`};let i=Array.isArray(r.appliedFixes)?r.appliedFixes:[];return i.length===0?{status:"pass",message:"Doctor fix result recorded with no remaining blockers."}:{status:"pass",message:`Doctor fix result recorded ${i.length} applied fix(es) with no remaining blockers.`}}async function Fe(e,t$1){let r=await f(e,t.doctorRemediationPlan);if(!r)return false;try{let s=C(await v.readJson(r));if(!s||(Array.isArray(s.steps)?s.steps:[]).length>0)return false;let o=typeof s.generatedAt=="string"?s.generatedAt:void 0;if(!o||!t$1)return true;let k=Date.parse(o),u=Date.parse(t$1);return !Number.isFinite(k)||!Number.isFinite(u)?true:k>=u}catch{return false}}function $e(e){return e.id.endsWith(".init")?"init":e.id.endsWith(".test")?"test":e.id.endsWith(".build")?"build":e.id.endsWith(".start")?"start":null}function Oe(e){let t=C(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Pipeline evidence is blocked."}:r==="needs-attention"?{status:"warn",message:"Pipeline evidence needs attention."}:r==="ready"?{status:"pass",message:"Pipeline evidence is ready."}:{status:"warn",message:"Pipeline evidence status is unknown."}}function De(e,t,r){let s=$e(t),i=c$2(e,s??void 0);if(!i)return {status:"missing",message:"Workspace run evidence is missing or unreadable."};let o=i.stage;if(s&&o!==s)return {status:"missing",message:`Workspace run evidence is for stage "${o}", expected "${s}".`};let k=Array.isArray(i.projects)?i.projects:[],u=t.project?.toLowerCase();if(!u)return {status:"missing",message:"Project-scoped workspace run evidence is missing a project identifier."};let d=k.find(g=>{let c=C(g);if(!c)return false;let n=typeof c.projectName=="string"?c.projectName.toLowerCase():"",a=["projectPath","relativePath","path"].map(f=>c[f]).filter(f=>typeof f=="string"&&f.trim().length>0).map(f=>f.replace(/\\/g,"/").toLowerCase());return n===u||a.some(f=>f.endsWith(`/${u}`)||f===u)});if(d){let g=R(i.generatedAt,r,`Workspace run evidence for ${t.project??t.id}`);if(g)return {status:"fail",message:g};let c=C(d),n=typeof c?.status=="string"?c.status:"unknown";return n==="failed"?{status:"fail",message:`Workspace run evidence failed for ${t.project}.`}:n==="passed"?{status:"pass",message:`Workspace run evidence passed for ${t.project}.`}:n==="skipped"?{status:"warn",message:`Workspace run evidence skipped for ${t.project}.`}:{status:"warn",message:`Workspace run evidence status is ${n} for ${t.project}.`}}return {status:"missing",message:`Workspace run evidence does not include project ${t.project}.`}}function R(e,t,r){if(!t)return null;if(typeof e!="string"||e.trim().length===0)return `${r} is stale: missing generatedAt timestamp (required after impact ${t}).`;let s=Date.parse(e),i=Date.parse(t);return Number.isFinite(s)?Number.isFinite(i)&&s<i?`${r} is stale: generated at ${e}, before impact ${t}.`:null:`${r} is stale: invalid generatedAt timestamp (required after impact ${t}).`}function Be(e){if(e.id==="workspace.doctor")return r.doctor;if(e.id==="workspace.readiness")return r.readiness;if(e.id==="workspace.contract.verify")return r.contractVerify;if(e.id==="workspace.analyze")return r.analyze;if(e.id==="workspace.pipeline")return "contracts/pipeline-last-run.v1.json"}async function _e(e,t,r,s$1){let i=We(e,t),o=i?m.relative(t,i).split(m.sep).join("/"):void 0;if(e.id==="workspace.contract.verify"&&!r)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"skipped",required:e.required,message:"Workspace contract is not present; contract verify skipped."};let k=i?await f(t,o??""):null;if(!i||!k)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"missing",required:e.required,evidencePath:o,message:o?`Missing evidence report: ${o}`:"No evidence mapping exists for this command."};let u;try{u=await v.readJson(k);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is unreadable JSON: ${n instanceof Error?n.message:String(n)}`}}let d=C(u);if(!d)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:"Evidence report is not a JSON object."};let g=Be(e);if(g)try{a$2(d,g,`${e.label} evidence`);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is invalid: ${n instanceof Error?n.message:String(n)}`}}let c;if(e.id==="workspace.doctor"){let n=R(d.generatedAt,s$1,"Doctor evidence");n?c={status:"fail",message:n}:c=je(d);}else if(e.id==="workspace.readiness"){let n=R(d.generatedAt,s$1,"Release readiness evidence");n?c={status:"fail",message:n}:c=xe(d);}else if(e.id==="workspace.contract.verify"){let n=R(d.generatedAt,s$1,"Workspace contract verify evidence");n?c={status:"fail",message:n}:c=Pe(d);}else if(e.id==="workspace.analyze"){let n=R(d.generatedAt,s$1,"Analyze evidence");n?c={status:"fail",message:n}:c=Ie(d);}else if(e.id==="workspace.pipeline"){let n=R(d.generatedAt,s$1,"Pipeline evidence");n?c={status:"fail",message:n}:c=Oe(d);}else if(e.id==="workspace.doctor-fix"){let n=d.schemaVersion===s.doctorFixResult.schemaVersion?d:d.fixResult,a=C(n),f=typeof a?.generatedAt=="string"?a.generatedAt:void 0,y=R(f,s$1,"Doctor fix result");y?c={status:"fail",message:y}:await Fe(t,f)?c={status:"skipped",message:"No current doctor remediation steps are pending."}:c=Ve(d);}else if(e.id.startsWith("project."))c=De(d,e,s$1);else {let n=R(d.generatedAt,s$1,"Evidence report");n?c={status:"fail",message:n}:c={status:"pass",message:"Evidence report is present."};}return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:c.status,required:e.required,evidencePath:o,message:c.message}}function Ne(e,t={blockingReasons:[],needsAttention:false}){let r=e.filter(n=>n.status==="pass").length,s=e.filter(n=>n.status==="warn").length,i=e.filter(n=>n.status==="fail").length,o=e.filter(n=>n.status==="missing").length,k=e.filter(n=>n.status==="skipped").length,u=e.filter(n=>n.required&&(n.status==="fail"||n.status==="missing")).map(n=>`${n.id}: ${n.message}`),d=e.filter(n=>n.required&&n.status==="missing").length,g="ready",c=0;return u.length>0||t.blockingReasons.length>0?(g="blocked",c=2):(s>0||e.some(n=>!n.required&&n.status==="fail")||d>0||t.needsAttention)&&(g="needs-attention",c=1),{verdict:g,exitCode:c,stepsPassed:r,stepsWarn:s,stepsFailed:i,stepsMissing:o,stepsSkipped:k}}function He(e,t){let r=x(e.affectedProjects.map(a=>a.project?.name).filter(a=>typeof a=="string")),s=new Set(r.map(a=>a.toLowerCase())),i=x(e.transitiveImpact.map(a=>a.project?.name).filter(a=>typeof a=="string").filter(a=>!s.has(a.toLowerCase()))),o=new Map;for(let a of t){if(a.scope!=="project"||!a.project)continue;let f=a.project.toLowerCase(),y=o.get(f)??[];y.push(a),o.set(f,y);}let k=[],u=[],d=[],g=[],c=false,n=(a,f)=>{let y=o.get(a.toLowerCase())??[];if(y.length===0){d.push(a);return}let P=y.filter(p=>p.status==="fail"),b=P.filter(p=>p.required),I=y.filter(p=>p.status==="missing"),E=I.filter(p=>p.required),V=y.some(p=>p.status==="pass"||p.status==="warn");if(b.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has failed verification evidence (${b.map(p=>p.id).join(", ")}).`);return}if(P.length>0){u.push(a),c=true;return}if(E.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has missing required verification evidence (${E.map(p=>p.id).join(", ")}).`);return}if(I.length>0){u.push(a),c=true;return}if(V){k.push(a);return}d.push(a);};for(let a of r)n(a,"directly-changed");for(let a of i)n(a,"transitive dependent");return {subgraph:{totalProjects:r.length+i.length,directlyChanged:r,transitiveDependents:i,covered:x(k),uncovered:x(u),unverifiable:x(d)},blockingReasons:g,needsAttention:c}}function x(e){return [...new Set(e)].sort((t,r)=>t.localeCompare(r))}async function Me(e){let t=m.resolve(e.workspacePath);if(e.fromImpactPath){let o=Ae(t,e.fromImpactPath);return {impact:await ke(o),fromImpactRef:m.relative(t,o).split(m.sep).join("/"),impactFromDisk:true}}let r=m.join(t,g$1);if(await v.pathExists(r))return {impact:await ke(r),fromImpactRef:g$1,impactFromDisk:true};let s=m.join(t,d$3);if(await v.pathExists(s))return {impact:await p$1({workspacePath:t,fromPath:d$3,scope:e.scope,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),fromImpactRef:d$3,impactFromDisk:false};let i=await q$1({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {impact:{schemaVersion:f$1,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",diffRef:p.diff,workspace:{name:i.workspace.name,profile:i.workspace.profile,type:i.workspace.type},summary:{changed:false,risk:"none",affectedProjects:0,workspaceItems:0,recommendedCommands:0,blastRadius:{directlyAffected:0,transitivelyAffected:0,maxDistance:0,graphEdges:m$1(i)?.edges.length??0}},affectedProjects:[],transitiveImpact:[],criticalPathHotspots:[],workspaceImpact:[],verificationPlan:[],agentBrief:{headline:"Baseline workspace verify run.",bullets:["No impact report or snapshot was available; baseline gates were evaluated."],unsafeAssumptions:["Do not claim runtime verification passed unless evidence exists."]},diff:{schemaVersion:q.diff,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",toRef:p.model,fromHash:"baseline",toHash:"baseline",summary:{changed:false,addedProjects:0,removedProjects:0,changedProjects:0,workspaceChanges:0,validationChanges:0,gitChangedFiles:0},git:{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:[],currentModel:i}},impactFromDisk:false}}function Te(e,t){if(t)return e.generatedAt}async function bt(e){let t=m.resolve(e.workspacePath),{impact:r,fromImpactRef:s,impactFromDisk:i}=await Me(e),o$1=r.diff.currentModel,k=i?await q$1({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}):o$1,u=[];if(i){let l=await p$1({workspacePath:t,fromPath:r.diff.fromRef,diff:r.diff,scope:e.scope,now:e.now}),W=[r.affectedProjects,r.transitiveImpact,r.verificationPlan],A=[l.affectedProjects,l.transitiveImpact,l.verificationPlan];JSON.stringify(W)!==JSON.stringify(A)&&u.push("workspace.impact: Persisted impact semantics do not match the impact re-derived from the embedded diff. Regenerate diff and impact.");}i&&d(k)!==r.diff.toHash&&u.push("workspace.impact: Impact evidence is stale because the current workspace model no longer matches the embedded model. Regenerate diff and impact.");let d$2=r.diff.git;if(i&&d$2?.available){let l=a(t,{ref:d$2.ref}),W=r.diff.changes.filter(h=>h.type.startsWith("git.")).map(h=>`${h.type}:${h.target.replace(/^git:/,"")}`).sort(),A=[...l.changedFiles.map(h=>`git.file.changed:${h}`),...l.untrackedFiles.map(h=>`git.untracked:${h}`),...l.deletedFiles.map(h=>`git.deleted:${h}`)].sort();(!l.available||l.commit!==d$2.commit||JSON.stringify(A)!==JSON.stringify(W))&&u.push("workspace.impact: Impact evidence is stale because Git changes no longer match the diff observation. Regenerate diff and impact.");}let g=Te(r,i),c$1=Ee([...o(),...r.verificationPlan]).filter(l=>Se(e.scope,l)),n=[];for(let l of c$1)n.push(await _e(l,t,o$1.contracts.exists===true,g));let a$2=He(r,n),f=a$1(m$1(o$1)??{nodes:[],edges:[]}),y=b(o$1),P=await Ke(t),b$2=c(y,P?.freshness?.projectHashes),I={verdict:b$2.verdict,baseline:b$2.baseline,changed:b$2.changed,added:b$2.added,removed:b$2.removed,projectHashes:d$1(y)},E=b$1(f),V=o$1.policies?.mode??"warn",p=await Le(o$1,t),B=qe(V,p),S=Ne(n,{blockingReasons:[...a$2.blockingReasons,...E,...B.blockingReasons,...u],needsAttention:a$2.needsAttention||B.needsAttention}),he=n.filter(l=>l.status==="missing"&&l.evidencePath).map(l=>l.evidencePath),_=[...n.filter(l=>l.required&&(l.status==="fail"||l.status==="missing")).map(l=>`${l.id}: ${l.message}`),...a$2.blockingReasons,...E,...B.blockingReasons,...u],ve=p.filter(l=>l.severity==="error").length,be=o$1.summary?.projectCount??o$1.projects.length,U=ge({projectCount:be,verdict:S.verdict,exitCode:S.exitCode,blockingReasons:_,policyErrorCount:ve});S.verdict=U.verdict,S.exitCode=U.exitCode;let Y=Array.from(new Set(_.map(l=>l.trim()).filter(Boolean))).slice(0,12).map((l,W)=>{let A=n.find(h=>l.startsWith(`${h.id}:`));return me({reason:l,blockerId:`blocker-${W+1}`,sourceCommand:A?.command.display,sourceArtifact:A?.evidencePath,verifyCommand:"npx workspai workspace verify --from-impact .workspai/reports/workspace-impact-last-run.json --json",verifyArtifact:G})});return {schemaVersion:ye,generatedAt:(e.now??new Date).toISOString(),workspacePath:t,mode:"evidence",fromImpactRef:s,scope:e.scope,impact:{changed:r.summary.changed,risk:r.summary.risk,affectedProjects:r.summary.affectedProjects,recommendedCommands:r.summary.recommendedCommands},summary:S,steps:n,missingEvidence:he,blockingReasons:_,...Y.length>0?{resolutionHints:Y}:{},verificationPlan:c$1,affectedSubgraph:a$2.subgraph,graphIntegrity:f,freshness:I,policyMode:V,policyViolations:p}}async function Le(e,t){let r=[];for(let i of e.validation?.issues??[])r.push({source:"model",severity:i.severity,code:i.code,message:i.message,target:i.target});let s=await f(t,p.contractVerify);try{if(s&&await v.pathExists(s)){let i=await v.readJson(s);if(Array.isArray(i.violations))for(let o of i.violations)typeof o=="string"&&o.trim().length>0&&r.push({source:"contract",severity:"error",code:"contract.violation",message:o});}}catch{}return r.sort((i,o)=>i.source!==o.source?i.source.localeCompare(o.source):i.code!==o.code?i.code.localeCompare(o.code):i.message.localeCompare(o.message))}function qe(e,t){let r=t.filter(s=>s.severity==="error");return e==="enforce"&&r.length>0?{blockingReasons:r.map(s=>`policy.${s.code}: ${s.message}`),needsAttention:false}:{blockingReasons:[],needsAttention:r.length>0}}async function Ke(e){let t=m.join(e,G);try{if(!await v.pathExists(t))return null;let r=await v.readJson(t);return r&&r.schemaVersion===ye?r:null}catch{return null}}async function wt(e,t){return g(t,G,d$2(e))}function ze(e,t){let r=t?.strict?"strict":"default",s=[];if(e.summary.verdict==="blocked")return s.push(...e.blockingReasons),s.length===0&&s.push("verify verdict is blocked."),{passed:false,mode:r,exitCode:2,reasons:s};if(r==="strict"){if(e.summary.verdict!=="ready"&&s.push(`verify verdict is ${e.summary.verdict} (strict requires ready).`),e.freshness.verdict==="stale"){let i=[...e.freshness.changed,...e.freshness.added].slice(0,5);s.push(`freshness is stale${i.length>0?`: ${i.join(", ")}`:""} (strict requires fresh).`);}if(s.length>0)return {passed:false,mode:r,exitCode:1,reasons:s}}return {passed:true,mode:r,exitCode:0,reasons:s}}function Rt(e,t){return ze(e,t).exitCode}export{fe as a,tt as b,ye as c,G as d,He as e,bt as f,wt as g,ze as h,Rt as i};
@@ -1,4 +0,0 @@
1
- import {a}from'./chunk-FIK343LI.js';import {c as c$1}from'./chunk-ABMB6MJT.js';import {l,q as q$1}from'./chunk-BM2F5C4J.js';import {f,g as g$1,h as h$3}from'./chunk-W6WRT77T.js';import {a as a$2}from'./chunk-MBICKDYP.js';import {h as h$1,g,b as b$1,c as c$2,a as a$3,j as j$1}from'./chunk-OZXCNVGW.js';import {b as b$3}from'./chunk-K33JJVQZ.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {c,d}from'./chunk-EWZZUQBR.js';import {h as h$2,i,m,k,n,o,l as l$1,j,s,f as f$1,g as g$2,e}from'./chunk-ODK4LCEL.js';import {a as a$5}from'./chunk-FB7SCXAZ.js';import {b as b$2}from'./chunk-25AWHAB5.js';import {a as a$4}from'./chunk-XWKGZRHN.js';import {randomUUID,createHash}from'crypto';import C from'path';import L from'fs-extra';var Be=new Set(["committed","rejected","aborted","superseded"]);function h(e,a){if(!e)throw new Error(`Decision protocol violation: ${a}`)}function Je(e){return [...new Set(e)].sort()}function xe(e,a){return a.digestCanonical(e.effects.map(t=>({id:t.id,status:t.status,key:t.idempotencyKey})))}function He(e,a,t){h(!e.some(r=>r.id===a),`${t} receipt '${a}' already exists`);}function Fe(e,a){He(e.effects,a.id,"effect");let t=e.effects.find(r=>r.idempotencyKey===a.idempotencyKey);return h(!t,`effect idempotency key '${a.idempotencyKey}' was already recorded by '${t?.id}'`),[...e.effects,a]}function Ye(e,a,t){return He(e.verifications,a.id,"verification"),h(a.target.effectHeadDigest===xe(e,t),`verification '${a.id}' does not bind the current effect head`),[...e.verifications,a]}function Xe(e){return e.requiredCriteria.every(a=>{let t=e.verifications.filter(r=>r.criterionId===a);return t.length>0&&t.at(-1)?.status==="passed"})}function Qe(e$1,a,t){if(a.kind==="created"){h(e$1===null,"created must be the first event");let y=a.payload.references?.[0];h(y,"created must bind an intent artifact");let p=a.payload.references?.filter(g=>g.role==="success-criterion").map(g=>g.artifact)??[];return {schemaVersion:e,id:a.transactionId,purpose:"proof-carrying-change",createdAt:a.occurredAt,updatedAt:a.occurredAt,state:"draft",generation:1,eventCount:a.sequence,eventHeadDigest:a.digest,intent:y,requiredCriteria:Je(p),scope:null,evidence:[],plans:[],authorization:null,effects:[],verifications:[],blockers:[]}}h(e$1,`${a.kind} cannot occur before created`),h(!Be.has(e$1.state),`${a.kind} cannot follow terminal state ${e$1.state}`);let r=e$1.state,n=e$1.scope,i=e$1.evidence,s=e$1.plans,d=e$1.authorization,o=e$1.effects,c=e$1.verifications,l=e$1.blockers,m=e$1.terminalReason;switch(a.kind){case "scope-bound":h(e$1.state==="draft"||e$1.state==="scoped","scope-bound requires draft or scoped state"),h(a.payload.scope,"scope-bound requires scope"),n=a.payload.scope,r="scoped";break;case "evidence-attached":h(e$1.state==="scoped"||e$1.state==="evidence-ready","evidence-attached requires scoped state"),h((a.payload.references?.length??0)>0,"evidence-attached requires references"),i=[...i,...a.payload.references??[]],r="evidence-ready";break;case "plan-attached":h(e$1.state==="evidence-ready","plan-attached requires evidence-ready state"),h((a.payload.references?.length??0)>0,"plan-attached requires references"),s=[...s,...a.payload.references??[]];break;case "authorized":h(e$1.state==="evidence-ready","authorization requires evidence-ready state"),h(a.payload.authorization,"authorized requires a bounded authorization grant"),d=a.payload.authorization,r="authorized";break;case "effect-requested":h(e$1.state==="authorized"||e$1.state==="executing","effect-requested requires authorization"),r="executing";break;case "effect-recorded":h(e$1.state==="authorized"||e$1.state==="executing","effect-recorded requires authorization"),h(a.payload.effect,"effect-recorded requires a receipt"),h(d?.effectClasses.includes(a.payload.effect.effectClass),`effect class '${a.payload.effect.effectClass}' is outside the authorization grant`),o=Fe(e$1,a.payload.effect),r=a.payload.effect.status==="succeeded"?"executing":"blocked",a.payload.effect.status!=="succeeded"&&(l=[...l,{code:a.payload.effect.status==="uncertain"?"decision.effect.uncertain":"decision.effect.failed",actionable:true,details:a.payload.effect.summary}]);break;case "effect-uncertain":h(e$1.state==="authorized"||e$1.state==="executing","effect-uncertain requires an active execution"),r="blocked",l=[...l,a.payload.blocker??{code:"decision.effect.uncertain",actionable:true}];break;case "verification-started":h(e$1.state==="authorized"||e$1.state==="executing","verification-started requires authorized or executing state"),r="verifying";break;case "verification-recorded":{h(e$1.state==="verifying","verification-recorded requires verifying state"),h(a.payload.verification,"verification-recorded requires a receipt"),c=Ye(e$1,a.payload.verification,t),r=a.payload.verification.status==="failed"?"blocked":a.payload.verification.status==="inconclusive"?"awaiting-human":"verifying";break}case "human-required":r="awaiting-human";break;case "blocked":h(a.payload.blocker,"blocked requires a structured blocker"),l=[...l,a.payload.blocker],r="blocked";break;case "resumed":h(e$1.state==="blocked"||e$1.state==="awaiting-human","resumed requires a paused state"),h(a.payload.resumeTo,"resumed requires an explicit target state"),r=a.payload.resumeTo,l=[];break;case "committed":h(e$1.state==="verifying","commit requires verifying state"),h(Xe(e$1),"every required criterion needs a latest passing receipt"),h(!e$1.effects.some(y=>y.status!=="succeeded"),"all effects must be certainly successful"),r="committed",m=a.payload.reason??a.payload.summary;break;case "rejected":case "aborted":case "superseded":r=a.kind,m=a.payload.reason??a.payload.summary;break;default:throw new Error(`Decision protocol violation: unsupported event ${a.kind}`)}return {...e$1,updatedAt:a.occurredAt,state:r,generation:e$1.generation+1,eventCount:a.sequence,eventHeadDigest:a.digest,scope:n,evidence:i,plans:s,authorization:d,effects:o,verifications:c,blockers:l,...m?{terminalReason:m}:{}}}function Te(e,a,t,r){let n=(a?.sequence??0)+1,i={schemaVersion:f$1,transactionId:e,sequence:n,kind:t.kind,occurredAt:t.occurredAt,actor:t.actor,previousEventDigest:a?.digest??null,payload:t.payload};return {...i,digest:r.digestCanonical(i)}}function N(e,a){h(e.length>0,"at least one event is required");let t=null,r=null;for(let n of e){h(n.schemaVersion===f$1,`unsupported event schema ${n.schemaVersion}`),h(n.sequence===(r?.sequence??0)+1,`event sequence ${n.sequence} is not contiguous`),h(n.previousEventDigest===(r?.digest??null),`event ${n.sequence} has an invalid previous digest`);let{digest:i,...s}=n;h(n.digest===a.digestCanonical(s),`event ${n.sequence} digest is invalid`),h(!r||n.transactionId===r.transactionId,"events cross transaction boundaries"),t=Qe(t,n,a),r=n;}return t}function ae(e,a,t){return {schemaVersion:g$2,transactionId:e.id,generatedAt:a,generation:e.generation,eventCount:e.eventCount,eventHeadDigest:e.eventHeadDigest,state:e.state,transactionDigest:t.digestCanonical(e)}}function W(e,a){return xe(e,a)}var H={digestCanonical:c};function ea(e){let a=e.trim();if(!/^change-[a-z0-9][a-z0-9-]{7,95}$/.test(a))throw new Error(`Invalid decision transaction id: ${e}`);return a}function K(e){let t=`.workspai/decisions/${ea(e)}`;return {directory:t,transaction:`${t}/transaction.json`,checkpoint:`${t}/checkpoint.json`,events:`${t}/events.jsonl`,lock:`${t}.lock`}}function aa(e,a){return e.split(/\r?\n/).filter(r=>r.trim().length>0).map((r,n)=>{try{return JSON.parse(r)}catch(i){throw new Error(`Decision event log is corrupt at ${a}:${n+1}: ${i.message}`)}})}async function _e(e,a){let t=K(a),r=await b$1(e,t.events);return r?aa(await L.readFile(r,"utf8"),r):[]}function je(e,a){let t=K(a);return {directory:a$3(e,t.directory),transaction:a$3(e,t.transaction),checkpoint:a$3(e,t.checkpoint),events:a$3(e,t.events)}}async function ta(e,a,t,r){let n=K(a.id),i=ae(a,r,H);for(let[s,d]of t.entries())a$1(d,"contracts/workspace-intelligence/decision-event.v1.json",`Decision event ${s+1}`);return b$3(n.transaction,a),b$3(n.checkpoint,i),await j$1(e,n.events,`${t.map(s=>JSON.stringify(s)).join(`
2
- `)}
3
- `),await g(e,n.transaction,a),await g(e,n.checkpoint,i),{transaction:a,checkpoint:i,events:t,paths:je(e,a.id)}}async function Ke(e){let a=K(e.transactionId),t=a$3(e.workspacePath,a.lock);return a$4(t,async()=>{let r=await _e(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&&N(r,H);let i=Te(e.transactionId,n,e.event,H),s=[...r,i],d=N(s,H);return ta(e.workspacePath,d,s,e.event.occurredAt)},{purpose:`decision:${e.transactionId}`,timeoutMs:3e4,staleMs:6e4})}async function qe(e,a){let t=await _e(e,a);if(t.length===0)throw new Error(`Decision transaction not found: ${a}`);let r=N(t,H),n=ae(r,r.updatedAt,H);return {transaction:r,checkpoint:n,events:t,paths:je(e,a)}}function q(e){return K(e).directory}var ne={digestCanonical:c};function ia(e){let a=e.trim();if(!/^change-[a-z0-9][a-z0-9-]{7,95}$/.test(a))throw new Error(`Invalid proof-carrying change id: ${e}`);return a}function b(e){let t=`.workspai/changes/${ia(e)}`;return {directory:t,lease:`${t}/lease.json`,prediction:`${t}/predicted-overlay.json`,actualOverlay:`${t}/actual-overlay.json`,surprises:`${t}/architecture-surprises.json`,capsule:`${t}/capsule.json`,privateBaselineGraph:`${t}/private/baseline-graph.json`}}function sa(e,a){return {kind:e,id:a}}function $(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 I(e,a){let t=await b$1(e,a);return t?await L.readJson(t):null}async function oa(e){let t=(await I(e,s.workspaceContract.artifactPath))?.workspace?.name;if(typeof t=="string"&&t.trim())return t.trim();let r=await I(e,".workspai/workspace.json"),n=r?.workspace_name??r?.name;return typeof n=="string"&&n.trim()?n.trim():C.basename(e)}async function ie(e,a){let t=await c$2(e,a.artifact);if(!t)return false;if(a.digest.semantics==="raw-bytes-v1"){let i=await L.readFile(t);return createHash("sha256").update(i).digest("hex")===a.digest.value}let r=await L.readJson(t).catch(()=>null);return r?(a.digest.semantics==="workspace-model-structural-v1"?d(r):c(r))===a.digest.value:false}async function ca(e,a){let t=await I(e,b(a).lease);if(!t||t.schemaVersion!==h$2)throw new Error(`Architecture lease is missing or unsupported for ${a}.`);if(t.changeId!==a)throw new Error(`Architecture lease binding failed for ${a}.`);return t}async function U(e){let a=await a$2(e);if(a.status==="miss")throw new Error(`A current canonical Model and Graph are required (${a.reason}). Run workspai workspace intelligence run --for-agent generic --strict --json.`);return a}function da(e,a,t){return c({modelHash:e,graphHash:a,inputHash:t})}function B(e){let a=d(e.model),t=c(e.graph),r=e.graph.source.inputs?.hash;if(!r)throw new Error("The canonical Graph has no live input fingerprint.");return {modelHash:a,graphHash:t,inputHash:r,generation:da(a,t,r)}}async function ze(e,a){let t=await U(e),r=B(t);if(r.generation!==a.generation)throw new Error(`Architecture lease ${a.changeId} is stale. Expected generation ${a.generation}, observed ${r.generation}. Abort or begin a new change from current evidence.`);return t}function w(e,a,t,r,n=new Date().toISOString()){return {kind:e,payload:a,occurredAt:n,actor:sa(t,r)}}async function v(e,a,t,r){return Ke({workspacePath:e,transactionId:t,expectedHeadDigest:a?.transaction.eventHeadDigest??null,event:r})}function V(e,a,t){return `${e}\0${a}\0${t}`}function la(e){let a=[];for(let[t,r]of [["entity",e.entities],["relation",e.relations],["proof",e.proofs]])a.push(...r.added.map(n=>({operation:"add",targetKind:t,targetId:n.id}))),a.push(...r.removed.map(n=>({operation:"remove",targetKind:t,targetId:n.id}))),a.push(...r.changed.map(n=>({operation:"change",targetKind:t,targetId:n.id})));return a.push(...e.changedArtifacts.map(t=>({operation:"change",targetKind:"artifact",targetId:t}))),a.sort((t,r)=>V(t.operation,t.targetKind,t.targetId).localeCompare(V(r.operation,r.targetKind,r.targetId)))}function ga(e){let a=e.prediction?.operations.map(c=>({operation:c.operation,targetKind:c.targetKind,targetId:c.targetId}))??[],t=la(e.actual),r=new Set(a.map(c=>V(c.operation,c.targetKind,c.targetId))),n=new Set(t.map(c=>V(c.operation,c.targetKind,c.targetId))),i=t.filter(c=>r.has(V(c.operation,c.targetKind,c.targetId))),s=t.filter(c=>!r.has(V(c.operation,c.targetKind,c.targetId))),d=a.filter(c=>!n.has(V(c.operation,c.targetKind,c.targetId))),o=e.prediction?s.length===0&&d.length===0?"exact":s.length===0?"within-expectation":"surprising":"no-prediction";return {schemaVersion:j,changeId:e.changeId,generatedAt:e.generatedAt,prediction:e.predictionReference,actual:e.actualReference,matched:i,unpredicted:s,missing:d,summary:{predicted:a.length,actual:t.length,matched:i.length,unpredicted:s.length,missing:d.length,verdict:o}}}async function te(e){let a=await I(e.workspacePath,e.relativePath);return a?$({role:e.role,artifact:e.relativePath,schemaVersion:e.schemaVersion,value:c(a)}):null}function ha(e){let{integrity:a,...t}=e;return t}async function se(e){let a=b(e.lease.changeId),[t,r,n]=await Promise.all([te({workspacePath:e.workspacePath,relativePath:a.prediction,role:"prediction",schemaVersion:i}),te({workspacePath:e.workspacePath,relativePath:a.actualOverlay,role:"actual-architecture-overlay",schemaVersion:a$5}),te({workspacePath:e.workspacePath,relativePath:a.surprises,role:"architecture-surprises",schemaVersion:j})]),i$1=$({role:"decision-transaction",artifact:`${q(e.lease.changeId)}/transaction.json`,schemaVersion:e.record.transaction.schemaVersion,value:c(e.record.transaction)}),s=e.record.transaction.effects.flatMap(f=>f.artifacts),d=e.record.transaction.verifications.flatMap(f=>f.artifacts),o=await I(e.workspacePath,a.actualOverlay),c$1=o?!re(o):false,l=[{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(f=>f.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(f=>f.status==="failed")?"failed":"pending",summary:`${e.record.transaction.verifications.length} independent verification receipt(s) are recorded.`}],m=await I(e.workspacePath,a.surprises),y=[...e.record.transaction.effects.length===0&&o&&re(o)?["No typed effect receipt explains the observed architecture generation."]:[],...m?.summary.unpredicted?[`${m.summary.unpredicted} actual architecture operation(s) were not predicted.`]:[],...e.record.transaction.blockers.map(f=>f.details??f.code)],p=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(f=>f.status==="passed")?"verified":"open",g={schemaVersion:k,changeId:e.lease.changeId,goalId:e.lease.goalId,generatedAt:e.record.transaction.updatedAt,status:p,workspace:e.lease.workspace,scope:e.lease.scope,decision:{transaction:i$1,eventHeadDigest:e.record.transaction.eventHeadDigest,effectHeadDigest:W(e.record.transaction,ne),state:e.record.transaction.state,generation:e.record.transaction.generation},intent:e.record.transaction.intent,baseline:e.lease.baseline,prediction:t,actualOverlay:r,surpriseReport:n,effects:s,verification:d,assurances:l,remainingUncertainty:[...new Set(y)]};return {...g,integrity:{algorithm:"sha256",semantics:"canonical-json-v1",capsuleDigest:c(g)}}}async function D(e,a,t){let r=await se({workspacePath:e,lease:a,record:t});return await g(e,b(a.changeId).capsule,r),r}function E(e){let a=b(e.lease.changeId),t={schemaVersion:l$1,operation:e.operation,changeId:e.lease.changeId,state:e.record.transaction.state,capsule:e.capsule,artifacts:{lease:a.lease,prediction:e.capsule.prediction?.artifact??null,actualOverlay:e.capsule.actualOverlay?.artifact??null,surpriseReport:e.capsule.surpriseReport?.artifact??null,transaction:`${q(e.lease.changeId)}/transaction.json`,events:`${q(e.lease.changeId)}/events.jsonl`,capsule:a.capsule},nextActions:e.nextActions};return a$1(t,"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:a.capsule,role:"output",provenance:"authoritative"},{kind:"artifact",ref:`${q(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}}),t}async function A(e,a){let t=await ca(e,a),r=await qe(e,a);return {lease:t,record:r}}async function Wa(e){let a=C.resolve(e.workspacePath),t=await l({workspacePath:a,goalId:e.goalId,validateBindings:true}),r=t.goalPack;if(!r||!t.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 U(a),i=B(n);if(i.modelHash!==r.sourceBinding.model.hash||(r.sourceBinding.graph.inputHash?i.inputHash!==r.sourceBinding.graph.inputHash:i.graphHash!==r.sourceBinding.graph.hash))throw new Error(`Goal ${r.id} is no longer bound to the current architecture generation.`);let s=`change-${r.intent.category}-${randomUUID().replace(/-/g,"").slice(0,16)}`,d=b(s),o=new Date().toISOString(),c$1=c(n.graph),l$1={schemaVersion:h$2,changeId:s,goalId:r.id,createdAt:o,workspace:r.workspace,scope:{kind:r.scope.kind,projects:[...r.scope.projects]},baseline:{model:$({role:"baseline-model",artifact:r.sourceBinding.model.artifact,schemaVersion:r.sourceBinding.model.schemaVersion,value:r.sourceBinding.model.hash,semantics:"workspace-model-structural-v1"}),graph:{...$({role:"baseline-graph",artifact:r.sourceBinding.graph.artifact,schemaVersion:r.sourceBinding.graph.schemaVersion,value:i.graphHash}),inputHash:i.inputHash}},generation:i.generation,semantics:"optimistic-generation-guard",privateMaterialization:{artifact:d.privateBaselineGraph,role:"hash-bound-baseline-cache",portable:false,authoritative:false,digest:{algorithm:"sha256",semantics:"canonical-json-v1",value:c$1}}};await h$1(a,d.lease,[{relativePath:d.privateBaselineGraph,payload:n.graph},{relativePath:d.lease,payload:l$1}]);let m=e.actorKind??"cli",y=e.actorId??"workspai-change",p=$({role:"intent",artifact:t.active.goalPack,schemaVersion:r.schemaVersion,value:c(r)}),g=r.successCriteria.map(T=>$({role:"success-criterion",artifact:T.id,schemaVersion:"workspai.goal-success-criterion.v1",value:c(T)})),f=await v(a,null,s,w("created",{summary:`Begin proof-carrying change for ${r.id}.`,references:[p,...g]},m,y,o));f=await v(a,f,s,w("scope-bound",{summary:"Bind immutable Goal scope.",scope:l$1.scope},m,y)),f=await v(a,f,s,w("evidence-attached",{summary:"Attach exact architecture generation and lease.",references:[l$1.baseline.model,{role:l$1.baseline.graph.role,artifact:l$1.baseline.graph.artifact,schemaVersion:l$1.baseline.graph.schemaVersion,digest:l$1.baseline.graph.digest},$({role:"architecture-lease",artifact:d.lease,schemaVersion:l$1.schemaVersion,value:c(l$1)})]},m,y)),await q$1({workspacePath:a,goalId:r.id,changeId:s});let P=await D(a,l$1,f);return E({operation:"begin",lease:l$1,record:f,capsule:P,nextActions:[`workspai change predict --change ${s} --file <prediction.json> --json`,`workspai change authorize --change ${s} --effects filesystem,command --json`]})}async function Ma(e){let{lease:a,record:t}=await A(e.workspacePath,e.changeId);if(await ze(e.workspacePath,a),t.transaction.state!=="evidence-ready")throw new Error(`Prediction requires evidence-ready state, observed ${t.transaction.state}.`);let r={...e.prediction,schemaVersion:i,changeId:e.changeId,goalId:a.goalId,baselineGeneration:a.generation,nonCanonical:true,proofEligible:false,operations:[...e.prediction.operations].sort((d,o)=>V(d.operation,d.targetKind,d.targetId).localeCompare(V(o.operation,o.targetKind,o.targetId)))};await g(e.workspacePath,b(e.changeId).prediction,r);let n=$({role:"noncanonical-prediction",artifact:b(e.changeId).prediction,schemaVersion:r.schemaVersion,value:c(r)}),i$1=await v(e.workspacePath,t,e.changeId,w("plan-attached",{summary:"Attach an explicitly noncanonical architecture prediction.",references:[n]},e.actorKind??"agent",e.actorId??"workspai-agent")),s=await D(e.workspacePath,a,i$1);return E({operation:"predict",lease:a,record:i$1,capsule:s,nextActions:[`workspai change authorize --change ${e.changeId} --effects filesystem,command --json`]})}async function La(e){let{lease:a,record:t}=await A(e.workspacePath,e.changeId);if(await ze(e.workspacePath,a),e.effectClasses.length===0)throw new Error("Authorization requires at least one effect class.");let r=await v(e.workspacePath,t,e.changeId,w("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 D(e.workspacePath,a,r);return E({operation:"authorize",lease:a,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 Ua(e){let{lease:a,record:t}=await A(e.workspacePath,e.changeId);if(t.transaction.state!=="blocked"&&t.transaction.state!=="awaiting-human")throw new Error(`Resume requires blocked or awaiting-human state, observed ${t.transaction.state}.`);let r=await v(e.workspacePath,t,e.changeId,w("resumed",{summary:e.reason,reason:e.reason,resumeTo:e.resumeTo},"human",e.actorId)),n=await D(e.workspacePath,a,r);return E({operation:"resume",lease:a,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 Ba(e){let{lease:a,record:t}=await A(e.workspacePath,e.changeId);for(let i of e.receipt.artifacts)if(!await ie(e.workspacePath,i))throw new Error(`Effect artifact is missing or corrupt: ${i.artifact}`);let r=await v(e.workspacePath,t,e.changeId,w("effect-recorded",{summary:e.receipt.summary,effect:e.receipt},e.actorKind??"agent",e.actorId??"workspai-agent")),n=await D(e.workspacePath,a,r);return E({operation:"effect-record",lease:a,record:r,capsule:n,nextActions:r.transaction.state==="blocked"?[`workspai change status --change ${e.changeId} --json`]:[`workspai change verify --change ${e.changeId} --json`]})}async function Ja(e){let a=C.resolve(e.workspacePath),{lease:t,record:r}=await A(a,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 U(a),i=b(e.changeId),[s,d]=await Promise.all([I(a,i.actualOverlay),I(a,i.surprises)]),o=r.transaction.verifications.some(f=>f.criterionId==="workspace-verify"&&f.status==="passed");if(!s||!d||!o)throw new Error("Domain verification can be admitted only after change verify re-observes the Graph and records a passing Workspace Verify receipt.");let c=B(n),l=W(r.transaction,ne);if(e.receipt.target.modelHash!==c.modelHash||e.receipt.target.graphHash!==c.graphHash||e.receipt.target.effectHeadDigest!==l)throw new Error("Verification receipt does not target the current Model, Graph, and effect head.");for(let f of e.receipt.artifacts)if(!await ie(a,f))throw new Error(`Verification artifact is missing or corrupt: ${f.artifact}`);let m=e.actorKind??"ci",y=e.actorId??"workspai-verifier",p=r;if(p.transaction.state==="blocked"){if(!p.transaction.blockers.every(P=>P.code==="change.verification.criteria_missing"))throw new Error("The change is blocked by a condition that a verification receipt cannot resume.");p=await v(a,p,e.changeId,w("resumed",{summary:"Resume to admit a missing verification receipt.",resumeTo:"verifying"},m,y));}else if(p.transaction.state!=="verifying")throw new Error(`Verification receipt requires verifying or criteria-blocked state; observed ${p.transaction.state}.`);p=await v(a,p,e.changeId,w("verification-recorded",{summary:e.receipt.summary,verification:e.receipt},m,y)),p.transaction.state==="verifying"&&p.transaction.requiredCriteria.every(P=>p.transaction.verifications.filter(G=>G.criterionId===P).at(-1)?.status==="passed")&&(p=await v(a,p,e.changeId,w("committed",{summary:"Seal the independently verified proof-carrying change."},m,y)));let g=await D(a,t,p);return E({operation:"verification-record",lease:t,record:p,capsule:g,nextActions:p.transaction.state==="committed"?[`workspai change capsule validate --change ${e.changeId} --json`]:[`workspai change status --change ${e.changeId} --json`]})}function M(e,a,t,r="verification"){return $({role:r,artifact:e,schemaVersion:a,value:c(t)})}function re(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 Ge(e){return e.replace(/\\/g,"/").replace(/^\.\//,"")}async function Fa(e){let a$1=C.resolve(e.workspacePath),{lease:t,record:r}=await A(a$1,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:a$1,strict:false,agent:"generic"});let n=await U(a$1),i=await I(a$1,t.privateMaterialization.artifact);if(!i||c(i)!==t.privateMaterialization.digest.value)throw new Error(`The hash-bound baseline materialization is missing or corrupt for ${e.changeId}.`);let s=new Date().toISOString(),d=a(i,n.graph,new Date(s)),o=b(e.changeId);await g(a$1,o.actualOverlay,d);let c$2=M(o.actualOverlay,d.schemaVersion,d,"actual-architecture-overlay"),l=await I(a$1,o.prediction),m=l?M(o.prediction,l.schemaVersion,l,"noncanonical-prediction"):null,y=ga({changeId:e.changeId,generatedAt:s,prediction:l,predictionReference:m,actual:d,actualReference:c$2});await g(a$1,o.surprises,y);let p=M(o.surprises,y.schemaVersion,y,"architecture-surprises"),g$2=r,f$1=e.actorKind??"cli",P=e.actorId??"workspai-change-verify";if(re(d)&&g$2.transaction.effects.length===0){g$2=await v(a$1,g$2,e.changeId,w("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."}},f$1,P));let k=await D(a$1,t,g$2);return E({operation:"verify",lease:t,record:g$2,capsule:k,nextActions:[`workspai change resume --change ${e.changeId} --to authorized --reason "Record missing effect receipt" --json`]})}let T=new Set(g$2.transaction.effects.filter(k=>k.status==="succeeded").flatMap(k=>k.artifacts).map(k=>Ge(k.artifact))),G=d.changedArtifacts.filter(k=>!T.has(Ge(k)));if(G.length>0){g$2=await v(a$1,g$2,e.changeId,w("blocked",{summary:"Observed architecture artifacts are not covered by typed effect receipts.",blocker:{code:"change.effect_receipt.coverage_missing",actionable:true,details:`Uncovered artifacts: ${G.slice(0,20).join(", ")}`}},f$1,P));let k=await D(a$1,t,g$2);return E({operation:"verify",lease:t,record:g$2,capsule:k,nextActions:[`workspai change resume --change ${e.changeId} --to authorized --reason "Cover observed artifacts" --json`]})}g$2=await v(a$1,g$2,e.changeId,w("verification-started",{summary:"Begin independent post-effect verification."},f$1,P));let Ne=await f({workspacePath:a$1}),We=await g$1(Ne,a$1),J=C.relative(a$1,We).split(C.sep).join("/"),_=await I(a$1,J);if(!_)throw new Error(`Workspace Verify evidence was not persisted at ${J}.`);let O=h$3(_,{strict:e.strict===true}),ce=B(n),de={id:`verify-workspace-${c({generatedAt:s,verify:_,gate:O}).slice(0,16)}`,criterionId:"workspace-verify",status:O.passed?"passed":"failed",summary:O.passed?`Workspace Verify passed in ${O.mode} mode.`:`Workspace Verify blocked in ${O.mode} mode: ${O.reasons.join("; ")}`,target:{modelHash:ce.modelHash,graphHash:ce.graphHash,effectHeadDigest:W(g$2.transaction,ne)},artifacts:[M(J,_.schemaVersion,_),c$2,p],observedAt:s};if(g$2=await v(a$1,g$2,e.changeId,w("verification-recorded",{summary:de.summary,verification:de},f$1,P)),g$2.transaction.state==="verifying"){let k=g$2.transaction.requiredCriteria.filter(Le=>g$2.transaction.verifications.filter(Ue=>Ue.criterionId===Le).at(-1)?.status!=="passed");k.length>0?g$2=await v(a$1,g$2,e.changeId,w("blocked",{summary:"Required outcome verification is incomplete.",blocker:{code:"change.verification.criteria_missing",actionable:true,details:`Missing passing receipts: ${k.join(", ")}`}},f$1,P)):g$2=await v(a$1,g$2,e.changeId,w("committed",{summary:"Seal the independently verified proof-carrying change."},f$1,P));}let Me=await D(a$1,t,g$2);return E({operation:"verify",lease:t,record:g$2,capsule:Me,nextActions:g$2.transaction.state==="committed"?[`workspai change capsule validate --change ${e.changeId} --json`]:[`workspai change status --change ${e.changeId} --json`]})}async function Ya(e){let{lease:a,record:t}=await A(e.workspacePath,e.changeId),r=await se({workspacePath:e.workspacePath,lease:a,record:t});return E({operation:e.operation??"status",lease:a,record:t,capsule:r,nextActions:t.transaction.state==="evidence-ready"?[`workspai change authorize --change ${e.changeId} --effects filesystem,command --json`]:t.transaction.state==="authorized"||t.transaction.state==="executing"?[`workspai change verify --change ${e.changeId} --json`]:[]})}async function Xa(e){let a=C.resolve(e.workspacePath),t=await b$1(a,".workspai/changes","directory"),n=(t?await L.readdir(t,{withFileTypes:true}):[]).filter(o=>o.isDirectory()&&/^change-[a-z0-9][a-z0-9-]{7,95}$/.test(o.name)).map(o=>o.name).sort(),i=[],s=null;for(let o of n)try{let{lease:c,record:l}=await A(a,o);s??=c.workspace.name;let m=await se({workspacePath:a,lease:c,record:l}),y=await oe({workspacePath:a,changeId:o});i.push({changeId:o,goalId:c.goalId,state:l.transaction.state,status:m.status,createdAt:l.transaction.createdAt,updatedAt:l.transaction.updatedAt,scope:c.scope,assurance:{passed:m.assurances.filter(p=>p.status==="passed").length,total:m.assurances.length},blockers:l.transaction.blockers.map(p=>p.details??p.code),capsuleArtifact:b(o).capsule,valid:y.valid,errors:y.errors});}catch(c){i.push({changeId:o,goalId:null,state:null,status:"invalid",createdAt:null,updatedAt:null,scope:null,assurance:{passed:0,total:5},blockers:[],capsuleArtifact:b(o).capsule,valid:false,errors:[c instanceof Error?c.message:String(c)]});}i.sort((o,c)=>(c.updatedAt??"").localeCompare(o.updatedAt??"")||o.changeId.localeCompare(c.changeId));let d={schemaVersion:m,generatedAt:new Date().toISOString(),workspace:{name:s??await oa(a)},changes:i,summary:{total:i.length,open:i.filter(o=>o.status==="open"||o.status==="verified").length,blocked:i.filter(o=>o.status==="blocked").length,sealed:i.filter(o=>o.status==="sealed").length,aborted:i.filter(o=>o.status==="aborted").length,invalid:i.filter(o=>!o.valid).length}};return a$1(d,"contracts/workspace-intelligence/proof-carrying-change-list.v1.json","Proof-Carrying Change list"),d}async function Qa(e){let{lease:a,record:t}=await A(e.workspacePath,e.changeId),r=await v(e.workspacePath,t,e.changeId,w("aborted",{summary:e.reason,reason:e.reason},"human",e.actorId)),n=await D(e.workspacePath,a,r);return E({operation:"abort",lease:a,record:r,capsule:n,nextActions:[]})}async function oe(e){let a=b(e.changeId),t=await I(e.workspacePath,a.capsule);if(!t)throw new Error(`Proof-carrying change capsule not found: ${e.changeId}`);let r=[];t.schemaVersion!==k&&r.push(`Unsupported capsule schema: ${t.schemaVersion}`),t.changeId!==e.changeId&&r.push("Capsule change binding does not match."),c(ha(t))!==t.integrity.capsuleDigest&&r.push("Capsule integrity digest does not match its canonical content.");let{lease:n$1,record:i}=await A(e.workspacePath,e.changeId),s=i.transaction.evidence.find(c=>c.role==="architecture-lease");(!s||s.digest.value!==c(n$1))&&r.push("Architecture lease does not match the decision-ledger evidence binding."),(n$1.goalId!==t.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."),i.transaction.eventHeadDigest!==t.decision.eventHeadDigest&&r.push("Capsule does not bind the current decision event head."),c(i.transaction)!==t.decision.transaction.digest.value&&r.push("Decision transaction projection digest does not match the capsule.");let d=await I(e.workspacePath,n$1.privateMaterialization.artifact);(!d||c(d)!==n$1.privateMaterialization.digest.value)&&r.push("Hash-bound baseline materialization is missing or corrupt.");for(let c of [t.intent,t.decision.transaction,t.prediction,t.actualOverlay,t.surpriseReport,...t.effects,...t.verification].filter(l=>!!l))await ie(e.workspacePath,c)||r.push(`Referenced artifact is missing or corrupt: ${c.artifact}`);let o={schemaVersion:n,changeId:e.changeId,validatedAt:new Date().toISOString(),valid:r.length===0,errors:r,capsule:t};return a$1(o,"contracts/workspace-intelligence/proof-carrying-change-capsule-validation.v1.json","Proof-Carrying Change capsule validation"),o}async function Za(e){let a=await oe(e);if(!a.valid)throw new Error(`Cannot export an invalid capsule: ${a.errors.join("; ")}`);let t=C.resolve(e.workspacePath),r=C.resolve(t,e.outputPath),n=C.relative(t,r);if(n===".."||n.startsWith(`..${C.sep}`)||C.isAbsolute(n))throw new Error("Capsule export path must remain inside the workspace.");let i=n.split(C.sep).join("/"),s=await g(t,i,a.capsule),d={schemaVersion:o,changeId:e.changeId,outputPath:s,validation:a};return a$1(d,"contracts/workspace-intelligence/proof-carrying-change-capsule-export.v1.json","Proof-Carrying Change capsule export"),d}function et(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Prediction input must be a JSON object.");let a=e;if(!Array.isArray(a.operations)||!Array.isArray(a.assumptions))throw new Error("Prediction input requires operations[] and assumptions[].");let t=new Set(["add","remove","change"]),r=new Set(["entity","relation","proof","artifact"]),n=new Set(["high","medium","low"]);for(let s of a.operations)if(!s||!t.has(s.operation)||!r.has(s.targetKind)||typeof s.targetId!="string"||s.targetId.trim().length===0||typeof s.rationale!="string"||!n.has(s.confidence))throw new Error("Prediction contains an invalid operation.");let i$1=a.predictedRisk;if(!i$1||!["none","low","medium","high"].includes(i$1))throw new Error("Prediction requires predictedRisk: none, low, medium, or high.");return {schemaVersion:i,changeId:a.changeId??"change-placeholder",goalId:a.goalId??"goal-placeholder",generatedAt:a.generatedAt??new Date().toISOString(),baselineGeneration:a.baselineGeneration??"pending-binding",nonCanonical:true,proofEligible:false,operations:a.operations,assumptions:a.assumptions.filter(s=>typeof s=="string"),predictedRisk:i$1}}function at(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Effect receipt input must be a JSON object.");let a=e;if(typeof a.id!="string"||!["filesystem","command","configuration","dependency","external"].includes(String(a.effectClass))||!["succeeded","failed","uncertain"].includes(String(a.status))||typeof a.summary!="string"||typeof a.observedAt!="string"||typeof a.idempotencyKey!="string"||!Array.isArray(a.artifacts))throw new Error("Effect receipt is missing required typed fields.");return a}function tt(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Verification receipt input must be a JSON object.");let a=e;if(typeof a.id!="string"||typeof a.criterionId!="string"||!["passed","failed","inconclusive"].includes(String(a.status))||typeof a.summary!="string"||typeof a.observedAt!="string"||!a.target||typeof a.target.modelHash!="string"||typeof a.target.graphHash!="string"||typeof a.target.effectHeadDigest!="string"||!Array.isArray(a.artifacts))throw new Error("Verification receipt is missing required typed fields.");return a}function rt(e,a){return e.decision.eventHeadDigest===a.eventHeadDigest&&e.decision.transaction.digest.value===c(a)}async function nt(e){let a=await oe({workspacePath:e.workspacePath,changeId:e.changeId});if(!a.valid)throw new Error(`Proof-carrying change ${e.changeId} failed capsule validation.`);let{lease:t,record:r}=await A(e.workspacePath,e.changeId);if(t.goalId!==e.goalId||r.transaction.state!=="committed"||a.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(i=>i.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
- export{Wa as a,Ma as b,La as c,Ua as d,Ba as e,Ja as f,Fa as g,Ya as h,Xa as i,Qa as j,oe as k,Za as l,et as m,at as n,tt as o,rt as p,nt as q};