workspai 0.50.0 → 0.52.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 (135) hide show
  1. package/README.md +127 -497
  2. package/contracts/artifact-remediation-plan.v1.json +87 -0
  3. package/contracts/cli-runtime-command-inventory.v1.snapshot.json +24 -0
  4. package/contracts/create-planner-capabilities.v1.json +10 -1
  5. package/contracts/doctor-project-evidence.v1.json +46 -0
  6. package/contracts/doctor-remediation-plan.v1.json +82 -0
  7. package/contracts/doctor-workspace-evidence.v1.json +46 -0
  8. package/contracts/extension-cli-compatibility.v1.json +6 -2
  9. package/contracts/published-contract-catalog.v1.json +22 -1
  10. package/contracts/runtime-command-surface.v1.json +104 -0
  11. package/contracts/workspace-intelligence/doctor-dependency-repair-transaction.v1.json +66 -0
  12. package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +5 -0
  13. package/contracts/workspace-intelligence/verified-goal-status.v1.json +27 -0
  14. package/contracts/workspace-intelligence/verified-goal.v1.json +163 -0
  15. package/contracts/workspace-intelligence-chain.v1.json +6 -0
  16. package/dist/analyze-J7VNZMDH.js +1 -0
  17. package/dist/artifact-remediation-plan-2UKY4TKO.js +3 -0
  18. package/dist/autopilot-release-UG23AWVH.js +1 -0
  19. package/dist/chunk-27UR373Z.js +1 -0
  20. package/dist/chunk-2PY65U6X.js +5 -0
  21. package/dist/{chunk-DQ3PI7EP.js → chunk-3D3PFPP5.js} +1 -1
  22. package/dist/chunk-4D7DIGAB.js +1 -0
  23. package/dist/{chunk-IND3TUVU.js → chunk-4UVGTFOX.js} +1 -1
  24. package/dist/chunk-5XJRCP3D.js +36 -0
  25. package/dist/chunk-62K2H72S.js +1 -0
  26. package/dist/chunk-6AXRIAP2.js +86 -0
  27. package/dist/chunk-6HJJHEL6.js +2 -0
  28. package/dist/{chunk-BHYTI3RH.js → chunk-6PBSAAS5.js} +1 -1
  29. package/dist/{chunk-MVLIONQD.js → chunk-7MQZQ4UU.js} +1 -1
  30. package/dist/chunk-7RLGOEWV.js +1 -0
  31. package/dist/{chunk-CV5HKU4P.js → chunk-7T4TSV5C.js} +1 -1
  32. package/dist/chunk-B4CPDK6J.js +2 -0
  33. package/dist/{chunk-SHXJ2GDR.js → chunk-DZ4VKAXB.js} +1 -1
  34. package/dist/{chunk-5EXZBCAZ.js → chunk-F4KBYFZ5.js} +1 -1
  35. package/dist/{chunk-LZQUZGXB.js → chunk-FRJYAJH6.js} +1 -1
  36. package/dist/chunk-FUPHQOJB.js +1 -0
  37. package/dist/{chunk-VKTUWUS6.js → chunk-GHB6QMQH.js} +1 -1
  38. package/dist/chunk-GR6442P7.js +1 -0
  39. package/dist/chunk-HPWLSLMC.js +8 -0
  40. package/dist/{chunk-KXG6E5VK.js → chunk-ICLYL3N5.js} +1 -1
  41. package/dist/chunk-IO54DFWR.js +691 -0
  42. package/dist/{chunk-RTVRZFIJ.js → chunk-KHEJO3JU.js} +1 -1
  43. package/dist/{chunk-IPJ5URDF.js → chunk-LOCPNNSK.js} +1 -1
  44. package/dist/chunk-LPCL4U4L.js +1 -0
  45. package/dist/{chunk-C35UXTDM.js → chunk-M5ICGR55.js} +1 -1
  46. package/dist/{chunk-SS2VV3D5.js → chunk-MBRU3VWJ.js} +2 -2
  47. package/dist/{chunk-DDQ3XK3H.js → chunk-MZFSINY7.js} +3 -3
  48. package/dist/chunk-OTDGTAZJ.js +1 -0
  49. package/dist/chunk-P4OSLAVD.js +3 -0
  50. package/dist/chunk-PS5F4DCT.js +1 -0
  51. package/dist/{chunk-C3FLCDRN.js → chunk-PTTZPDLX.js} +1 -1
  52. package/dist/chunk-Q6CUJ3WF.js +10 -0
  53. package/dist/{chunk-MV7KF75Q.js → chunk-QURMI7ID.js} +1 -1
  54. package/dist/{chunk-RVQLMTTI.js → chunk-ULR66OJR.js} +1 -1
  55. package/dist/chunk-WJVB6SSD.js +16 -0
  56. package/dist/chunk-WJY7ZXVJ.js +2 -0
  57. package/dist/{chunk-6UTM5AJI.js → chunk-XHRHNVCZ.js} +1 -1
  58. package/dist/chunk-ZTKIBREF.js +1 -0
  59. package/dist/{chunk-BQGBU2Y3.js → chunk-ZVOEPWQM.js} +1 -1
  60. package/dist/{create-I23DC7SN.js → create-ESK3CQPK.js} +1 -1
  61. package/dist/{doctor-DOOMYLIH.js → doctor-DLEBZSF7.js} +1 -1
  62. package/dist/index.d.ts +26 -11
  63. package/dist/index.js +129 -129
  64. package/dist/{pipeline-U77HSINC.js → pipeline-NT6AYYWM.js} +1 -1
  65. package/dist/{project-intelligence-lens-BKKVPCLC.js → project-intelligence-lens-Q4SZDI2N.js} +1 -1
  66. package/dist/project-test-coverage-A677ZLW3.js +1 -0
  67. package/dist/verified-goal-MJNZROS5.js +1 -0
  68. package/dist/{workspace-ZEYUVR26.js → workspace-LSOZM2CG.js} +1 -1
  69. package/dist/{workspace-agent-sync-DKYJLUDP.js → workspace-agent-sync-RZBQXCNJ.js} +1 -1
  70. package/dist/{workspace-archive-4JNT4S7N.js → workspace-archive-ZOWQXWJ6.js} +1 -1
  71. package/dist/workspace-context-IYJKO5BN.js +1 -0
  72. package/dist/{workspace-contract-PVLGPBBV.js → workspace-contract-AZFISDLS.js} +1 -1
  73. package/dist/workspace-explain-26UGV7L4.js +1 -0
  74. package/dist/workspace-explain-contract-GIWPCCEF.js +1 -0
  75. package/dist/{workspace-feedback-RATRXFUC.js → workspace-feedback-LIHEWTNV.js} +1 -1
  76. package/dist/{workspace-foundation-D33LJLGT.js → workspace-foundation-H5UTAUXQ.js} +1 -1
  77. package/dist/{workspace-graph-stream-THNG2T7R.js → workspace-graph-stream-KUDOZE73.js} +1 -1
  78. package/dist/workspace-graph-token-efficiency-5FNH4JZ5.js +1 -0
  79. package/dist/{workspace-history-EWFPT74O.js → workspace-history-HULG5EFN.js} +1 -1
  80. package/dist/{workspace-intelligence-MCNSWWDV.js → workspace-intelligence-A4UE4DZK.js} +1 -1
  81. package/dist/{workspace-intelligence-evaluation-7CABG5Y6.js → workspace-intelligence-evaluation-AOLGHYHC.js} +1 -1
  82. package/dist/workspace-intelligence-runner-42QI5RYA.js +1 -0
  83. package/dist/{workspace-intelligence-runtime-registry-ZZ3GRAL2.js → workspace-intelligence-runtime-registry-YOQ5GFFJ.js} +1 -1
  84. package/dist/{workspace-knowledge-graph-2EYR7N56.js → workspace-knowledge-graph-LEM6X5CM.js} +1 -1
  85. package/dist/{workspace-knowledge-graph-query-VOSPPH4W.js → workspace-knowledge-graph-query-EKHIE3E2.js} +1 -1
  86. package/dist/{workspace-mcp-serve-FLAVKWYW.js → workspace-mcp-serve-N2QPR7VJ.js} +1 -1
  87. package/dist/{workspace-model-FMFYLHE4.js → workspace-model-FJXX3NET.js} +1 -1
  88. package/dist/{workspace-onboarding-MYROZDI2.js → workspace-onboarding-IKFISWWY.js} +1 -1
  89. package/dist/workspace-readme-E2M35RJH.js +77 -0
  90. package/dist/{workspace-registry-summary-6VXIAQLX.js → workspace-registry-summary-HOQ3OBNT.js} +1 -1
  91. package/dist/workspace-run-GOZTUGJS.js +1 -0
  92. package/dist/{workspace-verify-FKYI65UQ.js → workspace-verify-32AWCJQG.js} +1 -1
  93. package/dist/workspace-watch-4WVNB26E.js +1 -0
  94. package/docs/README.md +1 -0
  95. package/docs/README_CONTENT_CONTRACT.md +98 -124
  96. package/docs/ci-workflows.md +53 -15
  97. package/docs/commands-reference.md +16 -2
  98. package/docs/doctor-command.md +16 -0
  99. package/docs/workspace-intelligence-runner.md +48 -0
  100. package/docs/workspace-knowledge-graph.md +39 -0
  101. package/docs/workspace-operations.md +9 -6
  102. package/package.json +9 -4
  103. package/scripts/enterprise-package-smoke.mjs +11 -0
  104. package/templates/kits/fastapi-ddd/README.md.j2 +1 -1
  105. package/templates/kits/fastapi-standard/README.md.j2 +1 -1
  106. package/templates/kits/nestjs-standard/Dockerfile.j2 +1 -1
  107. package/templates/kits/nestjs-standard/README.md.j2 +1 -1
  108. package/templates/kits/nestjs-standard/package.json.j2 +11 -2
  109. package/dist/analyze-ZFQWTCJQ.js +0 -1
  110. package/dist/artifact-remediation-plan-ICN3KOFG.js +0 -3
  111. package/dist/autopilot-release-VKXQ7BS7.js +0 -1
  112. package/dist/chunk-2AXEGYPL.js +0 -1
  113. package/dist/chunk-2D4UOYOJ.js +0 -1
  114. package/dist/chunk-AHLMIL2T.js +0 -1
  115. package/dist/chunk-AL2A7Q4X.js +0 -86
  116. package/dist/chunk-GNQRYISX.js +0 -5
  117. package/dist/chunk-I42F552T.js +0 -2
  118. package/dist/chunk-IDQKVJUF.js +0 -2
  119. package/dist/chunk-JFUD73OZ.js +0 -933
  120. package/dist/chunk-KKAOTTYO.js +0 -8
  121. package/dist/chunk-KMLPHFLD.js +0 -2
  122. package/dist/chunk-L2YK5RV2.js +0 -1
  123. package/dist/chunk-LAJM2SBP.js +0 -15
  124. package/dist/chunk-TDTCMZK7.js +0 -10
  125. package/dist/chunk-UETZ7USY.js +0 -36
  126. package/dist/chunk-WDKNMTJQ.js +0 -1
  127. package/dist/chunk-YPKNQCLK.js +0 -2
  128. package/dist/project-test-coverage-4TEHZJFC.js +0 -1
  129. package/dist/workspace-context-IHUFMZT3.js +0 -1
  130. package/dist/workspace-explain-64HNKAHO.js +0 -1
  131. package/dist/workspace-explain-contract-H7O26QJU.js +0 -1
  132. package/dist/workspace-graph-token-efficiency-CFGFCJ5V.js +0 -1
  133. package/dist/workspace-intelligence-runner-TG2VLHNZ.js +0 -1
  134. package/dist/workspace-run-2ZI5UMJ2.js +0 -1
  135. package/dist/workspace-watch-RP5KMVP2.js +0 -1
