@vibecontrols/agent 2026.602.5 → 2026.602.6

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.
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{n as a}from"./index-hwtd3ank.js";import"./index-5wpck4aw.js";import"./index-btt96dhd.js";import"./index-6jzsthh9.js";import"./index-cjbfremy.js";import"./index-rw9x93zb.js";import"./index-pk3ejfc4.js";import"./index-dxtnaa3g.js";import"./index-4wgjx8bf.js";import"./index-kmkhjf1c.js";import"./index-0ckffygp.js";import"./index-rc79x8fw.js";import"./index-ydc0tk17.js";import"./index-52cp759f.js";import"./index-hvjqgb97.js";import"./index-rqq0k5fc.js";import"./index-5dysvvjv.js";import"./index-pgew6sge.js";import"./index-b6x6a4xp.js";import"./index-h74va4wd.js";import"./index-js1xn4sq.js";import"./index-a4854mwz.js";import"./index-4qq083yd.js";import"./index-c7554sg7.js";export{a as createApp};
2
+ import{n as a}from"./index-wq0z4sft.js";import"./index-5wpck4aw.js";import"./index-190q0sxy.js";import"./index-6jzsthh9.js";import"./index-rvwb9g8g.js";import"./index-rw9x93zb.js";import"./index-vaxcmbdg.js";import"./index-hw61pg70.js";import"./index-4wgjx8bf.js";import"./index-9006n9tq.js";import"./index-0ckffygp.js";import"./index-rc79x8fw.js";import"./index-ydc0tk17.js";import"./index-52cp759f.js";import"./index-hvjqgb97.js";import"./index-rqq0k5fc.js";import"./index-5dysvvjv.js";import"./index-pgew6sge.js";import"./index-b6x6a4xp.js";import"./index-h74va4wd.js";import"./index-js1xn4sq.js";import"./index-a4854mwz.js";import"./index-4qq083yd.js";import"./index-c7554sg7.js";export{a as createApp};
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{H as O}from"./index-mxc61yr1.js";import{I as Q,J as w}from"./index-9430ndf7.js";import"./index-d1xjj001.js";import"./index-b5dhmybd.js";import"./index-e1bw1bwr.js";import"./index-cjbfremy.js";import"./index-rw9x93zb.js";import"./index-pk3ejfc4.js";import{wa as Z,za as I}from"./index-dxtnaa3g.js";import{Aa as G,Ba as H}from"./index-4wgjx8bf.js";import{Wa as J}from"./index-kmkhjf1c.js";import{Xa as U}from"./index-0ckffygp.js";import"./index-rc79x8fw.js";import{bb as K}from"./index-ydc0tk17.js";import"./index-52cp759f.js";import"./index-rqq0k5fc.js";import"./index-5dysvvjv.js";import"./index-pgew6sge.js";import{dc as $}from"./index-8sdrhr3q.js";import"./index-8nqp3a4d.js";import{nc as E}from"./index-1mppacnx.js";import"./index-thammzct.js";import"./index-b6x6a4xp.js";import"./index-h74va4wd.js";import{Od as Y}from"./index-js1xn4sq.js";import{$d as W,de as X}from"./index-a4854mwz.js";import"./index-4qq083yd.js";import"./index-c7554sg7.js";import{join as B}from"path";if(typeof Bun>"u")console.error(`\x1B[31mError:\x1B[0m VibeControls Agent requires the Bun runtime.
3
+ import{H as O}from"./index-mxc61yr1.js";import{I as Q,J as w}from"./index-jc83tg1e.js";import"./index-d1xjj001.js";import"./index-b5dhmybd.js";import"./index-e1bw1bwr.js";import"./index-rvwb9g8g.js";import"./index-rw9x93zb.js";import"./index-vaxcmbdg.js";import{wa as Z,za as I}from"./index-hw61pg70.js";import{Aa as G,Ba as H}from"./index-4wgjx8bf.js";import{Wa as J}from"./index-9006n9tq.js";import{Xa as U}from"./index-0ckffygp.js";import"./index-rc79x8fw.js";import{bb as K}from"./index-ydc0tk17.js";import"./index-52cp759f.js";import"./index-rqq0k5fc.js";import"./index-5dysvvjv.js";import"./index-pgew6sge.js";import{dc as $}from"./index-8sdrhr3q.js";import"./index-8nqp3a4d.js";import{nc as E}from"./index-1mppacnx.js";import"./index-thammzct.js";import"./index-b6x6a4xp.js";import"./index-h74va4wd.js";import{Od as Y}from"./index-js1xn4sq.js";import{$d as W,de as X}from"./index-a4854mwz.js";import"./index-4qq083yd.js";import"./index-c7554sg7.js";import{join as B}from"path";if(typeof Bun>"u")console.error(`\x1B[31mError:\x1B[0m VibeControls Agent requires the Bun runtime.
4
4
  Install Bun: https://bun.sh
5
5
  Then run: bun run vibe ...`),process.exit(1);var T=process.argv.slice(2),_=T.includes("--plain")||T.includes("--json")||process.env.NO_COLOR==="1"||!process.stdout.isTTY;E(!_);try{O()}catch{}var N="1.0.0";try{let q=B(import.meta.dir,"..","package.json");N=(await Bun.file(q).json()).version}catch{}var x=new $;x.name("vibe").description("VibeControls Agent CLI \u2014 Remote development environment management").version(N,"-v, --version").option("--provider <name>","Override the default provider for tunnel/session operations").option("-p, --profile <name>","Target a specific profile (one-off; doesn't change the persisted default). See `vibe profile`.").option("--json","Emit machine-readable JSON instead of human output.").option("--plain","Force plain-text output (no interactive UI).").hook("preAction",(q,z)=>{let F=q.opts().profile;if(F)process.env.VIBECONTROLS_PROFILE=F;try{K.init(),K.emit("command.executed",{command_name:z.name()})}catch{}});w(x);async function M(){let q=new J;try{await q.loadCorePlugins()}catch{}try{await q.loadAll()}catch{}let z=new Z,F={storage:{async get(){return null},async set(){},async delete(){return!1},async list(){return[]},async deleteAll(){return 0}},logger:Y().logger,serviceRegistry:z,getProvider:(L)=>z.getProvider(L),getAgentBaseUrl:()=>process.env.AGENT_URL||"http://localhost:3005",getAgentVersion:()=>N,broadcast:()=>{},workspaceQuery:async()=>({data:void 0,errors:[{message:"workspaceQuery is not available in CLI mode"}]}),isGatewayConfigured:()=>!1,getAgentRecordId:async()=>null,getWorkspaceId:async()=>null,getConfig:async()=>{return},getPluginRegistry:()=>X(),getDataDir:()=>W(),cliContributors:new G,telemetry:{emit:(L,D)=>{try{K.emit(L,D??{})}catch{}}},os:U(),iframeBridge:I()};H(F.cliContributors);try{await q.dispatchCliSetup(x,F)}catch{}x.configureHelp({formatHelp:()=>Q(x,!0)}),await x.parseAsync()}M().then(()=>{process.exit(process.exitCode??0)}).catch((q)=>{console.error(`\x1B[31mFatal:\x1B[0m ${q instanceof Error?q.message:q}`),process.exit(1)});
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{wa as qa,za as Fa}from"./index-dxtnaa3g.js";import{Aa as Ka}from"./index-4wgjx8bf.js";import{Da as ka,Wa as Ua}from"./index-kmkhjf1c.js";import{Xa as Pa}from"./index-0ckffygp.js";import{nb as ja}from"./index-hvjqgb97.js";import{Jb as Ma}from"./index-rqq0k5fc.js";import{qd as ba,sd as yt}from"./index-h74va4wd.js";import{Ad as Gt,Cd as os,Ed as Ra,Id as v,Md as Ta,Od as g,Pd as Oa}from"./index-js1xn4sq.js";import{Zd as Xt,ce as Ia}from"./index-a4854mwz.js";import{ie as Ae}from"./index-c7554sg7.js";var Qt=[0,5000,15000,30000,60000],za=2000,Ba=5000,Xa=120000,cs=10,Ha=1048576;class Zt extends Error{resetAt;resource;constructor(e,t,i){super(e);this.name="RateLimitError",this.resource=t,this.resetAt=i}}function ei(e,t){if(!e?.length)return null;let i=e.find((r)=>r.extensions?.code==="RATE_LIMITED");if(!i)return null;let s=i.extensions?.resetAt,n=null;if(s){let r=new Date(s);if(!Number.isNaN(r.getTime()))n=r}return new Zt(`${t} rate limited${n?` until ${n.toISOString()}`:""}`,t,n)}function Va(e){if(!e.resetAt)return 60000;let t=e.resetAt.getTime()-Date.now()+za;return Math.min(Math.max(t,Ba),Xa)}async function Ja(e,t){let i=e.headers.get("content-length");if(i){let o=Number.parseInt(i,10);if(Number.isInteger(o)&&o>t)throw Error(`Gateway response is too large (${o} bytes)`)}if(!e.body)return"";let s=e.body.getReader(),n=[],r=0;try{while(!0){let{done:o,value:c}=await s.read();if(o)break;if(!c)continue;if(r+=c.byteLength,r>t)throw await s.cancel().catch(()=>{return}),Error(`Gateway response exceeds ${t} bytes`);n.push(c)}}finally{s.releaseLock()}let a=new Uint8Array(r),l=0;for(let o of n)a.set(o,l),l+=o.byteLength;return new TextDecoder().decode(a)}async function ti(e,t){let i=await Ja(e,Ha),s;try{s=i?JSON.parse(i):{}}catch(n){let r=i.slice(0,240).replace(/\s+/g," ");throw Error(`${t} returned non-JSON response (${e.status} ${e.statusText})${r?`: ${r}`:""}`,{cause:n})}if(!e.ok){let n=i.slice(0,240).replace(/\s+/g," ");throw Error(`${t} failed (${e.status} ${e.statusText})${n?`: ${n}`:""}`)}return s}function ii(e){return e.endsWith("/graphql")?e:`${e}/graphql`}function Ya(e){let t;try{t=new URL(e).hostname.toLowerCase().replace(/^\[|\]$/g,"")}catch{return!1}if(t==="localhost"||t==="127.0.0.1"||t==="::1"||t==="0.0.0.0"||t==="host.docker.internal")return!0;return t.endsWith(".localhost")||t.endsWith(".local")||t.endsWith(".local.burdenoff.com")}function si(e){if(!(process.env.VIBE_DEV_INSECURE_TLS==="1"||process.env.NODE_TLS_REJECT_UNAUTHORIZED==="0")&&!Ya(e))return{};return{tls:{rejectUnauthorized:!1}}}async function Wa(e,t,i){let s=await fetch(ii(e),{method:"POST",...si(e),headers:{"Content-Type":"application/json"},body:JSON.stringify({query:`mutation AuthenticateApp($input: AuthenticateAppInput!) {
2
+ import{wa as qa,za as Fa}from"./index-hw61pg70.js";import{Aa as Ka}from"./index-4wgjx8bf.js";import{Da as ka,Wa as Ua}from"./index-9006n9tq.js";import{Xa as Pa}from"./index-0ckffygp.js";import{nb as ja}from"./index-hvjqgb97.js";import{Jb as Ma}from"./index-rqq0k5fc.js";import{qd as ba,sd as yt}from"./index-h74va4wd.js";import{Ad as Gt,Cd as os,Ed as Ra,Id as v,Md as Ta,Od as g,Pd as Oa}from"./index-js1xn4sq.js";import{Zd as Xt,ce as Ia}from"./index-a4854mwz.js";import{ie as Ae}from"./index-c7554sg7.js";var Qt=[0,5000,15000,30000,60000],za=2000,Ba=5000,Xa=120000,cs=10,Ha=1048576;class Zt extends Error{resetAt;resource;constructor(e,t,i){super(e);this.name="RateLimitError",this.resource=t,this.resetAt=i}}function ei(e,t){if(!e?.length)return null;let i=e.find((r)=>r.extensions?.code==="RATE_LIMITED");if(!i)return null;let s=i.extensions?.resetAt,n=null;if(s){let r=new Date(s);if(!Number.isNaN(r.getTime()))n=r}return new Zt(`${t} rate limited${n?` until ${n.toISOString()}`:""}`,t,n)}function Va(e){if(!e.resetAt)return 60000;let t=e.resetAt.getTime()-Date.now()+za;return Math.min(Math.max(t,Ba),Xa)}async function Ja(e,t){let i=e.headers.get("content-length");if(i){let o=Number.parseInt(i,10);if(Number.isInteger(o)&&o>t)throw Error(`Gateway response is too large (${o} bytes)`)}if(!e.body)return"";let s=e.body.getReader(),n=[],r=0;try{while(!0){let{done:o,value:c}=await s.read();if(o)break;if(!c)continue;if(r+=c.byteLength,r>t)throw await s.cancel().catch(()=>{return}),Error(`Gateway response exceeds ${t} bytes`);n.push(c)}}finally{s.releaseLock()}let a=new Uint8Array(r),l=0;for(let o of n)a.set(o,l),l+=o.byteLength;return new TextDecoder().decode(a)}async function ti(e,t){let i=await Ja(e,Ha),s;try{s=i?JSON.parse(i):{}}catch(n){let r=i.slice(0,240).replace(/\s+/g," ");throw Error(`${t} returned non-JSON response (${e.status} ${e.statusText})${r?`: ${r}`:""}`,{cause:n})}if(!e.ok){let n=i.slice(0,240).replace(/\s+/g," ");throw Error(`${t} failed (${e.status} ${e.statusText})${n?`: ${n}`:""}`)}return s}function ii(e){return e.endsWith("/graphql")?e:`${e}/graphql`}function Ya(e){let t;try{t=new URL(e).hostname.toLowerCase().replace(/^\[|\]$/g,"")}catch{return!1}if(t==="localhost"||t==="127.0.0.1"||t==="::1"||t==="0.0.0.0"||t==="host.docker.internal")return!0;return t.endsWith(".localhost")||t.endsWith(".local")||t.endsWith(".local.burdenoff.com")}function si(e){if(!(process.env.VIBE_DEV_INSECURE_TLS==="1"||process.env.NODE_TLS_REJECT_UNAUTHORIZED==="0")&&!Ya(e))return{};return{tls:{rejectUnauthorized:!1}}}async function Wa(e,t,i){let s=await fetch(ii(e),{method:"POST",...si(e),headers:{"Content-Type":"application/json"},body:JSON.stringify({query:`mutation AuthenticateApp($input: AuthenticateAppInput!) {
3
3
  authenticateApp(input: $input) { accessToken expiresIn }
4
4
  }`,variables:{input:{clientId:t,clientSecret:i,scopes:[]}}}),signal:AbortSignal.timeout(15000)}),n=await ti(s,"authenticateApp"),r=ei(n.errors,"authenticateApp");if(r)throw r;if(n.errors?.length){let l=n.errors.map((o)=>o.extensions?.code??"UNKNOWN").join(",");throw Error(`authenticateApp errors [${l}]: ${n.errors.map((o)=>o.message).join("; ")}`)}let a=n.data?.authenticateApp?.accessToken;if(!a)throw Error("authenticateApp returned no token");return a}async function Qa(e,t,i,s){let n=await fetch(ii(e),{method:"POST",...si(e),headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({query:`mutation IssueAgentWorkspaceToken($input: IssueWorkspaceTokenInput!) {
5
5
  issueWorkspaceToken(input: $input) {
@@ -1,5 +1,5 @@
1
1
  // @bun
2
2
  import{Xa as QQ}from"./index-0ckffygp.js";import{Bd as ZQ,Md as k,Od as Y}from"./index-js1xn4sq.js";import{$d as b,de as d}from"./index-a4854mwz.js";import{ie as w}from"./index-c7554sg7.js";import{existsSync as U,mkdirSync as n,readdirSync as GQ,readFileSync as v,renameSync as _Q,realpathSync as t,rmSync as j,statSync as RQ,writeFileSync as g}from"fs";import{homedir as xQ}from"os";import{dirname as R,isAbsolute as EQ,join as V,relative as IQ,sep as r}from"path";import{fileURLToPath as P}from"url";import{existsSync as XQ,readFileSync as qQ}from"fs";import{dirname as A,join as BQ}from"path";import{fileURLToPath as YQ}from"url";var WQ="@vibecontrols/agent",_;function N(){if(_)return _;try{let Q=A(YQ(import.meta.url));for(let Z=0;Z<10&&Q&&Q!==A(Q);Z++){let $=BQ(Q,"package.json");if(XQ($))try{let z=JSON.parse(qQ($,"utf8"));if(z.name===WQ&&typeof z.version==="string")return _=z.version,_}catch{}Q=A(Q)}}catch{}return _??"0.0.0"}function u(){let Q=process.env.VIBECONTROLS_PLUGIN_CONTRACT_V2_ENFORCE;return Q==="1"||Q==="true"||Q==="on"}var m={storage:"rw",secrets:"rw",gateway:!0,broadcast:!0,subprocess:!0,audit:!0,telemetry:!0,singletonOnly:!1,requiresIsolation:!1},c={storage:"none",secrets:"none",gateway:!1,broadcast:!1,subprocess:!1,audit:!1,telemetry:!1,singletonOnly:!1,requiresIsolation:!1};function s(){let Q=process.env.VIBECONTROLS_STRICT_PLUGIN_CAPS;return Q==="1"||Q==="true"||Q==="on"}function o(Q,Z,$,z,H=!1){return new Proxy(Q,{get(q,X,B){if(X==="plugins"){if(!H)return;return Reflect.get(q,X,B)}if(X==="storage")return JQ(q.storage,$.storage??"none",Z,z);if(X==="broadcast"&&!$.broadcast)return E(Z,"broadcast",z);if(X==="workspaceQuery"&&!$.gateway)return E(Z,"workspaceQuery",z);if(X==="getAgentRecordId"&&!$.gateway)return E(Z,"getAgentRecordId",z);if(X==="getWorkspaceId"&&!$.gateway)return E(Z,"getWorkspaceId",z);if(X==="telemetry"){if(!$.telemetry)return;return Reflect.get(q,X,B)}return Reflect.get(q,X,B)}})}function JQ(Q,Z,$,z){if(Z==="rw")return Q;return new Proxy(Q,{get(H,q,X){let B=String(q),J=B==="set"||B==="delete"||B==="deleteAll";if(Z==="none"||Z==="read"&&J)return(...M)=>{throw z("plugin.capability.denied",{pluginName:$,surface:"storage",op:B,mode:Z}),Error(`plugin '${$}' lacks storage:${J?"rw":"read"} capability (op=${B})`)};return Reflect.get(H,q,X)}})}function E(Q,Z,$){return(...z)=>{throw $("plugin.capability.denied",{pluginName:Q,op:Z}),Error(`plugin '${Q}' lacks capability for ${Z}`)}}import{Worker as KQ}from"worker_threads";import{fileURLToPath as MQ}from"url";import{randomUUID as VQ}from"crypto";function OQ(){let Q=MQ(import.meta.url),Z=Q.lastIndexOf("/"),$=Z>=0?Q.slice(0,Z):Q,z=`${$}/plugin-worker-runtime.ts`,H=`${$}/plugin-worker-runtime.js`;if(Q.endsWith(".ts"))return z;return H}class L{worker;pending=new Map;spec;initPromise;terminated=!1;constructor(Q){this.spec=Q}async start(){if(this.initPromise)return this.initPromise;return this.initPromise=this.spawn(),this.initPromise}async spawn(){let Q=this.spec.runtimeEntry??OQ(),Z=["PATH","HOME","USERPROFILE","TMPDIR","TMP","TEMP","LANG","LC_ALL","LC_CTYPE","TZ","SystemRoot","SystemDrive","ComSpec","PATHEXT","windir"],$={};for(let H of Z){let q=process.env[H];if(typeof q==="string")$[H]=q}let z=new KQ(Q,{env:$});this.worker=z,z.on("message",(H)=>this.onMessage(H)),z.on("error",(H)=>this.onWorkerError(H instanceof Error?H:Error(String(H)))),z.on("exit",(H)=>this.onWorkerExit(H)),await this.call("init",{modulePath:this.spec.modulePath,ctxStub:{name:this.spec.ctx.name,dataDir:this.spec.ctx.dataDir}})}async dispatch(Q,Z=[]){if(this.terminated)throw Error("PluginWorkerHost terminated");if(!this.worker)await this.start();return this.call("dispatch",{method:Q,params:Z})}call(Q,Z){if(!this.worker)return Promise.reject(Error("worker not spawned"));let $=VQ();return new Promise((z,H)=>{this.pending.set($,{resolve:z,reject:H});try{this.worker?.postMessage({id:$,op:Q,args:Z})}catch(q){this.pending.delete($),H(q instanceof Error?q:Error(String(q)))}})}onMessage(Q){let Z=this.pending.get(Q.id);if(!Z)return;if(this.pending.delete(Q.id),Q.ok)Z.resolve(Q.result);else{let $=Error(Q.error?.message??"worker error");if(Q.error?.stack)$.stack=Q.error.stack;Z.reject($)}}onWorkerError(Q){for(let[,Z]of this.pending)Z.reject(Q);this.pending.clear()}onWorkerExit(Q){if(this.pending.size>0){let Z=Error(`worker exited (code=${Q}) with pending calls`);for(let[,$]of this.pending)$.reject(Z);this.pending.clear()}this.terminated=!0}async terminate(){if(this.terminated=!0,!this.worker)return;try{await this.worker.terminate()}catch{}this.worker=void 0}}var FQ=[{packageName:"@vibecontrols/vibe-plugin-storage",pluginName:"storage",label:"Storage facade",description:"Storage provider registry \u2014 owns AgentDatabase contract. Bundled with the agent; the storage meta lazy-loads the configured provider by name.",category:"storage",trusted:!0,isCore:!0,isDefault:!0,isCritical:!0,removable:!1,integrity:"sha512-E0agrBuSwO7R5z7dBA6Jb0Mq5zibhkFzvEh0lcb4N+byt25yStrDcsJqJ3bJpVdavw/OkAjB+MAC06zkTtHraQ=="},...["agent","task","config","git","plugin-mgr","log"].map((Q)=>({packageName:`@vibecontrols/vibe-plugin-${Q}`,pluginName:Q,label:`${Q} (built-in)`,description:`Built-in ${Q} plugin bundled with the agent.`,category:"core",trusted:!0,isCore:!0,removable:!1}))],CQ=[{packageName:"@vibecontrols/vibe-plugin-tunnel",pluginName:"tunnel",label:"Tunnel manager",description:"Owns TunnelProvider interface. Routes to a registered tunnel provider.",category:"tunnel",trusted:!0,isDefault:!0,isCritical:!0,cliCommand:"tunnel",apiPrefix:"/api/tunnel",integrity:"sha512-FFqJjvPNCAYZwMjOKt1vHiBuzd+6W9sYI6vZqls7kr3Za+m++tIueT9OV2DlpAJT8XU+fidrgsWgQi8AcjPHWQ=="},{packageName:"@vibecontrols/vibe-plugin-session-manager",pluginName:"session-manager",label:"Session manager",description:"Owns SessionProvider interface. Routes to a registered session backend.",category:"session",trusted:!0,isCore:!0,isDefault:!0,isCritical:!0,cliCommand:"session",apiPrefix:"/api/sessions",integrity:"sha512-qrbwqL+LsCihI5BR6HqFJiqI19htgfiv6w75wn1gwpEuFvggoElwJ134xLPRKH1+AEKRsbpe63pqfexLPrQIBw=="},{packageName:"@vibecontrols/vibe-plugin-ai",pluginName:"ai",label:"AI orchestration",description:"Owns AIAgentProvider interface. Prompts, contexts, sessions, dispatch, logs.",category:"ai",trusted:!0,isDefault:!0,isCritical:!0,cliCommand:"ai",apiPrefix:"/api/ai",integrity:"sha512-mIkzkzMDU38ILFa2lRsjeaJqAidtlUBWoQ3KaFxkpG88AHWUtcA6Vha/wZQ5Ns16h0g4vRKxtbOLfFSTEgRerA=="},{packageName:"@vibecontrols/vibe-plugin-plan",pluginName:"plan",label:"Plan orchestration",description:"Owns PlanProvider interface. Routes plan sessions to a registered provider.",category:"plan",trusted:!0,isDefault:!1,cliCommand:"plan",apiPrefix:"/api/plan",integrity:"sha512-SSCFLFkmAhHesLYgETeEyAZs2Gu8tDEaMMuJtMMKG5eKGQIXYJaJZnQBuXP/vKOAlLd//l8es5hPqhmiNSi4Gw=="},{packageName:"@vibecontrols/vibe-plugin-gitops",pluginName:"gitops",label:"GitOps orchestrator",description:"Owns GitOpsProvider interface. Routes repo / PR / CI / security queries to a registered provider.",category:"gitops",trusted:!0,isDefault:!1,cliCommand:"gitops",apiPrefix:"/api/gitops",integrity:"sha512-KzoSmBDgQ5mbSFxAuIyIBnC/HKwYhtXluGp06DvzQmwqOQ4vEC72PuSiVx3doWrt+Z6fZ6i6gxNzmYNpdhPLXA=="},{packageName:"@vibecontrols/vibe-plugin-security",pluginName:"security",label:"Security lifecycle",description:"Security lifecycle orchestrator \u2014 owns /api/security and dispatches to per-stage providers.",category:"security",trusted:!0,isDefault:!1,cliCommand:"security",apiPrefix:"/api/security",integrity:"sha512-K6w3tC7qnCotvnNWWdmHnjqGgCNJoPNMs8gCwWFbcNI5MmbIrUQfFQdcjwGudwryvN2+TrX12MhfhWz4p1qcMA=="}],UQ=[{packageName:"@vibecontrols/vibe-plugin-tool-code-server",pluginName:"code-server",label:"Browser code editor",description:"Browser-based VS Code via code-server \u2014 open any Vibe in an in-browser editor.",category:"tool",trusted:!0,isDefault:!1,cliCommand:"code-server",apiPrefix:"/api/code-server"}],wQ=[{packageName:"@vibecontrols/vibe-plugin-agent-backup",pluginName:"agent-backup",label:"Agent backup",description:"Backup and restore agent state.",category:"agent",trusted:!0,isDefault:!0,integrity:"sha512-KhN2Vaahtnl4IKRbaHKtlEbsuvW9dbgC2l4kkIXcme55DaSmLy5kYkiysnwyZdC4PRQu4NKM4GQLoW9hD86dRw=="}],O=[...FQ,...CQ,...UQ,...wQ],jQ=[{key:"storage",label:"Storage",description:"Encrypted local state for the agent.",categories:["storage"],mandatory:!0,defaultSelected:!0},{key:"tunnel",label:"Tunnels",description:"Expose the agent for remote access + share links.",categories:["tunnel"],mandatory:!0,defaultSelected:!0},{key:"backup",label:"Backup",description:"Backup + restore agent state.",categories:["agent"],mandatory:!0,defaultSelected:!0},{key:"session",label:"Terminal sessions",description:"Long-lived terminal / AI agent sessions.",categories:["session"],mandatory:!1,defaultSelected:!0},{key:"editor",label:"Browser code editor",description:"Open any Vibe in an in-browser VS Code editor (code-server).",categories:["tool"],mandatory:!1,defaultSelected:!0},{key:"ai",label:"AI orchestration",description:"AI agent harnesses, prompts + dispatch.",categories:["ai"],mandatory:!1,defaultSelected:!0},{key:"plan",label:"Plan review",description:"Review / approve AI-proposed plans.",categories:["plan"],mandatory:!1,defaultSelected:!1},{key:"gitops",label:"GitOps",description:"Repo / PR / CI / security integration.",categories:["gitops"],mandatory:!1,defaultSelected:!1},{key:"security",label:"Security",description:"Security scanning lifecycle.",categories:["security"],mandatory:!1,defaultSelected:!1}],D=O.filter((Q)=>Q.isCore&&Q.category==="core").map((Q)=>Q.pluginName),f=O.filter((Q)=>Q.isDefault===!0);function S(Q){return f}function h(Q,Z){let $=Z instanceof Set?Z:new Set(Z),z=new Set;for(let H of jQ)if(H.mandatory||$.has(H.key))for(let q of H.categories)z.add(q);return O.filter((H)=>z.has(H.category))}var l=new Set(O.filter((Q)=>Q.trusted).map((Q)=>Q.packageName));function TQ(){let Q=O.filter(($)=>$.isCritical).flatMap(($)=>[$.packageName,$.pluginName]),Z=process.env.VIBECONTROLS_CRITICAL_PLUGINS;if(Z){let $=Z.split(",").map((z)=>z.trim()).filter(Boolean);return new Set([...Q,...$])}return new Set(Q)}function rQ(Q){return TQ().has(Q)}var pQ=O.filter((Q)=>!Q.isCore||Q.category!=="core");function iQ(Q){return O.find((Z)=>Z.packageName===Q)}function aQ(Q){return new Set}function I(Q){return Q.startsWith("@vibecontrols/vibe-plugin-")||l.has(Q)}function bQ(Q){let Z=Q.trim();if(!Z)return;if(Z.startsWith("@vibecontrols/"))return O.find((z)=>z.packageName===Z);if(Z.startsWith("vibe-plugin-"))return O.find((z)=>z.packageName===`@vibecontrols/${Z}`);let $=O.find((z)=>z.pluginName===Z);if($)return $;return O.find((z)=>z.packageName===`@vibecontrols/vibe-plugin-${Z}`)}function eQ(Q){let Z=Q.trim();if(!Z)return;let $=bQ(Z);if($)return $.packageName;if(Z.startsWith("@vibecontrols/"))return Z;if(Z.startsWith("vibe-plugin-"))return`@vibecontrols/${Z}`;return`@vibecontrols/vibe-plugin-${Z}`}function p(Q){return O.find((Z)=>Z.pluginName===Q)}function AQ(Q){return O.find((Z)=>Z.packageName===Q)}function LQ(Q,Z){if(Q.length!==Z.length)return!1;let $=0;for(let z=0;z<Q.length;z++)$|=Q.charCodeAt(z)^Z.charCodeAt(z);return $===0}async function DQ(Q,Z,$){let z=AQ(Q),H=process.env.VIBECONTROLS_REQUIRE_PLUGIN_INTEGRITY==="1";if(!z?.integrity){if(H)throw Error(`Refusing to install ${Q}: catalog has no pinned integrity and VIBECONTROLS_REQUIRE_PLUGIN_INTEGRITY=1`);return}let q=$,X;try{let J=`${Z.replace(/\/+$/,"")}/${Q.replace("/","%2F")}`,W=await fetch(J,{headers:{accept:"application/json"},signal:AbortSignal.timeout(20000)});if(!W.ok)throw Error(`registry packument fetch failed (HTTP ${W.status})`);let M=await W.json();if(q=q??M["dist-tags"]?.latest,!q)throw Error("could not resolve version from registry");if(X=M.versions?.[q]?.dist?.integrity,typeof X!=="string"||X.length===0)throw Error(`registry did not return dist.integrity for ${Q}@${q}`)}catch(B){let J=B instanceof Error?B.message:String(B);throw Error(`Pre-install integrity gate refused ${Q}: ${J}`,{cause:B})}if(!LQ(z.integrity,X)){let B=process.env.VIBECONTROLS_STRICT_PLUGIN_INTEGRITY==="1";if(I(Q)&&!B){Y().logger.warn("plugin-manager",`Integrity pin for ${Q} is stale \u2014 catalog expects ${z.integrity}, the allowlisted registry has ${X} for ${q}. Proceeding (first-party package, registry allowlisted). Re-pin plugins.config.ts to silence this.`);return}throw Error(`Pre-install integrity gate refused ${Q}: integrity mismatch for ${q}: expected ${z.integrity}, got ${X}`)}}var fQ=["https://registry.npmjs.org/","https://registry.npmjs.org"];function SQ(){let Q=process.env.VIBECONTROLS_REGISTRY_ALLOWLIST,Z=[...fQ];if(typeof Q==="string"&&Q.length>0)for(let $ of Q.split(",").map((z)=>z.trim()).filter(Boolean))Z.push($);return Z}function hQ(Q){let Z=SQ(),$;try{$=new URL(Q).origin}catch{throw Error(`Invalid plugin registry URL: ${Q}`)}for(let z of Z)try{if(new URL(z).origin===$)return}catch{}throw Error(`Plugin registry '${Q}' is not in the allow-list. Add it to VIBECONTROLS_REGISTRY_ALLOWLIST at daemon start.`)}var i="plugins.json",vQ=/^@vibecontrols\/vibe-plugin-[a-z0-9][a-z0-9-]{0,80}$/,a=/^[a-z0-9][a-z0-9-]{0,63}$/,PQ=/^\/api\/[A-Za-z0-9][A-Za-z0-9/_-]{0,127}$/,yQ=/^\/[A-Za-z0-9][A-Za-z0-9/_-]{0,159}$/,$Q=Symbol.for("vibecontrols.pluginPackageRoot");function VZ(Q){return Q[$Q]}function G(Q){let Z=Q.trim();if(!vQ.test(Z))throw Error("Plugin package must be a @vibecontrols/vibe-plugin-* package name.");if(!I(Z)&&process.env.VIBECONTROLS_ALLOW_UNTRUSTED_PLUGINS!=="1")throw Error("Plugin package is not in the trusted VibeControls catalog.");return Z}function dQ(Q,Z){let $=IQ(Q,Z);return $===""||!!$&&!$.startsWith("..")&&!EQ($)}function zQ(){return V(b(),"agent-plugins","node_modules")}function kQ(){try{let Q=zQ();return U(Q)&&GQ(Q).length>0}catch{return!1}}function y(){let Q=(process.env.VIBECONTROLS_PLUGIN_INSTALL_SCOPE??process.env.VIBECONTROLS_PLUGIN_INSTALL_MODE??"").toLowerCase();if(Q==="local")return"local";if(Q==="global")return"global";return kQ()?"local":"global"}var e="provider:default:";function NQ(Q){if(!Q||typeof Q!=="object")return!1;let Z=Q;return typeof Z.packageName==="string"&&typeof Z.version==="string"&&typeof Z.pluginName==="string"&&typeof Z.installedAt==="string"}var OZ=f;class HQ{registry=[];loaded=new Map;corePlugins=new Map;db;forcedIsolation=new Set;workerHosts=new Map;lifecycleChain=Promise.resolve();withLifecycleLock(Q){let $=this.lifecycleChain.then(Q,Q);return this.lifecycleChain=$.then(()=>{return},()=>{return}),$}async terminateWorkerHost(Q){let Z=this.workerHosts.get(Q);if(!Z)return;try{await Z.terminate()}catch($){Y().logger.warn("plugin-manager",`Failed to terminate worker for '${Q}': ${$ instanceof Error?$.message:String($)}`)}finally{this.workerHosts.delete(Q)}}async terminateAllWorkerHosts(){let Q=Array.from(this.workerHosts.keys());await Promise.all(Q.map((Z)=>this.terminateWorkerHost(Z)))}constructor(Q){this.db=Q,this.ensureDir(),this.loadRegistry();let Z=process.env.VIBE_ISOLATE_PLUGINS;if(typeof Z==="string"&&Z.length>0)this.setForcedIsolation(Z.split(",").map(($)=>$.trim()).filter(($)=>$.length>0))}setForcedIsolation(Q){this.forcedIsolation=new Set(Q.filter((Z)=>Z.length>0))}shouldIsolate(Q){if(this.forcedIsolation.has(Q.name))return!0;return Q.capabilities?.requiresIsolation===!0}getWorkerHost(Q){return this.workerHosts.get(Q)}registerWorkerHost(Q,Z){this.workerHosts.set(Q,Z)}auditSink=(Q,Z)=>{Y().logger.warn("plugin-capability",Q,Z)};static resolveEffectiveCapabilities(Q,Z){if(Q.capabilities)return Q.capabilities;return Z?m:c}wrapHostServices(Q,Z){let $=this.corePlugins.has(Q.name),z=HQ.resolveEffectiveCapabilities(Q,$),H=$||this.isTrustedLoadedPlugin(Q);return o(Z,Q.name,z,this.auditSink,H)}isTrustedLoadedPlugin(Q){for(let[Z,$]of this.loaded)if($===Q)return I(Z);return!1}acceptCapabilities(Q,Z){if(Q.capabilities?.singletonOnly===!0&&k.size()>1)return Y().logger.error("plugin-manager",`[plugin] '${Q.name}' refused to load: singletonOnly capability incompatible with multi-profile daemon (profiles=${k.size()}, source=${Z})`),!1;if(Q.capabilities)return!0;if(s())return Y().logger.error("plugin-manager",`[plugin] '${Q.name}' refused to load: missing required capabilities declaration (source=${Z})`),!1;if(Z.startsWith("core:"))Y().logger.warn("plugin-manager",`[plugin] '${Q.name}' loaded without a capabilities declaration \u2014 granting full trust (core plugin). Declare capabilities explicitly. (source=${Z})`);else Y().logger.warn("plugin-manager",`[plugin] '${Q.name}' loaded without a capabilities declaration \u2014 defaulting to EMPTY capability set (deny by default). External plugins MUST declare capabilities explicitly to access host services. (source=${Z})`);return!0}ensureDir(){let Q=b();if(!U(Q))n(Q,{recursive:!0})}loadRegistry(){let Q=V(b(),i);try{if(U(Q)){let Z=v(Q,"utf-8"),$=JSON.parse(Z);if(Array.isArray($)&&$.every(NQ))this.registry=$.filter((z)=>{try{return G(z.packageName),!0}catch(H){return Y().logger.warn("plugin-manager","Ignoring invalid plugin entry",{packageName:z.packageName,error:String(H)}),!1}});else throw Error("plugins.json has an invalid schema")}}catch(Z){Y().logger.warn("plugin-manager","Failed to load plugin registry",{path:Q,error:String(Z)}),this.registry=[]}}saveRegistry(){this.ensureDir();let Q=V(b(),i),Z=`${Q}.${process.pid}.tmp`;g(Z,`${JSON.stringify(this.registry,null,2)}
3
- `,{encoding:"utf-8",mode:384}),_Q(Z,Q)}async loadCorePlugins(){let Q=await Promise.allSettled([import("./index-h60rr9ca.js"),import("./index-0924jp9m.js"),import("./index-tgrt61qr.js"),import("./index-ebwwtwwc.js"),import("./index-ngrj0aqp.js"),import("./index-nrsqzcfc.js")]),Z=Y();for(let $=0;$<Q.length;$++){let z=Q[$],H=D[$];if(z.status==="fulfilled"){let q=z.value,X;try{X=this.extractPlugin(q,`core:${H}`,Z)}catch(B){Y().logger.error("plugin-manager",`Core plugin '${H}' refused to load: ${B instanceof Error?B.message:String(B)}`);continue}if(X?.name){if(!this.acceptCapabilities(X,`core:${H}`))continue;this.corePlugins.set(X.name,X),Y().logger.info("plugin-manager",`Core plugin loaded: ${X.name} v${X.version}`)}else Y().logger.warn("plugin-manager",`Core plugin '${H}' did not export a valid createPlugin(ctx) factory`)}else Y().logger.warn("plugin-manager",`Failed to load core plugin '${H}': ${z.reason}`)}Y().logger.info("plugin-manager",`Core plugins loaded: ${this.corePlugins.size}/${D.length}`)}async resolveConcreteLatest(Q,Z){try{let z=`${Z.replace(/\/+$/,"")}/${Q.replace("/","%2F")}`,H=await fetch(z,{headers:{accept:"application/json"},signal:AbortSignal.timeout(20000)});if(!H.ok)return;let X=(await H.json())["dist-tags"]?.latest;if(typeof X==="string"&&/^\d+\.\d+\.\d+/.test(X))return X}catch{}return}async install(Q,Z={}){return this.withLifecycleLock(()=>this.installLocked(Q,Z))}async installLocked(Q,Z={}){Q=G(Q);let $=Z.version?.trim()||void 0,z=Z.refreshLatest===!0||!!$;Y().logger.info("plugin-manager",`Installing ${Q}${z?"@latest (refresh)":""}...`);let H=d();if(hQ(H),await DQ(Q,H,void 0),!z)try{await import(Q),Y().logger.info("plugin-manager",`${Q} already resolvable \u2014 skipping global install`);let K=await this.importPlugin(Q),F={packageName:Q,version:K.version,pluginName:K.name,installedAt:new Date().toISOString()};return this.registry=this.registry.filter((T)=>T.packageName!==Q),this.registry.push(F),this.saveRegistry(),F}catch{}let q=d(),X=y(),B=$?$:z?await this.resolveConcreteLatest(Q,q):void 0,J=z?`${Q}@${B??"latest"}`:Q;try{if(X==="local"){let K=V(b(),"agent-plugins");if(!U(K))n(K,{recursive:!0});let F=V(K,"package.json");if(!U(F))g(F,JSON.stringify({name:"vibecontrols-agent-plugins",private:!0,version:"0.0.0",dependencies:{}},null,2)+`
3
+ `,{encoding:"utf-8",mode:384}),_Q(Z,Q)}async loadCorePlugins(){let Q=await Promise.allSettled([import("./index-f4da1dth.js"),import("./index-0924jp9m.js"),import("./index-tgrt61qr.js"),import("./index-ebwwtwwc.js"),import("./index-9hjnbg75.js"),import("./index-nrsqzcfc.js")]),Z=Y();for(let $=0;$<Q.length;$++){let z=Q[$],H=D[$];if(z.status==="fulfilled"){let q=z.value,X;try{X=this.extractPlugin(q,`core:${H}`,Z)}catch(B){Y().logger.error("plugin-manager",`Core plugin '${H}' refused to load: ${B instanceof Error?B.message:String(B)}`);continue}if(X?.name){if(!this.acceptCapabilities(X,`core:${H}`))continue;this.corePlugins.set(X.name,X),Y().logger.info("plugin-manager",`Core plugin loaded: ${X.name} v${X.version}`)}else Y().logger.warn("plugin-manager",`Core plugin '${H}' did not export a valid createPlugin(ctx) factory`)}else Y().logger.warn("plugin-manager",`Failed to load core plugin '${H}': ${z.reason}`)}Y().logger.info("plugin-manager",`Core plugins loaded: ${this.corePlugins.size}/${D.length}`)}async resolveConcreteLatest(Q,Z){try{let z=`${Z.replace(/\/+$/,"")}/${Q.replace("/","%2F")}`,H=await fetch(z,{headers:{accept:"application/json"},signal:AbortSignal.timeout(20000)});if(!H.ok)return;let X=(await H.json())["dist-tags"]?.latest;if(typeof X==="string"&&/^\d+\.\d+\.\d+/.test(X))return X}catch{}return}async install(Q,Z={}){return this.withLifecycleLock(()=>this.installLocked(Q,Z))}async installLocked(Q,Z={}){Q=G(Q);let $=Z.version?.trim()||void 0,z=Z.refreshLatest===!0||!!$;Y().logger.info("plugin-manager",`Installing ${Q}${z?"@latest (refresh)":""}...`);let H=d();if(hQ(H),await DQ(Q,H,void 0),!z)try{await import(Q),Y().logger.info("plugin-manager",`${Q} already resolvable \u2014 skipping global install`);let K=await this.importPlugin(Q),F={packageName:Q,version:K.version,pluginName:K.name,installedAt:new Date().toISOString()};return this.registry=this.registry.filter((T)=>T.packageName!==Q),this.registry.push(F),this.saveRegistry(),F}catch{}let q=d(),X=y(),B=$?$:z?await this.resolveConcreteLatest(Q,q):void 0,J=z?`${Q}@${B??"latest"}`:Q;try{if(X==="local"){let K=V(b(),"agent-plugins");if(!U(K))n(K,{recursive:!0});let F=V(K,"package.json");if(!U(F))g(F,JSON.stringify({name:"vibecontrols-agent-plugins",private:!0,version:"0.0.0",dependencies:{}},null,2)+`
4
4
  `);if(z&&B){let C=this.readInstalledVersion(V(K,"node_modules"),Q);if(C&&C!==B){Y().logger.info("plugin-manager",`Pre-clean ${Q}: on-disk v${C} != target v${B} \u2014 removing stale copy + lockfile to force fresh resolve`);try{j(V(K,"node_modules",Q),{recursive:!0,force:!0})}catch{}try{j(V(K,"bun.lock"),{force:!0}),j(V(K,"bun.lockb"),{force:!0})}catch{}}try{j(V(K,"bun.lock"),{force:!0}),j(V(K,"bun.lockb"),{force:!0})}catch{}}if(Bun.spawnSync(["bun","add",J,"--registry",q],{cwd:K,timeout:120000,stdout:"pipe",stderr:"pipe"}).exitCode!==0){let C=Bun.spawnSync(["npm","install",J,"--registry",q],{cwd:K,timeout:120000,stdout:"pipe",stderr:"pipe"});if(C.exitCode!==0)throw Error(C.stderr.toString().trim())}if(z&&B){let C=this.readInstalledVersion(V(K,"node_modules"),Q);if(C!==B){Y().logger.warn("plugin-manager",`bun kept ${Q}@${C??"missing"} after requesting ${B}; retrying with npm after removing stale local copy`);try{j(V(K,"node_modules",Q),{recursive:!0,force:!0}),j(V(K,"bun.lock"),{force:!0}),j(V(K,"bun.lockb"),{force:!0}),j(V(K,"package-lock.json"),{force:!0})}catch{}let x=Bun.spawnSync(["npm","install",J,"--registry",q,"--save-exact"],{cwd:K,timeout:120000,stdout:"pipe",stderr:"pipe"});if(x.exitCode!==0)throw Error(x.stderr.toString().trim())}}}else if(Bun.spawnSync(["bun","install","-g",J,"--registry",q],{timeout:120000,stdout:"pipe",stderr:"pipe"}).exitCode!==0){let F=Bun.spawnSync(["npm","install","-g",J,"--registry",q],{timeout:120000,stdout:"pipe",stderr:"pipe"});if(F.exitCode!==0)throw Error(F.stderr.toString().trim())}this.pluginRoots=void 0}catch(K){let F=K instanceof Error?K.message:String(K);if(z)try{await import(Q),Y().logger.warn("plugin-manager",`Could not refresh ${Q} to @latest (${F}); using the already-installed copy`),this.pluginRoots=void 0;let T=await this.importPlugin(Q),C={packageName:Q,version:T.version,pluginName:T.name,installedAt:new Date().toISOString()};return this.registry=this.registry.filter((x)=>x.packageName!==Q),this.registry.push(C),this.saveRegistry(),C}catch{}throw Error(`Failed to install ${Q}: ${F}`,{cause:K})}let W=await this.importPlugin(Q);if(z&&B&&W.version!==B)Y().logger.warn("plugin-manager",`${Q} refreshed to ${W.version} but registry latest is ${B} \u2014 a stale resolver/cache may still be in play`);if(this.corePlugins.has(W.name))Y().logger.info("plugin-manager",`External plugin '${Q}' overrides core plugin '${W.name}'`);let M={packageName:Q,version:W.version,pluginName:W.name,installedAt:new Date().toISOString()};return this.registry=this.registry.filter((K)=>K.packageName!==Q),this.registry.push(M),this.saveRegistry(),Y().logger.info("plugin-manager",`Installed ${Q}@${W.version} (${W.name})`),M}async ensureDefaultPlugins(Q,Z=[],$){let z=[],H=new Set(Z),q=$?h(process.platform,$):S(process.platform);for(let X of q){if(H.has(X.packageName)||H.has(X.pluginName)){Y().logger.info("plugin-manager",`${X.packageName} skipped by --skip-plugin`);continue}if(X.isCore&&X.category==="core"){Y().logger.info("plugin-manager",`${X.packageName} is bundled with the agent \u2014 skipping auto-install`);continue}if(this.registry.some((J)=>J.packageName===X.packageName)){Y().logger.info("plugin-manager",`${X.packageName} already installed, skipping auto-install`);continue}Q?.(`Installing ${X.label} (${X.packageName})...`);try{await this.install(X.packageName,{refreshLatest:!0}),z.push(X),Q?.(`Installed ${X.label} (${X.packageName})`)}catch(J){let W=J instanceof Error?J.message:String(J);Y().logger.error("plugin-manager",`Failed to auto-install ${X.packageName}: ${W}`),Q?.(`Failed to install ${X.label}: ${W}`)}}if(z.length>0)this.loadRegistry();return z}async installAndLoad(Q,Z,$){let z=await this.install(Q),H=this.loaded.get(z.packageName);if(H){this.registerPluginProviders(H,$);let q=this.wrapHostServices(H,$);if(H.onServerStart)await H.onServerStart(Z,q);if(H.onServerReady)await H.onServerReady(Z,q)}return z}async update(Q,Z){return this.withLifecycleLock(()=>this.updateLocked(Q,Z))}async updateLocked(Q,Z){if(Q=G(Q),Y().logger.info("plugin-manager",`Updating ${Q}${Z?`@${Z}`:""}...`),!this.registry.find((q)=>q.packageName===Q))throw Error(`Plugin ${Q} is not installed. Use 'install' first.`);let z=this.loaded.get(Q);if(z)await this.terminateWorkerHost(z.name);this.loaded.delete(Q);let H=await this.installLocked(Q,{refreshLatest:!0,version:Z});return Y().logger.info("plugin-manager",`Updated ${Q} to v${H.version}`),H}async updateAll(){let Q=[];for(let Z of[...this.registry])try{let $=await this.update(Z.packageName);Q.push({packageName:Z.packageName,success:!0,version:$.version})}catch($){Q.push({packageName:Z.packageName,success:!1,error:$ instanceof Error?$.message:String($)})}return Q}async removeAll(Q){let Z=[],$=[...this.registry];for(let z of $)try{await this.remove(z.packageName,Q),Z.push({packageName:z.packageName,success:!0})}catch(H){Z.push({packageName:z.packageName,success:!1,error:H instanceof Error?H.message:String(H)})}return Z}async remove(Q,Z){return this.withLifecycleLock(()=>this.removeLocked(Q,Z))}async removeLocked(Q,Z){Q=G(Q),Y().logger.info("plugin-manager",`Removing ${Q}...`);let $=this.loaded.get(Q);if($?.onServerStop)try{await $.onServerStop()}catch(q){Y().logger.warn("plugin-manager",`Error stopping ${Q}: ${q}`)}if($)await this.terminateWorkerHost($.name),Z?.serviceRegistry.unregisterPlugin($.name),this.loaded.delete(Q);let z=this.registry.find((q)=>q.packageName===Q);if(!$&&z)Z?.serviceRegistry.unregisterPlugin(z.pluginName);let H=V(b(),"agent-plugins");try{if(U(V(H,"package.json")))Bun.spawnSync(["bun","remove",Q],{cwd:H,timeout:60000,stdout:"pipe",stderr:"pipe"})}catch{}try{Bun.spawnSync(["bun","remove","-g",Q],{timeout:60000,stdout:"pipe",stderr:"pipe"})}catch{try{Bun.spawnSync(["npm","uninstall","-g",Q],{timeout:60000,stdout:"pipe",stderr:"pipe"})}catch{}}this.pluginRoots=void 0,this.registry=this.registry.filter((q)=>q.packageName!==Q),this.saveRegistry(),Y().logger.info("plugin-manager",`Removed ${Q}`)}async loadAll(){this.loaded.clear();let Q=[];for(let Z of this.registry)try{G(Z.packageName),await this.importPlugin(Z.packageName),Y().logger.info("plugin-manager",`Loaded ${Z.packageName} (${Z.pluginName})`)}catch($){let z=$.code;if(z==="ENOENT_PLUGIN")Y().logger.info("plugin-manager",`${Z.packageName} not present on disk \u2014 dropping from registry`),Q.push(Z.packageName);else if(z==="EPLUGIN_LEGACY_SINGLETON")Y().logger.warn("plugin-manager",`Skipping ${Z.packageName}: ${$ instanceof Error?$.message:String($)}`);else Y().logger.warn("plugin-manager",`Failed to load ${Z.packageName} \u2014 dropping from registry: ${$}`),Q.push(Z.packageName)}if(Q.length>0){this.registry=this.registry.filter((Z)=>!Q.includes(Z.packageName));try{this.saveRegistry()}catch(Z){Y().logger.warn("plugin-manager",`Failed to persist pruned registry: ${Z}`)}}}async importPlugin(Q){Q=G(Q);let Z={},$;{let H=this.getGlobalRoots(),q=!1,X=[],B=!0;for(let J of H){let W=V(J,Q);if(!U(W)){X.push({path:W,error:"directory missing"});continue}B=!1;try{$=W,Z=await import(W),q=!0;break}catch(M){X.push({path:W,error:M instanceof Error?M.message:String(M)})}try{let M=V(W,"package.json");if(!U(M)){X.push({path:M,error:"package.json missing"});continue}let K=JSON.parse(v(M,"utf8")),F=K.module??K.main??"./index.js",T=V(W,F);$=W,Z=await import(T),q=!0;break}catch(M){X.push({path:W,error:M instanceof Error?M.message:String(M)})}}if(!q)try{$=this.resolvePackageRoot(Q)??$,Z=await import(Q),q=!0}catch(J){X.push({path:`bare:${Q}`,error:J instanceof Error?J.message:String(J)})}if(!q){let J=X.map((M)=>`${M.path} (${M.error})`).join("; "),W=Error(`Cannot find module '${Q}': explicit root attempts and bare import failed: ${J||"(no roots probed)"}`);if(B&&H.length>0)W.code="ENOENT_PLUGIN";throw W}}let z=this.extractPlugin(Z,`external:${Q}`,Y());if(!z){if(this.hasLegacySingleton(Z)){let H=Error(`${Q} uses removed singleton contract; upgrade to createPlugin(ctx) factory (set VIBECONTROLS_PLUGIN_CONTRACT_V2_ENFORCE=1 to refuse strictly)`);throw H.code="EPLUGIN_LEGACY_SINGLETON",H}throw Error(`${Q} does not export a valid createPlugin(ctx) factory`)}if(this.validatePluginExport(z,Q,$),!this.acceptCapabilities(z,`external:${Q}`))throw Error(`${Q} refused to load: missing required capabilities declaration`);if($)Object.defineProperty(z,$Q,{value:$,enumerable:!1,configurable:!1});if(this.logResolvedPlugin(Q,z.version,$),this.loaded.set(Q,z),this.shouldIsolate(z)){let H=Y(),q=new L({modulePath:Q,pluginName:z.name,ctx:{name:H.name,dataDir:H.dataDir}});try{await q.start(),this.workerHosts.set(z.name,q),H.logger.info("plugin-manager",`Isolated plugin '${z.name}' running in worker_threads`)}catch(X){try{await q.terminate()}catch{}this.loaded.delete(Q);let B=X instanceof Error?X.message:String(X);throw H.logger.error("plugin-manager",`Isolation required for '${z.name}' but worker failed to start (${B}); refusing to load in host process`),Error(`Plugin '${z.name}' requires isolation but the worker failed to start: ${B}`,{cause:X})}}return z}resolvePackageRoot(Q){let Z=import.meta;if(typeof Z.resolve!=="function")return;try{let $=Z.resolve(Q);if(!$.startsWith("file:"))return;let z=R(P($));while(z&&z!==R(z)){if(U(V(z,"package.json")))return z;z=R(z)}}catch{return}return}validatePluginExport(Q,Z,$){if(!a.test(Q.name))throw Error(`${Z} exports an invalid plugin name`);if(!Q.version||Q.version.length>64)throw Error(`${Z} exports an invalid plugin version`);if(Q.description&&Q.description.length>500)throw Error(`${Z} description is too long`);if(Q.cliCommand&&!a.test(Q.cliCommand))throw Error(`${Z} exports an invalid CLI command`);if(Q.apiPrefix){if(!PQ.test(Q.apiPrefix)||Q.apiPrefix.includes("..")||Q.apiPrefix.includes("//"))throw Error(`${Z} exports an invalid API prefix`)}if(Q.publicPaths){if(Q.publicPaths.length>20)throw Error(`${Z} exports too many public paths`);for(let z of Q.publicPaths)if(!yQ.test(z)||z.includes("..")||z.includes("//"))throw Error(`${Z} exports an invalid public path`)}if(Q.dependencies&&Q.dependencies.length>20)throw Error(`${Z} exports too many dependencies`);if(Q.tags){let z=new Set(["backend","frontend","cli","provider","adapter","integration"]);if(Q.tags.length>z.size)throw Error(`${Z} exports too many tags`);for(let H of Q.tags)if(!z.has(H))throw Error(`${Z} exports an invalid tag`)}if(Q.ui){if(Q.ui.title&&Q.ui.title.length>120)throw Error(`${Z} UI title is too long`);if(Q.ui.staticDir){if(!$)throw Error(`${Z} UI staticDir requires a package root`);let z=t($),H=t(Q.ui.staticDir);if(!RQ(H).isDirectory()||!dQ(z,H))throw Error(`${Z} UI staticDir must be inside the plugin package`)}}}pluginRoots;getPluginRoots(){if(this.pluginRoots!==void 0)return this.pluginRoots;let Q=QQ(),Z=[],$=new Set,z=(q)=>{if(!q||$.has(q)||!U(q))return;$.add(q),Z.push(q)},H=process.env.VIBECONTROLS_PLUGIN_ROOTS;if(H)for(let q of H.split(Q.pathSep).map((X)=>X.trim()).filter(Boolean))z(q);if(y()==="local")z(zQ());else z(V(xQ(),".bun","install","global","node_modules")),z(Q.npmGlobalRoot());if(this.isRunningFromSource())z(this.agentOwnNodeModules());return this.pluginRoots=Z,Z}isRunningFromSource(){try{let Q=P(import.meta.url);return Q.includes(`${r}src${r}`)||Q.includes("/src/")}catch{return!1}}agentOwnNodeModules(){try{let Q=R(P(import.meta.url)),Z="";while(Q&&Q!==Z){if(U(V(Q,"package.json")))return V(Q,"node_modules");Z=Q,Q=R(Q)}}catch{}return null}getGlobalRoots(){return this.getPluginRoots()}readInstalledVersion(Q,Z){try{let $=V(Q,Z,"package.json");if(!U($))return;let z=JSON.parse(v($,"utf8"));return typeof z.version==="string"?z.version:void 0}catch{return}}logResolvedPlugin(Q,Z,$){let z=Y().logger;z.debug("plugin-manager",`Resolved ${Q}@${Z}`,{from:$??"(bare import)"});try{let H=[];for(let q of this.getPluginRoots()){let X=V(q,Q);if($&&X===$)continue;let B=this.readInstalledVersion(q,Q);if(B&&B!==Z)H.push(`${X} (v${B})`)}if(H.length>0)z.warn("plugin-manager",`${Q}: loaded v${Z} but stale duplicate copy(ies) exist at a different version \u2014 these shadow the active copy across reinstalls. Run \`vibe nuke --all\` to purge them.`,{loadedVersion:Z,loadedFrom:$??"(bare import)",shadows:H})}catch{}}extractPlugin(Q,Z,$){let z=this.findFactory(Q);if(z){let H=z($);if(!this.isVibePlugin(H))throw Error(`plugin '${Z}' createPlugin(ctx) factory returned an invalid VibePlugin`);return H}if(this.hasLegacySingleton(Q)){let H=`plugin '${Z}' uses removed singleton contract; upgrade to createPlugin(ctx) factory`;if(u())throw Error(H);Y().logger.warn("plugin-manager",H);return}return}findFactory(Q){if(typeof Q.createPlugin==="function")return Q.createPlugin;let Z=Q.default;if(Z&&typeof Z.createPlugin==="function")return Z.createPlugin;return}hasLegacySingleton(Q){if(this.isVibePlugin(Q.vibePlugin))return!0;let Z=Q.default;if(Z&&this.isVibePlugin(Z.vibePlugin))return!0;if(this.isVibePlugin(Z))return!0;return!1}isVibePlugin(Q){if(!Q||typeof Q!=="object")return!1;let Z=Q;return typeof Z.name==="string"&&typeof Z.version==="string"}registerProviders(Q,Z){this.registerPluginProviders(Q,Z)}registerPluginProviders(Q,Z){let z=p(Q.name)?.isDefault===!0,H=(q)=>{if(!z)return;Z.serviceRegistry.setProviderDefault(q,Q.name)};if(Q.providers?.tunnel){if(Z.serviceRegistry.registerProvider("tunnel",Q.providers.tunnel,Q.name),H("tunnel"),Q.tunnelDomainSuffixes)for(let q of Q.tunnelDomainSuffixes)ZQ(q)}if(Q.providers?.session)Z.serviceRegistry.registerProvider("session",Q.providers.session,Q.name),H("session");if(Q.providers?.ai)Z.serviceRegistry.registerProvider("ai",Q.providers.ai,Q.name),H("ai")}async dispatchCliSetup(Q,Z){for(let $ of this.getAllPlugins())if($.onCliSetup)try{await $.onCliSetup(Q,this.wrapHostServices($,Z))}catch(z){Y().logger.warn("plugin-manager",`onCliSetup failed for ${$.name}: ${z}`)}}async dispatchServerStart(Q,Z){let $=this.sortAllByDependencies(),z=[];for(let H of $){if(this.registerPluginProviders(H,Z),H.onServerStart){let q=Date.now();try{await H.onServerStart(Q,this.wrapHostServices(H,Z)),(async()=>{try{let{telemetryService:X}=await import("./telemetry-8jfdyt51.js");X.emit("plugin.activated",{plugin_name:H.name,version:H.version,duration_ms:Date.now()-q})}catch{}})()}catch(X){let B=X instanceof Error?X.message:String(X);Y().logger.error("plugin-manager",`onServerStart failed for ${H.name}: ${B}`),(async()=>{try{let{telemetryService:W}=await import("./telemetry-8jfdyt51.js");W.emit("plugin.failed",{plugin_name:H.name,error_class:X instanceof Error?X.constructor.name:"Error"})}catch{}})();let J=this.registry.find((W)=>W.pluginName===H.name);z.push({plugin:H.name,packageName:J?.packageName,error:B})}}this.registerPluginProviders(H,Z)}return{failures:z}}async dispatchServerReady(Q,Z){for(let $ of this.getAllPlugins())if($.onServerReady)try{await $.onServerReady(Q,this.wrapHostServices($,Z))}catch(z){Y().logger.warn("plugin-manager",`onServerReady failed for ${$.name}: ${z}`)}}async provisionDefaultPrereqs(Q,Z,$,z){let H=process.env.VIBE_SKIP_PREREQ_INSTALL==="1",q=process.platform;Y().logger.info("plugin-manager",`Provisioning default providers \u2014 agent build v${N()}, platform=${q}, pluginInstallScope=${y()}, skipInstall=${H}`);let X=(z?h(process.platform,z):S(process.platform)).map((W)=>W.packageName);if(!H)for(let W of X){if(this.loaded.has(W))continue;try{Y().logger.info("plugin-manager",`Installing default meta ${W}`),await this.install(W,{refreshLatest:!0})}catch(M){Y().logger.warn("plugin-manager",`Failed to install default meta ${W}: ${M}`)}}let B=this.buildHostPluginsFacade(Q,Z,$),J=this.attachPluginsFacade(Z,B);for(let[W,M]of this.getAllLoaded()){if(!M.provisionProviders)continue;try{await M.provisionProviders(this.wrapHostServices(M,J)),Y().logger.info("plugin-manager",`${W}: providers provisioned`)}catch(K){Y().logger.warn("plugin-manager",`${W}: provisionProviders failed: ${K}`)}}}buildHostPluginsFacade(Q,Z,$){return{install:async(z,H)=>{await this.install(z,H??{})},loadProvider:async(z)=>{await this.loadAndStartProvider(z,Q,Z,$)},runPrereqs:async(z,H)=>{let{runPluginPrereqs:q}=await import("./prereqs-runner-27x3j1md.js"),X=this.loaded.get(z);if(!X)return{satisfied:!1};let B=await q(X,z,Q,this.db??null,{skipInstall:H?.skipInstall===!0});return{satisfied:B.noProtocol?!0:B.satisfied}},electDefault:async(z,H)=>{await this.electProviderDefault(z,H,Z)},isProviderRegistered:(z,H)=>Z.serviceRegistry.listProvidersForType(z).some((q)=>q.pluginName===H),skipInstall:()=>process.env.VIBE_SKIP_PREREQ_INSTALL==="1"}}attachPluginsFacade(Q,Z){return new Proxy(Q,{get($,z,H){if(z==="plugins")return Z;return Reflect.get($,z,H)}})}async loadAndStartProvider(Q,Z,$,z){let H=this.loaded.get(Q);if(!H)H=await this.importPlugin(Q);if(H.createRoutes&&z?.(H))Y().logger.info("plugin-manager",`${Q}: mounted routes after provisioning`);this.registerPluginProviders(H,$);let q=this.wrapHostServices(H,$);if(H.onServerStart)await H.onServerStart(Z,q);if(H.onServerReady)await H.onServerReady(Z,q)}async electProviderDefault(Q,Z,$){if(!$.serviceRegistry.listProvidersForType(Q).some((H)=>H.pluginName===Z))return;try{let H=await this.getDefaultProvider(Q);if(H&&H!==Z)return;if($.serviceRegistry.setProviderDefault(Q,Z),!H)await this.setDefaultProvider(Q,Z).catch(()=>{});Y().logger.info("plugin-manager",`Elected platform-default '${Q}' provider '${Z}'`)}catch(H){Y().logger.warn("plugin-manager",`Failed to elect default '${Q}' provider '${Z}': ${H}`)}}async dispatchServerStop(Q){for(let Z of this.getAllPlugins())if(Z.onServerStop)try{await Z.onServerStop(Q)}catch($){Y().logger.warn("plugin-manager",`onServerStop failed for ${Z.name}: ${$}`)}if(Q?.reason==="shutdown")await this.terminateAllWorkerHosts()}async runPluginNuke(Q,Z,$){let z=Q?this.loaded.has(Q)?[[Q,this.loaded.get(Q)]]:[]:Array.from(this.loaded.entries()),H=[];for(let[q,X]of z){if(!X.onNuke)continue;try{let B=this.wrapHostServices(X,Z),J=await X.onNuke(B,$);H.push({plugin:q,ok:!0,reaped:J?.reaped??[],notes:J?.notes??[]}),Y().logger.info("plugin-manager",`onNuke ${$.dryRun?"(dry-run) ":""}completed for ${q}`,{reaped:J?.reaped??[]})}catch(B){let J=B instanceof Error?B.message:String(B);H.push({plugin:q,ok:!1,reaped:[],notes:[],error:J}),Y().logger.warn("plugin-manager",`onNuke failed for ${q}: ${J}`)}}return{results:H}}async reloadAll(Q,Z){await this.dispatchServerStop({reason:"reload"}),await this.terminateAllWorkerHosts();for(let $ of this.loaded.values())Z.serviceRegistry.unregisterPlugin($.name);this.loaded.clear(),this.corePlugins.clear(),this.loadRegistry(),await this.loadCorePlugins(),await this.loadAll(),await this.dispatchServerStart(Q,Z),await this.dispatchServerReady(Q,Z)}sortAllByDependencies(){let Q=this.getAllPlugins(),Z=new Map;for(let X of Q)Z.set(X.name,X);let $=new Set,z=new Set,H=[],q=(X)=>{if($.has(X))return;if(z.has(X))throw Error(`Plugin dependency cycle detected at '${X}'`);let B=Z.get(X);if(!B)return;if(z.add(X),B.dependencies)for(let J of B.dependencies){if(!Z.has(J)){Y().logger.warn("plugin-manager",`Plugin '${B.name}' depends on missing plugin '${J}'`);continue}q(J)}z.delete(X),$.add(X),H.push(B)};for(let X of Q)q(X.name);return H}sortByDependencies(){let Q=Array.from(this.loaded.entries()),Z=new Map;for(let[q,X]of Q)Z.set(X.name,q);let $=new Set,z=[],H=(q)=>{if($.has(q))return;$.add(q);let X=this.loaded.get(q);if(X?.dependencies)for(let J of X.dependencies){let W=Z.get(J);if(W&&this.loaded.has(W))H(W)}let B=this.loaded.get(q);if(B)z.push([q,B])};for(let[q]of Q)H(q);return z}getPluginByKey(Q){for(let[,Z]of this.loaded)if(Z.name===Q)return Z;return this.corePlugins.get(Q)}getAllPlugins(){let Q=new Map;for(let[Z,$]of this.corePlugins)Q.set(Z,$);for(let[,Z]of this.loaded)Q.set(Z.name,Z);return Array.from(Q.values())}getAllPluginsByTag(Q){return this.getAllPlugins().filter((Z)=>Z.tags?.includes(Q)??!1)}resolvePluginChain(Q){let Z=new Set;for(let H of this.getAllPlugins())Z.add(H.name);let $=[],z=-1;for(let H=0;H<Q.length;H++){if(Q[H].startsWith("-")){z=H;break}if(Z.has(Q[H]))$.push(Q[H]);else{z=H;break}}if(z===-1)return{chain:$,command:"",args:[]};return{chain:$,command:Q[z],args:Q.slice(z+1)}}async getDefaultProvider(Q){if(!this.db)return null;return await this.db.getConfig(`${e}${Q}`)??null}async setDefaultProvider(Q,Z){if(!this.db)throw Error("Cannot set default provider: PluginManager was constructed without a database reference");if(!this.getPluginByKey(Z))throw Error(`Plugin '${Z}' not found`);await this.db.setConfig(`${e}${Q}`,Z),Y().logger.info("plugin-manager",`Set default '${Q}' provider to '${Z}'`)}getPluginDetails(){let Q=this.getCorePluginDetails(),Z=this.getExternalPluginDetails(),$=new Map;for(let z of Q)$.set(z.pluginName,z);for(let z of Z)$.set(z.pluginName,z);return Array.from($.values())}getCorePluginDetails(){let Q=[];for(let[Z,$]of this.corePlugins)Q.push({packageName:`@vibecontrols/plugin-${Z}`,pluginName:Z,version:$.version,description:$.description,tags:$.tags,cliCommand:$.cliCommand,apiPrefix:$.apiPrefix,dependencies:$.dependencies,installedAt:"",loaded:!0,isCore:!0,hasUI:!!$.ui,uiUrl:$.ui?`/ui/${Z}`:void 0,hasCliSetup:!!$.onCliSetup,hasServerStart:!!$.onServerStart,hasServerStop:!!$.onServerStop,hasServerReady:!!$.onServerReady,hasProviders:!!($.providers?.tunnel||$.providers?.session||$.providers?.ai)});return Q}getExternalPluginDetails(){return this.registry.map((Q)=>{let Z=this.loaded.get(Q.packageName),$=p(Q.pluginName);return{packageName:Q.packageName,pluginName:Q.pluginName,version:Z?.version??Q.version,description:Z?.description,tags:Z?.tags,cliCommand:Z?.cliCommand,apiPrefix:Z?.apiPrefix,dependencies:Z?.dependencies,installedAt:Q.installedAt,loaded:!!Z,isCore:$?.isCore===!0,hasUI:!!Z?.ui,uiUrl:Z?.ui?`/ui/${Q.pluginName}`:void 0,hasCliSetup:!!Z?.onCliSetup,hasServerStart:!!Z?.onServerStart,hasServerStop:!!Z?.onServerStop,hasServerReady:!!Z?.onServerReady,hasProviders:!!(Z?.providers?.tunnel||Z?.providers?.session||Z?.providers?.ai)}})}getRegistry(){return[...this.registry]}getLoaded(Q){return this.loaded.get(Q)}getAllLoaded(){return new Map(this.loaded)}isInstalled(Q){return this.registry.some((Z)=>Z.packageName===Q)}isLoaded(Q){return this.loaded.has(Q)}}
5
5
  export{N as Da,O as Ea,jQ as Fa,D as Ga,h as Ha,l as Ia,rQ as Ja,pQ as Ka,iQ as La,aQ as Ma,I as Na,bQ as Oa,eQ as Pa,SQ as Qa,hQ as Ra,VZ as Sa,G as Ta,y as Ua,OZ as Va,HQ as Wa};
@@ -0,0 +1,158 @@
1
+ // @bun
2
+ import{d as m,e as H2}from"./index-z5s398n0.js";import{z as c}from"./index-190q0sxy.js";import"./index-d1xjj001.js";import"./index-hw61pg70.js";import"./index-4wgjx8bf.js";import{Ja as Z2,Ka as $2,La as z2,Na as W2,Ta as d}from"./index-9006n9tq.js";import"./index-0ckffygp.js";import"./index-hvjqgb97.js";import"./index-rqq0k5fc.js";import{Rb as X2,Sb as Y2}from"./index-5dysvvjv.js";import{Ub as J,Vb as V2}from"./index-pgew6sge.js";import{jc as l,kc as t,lc as R}from"./index-8nqp3a4d.js";import{oc as k,qc as q,rc as O,sc as S,tc as I,uc as _,vc as u,wc as A,yc as i}from"./index-1mppacnx.js";import{Gc as s,Hc as G2}from"./index-thammzct.js";import{Lc as U,Nc as E,Oc as n,Pc as h}from"./index-b6x6a4xp.js";import"./index-h74va4wd.js";import{Od as y}from"./index-js1xn4sq.js";import"./index-a4854mwz.js";import"./index-4qq083yd.js";import{ie as L}from"./index-c7554sg7.js";import{timingSafeEqual as j2}from"crypto";function U2(){return(process.env.NPM_CONFIG_REGISTRY||process.env.npm_config_registry||"https://registry.npmjs.org").replace(/\/+$/,"")}async function a(V,B){try{let z=await fetch(`${U2()}/${V}/${B}`,{headers:{accept:"application/json"},signal:AbortSignal.timeout(1e4)});if(z.ok){let Q=(await z.json()).dist?.integrity;if(typeof Q==="string"&&Q.startsWith("sha"))return Q}}catch{}try{let z=Bun.spawn({cmd:["npm","view",`${V}@${B}`,"dist.integrity","--json"],stdout:"pipe",stderr:"pipe"});if(await z.exited!==0)return null;let X=(await new Response(z.stdout).text()).trim();if(!X)return null;if(X.startsWith('"'))try{let $=JSON.parse(X);return typeof $==="string"?$:null}catch{return null}return X}catch{return null}}function e(V,B){let z=Buffer.from(V),K=Buffer.from(B);if(z.length!==K.length)return!1;try{return j2(z,K)}catch{return!1}}var h2=$2.map((V)=>({packageName:V.packageName,name:V.pluginName,description:V.description,cliCommand:V.cliCommand,apiPrefix:V.apiPrefix,installed:!1,category:V.category})),N=new Map;function w(V,B){let K=(N.get(V)??Promise.resolve()).then(B,B),Q=K.then(()=>{return},()=>{return});return N.set(V,Q),Q.finally(()=>{if(N.get(V)===Q)N.delete(V)}),K}function K2(V){return N.has(V)}function Q2(V){let B=V.getPluginDetails(),z=new Set(B.map((K)=>K.packageName));return{plugins:h2.map((K)=>({...K,installed:z.has(K.packageName)}))}}function B2(V){let{pluginManager:B}=V;return new V2().get("/",()=>{let z=B.getPluginDetails();return{plugins:z,count:z.length}}).get("/available",()=>Q2(B)).get("/catalog",()=>Q2(B)).get("/contributions",({query:z})=>{let K=typeof z?.mountPoint==="string"&&z.mountPoint?z.mountPoint:null,Q=[],X=new Map;for(let $ of B.getPluginDetails())X.set($.pluginName,$.packageName);for(let $ of B.getAllPlugins()){let x=$.ui;if(!x||!x.contributions||x.contributions.length===0)continue;let Y=x.capabilities??{restPaths:[],wsTopics:[],rpcMethods:[]};for(let W of x.contributions){if(K&&W.mountPoint!==K)continue;let Z=W.meta,H=Z&&typeof Z.url==="string"?Z.url:null,F=H&&H.startsWith("/")&&!H.startsWith("//")&&!H.includes("\x00")&&!H.includes("..")?H:null;Q.push({pluginKey:$.name,pluginPackageName:X.get($.name),contribution:W,capabilities:W.capabilities??Y,url:F??`/ui/${encodeURIComponent($.name)}`})}}return{contributions:Q,count:Q.length}}).post("/install",async({body:z,set:K})=>{if(!z.packageName||typeof z.packageName!=="string")return K.status=400,{error:"Missing required field: packageName"};if(z.packageName.startsWith("@burdenoff/"))z.packageName=z.packageName.replace(/^@burdenoff\//,"@vibecontrols/");if(!W2(z.packageName))return K.status=403,{error:"Plugin package is not in the trusted VibeControls catalog"};try{let Q=d(z.packageName);if(K2(Q)){let X=Q.split("/").pop()?.replace("vibe-plugin-","");if(B.getAllPlugins().some((x)=>x.name===X))return{success:!0,message:`Plugin ${Q} is already installed`,packageName:Q,alreadyInstalled:!0};return K.status=409,{error:"Install for this package is already in progress. Wait for it to finish.",packageName:Q}}return await w(Q,async()=>{let X=Q.split("/").pop()?.replace("vibe-plugin-",""),$=X?.startsWith("ai-")?X.slice(3):void 0,x=B.getAllPlugins().find((C)=>C.name===X||C.name===$),Y=!!x,W=await B.install(Q),Z=z2(Q);if(Z?.integrity){let C=await a(Q,W.version);if(C&&!e(Z.integrity,C)){try{await B.remove(Q,V.hostServices)}catch(G){console.warn(`[plugin-mgr] integrity rollback uninstall failed for ${Q}:`,G)}return y().audit.emit("agent","plugin.install.rejected",{packageName:Q,version:W.version,reason:"integrity_mismatch",expected:Z.integrity,actual:C}),K.status=400,{error:"integrity mismatch",expected:Z.integrity,actual:C}}if(!C)console.warn(`[plugin-mgr] could not fetch registry integrity for ${Q}@${W.version}; accepting the package-manager-verified tarball (pin present but unverifiable)`),y().audit.emit("agent","plugin.install.integrity_unverified",{packageName:Q,version:W.version,expected:Z.integrity})}else console.warn(`[plugin-mgr] plugin ${Q} has no pinned integrity \u2014 accepting npm registry's hash`);let H=B.getAllPlugins().find((C)=>C.name===W.pluginName);if(H){let C=[];if(V.mountPlugin)V.mountPlugin(H);if(V.hostServices){if(Y&&x?.onServerStop)try{await x.onServerStop()}catch(G){C.push(`onServerStop failed: ${G instanceof Error?G.message:String(G)}`)}if(B.registerProviders(H,V.hostServices),H.onServerStart&&V.app)try{await H.onServerStart(V.app,V.hostServices),B.registerProviders(H,V.hostServices)}catch(G){C.push(`onServerStart failed: ${G instanceof Error?G.message:String(G)}`)}if(H.onServerReady&&V.app)try{await H.onServerReady(V.app,V.hostServices)}catch(G){C.push(`onServerReady failed: ${G instanceof Error?G.message:String(G)}`)}}if(V.rebuildPluginSurfaces?.(),C.length>0)return K.status=500,{success:!1,message:`Plugin ${Q} installed but failed to start`,lifecycleErrors:C,restartRequired:!0}}let F;if(H&&V.app)try{F=await m(H,Q,V.app,V.db,{skipInstall:!!z.skipPrereqs})}catch(C){F=void 0,console.warn(`[plugin-mgr] prereq run failed for ${Q}:`,C)}return c(V.db),y().audit.emit("agent","plugin.installed",{packageName:Q,version:W.version,pluginName:W.pluginName,wasRunning:Y}),{success:!0,message:`Plugin ${Q} installed and loaded successfully`,prereqs:F?{satisfied:F.satisfied,missing:F.status?.missing??[],pendingSudo:F.pendingSudo,skipped:!!z.skipPrereqs}:void 0}})}catch(Q){return K.status=500,{error:"Failed to install plugin",details:String(Q)}}},{body:J.Object({packageName:J.String(),skipPrereqs:J.Optional(J.Boolean())})}).post("/prereqs/status",async({body:z,set:K})=>{if(!z.packageName)return K.status=400,{error:"Missing packageName"};let Q=z.packageName,X=B.getAllPlugins().find(($)=>$.name===Q||B.getLoaded(Q)?.name===$.name);if(!X||!V.app)return await H2(V.db,Q)??{satisfied:!0,missing:[]};try{let $=await m(X,Q,V.app,V.db,{skipInstall:!0});return{satisfied:$.satisfied,missing:$.status?.missing??[],noProtocol:$.noProtocol}}catch($){return K.status=500,{error:String($)}}},{body:J.Object({packageName:J.String()})}).post("/prereqs/install",async({body:z,set:K})=>{if(!z.packageName)return K.status=400,{error:"Missing packageName"};let Q=z.packageName,X=B.getAllPlugins().find(($)=>$.name===Q||B.getLoaded(Q)?.name===$.name);if(!X||!V.app)return K.status=404,{error:"Plugin not loaded"};try{let $=await m(X,Q,V.app,V.db,{skipInstall:!1});return{satisfied:$.satisfied,installed:$.install?.installed??[],pendingSudo:$.pendingSudo,errors:$.install?.errors??[],noProtocol:$.noProtocol}}catch($){return K.status=500,{error:String($)}}},{body:J.Object({packageName:J.String(),approveSudo:J.Optional(J.Boolean())})}).post("/prereqs/uninstall",async({body:z,set:K})=>{if(!z.packageName)return K.status=400,{error:"Missing packageName"};let Q=z.packageName,X=B.getAllPlugins().find((W)=>W.name===Q);if(!X||!X.apiPrefix||!V.app)return K.status=404,{error:"Plugin not loaded"};let $=V.app.handle;if(typeof $!=="function")return K.status=500,{error:"App handle unavailable"};let x=`${X.apiPrefix.replace(/\/+$/,"")}/prereqs/uninstall`,Y=await $.call(V.app,new Request(`http://agent.local${x}`,{method:"POST",headers:{"x-vc-profile-rewrite":"1",[X2]:Y2()}}));if(Y.status===404)return K.status=404,{error:"Plugin has no prereqs/uninstall endpoint"};return Y.json()},{body:J.Object({packageName:J.String()})}).post("/nuke",async({body:z,set:K})=>{if(!V.hostServices)return K.status=503,{error:"hostServices unavailable"};let Q=V.hostServices.getDataDir?.();return{ok:!0,...await B.runPluginNuke(z.packageName,V.hostServices,{agentDir:Q,dryRun:!!z.dryRun})}},{body:J.Object({packageName:J.Optional(J.String()),dryRun:J.Optional(J.Boolean())})}).post("/remove",async({body:z,set:K})=>{if(!z.packageName||typeof z.packageName!=="string")return K.status=400,{error:"Missing required field: packageName"};if(z.packageName.startsWith("@burdenoff/"))z.packageName=z.packageName.replace(/^@burdenoff\//,"@vibecontrols/");if(Z2(z.packageName))return{success:!0,message:`Plugin ${z.packageName} is critical and cannot be removed; treating remove as a no-op.`,skipped:!0};try{let Q=d(z.packageName);return await w(Q,async()=>{return await B.remove(Q,V.hostServices),V.rebuildPluginSurfaces?.(),c(V.db),y().audit.emit("agent","plugin.removed",{packageName:Q}),{success:!0,message:`Plugin ${Q} removed successfully`}})}catch(Q){return K.status=500,{error:"Failed to remove plugin",details:String(Q)}}},{body:J.Object({packageName:J.String()})}).post("/update",async({body:z,set:K})=>{if(!z.packageName||typeof z.packageName!=="string")return K.status=400,{error:"Missing required field: packageName"};let Q=typeof z.version==="string"&&z.version.trim()?z.version.trim():void 0;if(Q&&!/^[0-9][0-9A-Za-z.+-]{0,63}$/.test(Q))return K.status=400,{error:`Invalid version "${Q}"`};try{let X=d(z.packageName);return await w(X,async()=>{let $=B.getLoaded(X);if($?.onServerStop)await $.onServerStop({reason:"reload"});if($&&V.hostServices)V.hostServices.serviceRegistry.unregisterPlugin($.name);let x=await B.update(X,Q),Y=B.getLoaded(X);if(Y&&V.hostServices){if(B.registerProviders(Y,V.hostServices),Y.onServerStart&&V.app)await Y.onServerStart(V.app,V.hostServices),B.registerProviders(Y,V.hostServices);if(Y.onServerReady&&V.app)await Y.onServerReady(V.app,V.hostServices)}return V.rebuildPluginSurfaces?.(),c(V.db),{success:!0,message:`Plugin ${X} updated to v${x.version}`,version:x.version}})}catch(X){return K.status=500,{error:"Failed to update plugin",details:String(X)}}},{body:J.Object({packageName:J.String(),version:J.Optional(J.String())})}).post("/update-all",async({set:z})=>{try{let K=await w("*",()=>B.updateAll());return{success:!0,results:K,message:`Updated ${K.filter((Q)=>Q.success).length}/${K.length} plugin(s)`}}catch(K){return z.status=500,{error:"Failed to update all plugins",details:String(K)}}}).post("/remove-all",async({set:z})=>{try{let K=await w("*",async()=>{let Q=await B.removeAll(V.hostServices);return V.rebuildPluginSurfaces?.(),Q});return{success:!0,results:K,message:`Removed ${K.filter((Q)=>Q.success).length}/${K.length} plugin(s)`}}catch(K){return z.status=500,{error:"Failed to remove all plugins",details:String(K)}}}).post("/reload",async({set:z})=>{try{if(!V.app||!V.hostServices)return z.status=503,{error:"Plugin lifecycle services are not ready"};let K=await w("*",async()=>{return await B.reloadAll(V.app,V.hostServices),V.rebuildPluginSurfaces?.(),B.getPluginDetails()});return{success:!0,plugins:K,message:`Reloaded ${K.length} plugin(s)`}}catch(K){return z.status=500,{error:"Failed to reload plugins",details:String(K)}}}).post("/:name/reload",async({params:z,set:K})=>{if(!V.app||!V.hostServices)return K.status=503,{error:"Plugin lifecycle services are not ready"};let Q=z.name,X=B.getAllPlugins().find((Y)=>Y.name===Q);if(!X)return K.status=404,{error:`Plugin "${Q}" not found`};let x=B.getPluginDetails().find((Y)=>Y.pluginName===Q)?.packageName??`core:${Q}`;if(K2(x))return K.status=409,{error:"Plugin lifecycle in progress; try again shortly",packageName:x};try{return await w(x,async()=>{if(X.onServerStop)try{await X.onServerStop({reason:"reload"})}catch(Y){console.warn(`[plugin-mgr] onServerStop during reload of ${Q}:`,Y)}if(V.hostServices)V.hostServices.serviceRegistry.unregisterPlugin(X.name);if(B.registerProviders(X,V.hostServices),X.onServerStart)await X.onServerStart(V.app,V.hostServices),B.registerProviders(X,V.hostServices);if(X.onServerReady)await X.onServerReady(V.app,V.hostServices);return V.rebuildPluginSurfaces?.(),{success:!0,message:`Plugin ${Q} reloaded`,version:X.version}})}catch(Y){return K.status=500,{error:"Failed to reload plugin",details:String(Y)}}},{params:J.Object({name:J.String()})})}import{mkdirSync as o,writeFileSync as v,existsSync as x2}from"fs";import{isAbsolute as D2,join as T,relative as A2,resolve as g}from"path";var D="http://localhost:3005",v2=/^[a-z0-9][a-z0-9-]{0,63}$/,E2=new Set(["backend","frontend","cli","provider","adapter","integration"]);function C2(V,B){let z=A2(V,B);if(z.startsWith("..")||D2(z))throw Error("Plugin scaffold path escapes the selected directory.")}function M(V){return JSON.stringify(V)}function J2(V){let B=V.command("plugin").description("Manage plugins");B.command("list").description("List installed plugins").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON").option("--plain","Force plain text output").action(async(K)=>{try{let Q={...V.opts(),...K},X=U(K),$=encodeURIComponent(E(Q)),x=async()=>{try{return(await n(X,`/api/profiles/${$}/plugins`)).plugins||[]}catch{I("Agent not reachable. Attempting local plugin registry...");let{PluginManager:Z}=await import("./plugin-system-kaj4069d.js");return new Z().getPluginDetails()||[]}},Y=(Z)=>Z.status??(Z.loaded===!0||Z.enabled===!0?"enabled":"disabled"),W=(Z)=>Z.pluginName||Z.name||Z.packageName||Z.package||"-";await t({mode:l(Q),fetchData:x,plain:(Z)=>{if(!Z.length){_("No plugins installed.");return}u("Installed Plugins"),i(Z.map((H)=>({Name:W(H),Version:H.version||"-",Status:Y(H),Description:H.description||"-"})))},interactive:async(Z)=>{if(!Z.length){u("Installed Plugins"),_("No plugins installed.");return}let H=Z.map((F)=>{let C=W(F),G=Y(F),b=[`${k.bold(C)} ${G==="enabled"?k.green(G):k.dim(G)}`,"",` Version: ${F.version||"-"}`,` Description: ${F.description||"-"}`];if(F.tags&&Array.isArray(F.tags))b.push(` Tags: ${F.tags.join(", ")}`);if(F.cliCommand)b.push(` CLI command: vibe ${F.cliCommand}`);return{id:C,label:C,hint:G,detail:b.join(`
3
+ `)}});await s({title:`vibe plugin \u2014 ${Z.length} installed`,rows:H,footer:"\u2191/\u2193 navigate \xB7 q to quit"})},json:(Z)=>Z.map((H)=>({name:W(H),version:H.version??null,status:Y(H),description:H.description??null,tags:H.tags??null,cliCommand:H.cliCommand??null}))})}catch(Q){q(O(Q))}}),B.command("install").description("Install a plugin").argument("<package>","NPM package name to install").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--skip-prereqs","Skip running the plugin's prereqs/install",!1).option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));try{let Y=await h($,`/api/profiles/${x}/plugins/install`,{packageName:K,skipPrereqs:!!Q.skipPrereqs});if(R(X,{ok:!0,action:"install",package:K,version:Y?.version??null,prereqs:Y?.prereqs??null}))return;if(S(`Plugin "${K}" installed.`),Y?.version)A("Version",Y.version);if(Y?.prereqs){let W=Y.prereqs;if(W.skipped)I(`Prerequisite install skipped. Run \`vibe plugin prereqs ${K} install\` later.`);else if(!W.satisfied)I(`Prerequisites not yet satisfied: ${(W.missing||[]).map((Z)=>Z.name).join(", ")||"(unknown)"}`);if((W.pendingSudo||[]).length>0){I(`${W.pendingSudo.length} command(s) need sudo. Run them and re-check with \`vibe plugin prereqs ${K} status\`:`);for(let Z of W.pendingSudo)A(` ${Z.name}`,Z.command)}}}catch{I("Agent not reachable. Attempting local install...");try{let{PluginManager:Y}=await import("./plugin-system-kaj4069d.js");if(await new Y().install(K),R(X,{ok:!0,action:"install",package:K,local:!0}))return;S(`Plugin "${K}" installed locally.`)}catch(Y){q(`Could not install plugin via agent or locally: ${O(Y)}`)}}}catch(X){q(O(X))}}),B.command("remove").description("Remove a plugin").argument("<package>","NPM package name to remove").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));try{if(await h($,`/api/profiles/${x}/plugins/remove`,{packageName:K}),R(X,{ok:!0,action:"remove",package:K}))return;S(`Plugin "${K}" removed.`)}catch{I("Agent not reachable. Attempting local removal...");try{let{PluginManager:Y}=await import("./plugin-system-kaj4069d.js");if(await new Y().remove(K),R(X,{ok:!0,action:"remove",package:K,local:!0}))return;S(`Plugin "${K}" removed locally.`)}catch(Y){q(`Could not remove plugin via agent or locally: ${O(Y)}`)}}}catch(X){q(O(X))}}),B.command("update").description("Update a plugin (or all plugins with --all)").argument("[package]","NPM package name to update").option("--all","Update all installed plugins",!1).option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));if(Q.all){_("Updating all plugins...");try{let Y=await h($,`/api/profiles/${x}/plugins/update-all`,{}),W=Y?.results||[];if(R(X,{ok:!0,action:"update-all",results:W}))return;for(let Z of W)if(Z.success)S(`Updated ${Z.packageName}${Z.version?` to v${Z.version}`:""}`);else I(`Failed to update ${Z.packageName}: ${Z.error}`);S(Y?.message||"Done.")}catch{I("Agent not reachable. Attempting local update...");try{let{PluginManager:Y}=await import("./plugin-system-kaj4069d.js"),Z=await new Y().updateAll();if(R(X,{ok:!0,action:"update-all",results:Z,local:!0}))return;for(let H of Z)if(H.success)S(`Updated ${H.packageName}${H.version?` to v${H.version}`:""}`);else I(`Failed to update ${H.packageName}: ${H.error}`)}catch(Y){q(`Could not update plugins: ${O(Y)}`)}}}else if(K){_(`Updating ${K}...`);try{let Y=await h($,`/api/profiles/${x}/plugins/update`,{packageName:K});if(R(X,{ok:!0,action:"update",package:K,version:Y?.version??null,message:Y?.message??null}))return;S(Y?.message||`Plugin "${K}" updated.`)}catch{I("Agent not reachable. Attempting local update...");try{let{PluginManager:Y}=await import("./plugin-system-kaj4069d.js"),Z=await new Y().update(K);if(R(X,{ok:!0,action:"update",package:K,version:Z.version,local:!0}))return;S(`Plugin "${K}" updated to v${Z.version}.`)}catch(Y){q(`Could not update plugin: ${O(Y)}`)}}}else q("Provide a package name to update, or use --all to update all plugins.")}catch(X){q(O(X))}}),B.command("uninstall").description("Uninstall a plugin (or all plugins with --all)").argument("[package]","NPM package name to uninstall").option("--all","Uninstall all external plugins",!1).option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));if(Q.all){_("Uninstalling all plugins...");try{let Y=await h($,`/api/profiles/${x}/plugins/remove-all`,{}),W=Y?.results||[];if(R(X,{ok:!0,action:"uninstall-all",results:W}))return;for(let Z of W)if(Z.success)S(`Removed ${Z.packageName}`);else I(`Failed to remove ${Z.packageName}: ${Z.error}`);S(Y?.message||"Done.")}catch{I("Agent not reachable. Attempting local removal...");try{let{PluginManager:Y}=await import("./plugin-system-kaj4069d.js"),Z=await new Y().removeAll();if(R(X,{ok:!0,action:"uninstall-all",results:Z,local:!0}))return;for(let H of Z)if(H.success)S(`Removed ${H.packageName}`);else I(`Failed to remove ${H.packageName}: ${H.error}`)}catch(Y){q(`Could not uninstall plugins: ${O(Y)}`)}}}else if(K)try{if(await h($,`/api/profiles/${x}/plugins/remove`,{packageName:K}),R(X,{ok:!0,action:"uninstall",package:K}))return;S(`Plugin "${K}" uninstalled.`)}catch{I("Agent not reachable. Attempting local removal...");try{let{PluginManager:Y}=await import("./plugin-system-kaj4069d.js");if(await new Y().remove(K),R(X,{ok:!0,action:"uninstall",package:K,local:!0}))return;S(`Plugin "${K}" uninstalled locally.`)}catch(Y){q(`Could not uninstall plugin: ${O(Y)}`)}}else q("Provide a package name to uninstall, or use --all to uninstall all plugins.")}catch(X){q(O(X))}}),B.command("reload").description("Reload all plugins").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K)=>{try{let Q={...V.opts(),...K},X=U(K),$=encodeURIComponent(E(Q));if(await h(X,`/api/profiles/${$}/plugins/reload`,{}),R(Q,{ok:!0,action:"reload"}))return;S("Plugins reloaded.")}catch(Q){q(O(Q))}}),B.command("available").description("Show available plugins").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON").option("--plain","Force plain text output").action(async(K)=>{try{let Q={...V.opts(),...K},X=U(K),$=encodeURIComponent(E(Q)),x=async()=>{return(await n(X,`/api/profiles/${$}/plugins/available`)).plugins||[]},Y=(Z)=>Z.name||Z.package||"-",W=(Z)=>Z.version||Z.latestVersion||"-";await t({mode:l(Q),fetchData:x,plain:(Z)=>{if(!Z||Z.length===0){_("No available plugins found.");return}u("Available Plugins"),i(Z.map((H)=>({Name:Y(H),Version:W(H),Description:H.description||"-"})))},interactive:async(Z)=>{if(!Z||Z.length===0){u("Available Plugins"),_("No available plugins found.");return}let H=Z.map((F)=>{let C=Y(F),G=[k.bold(C),"",` Version: ${W(F)}`,` Description: ${F.description||"-"}`];return{id:C,label:C,hint:W(F),detail:G.join(`
4
+ `)}});await s({title:`vibe plugin available \u2014 ${Z.length} plugin(s)`,rows:H,footer:"\u2191/\u2193 navigate \xB7 q to quit"})},json:(Z)=>Z.map((H)=>({name:Y(H),version:W(H),description:H.description??null}))})}catch(Q){q(O(Q))}});let z=B.command("prereqs").description("Inspect or run a plugin's prerequisite-install protocol").argument("<package>","NPM package name (or short plugin name)");z.command("status",{isDefault:!0}).description("Show the plugin's prereq status").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON").option("--plain","Force plain text output").action(async(K,Q)=>{let X=Q.parent?.args?.[0];if(!X){q("Missing plugin package argument.");return}try{let $={...V.opts(),...K},x=U(K),Y=async()=>h(x,"/api/plugins/prereqs/status",{packageName:X});await t({mode:l($),fetchData:Y,plain:(W)=>{if(A("Plugin",X),A("Satisfied",W?.satisfied?"yes":"no"),Array.isArray(W?.missing)&&W.missing.length>0)A("Missing",W.missing.map((Z)=>Z.name).join(", "))},interactive:async(W)=>{let Z=[`Plugin: ${X}`,`Satisfied: ${W?.satisfied?"yes":"no"}`];if(Array.isArray(W?.missing)&&W.missing.length>0)Z.push(`Missing: ${W.missing.map((H)=>H.name).join(", ")}`);await G2({title:`Prereqs: ${X}`,body:Z.join(`
5
+ `),footer:"q / Esc to quit"})},json:(W)=>({plugin:X,satisfied:!!W?.satisfied,missing:Array.isArray(W?.missing)?W.missing:[],pendingSudo:Array.isArray(W?.pendingSudo)?W.pendingSudo:[]})})}catch($){q(`Could not read prereq status: ${O($)}`)}}),z.command("install").description("Run the plugin's prerequisite install endpoint").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--approve-sudo","Auto-approve sudo commands the plugin returns",!1).option("--json","Emit JSON result").action(async(K,Q)=>{let X=Q.parent?.args?.[0];if(!X){q("Missing plugin package argument.");return}try{let $={...V.opts(),...K},x=U(K),Y=await h(x,"/api/plugins/prereqs/install",{packageName:X,approveSudo:!!K.approveSudo});if(R($,{ok:!0,action:"prereqs-install",plugin:X,satisfied:!!Y?.satisfied,pendingSudo:Y?.pendingSudo??[]}))return;if(Y?.satisfied)S(`Prerequisites satisfied for ${X}.`);else I(`Prerequisites still missing for ${X}.`);if(Array.isArray(Y?.pendingSudo)&&Y.pendingSudo.length>0){I(`${Y.pendingSudo.length} command(s) require sudo:`);for(let W of Y.pendingSudo)A(` ${W.name}`,W.command)}}catch($){q(`Prereq install failed: ${O($)}`)}}),z.command("uninstall").description("Run the plugin's prerequisite uninstall endpoint (if supported)").option("--agent-url <url>","Agent URL",D).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{let X=Q.parent?.args?.[0];if(!X){q("Missing plugin package argument.");return}try{let $={...V.opts(),...K},x=U(K);if(await h(x,"/api/plugins/prereqs/uninstall",{packageName:X}),R($,{ok:!0,action:"prereqs-uninstall",plugin:X}))return;S(`Prereq uninstall completed for ${X}.`)}catch($){I(`Prereq uninstall not supported or failed: ${O($)}`)}}),B.command("create").description("Scaffold a new plugin project").argument("<name>",'Plugin name (e.g. "docker" \u2192 vibe-plugin-docker)').option("-d, --dir <directory>","Parent directory",".").option("--tag <tag>","Plugin tag (backend, frontend, cli, provider, adapter, integration)","backend").option("--with-ui","Include a companion UI plugin scaffold",!1).option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=K.startsWith("vibe-plugin-")?K.slice(12):K;if(!v2.test($)){q("Plugin name must use lowercase letters, numbers, and dashes only.");return}let x=Q.tag;if(!E2.has(x)){q("Invalid plugin tag.");return}let Y=`vibe-plugin-${$}`,W=g(Q.dir),Z=g(W,Y);if(C2(W,Z),x2(Z)){q(`Directory "${Z}" already exists.`);return}_(`Scaffolding ${Y}...`),o(T(Z,"src"),{recursive:!0}),o(T(Z,"dist"),{recursive:!0});let H=`VibeControls plugin: ${$}`,F={name:`@vibecontrols/${Y}`,version:"0.1.0",main:"./dist/index.js",type:"module",engines:{bun:">=1.3.0"},scripts:{build:"bun build ./src/index.ts --outdir ./dist --target bun",lint:"eslint ./src",format:"bunx prettier . --write","format:check":"bunx prettier . --check","type:check":"tsc --noEmit",clean:"rimraf dist",prebuild:"bun run clean",prepublishOnly:"bun run build",sanity:"bun run format:check && bun run lint && bun run type:check && bun run build"},keywords:["vibecontrols","vibe","vibe-plugin",$,"bun"],author:{name:"Your Name",email:"you@example.com"},license:"SEE LICENSE IN LICENSE",description:H,devDependencies:{"@types/bun":"^1.2.16","bun-types":"^1.3.9",commander:"^14.0.3",eslint:"^9.30.1",prettier:"^3.6.2",rimraf:"^6.0.1",typescript:"^5.8.3","typescript-eslint":"^8.56.0"},peerDependencies:{"@vibecontrols/agent":">=2.0.0"},peerDependenciesMeta:{"@vibecontrols/agent":{optional:!0}},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},files:["dist/**/*","README.md","LICENSE"]};v(T(Z,"package.json"),JSON.stringify(F,null,2)+`
6
+ `);let C={compilerOptions:{target:"ES2022",module:"ES2022",moduleResolution:"bundler",types:["bun-types"],strict:!0,esModuleInterop:!0,skipLibCheck:!0,outDir:"./dist",rootDir:"./src",declaration:!0,sourceMap:!0},include:["src/**/*.ts"],exclude:["node_modules","dist"]};v(T(Z,"tsconfig.json"),JSON.stringify(C,null,2)+`
7
+ `),v(T(Z,".gitignore"),["node_modules/","dist/","bun.lock",".env",".env.local","*.tgz"].join(`
8
+ `)+`
9
+ `);let G=$,b=M(Y),p=M(H),q2=M(x),r=M(G),S2=`import type { Command } from "commander";
10
+
11
+ /**
12
+ * @vibecontrols/${Y}
13
+ *
14
+ * ${H}
15
+ */
16
+
17
+ // \u2500\u2500 Plugin Interfaces \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
18
+
19
+ export interface HostServices {
20
+ logger?: {
21
+ info: (msg: string) => void;
22
+ warn: (msg: string) => void;
23
+ error: (msg: string) => void;
24
+ debug: (msg: string) => void;
25
+ };
26
+ config?: Record<string, unknown>;
27
+ }
28
+
29
+ export interface VibePlugin {
30
+ name: string;
31
+ version: string;
32
+ description: string;
33
+ tags?: Array<
34
+ "backend" | "frontend" | "cli" | "provider" | "adapter" | "integration"
35
+ >;
36
+ cliCommand: string;
37
+ onCliSetup: (program: Command, hostServices?: HostServices) => void;
38
+ }
39
+
40
+ // \u2500\u2500 Plugin Implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
41
+
42
+ const plugin: VibePlugin = {
43
+ name: ${b},
44
+ version: "0.1.0",
45
+ description: ${p},
46
+ tags: [${q2}],
47
+ cliCommand: ${r},
48
+
49
+ onCliSetup(program: Command, _hostServices?: HostServices): void {
50
+ const cmd = program
51
+ .command(${r})
52
+ .description(${p});
53
+
54
+ cmd
55
+ .command("status")
56
+ .description(`+M(`Show ${$} status`)+`)
57
+ .action(() => {
58
+ console.log(`+M(`${Y} is ready.`)+`);
59
+ });
60
+
61
+ cmd
62
+ .command("info")
63
+ .description("Show plugin info")
64
+ .action(() => {
65
+ console.log(JSON.stringify({
66
+ name: plugin.name,
67
+ version: plugin.version,
68
+ description: plugin.description,
69
+ tags: plugin.tags,
70
+ }, null, 2));
71
+ });
72
+ },
73
+ };
74
+
75
+ export default plugin;
76
+ `;v(T(Z,"src","index.ts"),S2);let I2=`# ${Y}
77
+
78
+ ${H}
79
+
80
+ ## Installation
81
+
82
+ \`\`\`bash
83
+ vibe plugin install @vibecontrols/${Y}
84
+ \`\`\`
85
+
86
+ ## Usage
87
+
88
+ \`\`\`bash
89
+ vibe ${G} status
90
+ vibe ${G} info
91
+ \`\`\`
92
+
93
+ ## Development
94
+
95
+ \`\`\`bash
96
+ bun install
97
+ bun run build
98
+ bun run sanity
99
+ \`\`\`
100
+
101
+ ## Publishing
102
+
103
+ \`\`\`bash
104
+ bun run build
105
+ npm publish
106
+ \`\`\`
107
+ `;v(T(Z,"README.md"),I2);let P={ok:!0,action:"create",plugin:Y,packageName:`@vibecontrols/${Y}`,cliCommand:G,tag:x,dir:Z,withUi:Q.withUi===!0};if(!X.json)S(`Created ${Y} at ${Z}`),A("Plugin Name",`@vibecontrols/${Y}`),A("CLI Command",`vibe ${G}`),A("Tag",x),_(`
108
+ Next steps:`),_(` cd ${Y}`),_(" bun install"),_(" bun run build"),_(` publish @vibecontrols/${Y}, then install from catalog`);if(Q.withUi){let f=`${Y.replace("vibe-plugin-","vibe-plugin-ui-")}`,j=g(W,f);if(C2(W,j),x2(j)){if(!X.json)I(`UI directory "${j}" already exists, skipping.`);P.uiSkipped=!0,P.uiDir=j}else{o(T(j,"src"),{recursive:!0}),o(T(j,"public"),{recursive:!0});let O2={name:`@vibecontrols/${f}`,version:"0.1.0",private:!1,type:"module",scripts:{dev:"vite --port 5180",build:"tsc && vite build",preview:"vite preview",lint:"eslint ./src",format:"bunx prettier . --write","format:check":"bunx prettier . --check","type:check":"tsc --noEmit",sanity:"bun run format:check && bun run lint && bun run type:check && bun run build"},keywords:["vibecontrols","vibe-plugin","ui",$],author:{name:"Your Name",email:"you@example.com"},license:"SEE LICENSE IN LICENSE",description:`UI for ${Y}`,dependencies:{react:"^19.0.0","react-dom":"^19.0.0"},devDependencies:{"@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4.5.2",typescript:"^5.8.3",vite:"^7.0.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},files:["dist/**/*","README.md"]};v(T(j,"package.json"),JSON.stringify(O2,null,2)+`
109
+ `);let R2=`import React from "react";
110
+ import ReactDOM from "react-dom/client";
111
+ import App from "./App";
112
+
113
+ ReactDOM.createRoot(document.getElementById("root")!).render(
114
+ <React.StrictMode>
115
+ <App />
116
+ </React.StrictMode>
117
+ );
118
+ `;v(T(j,"src","main.tsx"),R2);let _2=`import { useState, useEffect } from "react";
119
+
120
+ const TITLE = ${M(`${$} UI`)};
121
+
122
+ export default function App() {
123
+ const [apiKey, setApiKey] = useState<string | null>(null);
124
+ const [status, setStatus] = useState("loading...");
125
+
126
+ useEffect(() => {
127
+ // Auth via postMessage (iframe) or URL param (new tab)
128
+ const params = new URLSearchParams(window.location.search);
129
+ const key = params.get("apiKey");
130
+ if (key) {
131
+ setApiKey(key);
132
+ setStatus("connected");
133
+ return;
134
+ }
135
+
136
+ const handler = (e: MessageEvent) => {
137
+ if (e.data?.type === "vibe-auth" && e.data.apiKey) {
138
+ setApiKey(e.data.apiKey);
139
+ setStatus("connected");
140
+ }
141
+ };
142
+ window.addEventListener("message", handler);
143
+ return () => window.removeEventListener("message", handler);
144
+ }, []);
145
+
146
+ return (
147
+ <div style={{ background: "var(--vibe-surface, Canvas)", color: "var(--vibe-text, CanvasText)", minHeight: "100vh", padding: 24, fontFamily: "system-ui" }}>
148
+ <h1>{TITLE}</h1>
149
+ <p>Status: {status}</p>
150
+ {apiKey && <p style={{ color: "var(--vibe-success, CanvasText)" }}>Authenticated</p>}
151
+ </div>
152
+ );
153
+ }
154
+ `;v(T(j,"src","App.tsx"),_2);let T2=`<!DOCTYPE html>
155
+ <html lang="en">
156
+ <head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>${$} UI</title></head>
157
+ <body><div id="root"></div><script type="module" src="/src/main.tsx"></script></body>
158
+ </html>`;if(v(T(j,"index.html"),T2),!X.json)S(`Created UI plugin ${f} at ${j}`);P.uiPluginName=f,P.uiPackageName=`@vibecontrols/${f}`,P.uiDir=j}}R(X,P)}catch(X){q(O(X))}})}function F2(V,B){J2(V)}function p2(V){return{name:"plugin-mgr",version:"2.2.0",description:"Plugin lifecycle management \u2014 install, remove, reload, catalog",capabilities:{storage:"rw",subprocess:!0,gateway:!0,audit:!0,telemetry:!0},tags:["backend","cli"],cliCommand:"plugin",apiPrefix:"/api/plugins",createRoutes:(B)=>B2(B),onCliSetup:async(B,z)=>{F2(B,z)}}}export{p2 as createPlugin};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{h as y,i as c}from"./index-cs78wq6y.js";import{A as p$,B as i$,y as l$}from"./index-btt96dhd.js";import{N as j$}from"./index-b5dhmybd.js";import{O as H$,P as K$}from"./index-e1bw1bwr.js";import{va as g}from"./index-pk3ejfc4.js";import"./index-dxtnaa3g.js";import{Ca as k$}from"./index-4wgjx8bf.js";import"./index-kmkhjf1c.js";import"./index-0ckffygp.js";import{ab as v}from"./index-rc79x8fw.js";import{db as Y$}from"./index-52cp759f.js";import"./index-hvjqgb97.js";import{Jb as C$,Kb as D$,tb as X$,vb as L$}from"./index-rqq0k5fc.js";import"./index-5dysvvjv.js";import{Ub as F,Vb as p}from"./index-pgew6sge.js";import{Xb as g$}from"./index-rzpaqrhx.js";import"./index-8sdrhr3q.js";import{jc as x,kc as _,lc as c$}from"./index-8nqp3a4d.js";import{Ac as s,Bc as N,Cc as u,oc as V,pc as Z,qc as Y,rc as H,sc as A,uc as z,vc as X,wc as J,xc as Q,yc as h$,zc as k}from"./index-1mppacnx.js";import{Hc as K}from"./index-thammzct.js";import{Lc as T,Nc as b,Oc as M,Pc as y$}from"./index-b6x6a4xp.js";import{qd as T$}from"./index-h74va4wd.js";import{Id as z$,Ld as q$,Od as q}from"./index-js1xn4sq.js";import{$d as $$,Yd as J$,_d as a,ae as U$}from"./index-a4854mwz.js";import"./index-4qq083yd.js";import{ie as d}from"./index-c7554sg7.js";function t(f){let{name:W,onInit:w,onShutdown:U,onNuke:R,telemetryEventName:$,skipPlatforms:G}=f;return{onServerStart:async(I,O)=>{if(G&&G.includes(process.platform)){process.stderr.write(`[${W}] skipping init on unsupported platform '${process.platform}'
2
+ import{h as y,i as c}from"./index-cs78wq6y.js";import{A as p$,B as i$,y as l$}from"./index-190q0sxy.js";import{N as j$}from"./index-b5dhmybd.js";import{O as H$,P as K$}from"./index-e1bw1bwr.js";import{va as g}from"./index-vaxcmbdg.js";import"./index-hw61pg70.js";import{Ca as k$}from"./index-4wgjx8bf.js";import"./index-9006n9tq.js";import"./index-0ckffygp.js";import{ab as v}from"./index-rc79x8fw.js";import{db as Y$}from"./index-52cp759f.js";import"./index-hvjqgb97.js";import{Jb as C$,Kb as D$,tb as X$,vb as L$}from"./index-rqq0k5fc.js";import"./index-5dysvvjv.js";import{Ub as F,Vb as p}from"./index-pgew6sge.js";import{Xb as g$}from"./index-rzpaqrhx.js";import"./index-8sdrhr3q.js";import{jc as x,kc as _,lc as c$}from"./index-8nqp3a4d.js";import{Ac as s,Bc as N,Cc as u,oc as V,pc as Z,qc as Y,rc as H,sc as A,uc as z,vc as X,wc as J,xc as Q,yc as h$,zc as k}from"./index-1mppacnx.js";import{Hc as K}from"./index-thammzct.js";import{Lc as T,Nc as b,Oc as M,Pc as y$}from"./index-b6x6a4xp.js";import{qd as T$}from"./index-h74va4wd.js";import{Id as z$,Ld as q$,Od as q}from"./index-js1xn4sq.js";import{$d as $$,Yd as J$,_d as a,ae as U$}from"./index-a4854mwz.js";import"./index-4qq083yd.js";import{ie as d}from"./index-c7554sg7.js";function t(f){let{name:W,onInit:w,onShutdown:U,onNuke:R,telemetryEventName:$,skipPlatforms:G}=f;return{onServerStart:async(I,O)=>{if(G&&G.includes(process.platform)){process.stderr.write(`[${W}] skipping init on unsupported platform '${process.platform}'
3
3
  `);return}if(w)await w(O);if($)O.telemetry?.emit($,{plugin:W})},onServerStop:async(I)=>{if(U)await U(I)},onNuke:async(I,O)=>{if(R)return R(I,O)}}}var e=class{constructor(f,W){this.logger=f,this.source=W}logger;source;info(f,W){this.logger?.info?.(this.source,f,W)}warn(f,W){this.logger?.warn?.(this.source,f,W)}error(f,W){this.logger?.error?.(this.source,f,W)}debug(f,W){this.logger?.debug?.(this.source,f,W)}};import{existsSync as t$,rmSync as e$,statSync as a$}from"fs";import{resolve as $U}from"path";function R$(f=$$()){let W=[],w=$U(f),U=U$();if(!a(U,w))throw Error("Refusing to reset a path outside the agents directory");if(t$(w)&&a$(w).isDirectory())e$(w,{recursive:!0,force:!0}),W.push(w);return{removed:W,agentDir:w}}var S="alias",G$=/^[a-zA-Z0-9_-]{1,64}$/,w$=16384,f$=256,W$=1024,UU=new Set(["help","start","stop","restart","kill","list","status","setup","update","completion","autostart","export","import","diagnostics","nuke","doctor","log-level","gc","deploy","network","profile","peer-bootstrap","gateway-auth","info","key","system","url","health","notify","tunnel","session","git","config","log","plugin","ai","audit","alias","run"]);class D extends Error{code;constructor(f,W){super(W);this.code=f,this.name="AliasValidationError"}}class E extends Error{constructor(f){super(`alias '${f}' already exists`);this.name="AliasConflictError"}}class P extends Error{constructor(f){super(`alias '${f}' not found`);this.name="AliasNotFoundError"}}function RU(f){if(typeof f!=="string"||!G$.test(f))throw new D("invalid_name",`alias name must match ${G$} (got '${f}')`);if(UU.has(f))throw new D("reserved_name",`alias name '${f}' is reserved`)}function I$(f){if(typeof f!=="string"||f.length===0)throw new D("invalid_command","alias command must be a non-empty string");if(f.length>w$)throw new D("command_too_long",`alias command exceeds ${w$} bytes`)}function O$(f){if(f===void 0)return;if(typeof f!=="string")throw new D("invalid_description","alias description must be a string");if(f.length>f$)throw new D("description_too_long",`alias description exceeds ${f$} chars`)}function F$(f){if(f===void 0||f===null||f==="")return;if(typeof f!=="string")throw new D("invalid_cwd","alias cwd must be a string");if(f.length>W$)throw new D("cwd_too_long",`alias cwd exceeds ${W$} chars`);if(f.includes("\x00"))throw new D("invalid_cwd","alias cwd must not contain NUL bytes")}function GU(f){if(!f)return;try{return JSON.parse(f)}catch{return}}async function i(f){let W=await f.getAllPluginState(S),w=[];for(let U of W){let R=GU(U.value);if(R)w.push(R)}return w.sort((U,R)=>U.name.localeCompare(R.name)),w}async function n(f,W){return(await i(f)).find((U)=>U.name===W)}function V$(f){if(f===void 0||f===null)return null;let W=f.trim();return W===""?null:W}async function Q$(f,W){if(RU(W.name),I$(W.command),O$(W.description),F$(W.cwd),await n(f,W.name))throw new E(W.name);let U=new Date().toISOString(),R={id:crypto.randomUUID(),name:W.name,command:W.command,description:W.description,cwd:V$(W.cwd),profile:J$(),createdAt:U,updatedAt:U};return await f.setPluginState(S,R.id,JSON.stringify(R)),R}async function Z$(f,W,w){let U=await n(f,W);if(!U)throw new P(W);if(w.command!==void 0)I$(w.command);if(w.description!==void 0)O$(w.description);if(w.cwd!==void 0)F$(w.cwd);let R={...U,command:w.command??U.command,description:w.description!==void 0?w.description:U.description,cwd:w.cwd!==void 0?V$(w.cwd):U.cwd,updatedAt:new Date().toISOString()};return await f.setPluginState(S,R.id,JSON.stringify(R)),R}async function B$(f,W){let w=await n(f,W);if(!w)throw new P(W);await f.deletePluginState(S,w.id)}function m(){let f=q$()??q();return{dir:f.dataDir,scope:f.name}}function M$(f){let{serviceRegistry:W,db:w}=f;return new p().get("/api-key",()=>({apiKey:C$()})).post("/reset-key",async({body:U,set:R})=>{let $=U.apiKey;if(!$||typeof $!=="string")return R.status=400,{error:"Missing required field: apiKey"};try{return await D$($),await q().keyVault.bindApiKey($),q().logger.info("auth","Adopted backend-rotated agent API key via /reset-key"),{success:!0}}catch(G){return R.status=400,{error:"reset-key failed",message:G instanceof Error?G.message:String(G)}}},{body:F.Object({apiKey:F.String()})}).get("/audit",({query:U})=>{let R=U,$=R.limit?Math.min(5000,Math.max(1,Number.parseInt(R.limit,10)||100)):100,G=q().audit.listEvents({since:R.since,limit:$,event:R.event});return{events:G,count:G.length}},{query:F.Object({since:F.Optional(F.String()),limit:F.Optional(F.String()),event:F.Optional(F.String())})}).get("/setup/check",()=>{let U=H$();return{ready:U.filter(($)=>$.required).every(($)=>$.installed),dependencies:U}}).post("/setup/install",async({request:U,server:R,set:$})=>{let G=await c(U,"VIBECONTROLS_ALLOW_REMOTE_SETUP_INSTALL",R);if(G)return $.status=403,{error:"Forbidden",message:G};return await K$()}).get("/url",async()=>{let U=W.getProvider("tunnel"),R=U&&U.getActiveTunnelUrl?await U.getActiveTunnelUrl():null,$=`http://localhost:${process.env.PORT||3005}`;return{url:R||$,tunnelUrl:R,localUrl:$,source:R?"tunnel":"local"}}).get("/lifecycle/state",()=>{return{state:W.getService("agent","lifecycle")?.getState()??"running"}}).post("/lifecycle/stop",async({set:U})=>{let R=W.getService("agent","lifecycle");if(!R)return U.status=500,{error:"Lifecycle manager not initialized"};return await R.stop(),{state:"stopped"}}).post("/lifecycle/start",async({set:U})=>{let R=W.getService("agent","lifecycle");if(!R)return U.status=500,{error:"Lifecycle manager not initialized"};return await R.start(),{state:"running"}}).post("/lifecycle/kill",async({set:U})=>{let R=W.getService("agent","lifecycle");if(!R)return U.status=500,{error:"Lifecycle manager not initialized"};return setTimeout(()=>R.kill(),100),{state:"killing"}}).post("/log-level",async({body:U,request:R,server:$,set:G})=>{let I=await c(R,"VIBECONTROLS_ALLOW_REMOTE_LOG_LEVEL",$);if(I)return G.status=403,{error:"Forbidden",message:I};let O=String(U.level??"").toLowerCase();if(!["debug","info","warn","error"].includes(O))return G.status=400,{error:"Invalid level",message:"level must be debug | info | warn | error"};return q().logger.setLevel(O),q().logger.info("agent",`Log level set to ${O} via API`),{ok:!0,level:O}},{body:F.Object({level:F.String()})}).post("/reset",async({body:U,request:R,server:$,set:G})=>{if(!U.confirm)return G.status=400,{error:"Reset confirmation required",message:"Send { confirm: true } to reset local agent state."};let I=await c(R,"VIBECONTROLS_ALLOW_REMOTE_RESET",$);if(I)return G.status=403,{error:"Forbidden",message:I};let O=W.getService("agent","lifecycle");try{if(O)await O.prepareForReset()}catch(h){q().logger.warn("agent","prepareForReset failed during reset \u2014 proceeding to wipe anyway",{error:String(h)})}try{z$.configure({globalGatewayUrl:"",workspaceGatewayUrl:void 0,clientId:"",clientSecret:"",workspaceId:void 0})}catch{}await w.close();let{removed:B,agentDir:L}=R$();q().logger.info("agent","Reset wiped local agent state",{agentDir:L,removed:B});let C=new Uint8Array(32);crypto.getRandomValues(C);let j=`vcak_${Buffer.from(C).toString("base64url")}`;return T$({"static-api-key":j},m()),q().setBootState("awaiting-config"),G.status=200,{success:!0,state:"awaiting-config",...y(R,$)||process.env.VIBECONTROLS_RETURN_RESET_API_KEY==="1"?{newApiKey:j}:{},agentDir:L,removed:B}},{body:F.Object({confirm:F.Boolean()})}).post("/sessions/:sessionId/share",async({params:U,body:R,server:$,request:G,set:I})=>{if(!y(G,$)&&process.env.VIBECONTROLS_ALLOW_REMOTE_SESSION_SHARE!=="1")return I.status=403,{error:"Forbidden",message:"Session-share mint must come from a local request unless VIBECONTROLS_ALLOW_REMOTE_SESSION_SHARE=1."};if(!X$(U.sessionId))return I.status=400,{error:"BadRequest",message:"invalid sessionId"};let O=wU(R?.expiresIn)??1800000,B=crypto.randomUUID(),L=new Uint8Array(32);crypto.getRandomValues(L);let C=`vcak_${Buffer.from(L).toString("base64url")}`,j=new Date(Date.now()+O).toISOString(),r=[...(await import("./agent-config-4ppenhqp.js")).readAgentConfig({dir:m().dir}).apiKeys??[],{id:B,name:`session-share:${U.sessionId}:${R?.label??"viewer"}`,key:C,scopes:["read"],expiresAt:j,createdAt:new Date().toISOString()}];(await import("./agent-config-4ppenhqp.js")).writeAgentConfig({apiKeys:r},m());let h=W.getProvider("tunnel"),d$=(h&&h.getActiveTunnelUrl?await h.getActiveTunnelUrl():null)??`http://localhost:${process.env.PORT||3005}`,s$=L$({pathPrefixes:[`/terminal/${U.sessionId}`],methods:["GET"]},Math.min(600,Math.floor(O/1000))),r$=`${d$.replace(/\/$/,"")}/terminal/${encodeURIComponent(U.sessionId)}/#vt=${encodeURIComponent(s$.token)}`;return q().logger.info("session-share","Minted share credential",{sessionId:U.sessionId,keyId:B,expiresAt:j}),{ok:!0,keyId:B,apiKey:C,joinUrl:r$,sessionId:U.sessionId,expiresAt:j}},{params:F.Object({sessionId:F.String()}),body:F.Optional(F.Object({permissions:F.Optional(F.Array(F.String())),expiresIn:F.Optional(F.String()),label:F.Optional(F.String())}))}).get("/aliases",async()=>{return{aliases:await i(w)}}).get("/aliases/:name",async({params:U,set:R})=>{let $=await n(w,U.name);if(!$)return R.status=404,{error:"Alias not found"};return $},{params:F.Object({name:F.String()})}).post("/aliases",async({body:U,set:R})=>{try{let $=await Q$(w,U);return R.status=201,$}catch($){if($ instanceof E)return R.status=409,{error:"Alias already exists",message:$.message};if($ instanceof D)return R.status=400,{error:$.code,message:$.message};throw $}},{body:F.Object({name:F.String(),command:F.String(),description:F.Optional(F.String()),cwd:F.Optional(F.Union([F.String(),F.Null()]))})}).put("/aliases/:name",async({params:U,body:R,set:$})=>{try{return await Z$(w,U.name,R)}catch(G){if(G instanceof P)return $.status=404,{error:"Alias not found"};if(G instanceof D)return $.status=400,{error:G.code,message:G.message};throw G}},{params:F.Object({name:F.String()}),body:F.Object({command:F.Optional(F.String()),description:F.Optional(F.String()),cwd:F.Optional(F.Union([F.String(),F.Null()]))})}).delete("/aliases/:name",async({params:U,set:R})=>{try{return await B$(w,U.name),R.status=204,null}catch($){if($ instanceof P)return R.status=404,{error:"Alias not found"};throw $}},{params:F.Object({name:F.String()})}).post("/aliases/:name/execute",async({params:U,body:R,set:$})=>{let G=await n(w,U.name);if(!G)return $.status=404,{error:"Alias not found"};let I=R?.args??[],O=await j$(G,I);q().audit.emit("agent","alias.executed",{exit_code:O.exit_code});let B=Y$("alias.executed",{exit_code:O.exit_code});if(!B.ok)q().logger.debug("alias",`telemetry validate failed: ${B.reason}`);if(O.timed_out)$.status=408;return{exit_code:O.exit_code,stdout:O.stdout,stderr:O.stderr,duration_ms:O.duration_ms,truncated:O.truncated,cwd:O.cwd}},{params:F.Object({name:F.String()}),body:F.Optional(F.Object({args:F.Optional(F.Array(F.String()))}))}).post("/sessions/share/:keyId/revoke",async({params:U,server:R,request:$,set:G})=>{if(!y($,R)&&process.env.VIBECONTROLS_ALLOW_REMOTE_SESSION_SHARE!=="1")return G.status=403,{error:"Forbidden"};let I=await import("./agent-config-4ppenhqp.js"),O=m(),B=I.readAgentConfig({dir:O.dir}),L=(B.apiKeys??[]).length,C=(B.apiKeys??[]).filter((j)=>j.id!==U.keyId);if(C.length===L)return G.status=404,{error:"No such share key"};return I.writeAgentConfig({apiKeys:C},O),{ok:!0,revoked:U.keyId}},{params:F.Object({keyId:F.String()})})}function wU(f){if(!f)return null;let W=/^(\d+)([smhdw]?)$/.exec(f.trim());if(!W)return null;let w=Number(W[1]),U=W[2]||"m";return U==="s"?w*1000:U==="m"?w*60000:U==="h"?w*3600000:U==="d"?w*86400000:w*7*86400000}var fU="http://localhost:3005";function x$(f){f.command("health").description("Check health of a VibeControls agent instance").option("-n, --name <name>","Agent instance name").option("--agent-url <url>","Agent URL",fU).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(W){try{let w={...f.opts(),...W};await _({mode:x(w),fetchData:async()=>{if(w.name){let $=await new g().checkHealth(w.name);return{mode:"named",agentUrl:T(w),name:w.name,healthy:$.healthy,details:$.details??{}}}let U=T(w);try{let R=await M(U,"/health");return{mode:"url",agentUrl:U,healthy:!0,details:R}}catch(R){return{mode:"url",agentUrl:U,healthy:!1,details:{status:"unhealthy",...R instanceof Error?{error:H(R)}:{}}}}},plain:(U)=>{if(X("Agent Health"),Q(),U.mode==="named"){if(!U.healthy){Y(`Agent instance ${V.bold(U.name??"")} is not responding.`);return}let R=U.details;if(J("Instance",U.name??""),J("Status",u(R.status??"healthy")),R.uptime!==void 0)J("Uptime",`${R.uptime}s`);if(R.checks){Q(),z(`${Z.info} Health checks:`);for(let[$,G]of Object.entries(R.checks)){let I=G.status==="healthy"?Z.success:Z.error;J(` ${I} ${$}`,u(G.status))}}}else{if(J("URL",U.agentUrl),J("Status",u(U.details.status??"unhealthy")),U.details.version)J("Version",U.details.version);if(U.details.uptime!==void 0)J("Uptime",`${U.details.uptime}s`);if(U.details.timestamp)J("Timestamp",U.details.timestamp);if(U.details.checks){Q(),z(`${Z.info} Health checks:`);for(let[R,$]of Object.entries(U.details.checks)){let G=$.status==="healthy"?Z.success:Z.error;J(` ${G} ${R}`,u($.status))}}}if(Q(),U.healthy)A(`${Z.success} Agent is healthy.`)},interactive:async(U)=>{let R=[];if(U.mode==="named")R.push(`Instance: ${U.name??""}`);else R.push(`URL: ${U.agentUrl}`);if(R.push(`Status: ${u(U.details.status??(U.healthy?"healthy":"unhealthy"))}`),U.details.version)R.push(`Version: ${U.details.version}`);if(U.details.uptime!==void 0)R.push(`Uptime: ${U.details.uptime}s`);if(U.details.timestamp)R.push(`Time: ${U.details.timestamp}`);if(U.details.checks){R.push(""),R.push("Checks:");for(let[$,G]of Object.entries(U.details.checks))R.push(` ${$}: ${G.status}`)}await K({title:"Agent Health",body:R.join(`
4
4
  `),footer:"press q to exit"})},json:(U)=>({mode:U.mode,agentUrl:U.agentUrl,name:U.name??null,healthy:U.healthy,details:U.details})})}catch(w){Y(`Health check failed: ${H(w)}`)}})}import{platform as WU,arch as JU,release as IU,hostname as OU,cpus as FU,totalmem as VU}from"os";var QU="http://localhost:3005";function _$(f){f.command("info").description("Show local and remote VibeControls agent information").option("--agent-url <url>","Agent URL",QU).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(W){try{let w={...f.opts(),...W},U=T(w),R=encodeURIComponent(b(w));await _({mode:x(w),fetchData:async()=>{let $={hostname:OU(),platform:WU(),arch:JU(),release:IU(),cpus:FU().length,totalMemory:VU(),nodeVersion:process.version,bunVersion:process.versions.bun};try{let G=await M(U,`/api/profiles/${R}/agent/version`);return{local:$,agentUrl:U,remote:G}}catch(G){return{local:$,agentUrl:U,remote:null,remoteError:G instanceof Error?H(G):String(G)}}},plain:($)=>{if(X("VibeControls Agent Info"),Q(),z(`${Z.info} Local System`),J("Hostname",$.local.hostname),J("Platform",`${$.local.platform} ${$.local.arch}`),J("OS Release",$.local.release),J("CPUs",String($.local.cpus)),J("Total Memory",N($.local.totalMemory)),J("Node.js",$.local.nodeVersion),$.local.bunVersion)J("Bun",$.local.bunVersion);if(Q(),z(`${Z.info} Remote Agent`),J("URL",$.agentUrl),$.remote){if(J("Version",V.bold($.remote.version)),$.remote.build)J("Build",$.remote.build);if($.remote.commit)J("Commit",$.remote.commit);if($.remote.nodeVersion)J("Node.js (remote)",$.remote.nodeVersion);if($.remote.bunVersion)J("Bun (remote)",$.remote.bunVersion)}else J("Status",V.dim("not reachable"));Q()},interactive:async($)=>{let G=[];if(G.push("Local System"),G.push(` Hostname: ${$.local.hostname}`),G.push(` Platform: ${$.local.platform} ${$.local.arch}`),G.push(` OS Release: ${$.local.release}`),G.push(` CPUs: ${$.local.cpus}`),G.push(` Total Memory: ${N($.local.totalMemory)}`),G.push(` Node.js: ${$.local.nodeVersion}`),$.local.bunVersion)G.push(` Bun: ${$.local.bunVersion}`);if(G.push(""),G.push("Remote Agent"),G.push(` URL: ${$.agentUrl}`),$.remote){if(G.push(` Version: ${$.remote.version}`),$.remote.build)G.push(` Build: ${$.remote.build}`);if($.remote.commit)G.push(` Commit: ${$.remote.commit}`);if($.remote.nodeVersion)G.push(` Node.js: ${$.remote.nodeVersion} (remote)`);if($.remote.bunVersion)G.push(` Bun: ${$.remote.bunVersion} (remote)`)}else G.push(" Status: not reachable");await K({title:"VibeControls Agent Info",body:G.join(`
5
5
  `),footer:"press q to exit"})},json:($)=>({local:$.local,agentUrl:$.agentUrl,remote:$.remote,remoteError:$.remoteError??null})})}catch(w){Y(`Failed to get info: ${H(w)}`)}})}var ZU="http://localhost:3005";function b$(f){f.command("system").description("Show system information for a running VibeControls agent").option("--agent-url <url>","Agent URL",ZU).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(W){try{let w={...f.opts(),...W},U=T(w),R=encodeURIComponent(b(w));await _({mode:x(w),fetchData:()=>M(U,`/api/profiles/${R}/agent/system`),plain:($)=>{if(X("Agent System Information"),Q(),z(`${Z.info} Agent`),J("Version",V.bold($.agentVersion)),$.bunVersion)J("Bun",$.bunVersion);if($.environment)J("Environment",$.environment);J("Uptime",s($.uptime)),Q(),z(`${Z.info} Platform`),J("OS",`${$.platform} ${$.arch}`),J("Hostname",$.hostname),J("Release",$.release),Q(),z(`${Z.info} Resources`),J("CPUs",String($.cpus)),J("Total Memory",N($.totalMemory)),J("Free Memory",N($.freeMemory)),Q(),z(`${Z.info} Paths`),J("Home",$.homeDir),J("CWD",$.cwd),Q()},interactive:async($)=>{let G=["Agent",` Version: ${$.agentVersion}`,...$.bunVersion?[` Bun: ${$.bunVersion}`]:[],...$.environment?[` Environment: ${$.environment}`]:[],` Uptime: ${s($.uptime)}`,"","Platform",` OS: ${$.platform} ${$.arch}`,` Hostname: ${$.hostname}`,` Release: ${$.release}`,"","Resources",` CPUs: ${$.cpus}`,` Total Mem: ${N($.totalMemory)}`,` Free Mem: ${N($.freeMemory)}`,"","Paths",` Home: ${$.homeDir}`,` CWD: ${$.cwd}`];await K({title:"Agent System Information",body:G.join(`
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{Sa as k}from"./index-kmkhjf1c.js";import{Eb as F,Fb as h,Gb as S,Hb as q,Jb as N,wb as f,zb as c}from"./index-rqq0k5fc.js";import{Vb as P}from"./index-pgew6sge.js";import{Od as V}from"./index-js1xn4sq.js";var U=["tunnel","session","ai","plan","gitops","security"];class m{providers=new Map;providerOrder=new Map;defaults=new Map;services=new Map;db;constructor(z){this.db=z}getDb(){return this.db}setProviderDefault(z,J){this.defaults.set(z,J)}clearProviderDefault(z,J){if(!J||this.defaults.get(z)===J)this.defaults.delete(z)}async hydrateDefaultsFromDb(){if(!this.db)return;for(let z of U)try{let J=await this.db.getConfig(`provider:default:${z}`);if(J)this.defaults.set(z,J)}catch{}}registerProvider(z,J,Q){if(!this.providers.has(z))this.providers.set(z,new Map),this.providerOrder.set(z,[]);let W=this.providers.get(z),Z=this.providerOrder.get(z);if(W.has(Q))V().logger.info("service-registry",`Updating ${z} provider from plugin '${Q}'`);else V().logger.info("service-registry",`Registered ${z} provider from plugin '${Q}'`);if(W.set(Q,{provider:J,pluginName:Q,registeredAt:new Date}),!Z.includes(Q))Z.push(Q)}getProvider(z){let J=this.providers.get(z);if(!J||J.size===0)return;let Q=this.defaults.get(z);if(Q&&J.has(Q))return J.get(Q).provider;let W=this.providerOrder.get(z);if(W&&W.length>0){let Z=W[0];return J.get(Z)?.provider}return}getProviderByName(z,J){let Q=this.providers.get(z);if(!Q)return;return Q.get(J)?.provider}hasProvider(z){let J=this.providers.get(z);return!!J&&J.size>0}unregisterProvider(z,J){let Q=this.providers.get(z);if(!Q)return!1;let W=Q.delete(J);if(W){let Z=this.providerOrder.get(z);if(Z){let X=Z.indexOf(J);if(X!==-1)Z.splice(X,1)}this.clearProviderDefault(z,J),V().logger.info("service-registry",`Unregistered ${z} provider from plugin '${J}'`)}return W}unregisterPlugin(z){for(let J of U)this.unregisterProvider(J,z);this.unregisterServices(z)}listProvidersForType(z){let J=this.providers.get(z);if(!J)return[];let Q=this.defaults.get(z);if(!Q||!J.has(Q)){let W=this.providerOrder.get(z);Q=W&&W.length>0?W[0]:void 0}return Array.from(J.keys()).map((W)=>({pluginName:W,isDefault:W===Q}))}registerService(z,J,Q){let W=`${z}:${J}`;this.services.set(W,{service:Q,pluginName:z}),V().logger.debug("service-registry",`Registered service '${W}'`)}getService(z,J){let Q=`${z}:${J}`;return this.services.get(Q)?.service}unregisterServices(z){let J=[];for(let[Q,W]of this.services)if(W.pluginName===z)J.push(Q);for(let Q of J)this.services.delete(Q);if(J.length>0)V().logger.info("service-registry",`Unregistered ${J.length} services from ${z}`)}listProviders(){let z=[];for(let[J,Q]of this.providers)for(let[W,Z]of Q)z.push({type:J,name:W,pluginName:Z.pluginName});return z}listServices(){return Array.from(this.services.entries()).map(([z,J])=>({pluginName:J.pluginName,serviceName:z.split(":").slice(1).join(":")}))}clear(){this.providers.clear(),this.providerOrder.clear(),this.defaults.clear(),this.services.clear()}}import{extname as g,relative as o,resolve as u}from"path";import{realpath as E}from"fs/promises";var n=["'self'","http://localhost:*","http://127.0.0.1:*","https://localhost:*","https://127.0.0.1:*","https://*.local.burdenoff.com","https://vibecontrols.com","https://*.vibecontrols.com","https://burdenoff.com","https://app.burdenoff.com","https://alphaapp.burdenoff.com"],D=!1;function w(){let z=process.env.VIBE_UI_FRAME_ANCESTORS?.trim(),J=z?z.split(/[\s,]+/).filter(Boolean):n;if(z&&!D&&(J.includes("*")||!J.includes("'self'")))D=!0,console.warn(`[ui-server] VIBE_UI_FRAME_ANCESTORS override does not include "'self'" or contains "*". This significantly weakens CSP frame-ancestors and is almost never intended. Override: ${z}`);return`frame-ancestors ${J.join(" ")}`}var l={".html":"text/html",".js":"application/javascript",".mjs":"application/javascript",".css":"text/css",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".map":"application/json",".wasm":"application/wasm"};function s(z){return l[g(z).toLowerCase()]||"application/octet-stream"}var b=`<script>
2
+ import{Sa as k}from"./index-9006n9tq.js";import{Eb as F,Fb as h,Gb as S,Hb as q,Jb as N,wb as f,zb as c}from"./index-rqq0k5fc.js";import{Vb as P}from"./index-pgew6sge.js";import{Od as V}from"./index-js1xn4sq.js";var U=["tunnel","session","ai","plan","gitops","security"];class m{providers=new Map;providerOrder=new Map;defaults=new Map;services=new Map;db;constructor(z){this.db=z}getDb(){return this.db}setProviderDefault(z,J){this.defaults.set(z,J)}clearProviderDefault(z,J){if(!J||this.defaults.get(z)===J)this.defaults.delete(z)}async hydrateDefaultsFromDb(){if(!this.db)return;for(let z of U)try{let J=await this.db.getConfig(`provider:default:${z}`);if(J)this.defaults.set(z,J)}catch{}}registerProvider(z,J,Q){if(!this.providers.has(z))this.providers.set(z,new Map),this.providerOrder.set(z,[]);let W=this.providers.get(z),Z=this.providerOrder.get(z);if(W.has(Q))V().logger.info("service-registry",`Updating ${z} provider from plugin '${Q}'`);else V().logger.info("service-registry",`Registered ${z} provider from plugin '${Q}'`);if(W.set(Q,{provider:J,pluginName:Q,registeredAt:new Date}),!Z.includes(Q))Z.push(Q)}getProvider(z){let J=this.providers.get(z);if(!J||J.size===0)return;let Q=this.defaults.get(z);if(Q&&J.has(Q))return J.get(Q).provider;let W=this.providerOrder.get(z);if(W&&W.length>0){let Z=W[0];return J.get(Z)?.provider}return}getProviderByName(z,J){let Q=this.providers.get(z);if(!Q)return;return Q.get(J)?.provider}hasProvider(z){let J=this.providers.get(z);return!!J&&J.size>0}unregisterProvider(z,J){let Q=this.providers.get(z);if(!Q)return!1;let W=Q.delete(J);if(W){let Z=this.providerOrder.get(z);if(Z){let X=Z.indexOf(J);if(X!==-1)Z.splice(X,1)}this.clearProviderDefault(z,J),V().logger.info("service-registry",`Unregistered ${z} provider from plugin '${J}'`)}return W}unregisterPlugin(z){for(let J of U)this.unregisterProvider(J,z);this.unregisterServices(z)}listProvidersForType(z){let J=this.providers.get(z);if(!J)return[];let Q=this.defaults.get(z);if(!Q||!J.has(Q)){let W=this.providerOrder.get(z);Q=W&&W.length>0?W[0]:void 0}return Array.from(J.keys()).map((W)=>({pluginName:W,isDefault:W===Q}))}registerService(z,J,Q){let W=`${z}:${J}`;this.services.set(W,{service:Q,pluginName:z}),V().logger.debug("service-registry",`Registered service '${W}'`)}getService(z,J){let Q=`${z}:${J}`;return this.services.get(Q)?.service}unregisterServices(z){let J=[];for(let[Q,W]of this.services)if(W.pluginName===z)J.push(Q);for(let Q of J)this.services.delete(Q);if(J.length>0)V().logger.info("service-registry",`Unregistered ${J.length} services from ${z}`)}listProviders(){let z=[];for(let[J,Q]of this.providers)for(let[W,Z]of Q)z.push({type:J,name:W,pluginName:Z.pluginName});return z}listServices(){return Array.from(this.services.entries()).map(([z,J])=>({pluginName:J.pluginName,serviceName:z.split(":").slice(1).join(":")}))}clear(){this.providers.clear(),this.providerOrder.clear(),this.defaults.clear(),this.services.clear()}}import{extname as g,relative as o,resolve as u}from"path";import{realpath as E}from"fs/promises";var n=["'self'","http://localhost:*","http://127.0.0.1:*","https://localhost:*","https://127.0.0.1:*","https://*.local.burdenoff.com","https://vibecontrols.com","https://*.vibecontrols.com","https://burdenoff.com","https://app.burdenoff.com","https://alphaapp.burdenoff.com"],D=!1;function w(){let z=process.env.VIBE_UI_FRAME_ANCESTORS?.trim(),J=z?z.split(/[\s,]+/).filter(Boolean):n;if(z&&!D&&(J.includes("*")||!J.includes("'self'")))D=!0,console.warn(`[ui-server] VIBE_UI_FRAME_ANCESTORS override does not include "'self'" or contains "*". This significantly weakens CSP frame-ancestors and is almost never intended. Override: ${z}`);return`frame-ancestors ${J.join(" ")}`}var l={".html":"text/html",".js":"application/javascript",".mjs":"application/javascript",".css":"text/css",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".map":"application/json",".wasm":"application/wasm"};function s(z){return l[g(z).toLowerCase()]||"application/octet-stream"}var b=`<script>
3
3
  window.__VIBE_AUTH__={apiKey:null};
4
4
  (function(){
5
5
  var p=new URLSearchParams(window.location.search);