@burdenoff/vibe-agent 2.7.5 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/{app-rjhw31y9.js → app-tba5zhmy.js} +2 -2
  2. package/dist/cli.js +374 -8
  3. package/dist/cli.js.map +8 -5
  4. package/dist/{index-wmvkjcjj.js → index-0429nfr9.js} +2 -2
  5. package/dist/{index-3rjnbp97.js → index-0nt6wnb9.js} +2 -2
  6. package/dist/{index-npmvh1x9.js → index-7ph3496b.js} +2 -2
  7. package/dist/{index-4nsdre0j.js → index-9grqzmk5.js} +40 -12
  8. package/dist/index-9grqzmk5.js.map +13 -0
  9. package/dist/{index-fm6gqenc.js → index-a3q5ewrj.js} +2 -2
  10. package/dist/{index-b6fsz3ht.js → index-cndcb55v.js} +178 -13
  11. package/dist/index-cndcb55v.js.map +13 -0
  12. package/dist/{index-6vry08rz.js → index-dhbg241c.js} +2 -2
  13. package/dist/{index-hefqxwht.js → index-e2dzjkmm.js} +2 -2
  14. package/dist/{index-t0nsa57v.js → index-et6rnq2y.js} +2 -2
  15. package/dist/{index-ftbphe7j.js → index-exh7dh2v.js} +141 -14
  16. package/dist/{index-ftbphe7j.js.map → index-exh7dh2v.js.map} +3 -3
  17. package/dist/{index-30p492yv.js → index-swqzafr9.js} +2 -2
  18. package/dist/{index-xmeskdnb.js → index-t0x810hm.js} +133 -74
  19. package/dist/index-t0x810hm.js.map +12 -0
  20. package/dist/{index-c7zy3n33.js → index-vzmmv3r7.js} +2 -2
  21. package/dist/{index-a9g7hbj9.js → index-w7m3p4qa.js} +2 -2
  22. package/dist/index.js +2 -2
  23. package/dist/{package-6sds8pgn.js → package-cck2kzyn.js} +3 -3
  24. package/dist/{package-6sds8pgn.js.map → package-cck2kzyn.js.map} +1 -1
  25. package/dist/{plugin-system-a2hmq7cg.js → plugin-system-75q3s1rf.js} +87 -15
  26. package/dist/plugin-system-75q3s1rf.js.map +10 -0
  27. package/package.json +1 -1
  28. package/dist/index-4nsdre0j.js.map +0 -13
  29. package/dist/index-b6fsz3ht.js.map +0 -13
  30. package/dist/index-xmeskdnb.js.map +0 -11
  31. package/dist/plugin-system-a2hmq7cg.js.map +0 -10
  32. /package/dist/{app-rjhw31y9.js.map → app-tba5zhmy.js.map} +0 -0
  33. /package/dist/{index-wmvkjcjj.js.map → index-0429nfr9.js.map} +0 -0
  34. /package/dist/{index-3rjnbp97.js.map → index-0nt6wnb9.js.map} +0 -0
  35. /package/dist/{index-npmvh1x9.js.map → index-7ph3496b.js.map} +0 -0
  36. /package/dist/{index-fm6gqenc.js.map → index-a3q5ewrj.js.map} +0 -0
  37. /package/dist/{index-6vry08rz.js.map → index-dhbg241c.js.map} +0 -0
  38. /package/dist/{index-hefqxwht.js.map → index-e2dzjkmm.js.map} +0 -0
  39. /package/dist/{index-t0nsa57v.js.map → index-et6rnq2y.js.map} +0 -0
  40. /package/dist/{index-30p492yv.js.map → index-swqzafr9.js.map} +0 -0
  41. /package/dist/{index-c7zy3n33.js.map → index-vzmmv3r7.js.map} +0 -0
  42. /package/dist/{index-a9g7hbj9.js.map → index-w7m3p4qa.js.map} +0 -0
@@ -18,7 +18,7 @@ import {
18
18
  shortId,
19
19
  success,
20
20
  timeAgo
21
- } from "./index-xmeskdnb.js";
21
+ } from "./index-t0x810hm.js";
22
22
  import"./index-g8dczzvv.js";
23
23
 
24
24
  // src/plugins/notification/routes.ts
@@ -298,4 +298,4 @@ export {
298
298
  };
299
299
 
300
300
  //# debugId=AE9C4A672990742664756E2164756E21