@@ -1,2 +0,0 @@
1
- import {l}from'./chunk-L2YK5RV2.js';import {d,c}from'./chunk-EWZZUQBR.js';import {b as b$1,a}from'./chunk-AHLMIL2T.js';import g from'path';import {createHash}from'crypto';import P from'fs-extra';import {parseAllDocuments}from'yaml';var q=b$1.knowledgeGraph;var Te=a.knowledgeGraph;function De(e,t){if(e.source.kind!=="workspace-model")throw new Error(`Workspace knowledge graph is not bound to the canonical workspace model (source: ${e.source.kind}).`);if(e.source.artifact!==a.model)throw new Error(`Workspace knowledge graph source artifact is ${e.source.artifact}; expected ${a.model}.`);if(e.source.hashAlgorithm!=="sha256")throw new Error(`Workspace knowledge graph source hash algorithm is ${e.source.hashAlgorithm}; expected sha256.`);let o=d(t);if(e.source.hash!==o)throw new Error("Workspace knowledge graph is stale: its source hash does not match the canonical workspace model.");if(e.workspace.name!==t.workspace.name||(e.workspace.profile??void 0)!==(t.workspace.profile??void 0))throw new Error("Workspace knowledge graph identity does not match the canonical workspace model.");let i=l(t);if(!i)throw new Error("Canonical workspace model has no project topology for the workspace knowledge graph.");let s=d=>({...d,generatedAt:"<ignored>"});if(c(s(e.projectTopology))!==c(s(i)))throw new Error("Workspace knowledge graph project topology does not match the canonical workspace model.")}var X=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","venv","vendor","node_modules","dist","build","target","coverage",".next",".turbo",".cache"]),B=new Set(["package.json","pyproject.toml","requirements.txt","Pipfile","go.mod","Cargo.toml","pom.xml","build.gradle","build.gradle.kts","composer.json","Gemfile","mix.exs","pubspec.yaml","Package.swift","CMakeLists.txt","deno.json","deno.jsonc","project.clj","deps.edn","build.sbt","BUILD","BUILD.bazel","WORKSPACE.bazel"]),ee=new Set(["get","put","post","delete","options","head","patch","trace"]),D=new Set([".c",".cc",".cpp",".cs",".dart",".ex",".exs",".go",".h",".hpp",".java",".js",".jsx",".kt",".kts",".mjs",".php",".py",".r",".rb",".rs",".scala",".svelte",".swift",".ts",".tsx",".vue",".clj",".cljs",".fs",".fsx",".lua",".vb"]);function N(e){let t=g.extname(e).toLowerCase();return {".c":"c",".cc":"cpp",".cpp":"cpp",".cs":"csharp",".dart":"dart",".ex":"elixir",".exs":"elixir",".go":"go",".h":"c",".hpp":"cpp",".java":"java",".js":"javascript",".jsx":"javascript",".kt":"kotlin",".kts":"kotlin",".mjs":"javascript",".php":"php",".py":"python",".r":"r",".rb":"ruby",".rs":"rust",".scala":"scala",".svelte":"svelte",".swift":"swift",".ts":"typescript",".tsx":"typescript",".vue":"vue",".clj":"clojure",".cljs":"clojure",".fs":"fsharp",".fsx":"fsharp",".lua":"lua",".vb":"visual-basic"}[t]??t.slice(1)}function T(e,t,o){let i=[],s=e.split(/\r?\n/);for(let d=0;d<s.length&&i.length<o;d+=1)for(let r of t){let n=s[d].match(r.pattern)?.[1]?.trim();if(n){i.push({name:n,line:d+1,detail:r.detail});break}}return i}var te=[{pattern:/^\s*(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/,detail:"function"},{pattern:/^\s*(?:export\s+)?(?:abstract\s+)?(?:class|interface|enum|type)\s+([A-Za-z_$][\w$]*)/,detail:"type"},{pattern:/^\s*(?:async\s+)?def\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*class\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*func\s+(?:\([^)]*\)\s*)?([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:public\s+|private\s+|protected\s+|internal\s+|abstract\s+|final\s+)*(?:class|interface|record|enum)\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*(?:pub\s+)?fn\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:pub\s+)?(?:struct|trait|enum)\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*(?:public\s+|private\s+|protected\s+)?function\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:class|module|struct|protocol|mixin)\s+([A-Za-z_]\w*)/,detail:"type"}],oe=[{pattern:/^\s*import(?:.+?from\s*)?["']([^"']+)["']/,detail:"import"},{pattern:/require\(["']([^"']+)["']\)/,detail:"require"},{pattern:/^\s*from\s+([A-Za-z0-9_.]+)\s+import\s+/,detail:"import"},{pattern:/^\s*import\s+([A-Za-z0-9_.]+)(?:\s|$)/,detail:"import"},{pattern:/^\s*(?:import|using|use)\s+([A-Za-z0-9_:.*\\/.-]+)/,detail:"import"},{pattern:/^\s*require(?:_relative)?\s+["']([^"']+)["']/,detail:"require"}];function re(e,t,o){if(!t.startsWith("."))return null;let i=g.resolve(g.dirname(e),t),s=g.extname(i).toLowerCase(),d=D.has(s),r=new Set([i]);if(d){let a=i.slice(0,-s.length);if([".js",".jsx",".mjs"].includes(s))for(let n of [".ts",".tsx",".js",".jsx",".mjs"])r.add(`${a}${n}`);}else for(let a of D)r.add(`${i}${a}`),r.add(g.join(i,`index${a}`));return [...r].find(a=>o.has(g.resolve(a)))??null}var se=[{pattern:/@(?:Get|Post|Put|Delete|Patch|Options|Head)\s*\(\s*["']([^"']*)["']/i,detail:"decorated route"},{pattern:/\b(?:app|router|server|api|route|fastify|fiber)\.(?:get|post|put|delete|patch|options|head)\s*\(\s*["']([^"']+)["']/i,detail:"router route"},{pattern:/@(?:GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping|RequestMapping)\s*\([^"']*["']([^"']*)["']/,detail:"mapped route"},{pattern:/\[Http(?:Get|Post|Put|Delete|Patch)\s*\(\s*["']([^"']*)["']/i,detail:"HTTP route"},{pattern:/^\s*(?:get|post|put|delete|patch)\s+["']([^"']+)["']/i,detail:"HTTP route"}];function L(e){return createHash("sha256").update(e).digest("hex")}function v(e,t){return `wkg:${e}:${L(`${e}\0${t}`).slice(0,20)}`}function R(e){return e.replace(/\\/g,"/")}function K(e){let t=R(e).replace(/^\.\//,"");return !t||t.startsWith("/")||/^[A-Za-z]:\//.test(t)?"unknown":t}function w(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function b(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function j(e){if(Array.isArray(e))return e.filter(o=>typeof o=="string").sort();let t=w(e);return t?Object.keys(t).sort():[]}function ie(e){if(Array.isArray(e))return e.map(o=>typeof o=="string"?o.split("=",1)[0]?.trim():"").filter(o=>!!o).sort();let t=w(e);return t?Object.keys(t).sort():[]}function ae(e){return Object.fromEntries(Object.entries(e).filter(t=>t[1]!==void 0).sort(([t],[o])=>t.localeCompare(o)))}async function Z(e,t){let o=[],i=[e],s=0;for(;s<i.length&&o.length<t;){let d=i[s++],r;try{r=await P.readdir(d,{withFileTypes:true});}catch{continue}r.sort((a,n)=>a.name.localeCompare(n.name));for(let a of r){if(o.length>=t)break;if(a.isSymbolicLink())continue;let n=g.join(d,a.name);a.isDirectory()?X.has(a.name)||i.push(n):a.isFile()&&o.push(n);}}return o.sort((d,r)=>d.localeCompare(r))}async function A(e){let t=await P.readFile(e,"utf8");if(e.toLowerCase().endsWith(".json")){let o=JSON.parse(t),i=w(o);return i?[i]:[]}return parseAllDocuments(t).map(o=>w(o.toJSON())).filter(o=>o!==null)}function C(e,t){let o=g.resolve(t);return e.filter(i=>o===i.root||o.startsWith(`${i.root}${g.sep}`)).sort((i,s)=>s.root.length-i.root.length)[0]??null}var G=class{constructor(t,o,i){this.workspacePath=t;this.now=o;this.workspaceName=i;}workspacePath;now;workspaceName;entities=new Map;relations=new Map;proofs=new Map;providers=[];diagnostics=[];contentHashes=new Map;artifactPath(t,o){if(o){let i=R(g.relative(o.root,t));return K(g.posix.join(o.artifactPrefix,i))}return K(g.relative(this.workspacePath,t))}async addProof(t){let o;if(t.absolutePath){if(!this.contentHashes.has(t.absolutePath))try{this.contentHashes.set(t.absolutePath,L(await P.readFile(t.absolutePath)));}catch{this.contentHashes.set(t.absolutePath,null);}o=this.contentHashes.get(t.absolutePath)??void 0;}let i=K(t.artifact),s=v("proof",[t.provider,i,t.pointer??"",t.line??"",t.detail??""].join("\0"));return this.proofs.has(s)||this.proofs.set(s,{id:s,provider:t.provider,artifact:i,...t.pointer?{pointer:t.pointer}:{},...t.line?{line:t.line}:{},...t.column?{column:t.column}:{},...o?{contentHash:o}:{},observedAt:this.now.toISOString(),derivation:t.derivation??"extracted",trust:t.trust??"observed",confidence:t.confidence??"high",freshness:"fresh",...t.detail?{detail:t.detail}:{}}),s}addEntity(t){let o=v(t.kind,t.key),i=ae(t.attributes??{}),s=this.entities.get(o),d={...s?.attributes??{}};for(let[n,l]of Object.entries(i)){if(n in d&&JSON.stringify(d[n])!==JSON.stringify(l)){this.diagnostics.push({code:"graph.knowledge.attribute_conflict",severity:"warning",message:`Conflicting ${n} values were observed for ${t.kind} ${t.label}.`,entityIds:[o],recommendation:"Inspect the entity proof paths and make the authoritative source explicit."});continue}d[n]=l;}let r=[...new Set([...s?.identity.aliases??[],...t.aliases??[]])].sort(),a=[...new Set([...s?.proofIds??[],...t.proofIds??[]])].sort();return this.entities.set(o,{id:o,kind:t.kind,label:t.label,...t.projectId?{projectId:t.projectId}:{},identity:{key:t.key,scope:t.projectId?"project":"workspace",aliases:r,fingerprint:L(JSON.stringify({kind:t.kind,key:t.key,attributes:d}))},attributes:d,proofIds:a}),o}addRelation(t){let o=v("relation",`${t.from}\0${t.kind}\0${t.to}`),i=this.relations.get(o),s=[...new Set([...i?.proofIds??[],...t.proofIds])].sort(),d=new Set(s.map(n=>this.proofs.get(n)?.provider).filter(Boolean)).size,r=t.trust??i?.trust??"observed",a=d>=2&&r!=="ambiguous"?"corroborated":r;return this.relations.set(o,{id:o,from:t.from,to:t.to,kind:t.kind,derivation:t.derivation??i?.derivation??"extracted",trust:a,confidence:a==="corroborated"?"high":t.confidence??i?.confidence??"high",proofIds:s}),o}};function ne(e,t){let o=g.basename(e);try{if(o==="package.json"||o==="composer.json"){let r=JSON.parse(t);return {ecosystem:o==="package.json"?"npm":"composer",name:b(r.name),version:b(r.version),dependencies:[...j(r.dependencies),...j(r.devDependencies),...j(r.require),...j(r["require-dev"])].filter((a,n,l)=>l.indexOf(a)===n).sort()}}if(o==="deno.json"||o==="deno.jsonc"){let r=JSON.parse(t.replace(/\/\*[\s\S]*?\*\/|^\s*\/\/.*$/gm,""));return {ecosystem:"deno",name:b(r.name),version:b(r.version),dependencies:j(r.imports)}}}catch{}let i=r=>t.match(r)?.[1]?.trim();if(o==="pyproject.toml"){let r=t.match(/^dependencies\s*=\s*\[([\s\S]*?)\]/m)?.[1]??"";return {ecosystem:"python",name:i(/^(?:name)\s*=\s*["']([^"']+)["']/m),version:i(/^(?:version)\s*=\s*["']([^"']+)["']/m),dependencies:[...[...r.matchAll(/["']([A-Za-z0-9_.-]+)/g)].map(a=>a[1]),...[...t.matchAll(/^([A-Za-z0-9_.-]+)\s*=\s*(?:["'{[])/gm)].map(a=>a[1]).filter(a=>!["name","version","description","python","dependencies"].includes(a))].filter((a,n,l)=>l.indexOf(a)===n).sort()}}if(o==="go.mod")return {ecosystem:"go",name:i(/^module\s+(\S+)/m),dependencies:[...t.matchAll(/^\s*([A-Za-z0-9_.~/-]+)\s+v\d+/gm)].map(r=>r[1]).sort()};if(o==="Cargo.toml"){let r=t.match(/^\[dependencies\]\s*$([\s\S]*?)(?=^\[|\s*$)/m)?.[1]??"";return {ecosystem:"cargo",name:i(/^name\s*=\s*["']([^"']+)["']/m),version:i(/^version\s*=\s*["']([^"']+)["']/m),dependencies:[...r.matchAll(/^([A-Za-z0-9_.-]+)\s*=/gm)].map(a=>a[1]).sort()}}if(o==="pom.xml")return {ecosystem:"maven",name:i(/<artifactId>([^<]+)<\/artifactId>/),version:i(/<version>([^<]+)<\/version>/),dependencies:[...t.matchAll(/<artifactId>([^<]+)<\/artifactId>/g)].slice(1).map(r=>r[1]).sort()};if(/\.(?:cs|fs|vb)proj$/i.test(o))return {ecosystem:"nuget",name:i(/<AssemblyName>([^<]+)<\/AssemblyName>/)??o.replace(/\.[^.]+$/,""),version:i(/<Version>([^<]+)<\/Version>/),dependencies:[...t.matchAll(/<PackageReference\s+Include=["']([^"']+)["']/g)].map(r=>r[1]).sort()};let s={"requirements.txt":"python",Pipfile:"python","build.gradle":"gradle","build.gradle.kts":"gradle",Gemfile:"ruby","mix.exs":"elixir","pubspec.yaml":"dart","Package.swift":"swift","CMakeLists.txt":"cmake","deno.json":"deno","deno.jsonc":"deno","project.clj":"clojure","deps.edn":"clojure","build.sbt":"scala",BUILD:"bazel","BUILD.bazel":"bazel","WORKSPACE.bazel":"bazel"},d=o==="requirements.txt"?t.split(/\r?\n/).map(r=>r.trim().match(/^([A-Za-z0-9_.-]+)/)?.[1]):o.startsWith("build.gradle")?[...t.matchAll(/(?:implementation|api|compileOnly|runtimeOnly|testImplementation)\s*\(?["']([^:"']+):([^:"']+)/g)].map(r=>`${r[1]}:${r[2]}`):o==="Gemfile"?[...t.matchAll(/^\s*gem\s+["']([^"']+)["']/gm)].map(r=>r[1]):o==="mix.exs"?[...t.matchAll(/\{:\s*([A-Za-z0-9_]+)\s*,/g)].map(r=>r[1]):o==="pubspec.yaml"?[...t.matchAll(/^\s{2}([A-Za-z0-9_]+):\s+/gm)].map(r=>r[1]):o==="Package.swift"?[...t.matchAll(/\.package\s*\(\s*url:\s*["']([^"']+)["']/g)].map(r=>r[1]):o==="CMakeLists.txt"?[...t.matchAll(/find_package\s*\(\s*([A-Za-z0-9_.+-]+)/gi)].map(r=>r[1]):o==="project.clj"||o==="deps.edn"?[...t.matchAll(/\[?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)\s+/g)].map(r=>r[1]):o==="build.sbt"?[...t.matchAll(/["']([^"']+)["']\s*%%?\s*["']([^"']+)["']/g)].map(r=>`${r[1]}:${r[2]}`):[];return {ecosystem:s[o]??"unknown",dependencies:d.filter(r=>!!r).filter((r,a,n)=>n.indexOf(r)===a).sort()}}var de={id:"workspace-foundation",version:"1.0.0",async run(e){let{state:t}=e,o=await t.addProof({provider:this.id,artifact:".workspai/workspace.contract.json",absolutePath:g.join(e.workspacePath,".workspai","workspace.contract.json"),trust:"authoritative",derivation:"authored",detail:"Workspace identity and project registry boundary"}),i=t.addEntity({kind:"workspace",key:`workspace:${t.workspaceName}`,label:t.workspaceName,aliases:[t.workspaceName],proofIds:[o]});for(let s of e.projects){let d=e.filesByProject.get(s.id)??[],r=d.find(f=>/[\\/]\.(?:workspai|rapidkit)[\\/](?:project|context)\.json$/.test(f)),a=d.find(f=>B.has(g.basename(f))),n=r??a,l=await t.addProof({provider:this.id,artifact:n?t.artifactPath(n,s):K(g.posix.join(s.artifactPrefix,".workspai/project.json")),...n?{absolutePath:n}:{},trust:r?"authoritative":"observed",derivation:r?"authored":"inferred",detail:`Project ${s.id}`}),p=t.addEntity({kind:"project",key:`project:${s.id}`,label:s.id,projectId:s.id,aliases:[s.id,s.path],attributes:{path:s.path,runtime:s.runtime,framework:s.framework,kit:s.kit,kind:s.kind,category:s.category},proofIds:[l]});t.addRelation({from:i,to:p,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[l]});let h=new Set,u=[];for(let f of d){let m=g.basename(f);if(/^(?:\.env\.example|\.env\.sample|\.env\.template)$/i.test(m))try{let k=await P.readFile(f,"utf8");for(let c of k.split(/\r?\n/)){let y=c.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=/)?.[1];y&&h.add(y);}}catch{}if((/(?:^|[\\/])(?:test|tests|spec|specs|__tests__)(?:[\\/]|$)/i.test(f)||/(?:\.test|\.spec|_test)\.[A-Za-z0-9]+$/i.test(m))&&u.push(f),!(!B.has(m)&&!/\.(?:cs|fs|vb)proj$/i.test(m)))try{let k=await P.readFile(f,"utf8"),c=ne(f,k),y=await t.addProof({provider:this.id,artifact:t.artifactPath(f,s),absolutePath:f,pointer:"/",confidence:c.name?"high":"medium",detail:`${c.ecosystem} manifest`}),E=t.addEntity({kind:"package",key:`package:${s.id}:${c.ecosystem}:${c.name??m}`,label:c.name??`${s.id}/${m}`,projectId:s.id,aliases:[m,...c.name?[c.name]:[]],attributes:{ecosystem:c.ecosystem,version:c.version,manifest:t.artifactPath(f,s),dependencies:c.dependencies},proofIds:[y]});t.addRelation({from:p,to:E,kind:"contains",proofIds:[y]});for(let $ of c.dependencies.slice(0,500)){let I=t.addEntity({kind:"module",key:`dependency:${c.ecosystem}:${$}`,label:$,aliases:[$],attributes:{ecosystem:c.ecosystem,external:true},proofIds:[y]});t.addRelation({from:E,to:I,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[y]});}}catch{}}if(h.size>0){let f=d.find(m=>/^\.env\.(?:example|sample|template)$/i.test(g.basename(m)));if(f){let m=await t.addProof({provider:this.id,artifact:t.artifactPath(f,s),absolutePath:f,detail:"Public environment template keys only; values are intentionally excluded"}),k=t.addEntity({kind:"environment",key:`environment:${s.id}:template`,label:`${s.id} environment contract`,projectId:s.id,attributes:{keys:[...h].sort(),valuesEmitted:false},proofIds:[m]});t.addRelation({from:p,to:k,kind:"configured-by",proofIds:[m]});}}if(u.length>0){let f=await t.addProof({provider:this.id,artifact:t.artifactPath(u[0],s),absolutePath:u[0],detail:`${u.length} test file(s) discovered`}),m=t.addEntity({kind:"test-suite",key:`tests:${s.id}`,label:`${s.id} tests`,projectId:s.id,attributes:{fileCount:u.length},proofIds:[f]});t.addRelation({from:m,to:p,kind:"tests",proofIds:[f]});}}}},ce={id:"source-structure",version:"1.0.0",async run(e){for(let t of e.projects){let o=(e.filesByProject.get(t.id)??[]).filter(r=>D.has(g.extname(r).toLowerCase())).slice(0,1e3),i=new Set;await Promise.all(o.map(async r=>{try{let a=await P.stat(r);a.isFile()&&a.size<=2*1024*1024&&i.add(g.resolve(r));}catch{}}));let s=0,d=0;for(let r of o){let a;try{if((await P.stat(r)).size>2*1024*1024)continue;a=await P.readFile(r,"utf8");}catch{continue}let n=e.state.artifactPath(r,t),l=await e.state.addProof({provider:this.id,artifact:n,absolutePath:r,derivation:"extracted",trust:"observed",confidence:"high",detail:`${N(r)} source file`}),p=e.state.addEntity({kind:"file",key:`file:${t.id}:${n}`,label:n,projectId:t.id,aliases:[g.basename(r)],attributes:{artifact:n,language:N(r),bytes:Buffer.byteLength(a)},proofIds:[l]});e.state.addRelation({from:v("project",`project:${t.id}`),to:p,kind:"contains",proofIds:[l]});let h=T(a,oe,250);for(let u of h){let f=await e.state.addProof({provider:this.id,artifact:n,absolutePath:r,line:u.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${u.detail}: ${u.name}`}),m=re(r,u.name,i);if(m){let k=e.state.artifactPath(m,t);e.state.addRelation({from:p,to:v("file",`file:${t.id}:${k}`),kind:"imports",confidence:"high",proofIds:[f]});}else {let k=u.name.startsWith(".");k&&(d+=1);let c=e.state.addEntity({kind:"module",key:`module:${t.id}:${u.name}`,label:u.name,projectId:t.id,aliases:[u.name],attributes:{specifier:u.name,resolution:k?"unresolved-local":"external"},proofIds:[f]});e.state.addRelation({from:p,to:c,kind:"imports",confidence:k?"low":"medium",proofIds:[f]});}}if(s<500){let u=T(a,te,Math.min(100,500-s));s+=u.length;for(let f of u){let m=await e.state.addProof({provider:this.id,artifact:n,absolutePath:r,line:f.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${f.detail}: ${f.name}`}),k=e.state.addEntity({kind:"symbol",key:`symbol:${t.id}:${n}:${f.detail}:${f.name}`,label:f.name,projectId:t.id,attributes:{symbolKind:f.detail,language:N(r)},proofIds:[m]});e.state.addRelation({from:p,to:k,kind:"defines",confidence:"medium",proofIds:[m]});}}for(let u of T(a,se,100)){let m=(a.split(/\r?\n/)[u.line-1]??"").match(/(?:@|\.|\[|^\s*)(get|post|put|delete|patch|options|head)/i)?.[1]?.toUpperCase()??"HTTP",k=await e.state.addProof({provider:this.id,artifact:n,absolutePath:r,line:u.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${m} ${u.name}`}),c=e.state.addEntity({kind:"endpoint",key:`source-endpoint:${t.id}:${n}:${m}:${u.name}`,label:`${m} ${u.name||"/"}`,projectId:t.id,attributes:{method:m,path:u.name||"/",source:n},proofIds:[k]});e.state.addRelation({from:p,to:c,kind:"defines",confidence:"medium",proofIds:[k]});}}(o.length>=1e3||s>=500)&&e.state.diagnostics.push({code:"graph.provider.source_structure.limit_reached",severity:"info",message:`Source extraction for ${t.id} reached its bounded inventory limit.`,recommendation:"Use the standalone graph package provider configuration for deeper symbol indexing."}),d>0&&e.state.diagnostics.push({code:"graph.provider.source_structure.unresolved_local_imports",severity:"warning",message:`${d} local import(s) in ${t.id} could not be resolved to an indexed source file.`,recommendation:"Check path aliases, generated sources, extension mapping, or provider limits before treating the import graph as complete."});}}},pe={id:"workspace-service-contract",version:"1.0.0",async run(e){if(!e.contract)return;let t=new Map;for(let o of [...e.contract.projects].sort((i,s)=>i.slug.localeCompare(s.slug))){let i=o.contracts,s=await e.state.addProof({provider:this.id,artifact:".workspai/workspace.contract.json",absolutePath:g.join(e.workspacePath,".workspai","workspace.contract.json"),pointer:`/projects/${o.slug}/contracts`,trust:"authoritative",derivation:"authored",detail:`Service contract for ${o.slug}`}),d=v("project",`project:${o.slug}`),r=e.state.addEntity({kind:"service",key:`contract-service:${o.slug}`,label:o.slug,projectId:o.slug,attributes:{ports:o.ports.map(a=>`${a.protocol}:${a.port}`),owns:[...i.owns].sort(),environmentKeys:[...i.env].sort()},proofIds:[s]});e.state.addRelation({from:d,to:r,kind:"implements",trust:"authoritative",derivation:"authored",proofIds:[s]});for(let a of [...i.apis].sort((n,l)=>n.name.localeCompare(l.name))){let n=e.state.addEntity({kind:"api",key:`contract-api:${o.slug}:${a.name}:${a.basePath}`,label:a.name,projectId:o.slug,attributes:{basePath:a.basePath},proofIds:[s]});e.state.addRelation({from:r,to:n,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[s]});}for(let a of [...i.publishes,...i.consumes].sort())t.has(a)||t.set(a,e.state.addEntity({kind:"queue",key:`event:${a}`,label:a,attributes:{protocol:"workspace-event"},proofIds:[s]}));for(let a of [...i.publishes].sort()){let n=t.get(a);n&&e.state.addRelation({from:r,to:n,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[s]});}for(let a of [...i.consumes].sort()){let n=t.get(a);n&&e.state.addRelation({from:r,to:n,kind:"consumes",trust:"authoritative",derivation:"authored",proofIds:[s]});}}}},le={id:"openapi",version:"1.0.0",async run(e){for(let t of e.projects){let o=(e.filesByProject.get(t.id)??[]).filter(i=>/^(?:openapi|swagger)(?:\.[^.]+)?\.(?:json|ya?ml)$/i.test(g.basename(i)));for(let i of o){let s;try{s=await A(i);}catch(d){e.state.diagnostics.push({code:"graph.provider.openapi.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(i,t)}: ${d instanceof Error?d.message:String(d)}`});continue}for(let d of s){if(!("openapi"in d)&&!("swagger"in d))continue;let r=w(d.info),a=b(r?.title)??`${t.id} API`,n=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(i,t),absolutePath:i,pointer:"/info",trust:"authoritative",detail:"Authored OpenAPI contract"}),l=v("project",`project:${t.id}`),p=e.state.addEntity({kind:"api",key:`api:${t.id}:${a}`,label:a,projectId:t.id,attributes:{version:b(r?.version),specification:b(d.openapi)??b(d.swagger)},proofIds:[n]});e.state.addRelation({from:l,to:p,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[n]});let h=w(w(d.components)?.schemas)??w(d.definitions),u=new Map;for(let m of Object.keys(h??{}).sort()){let k=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(i,t),absolutePath:i,pointer:`/components/schemas/${m}`,trust:"authoritative",detail:`OpenAPI schema ${m}`}),c=e.state.addEntity({kind:"schema",key:`schema:${t.id}:${a}:${m}`,label:m,projectId:t.id,proofIds:[k]});u.set(m,c),e.state.addRelation({from:p,to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[k]});}let f=w(d.paths);for(let m of Object.keys(f??{}).sort()){let k=w(f?.[m]);for(let c of Object.keys(k??{}).filter(y=>ee.has(y.toLowerCase())).sort()){let y=w(k?.[c]),E=`/paths/${m.replace(/~/g,"~0").replace(/\//g,"~1")}/${c}`,$=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(i,t),absolutePath:i,pointer:E,trust:"authoritative",detail:`${c.toUpperCase()} ${m}`}),I=e.state.addEntity({kind:"endpoint",key:`endpoint:${t.id}:${a}:${c.toUpperCase()}:${m}`,label:`${c.toUpperCase()} ${m}`,projectId:t.id,aliases:j(y?.tags),attributes:{method:c.toUpperCase(),path:m,operationId:b(y?.operationId),deprecated:typeof y?.deprecated=="boolean"?y.deprecated:void 0,tags:j(y?.tags)},proofIds:[$]});e.state.addRelation({from:p,to:I,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[$]});let S=JSON.stringify(y??{});for(let[J,V]of u)S.includes(`/${J}`)&&e.state.addRelation({from:I,to:V,kind:"references",trust:"authoritative",derivation:"authored",proofIds:[$]});}}}}}}},fe={id:"interface-contracts",version:"1.0.0",async run(e){for(let t of e.projects){let o=(e.filesByProject.get(t.id)??[]).filter(i=>{let s=g.basename(i).toLowerCase();return /\.(?:graphql|gql|proto)$/.test(s)||/^asyncapi(?:\.[^.]+)?\.(?:json|ya?ml)$/.test(s)});for(let i of o){let s=e.state.artifactPath(i,t),d=g.extname(i).toLowerCase();if(d===".graphql"||d===".gql"){let r=await P.readFile(i,"utf8"),a=await e.state.addProof({provider:this.id,artifact:s,absolutePath:i,trust:"authoritative",derivation:"authored",detail:"GraphQL schema"}),n=e.state.addEntity({kind:"api",key:`graphql:${t.id}:${s}`,label:`${t.id} GraphQL API`,projectId:t.id,attributes:{specification:"graphql",artifact:s},proofIds:[a]});e.state.addRelation({from:v("project",`project:${t.id}`),to:n,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[a]});for(let l of r.matchAll(/^\s*(?:type|input|interface|enum|scalar|union)\s+([A-Za-z_]\w*)/gm)){let p=e.state.addEntity({kind:"schema",key:`graphql-schema:${t.id}:${s}:${l[1]}`,label:l[1],projectId:t.id,proofIds:[a]});e.state.addRelation({from:n,to:p,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[a]});}continue}if(d===".proto"){let r=await P.readFile(i,"utf8"),a=await e.state.addProof({provider:this.id,artifact:s,absolutePath:i,trust:"authoritative",derivation:"authored",detail:"Protocol Buffers contract"});for(let n of r.matchAll(/^\s*service\s+([A-Za-z_]\w*)/gm)){let l=e.state.addEntity({kind:"api",key:`protobuf-service:${t.id}:${s}:${n[1]}`,label:n[1],projectId:t.id,attributes:{specification:"protobuf",artifact:s},proofIds:[a]});e.state.addRelation({from:v("project",`project:${t.id}`),to:l,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[a]});}for(let n of r.matchAll(/^\s*message\s+([A-Za-z_]\w*)/gm))e.state.addEntity({kind:"schema",key:`protobuf-message:${t.id}:${s}:${n[1]}`,label:n[1],projectId:t.id,attributes:{specification:"protobuf",artifact:s},proofIds:[a]});continue}try{let r=(await A(i))[0];if(!r||!("asyncapi"in r))continue;let a=await e.state.addProof({provider:this.id,artifact:s,absolutePath:i,trust:"authoritative",derivation:"authored",detail:"AsyncAPI contract"}),n=e.state.addEntity({kind:"api",key:`asyncapi:${t.id}:${s}`,label:b(w(r.info)?.title)??`${t.id} AsyncAPI`,projectId:t.id,attributes:{specification:`asyncapi ${String(r.asyncapi)}`,artifact:s},proofIds:[a]});e.state.addRelation({from:v("project",`project:${t.id}`),to:n,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[a]});for(let l of Object.keys(w(r.channels)??{}).sort()){let p=e.state.addEntity({kind:"queue",key:`asyncapi-channel:${t.id}:${l}`,label:l,projectId:t.id,attributes:{protocol:"asyncapi"},proofIds:[a]});e.state.addRelation({from:n,to:p,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[a]});}}catch{}}}}},ue={id:"infrastructure-as-code",version:"1.0.0",async run(e){let t=e.workspaceFiles.filter(o=>{let i=g.basename(o);return /^Dockerfile(?:\..+)?$/i.test(i)||/\.tf$/i.test(i)||i==="Chart.yaml"});for(let o of t){let i=C(e.projects,o),s=i?.id??e.state.workspaceName,d=i?v("project",`project:${i.id}`):v("workspace",`workspace:${e.state.workspaceName}`),r=e.state.artifactPath(o,i),a=await P.readFile(o,"utf8"),n=await e.state.addProof({provider:this.id,artifact:r,absolutePath:o,trust:"authoritative",derivation:"authored",detail:"Infrastructure definition"});if(/^Dockerfile/i.test(g.basename(o))){let p=[...a.matchAll(/^\s*FROM\s+([^\s]+)(?:\s+AS\s+([^\s]+))?/gim)],h=e.state.addEntity({kind:"container",key:`dockerfile:${s}:${r}`,label:`${s} container image`,...i?{projectId:i.id}:{},attributes:{artifact:r,baseImages:p.map(u=>u[1])},proofIds:[n]});e.state.addRelation({from:d,to:h,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[n]});continue}if(/\.tf$/i.test(o)){for(let p of a.matchAll(/^\s*resource\s+["']([^"']+)["']\s+["']([^"']+)["']/gm)){let h=p[1],u=/(?:db|sql|rds|database)/i.test(h)?"database":/(?:queue|kafka|sqs|pubsub|servicebus)/i.test(h)?"queue":"deployment",f=e.state.addEntity({kind:u,key:`terraform:${s}:${h}:${p[2]}`,label:`${h}.${p[2]}`,...i?{projectId:i.id}:{},attributes:{resourceType:h,artifact:r},proofIds:[n]});e.state.addRelation({from:d,to:f,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[n]});}continue}let l=e.state.addEntity({kind:"deployment",key:`helm:${s}:${r}`,label:`${s} Helm chart`,...i?{projectId:i.id}:{},attributes:{artifact:r,format:"helm"},proofIds:[n]});e.state.addRelation({from:d,to:l,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[n]});}}};function H(e){let t=e.toLowerCase();return /(?:postgres|mysql|mariadb|mongo|cassandra|cockroach|mssql|oracle)/.test(t)?"database":/(?:rabbitmq|kafka|nats|pulsar|activemq|redis)/.test(t)?"queue":"container"}var me={id:"compose",version:"1.0.0",async run(e){let t=new Set;for(let o of [e.workspacePath,...e.projects.map(i=>i.root)])for(let i of ["compose.yml","compose.yaml","docker-compose.yml","docker-compose.yaml"]){let s=g.join(o,i);await P.pathExists(s)&&t.add(s);}for(let o of [...t].sort()){let i;try{i=(await A(o))[0];}catch(a){e.state.diagnostics.push({code:"graph.provider.compose.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(o)}: ${a instanceof Error?a.message:String(a)}`});}let s=w(i?.services);if(!s)continue;let d=C(e.projects,o),r=new Map;for(let a of Object.keys(s).sort()){let n=w(s[a]),l=n?.build,p=b(l)??b(w(l)?.context),h=p?C(e.projects,g.resolve(g.dirname(o),p)):e.projects.find(k=>k.id.toLowerCase()===a.toLowerCase()||g.basename(k.path).toLowerCase()===a.toLowerCase())??d,u=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(o,d),absolutePath:o,pointer:`/services/${a}`,trust:"authoritative",derivation:"authored",detail:`Compose service ${a}`}),f=b(n?.image),m=e.state.addEntity({kind:"service",key:`compose-service:${e.state.artifactPath(o,d)}:${a}`,label:a,...h?{projectId:h.id}:{},attributes:{image:f,ports:j(n?.ports).map(String),networks:j(n?.networks),environmentKeys:ie(n?.environment)},proofIds:[u]});if(r.set(a,m),h&&e.state.addRelation({from:v("project",`project:${h.id}`),to:m,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[u]}),f){let k=e.state.addEntity({kind:H(f),key:`image:${f}`,label:f,...h?{projectId:h.id}:{},attributes:{image:f},proofIds:[u]});e.state.addRelation({from:m,to:k,kind:H(f)==="container"?"runs-on":"depends-on",trust:"authoritative",derivation:"authored",proofIds:[u]});}}for(let a of Object.keys(s).sort()){let n=w(s[a]),l=r.get(a);if(l)for(let p of j(n?.depends_on)){let h=r.get(p);if(!h)continue;let u=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(o,d),absolutePath:o,pointer:`/services/${a}/depends_on/${p}`,trust:"authoritative",derivation:"authored",detail:`${a} depends on ${p}`});e.state.addRelation({from:l,to:h,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[u]});}}}}},ge={id:"documentation",version:"1.0.0",async run(e){let t=new Set,o=[e.workspaceFiles,...e.projects.map(i=>e.filesByProject.get(i.id)??[])];for(let i of o){let s=i.filter(d=>/(?:^|[\\/])(?:README|ARCHITECTURE|CONTRIBUTING|SECURITY)\.md$/i.test(d));for(let d of s){if(t.has(d))continue;t.add(d);let r=C(e.projects,d),n=(await P.readFile(d,"utf8")).match(/^#\s+(.+)$/m)?.[1]?.trim()??g.basename(d),l=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(d,r),absolutePath:d,line:1,trust:"authoritative",derivation:"authored",detail:`Documentation: ${n}`}),p=e.state.addEntity({kind:"document",key:`document:${e.state.artifactPath(d,r)}`,label:n,...r?{projectId:r.id}:{},attributes:{artifact:e.state.artifactPath(d,r)},proofIds:[l]}),h=r?v("project",`project:${r.id}`):v("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:p,to:h,kind:"documents",trust:"authoritative",derivation:"authored",proofIds:[l]});}}}},he={id:"kubernetes",version:"1.0.0",async run(e){for(let t of e.projects){let o=(e.filesByProject.get(t.id)??[]).filter(i=>/(?:^|[\\/])(?:k8s|kubernetes|deploy|manifests)(?:[\\/]).+\.ya?ml$/i.test(i));for(let i of o){let s;try{s=await A(i);}catch{continue}for(let d=0;d<s.length;d+=1){let r=s[d],a=b(r.kind),n=w(r.metadata),l=b(n?.name);if(!a||!l)continue;let p=b(n?.namespace)??"default",h=/Deployment|StatefulSet|DaemonSet/i.test(a)?"deployment":/Service|Ingress/i.test(a)?"service":/ConfigMap|Secret/i.test(a)?"environment":"deployment",u=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(i,t),absolutePath:i,pointer:`/documents/${d}`,trust:"authoritative",derivation:"authored",detail:`${a} ${p}/${l}`}),f=e.state.addEntity({kind:h,key:`kubernetes:${a}:${p}:${l}`,label:`${a}/${l}`,projectId:t.id,attributes:{resourceKind:a,namespace:p,secret:a==="Secret",keys:a==="Secret"||a==="ConfigMap"?Object.keys(w(r.data)??{}).sort():void 0},proofIds:[u]});e.state.addRelation({from:v("project",`project:${t.id}`),to:f,kind:h==="deployment"?"deploys":"contains",trust:"authoritative",derivation:"authored",proofIds:[u]});let m=e.state.addEntity({kind:"environment",key:`kubernetes-namespace:${p}`,label:`Kubernetes namespace ${p}`,projectId:t.id,attributes:{namespace:p},proofIds:[u]});e.state.addRelation({from:f,to:m,kind:"runs-on",trust:"authoritative",derivation:"authored",proofIds:[u]});}}}}},ke={id:"ci-workflow",version:"1.0.0",async run(e){let t=e.workspaceFiles.filter(o=>{let i=R(g.relative(e.workspacePath,o));return /^\.github\/workflows\/.+\.ya?ml$/i.test(i)||/^(?:\.gitlab-ci\.ya?ml|azure-pipelines\.ya?ml|Jenkinsfile|bitbucket-pipelines\.ya?ml|\.woodpecker\.ya?ml)$/i.test(i)||/^\.circleci\/config\.ya?ml$/i.test(i)});for(let o of t){let i=e.state.artifactPath(o),s=g.basename(o)==="Jenkinsfile",d=g.basename(o),r=[],a=[];if(s)r=[...(await P.readFile(o,"utf8")).matchAll(/\bstage\s*\(\s*["']([^"']+)["']/g)].map(h=>h[1]);else {let p;try{p=(await A(o))[0];}catch{continue}if(!p)continue;d=b(p.name)??d;let h=R(g.relative(e.workspacePath,o));if(/^\.gitlab-ci\./i.test(h)){let u=new Set(["stages","variables","workflow","include","default","image","services","cache","before_script","after_script"]);r=Object.keys(p).filter(f=>!f.startsWith(".")&&!u.has(f)).sort();}else r=[...new Set([...Object.keys(w(p.jobs)??{}),...Object.keys(w(w(p.workflows)?.jobs)??{}),...j(p.stages)])].sort();a=j(p.on);}r.length===0&&(r=["pipeline"]);let n=await e.state.addProof({provider:this.id,artifact:i,absolutePath:o,...s?{}:{pointer:"/jobs"},trust:"authoritative",derivation:"authored",detail:"CI/CD workflow"}),l=e.state.addEntity({kind:"pipeline",key:`pipeline:${i}`,label:d,attributes:{jobs:r,triggers:a,artifact:i},proofIds:[n]});e.state.addRelation({from:v("workspace",`workspace:${e.state.workspaceName}`),to:l,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[n]});}}},ye={id:"codeowners",version:"1.0.0",async run(e){let t=[g.join(e.workspacePath,"CODEOWNERS"),g.join(e.workspacePath,".github","CODEOWNERS"),g.join(e.workspacePath,"docs","CODEOWNERS")];for(let o of t){if(!await P.pathExists(o))continue;let s=(await P.readFile(o,"utf8")).split(/\r?\n/);for(let d=0;d<s.length;d+=1){let r=s[d].trim();if(!r||r.startsWith("#"))continue;let[a,...n]=r.split(/\s+/);for(let l of n.filter(p=>p.startsWith("@"))){let p=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(o),absolutePath:o,line:d+1,trust:"authoritative",derivation:"authored",detail:`${a} ${l}`}),h=e.state.addEntity({kind:"owner",key:`owner:${l.toLowerCase()}`,label:l,aliases:[l],proofIds:[p]}),u=e.projects.filter(m=>{let k=a.replace(/^\//,"").replace(/\*.*$/,"");return k&&m.path.startsWith(k.replace(/\/$/,""))}),f=u.length>0?u.map(m=>v("project",`project:${m.id}`)):[v("workspace",`workspace:${e.state.workspaceName}`)];for(let m of f)e.state.addRelation({from:h,to:m,kind:"owns",trust:"authoritative",derivation:"authored",proofIds:[p]});}}}}},ve={id:"architecture-decisions",version:"1.0.0",async run(e){let t=new Set,o=[{root:e.workspacePath,files:e.workspaceFiles},...e.projects.map(i=>({root:i.root,files:e.filesByProject.get(i.id)??[]}))];for(let i of o){let s=i.files.filter(d=>{let r=R(g.relative(i.root,d));return /(?:^|\/)(?:adr|adrs|decisions)(?:\/).+\.md$/i.test(r)||/(?:^|\/)ADR[-_0-9].+\.md$/i.test(r)});for(let d of s){if(t.has(d))continue;t.add(d);let r=C(e.projects,d),a=await P.readFile(d,"utf8"),n=a.match(/^#\s+(.+)$/m)?.[1]?.trim()??g.basename(d,".md"),l=a.match(/^status\s*:\s*(.+)$/im)?.[1]?.trim(),p=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(d,r),absolutePath:d,line:1,trust:"authoritative",derivation:"authored",detail:`Architecture decision: ${n}`}),h=e.state.addEntity({kind:"decision",key:`decision:${e.state.artifactPath(d,r)}`,label:n,...r?{projectId:r.id}:{},attributes:{status:l,artifact:e.state.artifactPath(d,r)},proofIds:[p]}),u=r?v("project",`project:${r.id}`):v("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:u,to:h,kind:"decided-by",trust:"authoritative",derivation:"authored",proofIds:[p]});}}}},we=[de,ce,pe,le,fe,me,ue,he,ke,ye,ge,ve];async function be(e,t){for(let o of t.edges){let i=[];for(let s of o.evidence){let d=K(s.file);i.push(await e.addProof({provider:"project-topology",artifact:d,absolutePath:g.resolve(e.workspacePath,d),derivation:o.source==="inferred"?"inferred":"authored",trust:o.source==="inferred"?"observed":"authoritative",confidence:o.confidence,detail:s.detail??`${o.kind} relationship`}));}i.length===0&&i.push(await e.addProof({provider:"project-topology",artifact:a.model,derivation:"inferred",trust:"ambiguous",confidence:o.confidence,detail:`${o.kind} relationship without source locator`})),e.addRelation({from:v("project",`project:${o.from}`),to:v("project",`project:${o.to}`),kind:o.kind==="event-pub-sub"?"consumes":"depends-on",derivation:o.source==="inferred"?"inferred":"authored",trust:o.source==="inferred"?"observed":"authoritative",confidence:o.confidence,proofIds:i});}}function Pe(e){let t=[...e.entities.values()].filter(i=>i.kind==="endpoint"),o=new Map;for(let i of t){let s=String(i.attributes.method??"").toUpperCase(),d=String(i.attributes.path??"");if(!i.projectId||!s||!d)continue;let r=`${i.projectId}\0${s}\0${d}`,a=o.get(r)??[];a.push(i),o.set(r,a);}for(let i of o.values()){if(i.length<2)continue;let s=i.find(d=>d.proofIds.some(r=>e.proofs.get(r)?.trust==="authoritative"));if(s)for(let d of i.filter(r=>r.id!==s.id))e.addRelation({from:d.id,to:s.id,kind:"implements",derivation:"extracted",trust:"corroborated",confidence:"high",proofIds:[...d.proofIds,...s.proofIds]});}}function _(e,t){let o=[...new Set(e)],i=o.filter(s=>t.has(s)).length;return {eligibleCount:o.length,boundCount:i,unknownCount:o.length-i,coverageRatio:o.length===0?null:i/o.length}}function je(e,t){let o=e.filter(n=>n.kind==="project").map(n=>n.id),i=e.filter(n=>n.kind==="endpoint").map(n=>n.id),s=new Set(t.filter(n=>n.kind==="implements").flatMap(n=>[n.from,n.to])),d=new Set(t.filter(n=>n.kind==="tests").flatMap(n=>[n.from,n.to]).filter(n=>o.includes(n))),r=new Set(t.filter(n=>n.kind==="deploys").flatMap(n=>[n.from,n.to]).filter(n=>o.includes(n))),a=new Set(t.filter(n=>n.kind==="owns").flatMap(n=>[n.from,n.to]).filter(n=>o.includes(n)));return {apiImplementation:_(i,s),projectTests:_(o,d),projectDeployment:_(o,r),projectOwnership:_(o,a)}}async function Le(e){let t=g.resolve(e.workspacePath),o=e.now??new Date,i=e.projects.map(c=>({...c,root:c.absolutePath?g.resolve(c.absolutePath):g.resolve(t,c.path),artifactPrefix:c.absolutePath?`external/${c.id}`:R(c.path)})).sort((c,y)=>c.id.localeCompare(y.id)),s=new G(t,o,e.workspace.name),d=Math.max(100,Math.min(e.maxFilesPerProject??2e3,1e4)),r=new Map(await Promise.all(i.map(async c=>[c.id,await Z(c.root,d)]))),a=await Z(t,Math.min(d*Math.max(i.length,1),2e4)),n={workspacePath:t,projects:i,filesByProject:r,workspaceFiles:a,now:o,maxFilesPerProject:d,contract:e.contract??null,state:s};for(let c of we){let y={entities:s.entities.size,relations:s.relations.size,proofs:s.proofs.size,diagnostics:s.diagnostics.length},E="passed",$=[];try{await c.run(n),s.diagnostics.length>y.diagnostics&&(E="partial");}catch(I){E="failed";let S=I instanceof Error?I.message:String(I);$.push(S),s.diagnostics.push({code:`graph.provider.${c.id}.failed`,severity:"warning",message:`${c.id} provider failed: ${S}`,recommendation:"Repair the referenced source artifact and rerun workspace graph emit."});}s.providers.push({id:c.id,version:c.version,status:E,permission:"filesystem-read",discoveredEntities:s.entities.size-y.entities,discoveredRelations:s.relations.size-y.relations,proofCount:s.proofs.size-y.proofs,diagnostics:$});}Pe(s),await be(s,e.projectTopology);let l=[...s.entities.values()].sort((c,y)=>c.id.localeCompare(y.id)),p=[...s.relations.values()].sort((c,y)=>c.id.localeCompare(y.id)),h=[...s.proofs.values()].sort((c,y)=>c.id.localeCompare(y.id)),u=l.filter(c=>c.proofIds.length>0).length,f=p.filter(c=>c.proofIds.length>0).length,m=s.providers.filter(c=>["passed","partial"].includes(c.status)).length,k=e.projectTopology.diagnostics?.filter(c=>c.code==="graph.edges.missing").flatMap(c=>c.nodeIds??[])??[];return k.length>0&&s.diagnostics.push({code:"graph.knowledge.project_relationships_unknown",severity:"warning",message:`${k.length} project(s) have no proven inter-project relationship. This is unknown topology, not proof of independence.`,entityIds:k.map(c=>v("project",`project:${c}`)),recommendation:"Author service contracts or add OpenAPI, Compose, Kubernetes, package or import evidence."}),{schemaVersion:q,generatedAt:o.toISOString(),source:e.source,workspace:e.workspace,projectTopology:e.projectTopology,entities:l,relations:p,proofs:h,providers:[...s.providers].sort((c,y)=>c.id.localeCompare(y.id)),quality:{entityCount:l.length,relationCount:p.length,proofCount:h.length,entityProofCoverageRatio:l.length===0?1:u/l.length,relationProofCoverageRatio:p.length===0?1:f/p.length,providerSuccessRatio:s.providers.length===0?1:m/s.providers.length,conflictCount:s.diagnostics.filter(c=>c.code.includes("conflict")).length,unknownCount:s.diagnostics.filter(c=>c.code.includes("unknown")).length,bindingCoverage:je(l,p),portable:true,secretValuesEmitted:false},diagnostics:[...s.diagnostics].sort((c,y)=>c.code.localeCompare(y.code)||c.message.localeCompare(y.message))}}function Ge(e,t){return v(e,t)}
2
- export{q as a,Te as b,De as c,Le as d,Ge as e};
@@ -1 +0,0 @@
1
- import {a}from'./chunk-2OIBHUVH.js';import {f,e}from'./chunk-SS2VV3D5.js';import {createHash}from'crypto';import c from'path';import {execa}from'execa';import u from'fs-extra';var J="workspai.project-test-coverage.v1",k=".workspai/reports/project-test-coverage-last-run.json",L=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deps.edn","project.clj","build.sbt","CMakeLists.txt","meson.build","deno.json","deno.jsonc"];function p(e){let t=Number(e);return Number.isFinite(t)&&t>=0?t:0}function g(e,t,o=0){let n=p(e),r=Math.min(p(t),n),i=p(o);return {total:n,covered:r,skipped:i,percent:n>0?Math.round(r/n*1e4)/100:null}}function N(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e;return g(t.total,t.covered,t.skipped)}function y(e,t){let o=c.isAbsolute(t)?t:c.resolve(e,t),n=c.relative(e,o);return n&&!n.startsWith("..")?n.split(c.sep).join("/"):t}async function x(e){return createHash("sha256").update(await u.readFile(e)).digest("hex")}async function I(e){let t=c.resolve(e);for(;;){if(await u.pathExists(c.join(t,".workspai","project.json"))||await u.pathExists(c.join(t,".rapidkit","project.json"))||(await Promise.all(L.map(r=>u.pathExists(c.join(t,r))))).some(Boolean))return t;let n=c.dirname(t);if(n===t)return c.resolve(e);t=n;}}async function $(e){if(await u.pathExists(c.join(e,"deno.json"))||await u.pathExists(c.join(e,"deno.jsonc")))return "deno";if(await u.pathExists(c.join(e,"bun.lock"))||await u.pathExists(c.join(e,"bun.lockb")))return "bun";if(await u.pathExists(c.join(e,"package.json")))return "node";if(await u.pathExists(c.join(e,"pyproject.toml"))||await u.pathExists(c.join(e,"requirements.txt")))return "python";if(await u.pathExists(c.join(e,"go.mod")))return "go";let t=await u.pathExists(c.join(e,"pom.xml"))||await u.pathExists(c.join(e,"build.gradle"))||await u.pathExists(c.join(e,"build.gradle.kts"));return t&&(await P(e,o=>o.endsWith(".kt")||o.endsWith(".kts")&&o!=="build.gradle.kts"&&o!=="settings.gradle.kts",4)).length>0?"kotlin":t?"java":await u.pathExists(c.join(e,"Cargo.toml"))?"rust":await u.pathExists(c.join(e,"composer.json"))?"php":await u.pathExists(c.join(e,"Gemfile"))?"ruby":await u.pathExists(c.join(e,"mix.exs"))?"elixir":await u.pathExists(c.join(e,"deps.edn"))||await u.pathExists(c.join(e,"project.clj"))?"clojure":await u.pathExists(c.join(e,"build.sbt"))?"scala":await u.pathExists(c.join(e,"CMakeLists.txt"))?(await P(e,n=>/\.(c|cc|cpp|cxx)$/.test(n),3)).some(n=>/\.(cc|cpp|cxx)$/.test(n))?"cpp":"c":(await P(e,o=>/\.(sln|csproj)$/.test(o),2)).length>0?"dotnet":"unknown"}async function P(e,t,o=5){let n=[],r=[{dir:e,depth:0}],i=new Set([".git",".workspai",".rapidkit","node_modules",".venv","vendor","deps"]);for(;r.length>0;){let s=r.shift();if(!s)break;let a=await u.readdir(s.dir,{withFileTypes:true}).catch(()=>[]);for(let l of a){if(i.has(l.name))continue;let d=c.join(s.dir,l.name),m=c.relative(e,d).split(c.sep).join("/");l.isFile()&&t(l.name,m)&&n.push(d),l.isDirectory()&&s.depth<o&&r.push({dir:d,depth:s.depth+1});}}return n}async function S(e,t){let o=await u.readJson(t),n=o.total??o,r={};for(let s of ["lines","branches","functions","statements"]){let a=N(n[s]);a&&(r[s]=a);}let i=[];for(let[s,a]of Object.entries(o)){if(s==="total"||!a||typeof a!="object"||Array.isArray(a))continue;let l=a,d={};for(let m of ["lines","branches","functions","statements"]){let b=N(l[m]);b&&(d[m]=b);}i.push({path:y(e,s),metrics:d});}return {metrics:r,files:i,source:{format:"istanbul-json",path:t,sha256:await x(t)}}}async function H(e,t){let o=await u.readJson(t),n=o.totals??{},r={lines:g(n.num_statements,n.covered_lines)};p(n.num_branches)>0&&(r.branches=g(n.num_branches,n.covered_branches));let i=[];for(let[s,a]of Object.entries(o.files??{})){let l=a?.summary??{};i.push({path:y(e,s),metrics:{lines:g(l.num_statements,l.covered_lines),...p(l.num_branches)>0?{branches:g(l.num_branches,l.covered_branches)}:{}}});}return {metrics:r,files:i,source:{format:"coverage-py-json",path:t,sha256:await x(t)}}}function j(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,o=p(t.count),n=p(t.covered);return o>0?g(o,n):void 0}async function V(e,t){let o=await u.readJson(t),n=Array.isArray(o.data)?o.data[0]??{}:o,r=n.totals??{},i={};i.lines=j(r.lines),i.functions=j(r.functions),i.branches=j(r.branches),i.statements=j(r.regions);let s=[];for(let a of Array.isArray(n.files)?n.files:[]){if(!a||typeof a!="object"||Array.isArray(a))continue;let l=a,d=l.summary??{};s.push({path:y(e,String(l.filename??"unknown")),metrics:{lines:j(d.lines),functions:j(d.functions),branches:j(d.branches),statements:j(d.regions)}});}return {metrics:i,files:s,source:{format:"llvm-cov-json",path:t,sha256:await x(t)}}}async function M(e,t){let o=await u.readFile(t,"utf8"),n=[],r="",i=0,s=0,a=0,l=0,d=0,m=0,b=v=>{r&&(n.push({path:y(e,r),metrics:{lines:g(v.lineTotal,v.lineCovered),functions:g(v.functionTotal,v.functionCovered),branches:g(v.branchTotal,v.branchCovered)}}),i+=v.lineTotal,s+=v.lineCovered,a+=v.functionTotal,l+=v.functionCovered,d+=v.branchTotal,m+=v.branchCovered);},h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0};for(let v of o.split(/\r?\n/))v.startsWith("SF:")?r=v.slice(3):v.startsWith("LF:")?h.lineTotal=p(v.slice(3)):v.startsWith("LH:")?h.lineCovered=p(v.slice(3)):v.startsWith("FNF:")?h.functionTotal=p(v.slice(4)):v.startsWith("FNH:")?h.functionCovered=p(v.slice(4)):v.startsWith("BRF:")?h.branchTotal=p(v.slice(4)):v.startsWith("BRH:")?h.branchCovered=p(v.slice(4)):v==="end_of_record"&&(b(h),r="",h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0});return {metrics:{lines:g(i,s),functions:g(a,l),branches:g(d,m)},files:n,source:{format:"lcov",path:t,sha256:await x(t)}}}async function G(e,t){let o=await u.readFile(t,"utf8"),n=new Map;for(let s of o.split(/\r?\n/).slice(1)){let a=/^(.+?):\d+\.\d+,\d+\.\d+\s+(\d+)\s+(\d+)$/.exec(s.trim());if(!a)continue;let l=n.get(a[1])??{total:0,covered:0},d=p(a[2]);l.total+=d,p(a[3])>0&&(l.covered+=d),n.set(a[1],l);}let r=[...n.entries()].map(([s,a])=>({path:y(e,s),metrics:{statements:g(a.total,a.covered)}})),i=[...n.values()].reduce((s,a)=>({total:s.total+a.total,covered:s.covered+a.covered}),{total:0,covered:0});return {metrics:{statements:g(i.total,i.covered)},files:r,source:{format:"go-coverprofile",path:t,sha256:await x(t)}}}function T(e,t){let n=[...e.matchAll(new RegExp(`<counter\\s+type=["']${t}["']\\s+missed=["'](\\d+)["']\\s+covered=["'](\\d+)["']\\s*\\/?\\s*>`,"gi"))].at(-1);return n?g(Number(n[1])+Number(n[2]),n[2]):void 0}async function C(e,t){let o=await u.readFile(e,"utf8"),n={};if(t==="cobertura-xml"){let r=/<coverage\b([^>]*)>/i.exec(o)?.[1]??"",i=/\bline-rate=["']([\d.]+)["']/i.exec(r)?.[1],s=/\bbranch-rate=["']([\d.]+)["']/i.exec(r)?.[1];i&&(n.lines=g(1e4,Math.round(Number(i)*1e4))),s&&(n.branches=g(1e4,Math.round(Number(s)*1e4)));}if(t==="clover-xml"){let i=[...o.matchAll(/<metrics\b([^>]*)\/?>/gi)].at(-1)?.[1]??"",s=m=>p(new RegExp(`\\b${m}=["'](\\d+)["']`,"i").exec(i)?.[1]),a=s("statements"),l=s("methods"),d=s("conditionals");a>0&&(n.statements=g(a,s("coveredstatements"))),l>0&&(n.functions=g(l,s("coveredmethods"))),d>0&&(n.branches=g(d,s("coveredconditionals")));}return n.lines??=T(o,"LINE"),n.branches??=T(o,"BRANCH"),n.functions??=T(o,"METHOD"),n.statements??=T(o,"INSTRUCTION"),{metrics:n,files:[],source:{format:t,path:e,sha256:await x(e)}}}async function q(e){let t=await u.readFile(e,"utf8"),o=/<scoverage\b([^>]*)>/i.exec(t)?.[1]??"",n=b=>p(new RegExp(`\\b${b}=["']([\\d.]+)["']`,"i").exec(o)?.[1]),r=n("statement-count"),i=n("statements-invoked"),s=n("branch-count"),a=n("branches-invoked"),l=n("statement-rate"),d=n("branch-rate"),m={};return r>0?m.statements=g(r,i):l>0&&(m.statements=g(1e4,Math.round(l*100))),s>0?m.branches=g(s,a):d>0&&(m.branches=g(1e4,Math.round(d*100))),{metrics:m,files:[],source:{format:"scoverage-xml",path:e,sha256:await x(e)}}}async function D(e,t){let o=await u.readJson(t),n=new Map;for(let s of Object.values(o)){let a=s?.coverage;if(!(!a||typeof a!="object"||Array.isArray(a)))for(let[l,d]of Object.entries(a)){if(!Array.isArray(d))continue;let m=n.get(l)??[];d.forEach((b,h)=>{typeof b=="number"&&(m[h]=Math.max(m[h]??0,b));}),n.set(l,m);}}let r=[...n.entries()].map(([s,a])=>{let l=a.filter(d=>typeof d=="number");return {path:y(e,s),metrics:{lines:g(l.length,l.filter(d=>d>0).length)}}}),i=r.reduce((s,a)=>{let l=a.metrics.lines;return {total:s.total+(l?.total??0),covered:s.covered+(l?.covered??0)}},{total:0,covered:0});return {metrics:{lines:g(i.total,i.covered)},files:r,source:{format:"simplecov-json",path:t,sha256:await x(t)}}}async function z(e){let t=[{relativePath:"coverage/coverage-summary.json",parser:r=>S(e,r)},{relativePath:"coverage.json",parser:async r=>{let i=await u.readJson(r);return Array.isArray(i.data)?V(e,r):H(e,r)}},{relativePath:"coverage/lcov.info",parser:r=>M(e,r)},{relativePath:"cover/lcov.info",parser:r=>M(e,r)},{relativePath:"lcov.info",parser:r=>M(e,r)},{relativePath:"coverage.out",parser:r=>G(e,r)},{relativePath:"target/site/jacoco/jacoco.xml",parser:r=>C(r,"jacoco-xml")},{relativePath:"build/reports/jacoco/test/jacocoTestReport.xml",parser:r=>C(r,"jacoco-xml")},{relativePath:"coverage.xml",parser:r=>C(r,"clover-xml")},{relativePath:".resultset.json",parser:r=>D(e,r)}];for(let r of t){let i=c.join(e,r.relativePath);if(await u.pathExists(i))return r.parser(i)}let n=(await P(e,(r,i)=>r==="coverage.cobertura.xml"||r==="jacoco.xml"||r==="clover.xml"||r==="scoverage.xml"||i.endsWith("/coverage-summary.json"),7)).sort()[0];return n?n.endsWith("coverage-summary.json")?S(e,n):n.endsWith("jacoco.xml")?C(n,"jacoco-xml"):n.endsWith("coverage.cobertura.xml")?C(n,"cobertura-xml"):n.endsWith("scoverage.xml")?q(n):C(n,"clover-xml"):null}async function B(e){return u.readJson(c.join(e,"package.json")).catch(()=>null)}async function U(e,t){let o=(n,r)=>({cwd:e,executable:n,args:r});if(t==="node"||t==="bun"){let r=(await B(e))?.scripts??{},i=["test:coverage","test:cov","coverage"].find(a=>typeof r[a]=="string"),s=t==="bun"?"bun":await u.pathExists(c.join(e,"pnpm-lock.yaml"))?"pnpm":await u.pathExists(c.join(e,"yarn.lock"))?"yarn":"npm";if(i)return {runner:String(r[i]).split(/\s+/)[0]||s,invocations:[o(s,s==="yarn"?[i]:["run",i])],diagnostics:[]};if(typeof r.test=="string"){let a=s==="yarn"?["test","--coverage"]:s==="bun"?["test","--coverage","--coverage-reporter=lcov"]:["test","--","--coverage"];return {runner:String(r.test).split(/\s+/)[0]||s,invocations:[o(s,a)],diagnostics:[]}}return {runner:null,invocations:[],diagnostics:["No project-owned test or coverage script was detected."]}}if(t==="deno")return {runner:"deno",invocations:[o("deno",["test","--coverage=coverage"]),o("deno",["coverage","--lcov","--output=coverage/lcov.info","coverage"])],diagnostics:[]};if(t==="python")return {runner:"pytest-cov",invocations:[o(await u.pathExists(c.join(e,".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"))?c.join(".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"):process.platform==="win32"?"python":"python3",["-m","pytest","--cov=.","--cov-report=json:coverage.json"])],diagnostics:[]};if(t==="go")return {runner:"go test",invocations:[o("go",["test","./...","-coverprofile=coverage.out"])],diagnostics:[]};if(t==="java"){let n=await u.pathExists(c.join(e,"gradlew")),r=await u.pathExists(c.join(e,"gradlew.bat")),i=n||r,s=await u.pathExists(c.join(e,"mvnw")),a=await u.pathExists(c.join(e,"mvnw.cmd")),l=i?process.platform==="win32"&&r?".\\gradlew.bat":"./gradlew":await u.pathExists(c.join(e,"pom.xml"))?process.platform==="win32"&&a?".\\mvnw.cmd":s?"./mvnw":"mvn":"gradle";return {runner:i?"jacoco/gradle":"jacoco/maven",invocations:[o(l,i?["test","jacocoTestReport"]:["test","jacoco:report"])],diagnostics:[]}}return t==="dotnet"?{runner:"dotnet coverlet",invocations:[o("dotnet",["test","--collect:XPlat Code Coverage"])],diagnostics:[]}:t==="rust"?{runner:"cargo llvm-cov",invocations:[o("cargo",["llvm-cov","--json","--output-path","coverage.json"])],diagnostics:["cargo-llvm-cov must be available in the project toolchain."]}:t==="php"?{runner:"phpunit",invocations:[o(process.platform==="win32"?"vendor\\bin\\phpunit.bat":"vendor/bin/phpunit",["--coverage-clover","coverage.xml"])],diagnostics:[]}:t==="ruby"?{runner:"simplecov",invocations:[o("bundle",["exec","rspec"])],diagnostics:["The test suite must enable SimpleCov to emit .resultset.json."]}:t==="elixir"?{runner:"mix cover",invocations:[o("mix",["test","--cover"])],diagnostics:["Configure ExCoveralls for JSON or LCOV interchange when machine-readable coverage is required."]}:t==="clojure"?{runner:"cloverage",invocations:[o("clojure",["-M:coverage"])],diagnostics:["The project must declare a coverage alias such as cloverage."]}:t==="scala"?{runner:"sbt-scoverage",invocations:[o("sbt",["clean","coverage","test","coverageReport"])],diagnostics:["The project must declare the scoverage plugin."]}:t==="kotlin"?{runner:"jacoco/gradle",invocations:[o(await u.pathExists(c.join(e,process.platform==="win32"?"gradlew.bat":"gradlew"))?process.platform==="win32"?".\\gradlew.bat":"./gradlew":"gradle",["test","jacocoTestReport"])],diagnostics:["The project must declare the JaCoCo Gradle plugin."]}:t==="c"||t==="cpp"?{runner:"CTest/LLVM coverage",invocations:[o("ctest",["--test-dir","build","--output-on-failure"])],diagnostics:["The native build must be instrumented for coverage and export LCOV, Cobertura, or LLVM JSON evidence."]}:{runner:null,invocations:[],diagnostics:["Project runtime could not be detected."]}}function K(e,t){let o=e?c.relative(e,t).split(c.sep).join("/"):c.resolve(t),n=c.basename(t).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"project",r=createHash("sha256").update(o).digest("hex").slice(0,12);return `${n}--${r}`}function X(e){return e.lines?"lines":e.statements?"statements":e.branches?"branches":"functions"}async function se(e$1={}){let t=await I(e$1.projectPath??process.cwd()),o=a(t),n=await $(t),r=Math.max(0,Math.min(100,Math.round(e$1.target??80))),i=await U(t,n),s=[],a$1=Date.now();if(e$1.run)for(let f of i.invocations){let w=await execa(f.executable,f.args,{cwd:f.cwd,reject:false,timeout:6e5}).catch(()=>({exitCode:1}));if(s.push(Number(w.exitCode??1)),Number(w.exitCode??1)!==0)break}let l=await z(t).catch(()=>null),d=l?X(l.metrics):"lines",m=l?.metrics[d]?.percent??null,b=e$1.run&&s.some(f=>f!==0)?"failed":m===null?"unavailable":m>=r?"passed":"below-target",h=K(o,t),v=c.join(t,k),R=o?`.workspai/reports/projects/${h}/project-test-coverage-last-run.json`:null,E={schemaVersion:J,generatedAt:new Date().toISOString(),status:b,project:{id:h,name:c.basename(t),path:t,workspacePath:o},runtime:n,runner:i.runner,target:{metric:d,percent:r},metrics:l?.metrics??{},files:l?.files??[],lowCoverageFiles:(l?.files??[]).map(f=>{let w=f.metrics[d]??f.metrics.lines??f.metrics.statements;return {path:f.path,percent:w?.percent??null,uncovered:Math.max(0,(w?.total??0)-(w?.covered??0))}}).filter(f=>f.percent===null||f.percent<r).sort((f,w)=>w.uncovered-f.uncovered||f.path.localeCompare(w.path)),source:l?.source??{format:"unknown",path:null,sha256:null},execution:{requested:e$1.run===true,invocations:i.invocations,exitCodes:s,durationMs:Date.now()-a$1},diagnostics:[...i.diagnostics,...l?[]:["No supported machine-readable coverage artifact was found."]],artifactPaths:{project:v,workspaceLatest:o?c.join(o,k):null,workspaceProject:o&&R?c.join(o,R):null}};return o&&R&&await f(o,k,[{relativePath:k,payload:E},{relativePath:R,payload:E}]),await e(t,k,E),E}export{k as PROJECT_TEST_COVERAGE_ARTIFACT,J as PROJECT_TEST_COVERAGE_SCHEMA,se as collectProjectTestCoverage};
@@ -1 +0,0 @@
1
- export{d as WORKSPACE_CONTEXT_AGENT_REPORT_PATH,c as WORKSPACE_CONTEXT_SCHEMA_VERSION,e as buildWorkspaceAgentContext,f as writeWorkspaceAgentContext}from'./chunk-IDQKVJUF.js';
@@ -1 +0,0 @@
1
- export{b as buildWorkspaceExplain,a as resolveWorkspaceExplainArtifactPath,c as writeWorkspaceExplainReport}from'./chunk-MV7KF75Q.js';export{c as WORKSPACE_EXPLAIN_REPORT_PATH,e as WORKSPACE_TRACE_REPORT_PATH,d as WORKSPACE_WHY_REPORT_PATH}from'./chunk-DQ3PI7EP.js';export{e as WORKSPACE_MODEL_DIFF_REPORT_PATH}from'./chunk-C3FLCDRN.js';
@@ -1 +0,0 @@
1
- export{a as WORKSPACE_EXPLAIN_SCHEMA_VERSION,b as WORKSPACE_EXPLAIN_TARGETS,e as isWorkspaceExplainReport,c as parseWorkspaceExplainTarget,d as resolveWorkspaceTraceTarget}from'./chunk-BHYTI3RH.js';export{c as WORKSPACE_EXPLAIN_REPORT_PATH,e as WORKSPACE_TRACE_REPORT_PATH,d as WORKSPACE_WHY_REPORT_PATH}from'./chunk-DQ3PI7EP.js';
@@ -1 +0,0 @@
1
- export{a as WORKSPACE_GRAPH_TOKEN_EFFICIENCY_SCHEMA_VERSION,b as buildWorkspaceGraphTokenEfficiencyReport}from'./chunk-CV5HKU4P.js';
@@ -1 +0,0 @@
1
- import {a as a$2}from'./chunk-KKAOTTYO.js';import {q as q$1}from'./chunk-AL2A7Q4X.js';import {b as b$1,c}from'./chunk-MV7KF75Q.js';import {a as a$3}from'./chunk-RTVRZFIJ.js';import {g}from'./chunk-DDQ3XK3H.js';import {j,e as e$1}from'./chunk-BQGBU2Y3.js';import {l as l$1}from'./chunk-UETZ7USY.js';import {a as a$1,e as e$2,f as f$1}from'./chunk-IDQKVJUF.js';import {f,g as g$1,h as h$2}from'./chunk-6UTM5AJI.js';import {k,l,h as h$1,m as m$1,n,p as p$1,q}from'./chunk-C3FLCDRN.js';import {m,p,s}from'./chunk-L2YK5RV2.js';import {o,r as r$1,s as s$1}from'./chunk-KMLPHFLD.js';import {e}from'./chunk-SS2VV3D5.js';import {b as b$2}from'./chunk-RVQLMTTI.js';import {a,b,h,i,g as g$2,f as f$2}from'./chunk-AHLMIL2T.js';import re from'path';import ie from'fs-extra';function r(a,t){if(!a)throw new Error(`Workspace Intelligence run semantic violation: ${t}`)}function se(a,t){return a.length===t.length&&a.every((u,d)=>u===t[d])}function ae(a$2){b$2(a.intelligenceRun,a$2,"Workspace Intelligence run report"),r(a$2.chainSchemaVersion===a$1,`chainSchemaVersion must be ${a$1}`),r(a$2.artifactPath===a.intelligenceRun,`artifactPath must be ${a.intelligenceRun}`),r(a$2.preflight.length===g$2.length,`preflight must contain exactly ${g$2.length} entries`);for(let[o,i]of g$2.entries()){let s=a$2.preflight[o];r(s?.id===i,`preflight[${o}].id must be ${i}`),r(se(s.artifacts,h[i]),`${i} preflight artifacts must match the runtime registry`),i==="sync"?r(s.status==="passed"&&s.result==="synchronized"||s.status==="failed"&&s.result==="failed","sync preflight status and result are incoherent"):r(s.status==="passed"&&(s.result==="created"||s.result==="reused")||s.status==="failed"&&s.result==="failed"||s.status==="skipped"&&s.result==="skipped","baseline preflight status and result are incoherent");}let t=a$2.preflight[1];r(a$2.baselineCreated===(t?.result==="created"),"baselineCreated must match the baseline preflight result"),r(a$2.stages.length===f$2.length,`stages must contain exactly ${f$2.length} canonical steps`);let u=a$2.preflight[0],d=u?.status==="failed";for(let[o,i$1]of f$2.entries()){let s=a$2.stages[o];r(s?.id===i$1,`stages[${o}].id must be ${i$1}`),r(se(s.artifacts,i[i$1].produces),`${i$1} artifacts must match the runtime registry`),d&&r(s.status==="skipped",`${i$1} must be skipped after a hard failure`),s.status==="passed"?r(s.exitCode===0,`${i$1} passed stage must have exitCode 0`):s.status==="blocked"?r(s.exitCode!==0,`${i$1} blocked stage must have a non-zero exitCode`):s.status==="failed"?(r(s.exitCode===1,`${i$1} failed stage must have exitCode 1`),d=true):(r(s.exitCode===0,`${i$1} skipped stage must have exitCode 0`),r(s.durationMs===0,`${i$1} skipped stage must have durationMs 0`)),o===0&&((u?.status==="failed"||s.status==="failed")&&r(t?.status==="skipped","baseline must be skipped when sync or model fails"),t?.status==="skipped"&&r(u?.status==="failed"||s.status==="failed"||s.status==="skipped","baseline may be skipped only after an upstream failure"),t?.status!=="passed"&&(d=true));}let m=a$2.preflight.some(o=>o.status==="failed")||a$2.stages.some(o=>o.status==="failed"),E=a$2.stages.some(o=>o.status==="blocked"),n=m?"failed":E?"blocked":"passed",f=n==="failed"?1:n==="blocked"?2:0;r(a$2.status===n,`status must be ${n}`),r(a$2.exitCode===f,`exitCode must be ${f}`);}var ue=a.intelligenceRun,pe=b.intelligenceRun,ne=ue;async function Oe(a$4){let t=re.resolve(a$4.workspacePath),u=[],d=[],m$2=false,E=async(e,l)=>{let g=[...h[e]];if(m$2){u.push({id:e,status:"skipped",result:"skipped",durationMs:0,artifacts:g,message:"skipped because a required upstream operation failed"});return}let k=Date.now();try{let c=await l();u.push({id:e,status:"passed",result:c.result,durationMs:Date.now()-k,artifacts:g,message:c.message});}catch(c){m$2=true,u.push({id:e,status:"failed",result:"failed",durationMs:Date.now()-k,artifacts:g,message:c instanceof Error?c.message:String(c)});}},n$1=async(e,l)=>{let g=[...i[e].produces];if(m$2){d.push({id:e,status:"skipped",durationMs:0,artifacts:g,exitCode:0,message:"skipped because a required upstream stage failed"});return}let k=Date.now();try{let c=await l(),b=c.exitCode??0;d.push({id:e,status:c.blocked||b!==0?"blocked":"passed",durationMs:Date.now()-k,artifacts:g,exitCode:b,message:c.message});}catch(c){m$2=true,d.push({id:e,status:"failed",durationMs:Date.now()-k,artifacts:g,exitCode:1,message:c instanceof Error?c.message:String(c)});}};await E("sync",async()=>{let e=await g(t,true),l=await o({workspacePath:t});return {result:"synchronized",message:`registry ${e.added.length} added/${e.skipped} existing; contract ${l.contract.projects.length} projects`}});let f$2,o$1=()=>{if(!f$2)throw new Error("canonical workspace model is unavailable");return f$2};await n$1("model",async()=>(f$2={...await p({workspacePath:t,includeEvidence:true}),build:m({mode:"full",engineStatus:"disabled"})},await s(f$2,t),{message:`${f$2.summary.projectCount} projects modeled`}));let i$1=re.join(t,a.snapshot),s$2=false;await E("baseline",async()=>{if(!await ie.pathExists(i$1)){let g=await k({workspacePath:t,model:o$1()});return await l(g,t),s$2=true,{result:"created",message:"initial structural baseline created"}}let e=await ie.readJson(i$1),l$1=h$1(e);return l$1?(await l(l$1,t),{result:"reused",message:"legacy structural baseline migrated and reused"}):{result:"reused",message:"existing structural baseline reused"}}),await n$1("diff",async()=>{let e=await m$1({workspacePath:t,fromPath:a.snapshot,model:o$1()});return await n(e,t),{message:e.summary.changed?"workspace changes detected":"no workspace changes"}}),await n$1("impact",async()=>{let e=await p$1({workspacePath:t,fromPath:a.diff});return await q(e,t),{message:`${e.summary.risk} risk; ${e.summary.affectedProjects} affected`}}),await n$1("doctor-evidence",async()=>{let e=await q$1({workspace:t,json:true,quiet:true});return {exitCode:e,blocked:e!==0,message:`doctor exit ${e}`}}),await n$1("contract-evidence",async()=>{let e=await r$1({workspacePath:t,strict:true});return await s$1({workspacePath:t,result:e}),{exitCode:e.status==="passed"?0:1,blocked:e.status!=="passed",message:`contract ${e.status}`}}),await n$1("analyze-evidence",async()=>{let e=await a$2({workspacePath:t,json:true,strict:false});return {blocked:e.summary.verdict==="blocked"||a$4.strict===true&&e.summary.verdict==="needs-attention",exitCode:e.summary.verdict==="blocked"||a$4.strict===true&&e.summary.verdict==="needs-attention"?1:0,message:`analyze ${e.summary.verdict} (${e.summary.score}/100)`}}),await n$1("readiness-evidence",async()=>{let e=await a$3({startPath:t,writeReport:true,skipVerify:true});return {blocked:e.overallStatus==="fail"||a$4.strict===true&&e.overallStatus==="warn",exitCode:e.overallStatus==="fail"||a$4.strict===true&&e.overallStatus==="warn"?1:0,message:`pre-verify readiness ${e.overallStatus}`}}),await n$1("verify",async()=>{let e=await f({workspacePath:t,fromImpactPath:a.impact});await g$1(e,t);let l=h$2(e,{strict:a$4.strict===true});return await j(t,e$1(e,l.passed)),{blocked:!l.passed,exitCode:l.exitCode,message:`${e.summary.verdict}; gate ${l.passed?"passed":"blocked"}`}}),await n$1("context",async()=>{let e=await e$2({workspacePath:t,model:o$1(),agent:a$4.agent??"generic",includeEvidence:true});return await f$1(e,t),{message:`context grounded for ${e.agent}`}}),await n$1("agent-sync",async()=>({message:`${(await l$1({workspacePath:t,agent:a$4.agent??"generic",write:true,refreshContext:false,strict:false,preset:"enterprise"})).writtenFiles.length} grounding files written`})),await n$1("explain",async()=>{let e=await b$1({workspacePath:t,target:{kind:"release-blocked"}});return await c(e,t),{message:e.summary}});let oe=d.some(e=>e.status==="blocked"),W=m$2?"failed":oe?"blocked":"passed",ce=m$2?1:W==="blocked"?2:0,w={schemaVersion:pe,chainSchemaVersion:a$1,generatedAt:new Date().toISOString(),workspacePath:t,baselineCreated:s$2,preflight:u,status:W,exitCode:ce,stages:d,artifactPath:ne};return ae(w),await e(t,ne,w),w}export{ue as WORKSPACE_INTELLIGENCE_RUN_REPORT_PATH,pe as WORKSPACE_INTELLIGENCE_RUN_SCHEMA_VERSION,Oe as runWorkspaceIntelligenceChain};
@@ -1 +0,0 @@
1
- export{a as runWorkspaceStage}from'./chunk-5EXZBCAZ.js';export{a as WORKSPACE_RUN_LAST_REPORT_FILENAME}from'./chunk-VKTUWUS6.js';
@@ -1 +0,0 @@
1
- import {a}from'./chunk-KXG6E5VK.js';import {f as f$1,r,l}from'./chunk-L2YK5RV2.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import R from'fs';var P="workspace-watch-event.v1";function b(e){return a$1(e,"contracts/workspace-watch-event.v1.json","Workspace watch event"),e}function g(e){return `${e.from}\0${e.to}\0${e.kind}`}function f(e){return (l(e)?.edges??[]).map(o=>({from:o.from,to:o.to,kind:o.kind}))}function m(e){let r=[...a(e).entries()].sort((a,n)=>a[0].localeCompare(n[0])).map(([a,n])=>({id:a,hash:n})),c=f(e).map(g).sort((a,n)=>a.localeCompare(n));return f$1({projects:r,edges:c})}function y(e,o){let r=a(o),c=e?a(e):new Map,a$1=[],n=[];for(let[t,s]of r.entries())c.has(t)?c.get(t)!==s&&a$1.push(t):n.push(t);let d=[];for(let t of c.keys())r.has(t)||d.push(t);let i=new Map(e?f(e).map(t=>[g(t),t]):[]),l=new Map(f(o).map(t=>[g(t),t])),p=[];for(let[t,s]of l.entries())i.has(t)||p.push(s);let h=[];for(let[t,s]of i.entries())l.has(t)||h.push(s);let u=(t,s)=>g(t).localeCompare(g(s));return a$1.sort((t,s)=>t.localeCompare(s)),n.sort((t,s)=>t.localeCompare(s)),d.sort((t,s)=>t.localeCompare(s)),p.sort(u),h.sort(u),{changedProjects:a$1,addedProjects:n,removedProjects:d,edgesAdded:p,edgesRemoved:h}}var k=class{model=null;sequence=0;rebuild;now;constructor(o,r$1){this.rebuild=r$1?.rebuild??(()=>r({...o})),this.now=r$1?.now??(()=>new Date);}get currentModel(){return this.model}async start(){let o=Date.now(),{model:r}=await this.rebuild();return this.model=r,this.buildEvent("ready","initial",null,r,Date.now()-o)}async pulse(){let o=Date.now(),r=this.model,{model:c,mode:a}=await this.rebuild(),n=this.buildEvent(this.hasStructuralChange(r,c)?"changed":"unchanged",a,r,c,Date.now()-o);return this.model=c,n}hasStructuralChange(o,r){return o?m(o)!==m(r):true}buildEvent(o,r,c,a,n){let d=y(c,a),i=m(a),l=c?m(c)!==i:true;return b({schemaVersion:P,kind:o,sequence:this.sequence++,timestamp:this.now().toISOString(),mode:r,modelHash:i,modelHashChanged:l,changedProjects:d.changedProjects,addedProjects:d.addedProjects,removedProjects:d.removedProjects,graph:{nodeCount:a.graph?.nodes.length??0,edgeCount:a.graph?.edges.length??0,edgesAdded:d.edgesAdded,edgesRemoved:d.edgesRemoved},durationMs:n})}},C=new Set([".git",".hg",".svn","node_modules",".venv","venv","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),S=new Set(["reports","cache","tmp",".cache"]);function j(e){if(!e)return false;let o=e.split(/[\\/]/).filter(Boolean);if(o.some(r=>C.has(r)))return false;for(let r=0;r<o.length-1;r+=1)if((o[r]===".workspai"||o[r]===".rapidkit")&&S.has(o[r+1]))return false;return true}async function T(e){let o=new k(e.buildOptions,e.engineOptions),r=await o.start();if(e.emit(r),o.currentModel&&await e.onModel?.(o.currentModel,r),e.once)return;let c=e.debounceMs??250,a=e.selfWriteSuppressionMs??Math.max(400,c+150),n=null,d=false,i=false,l=0,p=async()=>{if(d){i=true;return}d=true;try{let t=await o.pulse();e.emit(t),o.currentModel&&await e.onModel?.(o.currentModel,t);}catch(t){e.emit(b({schemaVersion:P,kind:"error",sequence:-1,timestamp:new Date().toISOString(),mode:"full",modelHash:o.currentModel?m(o.currentModel):"",modelHashChanged:false,changedProjects:[],addedProjects:[],removedProjects:[],graph:{nodeCount:0,edgeCount:0,edgesAdded:[],edgesRemoved:[]},durationMs:0,error:t instanceof Error?t.message:String(t)}));}finally{d=false,l=Date.now()+a,i&&(i=false,p());}},h=t=>{j(t)&&(d||Date.now()<l||(n&&clearTimeout(n),n=setTimeout(()=>{n=null,p();},c)));};e.onProgress?.(`Watching ${e.workspacePath} for changes (Ctrl+C to stop).`);let u=R.watch(e.workspacePath,{recursive:true},(t,s)=>{typeof s=="string"?h(s):s&&h(Buffer.from(s).toString("utf8"));});await new Promise(t=>{let s=()=>{n&&clearTimeout(n),u.close(),t();};if(e.signal){if(e.signal.aborted){s();return}e.signal.addEventListener("abort",s,{once:true});}u.on("error",()=>s());});}export{P as WORKSPACE_WATCH_EVENT_SCHEMA_VERSION,k as WorkspaceWatchEngine,m as computeWatchModelHash,y as diffWatchModels,j as isWatchRelevantPath,T as runWorkspaceWatch};