@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,158 @@
1
+ // @bun
2
+ import{d as m,e as H2}from"./index-0248afsn.js";import{z as u}from"./index-1hnw0rhc.js";import"./index-2gsarrbn.js";import"./index-tp4y9jde.js";import"./index-4wgjx8bf.js";import{Ja as Z2,Ka as $2,La as z2,Na as W2,Ta as d}from"./index-g3ap3xpr.js";import"./index-0ckffygp.js";import"./index-v9fx5wab.js";import"./index-01qzsnwd.js";import{Qb as X2,Rb as Y2}from"./index-d5ysy1yn.js";import{Tb as J,Ub as V2}from"./index-04n4qgvd.js";import{ic as l,jc as t,kc as R}from"./index-5mw3eshk.js";import{nc as N,pc as q,qc as O,rc as I,sc as S,tc as _,uc as k,vc as A,xc as i}from"./index-z5a4yxzz.js";import{Fc as s,Gc as G2}from"./index-ef95xr4z.js";import{Kc as U,Mc as E,Nc as n,Oc as D}from"./index-xjzmb1pn.js";import"./index-g2raeeh4.js";import{Nd as c}from"./index-9bqd8veb.js";import"./index-0cn9bv8z.js";import"./index-jw1k4vbk.js";import{he as L}from"./index-yy1mm8zs.js";import{timingSafeEqual as j2}from"crypto";async function a(V,B){try{let z=Bun.spawn({cmd:["npm","view",`${V}@${B}`,"dist.integrity","--json"],stdout:"pipe",stderr:"pipe"});if(await z.exited!==0)return null;let X=(await new Response(z.stdout).text()).trim();if(!X)return null;if(X.startsWith('"'))try{let $=JSON.parse(X);return typeof $==="string"?$:null}catch{return null}return X}catch{return null}}function e(V,B){let z=Buffer.from(V),K=Buffer.from(B);if(z.length!==K.length)return!1;try{return j2(z,K)}catch{return!1}}var U2=$2.map((V)=>({packageName:V.packageName,name:V.pluginName,description:V.description,cliCommand:V.cliCommand,apiPrefix:V.apiPrefix,installed:!1,category:V.category})),y=new Map;function w(V,B){let K=(y.get(V)??Promise.resolve()).then(B,B),Q=K.then(()=>{return},()=>{return});return y.set(V,Q),Q.finally(()=>{if(y.get(V)===Q)y.delete(V)}),K}function K2(V){return y.has(V)}function Q2(V){let B=V.getPluginDetails(),z=new Set(B.map((K)=>K.packageName));return{plugins:U2.map((K)=>({...K,installed:z.has(K.packageName)}))}}function B2(V){let{pluginManager:B}=V;return new V2().get("/",()=>{let z=B.getPluginDetails();return{plugins:z,count:z.length}}).get("/available",()=>Q2(B)).get("/catalog",()=>Q2(B)).get("/contributions",({query:z})=>{let K=typeof z?.mountPoint==="string"&&z.mountPoint?z.mountPoint:null,Q=[],X=new Map;for(let $ of B.getPluginDetails())X.set($.pluginName,$.packageName);for(let $ of B.getAllPlugins()){let x=$.ui;if(!x||!x.contributions||x.contributions.length===0)continue;let Y=x.capabilities??{restPaths:[],wsTopics:[],rpcMethods:[]};for(let W of x.contributions){if(K&&W.mountPoint!==K)continue;let Z=W.meta,H=Z&&typeof Z.url==="string"?Z.url:null,F=H&&H.startsWith("/")&&!H.startsWith("//")&&!H.includes("\x00")&&!H.includes("..")?H:null;Q.push({pluginKey:$.name,pluginPackageName:X.get($.name),contribution:W,capabilities:W.capabilities??Y,url:F??`/ui/${encodeURIComponent($.name)}`})}}return{contributions:Q,count:Q.length}}).post("/install",async({body:z,set:K})=>{if(!z.packageName||typeof z.packageName!=="string")return K.status=400,{error:"Missing required field: packageName"};if(z.packageName.startsWith("@burdenoff/"))z.packageName=z.packageName.replace(/^@burdenoff\//,"@vibecontrols/");if(!W2(z.packageName))return K.status=403,{error:"Plugin package is not in the trusted VibeControls catalog"};try{let Q=d(z.packageName);if(K2(Q)){let X=Q.split("/").pop()?.replace("vibe-plugin-","");if(B.getAllPlugins().some((x)=>x.name===X))return{success:!0,message:`Plugin ${Q} is already installed`,packageName:Q,alreadyInstalled:!0};return K.status=409,{error:"Install for this package is already in progress. Wait for it to finish.",packageName:Q}}return await w(Q,async()=>{let X=Q.split("/").pop()?.replace("vibe-plugin-",""),$=X?.startsWith("ai-")?X.slice(3):void 0,x=B.getAllPlugins().find((C)=>C.name===X||C.name===$),Y=!!x,W=await B.install(Q),Z=z2(Q);if(Z?.integrity){let C=await a(Q,W.version);if(!C||!e(Z.integrity,C)){try{await B.remove(Q,V.hostServices)}catch(G){console.warn(`[plugin-mgr] integrity rollback uninstall failed for ${Q}:`,G)}return c().audit.emit("agent","plugin.install.rejected",{packageName:Q,version:W.version,reason:"integrity_mismatch",expected:Z.integrity,actual:C}),K.status=400,{error:"integrity mismatch",expected:Z.integrity,actual:C}}}else console.warn(`[plugin-mgr] plugin ${Q} has no pinned integrity \u2014 accepting npm registry's hash`);let H=B.getAllPlugins().find((C)=>C.name===W.pluginName);if(H){let C=[];if(V.mountPlugin)V.mountPlugin(H);if(V.hostServices){if(Y&&x?.onServerStop)try{await x.onServerStop()}catch(G){C.push(`onServerStop failed: ${G instanceof Error?G.message:String(G)}`)}if(B.registerProviders(H,V.hostServices),H.onServerStart&&V.app)try{await H.onServerStart(V.app,V.hostServices),B.registerProviders(H,V.hostServices)}catch(G){C.push(`onServerStart failed: ${G instanceof Error?G.message:String(G)}`)}if(H.onServerReady&&V.app)try{await H.onServerReady(V.app,V.hostServices)}catch(G){C.push(`onServerReady failed: ${G instanceof Error?G.message:String(G)}`)}}if(V.rebuildPluginSurfaces?.(),C.length>0)return K.status=500,{success:!1,message:`Plugin ${Q} installed but failed to start`,lifecycleErrors:C,restartRequired:!0}}let F;if(H&&V.app)try{F=await m(H,Q,V.app,V.db,{skipInstall:!!z.skipPrereqs})}catch(C){F=void 0,console.warn(`[plugin-mgr] prereq run failed for ${Q}:`,C)}return u(V.db),c().audit.emit("agent","plugin.installed",{packageName:Q,version:W.version,pluginName:W.pluginName,wasRunning:Y}),{success:!0,message:`Plugin ${Q} installed and loaded successfully`,prereqs:F?{satisfied:F.satisfied,missing:F.status?.missing??[],pendingSudo:F.pendingSudo,skipped:!!z.skipPrereqs}:void 0}})}catch(Q){return K.status=500,{error:"Failed to install plugin",details:String(Q)}}},{body:J.Object({packageName:J.String(),skipPrereqs:J.Optional(J.Boolean())})}).post("/prereqs/status",async({body:z,set:K})=>{if(!z.packageName)return K.status=400,{error:"Missing packageName"};let Q=z.packageName,X=B.getAllPlugins().find(($)=>$.name===Q||B.getLoaded(Q)?.name===$.name);if(!X||!V.app)return await H2(V.db,Q)??{satisfied:!0,missing:[]};try{let $=await m(X,Q,V.app,V.db,{skipInstall:!0});return{satisfied:$.satisfied,missing:$.status?.missing??[],noProtocol:$.noProtocol}}catch($){return K.status=500,{error:String($)}}},{body:J.Object({packageName:J.String()})}).post("/prereqs/install",async({body:z,set:K})=>{if(!z.packageName)return K.status=400,{error:"Missing packageName"};let Q=z.packageName,X=B.getAllPlugins().find(($)=>$.name===Q||B.getLoaded(Q)?.name===$.name);if(!X||!V.app)return K.status=404,{error:"Plugin not loaded"};try{let $=await m(X,Q,V.app,V.db,{skipInstall:!1});return{satisfied:$.satisfied,installed:$.install?.installed??[],pendingSudo:$.pendingSudo,errors:$.install?.errors??[],noProtocol:$.noProtocol}}catch($){return K.status=500,{error:String($)}}},{body:J.Object({packageName:J.String(),approveSudo:J.Optional(J.Boolean())})}).post("/prereqs/uninstall",async({body:z,set:K})=>{if(!z.packageName)return K.status=400,{error:"Missing packageName"};let Q=z.packageName,X=B.getAllPlugins().find((W)=>W.name===Q);if(!X||!X.apiPrefix||!V.app)return K.status=404,{error:"Plugin not loaded"};let $=V.app.handle;if(typeof $!=="function")return K.status=500,{error:"App handle unavailable"};let x=`${X.apiPrefix.replace(/\/+$/,"")}/prereqs/uninstall`,Y=await $.call(V.app,new Request(`http://agent.local${x}`,{method:"POST",headers:{"x-vc-profile-rewrite":"1",[X2]:Y2()}}));if(Y.status===404)return K.status=404,{error:"Plugin has no prereqs/uninstall endpoint"};return Y.json()},{body:J.Object({packageName:J.String()})}).post("/nuke",async({body:z,set:K})=>{if(!V.hostServices)return K.status=503,{error:"hostServices unavailable"};let Q=V.hostServices.getDataDir?.();return{ok:!0,...await B.runPluginNuke(z.packageName,V.hostServices,{agentDir:Q,dryRun:!!z.dryRun})}},{body:J.Object({packageName:J.Optional(J.String()),dryRun:J.Optional(J.Boolean())})}).post("/remove",async({body:z,set:K})=>{if(!z.packageName||typeof z.packageName!=="string")return K.status=400,{error:"Missing required field: packageName"};if(z.packageName.startsWith("@burdenoff/"))z.packageName=z.packageName.replace(/^@burdenoff\//,"@vibecontrols/");if(Z2(z.packageName))return{success:!0,message:`Plugin ${z.packageName} is critical and cannot be removed; treating remove as a no-op.`,skipped:!0};try{let Q=d(z.packageName);return await w(Q,async()=>{return await B.remove(Q,V.hostServices),V.rebuildPluginSurfaces?.(),u(V.db),c().audit.emit("agent","plugin.removed",{packageName:Q}),{success:!0,message:`Plugin ${Q} removed successfully`}})}catch(Q){return K.status=500,{error:"Failed to remove plugin",details:String(Q)}}},{body:J.Object({packageName:J.String()})}).post("/update",async({body:z,set:K})=>{if(!z.packageName||typeof z.packageName!=="string")return K.status=400,{error:"Missing required field: packageName"};let Q=typeof z.version==="string"&&z.version.trim()?z.version.trim():void 0;if(Q&&!/^[0-9][0-9A-Za-z.+-]{0,63}$/.test(Q))return K.status=400,{error:`Invalid version "${Q}"`};try{let X=d(z.packageName);return await w(X,async()=>{let $=B.getLoaded(X);if($?.onServerStop)await $.onServerStop({reason:"reload"});if($&&V.hostServices)V.hostServices.serviceRegistry.unregisterPlugin($.name);let x=await B.update(X,Q),Y=B.getLoaded(X);if(Y&&V.hostServices){if(B.registerProviders(Y,V.hostServices),Y.onServerStart&&V.app)await Y.onServerStart(V.app,V.hostServices),B.registerProviders(Y,V.hostServices);if(Y.onServerReady&&V.app)await Y.onServerReady(V.app,V.hostServices)}return V.rebuildPluginSurfaces?.(),u(V.db),{success:!0,message:`Plugin ${X} updated to v${x.version}`,version:x.version}})}catch(X){return K.status=500,{error:"Failed to update plugin",details:String(X)}}},{body:J.Object({packageName:J.String(),version:J.Optional(J.String())})}).post("/update-all",async({set:z})=>{try{let K=await w("*",()=>B.updateAll());return{success:!0,results:K,message:`Updated ${K.filter((Q)=>Q.success).length}/${K.length} plugin(s)`}}catch(K){return z.status=500,{error:"Failed to update all plugins",details:String(K)}}}).post("/remove-all",async({set:z})=>{try{let K=await w("*",async()=>{let Q=await B.removeAll(V.hostServices);return V.rebuildPluginSurfaces?.(),Q});return{success:!0,results:K,message:`Removed ${K.filter((Q)=>Q.success).length}/${K.length} plugin(s)`}}catch(K){return z.status=500,{error:"Failed to remove all plugins",details:String(K)}}}).post("/reload",async({set:z})=>{try{if(!V.app||!V.hostServices)return z.status=503,{error:"Plugin lifecycle services are not ready"};let K=await w("*",async()=>{return await B.reloadAll(V.app,V.hostServices),V.rebuildPluginSurfaces?.(),B.getPluginDetails()});return{success:!0,plugins:K,message:`Reloaded ${K.length} plugin(s)`}}catch(K){return z.status=500,{error:"Failed to reload plugins",details:String(K)}}}).post("/:name/reload",async({params:z,set:K})=>{if(!V.app||!V.hostServices)return K.status=503,{error:"Plugin lifecycle services are not ready"};let Q=z.name,X=B.getAllPlugins().find((Y)=>Y.name===Q);if(!X)return K.status=404,{error:`Plugin "${Q}" not found`};let x=B.getPluginDetails().find((Y)=>Y.pluginName===Q)?.packageName??`core:${Q}`;if(K2(x))return K.status=409,{error:"Plugin lifecycle in progress; try again shortly",packageName:x};try{return await w(x,async()=>{if(X.onServerStop)try{await X.onServerStop({reason:"reload"})}catch(Y){console.warn(`[plugin-mgr] onServerStop during reload of ${Q}:`,Y)}if(V.hostServices)V.hostServices.serviceRegistry.unregisterPlugin(X.name);if(B.registerProviders(X,V.hostServices),X.onServerStart)await X.onServerStart(V.app,V.hostServices),B.registerProviders(X,V.hostServices);if(X.onServerReady)await X.onServerReady(V.app,V.hostServices);return V.rebuildPluginSurfaces?.(),{success:!0,message:`Plugin ${Q} reloaded`,version:X.version}})}catch(Y){return K.status=500,{error:"Failed to reload plugin",details:String(Y)}}},{params:J.Object({name:J.String()})})}import{mkdirSync as o,writeFileSync as v,existsSync as x2}from"fs";import{isAbsolute as D2,join as T,relative as h2,resolve as g}from"path";var h="http://localhost:3005",A2=/^[a-z0-9][a-z0-9-]{0,63}$/,v2=new Set(["backend","frontend","cli","provider","adapter","integration"]);function C2(V,B){let z=h2(V,B);if(z.startsWith("..")||D2(z))throw Error("Plugin scaffold path escapes the selected directory.")}function M(V){return JSON.stringify(V)}function J2(V){let B=V.command("plugin").description("Manage plugins");B.command("list").description("List installed plugins").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON").option("--plain","Force plain text output").action(async(K)=>{try{let Q={...V.opts(),...K},X=U(K),$=encodeURIComponent(E(Q)),x=async()=>{try{return(await n(X,`/api/profiles/${$}/plugins`)).plugins||[]}catch{S("Agent not reachable. Attempting local plugin registry...");let{PluginManager:Z}=await import("./plugin-system-c916v9an.js");return new Z().getPluginDetails()||[]}},Y=(Z)=>Z.status??(Z.loaded===!0||Z.enabled===!0?"enabled":"disabled"),W=(Z)=>Z.pluginName||Z.name||Z.packageName||Z.package||"-";await t({mode:l(Q),fetchData:x,plain:(Z)=>{if(!Z.length){_("No plugins installed.");return}k("Installed Plugins"),i(Z.map((H)=>({Name:W(H),Version:H.version||"-",Status:Y(H),Description:H.description||"-"})))},interactive:async(Z)=>{if(!Z.length){k("Installed Plugins"),_("No plugins installed.");return}let H=Z.map((F)=>{let C=W(F),G=Y(F),b=[`${N.bold(C)} ${G==="enabled"?N.green(G):N.dim(G)}`,"",` Version: ${F.version||"-"}`,` Description: ${F.description||"-"}`];if(F.tags&&Array.isArray(F.tags))b.push(` Tags: ${F.tags.join(", ")}`);if(F.cliCommand)b.push(` CLI command: vibe ${F.cliCommand}`);return{id:C,label:C,hint:G,detail:b.join(`
3
+ `)}});await s({title:`vibe plugin \u2014 ${Z.length} installed`,rows:H,footer:"\u2191/\u2193 navigate \xB7 q to quit"})},json:(Z)=>Z.map((H)=>({name:W(H),version:H.version??null,status:Y(H),description:H.description??null,tags:H.tags??null,cliCommand:H.cliCommand??null}))})}catch(Q){q(O(Q))}}),B.command("install").description("Install a plugin").argument("<package>","NPM package name to install").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--skip-prereqs","Skip running the plugin's prereqs/install",!1).option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));try{let Y=await D($,`/api/profiles/${x}/plugins/install`,{packageName:K,skipPrereqs:!!Q.skipPrereqs});if(R(X,{ok:!0,action:"install",package:K,version:Y?.version??null,prereqs:Y?.prereqs??null}))return;if(I(`Plugin "${K}" installed.`),Y?.version)A("Version",Y.version);if(Y?.prereqs){let W=Y.prereqs;if(W.skipped)S(`Prerequisite install skipped. Run \`vibe plugin prereqs ${K} install\` later.`);else if(!W.satisfied)S(`Prerequisites not yet satisfied: ${(W.missing||[]).map((Z)=>Z.name).join(", ")||"(unknown)"}`);if((W.pendingSudo||[]).length>0){S(`${W.pendingSudo.length} command(s) need sudo. Run them and re-check with \`vibe plugin prereqs ${K} status\`:`);for(let Z of W.pendingSudo)A(` ${Z.name}`,Z.command)}}}catch{S("Agent not reachable. Attempting local install...");try{let{PluginManager:Y}=await import("./plugin-system-c916v9an.js");if(await new Y().install(K),R(X,{ok:!0,action:"install",package:K,local:!0}))return;I(`Plugin "${K}" installed locally.`)}catch(Y){q(`Could not install plugin via agent or locally: ${O(Y)}`)}}}catch(X){q(O(X))}}),B.command("remove").description("Remove a plugin").argument("<package>","NPM package name to remove").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));try{if(await D($,`/api/profiles/${x}/plugins/remove`,{packageName:K}),R(X,{ok:!0,action:"remove",package:K}))return;I(`Plugin "${K}" removed.`)}catch{S("Agent not reachable. Attempting local removal...");try{let{PluginManager:Y}=await import("./plugin-system-c916v9an.js");if(await new Y().remove(K),R(X,{ok:!0,action:"remove",package:K,local:!0}))return;I(`Plugin "${K}" removed locally.`)}catch(Y){q(`Could not remove plugin via agent or locally: ${O(Y)}`)}}}catch(X){q(O(X))}}),B.command("update").description("Update a plugin (or all plugins with --all)").argument("[package]","NPM package name to update").option("--all","Update all installed plugins",!1).option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));if(Q.all){_("Updating all plugins...");try{let Y=await D($,`/api/profiles/${x}/plugins/update-all`,{}),W=Y?.results||[];if(R(X,{ok:!0,action:"update-all",results:W}))return;for(let Z of W)if(Z.success)I(`Updated ${Z.packageName}${Z.version?` to v${Z.version}`:""}`);else S(`Failed to update ${Z.packageName}: ${Z.error}`);I(Y?.message||"Done.")}catch{S("Agent not reachable. Attempting local update...");try{let{PluginManager:Y}=await import("./plugin-system-c916v9an.js"),Z=await new Y().updateAll();if(R(X,{ok:!0,action:"update-all",results:Z,local:!0}))return;for(let H of Z)if(H.success)I(`Updated ${H.packageName}${H.version?` to v${H.version}`:""}`);else S(`Failed to update ${H.packageName}: ${H.error}`)}catch(Y){q(`Could not update plugins: ${O(Y)}`)}}}else if(K){_(`Updating ${K}...`);try{let Y=await D($,`/api/profiles/${x}/plugins/update`,{packageName:K});if(R(X,{ok:!0,action:"update",package:K,version:Y?.version??null,message:Y?.message??null}))return;I(Y?.message||`Plugin "${K}" updated.`)}catch{S("Agent not reachable. Attempting local update...");try{let{PluginManager:Y}=await import("./plugin-system-c916v9an.js"),Z=await new Y().update(K);if(R(X,{ok:!0,action:"update",package:K,version:Z.version,local:!0}))return;I(`Plugin "${K}" updated to v${Z.version}.`)}catch(Y){q(`Could not update plugin: ${O(Y)}`)}}}else q("Provide a package name to update, or use --all to update all plugins.")}catch(X){q(O(X))}}),B.command("uninstall").description("Uninstall a plugin (or all plugins with --all)").argument("[package]","NPM package name to uninstall").option("--all","Uninstall all external plugins",!1).option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=U(Q),x=encodeURIComponent(E(X));if(Q.all){_("Uninstalling all plugins...");try{let Y=await D($,`/api/profiles/${x}/plugins/remove-all`,{}),W=Y?.results||[];if(R(X,{ok:!0,action:"uninstall-all",results:W}))return;for(let Z of W)if(Z.success)I(`Removed ${Z.packageName}`);else S(`Failed to remove ${Z.packageName}: ${Z.error}`);I(Y?.message||"Done.")}catch{S("Agent not reachable. Attempting local removal...");try{let{PluginManager:Y}=await import("./plugin-system-c916v9an.js"),Z=await new Y().removeAll();if(R(X,{ok:!0,action:"uninstall-all",results:Z,local:!0}))return;for(let H of Z)if(H.success)I(`Removed ${H.packageName}`);else S(`Failed to remove ${H.packageName}: ${H.error}`)}catch(Y){q(`Could not uninstall plugins: ${O(Y)}`)}}}else if(K)try{if(await D($,`/api/profiles/${x}/plugins/remove`,{packageName:K}),R(X,{ok:!0,action:"uninstall",package:K}))return;I(`Plugin "${K}" uninstalled.`)}catch{S("Agent not reachable. Attempting local removal...");try{let{PluginManager:Y}=await import("./plugin-system-c916v9an.js");if(await new Y().remove(K),R(X,{ok:!0,action:"uninstall",package:K,local:!0}))return;I(`Plugin "${K}" uninstalled locally.`)}catch(Y){q(`Could not uninstall plugin: ${O(Y)}`)}}else q("Provide a package name to uninstall, or use --all to uninstall all plugins.")}catch(X){q(O(X))}}),B.command("reload").description("Reload all plugins").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K)=>{try{let Q={...V.opts(),...K},X=U(K),$=encodeURIComponent(E(Q));if(await D(X,`/api/profiles/${$}/plugins/reload`,{}),R(Q,{ok:!0,action:"reload"}))return;I("Plugins reloaded.")}catch(Q){q(O(Q))}}),B.command("available").description("Show available plugins").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON").option("--plain","Force plain text output").action(async(K)=>{try{let Q={...V.opts(),...K},X=U(K),$=encodeURIComponent(E(Q)),x=async()=>{return(await n(X,`/api/profiles/${$}/plugins/available`)).plugins||[]},Y=(Z)=>Z.name||Z.package||"-",W=(Z)=>Z.version||Z.latestVersion||"-";await t({mode:l(Q),fetchData:x,plain:(Z)=>{if(!Z||Z.length===0){_("No available plugins found.");return}k("Available Plugins"),i(Z.map((H)=>({Name:Y(H),Version:W(H),Description:H.description||"-"})))},interactive:async(Z)=>{if(!Z||Z.length===0){k("Available Plugins"),_("No available plugins found.");return}let H=Z.map((F)=>{let C=Y(F),G=[N.bold(C),"",` Version: ${W(F)}`,` Description: ${F.description||"-"}`];return{id:C,label:C,hint:W(F),detail:G.join(`
4
+ `)}});await s({title:`vibe plugin available \u2014 ${Z.length} plugin(s)`,rows:H,footer:"\u2191/\u2193 navigate \xB7 q to quit"})},json:(Z)=>Z.map((H)=>({name:Y(H),version:W(H),description:H.description??null}))})}catch(Q){q(O(Q))}});let z=B.command("prereqs").description("Inspect or run a plugin's prerequisite-install protocol").argument("<package>","NPM package name (or short plugin name)");z.command("status",{isDefault:!0}).description("Show the plugin's prereq status").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON").option("--plain","Force plain text output").action(async(K,Q)=>{let X=Q.parent?.args?.[0];if(!X){q("Missing plugin package argument.");return}try{let $={...V.opts(),...K},x=U(K),Y=async()=>D(x,"/api/plugins/prereqs/status",{packageName:X});await t({mode:l($),fetchData:Y,plain:(W)=>{if(A("Plugin",X),A("Satisfied",W?.satisfied?"yes":"no"),Array.isArray(W?.missing)&&W.missing.length>0)A("Missing",W.missing.map((Z)=>Z.name).join(", "))},interactive:async(W)=>{let Z=[`Plugin: ${X}`,`Satisfied: ${W?.satisfied?"yes":"no"}`];if(Array.isArray(W?.missing)&&W.missing.length>0)Z.push(`Missing: ${W.missing.map((H)=>H.name).join(", ")}`);await G2({title:`Prereqs: ${X}`,body:Z.join(`
5
+ `),footer:"q / Esc to quit"})},json:(W)=>({plugin:X,satisfied:!!W?.satisfied,missing:Array.isArray(W?.missing)?W.missing:[],pendingSudo:Array.isArray(W?.pendingSudo)?W.pendingSudo:[]})})}catch($){q(`Could not read prereq status: ${O($)}`)}}),z.command("install").description("Run the plugin's prerequisite install endpoint").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--approve-sudo","Auto-approve sudo commands the plugin returns",!1).option("--json","Emit JSON result").action(async(K,Q)=>{let X=Q.parent?.args?.[0];if(!X){q("Missing plugin package argument.");return}try{let $={...V.opts(),...K},x=U(K),Y=await D(x,"/api/plugins/prereqs/install",{packageName:X,approveSudo:!!K.approveSudo});if(R($,{ok:!0,action:"prereqs-install",plugin:X,satisfied:!!Y?.satisfied,pendingSudo:Y?.pendingSudo??[]}))return;if(Y?.satisfied)I(`Prerequisites satisfied for ${X}.`);else S(`Prerequisites still missing for ${X}.`);if(Array.isArray(Y?.pendingSudo)&&Y.pendingSudo.length>0){S(`${Y.pendingSudo.length} command(s) require sudo:`);for(let W of Y.pendingSudo)A(` ${W.name}`,W.command)}}catch($){q(`Prereq install failed: ${O($)}`)}}),z.command("uninstall").description("Run the plugin's prerequisite uninstall endpoint (if supported)").option("--agent-url <url>","Agent URL",h).option("--profile <name>","Target a specific profile by name").option("--json","Emit JSON result").action(async(K,Q)=>{let X=Q.parent?.args?.[0];if(!X){q("Missing plugin package argument.");return}try{let $={...V.opts(),...K},x=U(K);if(await D(x,"/api/plugins/prereqs/uninstall",{packageName:X}),R($,{ok:!0,action:"prereqs-uninstall",plugin:X}))return;I(`Prereq uninstall completed for ${X}.`)}catch($){S(`Prereq uninstall not supported or failed: ${O($)}`)}}),B.command("create").description("Scaffold a new plugin project").argument("<name>",'Plugin name (e.g. "docker" \u2192 vibe-plugin-docker)').option("-d, --dir <directory>","Parent directory",".").option("--tag <tag>","Plugin tag (backend, frontend, cli, provider, adapter, integration)","backend").option("--with-ui","Include a companion UI plugin scaffold",!1).option("--json","Emit JSON result").action(async(K,Q)=>{try{let X={...V.opts(),...Q},$=K.startsWith("vibe-plugin-")?K.slice(12):K;if(!A2.test($)){q("Plugin name must use lowercase letters, numbers, and dashes only.");return}let x=Q.tag;if(!v2.has(x)){q("Invalid plugin tag.");return}let Y=`vibe-plugin-${$}`,W=g(Q.dir),Z=g(W,Y);if(C2(W,Z),x2(Z)){q(`Directory "${Z}" already exists.`);return}_(`Scaffolding ${Y}...`),o(T(Z,"src"),{recursive:!0}),o(T(Z,"dist"),{recursive:!0});let H=`VibeControls plugin: ${$}`,F={name:`@vibecontrols/${Y}`,version:"0.1.0",main:"./dist/index.js",type:"module",engines:{bun:">=1.3.0"},scripts:{build:"bun build ./src/index.ts --outdir ./dist --target bun",lint:"eslint ./src",format:"bunx prettier . --write","format:check":"bunx prettier . --check","type:check":"tsc --noEmit",clean:"rimraf dist",prebuild:"bun run clean",prepublishOnly:"bun run build",sanity:"bun run format:check && bun run lint && bun run type:check && bun run build"},keywords:["vibecontrols","vibe","vibe-plugin",$,"bun"],author:{name:"Your Name",email:"you@example.com"},license:"SEE LICENSE IN LICENSE",description:H,devDependencies:{"@types/bun":"^1.2.16","bun-types":"^1.3.9",commander:"^14.0.3",eslint:"^9.30.1",prettier:"^3.6.2",rimraf:"^6.0.1",typescript:"^5.8.3","typescript-eslint":"^8.56.0"},peerDependencies:{"@vibecontrols/agent":">=2.0.0"},peerDependenciesMeta:{"@vibecontrols/agent":{optional:!0}},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},files:["dist/**/*","README.md","LICENSE"]};v(T(Z,"package.json"),JSON.stringify(F,null,2)+`
6
+ `);let C={compilerOptions:{target:"ES2022",module:"ES2022",moduleResolution:"bundler",types:["bun-types"],strict:!0,esModuleInterop:!0,skipLibCheck:!0,outDir:"./dist",rootDir:"./src",declaration:!0,sourceMap:!0},include:["src/**/*.ts"],exclude:["node_modules","dist"]};v(T(Z,"tsconfig.json"),JSON.stringify(C,null,2)+`
7
+ `),v(T(Z,".gitignore"),["node_modules/","dist/","bun.lock",".env",".env.local","*.tgz"].join(`
8
+ `)+`
9
+ `);let G=$,b=M(Y),p=M(H),q2=M(x),r=M(G),I2=`import type { Command } from "commander";
10
+
11
+ /**
12
+ * @vibecontrols/${Y}
13
+ *
14
+ * ${H}
15
+ */
16
+
17
+ // \u2500\u2500 Plugin Interfaces \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
18
+
19
+ export interface HostServices {
20
+ logger?: {
21
+ info: (msg: string) => void;
22
+ warn: (msg: string) => void;
23
+ error: (msg: string) => void;
24
+ debug: (msg: string) => void;
25
+ };
26
+ config?: Record<string, unknown>;
27
+ }
28
+
29
+ export interface VibePlugin {
30
+ name: string;
31
+ version: string;
32
+ description: string;
33
+ tags?: Array<
34
+ "backend" | "frontend" | "cli" | "provider" | "adapter" | "integration"
35
+ >;
36
+ cliCommand: string;
37
+ onCliSetup: (program: Command, hostServices?: HostServices) => void;
38
+ }
39
+
40
+ // \u2500\u2500 Plugin Implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
41
+
42
+ const plugin: VibePlugin = {
43
+ name: ${b},
44
+ version: "0.1.0",
45
+ description: ${p},
46
+ tags: [${q2}],
47
+ cliCommand: ${r},
48
+
49
+ onCliSetup(program: Command, _hostServices?: HostServices): void {
50
+ const cmd = program
51
+ .command(${r})
52
+ .description(${p});
53
+
54
+ cmd
55
+ .command("status")
56
+ .description(`+M(`Show ${$} status`)+`)
57
+ .action(() => {
58
+ console.log(`+M(`${Y} is ready.`)+`);
59
+ });
60
+
61
+ cmd
62
+ .command("info")
63
+ .description("Show plugin info")
64
+ .action(() => {
65
+ console.log(JSON.stringify({
66
+ name: plugin.name,
67
+ version: plugin.version,
68
+ description: plugin.description,
69
+ tags: plugin.tags,
70
+ }, null, 2));
71
+ });
72
+ },
73
+ };
74
+
75
+ export default plugin;
76
+ `;v(T(Z,"src","index.ts"),I2);let S2=`# ${Y}
77
+
78
+ ${H}
79
+
80
+ ## Installation
81
+
82
+ \`\`\`bash
83
+ vibe plugin install @vibecontrols/${Y}
84
+ \`\`\`
85
+
86
+ ## Usage
87
+
88
+ \`\`\`bash
89
+ vibe ${G} status
90
+ vibe ${G} info
91
+ \`\`\`
92
+
93
+ ## Development
94
+
95
+ \`\`\`bash
96
+ bun install
97
+ bun run build
98
+ bun run sanity
99
+ \`\`\`
100
+
101
+ ## Publishing
102
+
103
+ \`\`\`bash
104
+ bun run build
105
+ npm publish
106
+ \`\`\`
107
+ `;v(T(Z,"README.md"),S2);let P={ok:!0,action:"create",plugin:Y,packageName:`@vibecontrols/${Y}`,cliCommand:G,tag:x,dir:Z,withUi:Q.withUi===!0};if(!X.json)I(`Created ${Y} at ${Z}`),A("Plugin Name",`@vibecontrols/${Y}`),A("CLI Command",`vibe ${G}`),A("Tag",x),_(`
108
+ Next steps:`),_(` cd ${Y}`),_(" bun install"),_(" bun run build"),_(` publish @vibecontrols/${Y}, then install from catalog`);if(Q.withUi){let f=`${Y.replace("vibe-plugin-","vibe-plugin-ui-")}`,j=g(W,f);if(C2(W,j),x2(j)){if(!X.json)S(`UI directory "${j}" already exists, skipping.`);P.uiSkipped=!0,P.uiDir=j}else{o(T(j,"src"),{recursive:!0}),o(T(j,"public"),{recursive:!0});let O2={name:`@vibecontrols/${f}`,version:"0.1.0",private:!1,type:"module",scripts:{dev:"vite --port 5180",build:"tsc && vite build",preview:"vite preview",lint:"eslint ./src",format:"bunx prettier . --write","format:check":"bunx prettier . --check","type:check":"tsc --noEmit",sanity:"bun run format:check && bun run lint && bun run type:check && bun run build"},keywords:["vibecontrols","vibe-plugin","ui",$],author:{name:"Your Name",email:"you@example.com"},license:"SEE LICENSE IN LICENSE",description:`UI for ${Y}`,dependencies:{react:"^19.0.0","react-dom":"^19.0.0"},devDependencies:{"@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4.5.2",typescript:"^5.8.3",vite:"^7.0.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},files:["dist/**/*","README.md"]};v(T(j,"package.json"),JSON.stringify(O2,null,2)+`
109
+ `);let R2=`import React from "react";
110
+ import ReactDOM from "react-dom/client";
111
+ import App from "./App";
112
+
113
+ ReactDOM.createRoot(document.getElementById("root")!).render(
114
+ <React.StrictMode>
115
+ <App />
116
+ </React.StrictMode>
117
+ );
118
+ `;v(T(j,"src","main.tsx"),R2);let _2=`import { useState, useEffect } from "react";
119
+
120
+ const TITLE = ${M(`${$} UI`)};
121
+
122
+ export default function App() {
123
+ const [apiKey, setApiKey] = useState<string | null>(null);
124
+ const [status, setStatus] = useState("loading...");
125
+
126
+ useEffect(() => {
127
+ // Auth via postMessage (iframe) or URL param (new tab)
128
+ const params = new URLSearchParams(window.location.search);
129
+ const key = params.get("apiKey");
130
+ if (key) {
131
+ setApiKey(key);
132
+ setStatus("connected");
133
+ return;
134
+ }
135
+
136
+ const handler = (e: MessageEvent) => {
137
+ if (e.data?.type === "vibe-auth" && e.data.apiKey) {
138
+ setApiKey(e.data.apiKey);
139
+ setStatus("connected");
140
+ }
141
+ };
142
+ window.addEventListener("message", handler);
143
+ return () => window.removeEventListener("message", handler);
144
+ }, []);
145
+
146
+ return (
147
+ <div style={{ background: "var(--vibe-surface, Canvas)", color: "var(--vibe-text, CanvasText)", minHeight: "100vh", padding: 24, fontFamily: "system-ui" }}>
148
+ <h1>{TITLE}</h1>
149
+ <p>Status: {status}</p>
150
+ {apiKey && <p style={{ color: "var(--vibe-success, CanvasText)" }}>Authenticated</p>}
151
+ </div>
152
+ );
153
+ }
154
+ `;v(T(j,"src","App.tsx"),_2);let T2=`<!DOCTYPE html>
155
+ <html lang="en">
156
+ <head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>${$} UI</title></head>
157
+ <body><div id="root"></div><script type="module" src="/src/main.tsx"></script></body>
158
+ </html>`;if(v(T(j,"index.html"),T2),!X.json)I(`Created UI plugin ${f} at ${j}`);P.uiPluginName=f,P.uiPackageName=`@vibecontrols/${f}`,P.uiDir=j}}R(X,P)}catch(X){q(O(X))}})}function F2(V,B){J2(V)}function s2(V){return{name:"plugin-mgr",version:"2.2.0",description:"Plugin lifecycle management \u2014 install, remove, reload, catalog",capabilities:{storage:"rw",subprocess:!0,gateway:!0,audit:!0,telemetry:!0},tags:["backend","cli"],cliCommand:"plugin",apiPrefix:"/api/plugins",createRoutes:(B)=>B2(B),onCliSetup:async(B,z)=>{F2(B,z)}}}export{s2 as createPlugin};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{lstatSync as d,readdirSync as m,readlinkSync as h,statSync as g,unlinkSync as v}from"fs";import{homedir as y}from"os";import{isAbsolute as p,join as s,resolve as f}from"path";function x(c={}){let o=y(),i=c.binDir??s(o,".bun","bin"),n={scanned:0,removed:[]},l;try{l=m(i)}catch{return n}let b=s(o,".bun","install","global","node_modules","@vibecontrols");for(let u of l){let e=s(i,u),t;try{if(!d(e).isSymbolicLink())continue;n.scanned+=1,t=h(e)}catch{continue}let r=p(t)?t:f(i,t);if(!r.startsWith(b))continue;let a=!0;try{g(r)}catch{a=!1}if(a)continue;try{v(e),n.removed.push(e)}catch{}}return n}
3
+ export{x as H};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{Xa as N}from"./index-0ckffygp.js";import{Nd as Q}from"./index-9bqd8veb.js";var V=5000,H=new Map,X=1;function Y(b){return`${b}#${X++}`}function u(b){let z=Bun.spawn(b.cmd,{env:b.env,cwd:b.cwd,stdout:b.stdout??"pipe",stderr:b.stderr??"pipe",stdin:b.stdin??"pipe",...N().processGroupSpawnOpts()}),B={id:Y(b.owner),owner:b.owner,pid:z.pid??null,startedAt:new Date().toISOString(),proc:z,meta:b.meta};return H.set(B.id,B),z.exited.finally(()=>{H.delete(B.id)}),B}function v(){return[...H.values()]}function C(b){return[...H.values()].filter((z)=>z.owner===b)}async function Z(b,z){let B=N(),J=Date.now()+z;while(Date.now()<J){if(!B.isProcessAlive(b))return!0;await new Promise((U)=>setTimeout(U,100))}return!B.isProcessAlive(b)}async function T(b,z="SIGTERM"){let B=b.pid;if(B==null)return;let J=N();if(J.killProcessTree(B,z),await Z(B,V))return;J.killProcessTree(B,"SIGKILL")}async function D(b){let z=H.get(b);if(!z)return!1;return await T(z),H.delete(b),!0}async function F(){let b=[...H.values()];if(b.length===0)return{reaped:0};return Q().logger.info("subprocess",`Reaping ${b.length} tracked child process(es)`,{owners:[...new Set(b.map((z)=>z.owner))]}),await Promise.all(b.map((z)=>T(z))),H.clear(),{reaped:b.length}}
3
+ export{u as o,v as p,C as q,D as r,F as s};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{Xa as R}from"./index-0ckffygp.js";import{bb as j}from"./index-yrgm89r8.js";import{Ad as D,Dd as P,Kd as g,Nd as M}from"./index-9bqd8veb.js";import{$d as A,Xd as y,_d as x}from"./index-0cn9bv8z.js";import{spawn as _}from"child_process";import{createHash as f}from"crypto";import{existsSync as u,promises as V,createWriteStream as h}from"fs";import{homedir as m,tmpdir as p}from"os";import*as q from"path";import{Readable as d}from"stream";import{pipeline as l}from"stream/promises";function n(){let G=process.arch==="x64"?"x64":"arm64";return`${process.platform==="win32"?"win32":process.platform==="darwin"?"darwin":"linux"}-${G}`}function c(){return q.join(m(),".boff","vibecontrols","tools")}function L(G,J){let X=J??G;if(process.platform==="win32"&&!X.toLowerCase().endsWith(".exe"))return`${X}.exe`;return X}function o(G,J,X){return q.join(X??c(),G,L(G,J))}async function E(G,J){if(!J.versionMatcher)return!0;return new Promise((X)=>{let Y=_(G,J.versionArgs??["--version"],{stdio:["ignore","pipe","pipe"]}),K="";Y.stdout.on("data",(H)=>K+=H.toString()),Y.stderr.on("data",(H)=>K+=H.toString()),Y.on("close",()=>{try{X(new RegExp(J.versionMatcher).test(K))}catch{X(!1)}}),Y.on("error",()=>X(!1))})}async function i(G){let J=G.platform??n(),X=L(G.name,G.binaryName),Y=o(G.name,G.binaryName,G.cacheRoot);if(u(Y)&&await E(Y,G))return Y;try{let H=typeof Bun<"u"&&typeof Bun.which==="function"?Bun.which(G.binaryName??G.name,{PATH:process.env.PATH}):null;if(H&&await E(H,G))return G.log?.info?.(`[install] using PATH binary ${G.name} (${H})`),H}catch{}let K=G.downloads[J];if(!K)throw Error(`[install] no download manifest entry for ${G.name} on ${J}`);return G.log?.info?.(`[install] downloading ${G.name} for ${J}`),await V.mkdir(q.dirname(Y),{recursive:!0}),await a(K,Y,X,G.name),G.log?.info?.(`[install] installed ${G.name} \u2192 ${Y}`),Y}async function a(G,J,X,Y){let K=q.dirname(J),H=q.join(p(),`vibe-install-${Y}-${process.pid}`);await V.mkdir(H,{recursive:!0});let $=q.join(H,"artifact");try{let Z=await fetch(G.url,{redirect:"follow"});if(!Z.ok)throw Error(`download failed (${Z.status}) for ${G.url}`);if(!Z.body)throw Error(`empty response body for ${G.url}`);if(await l(d.fromWeb(Z.body),h($)),G.sha256){let I=f("sha256").update(await V.readFile($)).digest("hex");if(I!==G.sha256)throw Error(`sha256 mismatch for ${Y}: expected ${G.sha256}, got ${I}`)}let z=G.archive??(G.url.endsWith(".tar.gz")||G.url.endsWith(".tgz")?"tar.gz":G.url.endsWith(".zip")?"zip":"raw");if(z==="raw")await V.copyFile($,J);else{if(z==="tar.gz")await w("tar",["-xzf",$,"-C",H]);else await s($,H);let I=G.binaryWithinArchive??X;await V.copyFile(q.join(H,I),J)}if(process.platform!=="win32")await V.chmod(J,493)}finally{await V.rm(H,{recursive:!0,force:!0})}}async function s(G,J){try{await w("unzip",["-q","-o",G,"-d",J]);return}catch(X){if(process.platform!=="win32")throw X;await w("tar",["-xf",G,"-C",J])}}async function w(G,J){return new Promise((X,Y)=>{let K=_(G,J,{stdio:["ignore","ignore","pipe"]}),H="";K.stderr.on("data",($)=>H+=$.toString()),K.on("close",($)=>$===0?X():Y(Error(`${G} exit ${$}: ${H}`))),K.on("error",Y)})}var W="https://github.com/cloudflare/cloudflared/releases/latest/download",r={"linux-x64":{url:`${W}/cloudflared-linux-amd64`,archive:"raw"},"linux-arm64":{url:`${W}/cloudflared-linux-arm64`,archive:"raw"},"darwin-x64":{url:`${W}/cloudflared-darwin-amd64.tgz`,archive:"tar.gz",binaryWithinArchive:"cloudflared"},"darwin-arm64":{url:`${W}/cloudflared-darwin-arm64.tgz`,archive:"tar.gz",binaryWithinArchive:"cloudflared"},"win32-x64":{url:`${W}/cloudflared-windows-amd64.exe`,archive:"raw"},"win32-arm64":{url:`${W}/cloudflared-windows-arm64.exe`,archive:"raw"}},t=/(https:\/\/(?!api\.)[a-zA-Z0-9-]+\.trycloudflare\.com)/;async function N(G,J){let X=J?.log??{},Y;try{Y=await i({name:"cloudflared",downloads:r,versionMatcher:"cloudflared version",log:X})}catch($){return X.warn?.(`quick-tunnel: could not obtain cloudflared: ${String($)}`),null}let K;try{K=_(Y,["tunnel","--url",`http://127.0.0.1:${G}`,"--no-autoupdate"],{stdio:["ignore","pipe","pipe"]})}catch($){return X.warn?.(`quick-tunnel: failed to spawn cloudflared: ${String($)}`),null}let H=await new Promise(($)=>{let Z=!1,z=(Q)=>{if(Z)return;Z=!0,$(Q)},I=setTimeout(()=>{X.warn?.("quick-tunnel: cloudflared did not advertise a URL in time"),z(null)},J?.timeoutMs??30000),O=(Q)=>{let B=Q.toString("utf8").match(t);if(B)clearTimeout(I),z(B[0])};K.stdout?.on("data",O),K.stderr?.on("data",O),K.on("error",(Q)=>{clearTimeout(I),X.warn?.(`quick-tunnel: cloudflared failed to spawn: ${String(Q)}`),z(null)}),K.on("exit",(Q)=>{clearTimeout(I),X.warn?.(`quick-tunnel: cloudflared exited (code=${Q})`),z(null)})});if(!H)return null;return{url:H,child:K}}import{existsSync as b,mkdirSync as e,readFileSync as GG,writeFileSync as JG,unlinkSync as XG}from"fs";import{dirname as YG,join as S}from"path";import{readdirSync as $G}from"fs";function T(G){return S(G??x(),"tunnel.state.json")}function v(G,J){let X=T(J);try{e(YG(X),{recursive:!0}),JG(X,JSON.stringify(G,null,2),"utf8")}catch(Y){M().logger.warn("tunnel-state","Failed to persist tunnel state",{error:String(Y)})}}function k(G){let J=T(G);if(!b(J))return null;try{let X=GG(J,"utf8"),Y=JSON.parse(X);if(typeof Y.pid!=="number")return null;return Y}catch(X){return M().logger.warn("tunnel-state","Failed to read tunnel state",{error:String(X)}),null}}function F(G){let J=T(G);if(!b(J))return;try{XG(J)}catch{}}function C(G){return R().isProcessAlive(G)}function xG(G){let J=[];if(G?.allProfiles){let Y;try{Y=A()}catch{return J}let K;try{K=$G(Y)}catch{return J}for(let H of K){let $=S(Y,H),Z=k($);if(Z)J.push({...Z,alive:C(Z.pid),profileDir:$})}return J}let X=k();if(X)J.push({...X,alive:C(X.pid),profileDir:x()});return J}function HG(G){return G.replace(/[^A-Za-z0-9_]/g,"_")}function U(){return(g()??M()).tunnel}async function AG(G,J){let X=U();MG(G),KG();let Y=process.env.AGENT_TUNNEL_URL;if(Y){let $=P(Y);if(!$)return M().logger.warn("tunnel-bootstrap","Ignoring invalid AGENT_TUNNEL_URL"),null;X.url=$,X.externalUrl=!0,M().logger.info("tunnel-bootstrap",`Using AGENT_TUNNEL_URL=${$}`);try{j.emit("tunnel.url_assigned",{provider:"external"})}catch{}return $}let K=J.port,H=await N(K,{log:{info:($)=>M().logger.info("tunnel-bootstrap",$),warn:($)=>M().logger.warn("tunnel-bootstrap",$)}});if(!H)return M().logger.warn("tunnel-bootstrap","No bootstrap tunnel \u2014 the agent will register once the tunnel provider starts post-config"),null;if(X.child=H.child,X.url=H.url,X.url){M().logger.info("tunnel-bootstrap",`Bootstrap tunnel ready: ${X.url}`);try{let z=new URL(X.url).hostname.split(".");if(z.length>=2)D("."+z.slice(-2).join("."))}catch{}try{j.emit("tunnel.url_assigned",{provider:"bootstrap"})}catch{}let $=HG(y());if(process.env[`AGENT_TUNNEL_URL_${$}`]=X.url,X.child?.pid!==void 0)process.env[`AGENT_TUNNEL_PID_${$}`]=String(X.child.pid),v({pid:X.child.pid,url:X.url,startedAt:new Date().toISOString(),provider:"bootstrap",port:K,cmd:`cloudflared tunnel --url http://127.0.0.1:${K}`})}return X.url}function bG(){let G=U();if(G.externalUrl)return!1;if(!G.child||G.child.killed)return!1;let J=G.child.pid;if(J===void 0)return!1;try{process.kill(J,0)}catch{return!1}return G.child=null,F(),M().logger.info("tunnel-bootstrap",`Handed over bootstrap tunnel (PID ${J}) to plugin \u2014 process kept alive`),!0}function SG(){let G=U();if(G.externalUrl){F();return}let J=G.child;if(G.child=null,F(),!J||J.killed)return;try{J.kill("SIGTERM"),M().logger.info("tunnel-bootstrap","Bootstrap tunnel stopped")}catch{}}function vG(){return U().url}function KG(){let G=k();if(!G)return;if(!C(G.pid)){F();return}try{process.kill(G.pid,"SIGTERM"),M().logger.info("tunnel-bootstrap","Reaped orphan tunnel from prior run",{pid:G.pid,provider:G.provider})}catch{}let J=Date.now();while(Date.now()-J<2000&&C(G.pid))Bun.sleepSync(50);if(C(G.pid))try{process.kill(G.pid,"SIGKILL")}catch{}F()}function MG(G){let J={name:"bootstrap",async getActiveTunnelUrl(){return U().url}};G.registerProvider("tunnel",J,"bootstrap")}
3
+ export{k as la,F as ma,C as na,xG as oa,HG as pa,AG as qa,bG as ra,SG as sa,vG as ta,KG as ua};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ var o=new Set(["static-api-key","plugin-state:external-config"]),s=["gateway-auth:"],c=[/(^|[-_:])secret($|[-_:])/i,/(^|[-_:])token($|[-_:])/i,/(^|[-_:])password($|[-_:])/i,/(^|[-_:])api[-_]?key($|[-_:])/i,/^static-api-key$/i,/^gateway-auth:/i,/^clientSecret$/i,/^plugin-state:external-config$/i],E="[redacted]";function g(t){return o.has(t)||s.some((n)=>t.startsWith(n))}function i(t){return c.some((n)=>n.test(t))}function a(t,n){return i(t)&&n!==void 0?"[redacted]":n}function f(t){return Object.fromEntries(Object.entries(t).map(([n,e])=>[n,a(n,e)]))}function r(t){if(Array.isArray(t))return t.map((n)=>r(n));if(!t||typeof t!=="object")return t;return Object.fromEntries(Object.entries(t).map(([n,e])=>[n,i(n)?"[redacted]":r(e)]))}
3
+ export{E as Ya,g as Za,a as _a,f as $a,r as ab};
@@ -0,0 +1,15 @@
1
+ // @bun
2
+ import{Ub as U}from"./index-04n4qgvd.js";import"./index-5mw3eshk.js";import{nc as i,pc as w,qc as C,tc as b,uc as v,wc as G,yc as J}from"./index-z5a4yxzz.js";import"./index-ef95xr4z.js";import{Kc as y,Lc as M,Mc as h,Nc as T}from"./index-xjzmb1pn.js";import"./index-g2raeeh4.js";import{Nd as $}from"./index-9bqd8veb.js";import"./index-0cn9bv8z.js";import"./index-jw1k4vbk.js";import"./index-yy1mm8zs.js";var x={debug:0,info:1,warn:2,error:3};function j(o){if(!o)return;return o==="debug"||o==="info"||o==="warn"||o==="error"?o:void 0}function A(o,n,e,t){if(!o)return n;let r=parseInt(o,10);if(!Number.isInteger(r))return n;return Math.min(t,Math.max(e,r))}function L(o){return new U().get("/",async({query:n,set:e})=>{let t=n,r=j(t.level);if(t.level&&!r)return e.status=400,{error:"Invalid log level"};let m=await $().logger.readHistory({level:r,source:t.source,from:t.from,to:t.to,limit:A(t.limit,200,1,1000),offset:A(t.offset,0,0,1e5)});return{entries:m,count:m.length}}).get("/stream",({query:n,set:e})=>{let t=n,r=j(t.level);if(t.level&&!r)return e.status=400,{error:"Invalid log level"};let m=r??"info",a=t.source??"";return e.headers["Content-Type"]="text/event-stream",e.headers["Cache-Control"]="no-cache",e.headers.Connection="keep-alive",e.headers["X-Accel-Buffering"]="no",new ReadableStream({start(u){let c=new TextEncoder;u.enqueue(c.encode(`: connected
3
+
4
+ `));let s=(g)=>{if(x[g.level]<x[m])return;if(a&&!g.source.includes(a))return;try{u.enqueue(c.encode(`event: log
5
+ data: ${JSON.stringify(g)}
6
+
7
+ `))}catch{p()}},l=setInterval(()=>{try{u.enqueue(c.encode(`: heartbeat
8
+
9
+ `))}catch{p()}},15000),p=()=>{clearInterval(l),$().logger.removeListener("log",s);try{u.close()}catch{}};return $().logger.on("log",s),()=>p()},cancel(){}})})}var P="http://localhost:3005",W=500;function V(o,n,e){let t=Number.parseInt(o,10);if(!Number.isInteger(t)||t<1)return n;return Math.min(t,e)}function O(o){let n=o.command("log").description("View and stream logs");n.command("list").description("List recent log entries").option("--level <level>","Minimum log level","info").option("--limit <n>","Number of entries to show","50").option("--source <source>","Filter by source").option("--agent-url <url>","Agent URL",P).option("--json","Emit JSON (one object per line)").option("--plain","Force plain text output").action(async function(e){try{let t={...o.opts(),...e},r=y(t),m=encodeURIComponent(h(t)),a=new URLSearchParams;if(a.set("level",t.level),a.set("limit",String(V(t.limit,50,W))),t.source)a.set("source",t.source);let c=(await T(r,`/api/profiles/${m}/logs?${a.toString()}`)).entries||[];if(t.json){for(let s of c)process.stdout.write(`${JSON.stringify(s)}
10
+ `);return}if(!c||c.length===0){b("No log entries found.");return}v("Logs"),G();for(let s of c){let l=E(s.level),p=s.timestamp?i.dim(J(s.timestamp)):"",g=s.source?i.cyan(`[${s.source}]`):"",S=s.message||"";console.log(` ${l} ${g} ${S} ${p}`)}}catch(t){w(C(t))}}),n.command("stream").description("Stream logs in real-time (SSE)").option("--level <level>","Minimum log level","info").option("--agent-url <url>","Agent URL",P).option("--json","Emit JSON (one object per line)").option("--plain","Force plain text output").action(async function(e){try{let t={...o.opts(),...e},r=y(t),m=encodeURIComponent(h(t)),a=new URLSearchParams;a.set("level",t.level);let u=`${r}/api/profiles/${m}/logs/stream?${a.toString()}`,c=await M(r);if(!t.json)b(`Streaming logs from ${r} (level: ${t.level})...`),b(`Press Ctrl+C to stop.
11
+ `);let s=await fetch(u,{headers:{Accept:"text/event-stream",...c?{"x-agent-api-key":c}:{}}});if(!s.ok){w(`Failed to connect to log stream: ${s.status} ${s.statusText}`);return}if(!s.body){w("No response body for SSE stream.");return}let l=new TextDecoder,p=s.body.getReader(),g=()=>{p.cancel().catch(()=>{}),console.log(`
12
+ Log stream ended.`),process.exit(0)};process.on("SIGINT",g),process.on("SIGTERM",g);let S="";while(!0){let{done:D,value:F}=await p.read();if(D)break;S+=l.decode(F,{stream:!0});let N=S.split(`
13
+ `);S=N.pop()||"";for(let R of N)if(R.startsWith("data: ")){let f=R.slice(6).trim();if(!f||f==="[DONE]")continue;try{let d=JSON.parse(f);if(t.json)process.stdout.write(`${JSON.stringify(d)}
14
+ `);else{let _=E(d.level),k=d.source?i.cyan(`[${d.source}]`):"",H=d.message||"",K=d.timestamp?i.dim(new Date(d.timestamp).toLocaleTimeString()):"";console.log(`${_} ${k} ${H} ${K}`)}}catch{if(t.json){if(f.trim())process.stdout.write(`${JSON.stringify({raw:f})}
15
+ `)}else if(f.trim())console.log(f)}}}}catch(t){if(t instanceof Error&&t.name==="AbortError")return;w(C(t))}})}function E(o){if(!o)return i.dim("???");switch(o.toLowerCase()){case"error":return i.red(i.bold("ERR"));case"warn":case"warning":return i.yellow("WRN");case"info":return i.blue("INF");case"debug":return i.gray("DBG");case"trace":return i.dim("TRC");default:return i.dim(o.toUpperCase().slice(0,3))}}function I(o,n){O(o)}function et(o){return{name:"log",version:"2.2.0",description:"Log viewing and real-time streaming via SSE",capabilities:{storage:"read",broadcast:!0},tags:["backend","cli"],cliCommand:"log",apiPrefix:"/api/logs",createRoutes:(n)=>L(n),onCliSetup:async(n,e)=>{I(n,e)}}}export{et as createPlugin};