301
- //# sourceMappingURL=index-wmvkjcjj.js.map
301
+ //# sourceMappingURL=index-0429nfr9.js.map
@@ -16,7 +16,7 @@ import {
16
16
  shortId,
17
17
  success,
18
18
  timeAgo
19
- } from "./index-xmeskdnb.js";
19
+ } from "./index-t0x810hm.js";
20
20
  import"./index-g8dczzvv.js";
21
21
 
22
22
  // src/plugins/task/routes.ts
@@ -265,4 +265,4 @@ export {
265
265
  };
266
266
 
267
267
  //# debugId=BC2EA895432C9ECA64756E2164756E21
268
- //# sourceMappingURL=index-3rjnbp97.js.map
268
+ //# sourceMappingURL=index-0nt6wnb9.js.map
@@ -12,7 +12,7 @@ import {
12
12
  header,
13
13
  info,
14
14
  success
15
- } from "./index-xmeskdnb.js";
15
+ } from "./index-t0x810hm.js";
16
16
  import"./index-g8dczzvv.js";
17
17
 
18
18
  // src/plugins/file/routes.ts
@@ -382,4 +382,4 @@ export {
382
382
  };
383
383
 
384
384
  //# debugId=EBEB983AE70EABB664756E2164756E21
385
- //# sourceMappingURL=index-npmvh1x9.js.map
385
+ //# sourceMappingURL=index-7ph3496b.js.map
@@ -7,6 +7,8 @@ import {
7
7
  apiDelete,
8
8
  apiGet,
9
9
  apiPost,
10
+ blank,
11
+ colors,
10
12
  fail,
11
13
  formatStatus,
12
14
  formatTable,
@@ -16,7 +18,7 @@ import {
16
18
  kv,
17
19
  shortId,
18
20
  success
19
- } from "./index-xmeskdnb.js";
21
+ } from "./index-t0x810hm.js";
20
22
  import"./index-g8dczzvv.js";
21
23
 
22
24
  // src/plugins/tunnel/routes.ts
@@ -154,7 +156,7 @@ function createRoutes(deps) {
154
156
  var DEFAULT_AGENT_URL = "http://localhost:3005";
155
157
  function register(program) {
156
158
  const cmd = program.command("tunnel").description("Manage tunnels for exposing local ports");
157
- cmd.command("list").description("List all tunnels").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
159
+ cmd.command("list").description("List all tunnels").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
158
160
  try {
159
161
  const url = getAgentUrl(options);
160
162
  const tunnels = await apiGet(url, "/api/tunnels");
@@ -174,7 +176,7 @@ function register(program) {
174
176
  fail(err.message);
175
177
  }
176
178
  });
177
- cmd.command("start").description("Start a new tunnel").requiredOption("-p, --port <port>", "Local port to expose").option("-s, --subdomain <subdomain>", "Preferred subdomain").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
179
+ cmd.command("start").description("Start a new tunnel").requiredOption("-p, --port <port>", "Local port to expose").option("-s, --subdomain <subdomain>", "Preferred subdomain").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
178
180
  try {
179
181
  const url = getAgentUrl(options);
180
182
  const body = {
@@ -193,7 +195,7 @@ function register(program) {
193
195
  fail(err.message);
194
196
  }
195
197
  });
196
- cmd.command("stop").description("Stop a tunnel").requiredOption("-i, --id <id>", "Tunnel ID").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
198
+ cmd.command("stop").description("Stop a tunnel").requiredOption("-i, --id <id>", "Tunnel ID").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
197
199
  try {
198
200
  const url = getAgentUrl(options);
199
201
  await apiPost(url, `/api/tunnels/${options.id}/stop`, {});
@@ -202,7 +204,7 @@ function register(program) {
202
204
  fail(err.message);
203
205
  }
204
206
  });
205
- cmd.command("delete").description("Delete a tunnel").requiredOption("-i, --id <id>", "Tunnel ID").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
207
+ cmd.command("delete").description("Delete a tunnel").requiredOption("-i, --id <id>", "Tunnel ID").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
206
208
  try {
207
209
  const url = getAgentUrl(options);
208
210
  await apiDelete(url, `/api/tunnels/${options.id}`);
@@ -211,7 +213,7 @@ function register(program) {
211
213
  fail(err.message);
212
214
  }
213
215
  });
214
- cmd.command("status").description("Show tunnel status summary").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
216
+ cmd.command("status").description("Show tunnel status summary").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
215
217
  try {
216
218
  const url = getAgentUrl(options);
217
219
  const result = await apiGet(url, "/api/tunnels/status");
@@ -224,7 +226,7 @@ function register(program) {
224
226
  fail(err.message);
225
227
  }
226
228
  });
