workspai 0.76.0 → 0.78.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.
- package/README.md +2 -2
- package/contracts/create-planner-capabilities.v1.json +50 -2
- package/contracts/runtime-command-surface.v1.json +5 -1
- package/contracts/workspace-intelligence/workspace-model.v1.json +4 -0
- package/contracts/workspace-intelligence-architecture.v1.json +5 -1
- package/dist/analyze-X76YV667.js +1 -0
- package/dist/autopilot-release-6OV2FLRS.js +1 -0
- package/dist/capabilities-command-TIBIKWPK.js +1 -0
- package/dist/{chunk-RKFTUIZ4.js → chunk-2CUT4GLE.js} +1 -1
- package/dist/chunk-3PGXGAHC.js +2 -0
- package/dist/{chunk-AGI46TSQ.js → chunk-4AAXIWYY.js} +1 -1
- package/dist/{chunk-FBF767WP.js → chunk-4KAYWMNE.js} +1 -1
- package/dist/chunk-4ZUBPFSO.js +6 -0
- package/dist/{chunk-2I2A55RE.js → chunk-5FVREPQC.js} +1 -1
- package/dist/{chunk-KO4DM2AV.js → chunk-5OKNWBAN.js} +1 -1
- package/dist/{chunk-4MXKXHLW.js → chunk-75WJOYWT.js} +1 -1
- package/dist/{chunk-H4YHIOCT.js → chunk-7EMG3C3H.js} +3 -3
- package/dist/{chunk-TJ3MDZMC.js → chunk-7HV4U2OV.js} +1 -1
- package/dist/{chunk-TFFNHWXY.js → chunk-AMGIXK6Z.js} +1 -1
- package/dist/{chunk-QIPW3G2H.js → chunk-FLAGHVSH.js} +1 -1
- package/dist/chunk-HB3ZYG2Z.js +4737 -0
- package/dist/{chunk-IKNWNGLY.js → chunk-HMWZWT7B.js} +1 -1
- package/dist/{chunk-PUH3TSPC.js → chunk-IQJL3LBM.js} +1 -1
- package/dist/{chunk-HRGIHWYH.js → chunk-KRTVIBPC.js} +1 -1
- package/dist/chunk-MD4CHXV3.js +2 -0
- package/dist/{chunk-4BBFEHPL.js → chunk-MN5S462C.js} +1 -1
- package/dist/{chunk-X7MDTBX5.js → chunk-ONUFNCRN.js} +1 -1
- package/dist/chunk-QDM6TWFK.js +1 -0
- package/dist/chunk-QLHRGWUW.js +10 -0
- package/dist/{chunk-Z2M2XCIB.js → chunk-QMNJTI65.js} +1 -1
- package/dist/{chunk-23CNBYIW.js → chunk-RHF2IZOW.js} +1 -1
- package/dist/{chunk-UOTOJJI4.js → chunk-RJESUJQF.js} +5 -5
- package/dist/chunk-RQXZF7BZ.js +1 -0
- package/dist/{chunk-FD2ZGGCQ.js → chunk-TJRVWVAZ.js} +1 -1
- package/dist/{chunk-KW35SWG6.js → chunk-UVIBPWOG.js} +2 -2
- package/dist/{chunk-BZLDCASY.js → chunk-VEMGICT4.js} +1 -1
- package/dist/{chunk-PSQPKK6H.js → chunk-VRZAN3WS.js} +62 -62
- package/dist/{chunk-L6VNI4DN.js → chunk-YHQK4S3H.js} +1 -1
- package/dist/{chunk-ZXQC36NJ.js → chunk-YWC5MKIL.js} +1 -1
- package/dist/{chunk-R3Z4LY3O.js → chunk-ZQ36CTLF.js} +1 -1
- package/dist/{create-ZRUQ3KNZ.js → create-WB5YQ7C6.js} +1 -1
- package/dist/{doctor-7V7LJLHX.js → doctor-HOSHQ7II.js} +1 -1
- package/dist/{goal-lifecycle-EM4DUJCR.js → goal-lifecycle-UEJMTUFV.js} +1 -1
- package/dist/{goal-pack-YMWZHAH6.js → goal-pack-YGZMG3RQ.js} +1 -1
- package/dist/index.js +261 -251
- package/dist/{pipeline-6MBH3MU2.js → pipeline-Z4JOJ4PX.js} +1 -1
- package/dist/{project-agent-entry-ZXAE2MAJ.js → project-agent-entry-ZMDQWJ6I.js} +1 -1
- package/dist/{project-intelligence-lens-NBTPOK2R.js → project-intelligence-lens-FSWQKY3E.js} +1 -1
- package/dist/{project-test-coverage-HOZC72EK.js → project-test-coverage-EJ3MBSZ3.js} +1 -1
- package/dist/{proof-carrying-change-WJFAKK3C.js → proof-carrying-change-M2RNYQ7E.js} +1 -1
- package/dist/{verified-goal-B7EX2PBE.js → verified-goal-UAUCEDZZ.js} +1 -1
- package/dist/{workspace-EBPYCSEM.js → workspace-J5QYWAE3.js} +1 -1
- package/dist/{workspace-agent-sync-Y4F6FBBC.js → workspace-agent-sync-GLG36KQZ.js} +1 -1
- package/dist/{workspace-context-Y7F7GJCQ.js → workspace-context-BZV4ZFKZ.js} +1 -1
- package/dist/{workspace-contract-XJMWMVQE.js → workspace-contract-XDNIB5JX.js} +1 -1
- package/dist/{workspace-explain-T2J5ZLY7.js → workspace-explain-V3XDMONQ.js} +1 -1
- package/dist/{workspace-foundation-2UP6IMTH.js → workspace-foundation-EDTKW2RB.js} +1 -1
- package/dist/{workspace-graph-stream-MZVL3OCX.js → workspace-graph-stream-UPASFCAF.js} +1 -1
- package/dist/{workspace-intelligence-FZRQIFFM.js → workspace-intelligence-24MZRG2S.js} +1 -1
- package/dist/{workspace-intelligence-runner-IXT62JG7.js → workspace-intelligence-runner-HISKHQLG.js} +1 -1
- package/dist/{workspace-knowledge-graph-EFC4TUDZ.js → workspace-knowledge-graph-5EECTGXQ.js} +1 -1
- package/dist/workspace-knowledge-graph-snapshot-T6ZJGWLC.js +1 -0
- package/dist/{workspace-mcp-serve-C42UUU7W.js → workspace-mcp-serve-S3TWO4RI.js} +1 -1
- package/dist/{workspace-model-72SJ6WXT.js → workspace-model-J757KSDE.js} +1 -1
- package/dist/{workspace-onboarding-TFDAIHTS.js → workspace-onboarding-3TLME4HP.js} +1 -1
- package/dist/{workspace-registry-summary-ZNTXSUI4.js → workspace-registry-summary-ZC5CFZXP.js} +1 -1
- package/dist/{workspace-repair-engine-542TAL3Z.js → workspace-repair-engine-C26C7OIB.js} +1 -1
- package/dist/workspace-run-2KBTMGG7.js +1 -0
- package/dist/{workspace-verify-UXKENOQU.js → workspace-verify-KFBWQ37C.js} +1 -1
- package/dist/{workspace-watch-DV5AHLOK.js → workspace-watch-LNP5JPD4.js} +1 -1
- package/docs/README.md +2 -0
- package/docs/agent-framework-adapters.md +72 -18
- package/docs/ci-workflows.md +20 -6
- package/docs/commands-reference.md +7 -2
- package/docs/create-planner-capabilities.md +1 -0
- package/docs/creating-workspaces-and-projects.md +26 -7
- package/docs/doctor-command.md +8 -3
- package/docs/model-gateways.md +204 -0
- package/docs/native-kit-baselines.md +4 -3
- package/package.json +6 -1
- package/scripts/enterprise-package-smoke.mjs +152 -0
- package/dist/analyze-QVRVJB7I.js +0 -1
- package/dist/autopilot-release-DOGIETAT.js +0 -1
- package/dist/capabilities-command-FYBUVHZ7.js +0 -1
- package/dist/chunk-4R44E7HN.js +0 -6
- package/dist/chunk-5S6IZ6PY.js +0 -2
- package/dist/chunk-NSC4VWV2.js +0 -1
- package/dist/chunk-QFDTKOYS.js +0 -2649
- package/dist/chunk-QVFIR64T.js +0 -10
- package/dist/chunk-VODNLROY.js +0 -1
- package/dist/chunk-YLLCZMKP.js +0 -2
- package/dist/workspace-knowledge-graph-snapshot-QIMF7TCF.js +0 -1
- package/dist/workspace-run-NAPJYNSZ.js +0 -1
package/dist/chunk-QVFIR64T.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import {d,b,e}from'./chunk-P5LI5DL3.js';import {a}from'./chunk-NMXGSVMD.js';import {d as d$3}from'./chunk-S5KTATOU.js';import {B,q as q$1,A,u as u$1,z,D}from'./chunk-TJ3MDZMC.js';import {d as d$2,c as c$1}from'./chunk-ROOPODG6.js';import {k,m,g as g$1,f}from'./chunk-H4YHIOCT.js';import {g}from'./chunk-BLEIUQL6.js';import {q as q$2,e as e$1,g as g$2}from'./chunk-6BO4QHKA.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {c,d as d$1}from'./chunk-25AWHAB5.js';import {u,q,t as t$1}from'./chunk-VQZ5PI5J.js';import {p as p$1,t}from'./chunk-ODK4LCEL.js';import re from'fs';import p from'path';import M from'chalk';import {execa}from'execa';var kt={"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:[]}}},bt={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 pe(e,r){if(r){let t=r.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=f(r),o=`${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 kt[o]}}function Xe(e,r,t){if(r){let n=pe(e,r);if(n&&n.commands[t])return n.commands[t]}if(["init","test","build","start"].includes(t)){let n=bt[t]?.[e]??[];return n.length>0?n[0]:void 0}}var wt={test:"test",build:"build",start:"start"};function fe(e){if(e.stage==="init")return e.runtime==="node"?A(e.projectPath):Xe(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let r=wt[e.stage];if(r){let t=u$1(e.projectPath,r,{framework:e.framework});if(t)return z(e.projectPath,t.scriptName)}}return Xe(e.runtime,e.framework,e.stage)}function vt(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,s)=>s.indexOf(t)===n);return {primary:r.length>0?r[0]:"unknown",secondary:r.slice(1)}}function et(e){return vt(e).primary}function tt(e,r,t){if(!e)return "unknown";r||(r={timeout:["timed out","timeout","deadline exceeded","SocketTimeoutException"],dependency:["cannot find module","import.*error","Could not find a package configuration file provided by","CMAKE_PREFIX_PATH","failed to fetch","error while requesting resource","unable to (?:resolve|connect)","could not resolve host","network (?:is )?unreachable","ECONNREFUSED","ENOTFOUND"],setup:["ModuleNotFoundError","No module named","npm ERR!","error:","not found"],"test-failure":["FAILED","FAIL","failed"],runtime:["Exception","Error:","panic","TypeError"],unknown:[]});for(let[n,s]of Object.entries(r))if(!(n==="test-failure"&&t&&t!=="test")){for(let o of s)if(new RegExp(o,"i").test(e))return n}return "unknown"}async function te(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 s=p.isAbsolute(t)?t:p.resolve(r??process.cwd(),t);try{return await re.promises.access(s,process.platform==="win32"?re.constants.F_OK:re.constants.X_OK),{valid:true}}catch{return {valid:false,reason:`Command '${t}' not found or not executable in '${r??process.cwd()}'`}}}try{let s=process.platform==="win32"?"where":"which";if((await execa(s,[t],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${t}' not found or not executable`}}function rt(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(s=>["init","test","build","start"].includes(s))?r:{};return t&&typeof n[t]=="string"?n[t]:typeof n.default=="string"?n.default:e}async function nt(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(s=>{let o=new n.Socket,i=5e3;o.setTimeout(i),o.on("connect",()=>{o.destroy(),s({healthy:true,reason:`Port ${t} is listening`});}),o.on("timeout",()=>{o.destroy(),s({healthy:false,reason:`Port ${t} timeout after ${i}ms`});}),o.on("error",l=>{o.destroy(),s({healthy:false,reason:`Port ${t} error: ${String(l)}`});}),o.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 s=new AbortController;n=setTimeout(()=>s.abort(),5e3);let o=await fetch(t,{method:"GET",signal:s.signal});return {healthy:o.status===200,reason:`HTTP ${o.status}`,metadata:{status:o.status}}}catch(s){return {healthy:false,reason:`HTTP check error: ${s instanceof Error?s.message:String(s)}`}}finally{n&&clearTimeout(n);}}case "log":{let t=e.value;if(!r)return {healthy:true};try{let n=[p.join(r,".workspai","last-run.log"),p.join(r,".rapidkit","last-run.log")].find(s=>re.existsSync(s));if(n){let s=re.readFileSync(n,"utf-8"),o=new RegExp(t,"i");return {healthy:o.test(s),reason:o.test(s)?"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 ot={init:"init",test:"test",build:"build",start:"start"};function xt(e){return e in ot?ot[e]:null}function Rt(e,r){let n=q$1(e)?.contextJson?.commands;if(!n||typeof n!="object"||Array.isArray(n))return;let s=n[r];if(typeof s=="string"&&s.trim().length>0)return s.trim();if(s&&typeof s=="object"&&!Array.isArray(s)){let o=s,i=o.default??o.dev;if(typeof i=="string"&&i.trim().length>0)return i.trim()}}function st(e,r,t=D(e)){let n=xt(r);if(!n)return Rt(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 s=t.commandMap[n];if(!s||s.status!=="supported"){let o=t.runtimeSupportTier==="observed"||t.frameworkSupportTier==="observed";return {supported:false,reason:s?.reason??`Command "${n}" is not supported for this project runtime/framework.`,shouldFail:!o}}return {supported:true}}var St=new Set(["init","test","build","start"]),Ct=new Set([".git","node_modules",".workspai",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function Z(e){try{return await re.promises.access(e,re.constants.F_OK),true}catch{return false}}function at(e,r){let t=p.relative(p.resolve(e),p.resolve(r));return t===""||!t.startsWith(`..${p.sep}`)&&t!==".."&&!p.isAbsolute(t)}function Et(e){let r=p.resolve(e.projectPath,e.unit.root);return !e.selectedProjectPaths.some(t=>p.resolve(t)===p.resolve(e.projectPath)?false:at(e.projectPath,t)&&at(t,r))}async function jt(e){for(let r of e)if(await Z(r))return true;return false}async function Pt(e,r,t){if(r==="python"){let i=[p.join(e,".workspai","cli.py"),p.join(e,".rapidkit","cli.py")];for(let l of i)if(await Z(l))return {valid:true};return {valid:false,reason:"Project-local .workspai/cli.py is missing. Run `workspai init` in this project first."}}let s={go:"go",rust:"cargo",dotnet:"dotnet",php:"php"}[r];if(s)return te(s,e);let o=t.trim().split(/\s+/)[0];if(o&&["npm","npx","pnpm","yarn"].includes(o)){let i=e$1(o);if((await execa(i.command,[...i.prefixArgs,"--version"],{reject:false,env:g$2()})).exitCode===0)return {valid:true}}return te(t,e)}async function ge(e){let r=await re.promises.readFile(e,"utf-8");return JSON.parse(r)}function U(e){return e.replace(/\\/g,"/")}function At(e){let r=e?.trim();return r?r.startsWith("project:")?r.slice(8).trim()||null:r:null}async function Ft(e){let r=p.join(e,p$1.model);if(await Z(r))try{let n=((await ge(r)).projects??[]).map(s=>typeof s.path=="string"?d$2(e,s.path):null).filter(s=>!!s).filter((s,o,i)=>i.indexOf(s)===o).filter(s=>re.existsSync(s));if(n.length>0)return n.sort()}catch{}return a(e,{skipDirs:Ct,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t,n)=>await jt([...u(t,"context.json"),...u(t,"project.json")])?true:p.resolve(t)===p.resolve(n)?false:k(t).length>0})}async function lt(e){for(let r of [p.join(".workspai","project.json"),p.join(".workspai","context.json"),p.join(".rapidkit","project.json"),p.join(".rapidkit","context.json")]){let t=p.join(e,r);if(await Z(t))try{let n=await ge(t),s=n.name??n.projectName??n.slug;if(typeof s=="string"&&s.trim())return s.trim()}catch{}}return null}async function Tt(e,r,t){let n=At(t);if(!n)return {projects:r,normalizedScope:null};let s=U(n).toLowerCase(),o=[];for(let i of r){let l=await lt(i);c$1({workspacePath:e,projectPath:i,declaredName:l}).map(y=>U(y).toLowerCase()).includes(s)&&o.push(i);}if(o.length===0)throw new Error(`Workspace run scope did not match any project: ${t}`);return {projects:o,normalizedScope:n}}async function Ot(e,r,t){let n=await execa("git",["diff","--name-only",`${t}...HEAD`],{cwd:e,reject:false,env:a$1()});if(n.exitCode!==0)return new Set(r);let s=n.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0).map(i=>U(i));if(s.length===0)return new Set;let o=new Set;for(let i of r){let l=U(p.relative(e,i));if(!l||l===".")continue;let u=`${l}/`;s.some(y=>y===l||y.startsWith(u))&&o.add(i);}return o}async function $t(e,r,t$1){let n=await g(e,t.workspaceContract)??q(e,"workspace.contract.json");if(await Z(n))try{let c=await Dt(e,r,t$1,n);if(c.graphStatus!=="missing")return c}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let s=await g(e,".workspai/workspace-dependency-graph.json")??q(e,"workspace-dependency-graph.json");if(!await Z(s))return {expanded:t$1,graphStatus:"missing",expansionDepth:0};let o;try{o=await ge(s);}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let i=new Set(r.map(c=>p.resolve(c))),l=new Map;if(!o||typeof o!="object"||Array.isArray(o))return {expanded:t$1,graphStatus:"invalid",expansionDepth:0};let u=Array.isArray(o.projects)?o.projects:[];for(let c of u){if(!c||typeof c!="object"||Array.isArray(c))continue;let m=c,f=typeof m.path=="string"?m.path:"",R=p.resolve(e,f);if(!i.has(R))continue;let v=Array.isArray(m.dependsOn)?m.dependsOn.filter(k=>typeof k=="string"):[];for(let k of v){let S=p.resolve(e,k);i.has(S)&&(l.has(S)||l.set(S,new Set),l.get(S)?.add(R));}}let y=d$3(l,t$1);return {expanded:y.reached,graphStatus:"loaded",expansionDepth:y.added}}async function Dt(e,r,t,n){let s=await ge(n);if(!s||typeof s!="object"||Array.isArray(s))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let o=s,i=Array.isArray(o.projects)?o.projects:null;if(!i)return {expanded:t,graphStatus:"invalid",expansionDepth:0};let l=new Map,u=new Map;for(let R of r){let v=U(p.relative(e,R));u.set(v,p.resolve(R));}let y=new Map,c=new Map,m=new Map;for(let R of i){if(!R||typeof R!="object"||Array.isArray(R))continue;let v=R,k=typeof v.slug=="string"?v.slug:"",S=typeof v.relativePath=="string"?U(v.relativePath):k,b=u.get(S);!k||!b||l.set(k,b);}for(let R of i){if(!R||typeof R!="object"||Array.isArray(R))continue;let v=R,k=typeof v.slug=="string"?v.slug:"",S=l.get(k);if(!S)continue;let b=v.contracts&&typeof v.contracts=="object"&&!Array.isArray(v.contracts)?v.contracts:{},P=Array.isArray(b.dependsOn)?b.dependsOn.filter(w=>typeof w=="string"):[],W=Array.isArray(b.publishes)?b.publishes.filter(w=>typeof w=="string"):[],z=Array.isArray(b.consumes)?b.consumes.filter(w=>typeof w=="string"):[];for(let w of P){let T=l.get(w);T&&(m.has(T)||m.set(T,new Set),m.get(T)?.add(S));}for(let w of W)y.has(w)||y.set(w,new Set),y.get(w)?.add(S);for(let w of z)c.has(w)||c.set(w,new Set),c.get(w)?.add(S);}for(let[R,v]of y.entries()){let k=c.get(R);if(k)for(let S of v){m.has(S)||m.set(S,new Set);for(let b of k)b!==S&&m.get(S)?.add(b);}}let f=d$3(m,t);return {expanded:f.reached,graphStatus:"loaded",expansionDepth:f.added}}async function It(e,r){if(typeof r=="boolean")return r;let t=t$1(e,"policies.yml").find(o=>re.existsSync(o))??q(e,"policies.yml");if(!await Z(t))return true;let n="";try{n=await re.promises.readFile(t,"utf-8");}catch{return true}let s=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return s?s[1]==="true":true}function Nt(e,r){let t=process.env.RAPIDKIT_WORKSPACE_RUN_STAGE_TIMEOUT_MS;if(t){let n=Number.parseInt(t,10);if(Number.isFinite(n)&&n>0)return n}return e!=="init"?9e4:r==="python"||r==="java"||r==="jvm-generic"||r==="dotnet"||r==="rust"?6e5:3e5}function Mt(e){let r=e.trim();if(!r||/[&|;<>()$`"'\n\r]/.test(r))return null;let[t,...n]=r.split(/\s+/);return !t||/^[A-Za-z_][A-Za-z0-9_]*=/.test(t)||![t,...n].every(s=>/^[A-Za-z0-9_./:@%+,=\\-]+$/.test(s))?null:{file:t,args:n}}function Wt(e){let r=p.basename(e).toLowerCase();return r==="python"||r==="python3"||r==="python.exe"||r==="python3.exe"||/(?:^|[\\/])\.venv[\\/]/.test(e)}function _t(e,r){let t=q$2({unitRoot:e}),n=[];for(let s of r){let o=s.args[0]==="-m"&&s.args[1]==="venv";if(!(o&&t.venvExists)){if(Wt(s.executable)&&!o){let i=t.usedForDependencyInstall?t.interpreter:p.isAbsolute(s.executable)?s.executable:p.resolve(e,s.executable);n.push({...s,executable:i});continue}n.push(s);}}return n}function Lt(e){return e.map(r=>[r.executable,...r.args].join(" ")).join(" && ")}async function Gt(e,r){let t=[];for(let n of r){let s=n.args[0]==="-m"&&n.args[1]==="venv"&&n.args[2],o=p.isAbsolute(n.executable)?p.resolve(n.executable):n.executable.includes("/")||n.executable.includes("\\")?p.resolve(e,n.executable):null;if(!!!(o&&t.some(l=>{let u=p.relative(l,o);return u!==""&&!u.startsWith("..")&&!p.isAbsolute(u)}))){let l=await te(n.executable,e);if(!l.valid){let u=p.basename(n.executable);return {valid:false,reason:u==="uv"||u==="uv.exe"?"Missing admitted lock tool `uv`. Install uv and retry; no environment was changed.":l.reason||`Required executable is unavailable: ${n.executable}`}}}s&&t.push(p.resolve(e,n.args[2]));}return {valid:true}}function Bt(e){let r=e.match(/Ran (\d+) tests?/i);if(!r)return null;let t=Number(e.match(/skipped\s*=\s*(\d+)/i)?.[1]??0),n=Number(e.match(/failures\s*=\s*(\d+)/i)?.[1]??0),s=Number(e.match(/errors\s*=\s*(\d+)/i)?.[1]??0);return {ran:Number(r[1]),skipped:t,failed:n+s}}function it(e,r){let t=Number.parseInt(process.env[e]??"",10);return Number.isFinite(t)&&t>0?t:r}function Se(e){return new Promise(r=>setTimeout(r,e))}async function Kt(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(c=>({kind:"exit",result:c}),c=>({kind:"error",error:c})),s=it("WORKSPAI_WORKSPACE_RUN_STARTUP_GRACE_MS",2e3),o=await Promise.race([n,Se(s).then(()=>({kind:"alive"}))]);if(o.kind==="error"){let c=typeof o.error=="object"&&o.error!==null&&"timedOut"in o.error&&!!o.error.timedOut;return {exitCode:c?124:1,stdout:"",stderr:o.error instanceof Error?o.error.message:String(o.error),timedOut:c,healthStatus:{healthy:false,reason:"The start command failed before readiness."}}}if(o.kind==="exit"){let c=Number(o.result.exitCode??0);return {exitCode:c,stdout:String(o.result.stdout??""),stderr:String(o.result.stderr??""),healthStatus:{healthy:c===0,reason:c===0?"The start command completed successfully.":`The start command exited with code ${c} before readiness.`}}}let i=pe(e.runtime,e.framework)?.healthCheck,l=i?{healthy:false,reason:"The configured health check has not passed yet."}:{healthy:true,reason:`The service remained alive for ${s}ms (bounded startup smoke).`};if(i){let c=it("WORKSPAI_WORKSPACE_RUN_STARTUP_HEALTH_TIMEOUT_MS",15e3),m=Date.now()+c;for(;Date.now()<m;){let f=await nt(i,e.projectPath);if(l={healthy:f.healthy,reason:f.reason},f.healthy)break;if((await Promise.race([n,Se(350).then(()=>({kind:"alive"}))])).kind!=="alive"){l={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 u=await Promise.race([n,Se(2e3).then(()=>({kind:"alive"}))]),y=u.kind==="exit"?u.result:void 0;return {exitCode:l.healthy?0:1,stdout:String(y?.stdout??""),stderr:String(y?.stderr??""),healthStatus:l}}async function Ee(e,r,t,n=false){let s=process.argv[1];if(!s)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};let o=false,i,l;try{let u=execa(process.execPath,[s,...e],{cwd:r,reject:false,detached:process.platform!=="win32",env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});t&&t>0&&(l=setTimeout(()=>{o=true;let c=u.pid;if(!c){u.kill("SIGTERM");return}if(process.platform==="win32"){execa("taskkill",["/pid",String(c),"/T","/F"],{reject:false});return}try{process.kill(-c,"SIGTERM");}catch{u.kill("SIGTERM");}i=setTimeout(()=>{try{process.kill(-c,"SIGKILL");}catch{}},1e3),i.unref();},t),l.unref()),n&&(u.stdout?.on("data",c=>process.stdout.write(c)),u.stderr?.on("data",c=>process.stderr.write(c)));let y=await u;return {exitCode:o?124:Number(y.exitCode??1),stdout:y.stdout,stderr:o?`${y.stderr??""}${y.stderr?`
|
|
2
|
-
`:""}Stage timed out after ${t}ms`:y.stderr}}catch(u){let y=o||typeof u=="object"&&u!==null&&"timedOut"in u&&!!u.timedOut;return {exitCode:y?124:1,stdout:typeof u=="object"&&u!==null&&"stdout"in u?String(u.stdout??""):"",stderr:y?`Stage timed out after ${t}ms`:typeof u=="object"&&u!==null&&"stderr"in u?String(u.stderr??""):u instanceof Error?u.message:String(u)}}finally{l&&clearTimeout(l),i&&clearTimeout(i);}}function mt(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"||e==="rust"||e==="php"}function Ut(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}function zt(e,r=8){if(e.length<=r)return e.join(`
|
|
3
|
-
`);let t=pt(e),n=t?e.lastIndexOf(t):-1,s=new Set([0,1]);if(n>=0)for(let o=Math.max(0,n-2);o<=n+2;o+=1)o<e.length&&s.add(o);for(let o=e.length-1;o>=0&&s.size<r;o-=1)s.add(o);return [...s].sort((o,i)=>o-i).slice(0,r).map(o=>e[o]).join(`
|
|
4
|
-
`)}function pt(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 Ht(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 Ce(e){let r=m=>{let f=g$1(m);return f==="node"||f==="bun"?"node":f==="python"?"python":f==="go"?"go":f==="java"?"java":f==="php"?"php":f==="ruby"?"ruby":f==="rust"?"rust":f==="dotnet"?"dotnet":f==="elixir"?"elixir":f==="clojure"||f==="scala"||f==="kotlin"?"jvm-generic":et(e)},t=m=>{if(!m)return;let f$1=f(m);if(new Set(["fastapi","django","flask","nestjs","express","fastify","koa","gofiber","gogin","echo","springboot","laravel","symfony","rails","sinatra","dotnet","actix","axum","rocket","phoenix"]).has(f$1))return f$1},n=q$1(e),s=n?.detection??m(e,n?.projectJson??null),o=n?.contextJson,i=r(s.runtime),l=t(s.key),u={},y=new Set(["init","test","build","start"]);if(o?.commands&&typeof o.commands=="object")for(let[m,f]of Object.entries(o.commands))typeof f=="string"&&y.has(m)&&(u[m]=f);let c;if(o?.commandEnvironments&&typeof o.commandEnvironments=="object"){let m=o.commandEnvironments;c={dev:typeof m.dev=="string"?m.dev:void 0,staging:typeof m.staging=="string"?m.staging:void 0,prod:typeof m.prod=="string"?m.prod:void 0,default:typeof m.default=="string"?m.default:void 0};}return {runtime:i,framework:l,commandOverrides:Object.keys(u).length>0?u:void 0,environmentCommandVariants:c,environment:typeof o?.environment=="string"?o.environment:void 0}}async function ut(e,r,t,n,s,o,i,l=false,u){let y=!s?.[r]&&mt(t),c;if(s&&s[r]?c=s[r]:y?c=`rapidkit ${r}`:c=fe({projectPath:e,runtime:t,framework:n,stage:r}),!c)return {exitCode:127,command:`<stage not supported for ${t}>`,message:`No stage command found for runtime '${t}' and framework '${n||"unknown"}'`,errorCategory:"runtime"};let m=rt(c,o,i);if(!m)return {exitCode:127,command:c,message:"Failed to resolve stage command",errorCategory:"runtime"};let f=u&&u.length>0?t==="python"?_t(e,u):u:void 0,R=fe({projectPath:e,runtime:t,framework:n,stage:r});if(!f?.length)if(y){if(R){let x=y?await Pt(e,t,R):await te(R,e);if(!x.valid)return {exitCode:127,command:m,message:x.reason||"Command not available",errorCategory:"setup"}}}else {let x=await te(m,e);if(!x.valid)return {exitCode:127,command:m,message:x.reason||"Command not available",errorCategory:"setup"}}let v=f?.length?Lt(f):m;if(f?.length){let x=await Gt(e,f);if(!x.valid)return {exitCode:127,command:v,message:x.reason,errorCategory:"setup"}}let k=0,S="",b="",P,W=false,z,w=Nt(r,t),T=Date.now();try{let x=r==="start"?await Kt({projectPath:e,finalCommand:v,useRapidkitWrapper:y,runtime:t,framework:n,timeoutMs:w}):y?r==="init"&&Ut()?await Ht(e):await Ee([r],e,w,l):f?.length?await(async()=>{let d="",g="",a=0,$=false;for(let C of f){let E=await execa(C.executable,C.args,{cwd:e,reject:false,timeout:w,forceKillAfterDelay:1e3});d+=`${E.stdout??""}
|
|
5
|
-
`,g+=`${E.stderr??""}
|
|
6
|
-
`,$=!!(typeof E=="object"&&E!==null&&"timedOut"in E&&E.timedOut);let j=E.exitCode,D=$||(typeof j=="number"?j!==0:!!E.failed);if(a=$?124:typeof j=="number"?j:D?127:0,a!==0&&C.executable==="uv"&&(g+="\nMissing admitted lock tool `uv`. Install uv and retry; Workspai does not fall back to an unlocked pip freeze."),a!==0)break}return {exitCode:a,stdout:d.trim(),stderr:g.trim(),timedOut:$}})():await(async()=>{let d=Mt(m);return d?execa(d.file,d.args,{cwd:e,reject:false,timeout:w,forceKillAfterDelay:1e3}):execa(m,[],{cwd:e,reject:false,shell:true,timeout:w,forceKillAfterDelay:1e3})})();if(W=!!(typeof x=="object"&&x!==null&&"timedOut"in x&&x.timedOut),k=W?124:Number(x.exitCode??0),S=x.stdout,b=x.stderr,z=r==="start"?x.healthStatus:void 0,k!==0){let d=`${S}
|
|
7
|
-
${b}`,g=Date.now()-T,a=tt(d,void 0,r);P=W||k===124||k===143&&g>=Math.floor(w*.8)||a==="timeout"?"timeout":a;}}catch(x){let d=typeof x=="object"&&x!==null&&"timedOut"in x&&!!x.timedOut;return {exitCode:d?124:1,command:v,message:d?`Stage timed out after ${w}ms`:x instanceof Error?x.message:"Command execution failed",errorCategory:d?"timeout":"runtime"}}let I=`${S}
|
|
8
|
-
${b}`.split(/\r?\n/).map(x=>x.trim()).filter(Boolean),_=zt(I),H=pt(I),Q=Date.now()-T;if(r==="test"&&t==="go"&&k!==0&&/(?:matched no packages|no packages to test)/i.test(I.join(`
|
|
9
|
-
`)))return {exitCode:0,command:v,skipped:true,message:"No Go packages matched; test stage is not applicable to this runtime unit."};let N=r==="test"&&t==="python"?Bt(`${S}
|
|
10
|
-
${b}`):null,X=N!==null&&N.ran>0&&N.failed===0&&N.skipped===N.ran;X&&k===0&&(k=1,P="runtime");let ee=W||k===124||k===143&&Q>=Math.floor(w*.8),ne=k===0?void 0:ee?"timeout":P,se=k===0||!ne?void 0:{category:ne,exitCode:k,command:v,timedOut:ee,timeoutMs:w,..._?{outputExcerpt:_}:{}};return {exitCode:k,command:v,errorCategory:ne,healthStatus:z,failureDiagnostic:se,testCounts:N??void 0,message:ee?`Stage timed out after ${w}ms`:X?`Required Python tests were skipped (${N?.skipped??0}/${N?.ran??0}); missing framework dependencies cannot pass.`:k!==0?H?`Stage failed with exit code ${k}: ${H}`:`Stage failed with exit code ${k}`:void 0}}function ct(e){try{return JSON.parse(e)}catch{return null}}function Vt(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+, then rerun `wspai workspace run init` so Workspai can create the project `.venv` and install into it. Do not pip-install agent dependencies into system Python.";default:return null}}async function Jt(e){let r=[],t=await Ee(["doctor","workspace","--json"],e);if(t.exitCode!==0)r.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let o=ct(t.stdout)?.healthScore,i=Number(o?.errors??0);Number.isFinite(i)&&i>0?r.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${i} error(s)`}):r.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let n=await Ee(["readiness","--json"],e);if(n.exitCode!==0)r.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let s=ct(n.stdout),o=String(s?.overallStatus??"").toLowerCase();o==="fail"?r.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):o==="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 qt=new Set(["dev","stop"]);function Xt(e){let r=e.trim();return !r||qt.has(r.toLowerCase())?false:St.has(r)?true:/^[a-z][a-z0-9_-]*$/i.test(r)}function dt(e,r,t){let n=U(p.relative(t,r));return (Array.isArray(e.projects)?e.projects:[]).some(o=>{if(!o||typeof o!="object")return false;let i=o,l=[i.relativePath,i.path].filter(u=>typeof u=="string"&&u.length>0).map(u=>U(u));return i.status==="passed"&&(l.includes(n)||l.some(u=>u.endsWith(`/${n}`)))})}function Yt(e,r){return pe(e,r)?.dependencies??[]}function Zt(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 $r(e$1){if(!Xt(e$1.stage))throw new Error(`Unsupported workspace run stage: ${e$1.stage}`);let r=Date.now(),t=p.resolve(e$1.workspacePath);c({blockId:"workspace.run.resolve",status:"running",message:"Resolving workspace project fleet",component:"workspace-run"});let n=await d(t),s=await Ft(t),{projects:o,normalizedScope:i}=await Tt(t,s,e$1.scope),l=e$1.affected===true,u=e$1.blastRadius===true,y=e$1.since?.trim()||"HEAD~1",c$1=l?await Ot(t,o,y):new Set(o),m,f="not-applicable",R=0,v="all";if(l&&u){let d=await $t(t,s,c$1);m=d.expanded,f=d.graphStatus,R=d.expansionDepth,v="affected+blast-radius";}else l?(m=c$1,v="affected"):(m=c$1,v="all");c({blockId:"workspace.run.resolve",status:"succeeded",message:`Resolved ${o.length} project(s)`,component:"workspace-run",attributes:{projects:o.length,selectionMode:v}}),c({blockId:"workspace.run.gates",status:"running",message:"Evaluating workspace run gates",component:"workspace-run"});let k=e$1.stage==="init"||e$1.planOnly===true?false:await It(t,e$1.enforceGates),S=k?await Jt(t):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],b$1=S.find(d=>d.status==="fail");c({blockId:"workspace.run.gates",status:b$1?"blocked":"succeeded",message:b$1?`Blocked by ${b$1.gate}`:"Workspace run gates passed",component:"workspace-run",attributes:{gates:S}});let P=o.filter(d=>m.has(d)),W=e$1.continueOnError===true||e$1.stage==="init",z=e$1.parallel===true,w=Zt(e$1.maxWorkers,P.length),T=P.length,I=0;c({blockId:"workspace.run.execute",status:b$1?"blocked":"running",message:b$1?`Execution blocked by ${b$1.gate}`:`Executing ${e$1.stage} across ${T} project(s)`,component:"workspace-run",progress:{completed:0,total:T},attributes:{stage:e$1.stage,parallel:z,maxWorkers:w}}),e$1.json||console.log(M.gray(`Workspace run (${e$1.stage}) started: ${T} target(s), ${z?`parallel x${w}`:"sequential"}`));let _=new Map;for(let d of s){let g=U(p.relative(t,d)),a=await lt(d),$=o.includes(d),C=$&&m.has(d);_.set(d,{path:d,relativePath:g,projectName:a??(p.basename(g)||p.basename(d)),selected:C,affected:C,status:"skipped",exitCode:null,durationMs:0,reason:C?void 0:$?"not affected":"outside scope",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});}if(b$1)for(let d of P){let g=_.get(d);g&&(g.status="blocked",g.reason=`blocked by ${b$1.gate}`,g.exitCode=1);}else {let d=async g=>{let a=_.get(g);if(!a)return;let $=U(p.relative(t,g));e$1.json||console.log(M.gray(`\u23F3 [${I}/${T}] ${e$1.stage} ${$}`)),a.selected=true,a.affected=true;let C=Date.now(),E=B(g),j=e$1.runtime?.trim().toLowerCase(),D=E.units.filter(h=>Et({projectPath:g,unit:h,selectedProjectPaths:P})).filter(h=>!j||h.runtime===j).map(h=>({unit:h,stage:h.stages.find(F=>F.stage===e$1.stage)})).filter(h=>!!h.stage),G=D.map(({unit:h,stage:F})=>({unitId:h.id,runtime:h.runtime,role:h.role,root:h.root,manifest:h.manifest,stage:F.stage,command:F.command,status:"planned",exitCode:null,durationMs:0}));if(a.runtimeExecutions=G,!E.polyglot&&!j&&G.length===1&&D[0]?.unit.root==="."){let h=await Ce(g);a.framework=h.framework,a.runtimeDetected=h.runtime;let F=h.commandOverrides?.[e$1.stage],L=F||(mt(h.runtime)?`rapidkit ${e$1.stage}`:fe({projectPath:g,runtime:h.runtime,framework:h.framework,stage:e$1.stage}));if(L){let O=G[0];G.splice(0,G.length,{...O,unitId:`project:${h.runtime}`,root:".",manifest:D.map(({unit:ae})=>ae.manifest).join(", "),command:L});}}if(e$1.planOnly){a.runtimeDetected||(a.runtimeDetected=D[0]?.unit.runtime),a.status="skipped",a.reason=D.length>0?`plan only: ${D.length} runtime unit(s)`:j?`no ${j} runtime unit supports stage "${e$1.stage}"`:`no runtime unit supports stage "${e$1.stage}"`,a.durationMs=Date.now()-C,I+=1;return}if(E.polyglot||j||D.length>1||D.length===1&&D[0]?.unit.root!=="."){if(D.length===0){a.status="failed",a.reason=j?`No ${j} runtime unit supports stage "${e$1.stage}"`:`No runtime unit supports stage "${e$1.stage}"`,a.errorCategory="setup",a.errorMessage=a.reason,a.exitCode=127,a.durationMs=Date.now()-C,I+=1;return}let h;for(let O=0;O<D.length;O+=1){let{unit:ae,stage:be}=D[O],Y=G[O],Pe=p.resolve(g,ae.root),ht=Date.now(),we=await Ce(Pe),B=await ut(Pe,e$1.stage,ae.runtime,we.framework,{[e$1.stage]:be.command},we.environmentCommandVariants,we.environment,!e$1.json,be.argvSequence);if(Y.durationMs=Date.now()-ht,Y.exitCode=B.exitCode,Y.status=B.skipped?"skipped":B.exitCode===0?"passed":"failed",Y.reason=B.message,Y.errorCategory=B.errorCategory,Y.testCounts=B.testCounts,Y.failureDiagnostic=B.failureDiagnostic,B.exitCode!==0&&!h&&(h=B.message??be.command),B.exitCode!==0&&!W){for(let Ae of G.slice(O+1))Ae.status="skipped",Ae.reason="stopped after runtime-unit failure";break}}let F=G.find(O=>O.status==="failed");a.runtimeDetected=D[0]?.unit.runtime,a.executionCommand=G.filter(O=>O.status!=="skipped").map(O=>`[${O.runtime}:${O.root}] ${O.command}`).join(" && "),a.durationMs=Date.now()-C;let L=G.find(O=>O.status==="passed");a.exitCode=F?.exitCode??0,a.status=F?"failed":L?"passed":"skipped",a.reason=F?h??"runtime-unit stage failed":L?void 0:"No applicable runtime unit executed the requested stage",a.errorCategory=F?F.errorCategory??"runtime":void 0,a.errorMessage=a.reason,a.failureDiagnostic=F?.failureDiagnostic,I+=1;return}let{runtime:ye,framework:he,commandOverrides:ft,environmentCommandVariants:gt,environment:yt}=await Ce(g);a.runtimeDetected=ye,a.framework=he;let ke=st(g,e$1.stage);if(!ke.supported){a.status=ke.shouldFail===false?"skipped":"failed",a.reason=ke.reason??`stage "${e$1.stage}" unsupported for project`,a.durationMs=Date.now()-C,a.exitCode=a.status==="failed"?127:null,a.status==="failed"&&(a.errorCategory="setup",a.errorMessage=a.reason),I+=1;return}if(e$1.reusePassed&&n){let h=n.stages[e$1.stage]??n.stages[e$1.stage];if(h&&dt(h,g,t)){a.status="passed",a.reason="reused passed result from workspace-run-last.json",a.durationMs=Date.now()-C,a.exitCode=0,I+=1,e$1.json||console.log(M.gray(`\u21BA reused passed cache for ${$}`));return}}let je=Yt(ye,he).filter(h=>h!==e$1.stage);if(je.length>0&&n){let h=je.find(F=>{let L=n.stages[F];return !L||!dt(L,g,t)});if(h){a.status="skipped",a.reason=`dependency stage "${h}" not satisfied in workspace-run-last.json`,a.durationMs=Date.now()-C,a.exitCode=null,I+=1;return}}let A=await ut(g,e$1.stage,ye,he,ft,gt,yt,!e$1.json);a.executionCommand=A.command,a.errorCategory=A.errorCategory,a.healthStatus=A.healthStatus,a.failureDiagnostic=A.failureDiagnostic,a.durationMs=Date.now()-C,a.exitCode=A.exitCode;let V=a.runtimeExecutions?.[0];if(V&&(V.command=A.command,V.status=A.skipped?"skipped":A.exitCode===0?"passed":"failed",V.exitCode=A.exitCode,V.durationMs=a.durationMs,V.reason=A.message,V.errorCategory=A.errorCategory,V.testCounts=A.testCounts,V.failureDiagnostic=A.failureDiagnostic),A.skipped?(a.status="skipped",a.reason=A.message):A.exitCode===0?(a.status="passed",a.reason=void 0):(a.status="failed",a.reason=A.message||"stage command failed",a.errorMessage=A.message),I+=1,!e$1.json){let h=T>0?Math.round(I/T*100):100,F=a.status==="passed"?M.green("\u2705"):M.red("\u274C");if(console.log(M.gray(`${F} [${I}/${T}] (${h}%) ${$} ${a.durationMs}ms`)),a.status==="failed"){a.reason&&console.log(M.red(` Reason: ${a.reason}`)),a.executionCommand&&console.log(M.gray(` Command: ${a.executionCommand}`));let L=Vt(a.runtimeDetected);L&&a.errorCategory==="setup"&&console.log(M.gray(` Hint: ${L}`));}}};if(z&&P.length>1){let g=0,a=false,$=new Array(w).fill(null).map(async()=>{for(;g<P.length;){if(a&&!W)return;let C=g;g+=1;let E=P[C];await d(E),_.get(E)?.status==="failed"&&(a=true);}});if(await Promise.all($),!W&&a){let C=false;for(let E of P){let j=_.get(E);if(j){if(j.status==="failed"){C=true;continue}C&&j.status==="skipped"&&(j.reason=j.reason||"stopped after failure");}}}}else for(let g of P){await d(g);let a=_.get(g);if(!W&&a?.status==="failed"){let $=P.slice(P.indexOf(g)+1);for(let C of $){let E=_.get(C);E&&(E.status="skipped",E.reason="stopped after failure");}break}}}let H=[];for(let d of s){let g=_.get(d);g&&H.push(g);}let Q=H.filter(d=>d.status==="passed").length,q=H.filter(d=>d.status==="failed").length,N=H.filter(d=>d.status==="blocked").length,X=H.filter(d=>d.status==="skipped").length;c({blockId:"workspace.run.execute",status:q>0?"failed":b$1?"blocked":"succeeded",message:`Workspace run finished: ${Q} passed, ${q} failed, ${N} blocked, ${X} skipped`,component:"workspace-run",progress:{completed:T,total:T,percent:100},attributes:{passed:Q,failed:q,blocked:N,skipped:X,stage:e$1.stage}});let ee=e$1.strict===true,ne=q>0||N>0||ee&&S.some(d=>d.status==="fail"||d.status==="warn")?1:0,se={schemaVersion:"1.0",workspacePath:t,stage:e$1.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-r,options:{affected:l,blastRadius:u,since:l?y:null,parallel:z,maxWorkers:w,continueOnError:W,strict:ee,enforceGates:k,scope:i,reusePassed:e$1.reusePassed===true,planOnly:e$1.planOnly===true,runtime:e$1.runtime?.trim()||null},selection:{mode:v,since:l?y:null,scope:i,graphStatus:f,expansionDepth:R},gates:{enforced:k,results:S,blocked:!!b$1,blockingGate:b$1?.gate},summary:{projectCount:s.length,selectedCount:P.length,passed:Q,failed:q,skipped:X,blocked:N,exitCode:ne},projects:H,enterpriseControls:{jsonReady:true,evidencePath:b}},x=p.join(t,b);c({blockId:"workspace.run.publish",status:"running",message:"Publishing workspace run evidence",component:"workspace.run"});try{await e(t,se),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(d){throw c({blockId:"workspace.run.publish",status:"failed",message:d instanceof Error?d.message:"Workspace run evidence publish failed",component:"workspace.run"}),d}return e$1.json||(b$1&&(console.log(M.red(`\u274C Workspace run blocked by ${b$1.gate}`)),console.log(M.gray(` ${b$1.summary}`))),console.log(M.cyan(`Workspace run (${e$1.stage}) => passed: ${Q}, failed: ${q}, blocked: ${N}, skipped: ${X}`)),console.log(M.gray(`Report: ${x}`))),se}export{Nt as a,$r as b};
|
package/dist/chunk-VODNLROY.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import {H,k,q as q$1,P as P$1}from'./chunk-QFDTKOYS.js';import {b as b$2,c as c$2,a as a$3}from'./chunk-NSC4VWV2.js';import {a as a$2}from'./chunk-NMXGSVMD.js';import {a as a$6}from'./chunk-HTYMXMQM.js';import {d as d$1,a as a$1,p as p$1,g as g$2,f as f$1,e}from'./chunk-YLLCZMKP.js';import {c,b as b$1,j as j$2,q as q$3,D,f}from'./chunk-TJ3MDZMC.js';import {d,b as b$3}from'./chunk-ROOPODG6.js';import {j as j$3,m,l}from'./chunk-H4YHIOCT.js';import {a as a$5}from'./chunk-GR6442P7.js';import {j as j$1,g as g$1,a as a$4,h}from'./chunk-BLEIUQL6.js';import {a}from'./chunk-252EKOR6.js';import {d as d$2,c as c$1}from'./chunk-EWZZUQBR.js';import {t}from'./chunk-VQZ5PI5J.js';import {q as q$2,p,t as t$1,s}from'./chunk-ODK4LCEL.js';import g from'path';import C from'fs-extra';import Nt from'crypto';import {execFile}from'child_process';import {promisify}from'util';import {createRequire}from'module';var Gt=new Set([...c().map(e=>e.id),...H().map(e=>e.id)]),_t=[...k().map(e=>({id:e.kitId,aliases:[...e.aliases],ecosystem:e.framework,plannerFramework:e.id,runtime:"node",runtimeCandidates:["node"],workspacePythonEngine:"none",status:"available",canExecuteCreate:true,versionPolicy:e.versionPolicy,officialCommands:[e.commandDisplay("<name>",{skipGit:false,skipInstall:false})],adoptAfterCreate:true,...e.minNodeVersion?{runtimeRequirements:{node:`>=${e.minNodeVersion}`}}:e.minNodeMajor?{runtimeRequirements:{node:`>=${e.minNodeMajor}`}}:{}})),...q$1().map(e=>({id:e.kitId,aliases:[...e.aliases],ecosystem:e.framework,plannerFramework:e.framework,runtime:e.runtime,runtimeCandidates:[...e.runtimeCandidates],workspacePythonEngine:"none",status:"available",canExecuteCreate:true,versionPolicy:e.versionPolicy,officialCommands:[e.commandDisplay("<name>",{skipGit:false,skipInstall:false})],adoptAfterCreate:true,...e.nodeSupport?{runtimeRequirements:{node:e.nodeSupport.requirement}}:{}})),{id:"wordpress-site",aliases:["wordpress","wordpress-site","wp","wp-site"],ecosystem:"wordpress",plannerFramework:"wordpress",runtime:"php",runtimeCandidates:["php"],workspacePythonEngine:"none",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["wp core download","wp config create","wp db create","wp core install"],adoptAfterCreate:true},{id:"wordpress-block",aliases:["wordpress-block","wp-block","gutenberg-block"],ecosystem:"wordpress",plannerFramework:"wordpress",runtime:"node",runtimeCandidates:["node","php"],workspacePythonEngine:"none",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["npx @wordpress/create-block@latest <slug>"],adoptAfterCreate:true},{id:"symfony",aliases:["symfony","php-symfony"],ecosystem:"php",plannerFramework:"symfony",runtime:"php",runtimeCandidates:["php"],workspacePythonEngine:"none",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["composer create-project symfony/skeleton <name>"],adoptAfterCreate:true},{id:"rails",aliases:["rails","ruby-on-rails","ruby-rails"],ecosystem:"ruby",plannerFramework:"rails",runtime:"ruby",runtimeCandidates:["ruby"],workspacePythonEngine:"none",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["rails new <name>"],adoptAfterCreate:true}],L=new Map;for(let e of _t){L.set(e.id,e);for(let t of e.aliases)L.set(t,e);}var Tt=new Set(["php","ruby","rust","elixir","clojure","scala","kotlin","unknown"]);function V(e){return e?.trim().toLowerCase()||void 0}function it(e){let t=V(e.kitId)??V(e.framework)??V(e.runtime)??"unknown";if(e.projectExists)return {lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"Existing projects enter Workspace Intelligence through adopt/import."};let r=e.kitId?b$1(e.kitId):void 0;if(r&&Gt.has(r))return {lane:"native",status:"available",canExecuteCreate:true,requested:t,resolved:r,reason:"Workspai owns the create contract, project marker, registry, doctor, and workspace model path."};let o=L.get(t)??L.get(V(e.framework)??"")??L.get(V(e.runtime)??"");if(o)return {lane:"official",status:o.status,canExecuteCreate:o.canExecuteCreate,requested:t,resolved:o.id,officialCommands:o.officialCommands,fallbackLane:o.canExecuteCreate?void 0:"existing",reason:o.status==="available"?"Workspai runs the official ecosystem generator, then registers the project in Workspace Intelligence.":"Official generator support is planned but not enabled; use adopt/import until Workspai owns the post-create contract."};let s=V(e.runtime);return s&&Tt.has(s)?{lane:"existing",status:"available",canExecuteCreate:false,requested:t,resolved:s,reason:"Runtime can be governed through Workspace Intelligence, but native create is not supported."}:{lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"No native create contract is available; use adopt/import to enter Workspace Intelligence."}}function Xr(e){return !e.canExecuteCreate&&(e.lane==="official"||e.lane==="existing"&&e.resolved!==void 0)}var en="rapidkit-freshness-metadata-v1";function he(e){if(Array.isArray(e))return e.map(t=>he(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=he(e[r]);return t}return e}function Kt(e){return JSON.stringify(he(e))}function _(e){return Nt.createHash("sha256").update(Kt(e)).digest("hex")}var ct=".workspai/workspace-graph.overrides.json",$t=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Vt=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),lt=600,pt=5,Ht=256*1024,dt={inferred:1,contract:2,manual:3};function Bt(e){return e.split(g.sep).join("/")}function ee(e,t){return Bt(g.relative(e,t)||".")}function ut(e){let t=new Map;for(let r of e.projects)t.has(r.name)||t.set(r.name,{id:r.name,path:r.path,...r.runtime?{runtime:r.runtime}:{},...r.framework?{framework:r.framework}:{},...r.kind?{kind:r.kind}:{}});return [...t.values()].sort((r,o)=>r.id.localeCompare(o.id))}function ft(e,t){let r=new Map,o=new Map;for(let n of t.projects){if(r.has(n.name))continue;let i=d(e,n.path,{...n.absolutePath?{absolutePath:n.absolutePath}:{}});r.set(n.name,i),o.has(i)||o.set(i,n.name);}let s=[...o.entries()].map(([n,i])=>({dir:n,id:i})).sort((n,i)=>i.dir.length-n.dir.length||n.dir.localeCompare(i.dir));return {idToDir:r,dirToId:o,sortedDirs:s}}function te(e,t){let r=g.resolve(t);for(let{dir:o,id:s}of e.sortedDirs)if(r===o||r.startsWith(`${o}${g.sep}`))return s;return null}function we(e,t){let r=g.relative(e,t);return r.length>0&&!r.startsWith("..")&&!g.isAbsolute(r)}function Pe(e,t,r){let o=e.idToDir.get(t),s=e.idToDir.get(r);return !o||!s?false:we(o,s)||we(s,o)}async function ve(e){try{if(!await C.pathExists(e))return null;let t=await C.readJSON(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function je(e){try{return await C.pathExists(e)?await C.readFile(e,"utf8"):null}catch{return null}}async function mt(e,t){let r=[],o=new Map;for(let[s,n]of t.idToDir.entries()){let i=await ve(g.join(n,"package.json")),a=typeof i?.name=="string"?i.name.trim():"";a&&!o.has(a)&&o.set(a,s);}for(let[s,n]of t.idToDir.entries()){let i=await ve(g.join(n,"package.json"));if(i){let a=["dependencies","devDependencies","peerDependencies","optionalDependencies"],c=new Set;for(let l of a){let u=i[l];if(!(!u||typeof u!="object"||Array.isArray(u)))for(let p of Object.keys(u)){let d=o.get(p);!d||d===s||c.has(d)||(c.add(d),r.push({from:s,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:ee(e,g.join(n,"package.json")),detail:`declares dependency ${p}`}]}));}}}r.push(...await Lt(e,t,s,n)),r.push(...await Ut(e,t,s,n));}return r}async function Lt(e,t,r,o){let s=await je(g.join(o,"pyproject.toml"));if(!s)return [];let n=[],i=new Set,a=/path\s*=\s*["']([^"']+)["']/g,c;for(;(c=a.exec(s))!==null;){let l=te(t,g.resolve(o,c[1]));!l||l===r||Pe(t,r,l)||i.has(l)||(i.add(l),n.push({from:r,to:l,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:ee(e,g.join(o,"pyproject.toml")),detail:`path dependency ${c[1]}`}]}));}return n}async function Ut(e,t,r,o){let s=await je(g.join(o,"go.mod"));if(!s)return [];let n=[],i=new Set,a=/replace\s+\S+\s+=>\s+(\.[^\s]+)/g,c;for(;(c=a.exec(s))!==null;){let l=te(t,g.resolve(o,c[1]));!l||l===r||Pe(t,r,l)||i.has(l)||(i.add(l),n.push({from:r,to:l,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:ee(e,g.join(o,"go.mod")),detail:`go.mod replace ${c[1]}`}]}));}return n}async function zt(e,t,r=new Set){let o=[],s=[e];for(;s.length>0&&o.length<t;){let n=s.shift();if(!n)continue;let i=[];try{i=await C.readdir(n,{withFileTypes:true});}catch{continue}let a=[],c=[];for(let l of i)if(l.isDirectory()){let u=g.resolve(n,l.name);if(r.has(u)||Vt.has(l.name)||a$5(l.name)||l.name.startsWith("."))continue;a.push(g.join(n,l.name));}else l.isFile()&&$t.has(g.extname(l.name))&&c.push(g.join(n,l.name));c.sort((l,u)=>l.localeCompare(u)),a.sort((l,u)=>l.localeCompare(u));for(let l of c){if(o.length>=t)break;o.push(l);}s.push(...a);}return o}var qt=[/\bfrom\s+["']([^"']+)["']/g,/\bimport\s+["']([^"']+)["']/g,/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g];function Jt(e){let t=new Set;for(let r of qt){r.lastIndex=0;let o;for(;(o=r.exec(e))!==null;){let s=o[1];s.startsWith(".")&&t.add(s);}}return [...t]}async function be(e,t,r,o){let s=new Map;for(let[n,i]of t.idToDir.entries()){if(o&&!o.has(n))continue;let a=new Set([...t.idToDir.entries()].filter(([l,u])=>l!==n&&we(i,u)).map(([,l])=>g.resolve(l))),c=await zt(i,r,a);for(let l of c){let u=await C.stat(l).catch(()=>null);if(!u||u.size>Ht)continue;let p=await je(l);if(p)for(let d of Jt(p)){let f=g.resolve(g.dirname(l),d),h=te(t,f);if(!h||h===n||Pe(t,n,h))continue;let m=`${n}\0${h}`,v=s.get(m);v||(v={from:n,to:h,evidence:[]},s.set(m,v)),v.evidence.length<pt&&v.evidence.push({file:ee(e,l),detail:`imports ${d}`});}}}return [...s.values()].map(n=>({from:n.from,to:n.to,kind:"code-import",source:"inferred",confidence:"medium",evidence:n.evidence}))}function Xt(e,t,r){let o=new Map;for(let s of r.projects){let n=Yt(e,t,s);n&&o.set(s.slug,n);}return o}function Yt(e,t,r){let o=[r.relativePath,r.externalPath].filter(s=>typeof s=="string"&&s.length>0);for(let s of o){let n=g.resolve(e,s),i=t.dirToId.get(n)??te(t,n);if(i)return i}return t.idToDir.has(r.slug)?r.slug:null}function gt(e,t,r){let o=[],s=Xt(e,t,r),n=g$2,i=new Map,a=new Map;for(let c of r.projects){let l=s.get(c.slug);if(!l)continue;let u=c.contracts??{publishes:[],consumes:[],dependsOn:[]};for(let p of u.dependsOn??[]){let d=s.get(p);!d||d===l||o.push({from:l,to:d,kind:"service-dependsOn",source:"contract",confidence:"high",evidence:[{file:n,detail:`dependsOn ${p}`}]});}for(let p of u.publishes??[])i.has(p)||i.set(p,new Set),i.get(p)?.add(l);for(let p of u.consumes??[])a.has(p)||a.set(p,new Set),a.get(p)?.add(l);}for(let[c,l]of i.entries()){let u=a.get(c);if(u)for(let p of u)for(let d of l)p!==d&&o.push({from:p,to:d,kind:"event-pub-sub",source:"contract",confidence:"high",evidence:[{file:n,detail:`consumes event ${c}`}]});}return o.push(...Qt(r,s)),o}function ke(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function Qt(e,t){let r=[],o=e.projects.map(s=>({project:s,id:t.get(s.slug)})).filter(s=>!!s.id).filter(s=>ke(s.project.slug).length>=3);for(let s of e.projects){let n=t.get(s.slug);if(!n)continue;let i=s.contracts?.env??[];if(i.length===0)continue;let a=new Set;for(let c of i){let l=ke(c);for(let u of o)u.id===n||a.has(u.id)||!(l.includes(ke(u.project.slug))&&(u.project.ports?.length??0)>0)||(a.add(u.id),r.push({from:n,to:u.id,kind:"shared-resource",source:"inferred",confidence:"low",evidence:[{file:g$2,detail:`env ${c} references ${u.project.slug}`}]}));}}return r}async function ht(e,t){let r=await ve(g.join(e,ct)),o=Array.isArray(r?.edges)?r?.edges:[],s=[],n=new Set(f$1);for(let i of o){if(!i||typeof i!="object"||Array.isArray(i))continue;let a=i,c=typeof a.from=="string"?a.from:"",l=typeof a.to=="string"?a.to:"",u=typeof a.kind=="string"?a.kind:"";if(!t.has(c)||!t.has(l)||c===l||!n.has(u))continue;let p=Array.isArray(a.evidence)?a.evidence.map(d=>d&&typeof d=="object"&&typeof d.file=="string"?{file:d.file,...typeof d.detail=="string"?{detail:d.detail}:{}}:null).filter(d=>!!d):[];s.push({from:c,to:l,kind:u,source:"manual",confidence:"high",evidence:p.length>0?p:[{file:ct,detail:"manual edge"}]});}return s}function Zt(e){return `${e.from}\0${e.to}\0${e.kind}`}function er(e){let t=new Set,r=[];for(let o of e){let s=`${o.file}\0${o.detail??""}`;t.has(s)||(t.add(s),r.push(o));}return r.sort((o,s)=>o.file.localeCompare(s.file)||(o.detail??"").localeCompare(s.detail??"")).slice(0,pt)}function tr(e){let t=new Map;for(let r of e){let o=Zt(r),s=t.get(o);if(!s){t.set(o,{...r,evidence:[...r.evidence]});continue}let n=dt[s.source],i=dt[r.source];i>n?t.set(o,{...r,evidence:[...r.evidence,...s.evidence]}):i===n&&s.evidence.push(...r.evidence);}return [...t.values()].map(r=>({from:r.from,to:r.to,kind:r.kind,source:r.source,confidence:r.confidence,evidence:er(r.evidence)})).sort((r,o)=>r.from.localeCompare(o.from)||r.to.localeCompare(o.to)||r.kind.localeCompare(o.kind)||r.source.localeCompare(o.source))}function ye(e){return Math.round(e*1e3)/1e3}function rr(e){return Math.max(0,Math.min(100,Math.round(e)))}function nr(e){return e>=75?"critical":e>=50?"high":e>=20?"medium":"low"}function or(e){return e==="critical"||e==="high"?"strict":e==="medium"?"elevated":"normal"}function sr(e,t){let r=a$6({nodes:e,edges:t}),o=new Map;for(let s of e){let n=r.byId.get(s.id)??{fanIn:0,fanOut:0,reach:0,betweenness:0,isHotspot:false},i=t.filter(f=>f.from===s.id||f.to===s.id),a=i.filter(f=>f.source==="contract"||f.source==="manual").length,c=i.filter(f=>f.confidence==="low").length,l=[],u=n.reach*20+n.fanIn*14+n.fanOut*8+Math.min(20,n.betweenness*4)+a*8;n.isHotspot&&(u+=24,l.push("Critical-path hotspot in dependency graph")),n.reach>0&&l.push(`Change reaches ${n.reach} dependent project(s)`),n.fanIn>0&&l.push(`${n.fanIn} direct dependent project(s)`),n.fanOut>0&&l.push(`${n.fanOut} direct dependency project(s)`),a>0&&l.push(`${a} contract/manual edge(s)`),c>0&&l.push(`${c} low-confidence inferred edge(s) need review`),i.length===0&&l.push(e.length===1?"Single-project workspace; inter-project dependency edges are not applicable":"No dependency evidence connected to this project yet");let p=rr(u),d=nr(p);o.set(s.id,{weight:d,score:p,verificationPriority:or(d),reasons:l.slice(0,5),centrality:{fanIn:n.fanIn,fanOut:n.fanOut,reach:n.reach,betweenness:n.betweenness,isHotspot:n.isHotspot}});}return o}function ar(e,t){let r=sr(e,t);return e.map(o=>({...o,operationalProfile:r.get(o.id)}))}function ir(e,t){let r=new Set;for(let c of t)r.add(c.from),r.add(c.to);let o=e.length,s=t.length,n=e.filter(c=>r.has(c.id)).length,i=Math.max(0,o-n),a=a$6({nodes:e,edges:t});return {nodeCount:o,edgeCount:s,inferredEdges:t.filter(c=>c.source==="inferred").length,contractEdges:t.filter(c=>c.source==="contract").length,manualEdges:t.filter(c=>c.source==="manual").length,authoritativeEdges:t.filter(c=>c.source==="contract"||c.source==="manual").length,lowConfidenceEdges:t.filter(c=>c.confidence==="low").length,orphanCount:i,connectedNodeCount:n,density:ye(o>1?s/(o*(o-1)):0),edgeCoverageRatio:ye(o>0?n/o:1),evidenceCoverageRatio:ye(s>0?t.filter(c=>c.evidence.length>0).length/s:1),hotspotCount:a.hotspots.length,hasCycle:dr(e,t)}}function cr(e,t,r){let o=[],s=e.filter(n=>!t.some(i=>i.from===n.id||i.to===n.id)).map(n=>n.id).sort((n,i)=>n.localeCompare(i));return r.nodeCount===0&&o.push({code:"graph.empty",severity:"info",message:"Workspace model has no projects, so dependency reasoning is unavailable.",recommendation:"Import, scaffold, or register projects before relying on graph-aware impact."}),r.nodeCount>1&&r.edgeCount===0?o.push({code:"graph.edges.missing",severity:"warning",message:"Projects were detected, but no inter-project dependency edges were found.",recommendation:"Run graph explain, add workspace contract relationships, or define manual graph overrides for operational dependencies that code imports cannot reveal.",nodeIds:s}):r.nodeCount>1&&r.orphanCount>0&&o.push({code:"graph.orphans.detected",severity:"warning",message:`${r.orphanCount} project(s) have no dependency evidence connected to the graph.`,recommendation:"Review isolated projects and add package, contract, or manual edges when they participate in release-critical flows.",nodeIds:s.slice(0,12)}),r.lowConfidenceEdges>0&&o.push({code:"graph.low_confidence_edges",severity:"info",message:`${r.lowConfidenceEdges} inferred edge(s) are low confidence.`,recommendation:"Promote important low-confidence relationships to workspace contract or manual overrides."}),r.edgeCount>0&&r.evidenceCoverageRatio<1&&o.push({code:"graph.evidence.partial",severity:"warning",message:"Some dependency edges do not include file-level evidence.",recommendation:"Attach evidence to manual overrides so agents can audit why a relationship exists."}),r.hasCycle&&o.push({code:"graph.cycle.detected",severity:"error",message:"The dependency graph contains at least one directed cycle.",recommendation:"Break the cycle or document the relationship explicitly before using graph-aware release gates."}),o.sort((n,i)=>{let a={error:0,warning:1,info:2};return a[n.severity]-a[i.severity]||n.code.localeCompare(i.code)})}function dr(e,t){let r=new Map;for(let c of e)r.set(c.id,[]);for(let c of t)r.has(c.from)||r.set(c.from,[]),r.get(c.from)?.push(c.to);let o=0,s=1,n=2,i=new Map;for(let c of r.keys())i.set(c,o);let a=c=>{let l=[{id:c,index:0}];for(i.set(c,s);l.length>0;){let u=l[l.length-1],p=r.get(u.id)??[];if(u.index>=p.length){i.set(u.id,n),l.pop();continue}let d=p[u.index];u.index+=1;let f=i.get(d)??o;if(f===s)return true;f===o&&(i.set(d,s),l.push({id:d,index:0}));}return false};for(let c of [...r.keys()].sort())if(i.get(c)===o&&a(c))return true;return false}function kt(e$1,t,r,o){let s=tr(r.filter(c=>t.has(c.from)&&t.has(c.to))),n=ar(e$1,s),i=ir(e$1,s),a=cr(e$1,s,i);return {schemaVersion:e,generatedAt:(o??new Date).toISOString(),nodes:n,edges:s,stats:i,...a.length>0?{diagnostics:a}:{}}}async function yt(e){let t=g.resolve(e.workspacePath),r=e.maxImportFilesPerProject??lt,o=ut(e.model),s=new Set(o.map(a=>a.id)),n=ft(t,e.model),i=[];return i.push(...await mt(t,n)),i.push(...await be(t,n,r)),e.contract&&i.push(...gt(t,n,e.contract)),i.push(...await ht(t,s)),kt(o,s,i,e.now)}async function wt(e){let t=g.resolve(e.workspacePath),r=e.maxImportFilesPerProject??lt,o=ut(e.model),s=new Set(o.map(a=>a.id)),n=ft(t,e.model),i=[];if(i.push(...await mt(t,n)),e.structuralChange)i.push(...await be(t,n,r));else {i.push(...await be(t,n,r,e.changedProjectIds));for(let a of e.previousGraph.edges)a.kind==="code-import"&&a.source==="inferred"&&!e.changedProjectIds.has(a.from)&&s.has(a.from)&&s.has(a.to)&&i.push({from:a.from,to:a.to,kind:"code-import",source:"inferred",confidence:a.confidence,evidence:a.evidence});}return e.contract&&i.push(...gt(t,n,e.contract)),i.push(...await ht(t,s)),kt(o,s,i,e.now)}var re="workspace-model-producer.v3";var Se=s.workspaceModelCache.schemaVersion,Ce=t$1.workspaceModelCache,mr=["package.json","pyproject.toml","setup.py","requirements.txt","requirements.in","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","Gemfile.lock","mix.exs","mix.lock","deno.json","deno.jsonc","deno.lock","bun.lock","bun.lockb","bunfig.toml",".bunfig.toml","deps.edn","project.clj","build.sbt","CMakeLists.txt","meson.build","workspai.project.json",".workspai/project.json",".workspai/context.json","rapidkit.project.json",".rapidkit/project.json",".rapidkit/context.json"],gr=[".csproj",".fsproj",".vbproj",".sln",".slnx",".gemspec"],vt=[t$1.workspaceContract,".workspai/workspace.json","workspai.workspace.json",".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"],bt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".vue",".svelte",".rb",".go",".py",".java",".kt",".kts",".rs",".cs",".php",".ex",".exs",".clj",".cljs",".scala",".c",".cc",".cpp",".cxx",".h",".hh",".hpp",".hxx",".proto",".graphql",".gql",".sql",".sh"]),hr=new Set([".git",".workspai",".rapidkit","node_modules","dist","build","out","target","coverage",".next",".turbo",".cache",".venv"]),kr=1500,ne=promisify(execFile);function yr(e){return bt.has(g.extname(e).toLowerCase())}async function wr(e){try{let{stdout:t}=await ne("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf8",timeout:1e4,maxBuffer:1048576}),r=t.trim();if(!r)return null;let o=g.relative(r,e).split(g.sep).join("/");if(o===".."||o.startsWith("../"))return null;let s=o||".",n=o?`HEAD:${o}`:"HEAD^{tree}",{stdout:i}=await ne("git",["-C",r,"rev-parse",n],{encoding:"utf8",timeout:1e4,maxBuffer:1024*1024}),[a,c]=await Promise.all([ne("git",["-C",r,"diff","--name-only","-z","HEAD","--",s],{encoding:"buffer",timeout:2e4,maxBuffer:64*1024*1024}),ne("git",["-C",r,"ls-files","--others","--exclude-standard","-z","--",s],{encoding:"buffer",timeout:2e4,maxBuffer:64*1024*1024})]),l=new Set([a.stdout,c.stdout].flatMap(p=>p.toString("utf8").split("\0")).filter(Boolean)),u=[`git-tree:${i.trim()}`];for(let p of [...l].sort((d,f)=>d.localeCompare(f))){let d=g.resolve(r,p),f=g.relative(e,d).split(g.sep).join("/");f===".."||f.startsWith("../")||!yr(f)||u.push(`${f}:${await z(d)??"<deleted>"}`);}return u}catch{return null}}var U=null;function Ee(){if(U)return U;try{U=createRequire(import.meta.url)("../package.json")?.version??"0.0.0";}catch{U="0.0.0";}return U}async function z(e){try{let t=await C.readFile(e);return Nt.createHash("sha256").update(t).digest("hex")}catch{return null}}async function Pt(e){let t={};for(let o of mr){let s=await z(g.join(e,o));s&&(t[o]=s);}let r=await C.readdir(e).catch(()=>[]);for(let o of r.sort((s,n)=>s.localeCompare(n))){if(!gr.some(n=>o.toLowerCase().endsWith(n)))continue;let s=await z(g.join(e,o));s&&(t[o]=s);}return t}async function vr(e){let t=await Pt(e),r=await wr(e),o=r??[];if(r)return _({manifests:t,source:o});let s=[e];for(;s.length>0&&o.length<kr;){let n=s.shift();if(!n)continue;let i=[];try{i=await C.readdir(n,{withFileTypes:true});}catch{continue}let a=[];for(let c of i)if(c.isDirectory()){if(hr.has(c.name)||a$5(c.name)||c.name.startsWith("."))continue;a.push(g.join(n,c.name));}else if(c.isFile()&&bt.has(g.extname(c.name))){let l=g.join(n,c.name),u=await C.stat(l).catch(()=>null);if(u){let p=g.relative(e,l).split(g.sep).join("/");o.push(`${p}:${u.size}:${Math.round(u.mtimeMs)}`);}}a.sort((c,l)=>c.localeCompare(l)),s.push(...a);}return o.sort((n,i)=>n.localeCompare(i)),_({manifests:t,source:o})}async function oe(e,t){let r=g.resolve(e),o={},s=[...new Set(t.map(n=>g.relative(r,g.resolve(n)).split(g.sep).join("/")))].sort((n,i)=>n.localeCompare(i));for(let n of s)o[n]=await vr(g.join(r,n));return o}async function se(e){let t=g.resolve(e),r={};for(let o of vt){let s=await z(g.join(t,o));s&&(r[o]=s);}return r}async function ae(e){let t=g.resolve(e.workspacePath),r=[...new Set(e.projectPaths.map(n=>g.relative(t,g.resolve(n)).split(g.sep).join("/")))].sort((n,i)=>n.localeCompare(i)),o=[];for(let n of r){let i=await Pt(g.join(t,n));o.push({project:n,manifests:i});}let s={};for(let n of vt){let i=await z(g.join(t,n));i&&(s[n]=i);}return _({cacheSchema:Se,cliVersion:e.cliVersion,flags:e.flags,workspaceJson:e.workspaceJson??null,marker:e.marker??null,projects:o,workspaceFiles:s})}async function We(e){let t=await g$1(e,Ce)??a$4(e,Ce);try{if(!await C.pathExists(t))return null;let r=await C.readJson(t);return !r||r.schemaVersion!==Se||r.producerRevision!==re||typeof r.inputsHash!="string"||typeof r.cliVersion!="string"||!r.model?null:r}catch{return null}}async function ie(e,t){let r={schemaVersion:Se,producerRevision:re,...t};return h(e,Ce,r)}var jt="rapidkit-fact-freshness-v1",q={durable:720*60*60,derived:10080*60,evidenceBacked:1440*60,live:300,verifyBeforeUse:1440*60};function br(e){switch(e){case "durable":return q.durable;case "derived":return q.derived;case "evidence-backed":return q.evidenceBacked;case "live":return q.live;case "verify-before-use":return q.verifyBeforeUse}}function Pr(e){if(e.status)return e.status;if(e.ttlSeconds===null)return "unknown";let t=Date.parse(e.generatedAt);if(!Number.isFinite(t))return "unknown";let r=t+e.ttlSeconds*1e3;return e.now.getTime()>r?"stale":"fresh"}function jr(e){let t=e.now??new Date,r=e.generatedAt??t.toISOString(),o=Date.parse(r),s=Number.isFinite(o),n=s?r:t.toISOString(),i=e.ttlSeconds===void 0?br(e.kind):e.ttlSeconds,a=Pr({generatedAt:n,ttlSeconds:i,status:e.status??(s?void 0:"unknown"),now:t}),c=Date.parse(n),l=i===null||!Number.isFinite(c)?void 0:new Date(c+i*1e3),u=e.verifyBeforeUse??(e.kind==="live"||e.kind==="verify-before-use"||e.category!=="structure"||a!=="fresh");return {schemaVersion:jt,kind:e.kind,category:e.category,generatedAt:n,ttlSeconds:i,...l?{expiresAt:l.toISOString()}:{},status:a,verifyBeforeUse:u,...e.sourceArtifact?{sourceArtifact:e.sourceArtifact}:{},...e.sourcePath?{sourcePath:e.sourcePath}:{},inputsHash:e.inputsHash??_(e.value??null),reason:e.reason}}function b(e){return {id:e.id,label:e.label,scope:e.scope,value:e.value,...e.project?{project:e.project}:{},freshness:jr({...e.freshness,value:e.value})}}function Ct(e){let t=e.generatedAt??(e.now??new Date).toISOString(),r={durable:0,derived:0,"evidence-backed":0,live:0,"verify-before-use":0},o={structure:0,verification:0,state:0},s=0,n=0,i=0,a=0;for(let c of e.facts)r[c.freshness.kind]+=1,o[c.freshness.category]+=1,c.freshness.status==="stale"&&(s+=1),c.freshness.status==="unknown"&&(n+=1),c.freshness.kind==="live"&&(i+=1),c.freshness.verifyBeforeUse&&(a+=1);return {schemaVersion:jt,generatedAt:t,status:s>0?"stale":n>0?"unknown":"fresh",totalFacts:e.facts.length,staleFacts:s,unknownFacts:n,liveFacts:i,verifyBeforeUseFacts:a,byKind:r,byCategory:o}}function J(e,t){let r=[...new Set(e)],o=r.filter(s=>t.has(s)).length;return {eligibleCount:r.length,boundCount:o,unknownCount:r.length-o,coverageRatio:r.length===0?null:o/r.length}}function St(e,t){let r=e.filter(d=>d.kind==="project").map(d=>d.id),o=e.filter(d=>d.kind==="endpoint").map(d=>d.id),s=new Set(o),n=e.filter(d=>d.kind==="api"&&!!d.projectId&&d.attributes.runtimeRegistrationRequired===true).map(d=>d.id),i=new Set(n),a=new Map(e.map(d=>[d.id,d.kind])),c=new Set(t.filter(d=>d.kind==="implements"||d.kind==="defines"&&a.get(d.from)==="file"&&a.get(d.to)==="endpoint").flatMap(d=>s.has(d.from)?[d.from]:s.has(d.to)?[d.to]:[])),l=new Set(t.filter(d=>d.kind==="implements"&&(a.get(d.from)==="runtime-unit"||a.get(d.to)==="runtime-unit")).flatMap(d=>i.has(d.from)?[d.from]:i.has(d.to)?[d.to]:[])),u=new Set(r),p=d=>new Set(t.filter(f=>f.kind===d).flatMap(f=>[f.from,f.to]).filter(f=>u.has(f)));return {apiImplementation:J(o,c),apiRuntimeRegistration:J(n,l),projectTests:J(r,p("tests")),projectDeployment:J(r,p("deploys")),projectOwnership:J(r,p("owns"))}}function Et(e,t){return e.filter(o=>o.code.includes("unknown")||o.code.includes("unresolved")||o.code.includes("limit_reached")||o.code.endsWith(".empty_result")).reduce((o,s)=>o+Math.max(s.entityIds?.length??0,s.relationIds?.length??0,1),0)+Object.values(t).reduce((o,s)=>o+s.unknownCount,0)}function Re(e,t){return t===0?1:e/t}function Cr(e,t,r,o){return e.entityIds?.some(s=>t.has(s))||e.relationIds?.some(s=>r.has(s))?true:e.entityIds?.length||e.relationIds?.length?false:!/\bproject\b/i.test(e.message)||e.message.includes(o)}function Sr(e,t,r,o,s){let n=new Set(s.filter(a=>a.provider===e.id).map(a=>a.id)),i=e.inputCoverage?.filter(a=>a.scope==="workspace"||a.scope==="project"&&a.scopeId===t);return {...e,discoveredEntities:r.filter(a=>a.proofIds.some(c=>n.has(c))).length,discoveredRelations:o.filter(a=>a.proofIds.some(c=>n.has(c))).length,proofCount:n.size,...i?{inputCoverage:i}:{}}}function Er(e,t){let r=new Set(e.entities.filter(m=>m.projectId===t).map(m=>m.id)),o=e.relations.filter(m=>r.has(m.from)||r.has(m.to)),s=new Set(r);for(let m of o)s.add(m.from),s.add(m.to);let n=e.entities.filter(m=>s.has(m.id)),i=new Set([...n,...o].flatMap(m=>m.proofIds)),a=e.proofs.filter(m=>i.has(m.id)),c=new Set(o.map(m=>m.id)),l=e.diagnostics.filter(m=>Cr(m,s,c,t)),u=e.providers.map(m=>Sr(m,t,n,o,a)),p=e.source.inputs?.scopes.filter(m=>m.kind==="workspace"||m.kind==="project"&&m.id===t)??[],d=p.filter(m=>!m.truncated).length,f=u.reduce((m,v)=>(v.status==="failed"?m.failed+=1:v.status==="skipped"||v.inputCoverage?.every(W=>W.status==="not-applicable")?m.notApplicable+=1:v.status==="partial"||v.inputCoverage?.some(W=>W.status==="bounded")?m.bounded+=1:m.complete+=1,m),{complete:0,bounded:0,notApplicable:0,failed:0}),h=St(n,o);return {...e,entities:n,relations:o,proofs:a,providers:u,quality:{entityCount:n.length,relationCount:o.length,proofCount:a.length,entityProofCoverageRatio:Re(n.filter(m=>m.proofIds.length>0).length,n.length),relationProofCoverageRatio:Re(o.filter(m=>m.proofIds.length>0).length,o.length),providerSuccessRatio:Re(u.filter(m=>m.status!=="failed").length,u.length),conflictCount:l.filter(m=>m.code.includes("conflict")).length,unknownCount:Et(l,h),bindingCoverage:h,...e.quality.completeness?{completeness:{status:p.some(m=>m.truncated)||f.bounded>0||f.failed>0?"bounded":"complete",inventory:{scopeCount:p.length,completeScopes:d,boundedScopes:p.length-d,eligibleFiles:p.reduce((m,v)=>m+(v.eligibleFileCount??v.fileCount),0),indexedFiles:p.reduce((m,v)=>m+v.fileCount,0),eligibleFileCountExact:p.every(m=>m.eligibleFileCountExact!==false)},providers:f}}:{},portable:true,secretValuesEmitted:false},diagnostics:l}}var Wr=s.projectKnowledgeGraphReference.schemaVersion;function Wt(e,t){let r=Er(e,t),o={schemaVersion:Wr,generatedAt:e.generatedAt,project:{name:t},canonical:{graph:"workspace:.workspai/reports/workspace-knowledge-graph.json",boundedQuery:`workspai workspace graph search <task-query> --scope project:${t} --limit 12 --json`,sourceHash:e.source.hash,projectionHash:c$1(r)},summary:{entityCount:r.entities.length,relationCount:r.relations.length,proofCount:r.proofs.length}};return {...o,integrity:{algorithm:"sha256",payloadHash:c$1(o),portable:true,absolutePathsEmitted:false}}}function Rt(e,t){return d(e,t.path,{...t.absolutePath?{absolutePath:t.absolutePath}:{}})}var Rr=q$2.model,de=p.model;function xe(e){return e.projectTopology??e.graph}function At(e){return !!(e.projectTopology&&e.graph&&c$1(e.projectTopology)===c$1(e.graph))}function mo(e){let t=e.engineStatus==="hit"||e.engineStatus==="unchanged"?"reused":e.engineStatus==="incremental"?"partially-reused":"rebuilt";return {schemaVersion:"workspace-model-build.v1",mode:e.mode,outcome:t,engineStatus:e.engineStatus}}var xr=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","deno.jsonc","bun.lock","bun.lockb","bunfig.toml",".bunfig.toml","deps.edn","project.clj","build.sbt","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","terraform.tf"],Ar=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next",".turbo"]);function Mr(e,t){return (g.relative(e,t)||".").split(g.sep).join("/")}function ce(e,t){return Mr(e,d(e,t.path,{...t.absolutePath?{absolutePath:t.absolutePath}:{}}))}async function Mt(e){try{if(!await C.pathExists(e))return null;let t=await C.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function Ir(e,t){for(let r of t)if(await C.pathExists(g.join(e,r)))return true;return false}function Ae(e){let t=Number.parseInt(process.env.RAPIDKIT_WORKSPACE_MODEL_SCAN_DEPTH??"",10),r=typeof e=="number"&&Number.isFinite(e)?e:Number.isFinite(t)?t:4;return Math.min(12,Math.max(1,Math.trunc(r)))}async function Fr(e,t){let r=g.resolve(e),o=[{dirPath:r,depth:0}],s=new Set,n=new Set;for(;o.length>0;){let i=o.shift();if(!i)continue;let a=g.resolve(i.dirPath);if(n.has(a))continue;if(n.add(a),a!==r&&await Ir(a,xr)){s.add(a);continue}if(i.depth>=t)continue;let c=[];try{c=await C.readdir(a,{withFileTypes:true});}catch{continue}for(let l of c)!l.isDirectory()||Ar.has(l.name)||a$5(l.name)||l.name.startsWith(".")&&l.name!==".config"||o.push({dirPath:g.join(a,l.name),depth:i.depth+1});}return Array.from(s).sort((i,a)=>i.localeCompare(a))}function Dr(e){let t=new Set,r=[];for(let o of e){let s=g.resolve(o);t.has(s)||(t.add(s),r.push(s));}return r.sort((o,s)=>o.localeCompare(s))}function xt(e,t){let r=e?.[t];return typeof r=="string"&&r.trim()?r.trim():void 0}function Or(e,t){return e?.[t]===true}function Gr(e,t,r){let o=e?.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,s=xt(o,"generator"),n=xt(o,"command_display"),i=typeof t=="string"&&t.startsWith("frontend.");if(!(!s&&!i))return {...s?{id:s}:{},...t?{kit:t}:{},displayName:r,source:Or(o,"official_generator")?"official-generator":"metadata",...n?{commandDisplay:n}:{}}}async function _r(e){let t=[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json","package.json","product.json","tsconfig.json","pnpm-workspace.yaml","bunfig.toml",".bunfig.toml","nx.json","turbo.json","pyproject.toml","requirements.txt","go.mod","go.work","go.work.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","rust-toolchain.toml","rust-toolchain","CMakeLists.txt","meson.build","Makefile","WORKSPACE","WORKSPACE.bazel","MODULE.bazel","BUILD","BUILD.bazel",".bazelrc","composer.json","Gemfile","mix.exs","deno.json","setup.py","setup.cfg","Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","README.md"],r=[];for(let s of t)await C.pathExists(g.join(e,s))&&r.push(s);let o=new Set(["package.json","pyproject.toml","go.mod","go.work","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","CMakeLists.txt","meson.build","composer.json","Gemfile","mix.exs","deno.json"]);if(!r.some(s=>o.has(s))){let s=[],n=new Set([".git",".workspai",".rapidkit",".venv","build","dist","node_modules","target","third_party","vendor"]),i=(p,d)=>{let f=p.toLowerCase();return ["package.json","pyproject.toml","go.mod","pom.xml","build.gradle","build.gradle.kts","cargo.toml","cmakelists.txt","meson.build","composer.json","gemfile","mix.exs","deno.json"].includes(f)||f.endsWith(".gemspec")||f==="description"&&d.toLowerCase()==="r"},a=async(p,d)=>{if(d>3||s.length>=512)return;let f=await C.readdir(p,{withFileTypes:true}).catch(()=>[]);for(let h of f.sort((m,v)=>m.name.localeCompare(v.name))){if(s.length>=512)return;h.isFile()&&i(h.name,g.basename(p))?s.push(g.relative(e,g.join(p,h.name)).split(g.sep).join("/")):h.isDirectory()&&!n.has(h.name)&&await a(g.join(p,h.name),d+1);}};await a(e,0);let c=new Map;for(let p of s){let d=p.split("/")[0],f=c.get(d)??[];f.push(p),c.set(d,f);}for(let p of c.values())p.sort((d,f)=>d.split("/").length-f.split("/").length||d.localeCompare(f));let l=[],u=[...c.keys()].sort();for(let p=0;l.length<16&&u.some(d=>p<(c.get(d)?.length??0));p+=1)for(let d of u){let f=c.get(d)?.[p];f&&l.length<16&&l.push(f);}r.push(...l.filter(p=>!r.includes(p)));}return r}async function A(e,t,r,o=t){let s=await g$1(e,t),n=s!==null,i={path:o.split(g.sep).join("/"),exists:n};if(s&&r){let a=await Mt(s);typeof a?.generatedAt=="string"&&(i.generatedAt=a.generatedAt);let c=a?.status??a?.result??a?.verdict;typeof c=="string"&&(i.status=c);}return i}async function Tr(e,t,r,o){let s=".workspai/reports",n=c=>A(t,`${s}/${c}`,r,`${o}/${s}/${c}`),i=await n("doctor-project-last-run.json");return {doctor:i?.exists===true?i:await n("doctor-last-run.json"),remediationPlan:await n("doctor-remediation-plan-last-run.json"),fixResult:await n("doctor-fix-result-last-run.json"),analyze:await n("analyze-last-run.json"),readiness:await n("release-readiness-last-run.json")}}async function Nr(e,t,r){let o=j$2(t,{searchParents:false}),s=q$3(t),n=s&&!j$3(o)?s.detection:m(t,o),i=D(t),a=f(n.runtime),c=await b$2(t,o,{runtime:n.runtime,framework:n.key}),l$1=r.contractProject?.slug?r.contractProject.slug:typeof o?.name=="string"&&o.name.trim()?o.name.trim():g.basename(t),u=j$3(o)?`adopted.${n.key}`:typeof o?.kit_name=="string"?o.kit_name:typeof o?.kit=="string"?o.kit:r.contractProject?.kit,p=typeof o?.engine=="string"?o.engine:i.engine!=="unknown"?i.engine:void 0,d=Gr(o,u,n.displayName),f$1=it({kitId:u,framework:n.key,runtime:n.runtime}),h=l(t),m$1=[n.runtime,...h.filter(T=>T!==n.runtime)],v=await c$2({projectPath:t,declaration:r.contractProject?.governance}),W=b$3({workspacePath:e,projectPath:t,projectName:l$1,declaredRelativePath:r.contractProject?.relativePath});return {name:l$1,path:W,...r.includeAbsolutePaths?{absolutePath:t}:{},kind:c,category:a$3(c),runtime:n.runtime,runtimeCandidates:m$1,framework:n.key,frameworkDisplayName:n.displayName,confidence:n.confidence,detectionSource:n.source,supportTier:n.supportTier,runtimeSupportTier:a.tier,runtimeDoctorSupport:a.doctorSupport,moduleSupport:i.moduleSupport,...u?{kit:u}:{},...p?{engine:p}:{},...d?{generator:d}:{},createCapability:f$1,commands:{supported:i.supportedCommands,unsupported:i.unsupportedCommands,global:i.globalCommands,fleetStages:i.fleetStages,localOnly:i.localOnlyCommands,map:i.commandMap},importantFiles:await _r(t),governance:v,evidence:await Tr(e,t,r.includeEvidence,W),provenance:{path:r.contractProject?"workspace contract declaration reconciled with filesystem discovery":"filesystem discovery",runtime:n.source,framework:n.source,commands:"project command capability matrix",createCapability:"create planner capability contract",governance:r.contractProject?.governance!==void 0?"workspace contract declaration reconciled with repository evidence":"repository and documented external governance discovery",evidence:"project .workspai/reports"}}}async function Kr(e){for(let t$1 of t(e,"workspace.json")){let r=await Mt(t$1);if(r)return r}return null}function $r(e){if(e.length===0)return "empty-workspace";let t=new Set(e.map(r=>r.category));return t.size>1?"polyglot-product-workspace":t.has("frontend")&&e.length>1?"full-stack-workspace":t.has("frontend")?"frontend-workspace":t.has("desktop")?"desktop-application-workspace":t.has("extension")?"extension-workspace":t.has("agent")?e.length>1?"agent-platform-workspace":"agent-workspace":t.has("platform")?"platform-workspace":t.has("library")?"library-workspace":e.length>1?"backend-platform":"backend-workspace"}function Vr(e){let t=new Set;for(let r of e){let o=`${r.name} ${r.path}`.toLowerCase();for(let s of ["auth","billing","payment","notification","order","admin","report","search","analytics"])o.includes(s)&&t.add(s);}return Array.from(t).sort()}function j(e,t,r,o){return {severity:e,code:t,message:r,target:o}}function It(e){let t=[];if(e.workspace.name.trim()||t.push(j("error","workspace.name.missing","Workspace name could not be resolved.","workspace")),e.workspace.type==="observed-workspace"&&t.push(j("warning","workspace.marker.missing","Workspace marker is missing; model is based on filesystem observation.","workspace.marker")),e.summary.projectCount===0&&t.push(j("warning","workspace.projects.empty","No project roots were detected in this workspace.","projects")),e.workspace.profile){let n=P$1({profile:e.workspace.profile,runtimes:e.summary.runtimes});n.ok||t.push(j("warning","workspace.profile.mismatch",[n.message,n.recommendedCommand?`Keep the current profile and run ${n.recommendedCommand} when you want the recommended profile.`:void 0].filter(Boolean).join(" "),"workspace.profile"));}e.contracts.exists||t.push(j("warning","workspace.contract.missing","Workspace contract is missing; dependency and API edges may be incomplete.",e.contracts.workspaceContractPath));let r=new Map;for(let n of e.projects){let i=n.name.toLowerCase(),a=r.get(i)??[];a.push(n),r.set(i,a),n.importantFiles.length||t.push(j("warning","project.markers.missing",`Project ${n.name} has no important manifest files recorded.`,n.path));let c=d(e.workspace.root,n.path,{...n.absolutePath?{absolutePath:n.absolutePath}:{}});C.existsSync(c)||t.push(j("warning","project.path.missing",`Registered project ${n.name} is not available at its declared path.`,n.path)),n.runtime==="unknown"&&t.push(j("warning","project.runtime.unknown",`Project ${n.name} runtime could not be confidently detected.`,n.path));let l=["test","build"];for(let d of l)n.commands.supported.includes(d)&&n.commands.unsupported.includes(d)&&t.push(j("error","project.commands.conflict",`Project ${n.name} marks ${d} as both supported and unsupported.`,n.path));let u=new Set(n.commands.fleetStages),p=new Set(n.commands.localOnly);for(let d of n.commands.fleetStages){p.has(d)&&t.push(j("error","project.commands.scope-conflict",`Project ${n.name} marks ${d} as both fleet and local-only.`,n.path));let f=n.commands.map[d];(!f||f.fleetEligible!==true||f.executionScope!=="fleet")&&t.push(j("error","project.commands.fleet-stage-invalid",`Project ${n.name} advertises ${d} as a fleet stage without a supported fleet capability.`,n.path));}for(let d of n.commands.localOnly){let f=n.commands.map[d];(!f||f.status!=="supported"||f.executionScope!=="local-only"||f.fleetEligible===true)&&t.push(j("error","project.commands.local-only-invalid",`Project ${n.name} advertises ${d} as local-only without a matching local-only capability.`,n.path));}for(let d of Object.values(n.commands.map))d.status==="supported"&&(d.fleetEligible===true&&!u.has(d.command)&&t.push(j("error","project.commands.fleet-stage-missing",`Project ${n.name} capability ${d.command} is fleet-eligible but missing from fleetStages.`,n.path)),d.executionScope==="local-only"&&d.fleetEligible!==true&&!p.has(d.command)&&t.push(j("error","project.commands.local-only-missing",`Project ${n.name} capability ${d.command} is local-only but missing from localOnly commands.`,n.path)));}for(let[n,i]of r.entries())i.length>1&&t.push(j("error","project.name.duplicate",`Project name "${n}" is ambiguous across ${i.length} project roots.`,i.map(a=>a.path).join(", ")));e.projectTopology&&e.graph&&c$1({...e.projectTopology,generatedAt:"<ignored>"})!==c$1({...e.graph,generatedAt:"<ignored>"})&&t.push(j("error","workspace.project-topology.alias-mismatch","Deprecated model.graph must remain structurally identical to canonical model.projectTopology during the v1 migration window.","projectTopology"));let o=t.filter(n=>n.severity==="error").length,s=t.filter(n=>n.severity==="warning").length;return {status:o>0?"failed":s>0?"warning":"passed",errors:o,warnings:s,issues:t}}function go(e){return It(e)}function P(e){return e.join(".")}function Hr(e,t){let r=de,o=e.generatedAt,s=[b({id:"workspace.name",label:"Workspace name",scope:"workspace",value:e.workspace.name,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:P(["workspace","name"]),reason:"Workspace identity is structural metadata and changes through workspace setup."}}),b({id:"workspace.type",label:"Workspace type",scope:"workspace",value:e.identity.workspaceType,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:P(["identity","workspaceType"]),reason:"Workspace type is derived from the current project inventory."}}),b({id:"workspace.projectCount",label:"Project count",scope:"workspace",value:e.summary.projectCount,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:P(["summary","projectCount"]),reason:"Project count is derived from workspace discovery and should be refreshed after structural changes."}}),b({id:"workspace.runtimeFamilies",label:"Runtime families",scope:"workspace",value:e.identity.runtimeFamilies,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:P(["identity","runtimeFamilies"]),reason:"Runtime coverage is inferred from project surfaces."}}),b({id:"workspace.policyMode",label:"Workspace policy mode",scope:"policy",value:e.policies.mode,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:P(["policies","mode"]),reason:"Policy mode is configuration, not runtime state."}}),b({id:"workspace.contract.exists",label:"Workspace contract presence",scope:"contract",value:e.contracts.exists,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:P(["contracts","exists"]),reason:"Contract presence is derived from workspace files and should be refreshed before release gating."}})],n=xe(e);n&&s.push(b({id:"graph.edgeCount",label:"Dependency graph edge count",scope:"graph",value:n.stats.edgeCount,freshness:{kind:"derived",category:"structure",generatedAt:n.generatedAt??o,now:t,sourceArtifact:r,sourcePath:P(["projectTopology","stats","edgeCount"]),reason:"Graph topology is derived from manifests, imports, and workspace contracts."}}),b({id:"graph.evidenceCoverageRatio",label:"Dependency graph evidence coverage",scope:"graph",value:n.stats.evidenceCoverageRatio,freshness:{kind:"derived",category:"structure",generatedAt:n.generatedAt??o,now:t,sourceArtifact:r,sourcePath:P(["projectTopology","stats","evidenceCoverageRatio"]),reason:"Graph evidence coverage changes when dependency evidence or contract edges change."}}));for(let[i,a]of e.projects.entries()){let c=`projects[${i}]`,l={kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,reason:"Project facts are derived from workspace discovery, project metadata, and framework probes."};s.push(b({id:`project.${a.name}.kind`,label:`${a.name} kind`,scope:"project",project:a.name,value:a.kind,freshness:{...l,sourcePath:P([c,"kind"])}}),b({id:`project.${a.name}.category`,label:`${a.name} category`,scope:"project",project:a.name,value:a.category,freshness:{...l,sourcePath:P([c,"category"])}}),b({id:`project.${a.name}.runtime`,label:`${a.name} runtime`,scope:"project",project:a.name,value:a.runtime,freshness:{...l,sourcePath:P([c,"runtime"])}}),b({id:`project.${a.name}.framework`,label:`${a.name} framework`,scope:"project",project:a.name,value:a.frameworkDisplayName,freshness:{...l,sourcePath:P([c,"frameworkDisplayName"])}}),b({id:`project.${a.name}.supportTier`,label:`${a.name} support tier`,scope:"project",project:a.name,value:a.supportTier,freshness:{...l,sourcePath:P([c,"supportTier"])}}),b({id:`project.${a.name}.safeFleetStages`,label:`${a.name} safe fleet stages`,scope:"command",project:a.name,value:a.commands.fleetStages,freshness:{...l,sourcePath:P([c,"commands","fleetStages"]),reason:"Safe command availability is derived from package and project command surfaces."}}),...["ci","release","ownership"].map(u=>b({id:`project.${a.name}.governance.${u}`,label:`${a.name} ${u} governance`,scope:"policy",project:a.name,value:a.governance?.[u]??{status:"unknown",provider:null,evidence:[],reference:null},freshness:{...l,sourcePath:P([c,"governance",u]),reason:"Governance truth is reconciled from repository surfaces and explicit workspace contract declarations."}})));for(let[u,p]of Object.entries(a.evidence))s.push(b({id:`project.${a.name}.evidence.${u}`,label:`${a.name} ${u} evidence`,scope:"evidence",project:a.name,value:p?{path:p.path,exists:p.exists,status:p.status??null}:{exists:false},freshness:{kind:p?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:p?.generatedAt??o,now:t,status:p?.exists?void 0:"unknown",sourceArtifact:p?.path??r,sourcePath:P([c,"evidence",u]),verifyBeforeUse:true,reason:p?.exists?"Evidence reports can expire or become stale after source changes.":"Missing evidence must be generated before this fact is used for verification."}}));}for(let[i,a]of Object.entries(e.evidence))s.push(b({id:`workspace.evidence.${i}`,label:`Workspace ${i} evidence`,scope:"evidence",value:a?{path:a.path,exists:a.exists,status:a.status??null}:null,freshness:{kind:a?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:a?.generatedAt??o,now:t,status:a?.exists?void 0:"unknown",sourceArtifact:a?.path??r,sourcePath:P(["evidence",i]),verifyBeforeUse:true,reason:a?.exists?"Workspace evidence can expire or become stale after project, dependency, or policy changes.":"Missing workspace evidence must be generated before release or repair decisions."}}));return s}async function Me(e,t){let[r,o,s,n,i,a$3]=await Promise.all([a(e),Kr(e),Ie(e),a$1(e),a$2(e,{descendIntoMatchedProjects:false}),Fr(e,t)]),c=new Map;for(let u of s?.projects??[]){let p=d(e,u.relativePath,u.externalPath?{absolutePath:u.externalPath}:{});c.set(p,u);}let l=Dr([...i,...a$3.filter(u=>!i.some(p=>{let d=g.relative(p,u);return d!==""&&d!==".."&&!d.startsWith(`..${g.sep}`)&&!g.isAbsolute(d)})),...c.keys(),...n.map(u=>d(e,u.relativePath||u.name,u.path?{absolutePath:u.path}:{}))]);return {marker:r,workspaceJson:o,workspaceContract:s,contractProjectPaths:c,projectPaths:l}}async function le(e){let t$2=g.resolve(e.workspacePath),r=e.includeAbsolutePaths===true,o=e.includeEvidence===true,s=Ae(e.observableScanDepth),n=e.now??new Date,{marker:i,workspaceJson:a,workspaceContract:c,contractProjectPaths:l,projectPaths:u}=await Me(t$2,s),p$1=e.reuseProjectModels,d=await Promise.all(u.map(w=>{if(p$1){let Ot=g.relative(t$2,g.resolve(w)).split(g.sep).join("/"),Fe=p$1.get(Ot);if(Fe)return Promise.resolve(Fe)}return Nr(t$2,w,{includeAbsolutePaths:r,includeEvidence:o,contractProject:l.get(g.resolve(w))})})),f=typeof a?.workspace_name=="string"?a.workspace_name:typeof a?.name=="string"?a.name:i?.name||c?.workspace.name||g.basename(t$2),h=typeof a?.profile=="string"?a.profile:typeof a?.mode=="string"?a.mode:c?.workspace.profile,m=Array.from(new Set(d.map(w=>w.kind))).sort(),v=Array.from(new Set(d.map(w=>w.category))).sort(),W=Array.from(new Set(d.flatMap(w=>w.runtimeCandidates.length>0?w.runtimeCandidates:[w.runtime]))).sort(),T=Array.from(new Set(d.map(w=>w.framework))).sort(),N=[".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/policies.yml",".rapidkit/policies.yaml"].find(w=>C.existsSync(g.join(t$2,w))),X=t(t$2,"workspace.contract.json").map(w=>g.relative(t$2,w).split(g.sep).join("/")).find(w=>C.existsSync(g.join(t$2,w)))??t$1.workspaceContract,O=await C.pathExists(g.join(t$2,X)),Y={schemaVersion:Rr,generatedAt:n.toISOString(),workspace:{name:f,root:t$2,...h?{profile:h}:{},type:i?"rapidkit-workspace":"observed-workspace",...i?{marker:{createdBy:i.createdBy,version:i.version,createdAt:i.createdAt}}:{}},identity:{workspaceType:$r(d),surfaces:m,categories:v,runtimeFamilies:W,businessCapabilities:Vr(d)},discovery:{observableScanDepth:s},projects:d,policies:{mode:typeof a?.policy_mode=="string"?a.policy_mode:typeof a?.policyMode=="string"?a.policyMode:"warn",source:N??null,exists:!!N},contracts:{workspaceContractPath:X,exists:O,status:O?"known":"missing"},evidence:{doctor:await A(t$2,p.doctor,o),projectDoctor:await A(t$2,t$1.doctorProject,o),doctorRemediationPlan:await A(t$2,t$1.doctorRemediationPlan,o),artifactRemediationPlan:await A(t$2,t$1.artifactRemediationPlan,o),doctorFixResult:await A(t$2,t$1.doctorFixResult,o),analyze:await A(t$2,p.analyze,o),readiness:await A(t$2,p.readiness,o),pipeline:await A(t$2,t$1.pipelineLastRun,o)},summary:{projectCount:d.length,runtimes:W,frameworks:T,firstClassProjects:d.filter(w=>w.supportTier==="first-class").length,extendedProjects:d.filter(w=>w.supportTier==="extended").length,observedProjects:d.filter(w=>w.supportTier==="observed").length}},S=await Ft(t$2,Y,{contractExists:O,now:n,incrementalGraph:e.incrementalGraph}),E={...Y,projectTopology:S,graph:S},G=It(E),K=Hr({...E},n),Dt=Ct({facts:K,generatedAt:n.toISOString(),now:n});return {...E,facts:K,factFreshness:Dt,validation:G}}async function ho(e){if(e.cache!==true)return {model:await le(e),cache:"disabled"};let t=g.resolve(e.workspacePath),r=Ae(e.observableScanDepth),o=Ee(),{marker:s,workspaceJson:n,projectPaths:i}=await Me(t,r),a=await ae({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:i,workspaceJson:n,marker:s}),c=await We(t);if(c&&c.cliVersion===o&&c.inputsHash===a&&At(c.model))return {model:c.model,cache:"hit"};let l=await le({...e}),[u,p]=await Promise.all([oe(t,i),se(t)]);return await ie(t,{cliVersion:o,inputsHash:a,generatedAt:(e.now??new Date).toISOString(),model:l,projectSignatures:u,workspaceFileSignatures:p}),{model:l,cache:"miss"}}function Br(e,t){let r=new Set,o=new Set,s=new Set;for(let[n,i]of Object.entries(t))n in e?e[n]!==i&&r.add(n):o.add(n);for(let n of Object.keys(e))n in t||s.add(n);return {changed:r,added:o,removed:s}}function Lr(e={},t={}){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r)if(e[o]!==t[o])return false;return true}async function ko(e){let t=g.resolve(e.workspacePath),r=Ae(e.observableScanDepth),o=Ee(),s=e.now??new Date,{marker:n,workspaceJson:i,projectPaths:a}=await Me(t,r),c=await We(t),l=async()=>{let S=await le({...e}),E=await ae({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:a,workspaceJson:i,marker:n}),[G,K]=await Promise.all([oe(t,a),se(t)]);return await ie(t,{cliVersion:o,inputsHash:E,generatedAt:s.toISOString(),model:S,projectSignatures:G,workspaceFileSignatures:K}),{model:S,mode:"full"}},u=c?xe(c.model):void 0;if(!c||c.cliVersion!==o||!c.projectSignatures||!u||!At(c.model))return l();let p=await se(t);if(!Lr(c.workspaceFileSignatures,p))return l();let d=await oe(t,a),{changed:f,added:h,removed:m}=Br(c.projectSignatures,d);if(f.size===0&&h.size===0&&m.size===0)return {model:c.model,mode:"unchanged"};let v=new Set([...f,...h]),W=new Map;for(let S of c.model.projects){let E=ce(t,S);!v.has(E)&&!m.has(E)&&W.set(E,S);}let T=new Set,N=false;for(let S of c.model.projects){let E=ce(t,S);f.has(E)&&T.add(S.name);}let X=h.size>0||m.size>0,O=await le({...e,reuseProjectModels:W,incrementalGraph:{previousGraph:u,changedProjectIds:T,structuralChange:X||N}});for(let S of c.model.projects){let E=ce(t,S);if(!f.has(E))continue;let G=O.projects.find(K=>ce(t,K)===E);if(G&&G.name!==S.name){N=true;break}}if(N)return l();let Y=await ae({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:a,workspaceJson:i,marker:n});return await ie(t,{cliVersion:o,inputsHash:Y,generatedAt:s.toISOString(),model:O,projectSignatures:d,workspaceFileSignatures:p}),{model:O,mode:"incremental"}}async function Ie(e){try{let{contract:t}=await p$1({workspacePath:e});return t&&typeof t=="object"?t:null}catch{return null}}async function Ft(e,t,r){let o=r.contractExists?await Ie(e):null;try{return r.incrementalGraph?await wt({workspacePath:e,model:t,contract:o,now:r.now,previousGraph:r.incrementalGraph.previousGraph,changedProjectIds:r.incrementalGraph.changedProjectIds,structuralChange:r.incrementalGraph.structuralChange}):await yt({workspacePath:e,model:t,contract:o,now:r.now})}catch{let s=t.projects.map(n=>({id:n.name,path:n.path}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:r.now.toISOString(),nodes:s,edges:[],stats:{nodeCount:s.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:s.length,connectedNodeCount:0,density:0,edgeCoverageRatio:s.length>0?0:1,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:s.length>1?[{code:"graph.inference.failed",severity:"warning",message:"Dependency graph inference failed; model contains projects but no dependency edges.",recommendation:"Run workspace model again after fixing graph inputs, or add workspace contract/manual graph overrides.",nodeIds:s.map(n=>n.id).sort((n,i)=>n.localeCompare(i))}]:void 0}}}async function yo(e,t,r={}){let o=e.contracts.exists?await Ie(t):null,{buildWorkspaceKnowledgeGraph:s}=await import('./workspace-knowledge-graph-EFC4TUDZ.js'),n=d$1(e),i=r.refreshKnowledgeGraph?null:await C.readJson(g.join(t,p.knowledgeGraph)).then(p=>p).catch(()=>null),a=await s({workspacePath:t,workspace:{name:e.workspace.name,...e.workspace.profile?{profile:e.workspace.profile}:{}},projects:e.projects.map(p=>({id:p.name,path:p.path,...p.absolutePath?{absolutePath:p.absolutePath}:{},runtime:p.runtime,runtimeCandidates:p.runtimeCandidates,framework:p.framework,kind:p.kind,category:p.category,...p.governance?{governance:p.governance}:{},...p.kit?{kit:p.kit}:{}})),projectTopology:xe(e)??await Ft(t,e,{contractExists:e.contracts.exists,now:new Date(e.generatedAt)}),contract:o,now:new Date(e.generatedAt),source:{kind:"workspace-model",artifact:de,hashAlgorithm:"sha256",hash:d$2(n)},previousGraph:i}),c=[],l=new Map;for(let p of e.projects){let d=Rt(t,p);if(!(await C.stat(d).catch(()=>null))?.isDirectory())continue;let h=await C.realpath(d),m=l.get(h);if(m)throw new Error(`Projects ${m} and ${p.name} resolve to the same graph artifact root: ${d}`);l.set(h,p.name),c.push({rootPath:d,relativePath:t$1.projectKnowledgeGraphReference,payload:Wt(a,p.name)});}let u=await j$1(t,de,[{rootPath:t,relativePath:p.knowledgeGraph,payload:a},{rootPath:t,relativePath:de,payload:n},...c]);for(let p$1 of c){let d=g.join(p$1.rootPath,p.knowledgeGraph);(await C.readJson(d).catch(()=>null))?.schemaVersion===q$2.knowledgeGraph&&await C.remove(d).catch(()=>{});}return u[1]}export{it as a,Xr as b,en as c,_ as d,jt as e,b as f,Ct as g,St as h,Et as i,Er as j,Rt as k,Rr as l,de as m,xe as n,mo as o,go as p,Hr as q,le as r,ho as s,ko as t,yo as u};
|
package/dist/chunk-YLLCZMKP.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import {a as a$2,D as D$1}from'./chunk-TJ3MDZMC.js';import {d}from'./chunk-ROOPODG6.js';import {j,m,i}from'./chunk-H4YHIOCT.js';import {a as a$1}from'./chunk-GR6442P7.js';import {a as a$3,g,f as f$1,h}from'./chunk-BLEIUQL6.js';import {b}from'./chunk-VN2MKTQO.js';import {a}from'./chunk-XWKGZRHN.js';import {a as a$4}from'./chunk-252EKOR6.js';import {l}from'./chunk-OCGZNSOE.js';import {c}from'./chunk-64XWHDZ3.js';import {t as t$1,u,q as q$1}from'./chunk-VQZ5PI5J.js';import {t,p,s,q}from'./chunk-ODK4LCEL.js';import*as f from'path';import f__default from'path';import k from'fs-extra';import Re from'crypto';var Ae="unknown-run";function de(e){let t=c();return !t||t===Ae?e:{...e,runId:t}}async function ue(e,t){await k.ensureDir(f.dirname(e));let r=`${e}.${process.pid}.${Date.now()}.${Re.randomUUID()}.tmp`;try{await k.writeJSON(r,t,{spaces:2}),await k.move(r,e,{overwrite:true});}finally{await k.remove(r).catch(()=>{});}}function le(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 Xe(e,t){if(t.length===0)return;let r=le(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,l)=>c.name.localeCompare(l.name)).map(c=>({...c}));await ue(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-upsert"});}async function et(e,t){if(t.length===0)return;let r=le(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Set(t.map(c=>f.resolve(c))),i=o.filter(c=>!n.has(f.resolve(c.path)));await ue(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-remove"});}var ot="workspace-dependency-graph.v1",me=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],ge=["inferred","contract","manual"];var v=t.workspaceContract,xe=p.contractVerify,G=s.workspaceContract.schemaVersion,_e=q.contractVerify,D=class extends Error{constructor(r){super(`Workspace contract verification failed: ${r.violations.join("; ")}`);this.verification=r;this.name="WorkspaceContractVerificationError";}verification};function Pe(e){return e.replace(/\\/g,"/")}function z(e){let t=Pe(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 fe(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function ye(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function Ge(e){return [...new Set(e.map(t=>t.trim()).filter(t=>t.length>0))].sort((t,r)=>t.localeCompare(r))}function Oe(e){let t=e.contracts;return !t||typeof t!="object"||Array.isArray(t)?[]:ye(t.env)}function Ce(e){let t=(e||"").toLowerCase();return t.includes("vscode-extension")||t.includes("desktop.electron")||t.startsWith("extension.")||t.startsWith("desktop.")&&!t.includes("tauri")||t.includes("agent.microsoft")||t.includes("agent.openai")}function he(e){let r=(Array.isArray(e.ports)?e.ports:[]).map(i=>{if(!i||typeof i!="object"||Array.isArray(i))return null;let c=i,l=Number(c.port);if(!Number.isInteger(l)||l<1||l>65535)return null;let m=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:l,protocol:m}}).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 Ne(e){let t=f__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),l=Number(c?.[1]);if(!c||!Number.isInteger(l)||l<1||l>65535)continue;let m=c[2]?.toLowerCase();o.set(l,{name:"http",port:l,protocol:m==="udp"?"udp":"http"});}return [...o.values()].sort((n,i)=>n.port-i.port)}catch{return []}}async function T(e){for(let t of e)if(await k.pathExists(t))return t;return null}async function Ie(e){for(let r of t$1(e,"workspace.json"))try{let o=await k.readJson(r);return {name:typeof o.workspace_name=="string"&&o.workspace_name.trim()||typeof o.name=="string"&&o.name.trim()||f__default.basename(e),profile:typeof o.profile=="string"?o.profile:void 0}}catch{}let t=await a$4(e);return t?.name?.trim()?{name:t.name.trim()}:{name:f__default.basename(e)}}async function De(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 T(u(i,"project.json")),l=await T(u(i,"context.json"));if(c||l){t.push(c??l??"");continue}let m;try{m=await k.readdir(i,{withFileTypes:true});}catch{continue}for(let d of m)!d.isDirectory()||n.has(d.name)||a$1(d.name)||r.push(f__default.join(i,d.name));}return t.sort()}function Te(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 $e(e,t){let r=(e||"").toLowerCase(),o=(t||"").toLowerCase();return Ce(e)?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 B(e,t){let r=e;for(;t.has(r)&&r<65535;)r+=1;return r}function U(e,t,r){let o=e!==void 0&&e.source===void 0,n=$e(t.kit,t.runtime),i=e?.ports||[],c=t.ports||[],l=Ce(t.kit),m=t.source==="adopted-local"&&e?.source!==void 0,d=t.source!==void 0&&e?.source!==void 0,p=(l&&c.length===0?[]:m?c.length>0?c:n?[{name:"http",port:B(n,r),protocol:"http"}]:[]:i.length>0?i:c.length>0?c:n?[{name:"http",port:B(n,r),protocol:"http"}]:[]).map(P=>({...P,port:B(P.port,r)}));for(let P of p)r.add(P.port);let g={...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:Ge([...e?.contracts?.env??[],...t.contracts.env??[]])}},h=JSON.stringify(e||null)!==JSON.stringify(g);return {project:g,changed:h}}async function Ee(e){let t=f__default.resolve(e.workspacePath),r=await Ie(t),o=await De(t),n=await I(t),i$1=new Map(n.map(s=>[f__default.resolve(s.path),s])),c=[];for(let s of n){let p=f__default.resolve(s.path),g=await T(u(p,"project.json"))??await T(u(p,"context.json"));!g||o.some(h=>f__default.resolve(h)===f__default.resolve(g))||c.push({projectJsonPath:g,registryEntry:s});}let l=[],m$1=[...o.map(s=>({projectJsonPath:s,registryEntry:i$1.get(f__default.resolve(f__default.dirname(f__default.dirname(s))))})),...c];for(let{projectJsonPath:s,registryEntry:p}of m$1){let g=f__default.dirname(f__default.dirname(s)),h=Pe(f__default.relative(t,g)),P=p!==void 0&&!z(h),C=fe(p?.name||f__default.basename(g),f__default.basename(g)),b=P?`external/${C}`:h||C,w=await k.readJson(s),a=typeof w.kit_name=="string"&&w.kit_name||typeof w.kit=="string"&&w.kit||void 0,E=j(w)?m(g,w):void 0,j$1=E!==void 0&&E.key!=="unknown",S=i({runtime:typeof w.runtime=="string"?w.runtime:void 0,framework:typeof w.framework=="string"?w.framework:void 0,kitName:a}),y=a$2(a),$=j$1?E.runtime:S.runtime!=="unknown"?S.runtime:y?.runtime,K=j$1?E.key:typeof w.framework=="string"&&w.framework||(S.key!=="unknown"?S.key:void 0)||y?.framework||Te(a),We=p?.relationship==="adopted"?"adopted":"imported",Se=j$1?`${We}.${E.key}`:a;l.push({slug:p?.name||b||f__default.basename(g),relativePath:b,source:p?.source??"workspace",relationship:p?.relationship,externalPath:P?g:void 0,runtime:$,framework:K,kit:Se,modules:ye(w.modules),ports:he(w).length>0?he(w):await Ne(g),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:Oe(w)}});}let d=new Map;for(let s of l){let p=fe(s.slug,s.relativePath),g=d.get(p);(!g||g.source!=="workspace"&&s.source==="workspace")&&d.set(p,s);}return {schemaVersion:G,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:r,projects:[...d.values()]}}async function Et(e){let t=f__default.resolve(e.outputPath||a$3(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 Ee({workspacePath:e.workspacePath,now:e.now}),o=new Set,n={...r,projects:r.projects.map(c=>U(void 0,c,o).project)},i=await be({workspacePath:e.workspacePath,contractPath:t,contract:n});if(e.strict&&i.status==="failed")throw new D(i);return await ve({workspacePath:e.workspacePath,contractPath:t,contract:n,now:e.now}),{contractPath:t,contract:n}}async function vt(e){let t=f__default.resolve(e.workspacePath),r=a$3(t,v),o=await g(t,v)??r,n=await Ee({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])),l=new Set,m=[],d=[],s=[];for(let h of n.projects){let P=c.get(h.slug),C=U(P,h,l);P?C.changed&&d.push(h.slug):m.push(h.slug),s.push(C.project),c.delete(h.slug);}for(let h of c.values()){if(h.source)continue;let P=U(h,h,l);s.push(P.project);}let p={schemaVersion:G,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...i?.workspace||{},...n.workspace,name:n.workspace.name||i?.workspace?.name||f__default.basename(t)},projects:s.sort((h,P)=>h.slug.localeCompare(P.slug))},g$1=await be({workspacePath:t,contractPath:r,contract:p});if(e.strict&&g$1.status==="failed")throw new D(g$1);return await ve({workspacePath:t,contractPath:r,contract:p,now:e.now}),{contractPath:r,contract:p,addedProjects:m,updatedProjects:d,verification:g$1}}async function ke(e){return await k.pathExists(e)?{exists:true,contents:await k.readFile(e)}:{exists:false}}async function we(e,t){if(!t.exists){await k.remove(e);return}await k.outputFile(e,t.contents);}async function ve(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:r}=await import('./workspace-registry-summary-ZNTXSUI4.js'),o=await t(e.workspacePath,{now:e.now,contract:e.contract}),n=a$3(e.workspacePath,r),i=c=>{if(!c||typeof c!="object"||Array.isArray(c))return JSON.stringify(c);let{generatedAt:l,...m}=c;return JSON.stringify(m)};if(await k.pathExists(e.contractPath)&&await k.pathExists(n)){let[c,l]=await Promise.all([k.readJson(e.contractPath),k.readJson(n)]);if(i(c)===i(e.contract)&&i(l)===i(o))return}b(v,e.contract),b(r,o),await f$1(e.workspacePath,v,async()=>{let[c,l]=await Promise.all([ke(e.contractPath),ke(n)]);try{if(e.contractPath===a$3(e.workspacePath,v)?await h(e.workspacePath,v,e.contract):(await k.ensureDir(f__default.dirname(e.contractPath)),await k.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await h(e.workspacePath,r,o);}catch(m){let s=(await Promise.allSettled([we(e.contractPath,c),we(n,l)])).filter(p=>p.status==="rejected");throw s.length>0?new AggregateError([m,...s.map(p=>p.reason)],"Workspace contract publication failed and rollback was incomplete."):m}});}async function je(e){let t=e.contractPath??(await g(e.workspacePath,v)||a$3(e.workspacePath,v)),r=await k.readJson(t);return {contractPath:t,contract:r}}var Ke={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 Ve(e,t){return d(e,t.relativePath,{...t.externalPath?{absolutePath:t.externalPath}:{}})}async function Me(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[r,o]of Object.entries(Ke))for(let n of o)await k.pathExists(f__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 _(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,r)=>t.localeCompare(r))}async function Fe(e){try{let t=await k.readJson(f__default.join(e,"package.json")),r={runtime:_(t.dependencies),development:_(t.devDependencies),peer:_(t.peerDependencies),optional:_(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:_(t.scripts),dependencies:r,dependencyCount:new Set(Object.values(r).flat()).size}}catch{return}}async function Le(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await k.readFile(f__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 He(e,t){try{let r=D$1(e);if(r.engine!=="unknown")return r;let o=k.pathExistsSync(f__default.join(e,"package.json"))?"npm":k.pathExistsSync(f__default.join(e,"pyproject.toml"))?"python":k.pathExistsSync(f__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 Je(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 jt(e){let{contractPath:t,contract:r}=await je(e),o=e.now??new Date,n=o.toISOString(),{buildWorkspaceModel:i,workspaceModelProjectTopology:c}=await import('./workspace-model-72SJ6WXT.js'),{hashWorkspaceModel:l}=await import('./workspace-model-hash-ZXYPIGCW.js'),m=await i({workspacePath:e.workspacePath,includeEvidence:false,now:o}),d=c(m)??Je(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-EFC4TUDZ.js'),g=await p$1({workspacePath:e.workspacePath,workspace:{name:m.workspace.name,...m.workspace.profile?{profile:m.workspace.profile}:{}},contract:r,projectTopology:d,now:o,projects:m.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:l(m)}}),h=await Promise.all(r.projects.map(async a=>{let u=Ve(e.workspacePath,a),[E,j,S]=await Promise.all([Me(u),Fe(u),Le(u)]),y=He(u,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,...S])].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)}:{}}})),P=new Set(h.map(a=>a.id)),C=new Map,b=[];for(let a of r.projects){for(let u of a.contracts.dependsOn||[])P.has(u)&&b.push({from:u,to:a.slug,type:"dependency",label:"dependsOn"});for(let u of a.contracts.publishes||[])C.has(u)||C.set(u,new Set),C.get(u)?.add(a.slug);}for(let a of r.projects)for(let u of a.contracts.consumes||[]){let E=C.get(u);if(E)for(let j of E)j!==a.slug&&b.push({from:j,to:a.slug,type:"event",label:u});}let w={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:r.workspace,generatedAt:n,nodes:h.sort((a,u)=>a.id.localeCompare(u.id)),edges:b.sort((a,u)=>`${a.from}:${a.to}:${a.type}:${a.label}`.localeCompare(`${u.from}:${u.to}:${u.type}:${u.label}`)),dependencyGraph:d,knowledgeGraph:g,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,u)=>a+u.ports.length,0),apiCount:h.reduce((a,u)=>a+u.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,u)=>a+u.files.manifests.length,0),entrypointCount:h.reduce((a,u)=>a+u.files.entrypoints.length,0),diagnostics:d.diagnostics?.length??0,relationshipKinds:Object.fromEntries(me.map(a=>[a,d.edges.filter(u=>u.kind===a).length])),relationshipSources:Object.fromEntries(ge.map(a=>[a,d.edges.filter(u=>u.source===a).length])),entityCount:g.quality.entityCount,knowledgeRelations:g.quality.relationCount,proofCount:g.quality.proofCount,providerCount:g.providers.length,knowledgeUnknowns:g.quality.unknownCount}};return {contractPath:t,graph:w}}async function be(e){let t=e.contract?{contractPath:e.contractPath??a$3(e.workspacePath,v),contract:e.contract}:await je(e),{contractPath:r,contract:o}=t,n=[],i=[];o.kind!=="rapidkit.workspace.contract"&&n.push("Contract kind must be rapidkit.workspace.contract."),o.schemaVersion!==G&&n.push(`Contract schemaVersion must be ${G}.`),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,l$1=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.`),f__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 g=l$1.get(p.port);g&&n.push(`Port ${p.port} is claimed by both ${g} and ${s.slug}.`),l$1.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===G?"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 m=await l(e.workspacePath);if(m.moduleCount>0){for(let s of m.issues)n.push(`${f__default.basename(s.projectRoot)}: ${s.message} (slug=${s.slug})`);i.push({id:"module-paths",status:m.status,message:m.status==="passed"?`All ${m.moduleCount} registered module(s) resolve under canonical paths.`:`${m.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 bt(e){let t=f__default.resolve(e.workspacePath),r={schemaVersion:_e,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 h(t,xe,de(r))}
|
|
2
|
-
export{I as a,Xe as b,et as c,de as d,ot as e,me as f,v as g,xe as h,G as i,_e as j,D as k,De as l,Ee as m,Et as n,vt as o,je as p,jt as q,be as r,bt as s};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{a as readWorkspaceKnowledgeGraphSnapshot}from'./chunk-AGI46TSQ.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{a as resolveWorkspaceRunStageTimeoutMs,b as runWorkspaceStage}from'./chunk-QVFIR64T.js';export{a as WORKSPACE_RUN_LAST_REPORT_FILENAME}from'./chunk-P5LI5DL3.js';
|