@vibecontrols/agent 2026.601.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +558 -0
  3. package/dist/agent-config-85pskv43.js +2 -0
  4. package/dist/agent-ready-tracker-zp6p8e6f.js +2 -0
  5. package/dist/app-yvjadjmh.js +2 -0
  6. package/dist/bootstrap-workspace-zpm20zez.js +2 -0
  7. package/dist/bootstrap.service-pjmnpxha.js +2 -0
  8. package/dist/bridge-client-341r9rry.js +2 -0
  9. package/dist/cli.js +5 -0
  10. package/dist/daemon-profile-vas1vf2t.js +2 -0
  11. package/dist/esm-9fpye77x.js +2 -0
  12. package/dist/finalize-retry-handle-registry-vv241fsq.js +2 -0
  13. package/dist/finalize-retry-worker-xp1nhv3c.js +2 -0
  14. package/dist/gateway-client-43gzvj5s.js +2 -0
  15. package/dist/getMachineId-bsd-a56s0v8c.js +2 -0
  16. package/dist/getMachineId-darwin-w9k0yw9r.js +3 -0
  17. package/dist/getMachineId-linux-anh31jbf.js +2 -0
  18. package/dist/getMachineId-unsupported-5hv3pwca.js +2 -0
  19. package/dist/getMachineId-win-njb8tery.js +2 -0
  20. package/dist/highlights-8d9mgr01.js +2 -0
  21. package/dist/highlights-eq9cgrbb.scm +604 -0
  22. package/dist/highlights-ghv9g403.scm +205 -0
  23. package/dist/highlights-hk7bwhj4.scm +284 -0
  24. package/dist/highlights-jwvdxm9x.js +2 -0
  25. package/dist/highlights-qbx2vnme.js +2 -0
  26. package/dist/highlights-r3m83kn9.js +2 -0
  27. package/dist/highlights-r812a2qc.scm +150 -0
  28. package/dist/highlights-s7mqapt6.js +2 -0
  29. package/dist/highlights-x6tmsnaa.scm +115 -0
  30. package/dist/index-01qzsnwd.js +16 -0
  31. package/dist/index-0248afsn.js +3 -0
  32. package/dist/index-04n4qgvd.js +407 -0
  33. package/dist/index-0ckffygp.js +5 -0
  34. package/dist/index-0cn9bv8z.js +4 -0
  35. package/dist/index-1hnw0rhc.js +178 -0
  36. package/dist/index-1zw3kea7.js +10 -0
  37. package/dist/index-2gsarrbn.js +4 -0
  38. package/dist/index-2xs9cvjn.js +28 -0
  39. package/dist/index-3ys16efc.js +231 -0
  40. package/dist/index-4wgjx8bf.js +3 -0
  41. package/dist/index-52cp759f.js +3 -0
  42. package/dist/index-5mw3eshk.js +4 -0
  43. package/dist/index-678rwfc0.js +5 -0
  44. package/dist/index-6jq17k9s.js +7 -0
  45. package/dist/index-6jzsthh9.js +3 -0
  46. package/dist/index-6mprnf7p.js +9 -0
  47. package/dist/index-8kvc8ttn.js +15 -0
  48. package/dist/index-8sm0nkh8.js +3 -0
  49. package/dist/index-9bqd8veb.js +21 -0
  50. package/dist/index-b5dhmybd.js +4 -0
  51. package/dist/index-c58g96mb.js +26 -0
  52. package/dist/index-cs78wq6y.js +3 -0
  53. package/dist/index-d5ysy1yn.js +3 -0
  54. package/dist/index-dm6yjmgq.js +3 -0
  55. package/dist/index-e1bw1bwr.js +4 -0
  56. package/dist/index-ef95xr4z.js +9 -0
  57. package/dist/index-g2raeeh4.js +11 -0
  58. package/dist/index-g3ap3xpr.js +5 -0
  59. package/dist/index-g8zv1gta.js +17 -0
  60. package/dist/index-h8a8s8sn.js +3 -0
  61. package/dist/index-hrdamx5j.js +2 -0
  62. package/dist/index-jw1k4vbk.js +3 -0
  63. package/dist/index-mtm8cfyt.js +158 -0
  64. package/dist/index-mxc61yr1.js +3 -0
  65. package/dist/index-n7qyrdr1.js +3 -0
  66. package/dist/index-qfz9fy56.js +3 -0
  67. package/dist/index-rc79x8fw.js +3 -0
  68. package/dist/index-rdp5xq4r.js +15 -0
  69. package/dist/index-scsjyj4m.js +171 -0
  70. package/dist/index-ssjmzqcz.js +13 -0
  71. package/dist/index-tmrbs96r.js +11 -0
  72. package/dist/index-tp4y9jde.js +83 -0
  73. package/dist/index-v9fx5wab.js +83 -0
  74. package/dist/index-vdahdt49.js +2 -0
  75. package/dist/index-x1h8r7pr.js +3 -0
  76. package/dist/index-xjzmb1pn.js +3 -0
  77. package/dist/index-yrgm89r8.js +3 -0
  78. package/dist/index-yy1mm8zs.js +3 -0
  79. package/dist/index-z5a4yxzz.js +8 -0
  80. package/dist/index.js +5 -0
  81. package/dist/injections-73j83es3.scm +27 -0
  82. package/dist/injections-srewsjcz.js +2 -0
  83. package/dist/interactive-22ta89hc.js +2 -0
  84. package/dist/key.cmd-wgcq6kt8.js +2 -0
  85. package/dist/log-shipper-k24m8yw5.js +2 -0
  86. package/dist/path-utils-35re7qf9.js +2 -0
  87. package/dist/plugin-system-c916v9an.js +2 -0
  88. package/dist/postinstall-shim-fix.cjs +382 -0
  89. package/dist/prereqs-runner-ca4kt803.js +2 -0
  90. package/dist/preuninstall.cjs +254 -0
  91. package/dist/profile-mount-npcknw6v.js +2 -0
  92. package/dist/prune-stale-shims-nkx9vq5m.js +2 -0
  93. package/dist/register-core-qrawzyym.js +2 -0
  94. package/dist/secondary-profile-attach-db5cr3e1.js +2 -0
  95. package/dist/subprocess-g9sk1ep9.js +2 -0
  96. package/dist/telemetry-tnq47dcs.js +2 -0
  97. package/dist/tree-sitter-javascript-3h25c6bs.js +2 -0
  98. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  99. package/dist/tree-sitter-markdown-3nemcjhe.js +2 -0
  100. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  101. package/dist/tree-sitter-markdown_inline-16ftwa53.js +2 -0
  102. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  103. package/dist/tree-sitter-typescript-f6mq6ze6.js +2 -0
  104. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  105. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  106. package/dist/tree-sitter-zig-s2trkm2d.js +2 -0
  107. package/dist/tunnel-bootstrap-2kg79ng8.js +2 -0
  108. package/package.json +122 -0