227
- cmd.command("agent").description("Manage agent tunnel").option("--start", "Start the agent tunnel").option("--stop", "Stop the agent tunnel").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
229
+ cmd.command("agent").description("Show, start, or stop the agent tunnel").option("--start", "Start the agent tunnel").option("--stop", "Stop the agent tunnel").option("--url-only", "Print only the tunnel URL (for scripting)").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
228
230
  try {
229
231
  const url = getAgentUrl(options);
230
232
  if (options.start) {
@@ -241,12 +243,38 @@ function register(program) {
241
243
  success("Agent tunnel stopped.");
242
244
  } else {
243
245
  const result = await apiGet(url, "/api/agent/tunnel");
246
+ const tunnelUrl = result?.tunnelUrl || result?.publicUrl || result?.url;
247
+ const status = result?.status || "unknown";
248
+ if (options.urlOnly) {
249
+ if (tunnelUrl) {
250
+ console.log(tunnelUrl);
251
+ } else {
252
+ process.exit(1);
253
+ }
254
+ return;
255
+ }
244
256
  header("Agent Tunnel");
245
- kv("Status", formatStatus(result?.status || "unknown"));
246
- if (result?.publicUrl || result?.url)
247
- kv("Public URL", result.publicUrl || result.url);
257
+ kv("Status", formatStatus(status));
258
+ if (tunnelUrl) {
259
+ kv("Public URL", colors.green(tunnelUrl));
260
+ } else if (status === "active" || status === "running") {
261
+ kv("Public URL", colors.yellow("(starting...)"));
262
+ } else {
263
+ kv("Public URL", colors.dim("(not running)"));
264
+ }
248
265
  if (result?.port)
249
266
  kv("Port", result.port);
267
+ if (result?.pid)
268
+ kv("PID", result.pid);
269
+ if (result?.provider)
270
+ kv("Provider", result.provider);
271
+ if (result?.startedAt)
272
+ kv("Started", result.startedAt);
273
+ blank();
274
+ if (!tunnelUrl && status !== "active" && status !== "running") {
275
+ info(`Start tunnel: ${colors.bold("vibe tunnel agent --start")}`);
276
+ blank();
277
+ }
250
278
  }
251
279
  } catch (err) {
252
280
  fail(err.message);
@@ -276,5 +304,5 @@ export {
276
304
  vibePlugin
277
305
  };
278
306
 
279
- //# debugId=53832474CA657FEC64756E2164756E21
280
- //# sourceMappingURL=index-4nsdre0j.js.map
307
+ //# debugId=D57E4E2F87CA36CC64756E2164756E21
308
+ //# sourceMappingURL=index-9grqzmk5.js.map
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/plugins/tunnel/routes.ts", "../src/cli/commands/tunnel.cmd.ts", "../src/plugins/tunnel/commands.ts", "../src/plugins/tunnel/index.ts"],
4
+ "sourcesContent": [
5
+ "import { Elysia, t } from \"elysia\";\nimport type { PluginRouteDeps } from \"../../core/types.js\";\nimport type { ServiceRegistry } from \"../../core/service-registry.js\";\nimport type { TunnelProvider } from \"../../core/providers/tunnel.provider.js\";\n\nfunction getTunnelProvider(registry: ServiceRegistry): TunnelProvider {\n const provider = registry.getProvider<TunnelProvider>(\"tunnel\");\n if (!provider) throw new Error(\"No tunnel provider registered\");\n return provider;\n}\n\nexport function createRoutes(deps: PluginRouteDeps) {\n const { serviceRegistry } = deps;\n\n return new Elysia()\n .get(\"/\", async ({ set }) => {\n try {\n const provider = getTunnelProvider(serviceRegistry);\n const tunnels = await provider.list();\n return { tunnels };\n } catch (err) {\n set.status = 500;\n return { error: \"Failed to list tunnels\", details: String(err) };\n }\n })\n .get(\"/status\", async ({ set }) => {\n try {\n const provider = getTunnelProvider(serviceRegistry);\n const tunnels = await provider.list();\n const active = tunnels.filter((t) => t.status === \"active\");\n const inactive = tunnels.filter((t) => t.status === \"stopped\");\n const errored = tunnels.filter((t) => t.status === \"error\");\n return {\n total: tunnels.length,\n active: active.length,\n inactive: inactive.length,\n errored: errored.length,\n tunnels: active.map((t) => ({\n id: t.id,\n port: t.port,\n url: t.url,\n pid: t.pid,\n })),\n };\n } catch (err) {\n set.status = 500;\n return { error: \"Failed to get tunnel status\", details: String(err) };\n }\n })\n .post(\n \"/start\",\n async ({ body, set }) => {\n if (body.localPort < 1 || body.localPort > 65535) {\n set.status = 400;\n return { error: \"Invalid localPort\" };\n }\n try {\n const provider = getTunnelProvider(serviceRegistry);\n const existing = await provider.list();\n const portTunnel = existing.find(\n (t) => t.port === body.localPort && t.status === \"active\",\n );\n if (portTunnel) {\n set.status = 409;\n return {\n error: `Active tunnel exists for port ${body.localPort}`,\n tunnel: portTunnel,\n };\n }\n const tunnel = await provider.start({\n port: body.localPort,\n name: body.subdomain,\n metadata: body.sessionId\n ? { sessionId: body.sessionId }\n : undefined,\n });\n return {\n id: tunnel.id,\n localPort: tunnel.port,\n publicUrl: tunnel.url,\n pid: tunnel.pid,\n status: tunnel.status,\n sessionId: body.sessionId || null,\n };\n } catch (err) {\n set.status = 500;\n return { error: \"Failed to start tunnel\", details: String(err) };\n }\n },\n {\n body: t.Object({\n localPort: t.Number(),\n subdomain: t.Optional(t.String()),\n sessionId: t.Optional(t.String()),\n }),\n },\n )\n .get(\"/:id\", async ({ params, set }) => {\n try {\n const provider = getTunnelProvider(serviceRegistry);\n const tunnel = await provider.getStatus(params.id);\n if (!tunnel) {\n set.status = 404;\n return { error: \"Tunnel not found\" };\n }\n return { tunnel };\n } catch (err) {\n set.status = 500;\n return { error: \"Failed to get tunnel\", details: String(err) };\n }\n })\n .post(\"/:id/stop\", async ({ params, set }) => {\n try {\n const provider = getTunnelProvider(serviceRegistry);\n const tunnel = await provider.getStatus(params.id);\n if (!tunnel) {\n set.status = 404;\n return { error: \"Tunnel not found\" };\n }\n if (tunnel.status !== \"active\") {\n set.status = 400;\n return { error: \"Tunnel is not active\" };\n }\n await provider.stop(params.id);\n return { success: true };\n } catch (err) {\n set.status = 500;\n return { error: \"Failed to stop tunnel\", details: String(err) };\n }\n })\n .delete(\"/:id\", async ({ params, set }) => {\n try {\n const provider = getTunnelProvider(serviceRegistry);\n const tunnel = await provider.getStatus(params.id);\n if (!tunnel) {\n set.status = 404;\n return { error: \"Tunnel not found\" };\n }\n if (tunnel.status === \"active\") {\n await provider.stop(params.id);\n }\n await provider.delete(params.id);\n return { success: true };\n } catch (err) {\n set.status = 500;\n return { error: \"Failed to delete tunnel\", details: String(err) };\n }\n });\n}\n",
6
+ "import { Command } from \"commander\";\nimport {\n getAgentUrl,\n apiGet,\n apiPost,\n apiDelete,\n fail,\n success,\n info,\n header,\n kv,\n blank,\n colors,\n formatTable,\n formatStatus,\n shortId,\n} from \"../utils/index.js\";\n\nconst DEFAULT_AGENT_URL = \"http://localhost:3005\";\n\nexport function register(program: Command): void {\n const cmd = program\n .command(\"tunnel\")\n .description(\"Manage tunnels for exposing local ports\");\n\n // tunnel list\n cmd\n .command(\"list\")\n .description(\"List all tunnels\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .option(\"--agent <name>\", \"Target agent instance by name\")\n .option(\"--profile <name>\", \"Alias for --agent\")\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const tunnels = await apiGet<any[]>(url, \"/api/tunnels\");\n if (!tunnels || tunnels.length === 0) {\n info(\"No tunnels found.\");\n return;\n }\n header(\"Tunnels\");\n formatTable(\n tunnels.map((t: any) => ({\n ID: shortId(t.id),\n Port: t.port ?? \"-\",\n \"Public URL\": t.publicUrl || t.url || \"-\",\n Status: formatStatus(t.status),\n PID: t.pid ?? \"-\",\n })),\n );\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // tunnel start\n cmd\n .command(\"start\")\n .description(\"Start a new tunnel\")\n .requiredOption(\"-p, --port <port>\", \"Local port to expose\")\n .option(\"-s, --subdomain <subdomain>\", \"Preferred subdomain\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .option(\"--agent <name>\", \"Target agent instance by name\")\n .option(\"--profile <name>\", \"Alias for --agent\")\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const body: Record<string, any> = {\n port: parseInt(options.port, 10),\n };\n if (options.subdomain) body.subdomain = options.subdomain;\n const result = await apiPost<any>(url, \"/api/tunnels/start\", body);\n success(\"Tunnel started.\");\n if (result?.id) kv(\"ID\", shortId(result.id));\n if (result?.publicUrl || result?.url)\n kv(\"Public URL\", result.publicUrl || result.url);\n kv(\"Port\", options.port);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // tunnel stop\n cmd\n .command(\"stop\")\n .description(\"Stop a tunnel\")\n .requiredOption(\"-i, --id <id>\", \"Tunnel ID\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .option(\"--agent <name>\", \"Target agent instance by name\")\n .option(\"--profile <name>\", \"Alias for --agent\")\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n await apiPost<any>(url, `/api/tunnels/${options.id}/stop`, {});\n success(`Tunnel ${shortId(options.id)} stopped.`);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // tunnel delete\n cmd\n .command(\"delete\")\n .description(\"Delete a tunnel\")\n .requiredOption(\"-i, --id <id>\", \"Tunnel ID\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .option(\"--agent <name>\", \"Target agent instance by name\")\n .option(\"--profile <name>\", \"Alias for --agent\")\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n await apiDelete<any>(url, `/api/tunnels/${options.id}`);\n success(`Tunnel ${shortId(options.id)} deleted.`);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // tunnel status\n cmd\n .command(\"status\")\n .description(\"Show tunnel status summary\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .option(\"--agent <name>\", \"Target agent instance by name\")\n .option(\"--profile <name>\", \"Alias for --agent\")\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const result = await apiGet<any>(url, \"/api/tunnels/status\");\n header(\"Tunnel Status\");\n kv(\"Total\", result?.total ?? 0);\n kv(\"Active\", result?.active ?? 0);\n kv(\"Inactive\", result?.inactive ?? 0);\n kv(\"Errored\", result?.errored ?? 0);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // tunnel agent\n cmd\n .command(\"agent\")\n .description(\"Show, start, or stop the agent tunnel\")\n .option(\"--start\", \"Start the agent tunnel\")\n .option(\"--stop\", \"Stop the agent tunnel\")\n .option(\"--url-only\", \"Print only the tunnel URL (for scripting)\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .option(\"--agent <name>\", \"Target agent instance by name\")\n .option(\"--profile <name>\", \"Alias for --agent\")\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n if (options.start) {\n const result = await apiPost<any>(url, \"/api/agent/tunnel\", {\n action: \"start\",\n });\n success(\"Agent tunnel started.\");\n if (result?.publicUrl || result?.url)\n kv(\"Public URL\", result.publicUrl || result.url);\n } else if (options.stop) {\n await apiPost<any>(url, \"/api/agent/tunnel\", {\n action: \"stop\",\n });\n success(\"Agent tunnel stopped.\");\n } else {\n // Default: show tunnel status with active URL\n const result = await apiGet<any>(url, \"/api/agent/tunnel\");\n const tunnelUrl =\n result?.tunnelUrl || result?.publicUrl || result?.url;\n const status = result?.status || \"unknown\";\n\n // --url-only: print raw URL for scripting / piping\n if (options.urlOnly) {\n if (tunnelUrl) {\n console.log(tunnelUrl);\n } else {\n process.exit(1);\n }\n return;\n }\n\n header(\"Agent Tunnel\");\n kv(\"Status\", formatStatus(status));\n\n if (tunnelUrl) {\n kv(\"Public URL\", colors.green(tunnelUrl));\n } else if (status === \"active\" || status === \"running\") {\n kv(\"Public URL\", colors.yellow(\"(starting...)\"));\n } else {\n kv(\"Public URL\", colors.dim(\"(not running)\"));\n }\n\n if (result?.port) kv(\"Port\", result.port);\n if (result?.pid) kv(\"PID\", result.pid);\n if (result?.provider) kv(\"Provider\", result.provider);\n if (result?.startedAt) kv(\"Started\", result.startedAt);\n\n blank();\n\n if (!tunnelUrl && status !== \"active\" && status !== \"running\") {\n info(`Start tunnel: ${colors.bold(\"vibe tunnel agent --start\")}`);\n blank();\n }\n }\n } catch (err: any) {\n fail(err.message);\n }\n });\n}\n",
7
+ "import type { Command } from \"commander\";\nimport type { HostServices } from \"../../core/plugin-system.js\";\nimport { register as registerTunnel } from \"../../cli/commands/tunnel.cmd.js\";\n\nexport function registerCommands(\n program: Command,\n _hostServices: HostServices,\n): void {\n registerTunnel(program);\n}\n",
8
+ "import type { VibePlugin } from \"../../core/plugin-system.js\";\nimport type { PluginRouteDeps } from \"../../core/types.js\";\nimport { createRoutes } from \"./routes.js\";\nimport { registerCommands } from \"./commands.js\";\n\nexport const vibePlugin: VibePlugin = {\n name: \"tunnel\",\n version: \"2.2.0\",\n description: \"Tunnel management via registered tunnel provider\",\n tags: [\"backend\", \"cli\", \"provider\"],\n cliCommand: \"tunnel\",\n apiPrefix: \"/api/tunnels\",\n createRoutes: (deps: PluginRouteDeps) => createRoutes(deps),\n onCliSetup: async (program, hostServices) => {\n registerCommands(program, hostServices);\n },\n};\n"
9
+ ],
10
+ "mappings": "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",
11
+ "debugId": "D57E4E2F87CA36CC64756E2164756E21",
12
+ "names": []
13
+ }
@@ -17,7 +17,7 @@ import {
17
17
  shortId,
18
18
  success,
19
19
  timeAgo
20
- } from "./index-xmeskdnb.js";
20
+ } from "./index-t0x810hm.js";
21
21
  import"./index-g8dczzvv.js";
22
22
 
23
23
  // src/plugins/git/routes.ts
@@ -335,4 +335,4 @@ export {
335
335
  };
336
336
 
337
337
  //# debugId=7833782DA41E97E464756E2164756E21
338
- //# sourceMappingURL=index-fm6gqenc.js.map
338
+ //# sourceMappingURL=index-a3q5ewrj.js.map
@@ -14,7 +14,7 @@ import {
14
14
  kv,
15
15
  success,
16
16
  warn
17
- } from "./index-xmeskdnb.js";
17
+ } from "./index-t0x810hm.js";
18
18
  import {
19
19
  __require,
20
20
  __toESM
@@ -129,6 +129,56 @@ function createRoutes(deps) {
129
129
  body: t.Object({
130
130
  packageName: t.String()
131
131
  })
132
+ }).post("/update", async ({ body, set }) => {
133
+ if (!body.packageName || typeof body.packageName !== "string") {
134
+ set.status = 400;
135
+ return { error: "Missing required field: packageName" };
136
+ }
137
+ try {
138
+ const entry = await pluginManager.update(body.packageName);
139
+ return {
140
+ success: true,
141
+ message: `Plugin ${body.packageName} updated to v${entry.version}`,
142
+ version: entry.version
143
+ };
144
+ } catch (err) {
145
+ set.status = 500;
146
+ return { error: "Failed to update plugin", details: String(err) };
147
+ }
148
+ }, {
149
+ body: t.Object({
150
+ packageName: t.String()
151
+ })
152
+ }).post("/update-all", async ({ set }) => {
153
+ try {
154
+ const results = await pluginManager.updateAll();
155
+ return {
156
+ success: true,
157
+ results,
158
+ message: `Updated ${results.filter((r) => r.success).length}/${results.length} plugin(s)`
159
+ };
160
+ } catch (err) {
161
+ set.status = 500;
162
+ return {
163
+ error: "Failed to update all plugins",
164
+ details: String(err)
165
+ };
166
+ }
167
+ }).post("/remove-all", async ({ set }) => {
168
+ try {
169
+ const results = await pluginManager.removeAll();
170
+ return {
171
+ success: true,
172
+ results,
173
+ message: `Removed ${results.filter((r) => r.success).length}/${results.length} plugin(s)`
174
+ };
175
+ } catch (err) {
176
+ set.status = 500;
177
+ return {
178
+ error: "Failed to remove all plugins",
179
+ details: String(err)
180
+ };
181
+ }
132
182
  }).post("/reload", async ({ set }) => {
133
183
  try {
134
184
  await pluginManager.dispatchServerStop();
@@ -152,7 +202,7 @@ import { join, resolve } from "path";
152
202
  var DEFAULT_AGENT_URL = "http://localhost:3005";
153
203
  function register(program) {
154
204
  const cmd = program.command("plugin").description("Manage plugins");
155
- cmd.command("list").description("List installed plugins").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
205
+ cmd.command("list").description("List installed plugins").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
156
206
  try {
157
207
  const url = getAgentUrl(options);
158
208
  let plugins;
@@ -162,7 +212,7 @@ function register(program) {
162
212
  } catch {
163
213
  warn("Agent not reachable. Attempting local plugin registry...");
164
214
  try {
165
- const { PluginManager } = await import("./plugin-system-a2hmq7cg.js");
215
+ const { PluginManager } = await import("./plugin-system-75q3s1rf.js");
166
216
  const pm = new PluginManager;
167
217
  plugins = pm.getPluginDetails() || [];
168
218
  } catch {
@@ -185,12 +235,12 @@ function register(program) {
185
235
  fail(err.message);
186
236
  }
187
237
  });
188
- cmd.command("install").description("Install a plugin").argument("<package>", "NPM package name to install").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (packageName, options) => {
238
+ cmd.command("install").description("Install a plugin").argument("<package>", "NPM package name to install").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (packageName, options) => {
189
239
  try {
190
240
  const url = getAgentUrl(options);
191
241
  try {
192
242
  const result = await apiPost(url, "/api/plugins/install", {
193
- package: packageName
243
+ packageName
194
244
  });
195
245
  success(`Plugin "${packageName}" installed.`);
196
246
  if (result?.version)
@@ -198,7 +248,7 @@ function register(program) {
198
248
  } catch {
199
249
  warn("Agent not reachable. Attempting local install...");
200
250
  try {
201
- const { PluginManager } = await import("./plugin-system-a2hmq7cg.js");
251
+ const { PluginManager } = await import("./plugin-system-75q3s1rf.js");
202
252
  const pm = new PluginManager;
203
253
  await pm.install(packageName);
204
254
  success(`Plugin "${packageName}" installed locally.`);
@@ -210,18 +260,18 @@ function register(program) {
210
260
  fail(err.message);
211
261
  }
212
262
  });
213
- cmd.command("remove").description("Remove a plugin").argument("<package>", "NPM package name to remove").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (packageName, options) => {
263
+ cmd.command("remove").description("Remove a plugin").argument("<package>", "NPM package name to remove").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (packageName, options) => {
214
264
  try {
215
265
  const url = getAgentUrl(options);
216
266
  try {
217
267
  await apiPost(url, "/api/plugins/remove", {
218
- package: packageName
268
+ packageName
219
269
  });
220
270
  success(`Plugin "${packageName}" removed.`);
221
271
  } catch {
222
272
  warn("Agent not reachable. Attempting local removal...");
223
273
  try {
224
- const { PluginManager } = await import("./plugin-system-a2hmq7cg.js");
274
+ const { PluginManager } = await import("./plugin-system-75q3s1rf.js");
225
275
  const pm = new PluginManager;
226
276
  await pm.remove(packageName);
227
277
  success(`Plugin "${packageName}" removed locally.`);
@@ -233,7 +283,122 @@ function register(program) {
233
283
  fail(err.message);
234
284
  }
235
285
  });
236
- cmd.command("reload").description("Reload all plugins").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
286
+ cmd.command("update").description("Update a plugin (or all plugins with --all)").argument("[package]", "NPM package name to update").option("--all", "Update all installed plugins", false).option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (packageName, options) => {
287
+ try {
288
+ const url = getAgentUrl(options);
289
+ if (options.all) {
290
+ info("Updating all plugins...");
291
+ try {
292
+ const result = await apiPost(url, "/api/plugins/update-all", {});
293
+ const results = result?.results || [];
294
+ for (const r of results) {
295
+ if (r.success) {
296
+ success(`Updated ${r.packageName}${r.version ? ` to v${r.version}` : ""}`);
297
+ } else {
298
+ warn(`Failed to update ${r.packageName}: ${r.error}`);
299
+ }
300
+ }
301
+ success(result?.message || "Done.");
302
+ } catch {
303
+ warn("Agent not reachable. Attempting local update...");
304
+ try {
305
+ const { PluginManager } = await import("./plugin-system-75q3s1rf.js");
306
+ const pm = new PluginManager;
307
+ const results = await pm.updateAll();
308
+ for (const r of results) {
309
+ if (r.success) {
310
+ success(`Updated ${r.packageName}${r.version ? ` to v${r.version}` : ""}`);
311
+ } else {
312
+ warn(`Failed to update ${r.packageName}: ${r.error}`);
313
+ }
314
+ }
315
+ } catch (localErr) {
316
+ fail(`Could not update plugins: ${localErr.message}`);
317
+ }
318
+ }
319
+ } else if (packageName) {
320
+ info(`Updating ${packageName}...`);
321
+ try {
322
+ const result = await apiPost(url, "/api/plugins/update", {
323
+ packageName
324
+ });
325
+ success(result?.message || `Plugin "${packageName}" updated.`);
326
+ } catch {
327
+ warn("Agent not reachable. Attempting local update...");
328
+ try {
329
+ const { PluginManager } = await import("./plugin-system-75q3s1rf.js");
330
+ const pm = new PluginManager;
331
+ const entry = await pm.update(packageName);
332
+ success(`Plugin "${packageName}" updated to v${entry.version}.`);
333
+ } catch (localErr) {
334
+ fail(`Could not update plugin: ${localErr.message}`);
335
+ }
336
+ }
337
+ } else {
338
+ fail("Provide a package name to update, or use --all to update all plugins.");
339
+ }
340
+ } catch (err) {
341
+ fail(err.message);
342
+ }
343
+ });
344
+ cmd.command("uninstall").description("Uninstall a plugin (or all plugins with --all)").argument("[package]", "NPM package name to uninstall").option("--all", "Uninstall all external plugins", false).option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (packageName, options) => {
345
+ try {
346
+ const url = getAgentUrl(options);
347
+ if (options.all) {
348
+ info("Uninstalling all plugins...");
349
+ try {
350
+ const result = await apiPost(url, "/api/plugins/remove-all", {});
351
+ const results = result?.results || [];
352
+ for (const r of results) {
353
+ if (r.success) {
354
+ success(`Removed ${r.packageName}`);
355
+ } else {
356
+ warn(`Failed to remove ${r.packageName}: ${r.error}`);
357
+ }
358
+ }
359
+ success(result?.message || "Done.");
360
+ } catch {
361
+ warn("Agent not reachable. Attempting local removal...");
362
+ try {
363
+ const { PluginManager } = await import("./plugin-system-75q3s1rf.js");
364
+ const pm = new PluginManager;
365
+ const results = await pm.removeAll();
366
+ for (const r of results) {
367
+ if (r.success) {
368
+ success(`Removed ${r.packageName}`);
369
+ } else {
370
+ warn(`Failed to remove ${r.packageName}: ${r.error}`);
371
+ }
372
+ }
373
+ } catch (localErr) {
374
+ fail(`Could not uninstall plugins: ${localErr.message}`);
375
+ }
376
+ }
377
+ } else if (packageName) {
378
+ try {
379
+ await apiPost(url, "/api/plugins/remove", {
380
+ packageName
381
+ });
382
+ success(`Plugin "${packageName}" uninstalled.`);
383
+ } catch {
384
+ warn("Agent not reachable. Attempting local removal...");
385
+ try {
386
+ const { PluginManager } = await import("./plugin-system-75q3s1rf.js");
387
+ const pm = new PluginManager;
388
+ await pm.remove(packageName);
389
+ success(`Plugin "${packageName}" uninstalled locally.`);
390
+ } catch (localErr) {
391
+ fail(`Could not uninstall plugin: ${localErr.message}`);
392
+ }
393
+ }
394
+ } else {
395
+ fail("Provide a package name to uninstall, or use --all to uninstall all plugins.");
396
+ }
397
+ } catch (err) {
398
+ fail(err.message);
399
+ }
400
+ });
401
+ cmd.command("reload").description("Reload all plugins").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
237
402
  try {
238
403
  const url = getAgentUrl(options);
239
404
  await apiPost(url, "/api/plugins/reload", {});
@@ -242,7 +407,7 @@ function register(program) {
242
407
  fail(err.message);
243
408
  }
244
409
  });
245
- cmd.command("available").description("Show available plugins").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
410
+ cmd.command("available").description("Show available plugins").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).option("--agent <name>", "Target agent instance by name").option("--profile <name>", "Alias for --agent").action(async (options) => {
246
411
  try {
247
412
  const url = getAgentUrl(options);
248
413
  const availData = await apiGet(url, "/api/plugins/available");
@@ -597,5 +762,5 @@ export {
597
762
  vibePlugin
598
763
  };
599
764
 
600
- //# debugId=77470ADF30C64CDD64756E2164756E21
601
- //# sourceMappingURL=index-b6fsz3ht.js.map
765
+ //# debugId=622EB666D741386464756E2164756E21
766
+ //# sourceMappingURL=index-cndcb55v.js.map