@@ -0,0 +1,26 @@
1
+ // @bun
2
+ import{o as K4,q as Z4}from"./index-n7qyrdr1.js";import{u as s4,v as O5,w as j5}from"./index-1hnw0rhc.js";import{E as V4}from"./index-6jzsthh9.js";import{$ as y4,Q as E5,aa as _2,ba as U0,ca as P4,da as c4,ea as n4,fa as f4,ha as C2,ia as p2,ja as i2,ka as I2}from"./index-g8zv1gta.js";import{la as C5,qa as I5,sa as E0}from"./index-qfz9fy56.js";import{va as b2}from"./index-ssjmzqcz.js";import{wa as F5,xa as U5,ya as x5,za as M5}from"./index-tp4y9jde.js";import{Aa as L5}from"./index-4wgjx8bf.js";import{Ja as T0,Wa as T5}from"./index-g3ap3xpr.js";import{Xa as N2}from"./index-0ckffygp.js";import{ab as v2}from"./index-rc79x8fw.js";import{eb as Q5,fb as W5,gb as z5,hb as H5,ib as G5,jb as J2,kb as B5,lb as V5,mb as K5,nb as _5,pb as N5}from"./index-v9fx5wab.js";import{Ab as n0,Eb as x2,Fb as Y0,Gb as Z5,Hb as J5,Ib as j0,Jb as M2,Kb as m,Lb as l,Mb as l4,Nb as d4,Ob as X5,Pb as Y5,tb as p0,ub as h2,vb as l0,wb as X0,xb as d0,yb as $5}from"./index-01qzsnwd.js";import{Tb as z,Ub as D}from"./index-04n4qgvd.js";import{md as t0,nd as s,od as g0,pd as f2,qd as D2}from"./index-g2raeeh4.js";import{Cd as n2,Hd as g,Jd as M0,Kd as b,Ld as a,Nd as G,Od as W0,vd as x0,wd as r4,xd as t4,yd as e4,zd as B2}from"./index-9bqd8veb.js";import{Rd as s0,Sd as H0,Ud as P2,Vd as r0,Xd as E2,Yd as d,_d as S2,ae as T2,be as K2,ce as d2}from"./index-0cn9bv8z.js";import{ee as h0,he as f}from"./index-yy1mm8zs.js";var A0=typeof new Headers()?.toJSON==="function",A5=($)=>{if(A0)return Object.keys($.toJSON()).join(", ");let Z="",Q=0;return $.forEach((Y,X)=>{if(Q)Z=Z+", "+X;else Z=X;Q++}),Z},w0=($)=>{let{aot:Z=!0,origin:Q=!0,methods:Y=!0,allowedHeaders:X=!0,exposeHeaders:J=!0,credentials:W=!0,maxAge:H=5,preflight:B=!0}=$??{};if(Array.isArray(X))X=X.join(", ");if(Array.isArray(J))J=J.join(", ");let K=typeof Q==="boolean"?void 0:Array.isArray(Q)?Q:[Q],N=new D({name:"@elysiajs/cors",seed:$,aot:Z}),I=K?.some((F)=>F==="*"),C={};if(K){for(let F of K)if(typeof F==="string")C[F]=!0}let U=(F,T,x)=>{if(Array.isArray(F))return F.some((R)=>U(R,T,x));switch(typeof F){case"string":if(x in C)return!0;let R=x.indexOf("://");if(R!==-1)x=x.slice(R+3);return F===x;case"function":return F(T)===!0;case"object":if(F instanceof RegExp)return F.test(x)}return!1},V=(F,T)=>{if(Q===!0){F.headers.vary="*",F.headers["access-control-allow-origin"]=T.headers.get("Origin")||"*";return}if(I){F.headers.vary="*",F.headers["access-control-allow-origin"]="*";return}if(!K?.length)return;if(K.length){let x=T.headers.get("Origin")??"";for(let R=0;R<K.length;R++)if(U(K[R],T,x)===!0){F.headers.vary=Q?"Origin":"*",F.headers["access-control-allow-origin"]=x||"*";return}}F.headers.vary="Origin"},E=(F,T)=>{if(!T)return;if(Y===!0)return F.headers["access-control-allow-methods"]=T??"*";if(Y===!1||!Y?.length)return;if(Y==="*")return F.headers["access-control-allow-methods"]="*";if(!Array.isArray(Y))return F.headers["access-control-allow-methods"]=Y;F.headers["access-control-allow-methods"]=Y.join(", ")},q={};if(typeof J==="string")q["access-control-expose-headers"]=J;if(typeof X==="string")q["access-control-allow-headers"]=X;if(W===!0)q["access-control-allow-credentials"]="true";N.headers(q);function h({set:F,request:T,headers:x}){if(V(F,T),E(F,T.headers.get("access-control-request-method")),X===!0||J===!0){if(X===!0)F.headers["access-control-allow-headers"]=x["access-control-request-headers"];if(J===!0)F.headers["access-control-expose-headers"]=Object.keys(x).join(",")}if(H)F.headers["access-control-max-age"]=H.toString();return new Response(null,{status:204})}if(B)N.options("/",h).options("/*",h);return N.onRequest(function({set:T,request:x}){if(V(T,x),B&&x.method==="OPTIONS")return h({set:T,request:x,headers:A0?x.headers.toJSON():Object.fromEntries(x.headers.entries())});if(E(T,x.method),X===!0||J===!0){let R=A5(x.headers);if(X===!0)T.headers["access-control-allow-headers"]=R;if(J===!0)T.headers["access-control-expose-headers"]=R}})};import{createHash as S0}from"crypto";var X2="idempotency",w5=300000,k0=1e4,A2=new Map;function k5($,Z,Q,Y){return S0("sha256").update(`${$}|${Z}|${Q}|${Y}`).digest("hex")}async function S5($,Z){let Q=await $.getPluginState(X2,Z);if(!Q)return null;try{let Y=JSON.parse(Q);if(Y.expiresAt<Date.now())return await $.deletePluginState(X2,Z),null;return Y}catch{return null}}async function D5($,Z,Q){await $.setPluginState(X2,Z,JSON.stringify(Q))}async function h5($){let Z=await $.getAllPluginState(X2),Q=Date.now(),Y=0,X=[];for(let J of Z)try{if(JSON.parse(J.value).expiresAt<Q)await $.deletePluginState(X2,J.key),Y+=1;else X.push({key:J.key,updatedAt:J.updatedAt})}catch{await $.deletePluginState(X2,J.key),Y+=1}if(X.length>k0){X.sort((W,H)=>(W.updatedAt??"").localeCompare(H.updatedAt??""));let J=X.slice(0,X.length-k0);for(let W of J)await $.deletePluginState(X2,W.key),Y+=1}if(Y>0)G().logger.info("idempotency",`Swept ${Y} expired/over-cap entries`)}var Q0=null,v5=600000;function P5($){if(Q0)return;Q0=setInterval(()=>{let Z=$.getDb();if(!Z)return;h5(Z).catch((Q)=>{G().logger.warn("idempotency","Sweep failed",{error:String(Q)})})},v5),Q0.unref?.()}function D0($){return P5($),new D({name:"plugin/idempotency"}).onBeforeHandle(async({request:Z,path:Q,set:Y,store:X})=>{if(Z.method!=="POST"&&Z.method!=="PUT")return;let J=Z.headers.get("x-idempotency-key")??Z.headers.get("X-Idempotency-Key");if(!J)return;if(J.length<8||J.length>200)return Y.status=400,{error:"X-Idempotency-Key must be 8\u2013200 chars",code:"BAD_REQUEST"};let W=$.getDb();if(!W)return;let H="no-body";try{let E=await Z.clone().text();H=S0("sha256").update(E).digest("hex")}catch{}let B=k5(Z.method,Q,J,H),K=await S5(W,B);if(K){Y.status=K.status;let V=Y.headers??={};V["Content-Type"]=K.contentType,V["X-Idempotency-Replay"]="true",X.__idemReplay=K.body;try{return JSON.parse(K.body)}catch{return K.body}}let N=A2.get(B);if(N){let V=await N.catch(()=>null);if(V){Y.status=V.status;let E=Y.headers??={};E["Content-Type"]=V.contentType,E["X-Idempotency-Replay"]="true",X.__idemReplay=V.body;try{return JSON.parse(V.body)}catch{return V.body}}}let I,C,U=new Promise((V,E)=>{I=V,C=E});A2.set(B,U),X.__idemKey=B,X.__idemResolve=I,X.__idemReject=C}).onAfterHandle(async({response:Z,set:Q,store:Y})=>{let X=Y.__idemKey;if(!X)return;let J=Y.__idemResolve,W=$.getDb(),H=Q.status??200,B=typeof Z==="string"?Z:JSON.stringify(Z),N=Q.headers?.["Content-Type"]??"application/json",I={status:H,body:B,contentType:N,expiresAt:Date.now()+w5},C=H>=200&&H<300;try{if(W&&C)await D5(W,X,I)}catch(U){G().logger.warn("idempotency","Failed to persist response",{error:String(U)})}finally{try{J?.(C?I:null)}catch{}A2.delete(X)}}).onError(({store:Z})=>{let Q=Z.__idemKey;if(!Q)return;let Y=Z.__idemReject;try{Y?.(Error("idempotency: handler errored"))}catch{}A2.delete(Q)}).as("global")}import c from"os";import{readFileSync as s5}from"fs";import{join as r5}from"path";var v0={enabled:!1,async scrape(){return`# vibecontrols agent metrics disabled (OTel SDK not initialised)
3
+ `},recordHttpRequest(){},setPluginsLoaded(){}},$2=null,w2=null;async function k2($){if($2)return $2;if(w2)return w2;return w2=(async()=>{try{let{MeterProvider:Z}=await import("./index-hrdamx5j.js").then((m)=>h0(m.default,1)),{PrometheusExporter:Q,PrometheusSerializer:Y}=await import("./index-1zw3kea7.js").then((m)=>h0(m.default,1)),X=new Q({preventServerStart:!0}),J=new Y,H=new Z({readers:[X]}).getMeter("vibecontrols-agent"),B=H.createGauge("vibecontrols_agent_info",{description:"Static info about the agent process; value is always 1."});H.createObservableGauge("vibecontrols_agent_uptime_seconds",{description:"Process uptime in seconds."}).addCallback((V)=>{V.observe(process.uptime())});let N=H.createCounter("vibecontrols_http_requests_total",{description:"Total HTTP requests handled by the agent, labelled by method, route, status."}),I={};H.createObservableGauge("vibecontrols_plugins_loaded",{description:"Plugins loaded by the agent, broken down by status (loaded, failed, etc.)."}).addCallback((V)=>{for(let[E,q]of Object.entries(I))V.observe(q,{status:E})}),B.record(1,{version:$?.version??"unknown",profile:$?.profile??"default"});let U={enabled:!0,async scrape(){let V=await X.collect();if(!V.resourceMetrics)return"";return J.serialize(V.resourceMetrics)},recordHttpRequest(V,E,q){N.add(1,{method:V,route:E,status:String(q)})},setPluginsLoaded(V){I={...V}}};return $2=U,G().logger.info("metrics","OTel Prometheus registry initialised"),U}catch(Z){return G().logger.warn("metrics","Failed to initialise OTel metrics; /metrics will return a stub body",{error:Z instanceof Error?Z.message:String(Z)}),$2=v0,v0}})(),w2}function P0($,Z,Q){if(!$2)return;$2.recordHttpRequest($,Z,Q)}function f0($){if(!$2)return;$2.setPluginsLoaded($)}var f5=new Set(["127.0.0.1","::1"]),b0=!1;function b5(){if(b0)return;if(process.env.METRICS_ANONYMOUS_LOCALHOST==="true")b0=!0,G().logger.warn("metrics","METRICS_ANONYMOUS_LOCALHOST=true \u2014 /metrics is open to TCP loopback peers without an API key. Prefer issuing a scoped API key for your scraper.")}function y5($){let Z=$.replace(/^\[|\]$/g,"");if(Z.startsWith("::ffff:"))return Z.slice(7);return Z}function $0($,Z){let Q=Z?.requestIP($)?.address;if(!Q)return!1;return f5.has(y5(Q))}function y0(){return b5(),new D({name:"routes/metrics"}).get("/metrics",async({request:$,server:Z,set:Q})=>{if(!(process.env.METRICS_ANONYMOUS_LOCALHOST==="true"&&$0($,Z))){let W=m(Object.fromEntries($.headers.entries()));if(!l(W))return Q.status=401,Q.headers["content-type"]="application/json",JSON.stringify({error:"Unauthorized",message:"Invalid or missing API key"})}let J=await(await k2()).scrape();return Q.headers["content-type"]="text/plain; version=0.0.4; charset=utf-8",J})}import{randomBytes as c5,timingSafeEqual as u5}from"crypto";import{chmodSync as m5,existsSync as c0,mkdirSync as g5,readFileSync as p5,unlinkSync as l5,writeFileSync as d5}from"fs";import{dirname as n5,join as i5}from"path";var Y2=null;function u0(){return i5(S2(),"pairing-token")}function o5(){return c5(32).toString("base64url")}function a5($,Z){let Q=Buffer.from($),Y=Buffer.from(Z);if(Q.length!==Y.length)return!1;try{return u5(Q,Y)}catch{return!1}}function X6(){if(Y2)return Y2;let $=u0();try{if(c0($)){let Q=p5($,"utf8").trim();if(Q.length>=32)return Y2=Q,Q}}catch{}let Z=o5();try{g5(n5($),{recursive:!0}),d5($,Z,{encoding:"utf8"});try{m5($,384)}catch{}}catch(Q){}return Y2=Z,Z}function Z0($){if(!$)return!1;if(!Y2)return!1;return a5($,Y2)}function m0(){Y2=null;try{let $=u0();if(c0($))l5($)}catch{}}function J0($){return $["x-pairing-token"]??$["X-Pairing-Token"]??null}function t5(){let $=c.hostname(),Z=c.platform(),Q=c.arch(),Y=new Bun.CryptoHasher("sha256");return Y.update(`${$}-${Z}-${Q}`),Y.digest("hex").substring(0,16)}function e5(){for(let $ of["..","../.."])try{let Z=r5(import.meta.dir,$,"package.json"),Y=JSON.parse(s5(Z,"utf8")).version;if(Y)return Y}catch{}return"0.0.0"}async function QQ($){let Z=[],Q=$.getProvider("tunnel");if(Q)Z.push(Q);for(let Y of $.listProvidersForType("tunnel")){let X=$.getProviderByName("tunnel",Y.pluginName);if(X&&!Z.includes(X))Z.push(X)}for(let Y of Z){if(!Y.getActiveTunnelUrl)continue;let X=await Y.getActiveTunnelUrl();if(X)return X}return null}function i0({serviceRegistry:$,runFinalize:Z,getDb:Q}){let Y=e5(),X=t5();return new D({prefix:"/api/agent"}).get("/identity",()=>({hostname:c.hostname(),platform:c.platform(),architecture:c.arch(),agentVersion:Y,agentInstanceId:g0()})).get("/version",()=>({version:Y,runtime:"bun",runtimeVersion:typeof Bun<"u"?Bun.version:"unknown"})).get("/api-key",({request:J,server:W,set:H})=>{if(!$0(J,W)){let K=m(Object.fromEntries(J.headers.entries()));if(!l(K))return H.status=401,{error:"Unauthorized",message:"Invalid or missing API key"}}return{apiKey:M2()}}).post("/iframe-token",({body:J,request:W,set:H})=>{let B=m(Object.fromEntries(W.headers.entries()));if(!l(B))return H.status=401,{error:"Unauthorized",message:"Invalid or missing API key"};try{if(Array.isArray(J.pathPrefixes)&&J.pathPrefixes.length>0)return l0({pathPrefixes:J.pathPrefixes,methods:J.methods},J.ttlSeconds??void 0);if(!J.pathPrefix)return H.status=400,{error:"BadRequest",message:"Provide either pathPrefix (string) or pathPrefixes (string[])"};return h2(J.pathPrefix,J.ttlSeconds??void 0)}catch(K){return H.status=400,{error:"BadRequest",message:K instanceof Error?K.message:String(K)}}},{body:z.Object({pathPrefix:z.Optional(z.String({minLength:1})),pathPrefixes:z.Optional(z.Array(z.String({minLength:1}),{minItems:1,maxItems:16})),methods:z.Optional(z.Array(z.String({minLength:1}),{minItems:1,maxItems:8})),ttlSeconds:z.Optional(z.Number())})}).post("/terminal-exchange",({body:J,set:W})=>{let{sid:H,token:B}=J;if(!H||!B)return W.status=400,{error:"BadRequest",message:"sid and token required"};if(!p0(H))return W.status=400,{error:"BadRequest",message:"invalid sid"};let K=`/terminal/${H}`,N=d0(B,K);if(!N.ok)return G().logger.warn("terminal-exchange","iframe token rejected",{sid:H,reason:N.reason}),W.status=401,{error:"Unauthorized",message:"invalid iframe token",code:N.reason==="expired"?"expired":N.reason==="replayed"?"replayed":"invalid"};let I=n0(H,600),C=`vt_term_${H}`;return W.headers["set-cookie"]=`${C}=${I.token}; HttpOnly; Secure; SameSite=None; Path=/terminal/${H}; Max-Age=600`,W.status=204,null},{body:z.Object({sid:z.String({minLength:1}),token:z.String({minLength:1})})}).post("/ui-exchange",({body:J,set:W})=>{let{plugin:H,token:B}=J;if(!H||!B)return W.status=400,{error:"BadRequest",message:"plugin and token required"};if(!x2(H))return W.status=400,{error:"BadRequest",message:"invalid plugin name"};let K=`/ui/${H}`;if(!X0(B,K))return W.status=401,{error:"Unauthorized",message:"invalid iframe token"};let N=Y0(H,600),I=`vt_ui_${H}`;return W.headers["set-cookie"]=`${I}=${N.token}; HttpOnly; Secure; SameSite=None; Path=/ui/${H}/; Max-Age=600`,W.status=204,null},{body:z.Object({plugin:z.String({minLength:1}),token:z.String({minLength:1})})}).post("/ui-exchange-plugin",({body:J,set:W})=>{let{plugin:H,token:B}=J;if(!H||!B)return W.status=400,{error:"BadRequest",message:"plugin and token required"};if(!x2(H))return W.status=400,{error:"BadRequest",message:"invalid plugin name"};if(![`/api/plugins/${H}/ui`,`/${H}`].find((U)=>X0(B,U)))return W.status=401,{error:"Unauthorized",message:"invalid iframe token"};let I=Y0(H,600),C=`vt_ui_${H}`;return W.headers["set-cookie"]=`${C}=${I.token}; HttpOnly; Secure; SameSite=None; Path=/api/plugins/${H}/ui/; Max-Age=600`,W.status=204,null},{body:z.Object({plugin:z.String({minLength:1}),token:z.String({minLength:1})})}).get("/system",({request:J,set:W})=>{let H=m(Object.fromEntries(J.headers.entries()));if(!l(H))return W.status=401,{error:"Unauthorized",message:"Invalid or missing API key"};return{machineId:X,hostname:c.hostname(),platform:c.platform(),arch:c.arch(),release:c.release(),cpus:c.cpus().length,totalMemory:c.totalmem(),freeMemory:c.freemem(),uptime:c.uptime(),bunVersion:typeof Bun<"u"?Bun.version:void 0,agentVersion:Y,homeDir:c.homedir(),cwd:process.cwd(),environment:"production"}}).get("/tunnel",async({request:J,set:W})=>{let H=Object.fromEntries(J.headers.entries()),B=l(m(H)),K=Z0(J0(H));if(!B&&!K)return W.status=401,{error:"Unauthorized",message:"Provide x-agent-api-key OR x-pairing-token to read tunnel URL"};let N=await QQ($);if(!N)return{tunnelUrl:null,message:"No tunnel provider registered"};return{tunnelUrl:N}}).get("/status",()=>{let J=["tunnel","session","ai"].filter((W)=>$.hasProvider(W));return{state:G().getBootState(),status:G().getBootState(),version:Y,providers:J,timestamp:new Date().toISOString()}}).get("/gateway-auth",()=>({configured:g.isConfigured(),config:v2(g.getConfig()),state:G().getBootState()})).post("/retry-config",async({set:J})=>{let{getFinalizeRetryHandle:W}=await import("./finalize-retry-handle-registry-vv241fsq.js"),H=W();if(!H)return J.status=409,{ok:!1,error:"No finalize retry worker is active. The agent either never had cached credentials to retry with, or it already reached the ready state."};let B=await H.forceRetryNow();if(!B.ok)J.status=503;return{ok:B.ok,error:B.ok?void 0:B.error,state:G().getBootState(),worker:H.getState()}}).post("/gateway-auth",async({body:J,request:W,set:H})=>{let B=G().getBootState(),K=Object.fromEntries(W.headers.entries());if(B==="ready"){let F=m(K);if(!l(F))return H.status=401,{success:!1,state:B,error:"Unauthorized: API key required to reconfigure"}}else{let F=m(K),T=J0(K),x=l(F),R=Z0(T);if(!x&&!R)return H.status=401,{success:!1,state:B,error:"Unauthorized: provide x-agent-api-key OR x-pairing-token for bootstrap"}}let{clientId:N,clientSecret:I,workspaceId:C,globalGatewayUrl:U,workspaceGatewayUrl:V}=J;if(!N||!I||!C||!U||!V)return H.status=400,{success:!1,state:G().getBootState(),error:"clientId, clientSecret, workspaceId, globalGatewayUrl, and workspaceGatewayUrl are required"};let E,q;try{E=B2(U,"globalGatewayUrl"),q=B2(V,"workspaceGatewayUrl")}catch(F){return H.status=400,{success:!1,state:G().getBootState(),error:F instanceof Error?F.message:String(F)}}{let F=b()??G();try{await D2({clientId:N,clientSecret:I,workspaceId:C,ownerUserId:J.ownerUserId,organizationId:J.organizationId,globalGatewayUrl:E,workspaceGatewayUrl:q,agentRecordId:J.agentRecordId,scopes:J.scopes,...J.storageAdapter?{storageAdapter:J.storageAdapter}:{},...J.storageOptions?{storageOptions:J.storageOptions}:{},...J.dbPath?{dbPath:J.dbPath}:{}},{dir:F.dataDir,scope:F.name})}catch(T){return H.status=500,{success:!1,state:G().getBootState(),error:`Failed to persist gateway credentials to secrets backend: ${T instanceof Error?T.message:String(T)}`}}}let h=G().getBootState();if(h==="ready"){let F=Q();if(F){if(await F.setConfig("gateway-auth:clientId",N),await F.setConfig("gateway-auth:clientSecret",I),await F.setConfig("gateway-auth:workspaceId",C),J.organizationId)await F.setConfig("gateway-auth:organizationId",J.organizationId);if(await F.setConfig("gateway-auth:globalGatewayUrl",E),await F.setConfig("gateway-auth:workspaceGatewayUrl",q),J.agentRecordId)await F.setConfig("gateway-auth:agentRecordId",J.agentRecordId)}g.configure({globalGatewayUrl:E,workspaceGatewayUrl:q,clientId:N,clientSecret:I,workspaceId:C,organizationId:J.organizationId}),G().logger.info("preconfig","Gateway credentials re-configured (agent was already ready)");let T=!!(J.storageAdapter||J.storageOptions||J.dbPath);return{success:!0,state:h,message:T?"Gateway auth re-configured. Restart the agent (vibe restart) to apply the new storage configuration.":"Gateway auth re-configured"}}return G().logger.info("preconfig","Gateway credentials received \u2014 beginning finalize (background)"),m0(),Z({clientId:N,clientSecret:I,workspaceId:C,organizationId:J.organizationId,globalGatewayUrl:E,workspaceGatewayUrl:q},{agentRecordId:J.agentRecordId,scopes:J.scopes}).catch((F)=>{G().logger.error("preconfig","Background finalize threw",{error:F instanceof Error?F.message:String(F)})}),H.status=202,{success:!0,state:G().getBootState(),agentRecordId:J.agentRecordId,message:"Gateway credentials accepted; finalize is running in the background. Poll /health/ready for completion."}},{body:z.Object({clientId:z.Optional(z.String()),clientSecret:z.Optional(z.String()),workspaceId:z.Optional(z.String()),ownerUserId:z.Optional(z.String()),organizationId:z.Optional(z.String()),globalGatewayUrl:z.Optional(z.String()),workspaceGatewayUrl:z.Optional(z.String()),scopes:z.Optional(z.Array(z.String())),agentRecordId:z.Optional(z.String()),storageAdapter:z.Optional(z.String()),storageOptions:z.Optional(z.Record(z.String(),z.String())),dbPath:z.Optional(z.String())})})}import{existsSync as e,mkdirSync as $Q,rmSync as o0,readdirSync as e0}from"fs";import{join as y2}from"path";function o($){return y2(K2(),"agents",d($))}function ZQ(){let $=y2(K2(),"agents");if(!e($))return[];return e0($,{withFileTypes:!0}).filter((Z)=>Z.isDirectory()).map((Z)=>Z.name).filter((Z)=>/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(Z))}function Q4($){return y2(K2(),"agents",d($))}function z0($){return s({dir:Q4($)})}function a0($,Z){return f2(Z,{dir:Q4($),scope:d($)})}function V2($){let Z=P2(),Q=H0().find((J)=>J.name===$),Y=a.get($),X={name:$,isDefault:$===Z,isRunning:Q?.status==="running",attached:Y!==void 0,bootState:Y?Y.getBootState():null,dataDir:Y?Y.dataDir:null};if(Q)X.port=Q.port,X.pid=Q.pid,X.startTime=Q.startTime;if(e(o($)))X.config=v2(z0($));return X}function $4($={}){let Z=$.serviceManagerFactory?$.serviceManagerFactory():new b2;return new D({prefix:"/api/profiles"}).get("/",()=>{let Q=ZQ(),Y=P2(),X=new Set(Q);return X.add(Y),[...X].sort().map((J)=>V2(J))}).post("/",async({body:Q,set:Y})=>{try{let X=d(Q.name),J=o(X);if(e(J))return Y.status=409,{error:"exists",message:`Profile '${X}' already exists.`};let W;if(Q.copyFrom){let H=d(Q.copyFrom);if(!e(o(H)))return Y.status=400,{error:"copy-source-missing",message:`Profile '${H}' does not exist.`};W=z0(H),delete W["static-api-key"],delete W.agentRecordId,delete W.apiKeys}else W=t0();if(Q.gatewayUrl)W.globalGatewayUrl=Q.gatewayUrl;if(Q.workspaceGatewayUrl)W.workspaceGatewayUrl=Q.workspaceGatewayUrl;if(Q.clientId)W.clientId=Q.clientId;if(Q.clientSecret)W.clientSecret=Q.clientSecret;if(Q.workspaceId)W.workspaceId=Q.workspaceId;if(Q.organizationId)W.organizationId=Q.organizationId;$Q(J,{recursive:!0}),a0(X,W);try{W0(X)}catch(H){G().logger.warn("profile-mgmt",`In-process attach failed for '${X}'`,{error:String(H)})}if(G().logger.info("profile-mgmt",`Created profile '${X}' at ${J}`),Q.start){let H={name:X,port:Q.port??0,daemon:!0,dbPath:T2(),profile:X};await Z.startDaemon(H)}return Y.status=201,V2(X)}catch(X){return Y.status=400,{error:"create-failed",message:X instanceof Error?X.message:String(X)}}},{body:z.Object({name:z.String(),gatewayUrl:z.Optional(z.String()),workspaceGatewayUrl:z.Optional(z.String()),clientId:z.Optional(z.String()),clientSecret:z.Optional(z.String()),workspaceId:z.Optional(z.String()),organizationId:z.Optional(z.String()),copyFrom:z.Optional(z.String()),start:z.Optional(z.Boolean()),port:z.Optional(z.Number())})}).get("/:name",({params:Q,set:Y})=>{try{let X=d(Q.name);if(!e(o(X)))return Y.status=404,{error:"not-found",message:`No profile '${X}'.`};return V2(X)}catch(X){return Y.status=400,{error:"bad-request",message:X instanceof Error?X.message:String(X)}}},{params:z.Object({name:z.String()})}).put("/:name",({params:Q,body:Y,set:X})=>{try{let J=d(Q.name);if(!e(o(J)))return X.status=404,{error:"not-found",message:`No profile '${J}'.`};let W=["static-api-key","apiKeys","agentRecordId"];for(let K of W)if(K in Y)return X.status=400,{error:"forbidden-field",message:`Field '${K}' is managed via dedicated commands (vibe key rotate / vibe profile create). It cannot be patched here.`};if("registry"in Y)return X.status=400,{error:"forbidden-field",message:"Field 'registry' cannot be patched via this endpoint. Use POST /api/agent/registry with operator confirmation (VIBE_ALLOW_REGISTRY_CHANGE=1) so the change is auditable."};let B={...z0(J),...Y};return a0(J,B),V2(J)}catch(J){return X.status=400,{error:"update-failed",message:J instanceof Error?J.message:String(J)}}},{params:z.Object({name:z.String()}),body:z.Record(z.String(),z.Any())}).delete("/:name",async({params:Q,body:Y,query:X,set:J})=>{try{let W=d(Q.name);if(W===P2())return J.status=409,{error:"is-default",message:`Cannot delete active default profile '${W}'. Switch to another profile first.`};let H=X?.purge==="true"||X?.purge==="1",B=e(o(W)),K=a.has(W);if(!B&&!K)return J.status=404,{error:"not-found",message:`No profile '${W}'.`};if(B&&!H&&!Y?.confirm)return J.status=400,{error:"confirm-required",message:"Pass { confirm: true } in the body or `?purge=true` in the query to delete the on-disk dataDir (destructive)."};try{await Z.stop(W)}catch{}try{await a.destroy(W)}catch(N){G().logger.warn("profile-mgmt",`In-process detach failed for '${W}'`,{error:String(N)})}if(B)if(Y?.keepConfig)for(let N of e0(o(W))){if(N==="config.json")continue;o0(y2(o(W),N),{recursive:!0,force:!0})}else o0(o(W),{recursive:!0,force:!0});return G().logger.info("profile-mgmt",`Deleted profile '${W}'`),{ok:!0,deleted:W,keptConfig:!!Y?.keepConfig,detached:K,purged:B}}catch(W){return J.status=400,{error:"delete-failed",message:W instanceof Error?W.message:String(W)}}},{params:z.Object({name:z.String()}),query:z.Optional(z.Object({purge:z.Optional(z.String())})),body:z.Optional(z.Object({confirm:z.Optional(z.Boolean()),keepConfig:z.Optional(z.Boolean())}))}).post("/:name/switch",async({params:Q,set:Y})=>{try{let X=d(Q.name);if(!e(o(X)))return Y.status=404,{error:"not-found",message:`No profile '${X}'.`};return await s0(()=>r0(X)),G().logger.info("profile-mgmt",`Default profile switched to '${X}'`),{ok:!0,defaultProfile:X}}catch(X){return Y.status=400,{error:"switch-failed",message:X instanceof Error?X.message:String(X)}}},{params:z.Object({name:z.String()})}).post("/:name/start",async({params:Q,body:Y,set:X})=>{try{let J=d(Q.name);if(!e(o(J)))return X.status=404,{error:"not-found",message:`No profile '${J}'.`};try{W0(J)}catch(H){G().logger.warn("profile-mgmt",`In-process attach failed for '${J}'`,{error:String(H)})}if(!H0().some((H)=>H.name===J&&H.status==="running")){let H={name:J,port:Y?.port??0,daemon:!0,dbPath:T2(),profile:J};await Z.startDaemon(H)}return V2(J)}catch(J){return X.status=500,{error:"start-failed",message:J instanceof Error?J.message:String(J)}}},{params:z.Object({name:z.String()}),body:z.Optional(z.Object({port:z.Optional(z.Number())}))}).post("/:name/stop",async({params:Q,set:Y})=>{try{let X=d(Q.name);try{await Z.stop(X)}catch{}try{await a.destroy(X)}catch(J){G().logger.warn("profile-mgmt",`In-process detach failed for '${X}'`,{error:String(J)})}return V2(X)}catch(X){return Y.status=500,{error:"stop-failed",message:X instanceof Error?X.message:String(X)}}},{params:z.Object({name:z.String()})})}function JQ(){let $=process.memoryUsage(),Z=process.resourceUsage(),Q=Z.userCPUTime/1000,Y=Z.systemCPUTime/1000,X=Q+Y,J=a.list().map((W)=>{let H;try{H=Z4(W.spawnOwnerKey).length}catch{H=0}return{name:W.name,status:W.getBootState(),childPidCount:H,cpuMs:X,heapBytes:$.heapUsed,dataDir:W.dataDir}});return{process:{pid:process.pid,uptimeSeconds:process.uptime(),cpuUserMs:Q,cpuSystemMs:Y,heapUsedBytes:$.heapUsed,heapTotalBytes:$.heapTotal,rssBytes:$.rss},profiles:J,notes:{perProfileCpu:"deferred",perProfileHeap:"deferred"}}}function J4(){return new D({prefix:"/api/profile-stats"}).get("/",()=>JQ())}function c2($,Z){return Promise.race([$,new Promise((Q,Y)=>setTimeout(()=>Y(Error(`timeout after ${Z}ms`)),Z))])}function XQ($){let Z=$ instanceof Error?$.message:String($);return/ENOENT/.test(Z)||/no such file or directory/i.test(Z)}async function X4($){let Q=`__health__:probe:${typeof crypto<"u"&&typeof crypto.randomUUID==="function"?crypto.randomUUID():`${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`}`,Y=String(Date.now());if(await c2($.setConfig(Q,Y),2000),await c2($.getConfig(Q),2000)!==Y)throw Error("round-trip mismatch");try{await c2($.deleteConfig(Q),500)}catch{}}async function YQ($,Z){if(!$)return{ok:!1,message:"database not opened"};let Q=performance.now();try{return await X4($),{ok:!0,durationMs:performance.now()-Q}}catch(Y){if(Z&&XQ(Y))try{return(await import("fs")).mkdirSync(Z,{recursive:!0}),await X4($),{ok:!0,message:`recovered: dbPath ${Z} was missing \u2014 recreated`,durationMs:performance.now()-Q}}catch(X){return{ok:!1,message:`ENOENT on dbPath ${Z}: ${X instanceof Error?X.message:String(X)}`,durationMs:performance.now()-Q}}return{ok:!1,message:Y instanceof Error?Y.message:String(Y),durationMs:performance.now()-Q}}}function Y4($,Z){if(!$)return{ok:!1,message:"no service registry"};let Y=G().getBootState()==="awaiting-config";if(Z==="tunnel"){let X=$.getProvider("tunnel");if(!X&&process.env.AGENT_TUNNEL==="false")return{ok:!0,message:"tunnel disabled via AGENT_TUNNEL=false"};if(X)return{ok:!0,message:`provider: ${X.name}`};return{ok:!1,message:Y?"agent is awaiting-config \u2014 POST OAuth credentials to /api/agent/gateway-auth to register tunnel provider":"no tunnel provider registered"}}if(Z==="session"){let X=$.getProvider("session");if(X)return{ok:!0,message:`provider: ${X.name}`};return{ok:!1,message:Y?"agent is awaiting-config \u2014 POST OAuth credentials to /api/agent/gateway-auth to register session provider":"no session provider registered"}}return{ok:!0}}async function WQ($){if(!$)return{};let Z={};for(let Q of $.getAllPlugins()){let Y=Q.getHealth;if(typeof Y!=="function")continue;let X=performance.now();try{let J=await c2(Promise.resolve(Y.call(Q)),2000);Z[Q.name]={ok:J?.ok!==!1,message:J?.message,durationMs:performance.now()-X}}catch(J){Z[Q.name]={ok:!1,message:J instanceof Error?J.message:String(J),durationMs:performance.now()-X}}}return Z}function W4($){let Z=$&&"serviceRegistry"in $?$:{serviceRegistry:$};return new D({prefix:"/health"}).get("/",()=>{return{status:"ok",lifecycleState:Z.serviceRegistry?.getService("agent","lifecycle")?.getState()??"running",bootState:G().getBootState(),timestamp:new Date().toISOString(),uptime:process.uptime()}}).get("/live",()=>({status:"ok"})).get("/ready",async({set:Q})=>{let X=Z.serviceRegistry?.getService("agent","lifecycle")?.getState()??"running",J=G().getBootState(),W={};W.boot={ok:J==="ready",message:J==="ready"?void 0:`boot state ${J}`},W.lifecycle={ok:X==="running",message:X==="running"?void 0:`lifecycle ${X}`},W.db=await YQ(Z.getDb?.()??null,Z.getDbPath?.()??null),W.tunnel=Y4(Z.serviceRegistry,"tunnel"),W.session=Y4(Z.serviceRegistry,"session");try{let{gatewayClient:V}=await import("./gateway-client-43gzvj5s.js");if(!V.isConfigured())W.registration={ok:!0,message:"not configured"};else{let E=Z.getDb?.()??null;if(E?await E.getConfig("gateway-auth:agentRecordId"):null)W.registration={ok:!0};else{let h=G().getDegradedReasons().some((F)=>F.plugin==="agent-registration");W.registration=h?{ok:!1,message:"agent failed to register with the workspace after retries"}:{ok:!0,message:"registering"}}}}catch(V){W.registration={ok:!0,message:`registration check skipped: ${V instanceof Error?V.message:String(V)}`}}let H=await WQ(Z.getPluginManager?.()??null),B=Object.values(W).every((V)=>V.ok)&&Object.values(H).every((V)=>V.ok);if(!B)Q.status=503;let K=J==="degraded"?G().getDegradedReasons():[],N=G().name,I={};for(let V of a.list())I[V.name]={bootState:V.getBootState(),ok:V.getBootState()==="ready",degradedReasons:V.getDegradedReasons()};let C=G().getLastFinalizeError(),U={status:B?"ok":"degraded",lifecycleState:X,bootState:J,daemon:{profile:N,bootState:J,ok:J==="ready"},profiles:I,components:W,plugins:H,degradedReasons:K,lastFinalizeError:C,timestamp:new Date().toISOString()};if(!B)G().logger.warn("health","Readiness probe failed",{components:W,plugins:H,bootState:J});return U})}var u2=0,z4=0;function H4(){return new D({name:"inflight-tracker"}).onRequest(()=>{u2+=1}).onAfterResponse(()=>{u2=Math.max(0,u2-1),z4+=1})}function G4(){return new D({prefix:"/api/stats"}).get("/inflight",()=>({inflight:Math.max(0,u2-1),totalServed:z4}))}var G0=Object.freeze(["code","code-insiders","codium","cursor","idea","pycharm","webstorm","goland","phpstorm","rubymine","clion","rider","zed","subl","vim","nvim","emacs","neovide","fleet","helix"]),zQ=new Set(G0),HQ=new Set(["--new-window","-n","--reuse-window","-r","--wait","-w","--add","--goto"]);function B4($){try{return Bun.which($)??null}catch{return null}}function _4(){return new D({prefix:"/api/editor"}).get("/allowlist",()=>({commands:[...G0]})).get("/detect",async()=>{let $=G0.map((Y)=>[Y,B4(Y)]),Z=[],Q={};for(let[Y,X]of $)if(X)Z.push(Y),Q[Y]=X;return{available:Z,paths:Q}}).post("/open",async({body:$,set:Z})=>{let{command:Q,path:Y,args:X=[]}=$;if(!zQ.has(Q))return Z.status=400,{ok:!1,error:`Command '${Q}' is not in the IDE allowlist`};for(let H of X)if(typeof H!=="string"||!HQ.has(H))return Z.status=400,{ok:!1,error:`Argument '${H}' is not in the flag allowlist`};let J;try{J=(await V4(Y,{mustExist:!0})).realPath}catch(H){return Z.status=400,{ok:!1,error:`Invalid path: ${H instanceof Error?H.message:String(H)}`}}let W=B4(Q);if(!W)return Z.status=404,{ok:!1,error:`'${Q}' is not installed or not on PATH on this agent`};try{let H=K4({owner:`editor:${Q}`,cmd:[W,...X,J],env:process.env,stdout:"ignore",stderr:"ignore",stdin:"ignore",meta:{command:Q,path:J}});return G().logger.info("editor",`Launched ${Q} on ${J}`,{pid:H.pid}),G().audit.emit("agent","editor.open",{command:Q,path:J,pid:H.pid}),{ok:!0,command:Q,resolvedPath:J,pid:H.pid}}catch(H){return Z.status=500,{ok:!1,error:`Failed to spawn editor: ${H instanceof Error?H.message:String(H)}`}}},{body:z.Object({command:z.String({minLength:1,maxLength:40}),path:z.String({minLength:1,maxLength:4096}),args:z.Optional(z.Array(z.String({maxLength:32})))})})}var N4=Symbol.for("@vibecontrols/plugin-sdk:contextProviders@1");function GQ(){let $=globalThis,Z=$[N4];if(Z)return Z;let Q=new Map;return $[N4]=Q,Q}function B0(){return Array.from(GQ().values())}function F4(){return(b()??G()).dataDir}function n(){let $=s({dir:F4()});return{ownerUserId:$.ownerUserId,workspaceId:$.workspaceId}}function m2(){return s({dir:F4()}).agentRecordId}function L4($){if(!$)return null;try{return new URL($).host}catch{return null}}async function O4($,Z){let Q=$.getPluginManager(),Y=Q?Q.getPluginDetails().map((H)=>({pluginName:H.pluginName,packageName:H.packageName,version:H.version,tags:H.tags??[]})):[],X=process.memoryUsage(),J=L4($.getTunnelHost?.()??null),W;try{W=_2(n()).map((H)=>({id:H.id,label:H.label,host:L4(H.tunnelUrl),agentRecordId:H.agentRecordId??null,permissions:H.permissions,canForward:H.permissions.includes("mesh:forward"),lastReachable:H.lastReachable??null}))}catch{W=[]}return{pluginName:"agent",description:"vibecontrols-agent runtime self-report",generatedAt:new Date().toISOString(),data:{profile:Z.profile,vibeId:Z.vibeId??null,runtime:{bunVersion:typeof Bun<"u"?Bun.version:null,nodeVersion:process.versions.node??null,platform:process.platform,arch:process.arch,pid:process.pid,uptimeSeconds:Math.round(process.uptime()),memory:{rssMB:Math.round(X.rss/1048576),heapUsedMB:Math.round(X.heapUsed/1048576)}},agent:{version:$.getAgentVersion?.()??null,profileRegistered:E2(),tunnelHost:J},plugins:{count:Y.length,items:Y},mesh:{peerCount:W.length,peers:W}}}}var BQ=2000,j4=1000;async function VQ($,Z){let Q,Y=new Promise((X,J)=>{Q=setTimeout(()=>J(Error(`timeout after ${Z}ms`)),Z)});try{return await Promise.race([$,Y])}finally{if(Q)clearTimeout(Q)}}async function U4($,Z){let Q=performance.now(),Y=$.timeoutMs??BQ;try{let X=await VQ($.getContext(Z),Y);if(!X.generatedAt)X.generatedAt=new Date().toISOString();return{ok:!0,data:X,durationMs:Math.round(performance.now()-Q)}}catch(X){return{ok:!1,error:X.message??String(X),durationMs:Math.round(performance.now()-Q)}}}class V0{deps;inflight=new Map;constructor($){this.deps=$}async aggregate($){let Z=`${$.profile}::${$.vibeId??""}`,Q=this.inflight.get(Z);if(Q&&Date.now()-Q.ts<j4)return Q.promise;let Y=this.doAggregate($).finally(()=>{setTimeout(()=>{let X=this.inflight.get(Z);if(X&&X.promise===Y)this.inflight.delete(Z)},j4).unref?.()});return this.inflight.set(Z,{ts:Date.now(),promise:Y}),Y}async selfContext($){return O4(this.deps,$)}async pluginContext($,Z){let Q=B0().find((Y)=>Y.name===$);if(!Q)return null;return U4(Q,Z)}async pluginsContext($){let Z=B0(),Q=await Promise.allSettled(Z.map((X)=>U4(X,$))),Y={};return Z.forEach((X,J)=>{let W=Q[J];if(W&&W.status==="fulfilled")Y[X.name]=W.value;else if(W&&W.status==="rejected")Y[X.name]={ok:!1,error:W.reason instanceof Error?W.reason.message:String(W.reason),durationMs:0}}),Y}async doAggregate($){let[Z,Q]=await Promise.all([this.selfContext($),this.pluginsContext($)]);return{agent:Z,plugins:Q}}}function g2($){let Z=$.vibeId;if(typeof Z!=="string")return;let Q=Z.trim();return Q.length>0&&Q.length<=128?Q:void 0}function x4($){let Z=new V0($);return new D({prefix:"/api/agent/context"}).get("/",async({params:Q,query:Y})=>{let X=Q?.profile??"default",J=g2(Y);return Z.aggregate({profile:X,vibeId:J})},{query:z.Object({vibeId:z.Optional(z.String())})}).get("/agent",async({params:Q,query:Y})=>{let X=Q?.profile??"default",J=g2(Y);return Z.selfContext({profile:X,vibeId:J})},{query:z.Object({vibeId:z.Optional(z.String())})}).get("/plugins",async({params:Q,query:Y})=>{let X=Q?.profile??"default",J=g2(Y);return Z.pluginsContext({profile:X,vibeId:J})},{query:z.Object({vibeId:z.Optional(z.String())})}).get("/plugins/:name",async({params:Q,query:Y,set:X})=>{let J=Q?.profile??"default",W=Q?.name;if(!W)return X.status=400,{error:"missing plugin name"};let H=g2(Y),B=await Z.pluginContext(W,{profile:J,vibeId:H});if(!B)return X.status=404,{error:`no context provider registered under name "${W}"`};return B},{params:z.Object({name:z.String()}),query:z.Object({vibeId:z.Optional(z.String())})})}var Q2="autoupdate",KQ=86400000,M4=300000,_Q=900000,S={timer:null,running:!1,profile:"default",lastCheckAt:null,lastCheck:null,lastUpdateAt:null,lastUpdate:null,startedAt:null};function K0(){let $=(process.env.VIBE_AUTOUPDATE??"").trim().toLowerCase();return $==="0"||$==="false"||$==="off"||$==="no"}function E4(){if(K0())return!1;try{return s().autoUpdate!==!1}catch{return!0}}function _0(){let $=Number(process.env.VIBE_AUTOUPDATE_INTERVAL_MS);if(Number.isFinite($)&&$>0)return Math.max(_Q,$);return KQ}async function N0($){let Z=G().logger;if(S.running)return{check:S.lastCheck??await T4(),update:null};S.running=!0;try{let Q=await C2();if(S.lastCheck=Q,S.lastCheckAt=new Date().toISOString(),Q.error)Z.debug(Q2,`Update check failed: ${Q.error}`);else if(Q.hasUpdate)Z.info(Q2,`New agent version available: ${Q.current} \u2192 ${Q.latest}`);let Y=$?.force||E4();if(!Q.hasUpdate||!Y)return{check:Q,update:null};Z.info(Q2,`Auto-updating ${Q.current} \u2192 ${Q.latest} (idle-gated restart)\u2026`);let X=await p2({restart:!0,name:S.profile,onLog:(J)=>Z.info(Q2,J)});if(S.lastUpdate=X,S.lastUpdateAt=new Date().toISOString(),X.ok&&X.updated)Z.info(Q2,`Auto-update applied: now ${X.current} (restart: ${X.restart}).`);else if(!X.ok)Z.warn(Q2,`Auto-update failed: ${X.error}`);return{check:Q,update:X}}catch(Q){return Z.warn(Q2,`Auto-update tick threw: ${Q instanceof Error?Q.message:String(Q)}`),{check:await T4(),update:null}}finally{S.running=!1}}async function T4(){if(S.lastCheck)return S.lastCheck;let $=await C2();return S.lastCheck=$,S.lastCheckAt=new Date().toISOString(),$}function C4($){if(S.timer)clearTimeout(S.timer);S.timer=setTimeout(()=>{N0().finally(()=>{if(S.startedAt)C4(_0())})},$),S.timer.unref?.()}function NQ($){let Z=G().logger;if(S.profile=$?.profile||process.env.VIBECONTROLS_PROFILE||"default",S.startedAt=new Date().toISOString(),K0()){Z.info(Q2,"Autoupdate disabled via VIBE_AUTOUPDATE \u2014 not scheduling.");return}Z.info(Q2,`Autoupdate scheduled (first check in ${Math.round(M4/60000)}m, then every ${Math.round(_0()/3600000)}h).`),C4(M4)}function B7(){if(S.timer)clearTimeout(S.timer),S.timer=null;S.startedAt=null}function I4($){if(f2({autoUpdate:$}),$&&!S.startedAt)NQ({profile:S.profile})}function F0(){let $=!0;try{$=s().autoUpdate!==!1}catch{}return{enabled:E4(),envKillSwitch:K0(),configEnabled:$,scheduled:!!S.startedAt,intervalMs:_0(),profile:S.profile,startedAt:S.startedAt,lastCheckAt:S.lastCheckAt,lastCheck:S.lastCheck,lastUpdateAt:S.lastUpdateAt,lastUpdate:S.lastUpdate}}import{existsSync as q4}from"fs";import{join as R4}from"path";var FQ=600000,L0=1e6;function LQ(){let $=N2(),Z=$.which("bun")??`bun${$.executableSuffix}`,Q=R4(import.meta.dir,"cli.js");if(q4(Q))return{runner:Z,prefix:[Q]};let Y=R4(import.meta.dir,"..","cli.ts");if(q4(Y))return{runner:Z,prefix:[Y]};let X=$.which("vibe");if(X)return{runner:X,prefix:[]};return null}function A4($){if($.length<=L0)return $;return $.slice(0,L0)+`
4
+ \u2026[output truncated at ${L0} bytes]`}async function l2($,Z={}){let Q=LQ();if(!Q)return{ok:!1,exitCode:null,stdout:"",stderr:"Could not locate the vibe CLI to execute (no dist/cli.js, source, or PATH entry).",timedOut:!1,argv:$,command:"(unresolved)"};let Y=[...Q.prefix,...$],X=[Q.runner,...Y].join(" ");try{let J=Bun.spawn([Q.runner,...Y],{cwd:Z.cwd,env:{...process.env,VIBE_AUTO_ACCEPT:"1",CI:"1",NO_COLOR:"1",...Z.env},stdout:"pipe",stderr:"pipe"}),W=Z.timeoutMs??FQ,H=!1,B=setTimeout(()=>{H=!0;try{J.kill()}catch{}},W),[K,N,I]=await Promise.all([new Response(J.stdout).text(),new Response(J.stderr).text(),J.exited]);return clearTimeout(B),{ok:!H&&I===0,exitCode:I,stdout:A4(K),stderr:A4(N),timedOut:H,argv:$,command:X}}catch(J){return{ok:!1,exitCode:null,stdout:"",stderr:`Failed to spawn vibe CLI: ${J instanceof Error?J.message:String(J)}`,timedOut:!1,argv:$,command:X}}}async function w4(){let{Command:$}=await import("./esm-9fpye77x.js"),{registerCoreCommands:Z}=await import("./register-core-qrawzyym.js"),Q=new $;Q.name("vibe").option("--json").option("--plain").option("-y, --yes").option("-p, --profile <name>");try{Z(Q)}catch{}let Y=new Set(["nuke","kill","gc","stop","rollback","deploy"]),X=[];for(let J of Q.commands){let W=J.name();if(!W||W==="help")continue;X.push({name:W,description:J.description()||"",usage:J.usage()||"",options:J.options.map((H)=>({flags:H.flags,description:H.description||""})),group:"core",destructive:Y.has(W)})}return X.sort((J,W)=>J.name.localeCompare(W.name))}import{spawn as OQ}from"child_process";import{writeFileSync as jQ,mkdirSync as UQ}from"fs";import{tmpdir as xQ}from"os";import{join as k4}from"path";var MQ="@vibecontrols/agent";function S4($){let Z=N2(),Q=Z.which("bun")??`bun${Z.executableSuffix}`,Y=Z.which("npm")??`npm${Z.executableSuffix}`,X=d2(),J=$.delayMs??3000,W=$.pids.filter((B)=>Number.isInteger(B)&&B>0),H=`// vibecontrols agent self-uninstall reaper (auto-generated)
5
+ const PIDS = ${JSON.stringify(W)};
6
+ const NPM = ${JSON.stringify(Y)};
7
+ const BUN = ${JSON.stringify(Q)};
8
+ const REGISTRY = ${JSON.stringify(X)};
9
+ const PKG = ${JSON.stringify(MQ)};
10
+ await Bun.sleep(${J});
11
+ for (const pid of PIDS) {
12
+ try { process.kill(pid, "SIGTERM"); } catch {}
13
+ }
14
+ await Bun.sleep(2500);
15
+ for (const pid of PIDS) {
16
+ try { process.kill(pid, "SIGKILL"); } catch {}
17
+ }
18
+ try { Bun.spawnSync([NPM, "uninstall", "-g", PKG, "--registry=" + REGISTRY], { stdout: "inherit", stderr: "inherit" }); } catch {}
19
+ try { Bun.spawnSync([BUN, "remove", "-g", PKG], { stdout: "inherit", stderr: "inherit" }); } catch {}
20
+ `;try{let B=k4(xQ(),"vibecontrols-uninstall");UQ(B,{recursive:!0});let K=k4(B,`reaper-${process.pid}.ts`);return jQ(K,H,{encoding:"utf8"}),OQ(Q,[K],{detached:!0,stdio:"ignore",windowsHide:!0}).unref(),G().logger.info("self-uninstall",`Scheduled detached uninstall reaper (pids=${W.join(",")}) at ${K}`),{ok:!0,scriptPath:K}}catch(B){return{ok:!1,scriptPath:null,error:B instanceof Error?B.message:String(B)}}}var TQ=new Set(["db","plugins-registry","logs","binaries","subprocs"]);async function D4($){let Z=await w4();try{let Q=$.getPluginManager?.();if(Q){let Y=new Set(Z.map((X)=>X.name));for(let X of Q.getPluginDetails()){let J=X.cliCommand;if(J&&!Y.has(J))Y.add(J),Z.push({name:J,description:X.description||`${X.pluginName} plugin command`,usage:"",options:[],group:"plugin",destructive:!1})}}}catch{}return Z.sort((Q,Y)=>Q.name.localeCompare(Y.name))}function h4($={}){return new D({name:"agent-maintenance"}).get("/api/agent/update/check",async()=>{return await C2()}).get("/api/agent/update/status",()=>{return F0()}).post("/api/agent/update",async({body:Z})=>{return await p2({targetVersion:typeof Z?.version==="string"?Z.version:void 0,allowIncompatible:Z?.allowIncompatible===!0,restart:Z?.restart!==!1})},{body:z.Optional(z.Object({version:z.Optional(z.String()),allowIncompatible:z.Optional(z.Boolean()),restart:z.Optional(z.Boolean())}))}).post("/api/agent/update/config",({body:Z})=>{return I4(Z.enabled),{ok:!0,status:F0()}},{body:z.Object({enabled:z.Boolean()})}).post("/api/agent/update/check-now",async({body:Z})=>{return{ok:!0,...await N0({force:Z?.force===!0})}},{body:z.Optional(z.Object({force:z.Optional(z.Boolean())}))}).get("/api/agent/commands",async()=>{let Z=await D4($);return{commands:Z,count:Z.length}}).post("/api/agent/commands/run",async({body:Z,set:Q})=>{let Y=Array.isArray(Z?.argv)?Z.argv.filter((B)=>typeof B==="string"):[];if(Y.length===0)return Q.status=400,{ok:!1,error:"argv must be a non-empty string array"};let X=Y[0],J=await D4($),W=new Set(J.map((B)=>B.name));if(!W.has(X))return Q.status=400,{ok:!1,error:`Unknown or disallowed command: "${X}"`,allowed:[...W].sort()};return await l2(Y,{timeoutMs:typeof Z?.timeoutMs==="number"?Z.timeoutMs:void 0})},{body:z.Object({argv:z.Array(z.String()),timeoutMs:z.Optional(z.Number())})}).post("/api/agent/nuke",async({body:Z,set:Q})=>{let Y=["nuke"];if(Z?.all)Y.push("--all");if(Z?.removeConfig)Y.push("--remove-config");if(Z?.dryRun)Y.push("--dry-run");if(typeof Z?.removePlugins==="string"&&Z.removePlugins)Y.push("--remove-plugins",Z.removePlugins);if(typeof Z?.keep==="string"&&Z.keep){let W=Z.keep.split(",").map((H)=>H.trim()).filter((H)=>H&&!TQ.has(H));if(W.length>0)return Q.status=400,{ok:!1,error:`Invalid --keep value(s): ${W.join(", ")}`};Y.push("--keep",Z.keep)}Y.push("-y","--json");let X=await l2(Y),J=null;try{let W=X.stdout.trim().split(`
21
+ `).reverse().find((H)=>H.trim().startsWith("{"));if(W)J=JSON.parse(W)}catch{}return{...X,parsed:J}},{body:z.Optional(z.Object({all:z.Optional(z.Boolean()),removeConfig:z.Optional(z.Boolean()),removePlugins:z.Optional(z.String()),keep:z.Optional(z.String()),dryRun:z.Optional(z.Boolean())}))}).post("/api/agent/uninstall",async({body:Z})=>{let Q=Z?.dryRun===!0,Y=["nuke","--all","--remove-config","-y","--json"];if(Q)Y.push("--dry-run");let X=await l2(Y);if(Q)return{ok:X.ok,dryRun:!0,nuke:X,note:"Dry run \u2014 would nuke all state and uninstall @vibecontrols/agent."};let J=new Set([process.pid]);try{let H=new b2;for(let B of await H.listInstances())if(typeof B.pid==="number"&&B.pid>0)J.add(B.pid)}catch{}let W=S4({pids:[...J]});return{ok:X.ok&&W.ok,nuke:X,uninstallScheduled:W.ok,scriptPath:W.scriptPath,...W.error?{error:W.error}:{},note:"Agent state nuked; package self-uninstall scheduled \u2014 the daemon will stop and `@vibecontrols/agent` will be removed shortly."}},{body:z.Optional(z.Object({dryRun:z.Optional(z.Boolean())}))})}import{existsSync as RQ,readFileSync as AQ}from"fs";import{join as wQ}from"path";var EQ=`mutation AddAgentFromTunnel($input: AddAgentFromTunnelInput!) {
22
+ addVibecontrolsAgentFromTunnel(input: $input) { agent { id name } clientId success error }
23
+ }`,CQ=`mutation ReportAgentMeshLink($input: ReportAgentMeshLinkInput!) {
24
+ reportAgentMeshLink(input: $input) { id }
25
+ }`,v4="VIBE_BOOTSTRAP_JSON=";function IQ($){for(let Y of $.split(/\r?\n/)){let X=Y.indexOf(v4);if(X>=0)try{return JSON.parse(Y.slice(X+v4.length))}catch{}}let Z=$.indexOf("{"),Q=$.lastIndexOf("}");if(Z>=0&&Q>Z)try{return JSON.parse($.slice(Z,Q+1))}catch{return null}return null}async function b4($,Z){let Q=(N,I,C)=>Z?.({step:N,status:I,message:C}),Y=f4($.permissions??["tunnel:read","session:list","plugin:list","diagnostics:read","mesh:forward"]);if(!Y.includes("mesh:forward"))Y.push("mesh:forward");let X=(N)=>({ok:!1,peerId:"",agentRecordId:null,tunnelUrl:null,permissions:Y,error:N}),J;try{J=i2($.target,{identityFile:$.identityFile})}catch(N){return X(N instanceof Error?N.message:String(N))}let W=$.label??J.id,H=Y.join(","),B,K='export PATH="$HOME/.bun/bin:$PATH"; ';try{if(!$.connectExisting){Q("probe","running");let x=await J.probe();if(Q("probe","completed",`os=${x.os??"?"} arch=${x.arch??"?"}`),!x.npm&&!x.bun){if($.installBun===!1)return X("Neither npm nor bun present and Bun install was disabled.");Q("install-bun","running");let z2=await J.run(["sh","-c",`curl -fsSL https://bun.sh/install | bash && echo 'export PATH="$HOME/.bun/bin:$PATH"' >> ~/.bashrc`],{timeoutMs:300000});if(z2.code!==0)return Q("install-bun","failed",z2.stderr.slice(0,400)),X("Bun auto-install failed.");let F2=await J.run(["sh","-c","$HOME/.bun/bin/bun --version 2>/dev/null"],{timeoutMs:1e4});if(F2.code===0&&F2.stdout.trim())x.bun="$HOME/.bun/bin/bun",Q("install-bun","completed",F2.stdout.trim());else return X("Bun installed but the binary is not reachable.")}Q("install-agent","running");let R=$.version??"latest",u=$.registry??"https://registry.npmjs.org/",y=x.npm?"npm":"bun",W2=await J.run(y==="npm"?["npm","install","-g",`@vibecontrols/agent@${R}`,`--registry=${u}`]:["sh","-c",`export PATH="$HOME/.bun/bin:$PATH"; bun install -g @vibecontrols/agent@${R} --no-cache`],{timeoutMs:600000});if(W2.code!==0)return Q("install-agent","failed",W2.stderr.slice(0,400)),X(`Agent install failed (exit ${W2.code}).`);if(B=(await J.run(["sh","-c",`${K}vibe --version`],{timeoutMs:15000})).stdout.trim()||void 0,Q("install-agent","completed",B),$.autostart)Q("autostart","running"),await J.run(["sh","-c",`${K}vibe autostart install`],{timeoutMs:60000}),Q("autostart","completed");if($.installPlugins?.length){Q("plugins","running");for(let z2 of $.installPlugins)await J.run(["sh","-c",`${K}vibe plugin install ${z2}`],{timeoutMs:300000});Q("plugins","completed")}Q("start","running"),await J.run(["sh","-c",`${K}vibe start`],{timeoutMs:60000}),Q("start","completed")}Q("bootstrap","running");let N=$.expiresIn?` --expires-in ${$.expiresIn}`:"",I=W.replace(/'/g,""),C=null;for(let x=0;x<15;x++){let R=`${K}vibe peer-bootstrap --json --emit-default-key --label '${I}' --scope ${H}${N} 2>/dev/null`,u=await J.run(["sh","-c",R],{timeoutMs:15000});if(u.code===0){let y=IQ(u.stdout);if(y&&typeof y.apiKey==="string"){C=y;break}}await new Promise((y)=>setTimeout(y,2000))}if(!C)return Q("bootstrap","failed","could not obtain peer-bootstrap bundle"),X("Remote peer-bootstrap did not return a credential bundle.");Q("bootstrap","completed");let U=n(),V=String(C.id),E=String(C.apiKey),q=n2(typeof C.tunnelUrl==="string"?C.tunnelUrl:null),h=typeof C.agentRecordId==="string"?C.agentRecordId:null;if($.onboardBackend!==!1&&g.isConfigured()&&q&&typeof C.fullDefaultApiKey==="string"){Q("onboard","running");try{let R=(await g.workspaceQuery(EQ,{input:{tunnelUrl:q,apiKey:C.fullDefaultApiKey,name:W}})).data?.addVibecontrolsAgentFromTunnel;if(R?.agent?.id)h=R.agent.id,Q("onboard","completed",`agent ${h}`);else Q("onboard","failed",R?.error??"no agent returned")}catch(x){Q("onboard","failed",x instanceof Error?x.message:String(x))}}else Q("onboard","skipped");Q("store-creds","running"),P4({id:V,label:W,tunnelUrl:q??"",apiKey:E,permissions:Y,addedAt:new Date().toISOString(),agentRecordId:h??void 0,workspaceId:(typeof C.workspaceId==="string"?C.workspaceId:U.workspaceId)??void 0,fingerprint:V,ownerUserId:U.ownerUserId,sshTarget:J.mode==="ssh"?$.target:void 0,sshIdentityFile:$.identityFile}),Q("store-creds","completed");let F=m2();if($.onboardBackend!==!1&&g.isConfigured()&&F&&h){Q("report-link","running");try{await g.workspaceQuery(CQ,{input:{sourceAgentRecordId:F,destinationAgentRecordId:h,label:W}}),Q("report-link","completed")}catch(x){Q("report-link","failed",x instanceof Error?x.message:String(x))}}else Q("report-link","skipped");let T=await I2(V,"/api/profiles/default/agent/identity",{operation:"post-deploy-probe"});return Q("probe-peer",T.ok?"completed":"failed",T.error??void 0),{ok:!0,peerId:V,agentRecordId:h,tunnelUrl:q,permissions:Y,remoteVersion:B}}catch(N){return X(N instanceof Error?N.message:String(N))}finally{await J.close().catch(()=>{})}}var O0='export PATH="$HOME/.bun/bin:$PATH"; ';function qQ($){let Z=$.indexOf("{"),Q=$.lastIndexOf("}");if(Z>=0&&Q>Z)try{let Y=JSON.parse($.slice(Z,Q+1));if(Y.tunnelUrl)return Y.tunnelUrl;if(Y.url&&Y.url.startsWith("https"))return Y.url}catch{}return null}async function u4($,Z){let Q=(J,W,H)=>Z?.({step:J,status:W,message:H}),Y=y4($);if(!Y)return{ok:!1,peerId:$,tunnelUrl:null,error:`No peer with id ${$}`};if(!Y.sshTarget)return{ok:!1,peerId:$,tunnelUrl:null,error:"No SSH target stored for this peer \u2014 it wasn't SSH-deployed, so it can't be woken via SSH."};let X;try{X=i2(Y.sshTarget,{identityFile:Y.sshIdentityFile})}catch(J){return{ok:!1,peerId:$,tunnelUrl:null,error:J instanceof Error?J.message:String(J)}}try{Q("ssh-restart","running",Y.sshTarget);let J=await X.run(["sh","-c",`${O0}vibe restart 2>/dev/null || ${O0}vibe start`],{timeoutMs:90000});if(J.code!==0)return Q("ssh-restart","failed",J.stderr.slice(0,300)),{ok:!1,peerId:$,tunnelUrl:null,error:`Remote restart failed (exit ${J.code})`};Q("ssh-restart","completed"),Q("await-tunnel","running");let W=null;for(let H=0;H<15;H++){let B=await X.run(["sh","-c",`${O0}vibe url --json 2>/dev/null`],{timeoutMs:15000});if(B.code===0){let K=qQ(B.stdout),N=n2(K);if(N){W=N;break}}await new Promise((K)=>setTimeout(K,2000))}if(!W)return Q("await-tunnel","failed","no fresh tunnel after restart"),{ok:!1,peerId:$,tunnelUrl:null,error:"Agent restarted but no fresh tunnel came up."};return Q("await-tunnel","completed",W),c4($,{tunnelUrl:W,lastReachable:new Date().toISOString()}),Q("update","completed"),{ok:!0,peerId:$,tunnelUrl:W}}catch(J){return{ok:!1,peerId:$,tunnelUrl:null,error:J instanceof Error?J.message:String(J)}}finally{await X.close().catch(()=>{})}}var kQ=Number(process.env.VIBECONTROLS_MESH_MAX_HOPS||"8");function m4(){return(b()??G()).name}function SQ(){return(b()??G()).dataDir}function g4(){try{let Z=wQ(SQ(),"runtime.json");if(RQ(Z)){let Q=JSON.parse(AQ(Z,"utf8"));if(Q.port&&Number.isInteger(Q.port))return Q.port}}catch{}let $=Number(process.env.PORT);return Number.isInteger($)&&$>0?$:3005}function DQ($){let Z={};return $.headers.forEach((Q,Y)=>{Z[Y]=Q}),Z}function Z2($,Z){let Q=m(DQ($));return d4(l4(Q),Z)}function hQ($){let{apiKey:Z,...Q}=$;return{...Q,apiKey:"[REDACTED]"}}function p4($){return typeof $==="string"&&$.startsWith("/api/")&&!$.includes("..")&&!$.includes("//")}var o2=new Map;function vQ(){let $=Date.now()-3600000;for(let[Z,Q]of o2)if(Q.completedAt&&Date.parse(Q.completedAt)<$)o2.delete(Z)}function i4(){return new D({name:"agent-mesh"}).get("/api/mesh/peers",({request:$,set:Z})=>{if(!Z2($,["read"]))return Z.status=403,{error:"forbidden"};return{peers:_2(n()).map(hQ)}}).delete("/api/mesh/peers/:id",({request:$,set:Z,params:Q})=>{if(!Z2($,["mutate"]))return Z.status=403,{error:"forbidden"};if(!_2(n()).some((X)=>X.id===Q.id))return Z.status=404,{error:"not found"};return{ok:n4(Q.id)}}).post("/api/mesh/peers/:id/call",async({request:$,set:Z,params:Q,body:Y})=>{if(!Z2($,["mesh:forward"]))return Z.status=403,{error:"forbidden"};let X=Y;if(!p4(X.path))return Z.status=400,{error:"invalid path"};if(!_2(n()).find((H)=>H.id===Q.id))return Z.status=404,{error:"not found"};let W=await I2(Q.id,X.path,{method:X.method??"GET",body:X.body,operation:"mesh-call"});return{ok:W.ok,status:W.status,data:W.data,rotated:W.rotated,error:W.error}},{body:z.Object({method:z.Optional(z.String()),path:z.String(),body:z.Optional(z.Any())})}).post("/api/mesh/forward",async({request:$,set:Z,body:Q})=>{if(!Z2($,["mesh:forward"]))return Z.status=403,{error:"forbidden"};let Y=Q;if(!Y.request||!p4(Y.request.path))return Z.status=400,{error:"invalid request"};let X=(Y._hopCount??0)+1;if(X>kQ)return Z.status=422,{error:"hop limit exceeded"};let J=n(),W=m2(),H=Y.hops??[];if(H.length===0){G().audit.emit("mesh","forward.terminal",{path:Y.request.path,method:Y.request.method??"GET"});let U=(Y.request.method??"GET").toUpperCase();try{let V=await fetch(`http://127.0.0.1:${g4()}${Y.request.path}`,{method:U,headers:{"x-agent-api-key":await j0(),...Y.request.body!==void 0?{"content-type":"application/json"}:{}},body:Y.request.body!==void 0?JSON.stringify(Y.request.body):void 0,signal:AbortSignal.timeout(60000)}),E=await V.text().catch(()=>""),q=null;try{q=E?JSON.parse(E):null}catch{q=null}return{ok:V.ok,status:V.status,data:q,text:E||null,error:V.ok?null:E||`status ${V.status}`}}catch(V){return Z.status=502,{ok:!1,status:0,error:V instanceof Error?V.message:String(V)}}}let B=H[0],K=Y._traversed??[];if(B===W||K.includes(B))return Z.status=422,{error:"cycle detected",at:B};let N=U0(B,J);if(!N)return Z.status=403,{error:"next hop not in authorized boundary"};if(!N.permissions.includes("mesh:forward"))return Z.status=403,{error:"peer lacks mesh:forward grant"};G().audit.emit("mesh","forward.hop",{nextId:B,remaining:H.length,hopCount:X});let I=encodeURIComponent(m4()),C=await I2(N.id,`/api/profiles/${I}/mesh/forward`,{method:"POST",operation:"mesh-forward",timeoutMs:60000,body:{hops:H.slice(1),request:Y.request,_traversed:[...K,W??"self"],_hopCount:X}});if(!C.ok)return Z.status=502,{ok:!1,status:C.status,error:C.error,failedAtHop:B};return C.data},{body:z.Object({hops:z.Optional(z.Array(z.String())),request:z.Object({method:z.Optional(z.String()),path:z.String(),body:z.Optional(z.Any())}),_traversed:z.Optional(z.Array(z.String())),_hopCount:z.Optional(z.Number())})}).post("/api/mesh/deploy",({request:$,set:Z,body:Q})=>{if(!Z2($,["admin"]))return Z.status=403,{error:"forbidden"};vQ();let Y=Q,X=n(),J=crypto.randomUUID(),W={id:J,status:"running",steps:[],ownerUserId:X.ownerUserId,workspaceId:X.workspaceId,startedAt:new Date().toISOString()};return o2.set(J,W),b4({target:Y.target,permissions:Y.permissions,installPlugins:Y.installPlugins,autostart:Y.autostart,identityFile:Y.identityFile,label:Y.label,version:Y.version,connectExisting:Y.connectExisting},(H)=>{W.steps.push(H),J2("mesh:deploy:progress",{jobId:J,step:H})}).then((H)=>{if(W.result=H,W.status=H.ok?"completed":"failed",!H.ok)W.error=H.error;W.completedAt=new Date().toISOString(),J2(H.ok?"mesh:deploy:complete":"mesh:deploy:failed",{jobId:J,result:H})}).catch((H)=>{W.status="failed",W.error=H instanceof Error?H.message:String(H),W.completedAt=new Date().toISOString(),J2("mesh:deploy:failed",{jobId:J,error:W.error})}),Z.status=202,{jobId:J,status:"running"}},{body:z.Object({target:z.String(),permissions:z.Optional(z.Array(z.String())),installPlugins:z.Optional(z.Array(z.String())),autostart:z.Optional(z.Boolean()),identityFile:z.Optional(z.String()),label:z.Optional(z.String()),version:z.Optional(z.String()),connectExisting:z.Optional(z.Boolean())})}).get("/api/mesh/deploy/jobs/:id",({request:$,set:Z,params:Q})=>{if(!Z2($,["read"]))return Z.status=403,{error:"forbidden"};let Y=o2.get(Q.id),X=n();if(!Y||X.ownerUserId&&Y.ownerUserId&&Y.ownerUserId!==X.ownerUserId)return Z.status=404,{error:"not found"};return Y}).post("/api/mesh/wake",async({request:$,set:Z,body:Q})=>{if(!Z2($,["admin"]))return Z.status=403,{error:"forbidden"};let Y=Q,X=U0(Y.targetAgentRecordId,n());if(!X)return Z.status=404,{ok:!1,error:"peer not in authorized boundary"};G().audit.emit("mesh","wake.start",{peerId:X.id,agentRecordId:Y.targetAgentRecordId});let J=await u4(X.id,(W)=>J2("mesh:wake:progress",{peerId:X.id,step:W}));if(!J.ok)Z.status=502;return J},{body:z.Object({targetAgentRecordId:z.String()})}).post("/api/mesh/session",async({request:$,set:Z,body:Q})=>{if(!Z2($,["mesh:forward","mutate"]))return Z.status=403,{error:"forbidden"};let Y=Q,X=Y.sessionId&&/^[A-Za-z0-9_-]{1,128}$/.test(Y.sessionId)?Y.sessionId:crypto.randomUUID(),J=encodeURIComponent(m4()),W=await j0(),H=`http://127.0.0.1:${g4()}`,B=Y.command||"bash";try{let K=await fetch(`${H}/api/profiles/${J}/sessions/create`,{method:"POST",headers:{"x-agent-api-key":W,"content-type":"application/json"},body:JSON.stringify({sessionId:X,sessionName:`vc-mesh-${X.slice(0,8)}`,command:B,provider:"TERMINAL",...Y.vibeId?{projectId:Y.vibeId}:{}}),signal:AbortSignal.timeout(20000)});if(!K.ok)return Z.status=502,{error:`session create returned ${K.status}: ${await K.text().catch(()=>"")}`};let N=await fetch(`${H}/api/profiles/${J}/sessions/${encodeURIComponent(X)}/terminal`,{method:"POST",headers:{"x-agent-api-key":W},signal:AbortSignal.timeout(20000)});if(!N.ok)return Z.status=502,{error:`terminal start returned ${N.status}: ${await N.text().catch(()=>"")}`};let I=h2(`/terminal/${X}`,600);return G().audit.emit("mesh","session.created",{sessionId:X,kind:Y.kind??"TERMINAL"}),{connectionId:X,sessionId:X,capabilityToken:I.token,expiresAt:I.expiresAt}}catch(K){return Z.status=502,{error:K instanceof Error?K.message:String(K)}}},{body:z.Object({sessionId:z.Optional(z.String()),kind:z.Optional(z.String()),cwd:z.Optional(z.String()),vibeId:z.Optional(z.String()),command:z.Optional(z.String())})})}var PQ=["/health","/api/agent/status","/api/agent/version","/api/agent/identity","/api/agent/api-key","/api/agent/tunnel","/api/agent/system","/api/agent/gateway-auth","/api/stats","/metrics","/api/profiles","/api/profile-stats"];function fQ($){return PQ.some((Z)=>$.startsWith(Z))}var bQ=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function yQ($){return $.split("/").map((Z)=>{if(!Z)return Z;if(/^\d+$/.test(Z))return":id";if(bQ.test(Z))return":id";if(Z.length>=24&&/^[A-Za-z0-9_-]+$/.test(Z))return":id";return Z}).join("/")}async function l8($){let{port:Z,host:Q,dbPath:Y,logLevel:X,corsOrigin:J}=$,W=Y??T2();try{(await import("fs")).mkdirSync(W,{recursive:!0})}catch(_){throw G().logger.error("app","Failed to create dbPath dir at boot",{dbPath:W,error:String(_)}),Error(`Cannot create dbPath ${W}: ${_ instanceof Error?_.message:String(_)}`,{cause:_})}if(X)G().logger.setLevel(X);(async()=>{let{logShipper:_}=await import("./log-shipper-k24m8yw5.js");_.init()})(),(async()=>{let _=await a4();await k2({version:_,profile:E2()})})();try{let{checkDependencies:_}=await import("./bootstrap.service-pjmnpxha.js"),M=_(),O=M.filter((A)=>A.required&&!A.installed),w=M.filter((A)=>!A.required&&!A.installed);if(O.length>0)G().logger.error("app",`Missing required system deps: ${O.map((A)=>A.name).join(", ")}. Run \`vibe setup\` to install.`);if(w.length>0)G().logger.warn("app",`Missing optional system deps: ${w.map((A)=>A.name).join(", ")}. Some plugins may fail their prereqs check.`)}catch(_){G().logger.warn("app","Boot-time dependency check failed",{error:String(_)})}try{G().audit.runRetention()}catch(_){G().logger.warn("app","Audit-log retention sweep failed",{error:String(_)})}let H=new F5;I5(H,{port:Z});let B="GET, POST, PUT, PATCH, DELETE, OPTIONS",K="Content-Type, x-agent-api-key, Authorization, x-requested-with",N=Array.isArray(J)?J:(J??"").split(",").map((_)=>_.trim()).filter(Boolean),I=new Set(["https://vibecontrols.com","https://app.vibecontrols.com","https://alphaapp.vibecontrols.com","https://burdenoff.com","https://app.burdenoff.com","https://alphaapp.burdenoff.com"]),C=(_)=>{try{let M=new URL(_);if(N.includes(_))return!0;if(N.includes("*"))return!1;return M.hostname==="localhost"||M.hostname==="127.0.0.1"||M.hostname==="0.0.0.0"||M.hostname.endsWith(".local.burdenoff.com")||I.has(M.origin)}catch{return!1}},U=null,V=null,E=null,q=null,h=!1,F=()=>[],T=null,x=null,R=null,u=5000,y=async(_,M)=>{let O=Date.now();try{await Promise.race([Promise.resolve(M()),new Promise((w,A)=>setTimeout(()=>A(Error(`shutdown phase ${_} exceeded ${u}ms`)),u))]),G().logger.info("app",`shutdown.phase ${_} complete`,{ms:Date.now()-O})}catch(w){G().logger.warn("app",`shutdown.phase ${_} failed`,{error:String(w),ms:Date.now()-O})}},W2=async(_)=>{if(h)return;if(h=!0,G().logger.info("app","Agent shutdown starting",{reason:_?.reason??"shutdown"}),await y("plugins",async()=>{if(V)await V.dispatchServerStop(_)}),await y("bootstrap-tunnel",()=>E0()),await y("tracked-subprocesses",async()=>{let{killAllTracked:M}=await import("./subprocess-g9sk1ep9.js");await M()}),_?.reason!=="reload")await y("db-close",async()=>{if(U)await U.close()});await y("http-listener",async()=>{try{await Promise.resolve(r.stop())}catch(M){G().logger.warn("app","Listener stop threw (already stopped or never started?)",{error:String(M)})}}),G().logger.info("app","Agent server stopped"),G().logger.close()},a2=async(_,M)=>{if(G().getBootState()==="ready")return{ok:!0};if(R)return R;return R=(async()=>{G().setBootState("initializing");try{let O={..._,globalGatewayUrl:B2(_.globalGatewayUrl,"globalGatewayUrl"),workspaceGatewayUrl:B2(_.workspaceGatewayUrl,"workspaceGatewayUrl")},w=await O5(O),A=W,v=s({dir:G().dataDir}),p=v.storageAdapter??process.env.VIBE_STORAGE_ADAPTER??void 0,i=v.storageOptions,t=(L)=>{let j=(L instanceof Error?L.message:String(L)).toLowerCase(),k=L&&typeof L==="object"&&"code"in L?String(L.code).toUpperCase():"";if(k==="EBUSY"||k==="EPERM"||k==="EACCES"||k==="EAGAIN"||k==="EMFILE"||k==="ENFILE"||k==="ETIMEDOUT"||k==="ECONNRESET"||k==="ECONNREFUSED"||j.includes("encryption key")||j.includes("fetch")&&j.includes("key")||j.includes("temporarily unavailable")||j.includes("resource busy"))return"transient";if(j.includes("auth tag")||j.includes("authentication tag")||j.includes("unable to authenticate data")||j.includes("bad decrypt")||j.includes("unsupported state")||j.includes("incorrect header check")||j.includes("invalid distance")||j.includes("incorrect data check")||j.includes("unexpected end of")||j.includes("unexpected token")||j.includes("json")&&(j.includes("parse")||j.includes("invalid"))||j.includes("truncated")||j.includes("malformed")||j.includes("corrupt"))return"corruption";return"unknown"},L2=()=>s4({dbPath:A,encryptionKey:w,adapterName:p,adapterOptions:i});try{U=await L2()}catch(L){let j=L,k=t(L),R2=[500,2000,8000];if(k==="transient"||k==="unknown"){G().logger.warn("app",`Storage open failed (${k}); will retry up to ${R2.length} times before quarantine`,{error:L instanceof Error?L.message:String(L),path:A});for(let U2 of R2){await new Promise((P)=>setTimeout(P,U2));try{U=await L2(),j=null;break}catch(P){if(j=P,k=t(P),G().logger.warn("app",`Storage open retry failed (${k}) after ${U2}ms`,{error:P instanceof Error?P.message:String(P)}),k==="corruption")break}}}if(!U&&j){if(k!=="corruption"){let P=j instanceof Error?j.message:String(j);G().logger.error("app",`Storage open failed after retries with non-corruption error (${k}); refusing to quarantine valid data`,{error:P,path:A}),G().recordDegradedReason("storage",P);try{throw j}catch(G2){throw Error(`Storage open failed (${k}); agent is degraded: ${P}`,{cause:G2})}}let U2=j instanceof Error?j.message:String(j);G().logger.error("app","QUARANTINE: Storage file is corrupt \u2014 renaming and creating fresh DB",{errorClass:"corruption",error:U2,path:A});try{let P=await import("fs");if(P.existsSync(A)){let G2=new Date().toISOString().replace(/[:.]/g,"-"),R0=`${A}.broken-${G2}`;P.renameSync(A,R0),G().logger.warn("app",`Quarantined corrupt storage to ${R0} \u2014 fresh DB will be created`,{originalError:U2})}U=await L2()}catch(P){let G2=P instanceof Error?P.message:String(P);throw G().recordDegradedReason("storage",G2),Error(`Storage open failed twice (quarantine path); agent is degraded: ${G2}`,{cause:P})}}}if(!U)throw Error("Internal error: storage open recovery exited without an open database and without throwing");if(await D2({clientId:O.clientId,clientSecret:O.clientSecret,workspaceId:O.workspaceId,organizationId:O.organizationId,globalGatewayUrl:O.globalGatewayUrl,workspaceGatewayUrl:O.workspaceGatewayUrl,agentRecordId:M?.agentRecordId,scopes:M?.scopes},{dir:G().dataDir,scope:G().name}),await U.setConfig("gateway-auth:clientId",O.clientId),await U.setConfig("gateway-auth:clientSecret",O.clientSecret),await U.setConfig("gateway-auth:globalGatewayUrl",O.globalGatewayUrl),await U.setConfig("gateway-auth:workspaceGatewayUrl",O.workspaceGatewayUrl),await U.setConfig("gateway-auth:workspaceId",O.workspaceId),O.organizationId)await U.setConfig("gateway-auth:organizationId",O.organizationId);if(M?.agentRecordId)await U.setConfig("gateway-auth:agentRecordId",M.agentRecordId);H.db=U,await H.hydrateDefaultsFromDb(),V=new T5(U),await V.loadCorePlugins();try{await V.loadAll()}catch(L){G().logger.warn("app","Failed to load some external plugins",{error:String(L)})}let O2=E5(K2())??void 0,j2=process.env.VIBE_SKIP_AUTO_INSTALL==="1"||await U.getConfig("plugins:auto-install-disabled");if(j2!=="true"&&j2!==!0)try{let L=await V.ensureDefaultPlugins((j)=>G().logger.info("app",`[auto-install] ${j}`),[],O2);if(L.length>0)G().logger.info("app",`Auto-installed ${L.length} default plugin(s): ${L.map((j)=>j.packageName).join(", ")}`)}catch(L){G().logger.warn("app","Failed to auto-install default plugins",{error:String(L)})}G().logger.info("app",`Plugins loaded: ${V.getPluginDetails().length} total (${V.getPluginDetails().filter((L)=>L.isCore).length} core)`);try{let L=V.getPluginDetails(),j={loaded:L.filter((k)=>k.loaded).length,failed:L.filter((k)=>!k.loaded).length};f0(j)}catch{}let r2={async get(L,j){return await U.getPluginState(L,j)??null},async set(L,j,k){await U.setPluginState(L,j,k)},async delete(L,j){return U.deletePluginState(L,j)},async list(L){return await U.getAllPluginState(L)},async deleteAll(L){return U.deleteAllPluginState(L)}},q2=await a4();E={storage:r2,logger:G().logger,serviceRegistry:H,getProvider:(L)=>H.getProvider(L),getAgentBaseUrl:()=>process.env.AGENT_URL||`http://localhost:${Z}`,getAgentVersion:()=>q2,validateApiKey:(L)=>l(L),setCodeServerSessionValidator:(L)=>{q5=L},broadcast:J2,workspaceQuery:async(L,j)=>g.workspaceQuery(L,j),isGatewayConfigured:()=>g.isConfigured(),getAgentRecordId:async()=>await U.getConfig("gateway-auth:agentRecordId")??null,getWorkspaceId:async()=>await U.getConfig("gateway-auth:workspaceId")??null,getConfig:async(L)=>await U.getConfig(L)??void 0,getPluginRegistry:()=>d2(),getDataDir:()=>S2(),cliContributors:new L5,audit:{emit:(L,j)=>G().audit.emit("agent",L,j??{})},telemetry:{emit:(L,j)=>{import("./telemetry-tnq47dcs.js").then(({telemetryService:k})=>k.emit(L,j??{})).catch(()=>{})}},os:N2(),iframeBridge:M5()},g.configure({globalGatewayUrl:O.globalGatewayUrl,workspaceGatewayUrl:O.workspaceGatewayUrl,clientId:O.clientId,clientSecret:O.clientSecret,workspaceId:O.workspaceId,organizationId:O.organizationId});let H2={db:U,serviceRegistry:H,pluginManager:V,broadcast:J2,hostServices:E};H2.app=r;let q0=!1,t2=()=>{let{routes:L,getPublicPaths:j,mountPlugin:k}=Q5(V,H2);if(H2.mountPlugin=k,F=j,X5(),T=L,x=x5(V),V&&q0&&E)V.dispatchServerStart(T,E).catch((R2)=>G().logger.warn("app","Re-dispatch of onServerStart after plugin reload failed",{error:String(R2)}));q0=!0};H2.rebuildPluginSurfaces=t2,t2(),q=new j5(H,V,U,r,E,W2),H.registerService("agent","lifecycle",q),G().attachServices({db:U,serviceRegistry:H,pluginManager:V,lifecycle:q,hostServices:E}),_5(G(),{rebuildPluginSurfaces:t2,mountPlugin:H2.mountPlugin});try{await G().keyVault.bindApiKey(M2())}catch(L){G().logger.warn("app","Failed to bind api key into daemon keyVault",{error:String(L)})}let e2=[];try{let{failures:L}=await V.dispatchServerStart(T,E);for(let j of L)if(T0(j.plugin)||(j.packageName?T0(j.packageName):!1))e2.push(j),G().recordDegradedReason(j.plugin,j.error);else G().logger.warn("app",`Non-critical plugin ${j.plugin} failed onServerStart; continuing`,{error:j.error})}catch(L){G().logger.warn("app","Error during plugin onServerStart dispatch",{error:String(L)})}try{await V.dispatchServerReady(r,E)}catch(L){G().logger.warn("app","Error during plugin onServerReady dispatch",{error:String(L)})}if(G().clearFinalizeError(),e2.length>0)G().setBootState("degraded"),G().logger.error("app","Agent finalized but degraded \u2014 critical plugins failed",{failures:e2.map((L)=>`${L.plugin}: ${L.error}`)});else G().setBootState("ready"),G().logger.info("app","Agent finalized \u2014 state=ready"),G().audit.emit("agent","gateway-auth.configured",{workspaceId:O.workspaceId,organizationId:O.organizationId,agentRecordId:M?.agentRecordId});return(async()=>{try{if(await V.provisionDefaultPrereqs(r,E,H2.mountPlugin,O2),G().logger.info("app","Default provider prerequisites provisioned"),(H.listProvidersForType("tunnel")??[]).some((k)=>k.pluginName!=="bootstrap")){let{tryHandoverBootstrapTunnel:k}=await import("./tunnel-bootstrap-2kg79ng8.js");if(!k())E0();H.unregisterProvider("tunnel","bootstrap"),G().logger.info("app","Bootstrap tunnel handed over to the real tunnel provider")}}catch(L){G().logger.warn("app","Plugin prerequisite provisioning failed",{error:String(L)})}})(),{ok:!0}}catch(O){G().setBootState("awaiting-config");let w=O instanceof Error?O.message:String(O);if(G().recordFinalizeError(w),G().logger.error("app","Finalize failed",{error:w}),process.env.VIBE_STRICT_KEY_FETCH==="1")G().logger.error("app","VIBE_STRICT_KEY_FETCH=1 \u2192 aborting daemon (strict mode)",{error:w}),setTimeout(()=>process.exit(1),50);return{ok:!1,error:w}}finally{R=null}})(),R},z2=w0({origin:(_)=>{let M=_.headers.get("origin");return!!M&&C(M)},credentials:!0,allowedHeaders:K.split(",").map((_)=>_.trim()),methods:B.split(",").map((_)=>_.trim()),exposeHeaders:["content-type","content-length"],maxAge:86400,preflight:!0}),F2=10485760,C0=process.env.VIBECONTROLS_MAX_BODY_BYTES,s2=C0?Number.parseInt(C0,10):NaN,R5=Number.isFinite(s2)&&s2>0?s2:F2,I0={current:null},r=new D({serve:{maxRequestBodySize:R5}}).onRequest(({request:_,set:M})=>{let w=r4(_.headers)??x0();t4({requestId:w,startedAt:new Date().toISOString()});let A=M.headers??={};A["X-Request-Id"]=w}).onRequest(({request:_})=>{try{let M=new URL(_.url).pathname,w=/^\/api\/profiles\/([^/]+)(?:\/|$)/.exec(M)?.[1],A=w?a.get(w):null;M0(A??G())}catch{M0(G())}}).onRequest(({request:_,set:M})=>{let O=new URL(_.url).pathname;if(!O.startsWith("/api/"))return;if(O==="/api/profiles"||O.startsWith("/api/profiles/"))return;if(O==="/api/profile-stats"||O.startsWith("/api/profile-stats/"))return;let w=new URL(_.url);w.pathname=`/api/profiles/default${O.slice(4)}`;try{_.headers.set("x-vc-profile-rewrite","1"),_.headers.set("x-vc-profile-rewrite-target",w.pathname)}catch{}return}).derive(()=>({requestId:e4()??x0()})).use(z2).use(W5()).use(Y5(()=>F())).use(D0({getDb:()=>b()?.db??U})).onBeforeHandle(({request:_,set:M})=>{let O=G().getBootState();if(O==="ready")return;let w=new URL(_.url).pathname;if(fQ(w))return;return M.status=503,{error:"Agent not yet configured",message:"Agent is in '"+O+"' state. POST credentials to /api/agent/gateway-auth to finalize.",state:O}}).onAfterHandle(({request:_,set:M})=>{let O=new URL(_.url).pathname,w=O==="/health"||O.startsWith("/api/logs/stream")||O.startsWith("/ui/")||O==="/ws/events"||O==="/api/sessions/health-check"||O.startsWith("/terminal/"),A=typeof M.status==="number"?M.status:200,v=w?"debug":A>=400?"warn":"info";G().logger[v]("http",`${_.method} ${O} \u2192 ${A}`,{method:_.method,path:O,statusCode:A});try{P0(_.method,yQ(O),A)}catch{}}).use(W4({serviceRegistry:H,getDb:()=>b()?.db??U,getDbPath:()=>W,getPluginManager:()=>b()?.pluginManager??V})).use(y0()).use(i0({serviceRegistry:H,runFinalize:(_,M)=>a2(_,M),getDb:()=>b()?.db??U})).use(H4()).use(G4()).use(h4({getPluginManager:()=>b()?.pluginManager??V})).use(i4()).use(_4()).use(x4({getPluginManager:()=>b()?.pluginManager??V,getTunnelHost:()=>C5()?.url??null})).use($4()).use(J4()).use(B5()).use(K5()).use(V5(H)).ws("/code-server/*",uQ(Z)).all("/api/profiles/:name/*",async({params:_,request:M,set:O})=>{let w=M.method!=="GET"&&M.method!=="HEAD",A=w?await M.arrayBuffer():void 0,v=await N5(_.name,M,A);if(v&&v.status!==404)return v;let p=E2(),i=_.name;if(i!==p)return O.status=404,{error:"profile-mismatch",running:p,requested:i,hint:"This daemon serves a different profile. Call GET /api/profiles to discover the right tunnel."};let t=new URL(M.url),L2=t.pathname.replace(/^\/api\/profiles\/[^/]+/,"/api"),O2=new Headers(M.headers);O2.set("x-vc-profile-rewrite","1");let j2={method:M.method,headers:O2};if(w&&A!==void 0)j2.body=A;let r2=new Request(`${t.origin}${L2}${t.search}`,j2),q2=I0.current;if(!q2)return new Response(JSON.stringify({error:"agent-not-ready"}),{status:503,headers:{"content-type":"application/json"}});return q2.handle(r2)}).all("/api/*",async({request:_})=>{if(G().getBootState()!=="ready"||!T)return new Response(JSON.stringify({error:"Agent not yet configured",state:G().getBootState(),message:"Plugin routes are unavailable until the agent reaches state=ready. POST credentials to /api/agent/gateway-auth to finalize."}),{status:503,headers:{"content-type":"application/json"}});try{let M=new URL(_.url),O=/^\/api\/plugins\/([a-z0-9-]{1,64})\/ui(?:\/.*)?$/.exec(M.pathname);if(O&&_.method==="GET"){let w=O[1];if(x2(w)){let A=M.pathname.slice(`/api/plugins/${w}/ui`.length),v=A===""||A==="/",i=_.headers.get("sec-fetch-mode")==="navigate";if(v||i){let t=J5(_,w);if(!t||!Z5(t,w))return new Response(U5(w,"/api/profiles/default/agent/ui-exchange-plugin"),{status:200,headers:{"content-type":"text/html; charset=utf-8","Content-Security-Policy":"frame-ancestors '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"}})}}}}catch{}return T.handle(_)}).all("/ui/*",async({request:_})=>{if(G().getBootState()!=="ready"||!x)return new Response("Plugin UI not yet available",{status:503});return x.handle(_)}).all("/code-server/*",async({request:_})=>{if(G().getBootState()!=="ready"||!T)return new Response("code-server not yet available",{status:503});return T.handle(_)}).all("/plan/*",async({request:_})=>{if(G().getBootState()!=="ready"||!T)return new Response("plan provider not yet available",{status:503});return T.handle(_)});return I0.current=r,{app:r,async start(){r.listen({port:Z,hostname:Q}),G().logger.info("app",`Agent server listening on ${Q}:${Z}`);try{let _=(process.env.VIBECONTROLS_PROFILES??"").split(",").map((v)=>v.trim()).filter(Boolean),M=G().name,{getOrCreateProfile:O}=await import("./daemon-profile-vas1vf2t.js"),{attachSecondaryProfile:w}=await import("./secondary-profile-attach-db5cr3e1.js"),A=process.env.VIBE_STRICT_KEY_FETCH==="1";for(let v of _){if(v===M)continue;try{let p=O(v),i=await w(p);if(i.ok)G().logger.info("app",`Secondary profile '${v}' attached (db+services online)`);else if(A)throw Error(`attachServices for secondary profile '${v}' failed: ${i.error}`);else p.recordDegradedReason("attach",i.error??"unknown"),G().logger.warn("app",`Secondary profile '${v}' is degraded (no creds / attach failed)`,{error:i.error})}catch(p){if(A)throw G().logger.error("app",`--strict-key-fetch: secondary profile '${v}' attach failed; aborting`,{error:String(p)}),setTimeout(()=>process.exit(1),50),p;G().logger.warn("app",`Failed to attach secondary profile '${v}'`,{error:String(p)})}}}catch{}return r},stop:W2,finalize:a2,getState:()=>G().getBootState(),getLifecycle:()=>b()?.lifecycle??q,getDb:()=>b()?.db??U,getServiceRegistry:()=>b()?.serviceRegistry??H,getPluginManager:()=>b()?.pluginManager??V,getHostServices:()=>b()?.hostServices??E}}var q5=null;function cQ($,Z){if(!$)return null;let Q=$.match(new RegExp(`(?:^|;\\s*)${Z}=([^;]*)`));return Q?Q[1]:null}var o4=z5(H5);function uQ($){let X=(J)=>typeof J==="string"?Buffer.byteLength(J):J.byteLength;return{open(J){let W=J.data,H=m(W.headers??{})??m(W.request?Object.fromEntries(W.request.headers.entries()):{}),B=W.query?.vt,K=!!B&&$5(B,"/code-server","GET"),N,I=l(H);if(!I&&!K){let E=W.headers?.cookie??W.request?.headers.get("cookie")??null,q=cQ(E,"__vibe_cs_session");if(!q||!q5?.(q)){J.close(1008,"Unauthorized");return}N=`session:${q}`}else if(I)N="api-key";else N="vt";let C=J.remoteAddress??null,U=G5(C,W.headers);if(!o4.accept(N,U,J)){G().logger.warn("code-server-ws",`code-server WS cap exceeded (key=${N}, ip=${U??"unknown"})`),J.close(1013,"too many connections");return}W._csCapKey=N,W._csRemoteIp=U;let V=G().name;fetch(`http://127.0.0.1:${$}/api/profiles/${encodeURIComponent(V)}/code-server/status`,{headers:{"x-agent-api-key":M2()}}).then((E)=>E.json()).then((E)=>{if(W._csClosed)return;let q=E;if(!q.running||!q.port){J.close(1011,"code-server not running");return}let h=W.request?.url??"/code-server/",F;try{let R=new URL(h,`http://127.0.0.1:${q.port}`);F=(R.pathname.replace(/^\/code-server\/?/,"/")||"/")+R.search}catch{F="/"}let T=new WebSocket(`ws://127.0.0.1:${q.port}${F}`),x={upstream:T,ready:!1,buffer:[],bufferBytes:0,openTimer:setTimeout(()=>{try{T.close(1011,"upstream open timeout")}catch{}try{J.close(1011,"upstream open timeout")}catch{}},1e4)};W._csBridge=x,T.addEventListener("open",()=>{clearTimeout(x.openTimer),x.ready=!0;for(let R of x.buffer)T.send(R);x.buffer.length=0,x.bufferBytes=0}),T.addEventListener("message",(R)=>{try{let u=R.data;if(u instanceof ArrayBuffer)J.send(new Uint8Array(u));else if(u instanceof Blob)u.arrayBuffer().then((y)=>{try{J.send(new Uint8Array(y))}catch{}});else J.send(u)}catch{}}),T.addEventListener("close",(R)=>{clearTimeout(x.openTimer);try{J.close(R.code||1000,R.reason||"upstream closed")}catch{}}),T.addEventListener("error",()=>{clearTimeout(x.openTimer);try{J.close(1011,"upstream error")}catch{}})}).catch(()=>{J.close(1011,"Failed to query code-server status")})},message(J,W){let H=J.data?._csBridge;if(!H)return;let B;if(typeof W==="string")B=W;else if(W instanceof ArrayBuffer)B=W;else if(W instanceof Uint8Array||Buffer.isBuffer(W)){let K=new ArrayBuffer(W.byteLength);new Uint8Array(K).set(new Uint8Array(W.buffer,W.byteOffset,W.byteLength)),B=K}else if(typeof W==="object"&&W!==null)B=JSON.stringify(W);else B=String(W);if(H.upstream&&H.ready&&H.upstream.readyState===WebSocket.OPEN)try{H.upstream.send(B)}catch{}else{let K=X(B);if(H.buffer.length>=256||H.bufferBytes+K>1048576){try{H.upstream.close(1013,"buffer limit exceeded")}catch{}try{J.close(1013,"buffer limit exceeded")}catch{}return}H.buffer.push(B),H.bufferBytes+=K}},close(J){J.data._csClosed=!0;let W=J.data?._csBridge;if(W?.openTimer)clearTimeout(W.openTimer);if(W?.upstream&&W.upstream.readyState===WebSocket.OPEN)W.upstream.close(1000,"client disconnected");let H=J.data._csCapKey,B=J.data._csRemoteIp;if(H)o4.release(H,B??null,J)}}}async function a4(){try{let{readFileSync:$}=await import("fs"),{join:Z,dirname:Q}=await import("path"),{fileURLToPath:Y}=await import("url"),X=Q(Y(import.meta.url));return JSON.parse($(Z(X,"..","package.json"),"utf8")).version||"1.0.0"}catch{return"1.0.0"}}
26
+ export{X6 as j,m0 as k,NQ as l,B7 as m,l8 as n};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ var G=new Set(["localhost","127.0.0.1","0.0.0.0","::1","[::1]"]);function I(b){return b.toLowerCase().replace(/^\[|\]$/g,"")}function J(b,j){let x=b.headers;if(x.has("cf-connecting-ip")||x.has("x-forwarded-for")||x.has("x-real-ip")||x.has("forwarded"))return!1;let D=j?.requestIP(b)?.address;if(!D)return!1;return G.has(I(D))}function M(b){return`security:${b.toLowerCase()}`}function E(b){if(!b)return!1;let j=b.trim().toLowerCase();return j==="1"||j==="true"||j==="yes"}async function N(b,j,x,D){if(J(b,x))return null;if(E(process.env[j]))return null;if(D?.getConfig)try{let F=await D.getConfig(M(j));if(E(F))return null}catch{}return`This operation is local-only by default. Set ${j}=1 to allow it over a tunnel, or toggle it from the agent's Security Settings.`}
3
+ export{J as h,N as i};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{randomBytes as G,timingSafeEqual as J}from"crypto";var M="x-vc-internal-auth",z=G(32).toString("hex");function U(){return z}function V(F){let j=F.get(M);if(!j)return!1;let w=Buffer.from(j),x=Buffer.from(z);return w.length===x.length&&J(w,x)}
3
+ export{M as Qb,U as Rb,V as Sb};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{ic as O,jc as L,kc as Y}from"./index-5mw3eshk.js";import{nc as D,pc as R,qc as U,rc as W,tc as C,uc as E,vc as X,wc as I,xc as K}from"./index-z5a4yxzz.js";import{Rc as J,nd as T,pd as V,rd as w}from"./index-g2raeeh4.js";import{Xd as h}from"./index-0cn9bv8z.js";async function P(){if(process.env.AGENT_API_KEY)return process.env.AGENT_API_KEY;let F="default";try{F=h()}catch{}let H=await J(`${F}:static-api-key`);if(H)return H;return T()["static-api-key"]??null}var j=["read","mutate","plugin:install","plugin:remove","update","admin"];function _(F){if(F.length<=12)return"[redacted]";return`${F.slice(0,8)}...${F.slice(-4)}`}function x(){let F=new Uint8Array(32);return crypto.getRandomValues(F),`vcak_${Buffer.from(F).toString("base64url")}`}function b(){return crypto.randomUUID()}function A(F){if(!F)return;let H=/^(\d+)([smhdw]?)$/.exec(F.trim());if(!H)throw Error(`Invalid --expires-in: ${F} (use 30s, 12h, 7d, 4w; bare digits = days)`);let q=Number(H[1]),N=H[2]||"d",z=N==="s"?q*1000:N==="m"?q*60000:N==="h"?q*3600000:N==="w"?q*7*86400000:q*86400000;return new Date(Date.now()+z).toISOString()}function S(F){if(!F)return["read"];let H=F.split(",").map((q)=>q.trim()).filter(Boolean);for(let q of H)if(!j.includes(q))throw Error(`Unknown scope: ${q}. Allowed: ${j.join(", ")}`);return H}function f(F){let H=F.command("key").description("Show or manage VibeControls agent API keys");H.command("show",{isDefault:!0}).description("Show the default agent API key").option("--show-secret","Print the full API key",!1).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(q){let N={...F.opts(),...q};try{await L({mode:O(N),fetchData:async()=>{return{apiKey:await P()??null}},plain:(z)=>{if(E("Agent API Key"),I(),!z.apiKey){R("No API key found in AGENT_API_KEY or local agent config.");return}if(X("API Key",D.bold(q.showSecret?z.apiKey:_(z.apiKey))),!q.showSecret)X("Full key",D.dim("hidden; rerun with --show-secret"));I()},json:(z)=>({apiKey:z.apiKey?q.showSecret?z.apiKey:"[redacted]":null})})}catch(z){R(`Failed to get API key: ${U(z)}`)}}),H.command("list").description("List all scoped API keys (default + minted)").option("--json","Emit JSON").option("--plain","Force plain text output").option("--show-secret","Include full key values in JSON output",!1).action(async function(q){let N={...F.opts(),...q};try{await L({mode:O(N),fetchData:()=>w(),plain:(z)=>{let B=[],Q=z["static-api-key"];if(Q)B.push({ID:"default",Name:"default",Scopes:"admin",Expires:"never",Key:_(Q)});for(let G of z.apiKeys??[])B.push({ID:G.id??"(legacy)",Name:G.name,Scopes:G.scopes.join(","),Expires:G.expiresAt??"never",Key:_(G.key)});if(B.length===0){C("No keys configured.");return}E("Agent API Keys"),K(B)},json:(z)=>{let B=[],Q=z["static-api-key"];if(Q)B.push({id:"default",name:"default",scopes:["admin"],expiresAt:null,key:q.showSecret?Q:"[redacted]"});for(let G of z.apiKeys??[])B.push({id:G.id??"(legacy)",name:G.name,scopes:G.scopes,expiresAt:G.expiresAt??null,key:q.showSecret?G.key:"[redacted]"});return B}})}catch(z){R(U(z))}}),H.command("add").description("Mint a new scoped API key").requiredOption("--name <name>","Display name (logs only)").option("--scope <scope>",`Comma-separated scope list (default: read). Allowed: ${j.join(",")}`,"read").option("--expires-in <duration>","TTL (e.g. 7d, 12h, 30m). Omit for no expiry.").option("--not-before <iso>","ISO timestamp before which the key is rejected.").option("--json","Emit JSON").action(function(q){let N={...F.opts(),...q};try{let z=S(q.scope),B=A(q.expiresIn),Q=T(),G=b(),Z=x(),$={id:G,name:q.name,key:Z,scopes:z,expiresAt:B,notBefore:q.notBefore,createdAt:new Date().toISOString()},M=[...Q.apiKeys??[],$];if(V({apiKeys:M}),Y(N,{ok:!0,id:G,name:q.name,scopes:z,expiresAt:B??null,key:Z}))return;if(W(`Minted key ${G}`),X("Name",q.name),X("Scopes",z.join(",")),B)X("Expires",B);if(q.notBefore)X("Not before",q.notBefore);I(),X("Key (save now)",D.bold(Z))}catch(z){if(N.json){Y(N,{ok:!1,error:U(z)});return}R(U(z))}}),H.command("revoke <id>").description("Revoke a scoped key by ID").option("--json","Emit JSON").action(function(q,N){let z={...F.opts(),...N};try{let B=T(),Q=(B.apiKeys??[]).length,G=(B.apiKeys??[]).filter((Z)=>Z.id!==q);if(G.length===Q){if(z.json){Y(z,{ok:!1,error:`No key with id ${q}`});return}R(`No key with id ${q}`);return}if(V({apiKeys:G}),Y(z,{ok:!0,id:q}))return;W(`Revoked key ${q}`)}catch(B){if(z.json){Y(z,{ok:!1,error:U(B)});return}R(U(B))}}),H.command("rotate <id>").description("Rotate the secret of an existing scoped key (preserves scopes/expiry)").option("--json","Emit JSON").action(function(q,N){let z={...F.opts(),...N};try{let B=T();if(!(B.apiKeys??[]).find(($)=>$.id===q)){if(z.json){Y(z,{ok:!1,error:`No key with id ${q}`});return}R(`No key with id ${q}`);return}let G=x(),Z=(B.apiKeys??[]).map(($)=>$.id===q?{...$,key:G}:$);if(V({apiKeys:Z}),Y(z,{ok:!0,id:q,key:G}))return;W(`Rotated key ${q}`),X("New key (save now)",D.bold(G))}catch(B){if(z.json){Y(z,{ok:!1,error:U(B)});return}R(U(B))}})}
3
+ export{P as Vb,f as Wb};
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ function V(j){let H=[["--version"],["-V"],["version"]];for(let F of H)try{let z=Bun.spawnSync([j,...F],{timeout:5000,stdout:"pipe",stderr:"pipe"});if(z.exitCode===0){let J=z.stdout.toString().trim(),K=z.stderr.toString().trim();return{installed:!0,version:(J||K).split(`
3
+ `)[0]||void 0}}}catch{}try{if(Bun.which(j,{PATH:process.env.PATH}))return{installed:!0}}catch{}return{installed:!1}}var X=[{name:"bun",cmd:"bun",required:!0,category:"runtime"}];function Z(j){let H=X.map((F)=>{let{installed:z,version:J}=V(F.cmd);return{name:F.name,installed:z,version:J,required:F.required,category:F.category}});if(j!==void 0){let F=j instanceof Set?j:new Set(j);for(let z of F){if(H.some((Q)=>Q.name===z))continue;let{installed:J,version:K}=V(z);H.push({name:z,installed:J,version:K,required:!1,category:"tool"})}}return H}async function $(j){return{success:!0,installed:[],failed:[],skipped:j??[]}}
4
+ export{Z as O,$ as P};
@@ -0,0 +1,9 @@
1
+ // @bun
2
+ import{he as I}from"./index-yy1mm8zs.js";async function g(){return await import("./index-scsjyj4m.js")}var E=/\x1b\[[0-9;]*m/g;function P(z){return z.replace(E,"")}async function A(z){if(z.rows.length===0)return null;let J=await g(),{createCliRenderer:D,BoxRenderable:X,TextRenderable:U,SelectRenderable:V,SelectRenderableEvents:K}=J,F=await D({exitOnCtrlC:!0,targetFps:30}),G=F.root.ctx,H=new X(G,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),M=new U(G,{content:` ${z.title}`,fg:"#8be9fd",height:1}),O=new U(G,{content:` ${z.footer??"\u2191/\u2193 navigate \xB7 Enter select \xB7 q quit"}`,fg:"#6c7086",height:1}),_=new X(G,{width:"100%",flexGrow:1,flexDirection:"row"}),L=new V(G,{width:z.listWidth??28,height:"100%",options:z.rows.map((j)=>({name:P(j.label),description:P(j.hint??""),value:j.id})),selectedIndex:0,showDescription:!0,backgroundColor:"#0b0d12",textColor:"#cdd6f4",focusedBackgroundColor:"#0b0d12",focusedTextColor:"#cdd6f4",selectedBackgroundColor:"#1f2335",selectedTextColor:"#a6e3a1",descriptionColor:"#6c7086",selectedDescriptionColor:"#9399b2",showScrollIndicator:!0,wrapSelection:!0}),W=new X(G,{flexGrow:1,height:"100%",flexDirection:"column",paddingLeft:2,paddingRight:2,backgroundColor:"#11141c"}),Y=new U(G,{content:"",fg:"#cdd6f4"});W.add(Y),_.add(L),_.add(W),H.add(M),H.add(_),H.add(O),F.root.add(H),L.focus();let Z=(j)=>{let $=z.rows[j];if(!$)return;Y.content=`
3
+ ${P($.detail)}
4
+ `};return Z(0),L.on(K.SELECTION_CHANGED,(j)=>{Z(j)}),await new Promise((j)=>{let $=(Q)=>{try{F.destroy()}catch{}j(Q)};L.on(K.ITEM_SELECTED,()=>{let Q=z.rows[L.getSelectedIndex()];$(Q??null)}),F.keyInput.on("keypress",(Q)=>{if(Q.name==="escape"||Q.name==="q")$(null)})}).then(async(j)=>{if(j&&z.onSelect)await z.onSelect(j);return j})}async function C(z){let J=await g(),{createCliRenderer:D,BoxRenderable:X,TextRenderable:U}=J,V=await D({exitOnCtrlC:!0,targetFps:30}),K=V.root.ctx,F=new X(K,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),G=new U(K,{content:` ${z.title}`,fg:"#8be9fd",height:1}),H=new X(K,{width:"100%",flexGrow:1,paddingLeft:2,paddingRight:2,backgroundColor:"#11141c"}),M=new U(K,{content:`
5
+ ${P(z.body)}
6
+ `,fg:"#cdd6f4"}),O=new U(K,{content:` ${z.footer??"q to quit"}`,fg:"#6c7086",height:1});H.add(M),F.add(G),F.add(H),F.add(O),V.root.add(F),await new Promise((_)=>{let L=()=>{try{V.destroy()}catch{}_()};V.keyInput.on("keypress",(W)=>{if(W.name==="escape"||W.name==="q"||W.name==="return")L()})})}async function S(z,J,D=0){if(J.length===0)return null;let X=await g(),{createCliRenderer:U,BoxRenderable:V,TextRenderable:K,SelectRenderable:F,SelectRenderableEvents:G}=X,H=await U({exitOnCtrlC:!0,targetFps:30}),M=H.root.ctx,O=new V(M,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),_=new K(M,{content:` ${z}`,fg:"#8be9fd",height:1}),L=new F(M,{width:"100%",flexGrow:1,options:J.map((Y)=>({name:P(Y.label),description:P(Y.hint??""),value:Y.value})),selectedIndex:D,showDescription:!0,backgroundColor:"#0b0d12",textColor:"#cdd6f4",focusedBackgroundColor:"#0b0d12",focusedTextColor:"#cdd6f4",selectedBackgroundColor:"#1f2335",selectedTextColor:"#a6e3a1",descriptionColor:"#6c7086",selectedDescriptionColor:"#9399b2",showScrollIndicator:!0,wrapSelection:!0}),W=new K(M,{content:" \u2191/\u2193 move \xB7 Enter select \xB7 q cancel",fg:"#6c7086",height:1});return O.add(_),O.add(L),O.add(W),H.root.add(O),L.focus(),await new Promise((Y)=>{let Z=(j)=>{try{H.destroy()}catch{}Y(j)};L.on(G.ITEM_SELECTED,()=>{let j=J[L.getSelectedIndex()];Z(j?.value??null)}),H.keyInput.on("keypress",(j)=>{if(j.name==="escape"||j.name==="q")Z(null)})})}async function f(z,J,D){let X=await g(),{createCliRenderer:U,BoxRenderable:V,TextRenderable:K}=X,F=new Set(D);for(let j of J)if(j.mandatory)F.add(j.key);let G=0,H=await U({exitOnCtrlC:!0,targetFps:30}),M=H.root.ctx,O=new V(M,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),_=new K(M,{content:` ${z}`,fg:"#8be9fd",height:1}),L=new V(M,{width:"100%",flexGrow:1,paddingLeft:2,paddingTop:1,backgroundColor:"#0b0d12"}),W=new K(M,{content:"",fg:"#cdd6f4"}),Y=new K(M,{content:" \u2191/\u2193 move \xB7 space toggle \xB7 Enter confirm \xB7 q cancel",fg:"#6c7086",height:1});L.add(W),O.add(_),O.add(L),O.add(Y),H.root.add(O);let Z=()=>{W.content=J.map((j,$)=>{let q=j.mandatory||F.has(j.key)?"[x]":"[ ]",N=$===G?"\u203A":" ",w=j.mandatory?" (required)":"";return` ${N} ${q} ${j.label}${w}
7
+ ${P(j.description)}`}).join(`
8
+ `)};return Z(),await new Promise((j)=>{let $=(Q)=>{try{H.destroy()}catch{}j(Q)};H.keyInput.on("keypress",(Q)=>{let q=Q.name;if(q==="up"||q==="k")G=(G-1+J.length)%J.length,Z();else if(q==="down"||q==="j")G=(G+1)%J.length,Z();else if(q==="space"||Q.sequence===" "){let N=J[G];if(N&&!N.mandatory){if(F.has(N.key))F.delete(N.key);else F.add(N.key);Z()}}else if(q==="return"){for(let N of J)if(N.mandatory)F.add(N.key);$(F)}else if(q==="escape"||q==="q")$(null)})})}
9
+ export{P as Ec,A as Fc,C as Gc,S as Hc,f as Ic};
@@ -0,0 +1,11 @@
1
+ // @bun
2
+ import{Nd as p}from"./index-9bqd8veb.js";import{Qd as K,Xd as Mq,_d as wq,be as j}from"./index-0cn9bv8z.js";import{existsSync as G,mkdirSync as u,readdirSync as mq,readFileSync as B,renameSync as P,rmSync as oq,writeFileSync as D}from"fs";import{dirname as k,join as v}from"path";import{randomUUID as pq}from"crypto";import{existsSync as b,mkdirSync as d,readFileSync as Zq,renameSync as Jq,unlinkSync as Tq,writeFileSync as F}from"fs";import{dirname as E,join as V}from"path";import{spawnSync as r}from"child_process";import{hostname as Lq,networkInterfaces as xq,platform as Xq,userInfo as Cq}from"os";import{createCipheriv as Fq,createDecipheriv as Nq,pbkdf2Sync as Aq,randomBytes as Rq}from"crypto";var n="secrets:fallback",Wq="secrets:index",t=10,uq=100,a=new Map;function Hq(q,Q){let $=`${q}:${Q}`,z=(a.get($)??0)+1;if(a.set($,z),z<=t)return!0;return(z-t)%uq===0}var C="vibecontrols-agent",Yq=".libsecret-install-attempted",jq="secrets.json";function Pq(){return globalThis.Bun?.secrets??null}class S{api;kind="bun-secrets";constructor(q){this.api=q}async get(q){return this.api.get({service:C,name:q})}async set(q,Q){await this.api.set({service:C,name:q,value:Q}),await yq(q)}async delete(q){let Q=await this.api.delete({service:C,name:q});return await lq(q),Q}async list(q){return Eq(q)}}var Gq=".secrets-encrypted-v1",kq=1e5,vq=32,Iq="sha256",L=null,e=null;function _q(){let q=xq();for(let Q of Object.values(q)){if(!Q)continue;for(let $ of Q){let z=$?.mac;if(z&&z!=="00:00:00:00:00:00")return z}}return"no-mac"}function qq(){if(e!==null)return e;let q;try{q=Cq().username||"unknown"}catch{q=process.env.USER||process.env.USERNAME||"unknown"}return`${Lq()}|${q}|${_q()}`}function Vq(){if(L)return L;let q=`vibecontrols-agent::${qq()}`;return L=Aq(q,qq(),kq,vq,Iq),L}function Qq(q){let Q=Rq(12),$=Fq("aes-256-gcm",Vq(),Q),z=Buffer.concat([$.update(q,"utf8"),$.final()]),Z=$.getAuthTag();return`${Q.toString("hex")}:${Z.toString("hex")}:${z.toString("hex")}`}function hq(q){let Q=q.split(":");if(Q.length!==3)return!1;let[$,z,Z]=Q;return/^[0-9a-f]+$/i.test($)&&$.length===24&&/^[0-9a-f]+$/i.test(z)&&z.length===32&&/^[0-9a-f]*$/i.test(Z)}function gq(q){if(!hq(q))return null;try{let[Q,$,z]=q.split(":"),Z=Nq("aes-256-gcm",Vq(),Buffer.from(Q,"hex"));return Z.setAuthTag(Buffer.from($,"hex")),Buffer.concat([Z.update(Buffer.from(z,"hex")),Z.final()]).toString("utf8")}catch{return null}}class Kq{kind="json-fallback";path;constructor(){this.path=V(j(),jq)}async get(q){let{plain:Q}=this.readWithMigration(),$=Q[q];return typeof $==="string"?$:null}async set(q,Q){await K(n,async()=>{let{encrypted:$}=this.readWithMigration();$[q]=Qq(Q),this.writeEncrypted($)})}async delete(q){return K(n,async()=>{let{encrypted:Q}=this.readWithMigration();if(!(q in Q))return!1;return delete Q[q],this.writeEncrypted(Q),!0})}async list(q){let{encrypted:Q}=this.readWithMigration(),$=Object.keys(Q);return(q?$.filter((Z)=>Z.startsWith(q)):$).sort().map((Z)=>({name:Z}))}readWithMigration(){if(!b(this.path))return{encrypted:{},plain:{}};let q;try{q=Zq(this.path,"utf8")}catch{return{encrypted:{},plain:{}}}let Q;try{Q=JSON.parse(q)}catch{return{encrypted:{},plain:{}}}if(!Q||typeof Q!=="object"||Array.isArray(Q))return{encrypted:{},plain:{}};let $={},z={},Z=!1;for(let[J,X]of Object.entries(Q)){if(typeof X!=="string")continue;let Y=gq(X);if(Y!==null){$[J]=X,z[J]=Y;continue}$[J]=Qq(X),z[J]=X,Z=!0}if(Z)try{this.writeEncrypted($),this.writeMarker()}catch{}return{encrypted:$,plain:z}}writeEncrypted(q){d(E(this.path),{recursive:!0});let Q=`${this.path}.${process.pid}.tmp`;if(F(Q,`${JSON.stringify(q,null,2)}
3
+ `,{mode:384}),Jq(Q,this.path),!b(this.markerPath()))this.writeMarker()}markerPath(){return V(E(this.path),Gq)}writeMarker(){try{F(this.markerPath(),`${new Date().toISOString()}
4
+ `,{mode:384})}catch{}}}var fq=".secrets-index.json";function m(){return V(j(),fq)}function o(){let q=m();if(!b(q))return new Set;try{let Q=Zq(q,"utf8"),$=JSON.parse(Q);if(Array.isArray($))return new Set($.filter((z)=>typeof z==="string"))}catch{}return new Set}function Uq(q){let Q=m();d(E(Q),{recursive:!0});let $=`${Q}.${process.pid}.tmp`;F($,`${JSON.stringify([...q].sort(),null,2)}
5
+ `,{mode:384}),Jq($,Q)}async function yq(q){await K(Wq,()=>{let Q=o();if(Q.has(q))return;Q.add(q),Uq(Q)})}async function lq(q){await K(Wq,()=>{let Q=o();if(!Q.delete(q))return;Uq(Q)})}function Eq(q){let $=[...o()];return(q?$.filter((Z)=>Z.startsWith(q)):$).sort().map((Z)=>({name:Z}))}function Sq(){if(Xq()!=="linux")return{ok:!1};if(process.env.CI==="true")return{ok:!1,warning:"CI/test environment detected; using JSON fallback"};if(process.env.VIBE_SKIP_LIBSECRET_INSTALL==="1")return{ok:!1,warning:"VIBE_SKIP_LIBSECRET_INSTALL=1 set; using JSON fallback"};let q=j(),Q=V(q,Yq);if(b(Q))return{ok:!1,warning:"previous attempt failed; not retrying"};try{d(q,{recursive:!0}),F(Q,`${new Date().toISOString()}
6
+ `,{mode:384})}catch{return{ok:!1,warning:"could not write install marker"}}let $=[{check:["sh","-c","command -v apt-get"],install:["sudo","-n","apt-get","install","-y","libsecret-1-0"]},{check:["sh","-c","command -v dnf"],install:["sudo","-n","dnf","install","-y","libsecret"]},{check:["sh","-c","command -v pacman"],install:["sudo","-n","pacman","-S","--noconfirm","libsecret"]}];for(let z of $){if(r(z.check[0],z.check.slice(1),{stdio:["ignore","pipe","pipe"]}).status!==0)continue;let J=r(z.install[0],z.install.slice(1),{stdio:["ignore","pipe","pipe"]});if(J.status===0)return{ok:!0};return{ok:!1,warning:`auto-install via '${z.install.join(" ")}' failed (exit ${J.status??"unknown"})`}}return{ok:!1,warning:"no supported package manager found"}}var y=null,l=null,$q=null;async function zq(q){try{return await q.get({service:C,name:"__probe__"}),!0}catch{return!1}}async function dq(){if($q)return $q;let q=Pq();if(q&&await zq(q))return new S(q);if(Xq()==="linux"&&q){let Q=Sq();if(Q.ok&&await zq(q))return new S(q);if(Q.warning)console.warn(`[secrets] libsecret unavailable (${Q.warning}); using JSON fallback`);else console.warn("[secrets] Bun.secrets unavailable; using JSON fallback. Install libsecret-1-0 (apt) / libsecret (dnf/pacman) for OS keychain support.")}else if(!q)console.warn("[secrets] Bun.secrets API not present in this runtime; using JSON fallback.");return new Kq}async function N(){if(y)return y;if(!l)l=dq().then((q)=>{return y=q,q});return l}async function A(q){let $=await(await N()).get(q);if(Hq("read",q))p().audit.emit("agent","secret.read",{name:q,hit:$!==null});return $}async function R(q,Q){if(await(await N()).set(q,Q),Hq("written",q))p().audit.emit("agent","secret.written",{name:q,valueLen:Q.length})}async function UQ(){let q=await N(),Q=(await q.list()).map(($)=>$.name);return{count:Q.length,backend:Q.length===0?"none":q.kind,names:Q}}async function MQ(){let q=await N(),$=(await q.list()).map((z)=>z.name);for(let z of $)try{await q.delete(z)}catch{}if(q.kind==="bun-secrets")x(m()),x(V(j(),Yq));else if(q.kind==="json-fallback"){let z=j();x(V(z,jq)),x(V(z,Gq))}return{count:$.length,backend:$.length===0?"none":q.kind,names:$}}function x(q){try{if(b(q))Tq(q)}catch{}}function cq(q){return`agent-config:${q}`}var T=["clientId","clientSecret","gatewayClientId","gatewayClientSecret","static-api-key"];function bq(q){return T.includes(q)}function w(q,Q){return`${q}:${Q}`}function I(){try{return Mq()}catch{return"default"}}var M=1,sq=[],_={globalGatewayUrl:"https://graphql.burdenoff.com/global/graphql",workspaceGatewayUrl:"https://graphqlworkspaces.burdenoff.com/workspaces/graphql"},iq={globalGatewayUrl:"https://alphagraphql.burdenoff.com/global/graphql",workspaceGatewayUrl:"https://alphagraphqlworkspaces.burdenoff.com/workspaces/graphql"},rq={globalGatewayUrl:"http://localhost:4000/global/graphql",workspaceGatewayUrl:"http://localhost:4003/workspaces/graphql"},Oq={default:{..._}},xQ={local:{...rq},alpha:{...iq},prod:{..._}},O="default",Bq=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;function h(q){if(!Bq.test(q))throw Error("Profile name must use 1-64 characters: letters, numbers, dot, underscore, or dash.");return q}function Dq(){return v(j(),"profiles")}function c(){return v(j(),"active")}function g(q){return v(Dq(),`${h(q)}.json`)}function nq(){let q=c();if(!G(q))return O;try{let Q=B(q,"utf8").trim();if(!Q)return O;return h(Q)}catch{return O}}function tq(q){let Q=h(q),$=c();u(k($),{recursive:!0});let z=`${$}.${process.pid}.tmp`;D(z,`${Q}
7
+ `,{mode:384}),P(z,$)}function CQ(){let q=Dq();if(!G(q))return[];return mq(q,{withFileTypes:!0}).filter((Q)=>Q.isFile()&&Q.name.endsWith(".json")).map((Q)=>Q.name.slice(0,-5)).filter((Q)=>Bq.test(Q)).sort()}function aq(q){let Q=g(q);if(!G(Q))return{};try{return f(B(Q,"utf8"))}catch{return{}}}function eq(q,Q){let $=h(q),z=g($);u(k(z),{recursive:!0});let Z={schemaVersion:M,...Q},J={...Z};for(let Y of T){let W=J[Y];if(typeof W==="string"&&W.length>0)R(w($,Y),W).catch(()=>{});delete J[Y]}let X=`${z}.${process.pid}.tmp`;return D(X,`${JSON.stringify(J,null,2)}
8
+ `,{mode:384}),P(X,z),Z}function FQ(q){let Q=g(q);if(!G(Q))return!1;return oq(Q,{force:!0}),!0}function qQ(q,Q={}){let $=Oq[q];return{schemaVersion:M,globalGatewayUrl:$.globalGatewayUrl,workspaceGatewayUrl:$.workspaceGatewayUrl,...Q}}function QQ(){let q={created:[],activeWritten:null};for(let Q of Object.keys(Oq))if(!G(g(Q)))eq(Q,qQ(Q)),q.created.push(Q);if(!G(c()))tq(O),q.activeWritten=O;return q}function $Q(){return{..._}}function s(q){let Q=q?.dir??wq();return v(Q,"config.json")}function zQ(){return{..._}}function NQ(q={}){let Q=$Q();return{schemaVersion:M,globalGatewayUrl:Q.globalGatewayUrl,workspaceGatewayUrl:Q.workspaceGatewayUrl,...q}}function f(q){try{let Q=JSON.parse(q);if(Q&&typeof Q==="object")return Q}catch{}return{}}function i(q){let Q=s(q);if(!G(Q))return{};let $;try{$=f(B(Q,"utf8"))}catch{return{}}if(($.schemaVersion??0)>=M)return $;for(let Z of sq){if(Z.from<($.schemaVersion??0))continue;$=Z.apply($),$.schemaVersion=Z.to}if($.schemaVersion!==M)$.schemaVersion=M;try{D(Q,JSON.stringify($,null,2),{mode:384})}catch{}return $}function AQ(q){let Q=i(q);if(Q.agentInstanceId)return Q.agentInstanceId;let $=pq();return ZQ({agentInstanceId:$},q),$}function ZQ(q,Q){let $=s(Q);u(k($),{recursive:!0});let z=G($)?f(B($,"utf8")):{},Z={...z},J={...z};for(let W of T)delete J[W];let X=Q?.scope??I();for(let[W,H]of Object.entries(q)){if(H===void 0||H==="")continue;if(Z[W]=H,bq(W)&&typeof H==="string"){R(w(X,W),H).catch(()=>{});continue}J[W]=H}let Y=`${$}.${process.pid}.tmp`;return D(Y,`${JSON.stringify(J,null,2)}
9
+ `,{mode:384}),P(Y,$),Z}async function RQ(q,Q){let $=s(Q);return K(cq($),async()=>{u(k($),{recursive:!0});let z=G($)?f(B($,"utf8")):{},Z={...z},J={...z};for(let H of T)delete J[H];let X=Q?.scope??I(),Y=[];for(let[H,U]of Object.entries(q)){if(U===void 0||U==="")continue;if(Z[H]=U,bq(H)&&typeof U==="string"){Y.push(R(w(X,H),U));continue}J[H]=U}await Promise.all(Y);let W=`${$}.${process.pid}.tmp`;return D(W,`${JSON.stringify(J,null,2)}
10
+ `,{mode:384}),P(W,$),Z})}async function uQ(q){let Q=i(q?{dir:q.dir}:void 0),$=q?.scope??I();for(let z of T){if(Q[z])continue;try{let Z=await A(w($,z));if(Z)Q[z]=Z}catch{}}return Q}function JQ(){return aq(nq())}function PQ(){try{QQ()}catch{}let q=JQ(),Q=i(),$={...q,...Q},z=(J,X)=>{if(!process.env[J]&&X)process.env[J]=X};z("VIBE_WORKSPACE_ID",$.workspaceId),z("VIBE_ORGANIZATION_ID",$.organizationId);let Z=zQ();return z("VIBE_GLOBAL_GATEWAY_URL",$.globalGatewayUrl??Z.globalGatewayUrl),z("VIBE_WORKSPACE_GATEWAY_URL",$.workspaceGatewayUrl??Z.workspaceGatewayUrl),z("VIBE_STORAGE_ADAPTER",$.storageAdapter),z("VIBECONTROLS_PLUGIN_INSTALL_SCOPE",$.pluginInstallScope),$}async function kQ(){let q=($,z)=>{if(!process.env[$]&&z)process.env[$]=z},Q=I();try{let $=await A(w(Q,"clientId"));q("VIBE_CLIENT_ID",$??void 0)}catch{}try{let $=await A(w(Q,"clientSecret"));q("VIBE_CLIENT_SECRET",$??void 0)}catch{}}
11
+ export{A as Rc,R as Sc,UQ as Tc,MQ as Uc,M as Vc,Oq as Wc,xQ as Xc,O as Yc,h as Zc,Dq as _c,c as $c,g as ad,nq as bd,tq as cd,CQ as dd,aq as ed,eq as fd,FQ as gd,qQ as hd,QQ as id,$Q as jd,s as kd,zQ as ld,NQ as md,i as nd,AQ as od,ZQ as pd,RQ as qd,uQ as rd,JQ as sd,PQ as td,kQ as ud};
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{Xa as QQ}from"./index-0ckffygp.js";import{Ad as ZQ,Ld as k,Nd as Y}from"./index-9bqd8veb.js";import{_d as G,ce as d}from"./index-0cn9bv8z.js";import{he as w}from"./index-yy1mm8zs.js";import{existsSync as U,mkdirSync as n,readdirSync as GQ,readFileSync as v,renameSync as bQ,realpathSync as t,rmSync as j,statSync as _Q,writeFileSync as g}from"fs";import{homedir as RQ}from"os";import{dirname as R,isAbsolute as xQ,join as V,relative as EQ,sep as r}from"path";import{fileURLToPath as P}from"url";import{existsSync as XQ,readFileSync as qQ}from"fs";import{dirname as L,join as BQ}from"path";import{fileURLToPath as YQ}from"url";var WQ="@vibecontrols/agent",_;function N(){if(_)return _;try{let Q=L(YQ(import.meta.url));for(let Z=0;Z<10&&Q&&Q!==L(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=L(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 A{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-drBtmSC7rcv8lNB0Xco47Y1D0NJ9qwSct/K7lJNySSH8MwAHPFDfhHxLLmZ+F/NE854cgEE3wb+a2qN4rDXm4w=="},{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-HjF5jxAFwQFMLRlC7N4OMraGC9V9f1u+aGlab4Yr8EkPjbrECYbcBHtD6IwfIe+jcgYSAJMrESCHFHa3EcxyHg=="},{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-T8UJQ7AP/4fim7ggNuACgo9uKaoO9Ji6+DVFm8A/A7C/7uqNbeJwgbCMVUi3qIdNNhnrwzTQffF7chV8aozdMw=="},{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-FDoMr2aDBIJ7mpqdWgfSyfwOYc1Q3JhsiNqIXHCMb8yThA7Y1939wlkG4JHmgyPxRj+1zwdg1/MiZYYFzne/pg=="},{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-kUw3KIvznHQ2C9hz/K9vi1CWt4IHq0adHDcoJjvoaPumfJ8nXNJcPlqm0hVoZIAF38Hju1DlpXlsFWmYT7Y95Q=="},{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-yvNuRIRpvKZzF03h0o9dv9im454r2qSLB61GiGiAnzKM3InjCyl/fYvwyQUDxKZCZIkHtGKBTmmAm669U1Q/+Q=="}],UQ=[{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-AzbuYGO66WHNbdJZsfODKJZVqLs18b8ocGPw1jnRZbs3rl1Z4JCDhWxtVuv/yiVIclPaFtEbSQz5sTZf2/TrEQ=="}],O=[...FQ,...CQ,...UQ],wQ=[{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:"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 wQ)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 jQ(){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 gQ(Q){return jQ().has(Q)}var rQ=O.filter((Q)=>!Q.isCore||Q.category!=="core");function pQ(Q){return O.find((Z)=>Z.packageName===Q)}function iQ(Q){return new Set}function I(Q){return Q.startsWith("@vibecontrols/vibe-plugin-")||l.has(Q)}function TQ(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 aQ(Q){let Z=Q.trim();if(!Z)return;let $=TQ(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 IQ(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 AQ(Q,Z,$){let z=IQ(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 DQ=["https://registry.npmjs.org/","https://registry.npmjs.org"];function fQ(){let Q=process.env.VIBECONTROLS_REGISTRY_ALLOWLIST,Z=[...DQ];if(typeof Q==="string"&&Q.length>0)for(let $ of Q.split(",").map((z)=>z.trim()).filter(Boolean))Z.push($);return Z}function SQ(Q){let Z=fQ(),$;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",hQ=/^@vibecontrols\/vibe-plugin-[a-z0-9][a-z0-9-]{0,80}$/,a=/^[a-z0-9][a-z0-9-]{0,63}$/,vQ=/^\/api\/[A-Za-z0-9][A-Za-z0-9/_-]{0,127}$/,PQ=/^\/[A-Za-z0-9][A-Za-z0-9/_-]{0,159}$/,$Q=Symbol.for("vibecontrols.pluginPackageRoot");function MZ(Q){return Q[$Q]}function b(Q){let Z=Q.trim();if(!hQ.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 yQ(Q,Z){let $=EQ(Q,Z);return $===""||!!$&&!$.startsWith("..")&&!xQ($)}function zQ(){return V(G(),"agent-plugins","node_modules")}function dQ(){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 dQ()?"local":"global"}var e="provider:default:";function kQ(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 VZ=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=G();if(!U(Q))n(Q,{recursive:!0})}loadRegistry(){let Q=V(G(),i);try{if(U(Q)){let Z=v(Q,"utf-8"),$=JSON.parse(Z);if(Array.isArray($)&&$.every(kQ))this.registry=$.filter((z)=>{try{return b(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(G(),i),Z=`${Q}.${process.pid}.tmp`;g(Z,`${JSON.stringify(this.registry,null,2)}
3
+ `,{encoding:"utf-8",mode:384}),bQ(Z,Q)}async loadCorePlugins(){let Q=await Promise.allSettled([import("./index-tmrbs96r.js"),import("./index-678rwfc0.js"),import("./index-vdahdt49.js"),import("./index-h8a8s8sn.js"),import("./index-mtm8cfyt.js"),import("./index-rdp5xq4r.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=b(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(SQ(H),await AQ(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(G(),"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
+ `);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=b(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=b(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(G(),"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{b(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=b(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 A({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(!vQ.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(!PQ.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(!_Q(H).isDirectory()||!yQ(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(RQ(),".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-tnq47dcs.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-tnq47dcs.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-ca4kt803.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
+ export{N as Da,O as Ea,wQ as Fa,D as Ga,h as Ha,l as Ia,gQ as Ja,rQ as Ka,pQ as La,iQ as Ma,I as Na,TQ as Oa,aQ as Pa,fQ as Qa,SQ as Ra,MZ as Sa,b as Ta,y as Ua,VZ as Va,HQ as Wa};
@@ -0,0 +1,17 @@
1
+ // @bun
2
+ import{va as D}from"./index-ssjmzqcz.js";import{Fa as U,Ha as M,Pa as R}from"./index-g3ap3xpr.js";import{Xa as I}from"./index-0ckffygp.js";import{Lc as b}from"./index-xjzmb1pn.js";import{Hd as x,Nd as u}from"./index-9bqd8veb.js";import{_d as V,ce as C}from"./index-0cn9bv8z.js";import{he as L}from"./index-yy1mm8zs.js";import{existsSync as g,readFileSync as E,unlinkSync as Wz,writeFileSync as A}from"fs";import{join as c}from"path";var l=".consent.json";function Oz(z){try{let J=E(q(z),"utf8"),G=JSON.parse(J);if(Array.isArray(G.abilities)&&G.abilities.length>0)return new Set(G.abilities)}catch{}return null}function Uz(z){try{let J=E(q(z),"utf8"),G=JSON.parse(J);if(Array.isArray(G.providers))return G.providers.filter((X)=>typeof X==="string")}catch{}return[]}function _z(z){let J=new Set;for(let G of z.split(",").map((X)=>X.trim()).filter(Boolean)){let X=R(G);if(X)J.add(X)}return[...J]}function q(z){return c(z,l)}function Nz(z,J){let G=J??new Set(U.filter((Q)=>Q.defaultSelected||Q.mandatory).map((Q)=>Q.key)),X=z.skipPluginInstall?[]:M(process.platform,G).filter((Q)=>!z.skipPlugins.includes(Q.packageName)&&!z.skipPlugins.includes(Q.pluginName)).map((Q)=>({packageName:Q.packageName,pluginName:Q.pluginName,reason:Q.description}));return{tools:[],plugins:X}}async function Fz(){let z=new Set(U.filter((G)=>G.defaultSelected||G.mandatory).map((G)=>G.key));for(let G of U)if(G.mandatory)z.add(G.key);if(!(Boolean(process.stdin.isTTY)&&process.env.VIBE_AUTO_ACCEPT!=="1"))return z;try{let{interactiveCheckboxes:G}=await import("./interactive-22ta89hc.js"),X=await G("Select the agent abilities to install",U.map((Q)=>({key:Q.key,label:Q.label,description:Q.description,mandatory:Q.mandatory})),z);if(X){for(let Q of U)if(Q.mandatory)X.add(Q.key);return X}return z}catch(G){process.stdout.write(`
3
+ [vibe] Falling back to plain prompt \u2014 ${G instanceof Error?G.message:String(G)}
4
+
5
+ `);let X=await d("Select the agent abilities to install",U.map((Q)=>({key:Q.key,label:Q.label,description:Q.description,mandatory:Q.mandatory})),z);if(X){for(let Q of U)if(Q.mandatory)X.add(Q.key);return X}return z}}async function d(z,J,G){let X=new Set(G);for(let Y of J)if(Y.mandatory)X.add(Y.key);let Q=()=>{process.stdout.write(`
6
+ ${z}
7
+ `),J.forEach((Y,$)=>{let K=Y.mandatory||X.has(Y.key)?"[x]":"[ ]",W=Y.mandatory?" (required)":"";process.stdout.write(` ${($+1).toString().padStart(2)}. ${K} ${Y.label}${W}
8
+ ${Y.description}
9
+ `)}),process.stdout.write(`
10
+ Type numbers to toggle (e.g. '2 4'), 'a' = all, 'n' = none, '?' = help, Enter = confirm: `)},Z=()=>new Promise((Y)=>{let $=[],H=(K)=>{let W=K.toString("utf8");if($.push(W),W.includes(`
11
+ `))process.stdin.off("data",H),Y($.join("").replace(/\r?\n$/u,""))};process.stdin.on("data",H)});process.stdin.resume();try{while(!0){Q();let Y=(await Z()).trim();if(Y==="")return X;if(Y==="?"||Y.toLowerCase()==="h"){process.stdout.write(`
12
+ \u2022 Type one or more row numbers (separated by spaces or commas) to flip those rows.
13
+ `+` \u2022 Type 'a' to select all, 'n' to deselect everything except required rows.
14
+ `+` \u2022 Press Enter on a blank line to confirm the current selection.
15
+ `+` \u2022 Press Ctrl-C to cancel and accept the safe defaults (everything on).
16
+ `);continue}if(Y.toLowerCase()==="a"){for(let H of J)X.add(H.key);continue}if(Y.toLowerCase()==="n"){X.clear();for(let H of J)if(H.mandatory)X.add(H.key);continue}let $=Y.split(/[\s,]+/u).filter(Boolean);for(let H of $){let K=Number.parseInt(H,10);if(!Number.isFinite(K)||K<1||K>J.length)continue;let W=J[K-1];if(!W||W.mandatory)continue;if(X.has(W.key))X.delete(W.key);else X.add(W.key)}}}finally{process.stdin.pause()}}function jz(z){let J=new Set(U.map((X)=>X.key)),G=new Set;for(let X of z.split(",").map((Q)=>Q.trim().toLowerCase()))if(J.has(X))G.add(X);for(let X of U)if(X.mandatory)G.add(X.key);return G}function qz(){return new Set(U.filter((z)=>z.defaultSelected||z.mandatory).map((z)=>z.key))}function Ez(z,J,G,X,Q){let Z={acceptedAt:new Date().toISOString(),agentVersion:X,abilities:[...G],providers:Q?[...Q]:void 0,tools:J.tools.map((Y)=>({name:Y.name,reason:Y.reason})),plugins:J.plugins.map((Y)=>({packageName:Y.packageName,reason:Y.reason}))};A(q(z),JSON.stringify(Z,null,2))}function wz(z,J){let G=p(z),X={acceptedAt:G?.acceptedAt??new Date().toISOString(),agentVersion:J.agentVersion??G?.agentVersion,abilities:J.abilities?[...J.abilities]:G?.abilities,providers:J.providers?[...J.providers]:G?.providers,tools:G?.tools??[],plugins:G?.plugins??[]};A(q(z),JSON.stringify(X,null,2))}function p(z){try{let J=q(z);if(!g(J))return null;return JSON.parse(E(J,"utf8"))}catch{return null}}import{existsSync as n,mkdirSync as o,readFileSync as i,renameSync as s,writeFileSync as a}from"fs";import{dirname as r,join as t}from"path";var e=["tunnel:read","session:list","session:share:read","session:share:write","plugin:list","plugin:install","plugin:remove","log:read","diagnostics:read","key:mint","mesh:forward","admin"];function P(z){return t(z??V(),"agent-network.json")}function F(z){let J=P(z);if(!n(J))return{schemaVersion:1,peers:[]};let G=i(J,"utf8");try{let X=JSON.parse(G);if(!X||!Array.isArray(X.peers))return{schemaVersion:1,peers:[]};return X}catch{return{schemaVersion:1,peers:[]}}}function w(z,J){let G=P(J);o(r(G),{recursive:!0});let X=`${G}.${process.pid}.tmp`;a(X,JSON.stringify(z,null,2),{mode:384}),s(X,G)}function Lz(z){return F(z).peers}function S(z,J){return F(J).peers.find((G)=>G.id===z)??null}function k(z,J){if(J.workspaceId&&z.workspaceId&&z.workspaceId!==J.workspaceId)return!1;if(J.ownerUserId)return(z.ownerUserId??J.ownerUserId)===J.ownerUserId;return!0}function Mz(z,J){return F(J).peers.filter((G)=>k(G,z))}function Rz(z,J,G){return F(G).peers.find((X)=>X.agentRecordId===z&&k(X,J))??null}function Az(z,J){let G=F(J),X=G.peers.findIndex((Q)=>Q.id===z.id);if(X>=0)G.peers[X]={...G.peers[X],...z};else G.peers.push(z);return w(G,J),z}function B(z,J,G){let X=F(G),Q=X.peers.findIndex((Z)=>Z.id===z);if(Q<0)return null;return X.peers[Q]={...X.peers[Q],...J},w(X,G),X.peers[Q]}function Vz(z,J){let G=F(J),X=G.peers.length;if(G.peers=G.peers.filter((Q)=>Q.id!==z),G.peers.length===X)return!1;return w(G,J),!0}function Pz(z){let J=new Set(e);return[...z].filter((G)=>J.has(G)).map((G)=>G)}import{join as zz}from"path";function j(z){let J=I();return J.which(z)??`${z}${J.executableSuffix}`}async function y(){let z=["..","../..","../../.."];for(let J of z)try{let G=zz(import.meta.dir,J,"package.json"),X=await Bun.file(G).json(),Q=X.name,Z=X.version;if(Q&&Z){let Y=X.publishConfig;return{name:Q,version:Z,registry:Y?.registry??C()}}}catch{}throw Error("package.json not found")}function Gz(z,J,G){try{let X=Bun.spawnSync([j("npm"),"view",`${z}@${J}`,"--json",`--registry=${G}`],{stdout:"pipe",stderr:"pipe"});if(X.exitCode!==0)return null;let Q=JSON.parse(X.stdout.toString());return Array.isArray(Q)?Q[0]??null:Q}catch{return null}}function f(z,J){let G=(Z)=>Z.replace(/^[\^~>=<v]+/,"").split(/[.+-]/).map((Y)=>Number(Y)||0),X=G(z),Q=G(J);for(let Z=0;Z<Math.max(X.length,Q.length);Z++){let Y=X[Z]??0,$=Q[Z]??0;if(Y!==$)return Y-$}return 0}function Jz(z,J){if(!z)return{ok:!0,message:""};let G=z.replace(/^[\^~]/,"").replace(/^>=?\s*/,"");if(f(J,G)>=0)return{ok:!0,message:`bun ${J} >= ${G}`};return{ok:!1,message:`requires bun ${z}, this process is bun ${J}`}}function Qz(z){try{let J=j("npm"),G=Bun.spawnSync([J,"root","-g"],{stdout:"pipe",stderr:"pipe"});if(G.exitCode!==0)return null;return`${G.stdout.toString().trim()}/${z}`}catch{return null}}function Xz(z){let J=Qz(z);if(!J)return{ok:!0,step:"(skipped, install root unknown)"};let G=`${J}/dist/cli.js`,X=($,H,K)=>{try{let W=j("bun"),_=Bun.spawnSync([W,G,...$],{stdout:"pipe",stderr:"pipe",timeout:K});if(_.exitCode===0)return{ok:!0,step:H};return{ok:!1,step:H,detail:_.stderr.toString().slice(0,300)||`exit ${_.exitCode}`}}catch(W){return{ok:!1,step:H,detail:String(W)}}},Q=X(["--version"],"vibe --version",1e4);if(!Q.ok)return Q;let Z=X(["info"],"vibe info",15000);if(!Z.ok)return Z;let Y=X(["plugin","list","--json"],"vibe plugin list",30000);if(!Y.ok)return Y;return{ok:!0,step:"all checks passed"}}async function Yz(z,J=60000){try{let G=new D,X=await G.getStatus(z);if(!X||X.status!=="running")return{kind:"not-running"};let Q=`http://localhost:${X.port}`,Z;try{Z=await b(Q)}catch{}let Y={};if(Z)Y["x-agent-api-key"]=Z;let $=1000,H=Date.now();while(Date.now()-H<J){try{let K=await fetch(`${Q}/api/profiles/${encodeURIComponent(z)}/stats/inflight`,{headers:Y,signal:AbortSignal.timeout(2000)});if(K.ok){let W=await K.json();if(typeof W.inflight==="number"&&W.inflight===0){let _=X.config;return await G.restart(z,_),{kind:"restarted"}}}}catch{}await new Promise((K)=>setTimeout(K,$))}return{kind:"still-busy"}}catch(G){return{kind:"error",message:G instanceof Error?G.message:String(G)}}}async function fz(){let z;try{z=await y()}catch(G){return{name:"@vibecontrols/agent",registry:C(),current:"unknown",latest:null,hasUpdate:!1,error:G instanceof Error?G.message:String(G)}}let J=null;try{let G=Bun.spawnSync([j("npm"),"view",z.name,"version",`--registry=${z.registry}`],{stdout:"pipe",stderr:"pipe"});if(G.exitCode===0)J=G.stdout.toString().trim()||null}catch{}if(!J)return{name:z.name,registry:z.registry,current:z.version,latest:null,hasUpdate:!1,error:"Could not reach the registry to check for updates"};return{name:z.name,registry:z.registry,current:z.version,latest:J,hasUpdate:f(J,z.version)>0}}async function vz(z={}){let J=z.onLog??(()=>{}),G=z.restart!==!1,X=z.name||"default",Q;try{Q=await y()}catch(O){return{ok:!1,updated:!1,current:"unknown",previous:"unknown",latest:null,target:null,restart:"skipped",error:O instanceof Error?O.message:String(O)}}let Z=Q.version,Y=z.targetVersion?.trim(),$=null;if(!Y||Y==="latest"){try{let O=Bun.spawnSync([j("npm"),"view",Q.name,"version",`--registry=${Q.registry}`],{stdout:"pipe",stderr:"pipe"});if(O.exitCode===0)$=O.stdout.toString().trim()||null}catch{}if(!$)return{ok:!1,updated:!1,current:Z,previous:Z,latest:null,target:null,restart:"skipped",error:"Could not check for updates (registry unreachable)"};Y=$}if(Y===Z)return J(`Already on ${Z}; nothing to do.`),{ok:!0,updated:!1,current:Z,previous:Z,latest:$??Z,target:Y,restart:"skipped"};let H,K=Gz(Q.name,Y,Q.registry);if(K){let O=typeof Bun<"u"?Bun.version:"0.0.0",N=Jz(K.engines?.bun,O);if(H=N.message,!N.ok&&!z.allowIncompatible)return{ok:!1,updated:!1,current:Z,previous:Z,latest:$,target:Y,engineMessage:N.message,restart:"skipped",error:`Refusing to upgrade: ${N.message}. Pass allowIncompatible to override.`}}J(`Installing ${Q.name}@${Y}...`);try{let O=Bun.spawnSync([j("npm"),"install","-g",`${Q.name}@${Y}`,`--registry=${Q.registry}`],{stdout:"pipe",stderr:"pipe"});if(O.exitCode!==0){let N=O.stderr.toString().slice(0,500);return{ok:!1,updated:!1,current:Z,previous:Z,latest:$,target:Y,engineMessage:H,restart:"skipped",error:`npm install failed: ${N||`exit ${O.exitCode}`}`}}}catch(O){return{ok:!1,updated:!1,current:Z,previous:Z,latest:$,target:Y,engineMessage:H,restart:"skipped",error:`npm install threw: ${O instanceof Error?O.message:String(O)}`}}let W=Xz(Q.name);if(!W.ok){J(`Smoke test failed at "${W.step}" \u2014 rolling back to ${Z}.`);let O=!1;try{O=Bun.spawnSync([j("npm"),"install","-g",`${Q.name}@${Z}`,`--registry=${Q.registry}`],{stdout:"pipe",stderr:"pipe"}).exitCode===0}catch{}return{ok:!1,updated:!1,current:O?Z:Y,previous:Z,latest:$,target:Y,engineMessage:H,smoke:W,rolledBack:O,restart:"skipped",error:`Post-install smoke test failed at "${W.step}"${W.detail?`: ${W.detail}`:""}. ${O?"Rolled back.":"Rollback FAILED \u2014 reinstall manually."}`}}let _={kind:"skipped"};if(G)J(`Waiting for agent "${X}" to become idle before restart...`),_=await Yz(X,z.restartBudgetMs);return J(`Updated to ${Y}.`),{ok:!0,updated:!0,current:Y,previous:Z,latest:$,target:Y,engineMessage:H,smoke:W,rolledBack:!1,restart:_.kind,restartError:_.kind==="error"?_.message:void 0}}function Zz(z){let J=/^(?:ssh:\/\/)?(?:([^@\s]+)@)?([^:/\s]+)(?::(\d+))?$/.exec(z.trim());if(!J)throw Error(`Could not parse SSH target: ${z}`);let G=Boolean(J[1]),X=Boolean(J[3]);if(!G&&!X&&!z.includes(":"))return{alias:J[2],host:J[2]};return{user:J[1],host:J[2],port:J[3]?Number(J[3]):void 0}}class v{mode="ssh";id;target;constructor(z){if(this.target=z,z.alias)this.id=`ssh://${z.alias}`;else{let J=z.user?`${z.user}@`:"",G=z.port?`:${z.port}`:"";this.id=`ssh://${J}${z.host}${G}`}}sshArgv(){let z=["ssh","-o","BatchMode=yes","-o","StrictHostKeyChecking=accept-new","-o","ServerAliveInterval=30"];if(this.target.identityFile)z.push("-i",this.target.identityFile);if(this.target.port)z.push("-p",String(this.target.port));return z.push(this.target.alias??(this.target.user?`${this.target.user}@${this.target.host}`:this.target.host)),z}async probe(){let z={},J=[["npm","command -v npm"],["node","command -v node"],["bun","command -v bun"],["vibe","command -v vibe"],["os","uname -s 2>/dev/null || echo unknown"],["arch","uname -m 2>/dev/null || echo unknown"]];for(let[G,X]of J){let Q=await this.run(["sh","-c",X]),Z=Q.stdout.trim();if(Q.code===0&&Z)z[G]=Z}return z}async run(z,J){let G=z.map(T).join(" "),X=[...this.sshArgv(),G],Q=Bun.spawnSync(X,{stdout:"pipe",stderr:"pipe",timeout:J?.timeoutMs??600000});return{code:Q.exitCode??1,stdout:Q.stdout.toString(),stderr:Q.stderr.toString()}}async upload(z,J,G){let X=[...this.sshArgv(),`cat > ${T(z)} && chmod ${(G??384).toString(8)} ${T(z)}`],Q=Bun.spawn(X,{stdin:"pipe",stdout:"pipe",stderr:"pipe"}),Z=Q.stdin;Z.write(typeof J==="string"?J:Buffer.from(J).toString("binary")),await Z.end();let Y=await Q.exited;if(Y!==0){let $=await new Response(Q.stderr).text();throw Error(`upload to ${z} failed (exit ${Y}): ${$}`)}}async close(){}}function T(z){if(/^[A-Za-z0-9._\-/=:]+$/.test(z))return z;return`'${z.replace(/'/g,"'\\''")}'`}class h{mode="local";id="local";async probe(){let z={},J=[["npm","command -v npm"],["node","command -v node"],["bun","command -v bun"],["vibe","command -v vibe"],["os","uname -s 2>/dev/null || echo unknown"],["arch","uname -m 2>/dev/null || echo unknown"]];for(let[G,X]of J){let Q=await this.run(["sh","-c",X]),Z=Q.stdout.trim();if(Q.code===0&&Z)z[G]=Z}return z}async run(z,J){let G=Bun.spawnSync(z,{stdout:"pipe",stderr:"pipe",timeout:J?.timeoutMs??600000});return{code:G.exitCode??1,stdout:G.stdout.toString(),stderr:G.stderr.toString()}}async upload(z,J,G){await Bun.write(z,J);try{let{chmodSync:X}=await import("fs");X(z,G??384)}catch{}}async close(){}}function mz(z,J){let G=/^([a-z]+):\/\//.exec(z)?.[1];if(G==="local"||z.trim()==="local"||z.trim()==="localhost")return new h;if(!G||G==="ssh"){let X=Zz(z);if(J?.identityFile)X.identityFile=J.identityFile;return new v(X)}throw Error(`Unsupported install transport scheme: ${G}://. Supported today: ssh:// (and bare host or ssh_config alias). Future: winrm://, ssm://, docker://, k8s://`)}async function m(z,J,G){let X=`${z.tunnelUrl.replace(/\/$/,"")}${J}`;try{let Q=await fetch(X,{method:G.method??"GET",headers:{"x-agent-api-key":z.apiKey,"content-type":G.body?"application/json":"application/octet-stream"},body:G.body?JSON.stringify(G.body):void 0,signal:AbortSignal.timeout(G.timeoutMs??30000)});if(Q.status===200||Q.status===201||Q.status===204){let Y=await Q.json().catch(()=>{return});return{ok:!0,status:Q.status,data:Y}}let Z=await Q.text().catch(()=>"");return{ok:!1,status:Q.status,error:Z}}catch(Q){return{ok:!1,status:0,error:Q instanceof Error?Q.message:String(Q)}}}async function dz(z,J,G={}){let X=S(z);if(!X)return{ok:!1,status:0,error:`No peer with id ${z}`};let Q=await m(X,J,G);if(Q.ok)return B(X.id,{lastReachable:new Date().toISOString()}),Q;if(!(Q.status===401||Q.status===0||Q.status===502||Q.status===503||Q.status===504))return Q;if(!X.agentRecordId||!x.isConfigured())return Q;let Y=null;try{Y=await x.lookupPeerAgent(X.agentRecordId,G.operation??"peer-call")}catch(K){u().logger.warn("peer-client","Backend rotation lookup failed",{peerId:z,error:K instanceof Error?K.message:String(K)})}if(!Y)return Q;B(X.id,{tunnelUrl:Y.tunnelUrl,apiKey:Y.apiKey});let $={...X,tunnelUrl:Y.tunnelUrl,apiKey:Y.apiKey};return{...await m($,J,G),rotated:!0}}
17
+ export{Oz as Q,Uz as R,_z as S,Nz as T,Fz as U,jz as V,qz as W,Ez as X,wz as Y,e as Z,Lz as _,S as $,Mz as aa,Rz as ba,Az as ca,B as da,Vz as ea,Pz as fa,y as ga,fz as ha,vz as ia,mz as ja,dz as ka};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{E as A,G as N}from"./index-6jzsthh9.js";import{Tb as l,Ub as T}from"./index-04n4qgvd.js";import{ic as G,jc as D,kc as f}from"./index-5mw3eshk.js";import{Cc as y,pc as d,qc as r,rc as j,tc as J,uc as U,vc as w,xc as P,yc as v}from"./index-z5a4yxzz.js";import{Fc as E}from"./index-ef95xr4z.js";import{Kc as p,Mc as g,Nc as L,Oc as x,Pc as S,Qc as O}from"./index-xjzmb1pn.js";import"./index-g2raeeh4.js";import"./index-9bqd8veb.js";import"./index-0cn9bv8z.js";import"./index-jw1k4vbk.js";import"./index-yy1mm8zs.js";import{promises as R}from"fs";import C from"path";async function M(a){try{let n=await R.readdir(a);if(n.includes("package.json")){try{let i=JSON.parse(await R.readFile(C.join(a,"package.json"),"utf8")),o={...i.dependencies,...i.devDependencies};if(o.react||o["@types/react"])return"react";if(o.vue||o["@vue/cli"])return"vue";if(o.angular||o["@angular/core"])return"angular";if(o.next||o["@types/next"])return"nextjs";if(o.nuxt||o["@nuxt/core"])return"nuxtjs";if(o.svelte||o["@sveltejs/kit"])return"svelte";if(o.express||o.fastify||o.koa)return"nodejs-backend";if(o.electron)return"electron";if(o.vite)return"vite"}catch{}return"nodejs"}if(n.includes("setup.py")||n.includes("requirements.txt")||n.includes("pyproject.toml")||n.includes("Pipfile")){if(n.includes("manage.py"))return"django";if(n.includes("app.py"))return"flask";return"python"}if(n.includes("go.mod"))return"go";if(n.includes("Cargo.toml"))return"rust";if(n.includes("pom.xml"))return"maven";if(n.includes("build.gradle")||n.includes("build.gradle.kts"))return"gradle";if(n.includes("Gemfile"))return"ruby";if(n.includes("composer.json"))return"php";if(n.some((i)=>i.endsWith(".csproj")||i.endsWith(".sln")))return"dotnet";if(n.includes("CMakeLists.txt")||n.includes("Makefile"))return"cpp";if(n.includes("Package.swift"))return"swift";if(n.includes("pubspec.yaml"))return"flutter";if(n.some((i)=>i.endsWith(".tf")))return"terraform";if(n.includes("Dockerfile"))return"docker"}catch{}return}async function V(a){try{let n=["vite.config.ts","vite.config.js"];for(let i of n)try{let t=(await R.readFile(C.join(a,i),"utf-8")).match(/port:\s*(\d+)/);if(t)return parseInt(t[1],10)}catch{}}catch{}return}var Y=new Set([".git","node_modules","__pycache__",".venv","venv","dist","build"]),F=parseInt(process.env.VIBECONTROLS_GIT_SCAN_MAX_DEPTH??"8",10),z=parseInt(process.env.VIBECONTROLS_GIT_SCAN_MAX_DIRECTORIES??"5000",10);async function k(a,n,i,o={visited:0},t=0){let u=[];if(t>F||o.visited>=z)return u;o.visited+=1;try{let e=await N(a);if(e.some((c)=>c.name===".git"&&c.isDirectory())){if(u.push({path:a,name:C.basename(a),parentPath:i,isSubmodule:!!i,projectType:await M(a),vitePort:await V(a)}),!n)return u;i=a}for(let c of e)if(c.isDirectory()&&!c.isSymbolicLink()&&!Y.has(c.name)&&!c.name.startsWith(".")){let s=C.join(a,c.name),$=await k(s,n,i,o,t+1);u.push(...$)}}catch{}return u}function I(a){let{db:n}=a;return new T().get("/",async()=>{return{repositories:await n.getAllGitRepositories()}}).get("/:id",async({params:i,set:o})=>{let t=await n.getGitRepository(i.id);if(!t)return o.status=404,{error:"Repository not found"};return{repository:t}}).post("/scan",async({body:i,set:o})=>{try{let t=(await A(i.directory,{mustExist:!0})).path;if(!(await R.stat(t)).isDirectory())return o.status=400,{error:"Path is not a directory"};let e=await k(t,i.includeSubmodules??!0),m=[];for(let c of e){let s=await n.getGitRepositoryByPath(c.path);if(s)await n.updateGitRepository(s.id,c),m.push({...s,...c});else{let $=await n.createGitRepository({id:globalThis.crypto.randomUUID(),...c});m.push($)}}return{repositories:m,scannedPath:t,totalFound:m.length}}catch(t){return o.status=500,{error:"Failed to scan directory",details:String(t)}}},{body:l.Object({directory:l.String(),includeSubmodules:l.Optional(l.Boolean())})}).put("/:id",async({params:i,body:o,set:t})=>{if(!await n.getGitRepository(i.id))return t.status=404,{error:"Repository not found"};try{return await n.updateGitRepository(i.id,o),{success:!0}}catch(e){return t.status=500,{error:"Failed to update repository",details:String(e)}}},{body:l.Object({name:l.Optional(l.String()),projectType:l.Optional(l.String()),vitePort:l.Optional(l.Number())})}).delete("/:id",async({params:i,set:o})=>{if(!await n.getGitRepository(i.id))return o.status=404,{error:"Repository not found"};try{return await n.deleteGitRepository(i.id),{success:!0}}catch(u){return o.status=500,{error:"Failed to delete repository",details:String(u)}}}).post("/fix-hierarchy",async({set:i})=>{try{let o=await n.fixGitHierarchy(),t=await n.getAllGitRepositories();return{success:!0,fixed:o.fixed,total:t.length}}catch(o){return i.status=500,{error:"Failed to fix hierarchy",details:String(o)}}})}var h="http://localhost:3005";function q(a){let n=a.command("git").description("Manage git repositories");n.command("list").description("List discovered git repositories").option("--agent-url <url>","Agent URL",h).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(i){let o={...a.opts(),...i};try{let t=p(i),u=encodeURIComponent(g(o));await D({mode:G(o),fetchData:async()=>{return(await L(t,`/api/profiles/${u}/git`)).repositories||[]},plain:(e)=>{if(!e||e.length===0){J("No git repositories found.");return}U("Git Repositories"),P(e.map((m)=>({ID:y(m.id),Name:m.name||"-",Path:m.path||"-",Type:m.type||m.projectType||"-",Submodule:m.isSubmodule?"Yes":"No",Scanned:m.scannedAt?v(m.scannedAt):"-"})))},interactive:async(e)=>{if(!e||e.length===0){U("Git Repositories"),J("No git repositories found.");return}let m=e.map((c)=>({id:String(c.id),label:c.name||y(c.id),hint:c.type||c.projectType||"",detail:[`ID: ${c.id}`,`Name: ${c.name??"-"}`,`Path: ${c.path??"-"}`,`Type: ${c.type??c.projectType??"-"}`,`Submodule: ${c.isSubmodule?"Yes":"No"}`,`Scanned: ${c.scannedAt?v(c.scannedAt):"-"}`].join(`
3
+ `)}));await E({title:`vibe git list \u2014 ${e.length} repo(s)`,rows:m})},json:(e)=>e.map((m)=>({id:m.id,name:m.name??null,path:m.path??null,type:m.type??m.projectType??null,isSubmodule:!!m.isSubmodule,scannedAt:m.scannedAt??null}))})}catch(t){d(r(t))}}),n.command("scan").description("Scan a directory for git repositories").requiredOption("--dir <directory>","Directory to scan").option("--depth <depth>","Scan depth","3").option("--agent-url <url>","Agent URL",h).option("--json","Emit JSON").action(async function(i){let o={...a.opts(),...i};try{let t=p(i),u=encodeURIComponent(g(o)),e=await x(t,`/api/profiles/${u}/git/scan`,{directory:i.dir,depth:parseInt(i.depth,10)});if(f(o,{ok:!0,found:e?.found??e?.repositories?.length??0}))return;if(j("Git scan completed."),e?.found!==void 0)w("Repositories found",e.found);if(e?.repositories)w("Repositories found",e.repositories.length)}catch(t){if(o.json){f(o,{ok:!1,error:r(t)});return}d(r(t))}}),n.command("update").description("Update a git repository entry").requiredOption("-i, --id <id>","Repository ID").option("--vite-port <port>","Vite dev server port").option("--project-type <type>","Project type").option("--agent-url <url>","Agent URL",h).option("--json","Emit JSON").action(async function(i){let o={...a.opts(),...i};try{let t=p(i),u=encodeURIComponent(g(o)),e={};if(i.vitePort)e.vitePort=parseInt(i.vitePort,10);if(i.projectType)e.projectType=i.projectType;if(await S(t,`/api/profiles/${u}/git/${i.id}`,e),f(o,{ok:!0,id:i.id}))return;j(`Repository ${y(i.id)} updated.`)}catch(t){if(o.json){f(o,{ok:!1,error:r(t)});return}d(r(t))}}),n.command("delete").description("Delete a git repository entry").requiredOption("-i, --id <id>","Repository ID").option("--agent-url <url>","Agent URL",h).option("--json","Emit JSON").action(async function(i){let o={...a.opts(),...i};try{let t=p(i),u=encodeURIComponent(g(o));if(await O(t,`/api/profiles/${u}/git/${i.id}`),f(o,{ok:!0,id:i.id}))return;j(`Repository ${y(i.id)} deleted.`)}catch(t){if(o.json){f(o,{ok:!1,error:r(t)});return}d(r(t))}}),n.command("fix-hierarchy").description("Fix repository parent-child hierarchy").option("--agent-url <url>","Agent URL",h).option("--json","Emit JSON").action(async function(i){let o={...a.opts(),...i};try{let t=p(i),u=encodeURIComponent(g(o)),e=await x(t,`/api/profiles/${u}/git/fix-hierarchy`,{});if(f(o,{ok:!0,fixed:e?.fixed??null}))return;if(j("Hierarchy fix completed."),e?.fixed!==void 0)w("Fixed",e.fixed)}catch(t){if(o.json){f(o,{ok:!1,error:r(t)});return}d(r(t))}})}function H(a,n){q(a)}function eo(a){return{name:"git",version:"2.2.0",description:"Git repository scanning, tracking, and hierarchy management",capabilities:{storage:"rw",subprocess:!0,audit:!0,telemetry:!0},tags:["backend","cli"],cliCommand:"git",apiPrefix:"/api/git",createRoutes:(n)=>I(n),onCliSetup:async(n,i)=>{H(n,i)}}}export{eo as createPlugin};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{c as a}from"./index-8kvc8ttn.js";import"./index-x1h8r7pr.js";import"./index-yy1mm8zs.js";export default a();
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ function z(){let j=process.env.VIBECONTROLS_LOG_SHIP_URL;if(!j)return null;return{url:j,apiKey:process.env.VIBECONTROLS_LOG_SHIP_API_KEY,batchSize:Number.parseInt(process.env.VIBECONTROLS_LOG_SHIP_BATCH??"",10)||100,intervalMs:Number.parseInt(process.env.VIBECONTROLS_LOG_SHIP_INTERVAL_MS??"",10)||1e4,sampleRate:Number.parseFloat(process.env.VIBECONTROLS_LOG_SHIP_SAMPLE??"1")}}var k=1000;class s{config=null;queue=[];timer=null;inFlight=!1;dropped=0;init(){if(this.config)return;if(this.config=z(),!this.config)return;if(this.timer=setInterval(()=>{this.flush()},this.config.intervalMs),this.timer&&typeof this.timer.unref==="function")this.timer.unref()}enqueue(j){if(!this.config)return;if(j.level==="debug"&&this.config.sampleRate<1&&Math.random()>this.config.sampleRate)return;if(this.queue.length>=k)this.dropped+=1,this.queue.shift();this.queue.push(j)}async flush(){if(!this.config||this.inFlight||this.queue.length===0)return;this.inFlight=!0;let j=this.queue.splice(0,this.config.batchSize);try{await fetch(this.config.url,{method:"POST",headers:{"Content-Type":"application/json",...this.config.apiKey?{Authorization:`Bearer ${this.config.apiKey}`}:{}},body:JSON.stringify({entries:j,dropped:this.dropped}),signal:AbortSignal.timeout(5000)}),this.dropped=0}catch{this.queue=[...j,...this.queue].slice(0,k)}finally{this.inFlight=!1}}stop(){if(this.timer)clearInterval(this.timer),this.timer=null;this.flush()}}var B=new s;
3
+ export{B as de};