@burdenoff/vibe-agent 2.1.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-sm6n9xst.js +1165 -0
- package/dist/app-sm6n9xst.js.map +19 -0
- package/dist/cli.js +167 -2050
- package/dist/cli.js.map +8 -30
- package/dist/index-05qfwz8r.js +122 -0
- package/dist/index-05qfwz8r.js.map +10 -0
- package/dist/index-30p492yv.js +294 -0
- package/dist/index-30p492yv.js.map +13 -0
- package/dist/index-3rjnbp97.js +268 -0
- package/dist/index-3rjnbp97.js.map +13 -0
- package/dist/index-6vry08rz.js +285 -0
- package/dist/index-6vry08rz.js.map +13 -0
- package/dist/index-88ym10cs.js +194 -0
- package/dist/index-88ym10cs.js.map +10 -0
- package/dist/index-a9g7hbj9.js +229 -0
- package/dist/index-a9g7hbj9.js.map +13 -0
- package/dist/index-atjhkm74.js +149 -0
- package/dist/index-atjhkm74.js.map +10 -0
- package/dist/index-b1eq3qvs.js +515 -0
- package/dist/index-b1eq3qvs.js.map +19 -0
- package/dist/index-c7zy3n33.js +167 -0
- package/dist/index-c7zy3n33.js.map +13 -0
- package/dist/index-fm6gqenc.js +338 -0
- package/dist/index-fm6gqenc.js.map +13 -0
- package/dist/index-hefqxwht.js +270 -0
- package/dist/index-hefqxwht.js.map +13 -0
- package/dist/index-k9hb0b93.js +280 -0
- package/dist/index-k9hb0b93.js.map +13 -0
- package/dist/index-npmvh1x9.js +385 -0
- package/dist/index-npmvh1x9.js.map +13 -0
- package/dist/index-rdm6e3rr.js +587 -0
- package/dist/index-rdm6e3rr.js.map +13 -0
- package/dist/index-s7ff1fj1.js +415 -0
- package/dist/index-s7ff1fj1.js.map +11 -0
- package/dist/index-t4qgjy5w.js +287 -0
- package/dist/index-t4qgjy5w.js.map +13 -0
- package/dist/index-wmvkjcjj.js +301 -0
- package/dist/index-wmvkjcjj.js.map +13 -0
- package/dist/{app-31chs2a1.js → index-wr0mkm57.js} +8 -3201
- package/dist/{app-31chs2a1.js.map → index-wr0mkm57.js.map} +4 -25
- package/dist/index-xmeskdnb.js +292 -0
- package/dist/index-xmeskdnb.js.map +11 -0
- package/dist/index.js +9 -6
- package/dist/index.js.map +2 -2
- package/dist/{package-hb6db316.js → package-04nkt49b.js} +5 -3
- package/dist/{package-hb6db316.js.map → package-04nkt49b.js.map} +1 -1
- package/dist/plugin-system-7r9mb1tb.js +479 -0
- package/dist/plugin-system-7r9mb1tb.js.map +10 -0
- package/package.json +3 -1
- package/dist/index-t06ktmx9.js +0 -216
- package/dist/index-t06ktmx9.js.map +0 -11
- package/dist/plugin-system-bg1pzjj9.js +0 -450
- package/dist/plugin-system-bg1pzjj9.js.map +0 -11
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
Elysia,
|
|
4
|
+
t
|
|
5
|
+
} from "./index-wr0mkm57.js";
|
|
6
|
+
import {
|
|
7
|
+
apiGet,
|
|
8
|
+
apiPost,
|
|
9
|
+
apiPut,
|
|
10
|
+
fail,
|
|
11
|
+
formatStatus,
|
|
12
|
+
formatTable,
|
|
13
|
+
getAgentUrl,
|
|
14
|
+
header,
|
|
15
|
+
info,
|
|
16
|
+
shortId,
|
|
17
|
+
success,
|
|
18
|
+
timeAgo
|
|
19
|
+
} from "./index-xmeskdnb.js";
|
|
20
|
+
import"./index-g8dczzvv.js";
|
|
21
|
+
|
|
22
|
+
// src/plugins/task/routes.ts
|
|
23
|
+
import { promises as fs } from "fs";
|
|
24
|
+
import path from "path";
|
|
25
|
+
import os from "os";
|
|
26
|
+
async function executeCommand(payload) {
|
|
27
|
+
const proc = Bun.spawn(["sh", "-c", payload.command], {
|
|
28
|
+
cwd: payload.cwd,
|
|
29
|
+
env: { ...process.env, ...payload.env },
|
|
30
|
+
stdout: "pipe",
|
|
31
|
+
stderr: "pipe"
|
|
32
|
+
});
|
|
33
|
+
const [stdout, stderr] = await Promise.all([
|
|
34
|
+
new Response(proc.stdout).text(),
|
|
35
|
+
new Response(proc.stderr).text()
|
|
36
|
+
]);
|
|
37
|
+
await proc.exited;
|
|
38
|
+
return { stdout, stderr };
|
|
39
|
+
}
|
|
40
|
+
async function executeScript(payload) {
|
|
41
|
+
const interpreter = payload.interpreter || "bash";
|
|
42
|
+
const tmpDir = os.tmpdir();
|
|
43
|
+
const scriptFile = path.join(tmpDir, `vibecontrols-script-${Date.now()}.sh`);
|
|
44
|
+
await fs.writeFile(scriptFile, payload.script, { mode: 493 });
|
|
45
|
+
try {
|
|
46
|
+
const proc = Bun.spawn([interpreter, scriptFile], {
|
|
47
|
+
cwd: payload.cwd,
|
|
48
|
+
stdout: "pipe",
|
|
49
|
+
stderr: "pipe"
|
|
50
|
+
});
|
|
51
|
+
const [stdout, stderr] = await Promise.all([
|
|
52
|
+
new Response(proc.stdout).text(),
|
|
53
|
+
new Response(proc.stderr).text()
|
|
54
|
+
]);
|
|
55
|
+
await proc.exited;
|
|
56
|
+
return { stdout, stderr };
|
|
57
|
+
} finally {
|
|
58
|
+
await fs.unlink(scriptFile).catch(() => {});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function executeFileOperation(payload) {
|
|
62
|
+
switch (payload.operation) {
|
|
63
|
+
case "read": {
|
|
64
|
+
const data = await fs.readFile(payload.path, "utf-8");
|
|
65
|
+
return { content: data };
|
|
66
|
+
}
|
|
67
|
+
case "write": {
|
|
68
|
+
if (!payload.content)
|
|
69
|
+
throw new Error("Content is required for write operation");
|
|
70
|
+
await fs.writeFile(payload.path, payload.content);
|
|
71
|
+
return { success: true };
|
|
72
|
+
}
|
|
73
|
+
case "delete": {
|
|
74
|
+
await fs.unlink(payload.path);
|
|
75
|
+
return { success: true };
|
|
76
|
+
}
|
|
77
|
+
case "exists": {
|
|
78
|
+
try {
|
|
79
|
+
await fs.access(payload.path);
|
|
80
|
+
return { exists: true };
|
|
81
|
+
} catch {
|
|
82
|
+
return { exists: false };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
case "list": {
|
|
86
|
+
const files = await fs.readdir(payload.path);
|
|
87
|
+
return { files };
|
|
88
|
+
}
|
|
89
|
+
default:
|
|
90
|
+
throw new Error(`Unknown file operation: ${payload.operation}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function processTask(db, task) {
|
|
94
|
+
try {
|
|
95
|
+
db.updateTask(task.id, { status: "running" });
|
|
96
|
+
const payload = JSON.parse(task.payload);
|
|
97
|
+
let result;
|
|
98
|
+
switch (task.type) {
|
|
99
|
+
case "command":
|
|
100
|
+
result = await executeCommand(payload);
|
|
101
|
+
break;
|
|
102
|
+
case "script":
|
|
103
|
+
result = await executeScript(payload);
|
|
104
|
+
break;
|
|
105
|
+
case "file_operation":
|
|
106
|
+
result = await executeFileOperation(payload);
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
throw new Error(`Unknown task type: ${task.type}`);
|
|
110
|
+
}
|
|
111
|
+
db.updateTask(task.id, {
|
|
112
|
+
status: "completed",
|
|
113
|
+
result: JSON.stringify(result)
|
|
114
|
+
});
|
|
115
|
+
} catch (err) {
|
|
116
|
+
db.updateTask(task.id, {
|
|
117
|
+
status: "failed",
|
|
118
|
+
error: err instanceof Error ? err.message : String(err)
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function createRoutes(deps) {
|
|
123
|
+
const { db } = deps;
|
|
124
|
+
return new Elysia().get("/", ({ query }) => {
|
|
125
|
+
const status = query.status;
|
|
126
|
+
if (status === "pending") {
|
|
127
|
+
return { tasks: db.getPendingTasks() };
|
|
128
|
+
}
|
|
129
|
+
return { tasks: db.getAllTasks() };
|
|
130
|
+
}).get("/:id", ({ params, set }) => {
|
|
131
|
+
const task = db.getTask(params.id);
|
|
132
|
+
if (!task) {
|
|
133
|
+
set.status = 404;
|
|
134
|
+
return { error: "Task not found" };
|
|
135
|
+
}
|
|
136
|
+
return { task };
|
|
137
|
+
}).post("/", async ({ body, set }) => {
|
|
138
|
+
try {
|
|
139
|
+
const task = db.createTask({
|
|
140
|
+
id: globalThis.crypto.randomUUID(),
|
|
141
|
+
type: body.type,
|
|
142
|
+
status: "pending",
|
|
143
|
+
payload: JSON.stringify(body.payload)
|
|
144
|
+
});
|
|
145
|
+
processTask(db, task);
|
|
146
|
+
return { task };
|
|
147
|
+
} catch (err) {
|
|
148
|
+
set.status = 500;
|
|
149
|
+
return { error: "Failed to create task", details: String(err) };
|
|
150
|
+
}
|
|
151
|
+
}, {
|
|
152
|
+
body: t.Object({
|
|
153
|
+
type: t.Union([
|
|
154
|
+
t.Literal("command"),
|
|
155
|
+
t.Literal("script"),
|
|
156
|
+
t.Literal("file_operation")
|
|
157
|
+
]),
|
|
158
|
+
payload: t.Object({
|
|
159
|
+
command: t.Optional(t.String()),
|
|
160
|
+
cwd: t.Optional(t.String()),
|
|
161
|
+
env: t.Optional(t.Record(t.String(), t.String())),
|
|
162
|
+
script: t.Optional(t.String()),
|
|
163
|
+
interpreter: t.Optional(t.String()),
|
|
164
|
+
operation: t.Optional(t.Union([
|
|
165
|
+
t.Literal("read"),
|
|
166
|
+
t.Literal("write"),
|
|
167
|
+
t.Literal("delete"),
|
|
168
|
+
t.Literal("exists"),
|
|
169
|
+
t.Literal("list")
|
|
170
|
+
])),
|
|
171
|
+
path: t.Optional(t.String()),
|
|
172
|
+
content: t.Optional(t.String())
|
|
173
|
+
})
|
|
174
|
+
})
|
|
175
|
+
}).post("/:id/cancel", ({ params, set }) => {
|
|
176
|
+
const task = db.getTask(params.id);
|
|
177
|
+
if (!task) {
|
|
178
|
+
set.status = 404;
|
|
179
|
+
return { error: "Task not found" };
|
|
180
|
+
}
|
|
181
|
+
if (task.status !== "pending") {
|
|
182
|
+
set.status = 400;
|
|
183
|
+
return { error: "Only pending tasks can be cancelled" };
|
|
184
|
+
}
|
|
185
|
+
db.updateTask(params.id, {
|
|
186
|
+
status: "failed",
|
|
187
|
+
error: "Task cancelled by user"
|
|
188
|
+
});
|
|
189
|
+
return { success: true };
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// src/cli/commands/task.cmd.ts
|
|
194
|
+
var DEFAULT_AGENT_URL = "http://localhost:3005";
|
|
195
|
+
function register(program) {
|
|
196
|
+
const cmd = program.command("task").description("Manage background tasks");
|
|
197
|
+
cmd.command("list").description("List tasks").option("--status <status>", "Filter by status").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
198
|
+
try {
|
|
199
|
+
const url = getAgentUrl(options);
|
|
200
|
+
const query = options.status ? `/api/tasks/?status=${encodeURIComponent(options.status)}` : "/api/tasks/";
|
|
201
|
+
const data = await apiGet(url, query);
|
|
202
|
+
const tasks = data.tasks || [];
|
|
203
|
+
if (!tasks || tasks.length === 0) {
|
|
204
|
+
info("No tasks found.");
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
header("Tasks");
|
|
208
|
+
formatTable(tasks.map((t2) => ({
|
|
209
|
+
ID: shortId(t2.id),
|
|
210
|
+
Type: t2.type || "-",
|
|
211
|
+
Status: formatStatus(t2.status),
|
|
212
|
+
Created: t2.createdAt ? timeAgo(t2.createdAt) : "-"
|
|
213
|
+
})));
|
|
214
|
+
} catch (err) {
|
|
215
|
+
fail(err.message);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
cmd.command("run").description("Run a new task").requiredOption("-c, --command <cmd>", "Command to run").option("--cwd <dir>", "Working directory").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
219
|
+
try {
|
|
220
|
+
const url = getAgentUrl(options);
|
|
221
|
+
const payload = { command: options.command };
|
|
222
|
+
if (options.cwd)
|
|
223
|
+
payload.cwd = options.cwd;
|
|
224
|
+
const body = {
|
|
225
|
+
type: "command",
|
|
226
|
+
payload: JSON.stringify(payload)
|
|
227
|
+
};
|
|
228
|
+
const result = await apiPost(url, "/api/tasks/", body);
|
|
229
|
+
success(`Task created: ${shortId(result?.id || result?.taskId)}`);
|
|
230
|
+
} catch (err) {
|
|
231
|
+
fail(err.message);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
cmd.command("cancel").description("Cancel a running task").requiredOption("-i, --id <id>", "Task ID").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
235
|
+
try {
|
|
236
|
+
const url = getAgentUrl(options);
|
|
237
|
+
await apiPut(url, `/api/tasks/${options.id}/cancel`, {});
|
|
238
|
+
success(`Task ${shortId(options.id)} cancelled.`);
|
|
239
|
+
} catch (err) {
|
|
240
|
+
fail(err.message);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// src/plugins/task/commands.ts
|
|
246
|
+
function registerCommands(program, _hostServices) {
|
|
247
|
+
register(program);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// src/plugins/task/index.ts
|
|
251
|
+
var vibePlugin = {
|
|
252
|
+
name: "task",
|
|
253
|
+
version: "2.2.0",
|
|
254
|
+
description: "Background task execution \u2014 commands, scripts, file operations",
|
|
255
|
+
tags: ["backend", "cli"],
|
|
256
|
+
cliCommand: "task",
|
|
257
|
+
apiPrefix: "/api/tasks",
|
|
258
|
+
createRoutes: (deps) => createRoutes(deps),
|
|
259
|
+
onCliSetup: async (program, hostServices) => {
|
|
260
|
+
registerCommands(program, hostServices);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
export {
|
|
264
|
+
vibePlugin
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
//# debugId=BC2EA895432C9ECA64756E2164756E21
|
|
268
|
+
//# sourceMappingURL=index-3rjnbp97.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/plugins/task/routes.ts", "../src/cli/commands/task.cmd.ts", "../src/plugins/task/commands.ts", "../src/plugins/task/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Task Plugin — Routes\n *\n * Background task management — create, run, poll, cancel.\n *\n * Endpoints (mounted by plugin system at /api/tasks):\n * GET / — List all tasks (optionally filter by status)\n * GET /:id — Get task by ID\n * POST / — Create and execute a new task\n * POST /:id/cancel — Cancel a pending task\n */\n\nimport { Elysia, t } from \"elysia\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nimport type { AgentDatabase } from \"../../db/database.js\";\nimport type { Task, PluginRouteDeps } from \"../../core/types.js\";\n\n// ── Task Execution ──────────────────────────────────────────────────────\n\nasync function executeCommand(payload: {\n command: string;\n cwd?: string;\n env?: Record<string, string>;\n}): Promise<{ stdout: string; stderr: string }> {\n const proc = Bun.spawn([\"sh\", \"-c\", payload.command], {\n cwd: payload.cwd,\n env: { ...process.env, ...payload.env },\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const [stdout, stderr] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n\n await proc.exited;\n return { stdout, stderr };\n}\n\nasync function executeScript(payload: {\n script: string;\n interpreter?: string;\n cwd?: string;\n}): Promise<{ stdout: string; stderr: string }> {\n const interpreter = payload.interpreter || \"bash\";\n const tmpDir = os.tmpdir();\n const scriptFile = path.join(tmpDir, `vibecontrols-script-${Date.now()}.sh`);\n\n await fs.writeFile(scriptFile, payload.script, { mode: 0o755 });\n\n try {\n const proc = Bun.spawn([interpreter, scriptFile], {\n cwd: payload.cwd,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const [stdout, stderr] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n\n await proc.exited;\n return { stdout, stderr };\n } finally {\n await fs.unlink(scriptFile).catch(() => {});\n }\n}\n\nasync function executeFileOperation(payload: {\n operation: \"read\" | \"write\" | \"delete\" | \"exists\" | \"list\";\n path: string;\n content?: string;\n}): Promise<Record<string, unknown>> {\n switch (payload.operation) {\n case \"read\": {\n const data = await fs.readFile(payload.path, \"utf-8\");\n return { content: data };\n }\n case \"write\": {\n if (!payload.content)\n throw new Error(\"Content is required for write operation\");\n await fs.writeFile(payload.path, payload.content);\n return { success: true };\n }\n case \"delete\": {\n await fs.unlink(payload.path);\n return { success: true };\n }\n case \"exists\": {\n try {\n await fs.access(payload.path);\n return { exists: true };\n } catch {\n return { exists: false };\n }\n }\n case \"list\": {\n const files = await fs.readdir(payload.path);\n return { files };\n }\n default:\n throw new Error(`Unknown file operation: ${payload.operation}`);\n }\n}\n\nasync function processTask(db: AgentDatabase, task: Task): Promise<void> {\n try {\n db.updateTask(task.id, { status: \"running\" });\n\n const payload = JSON.parse(task.payload);\n let result: Record<string, unknown>;\n\n switch (task.type) {\n case \"command\":\n result = await executeCommand(payload);\n break;\n case \"script\":\n result = await executeScript(payload);\n break;\n case \"file_operation\":\n result = await executeFileOperation(payload);\n break;\n default:\n throw new Error(`Unknown task type: ${task.type}`);\n }\n\n db.updateTask(task.id, {\n status: \"completed\",\n result: JSON.stringify(result),\n });\n } catch (err) {\n db.updateTask(task.id, {\n status: \"failed\",\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n// ── Routes ──────────────────────────────────────────────────────────────\n\nexport function createRoutes(deps: PluginRouteDeps) {\n const { db } = deps;\n\n return (\n new Elysia()\n // List tasks\n .get(\"/\", ({ query }) => {\n const status = (query as Record<string, string>).status;\n if (status === \"pending\") {\n return { tasks: db.getPendingTasks() };\n }\n return { tasks: db.getAllTasks() };\n })\n\n // Get task by ID\n .get(\"/:id\", ({ params, set }) => {\n const task = db.getTask(params.id);\n if (!task) {\n set.status = 404;\n return { error: \"Task not found\" };\n }\n return { task };\n })\n\n // Create new task\n .post(\n \"/\",\n async ({ body, set }) => {\n try {\n const task = db.createTask({\n id: globalThis.crypto.randomUUID(),\n type: body.type,\n status: \"pending\",\n payload: JSON.stringify(body.payload),\n });\n\n // Process task asynchronously (fire-and-forget)\n processTask(db, task);\n\n return { task };\n } catch (err) {\n set.status = 500;\n return { error: \"Failed to create task\", details: String(err) };\n }\n },\n {\n body: t.Object({\n type: t.Union([\n t.Literal(\"command\"),\n t.Literal(\"script\"),\n t.Literal(\"file_operation\"),\n ]),\n payload: t.Object({\n command: t.Optional(t.String()),\n cwd: t.Optional(t.String()),\n env: t.Optional(t.Record(t.String(), t.String())),\n script: t.Optional(t.String()),\n interpreter: t.Optional(t.String()),\n operation: t.Optional(\n t.Union([\n t.Literal(\"read\"),\n t.Literal(\"write\"),\n t.Literal(\"delete\"),\n t.Literal(\"exists\"),\n t.Literal(\"list\"),\n ]),\n ),\n path: t.Optional(t.String()),\n content: t.Optional(t.String()),\n }),\n }),\n },\n )\n\n // Cancel task\n .post(\"/:id/cancel\", ({ params, set }) => {\n const task = db.getTask(params.id);\n if (!task) {\n set.status = 404;\n return { error: \"Task not found\" };\n }\n\n if (task.status !== \"pending\") {\n set.status = 400;\n return { error: \"Only pending tasks can be cancelled\" };\n }\n\n db.updateTask(params.id, {\n status: \"failed\",\n error: \"Task cancelled by user\",\n });\n\n return { success: true };\n })\n );\n}\n",
|
|
6
|
+
"import { Command } from \"commander\";\nimport {\n getAgentUrl,\n apiGet,\n apiPost,\n apiPut,\n fail,\n success,\n info,\n header,\n formatTable,\n formatStatus,\n timeAgo,\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.command(\"task\").description(\"Manage background tasks\");\n\n // task list\n cmd\n .command(\"list\")\n .description(\"List tasks\")\n .option(\"--status <status>\", \"Filter by status\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const query = options.status\n ? `/api/tasks/?status=${encodeURIComponent(options.status)}`\n : \"/api/tasks/\";\n const data = await apiGet<{ tasks: any[] }>(url, query);\n const tasks = data.tasks || [];\n if (!tasks || tasks.length === 0) {\n info(\"No tasks found.\");\n return;\n }\n header(\"Tasks\");\n formatTable(\n tasks.map((t: any) => ({\n ID: shortId(t.id),\n Type: t.type || \"-\",\n Status: formatStatus(t.status),\n Created: t.createdAt ? timeAgo(t.createdAt) : \"-\",\n })),\n );\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // task run\n cmd\n .command(\"run\")\n .description(\"Run a new task\")\n .requiredOption(\"-c, --command <cmd>\", \"Command to run\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const payload: Record<string, any> = { command: options.command };\n if (options.cwd) payload.cwd = options.cwd;\n const body = {\n type: \"command\",\n payload: JSON.stringify(payload),\n };\n const result = await apiPost<any>(url, \"/api/tasks/\", body);\n success(`Task created: ${shortId(result?.id || result?.taskId)}`);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // task cancel\n cmd\n .command(\"cancel\")\n .description(\"Cancel a running task\")\n .requiredOption(\"-i, --id <id>\", \"Task ID\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n await apiPut<any>(url, `/api/tasks/${options.id}/cancel`, {});\n success(`Task ${shortId(options.id)} cancelled.`);\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 registerTask } from \"../../cli/commands/task.cmd.js\";\n\nexport function registerCommands(\n program: Command,\n _hostServices: HostServices,\n): void {\n registerTask(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: \"task\",\n version: \"2.2.0\",\n description: \"Background task execution — commands, scripts, file operations\",\n tags: [\"backend\", \"cli\"],\n cliCommand: \"task\",\n apiPrefix: \"/api/tasks\",\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": "BC2EA895432C9ECA64756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
Elysia,
|
|
4
|
+
t
|
|
5
|
+
} from "./index-wr0mkm57.js";
|
|
6
|
+
import {
|
|
7
|
+
apiDelete,
|
|
8
|
+
apiGet,
|
|
9
|
+
apiPost,
|
|
10
|
+
apiPut,
|
|
11
|
+
fail,
|
|
12
|
+
formatTable,
|
|
13
|
+
getAgentUrl,
|
|
14
|
+
header,
|
|
15
|
+
info,
|
|
16
|
+
shortId,
|
|
17
|
+
success
|
|
18
|
+
} from "./index-xmeskdnb.js";
|
|
19
|
+
import"./index-g8dczzvv.js";
|
|
20
|
+
|
|
21
|
+
// src/plugins/bookmark/routes.ts
|
|
22
|
+
function createRoutes(deps) {
|
|
23
|
+
const { db, serviceRegistry } = deps;
|
|
24
|
+
return new Elysia().get("/", ({ query }) => {
|
|
25
|
+
const q = query;
|
|
26
|
+
const bookmarks = q.projectId !== undefined ? db.getBookmarkedCommandsByProject(q.projectId) : db.getAllBookmarkedCommands();
|
|
27
|
+
return { bookmarks };
|
|
28
|
+
}).get("/global", () => {
|
|
29
|
+
const bookmarks = db.getBookmarkedCommandsByProject(null);
|
|
30
|
+
return { bookmarks };
|
|
31
|
+
}).get("/project/:projectId", ({ params }) => {
|
|
32
|
+
const bookmarks = db.getBookmarkedCommandsByProject(params.projectId);
|
|
33
|
+
return { bookmarks };
|
|
34
|
+
}).get("/category/:category", ({ params }) => {
|
|
35
|
+
const bookmarks = db.getBookmarkedCommandsByCategory(params.category);
|
|
36
|
+
return { bookmarks, category: params.category };
|
|
37
|
+
}).get("/:id", ({ params, set }) => {
|
|
38
|
+
const bookmark = db.getBookmarkedCommand(params.id);
|
|
39
|
+
if (!bookmark) {
|
|
40
|
+
set.status = 404;
|
|
41
|
+
return { error: "Bookmarked command not found" };
|
|
42
|
+
}
|
|
43
|
+
return { bookmark };
|
|
44
|
+
}).post("/", ({ body, set }) => {
|
|
45
|
+
try {
|
|
46
|
+
const bookmark = db.createBookmarkedCommand({
|
|
47
|
+
id: globalThis.crypto.randomUUID(),
|
|
48
|
+
projectId: body.projectId,
|
|
49
|
+
command: body.command,
|
|
50
|
+
description: body.description,
|
|
51
|
+
category: body.category
|
|
52
|
+
});
|
|
53
|
+
return { bookmark };
|
|
54
|
+
} catch (err) {
|
|
55
|
+
set.status = 500;
|
|
56
|
+
return {
|
|
57
|
+
error: "Failed to create bookmarked command",
|
|
58
|
+
details: String(err)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}, {
|
|
62
|
+
body: t.Object({
|
|
63
|
+
projectId: t.Optional(t.String()),
|
|
64
|
+
command: t.String(),
|
|
65
|
+
description: t.Optional(t.String()),
|
|
66
|
+
category: t.Optional(t.String())
|
|
67
|
+
})
|
|
68
|
+
}).put("/:id", ({ params, body, set }) => {
|
|
69
|
+
const bookmark = db.getBookmarkedCommand(params.id);
|
|
70
|
+
if (!bookmark) {
|
|
71
|
+
set.status = 404;
|
|
72
|
+
return { error: "Bookmarked command not found" };
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const updates = {};
|
|
76
|
+
if (body.command !== undefined)
|
|
77
|
+
updates.command = body.command;
|
|
78
|
+
if (body.description !== undefined)
|
|
79
|
+
updates.description = body.description;
|
|
80
|
+
if (body.category !== undefined)
|
|
81
|
+
updates.category = body.category;
|
|
82
|
+
db.updateBookmarkedCommand(params.id, updates);
|
|
83
|
+
const updatedBookmark = db.getBookmarkedCommand(params.id);
|
|
84
|
+
return { bookmark: updatedBookmark };
|
|
85
|
+
} catch (err) {
|
|
86
|
+
set.status = 500;
|
|
87
|
+
return {
|
|
88
|
+
error: "Failed to update bookmarked command",
|
|
89
|
+
details: String(err)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}, {
|
|
93
|
+
body: t.Object({
|
|
94
|
+
command: t.Optional(t.String()),
|
|
95
|
+
description: t.Optional(t.String()),
|
|
96
|
+
category: t.Optional(t.String())
|
|
97
|
+
})
|
|
98
|
+
}).delete("/:id", ({ params, set }) => {
|
|
99
|
+
const bookmark = db.getBookmarkedCommand(params.id);
|
|
100
|
+
if (!bookmark) {
|
|
101
|
+
set.status = 404;
|
|
102
|
+
return { error: "Bookmarked command not found" };
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
db.deleteBookmarkedCommand(params.id);
|
|
106
|
+
return { success: true };
|
|
107
|
+
} catch (err) {
|
|
108
|
+
set.status = 500;
|
|
109
|
+
return {
|
|
110
|
+
error: "Failed to delete bookmarked command",
|
|
111
|
+
details: String(err)
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}).post("/:id/execute", async ({ params, body, set }) => {
|
|
115
|
+
const bookmark = db.getBookmarkedCommand(params.id);
|
|
116
|
+
if (!bookmark) {
|
|
117
|
+
set.status = 404;
|
|
118
|
+
return { error: "Bookmarked command not found" };
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
if (body.sessionId) {
|
|
122
|
+
const sessionProvider = serviceRegistry.getProvider("session");
|
|
123
|
+
if (!sessionProvider) {
|
|
124
|
+
set.status = 400;
|
|
125
|
+
return { error: "No session provider registered" };
|
|
126
|
+
}
|
|
127
|
+
const session = await sessionProvider.get(body.sessionId);
|
|
128
|
+
if (!session) {
|
|
129
|
+
set.status = 404;
|
|
130
|
+
return { error: "Session not found" };
|
|
131
|
+
}
|
|
132
|
+
await sessionProvider.sendCommand(body.sessionId, bookmark.command);
|
|
133
|
+
return {
|
|
134
|
+
success: true,
|
|
135
|
+
executedIn: "session",
|
|
136
|
+
sessionId: body.sessionId
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const task = db.createTask({
|
|
140
|
+
id: globalThis.crypto.randomUUID(),
|
|
141
|
+
type: "command",
|
|
142
|
+
status: "pending",
|
|
143
|
+
payload: JSON.stringify({
|
|
144
|
+
command: bookmark.command,
|
|
145
|
+
cwd: body.cwd || process.cwd()
|
|
146
|
+
})
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
success: true,
|
|
150
|
+
executedIn: "task",
|
|
151
|
+
taskId: task.id
|
|
152
|
+
};
|
|
153
|
+
} catch (err) {
|
|
154
|
+
set.status = 500;
|
|
155
|
+
return {
|
|
156
|
+
error: "Failed to execute bookmarked command",
|
|
157
|
+
details: String(err)
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}, {
|
|
161
|
+
body: t.Object({
|
|
162
|
+
sessionId: t.Optional(t.String()),
|
|
163
|
+
cwd: t.Optional(t.String())
|
|
164
|
+
})
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/cli/commands/bookmark.cmd.ts
|
|
169
|
+
var DEFAULT_AGENT_URL = "http://localhost:3005";
|
|
170
|
+
function register(program) {
|
|
171
|
+
const cmd = program.command("bookmark").description("Manage command bookmarks");
|
|
172
|
+
cmd.command("list").description("List bookmarks").option("--project <id>", "Filter by project ID").option("--category <cat>", "Filter by category").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
173
|
+
try {
|
|
174
|
+
const url = getAgentUrl(options);
|
|
175
|
+
const params = new URLSearchParams;
|
|
176
|
+
if (options.project)
|
|
177
|
+
params.set("project", options.project);
|
|
178
|
+
if (options.category)
|
|
179
|
+
params.set("category", options.category);
|
|
180
|
+
const query = params.toString();
|
|
181
|
+
const endpoint = query ? `/api/bookmarks?${query}` : "/api/bookmarks";
|
|
182
|
+
const data = await apiGet(url, endpoint);
|
|
183
|
+
const bookmarks = data.bookmarks || [];
|
|
184
|
+
if (!bookmarks || bookmarks.length === 0) {
|
|
185
|
+
info("No bookmarks found.");
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
header("Bookmarks");
|
|
189
|
+
formatTable(bookmarks.map((b) => ({
|
|
190
|
+
ID: shortId(b.id),
|
|
191
|
+
Command: b.command || "-",
|
|
192
|
+
Description: b.description || "-",
|
|
193
|
+
Category: b.category || "-",
|
|
194
|
+
Project: b.project || b.projectId || "-"
|
|
195
|
+
})));
|
|
196
|
+
} catch (err) {
|
|
197
|
+
fail(err.message);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
cmd.command("create").description("Create a new bookmark").requiredOption("-c, --command <cmd>", "Command to bookmark").option("--description <desc>", "Bookmark description").option("--category <cat>", "Category").option("--project <id>", "Project ID").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
201
|
+
try {
|
|
202
|
+
const url = getAgentUrl(options);
|
|
203
|
+
const body = { command: options.command };
|
|
204
|
+
if (options.description)
|
|
205
|
+
body.description = options.description;
|
|
206
|
+
if (options.category)
|
|
207
|
+
body.category = options.category;
|
|
208
|
+
if (options.project)
|
|
209
|
+
body.project = options.project;
|
|
210
|
+
const result = await apiPost(url, "/api/bookmarks", body);
|
|
211
|
+
success(`Bookmark created: ${shortId(result?.id)}`);
|
|
212
|
+
} catch (err) {
|
|
213
|
+
fail(err.message);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
cmd.command("update").description("Update a bookmark").requiredOption("-i, --id <id>", "Bookmark ID").option("-c, --command <cmd>", "New command").option("--description <desc>", "New description").option("--category <cat>", "New category").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
217
|
+
try {
|
|
218
|
+
const url = getAgentUrl(options);
|
|
219
|
+
const body = {};
|
|
220
|
+
if (options.command)
|
|
221
|
+
body.command = options.command;
|
|
222
|
+
if (options.description)
|
|
223
|
+
body.description = options.description;
|
|
224
|
+
if (options.category)
|
|
225
|
+
body.category = options.category;
|
|
226
|
+
if (Object.keys(body).length === 0) {
|
|
227
|
+
fail("No fields to update. Provide at least one of --command, --description, or --category.");
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
await apiPut(url, `/api/bookmarks/${options.id}`, body);
|
|
231
|
+
success(`Bookmark ${shortId(options.id)} updated.`);
|
|
232
|
+
} catch (err) {
|
|
233
|
+
fail(err.message);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
cmd.command("delete").description("Delete a bookmark").requiredOption("-i, --id <id>", "Bookmark ID").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
237
|
+
try {
|
|
238
|
+
const url = getAgentUrl(options);
|
|
239
|
+
await apiDelete(url, `/api/bookmarks/${options.id}`);
|
|
240
|
+
success(`Bookmark ${shortId(options.id)} deleted.`);
|
|
241
|
+
} catch (err) {
|
|
242
|
+
fail(err.message);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
cmd.command("execute").description("Execute a bookmarked command").requiredOption("-i, --id <id>", "Bookmark ID").option("--session <sessionId>", "Session ID to execute in").option("--agent-url <url>", "Agent URL", DEFAULT_AGENT_URL).action(async (options) => {
|
|
246
|
+
try {
|
|
247
|
+
const url = getAgentUrl(options);
|
|
248
|
+
const body = {};
|
|
249
|
+
if (options.session)
|
|
250
|
+
body.sessionId = options.session;
|
|
251
|
+
const result = await apiPost(url, `/api/bookmarks/${options.id}/execute`, body);
|
|
252
|
+
success(`Bookmark ${shortId(options.id)} executed.`);
|
|
253
|
+
if (result?.output) {
|
|
254
|
+
console.log(result.output);
|
|
255
|
+
}
|
|
256
|
+
} catch (err) {
|
|
257
|
+
fail(err.message);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// src/plugins/bookmark/commands.ts
|
|
263
|
+
function registerCommands(program, _hostServices) {
|
|
264
|
+
register(program);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// src/plugins/bookmark/index.ts
|
|
268
|
+
var vibePlugin = {
|
|
269
|
+
name: "bookmark",
|
|
270
|
+
version: "2.2.0",
|
|
271
|
+
description: "Bookmarked command management \u2014 CRUD and execute",
|
|
272
|
+
tags: ["backend", "cli"],
|
|
273
|
+
cliCommand: "bookmark",
|
|
274
|
+
apiPrefix: "/api/bookmarks",
|
|
275
|
+
createRoutes: (deps) => createRoutes(deps),
|
|
276
|
+
onCliSetup: async (program, hostServices) => {
|
|
277
|
+
registerCommands(program, hostServices);
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
export {
|
|
281
|
+
vibePlugin
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
//# debugId=E29820E5E0F6A45164756E2164756E21
|
|
285
|
+
//# sourceMappingURL=index-6vry08rz.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/plugins/bookmark/routes.ts", "../src/cli/commands/bookmark.cmd.ts", "../src/plugins/bookmark/commands.ts", "../src/plugins/bookmark/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Bookmark Plugin — Routes\n *\n * Bookmarked command management — CRUD + execute in session or as task.\n *\n * Endpoints (mounted by plugin system at /api/bookmarks):\n * GET / — List bookmarks (optional projectId filter)\n * GET /global — Get global (no project) bookmarks\n * GET /project/:projectId — Get bookmarks by project\n * GET /category/:category — Get bookmarks by category\n * GET /:id — Get bookmark by ID\n * POST / — Create new bookmark\n * PUT /:id — Update bookmark\n * DELETE /:id — Delete bookmark\n * POST /:id/execute — Execute bookmarked command\n */\n\nimport { Elysia, t } from \"elysia\";\n\nimport type { AgentDatabase } from \"../../db/database.js\";\nimport type { ServiceRegistry } from \"../../core/service-registry.js\";\nimport type { SessionProvider } from \"../../core/providers/session.provider.js\";\nimport type { PluginRouteDeps } from \"../../core/types.js\";\n\n// ── Routes ──────────────────────────────────────────────────────────────\n\nexport function createRoutes(deps: PluginRouteDeps) {\n const { db, serviceRegistry } = deps;\n\n return (\n new Elysia()\n // List bookmarks (optional projectId filter)\n .get(\"/\", ({ query }) => {\n const q = query as Record<string, string>;\n const bookmarks =\n q.projectId !== undefined\n ? db.getBookmarkedCommandsByProject(q.projectId)\n : db.getAllBookmarkedCommands();\n return { bookmarks };\n })\n\n // Get global bookmarks (no project)\n .get(\"/global\", () => {\n const bookmarks = db.getBookmarkedCommandsByProject(null);\n return { bookmarks };\n })\n\n // Get bookmarks by project\n .get(\"/project/:projectId\", ({ params }) => {\n const bookmarks = db.getBookmarkedCommandsByProject(params.projectId);\n return { bookmarks };\n })\n\n // Get bookmarks by category\n .get(\"/category/:category\", ({ params }) => {\n const bookmarks = db.getBookmarkedCommandsByCategory(params.category);\n return { bookmarks, category: params.category };\n })\n\n // Get bookmark by ID\n .get(\"/:id\", ({ params, set }) => {\n const bookmark = db.getBookmarkedCommand(params.id);\n if (!bookmark) {\n set.status = 404;\n return { error: \"Bookmarked command not found\" };\n }\n return { bookmark };\n })\n\n // Create new bookmark\n .post(\n \"/\",\n ({ body, set }) => {\n try {\n const bookmark = db.createBookmarkedCommand({\n id: globalThis.crypto.randomUUID(),\n projectId: body.projectId,\n command: body.command,\n description: body.description,\n category: body.category,\n });\n return { bookmark };\n } catch (err) {\n set.status = 500;\n return {\n error: \"Failed to create bookmarked command\",\n details: String(err),\n };\n }\n },\n {\n body: t.Object({\n projectId: t.Optional(t.String()),\n command: t.String(),\n description: t.Optional(t.String()),\n category: t.Optional(t.String()),\n }),\n },\n )\n\n // Update bookmark\n .put(\n \"/:id\",\n ({ params, body, set }) => {\n const bookmark = db.getBookmarkedCommand(params.id);\n if (!bookmark) {\n set.status = 404;\n return { error: \"Bookmarked command not found\" };\n }\n\n try {\n const updates: Record<string, string | undefined> = {};\n if (body.command !== undefined) updates.command = body.command;\n if (body.description !== undefined)\n updates.description = body.description;\n if (body.category !== undefined) updates.category = body.category;\n\n db.updateBookmarkedCommand(params.id, updates);\n const updatedBookmark = db.getBookmarkedCommand(params.id)!;\n return { bookmark: updatedBookmark };\n } catch (err) {\n set.status = 500;\n return {\n error: \"Failed to update bookmarked command\",\n details: String(err),\n };\n }\n },\n {\n body: t.Object({\n command: t.Optional(t.String()),\n description: t.Optional(t.String()),\n category: t.Optional(t.String()),\n }),\n },\n )\n\n // Delete bookmark\n .delete(\"/:id\", ({ params, set }) => {\n const bookmark = db.getBookmarkedCommand(params.id);\n if (!bookmark) {\n set.status = 404;\n return { error: \"Bookmarked command not found\" };\n }\n\n try {\n db.deleteBookmarkedCommand(params.id);\n return { success: true };\n } catch (err) {\n set.status = 500;\n return {\n error: \"Failed to delete bookmarked command\",\n details: String(err),\n };\n }\n })\n\n // Execute bookmarked command\n .post(\n \"/:id/execute\",\n async ({ params, body, set }) => {\n const bookmark = db.getBookmarkedCommand(params.id);\n if (!bookmark) {\n set.status = 404;\n return { error: \"Bookmarked command not found\" };\n }\n\n try {\n // If sessionId provided, execute in session via SessionProvider\n if (body.sessionId) {\n const sessionProvider =\n serviceRegistry.getProvider<SessionProvider>(\"session\");\n if (!sessionProvider) {\n set.status = 400;\n return { error: \"No session provider registered\" };\n }\n\n const session = await sessionProvider.get(body.sessionId);\n if (!session) {\n set.status = 404;\n return { error: \"Session not found\" };\n }\n\n await sessionProvider.sendCommand(\n body.sessionId,\n bookmark.command,\n );\n\n return {\n success: true,\n executedIn: \"session\",\n sessionId: body.sessionId,\n };\n }\n\n // Otherwise, execute as a background task\n const task = db.createTask({\n id: globalThis.crypto.randomUUID(),\n type: \"command\",\n status: \"pending\",\n payload: JSON.stringify({\n command: bookmark.command,\n cwd: body.cwd || process.cwd(),\n }),\n });\n\n return {\n success: true,\n executedIn: \"task\",\n taskId: task.id,\n };\n } catch (err) {\n set.status = 500;\n return {\n error: \"Failed to execute bookmarked command\",\n details: String(err),\n };\n }\n },\n {\n body: t.Object({\n sessionId: t.Optional(t.String()),\n cwd: t.Optional(t.String()),\n }),\n },\n )\n );\n}\n",
|
|
6
|
+
"import { Command } from \"commander\";\nimport {\n getAgentUrl,\n apiGet,\n apiPost,\n apiPut,\n apiDelete,\n fail,\n success,\n info,\n header,\n kv,\n formatTable,\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(\"bookmark\")\n .description(\"Manage command bookmarks\");\n\n // bookmark list\n cmd\n .command(\"list\")\n .description(\"List bookmarks\")\n .option(\"--project <id>\", \"Filter by project ID\")\n .option(\"--category <cat>\", \"Filter by category\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const params = new URLSearchParams();\n if (options.project) params.set(\"project\", options.project);\n if (options.category) params.set(\"category\", options.category);\n const query = params.toString();\n const endpoint = query ? `/api/bookmarks?${query}` : \"/api/bookmarks\";\n const data = await apiGet<{ bookmarks: any[] }>(url, endpoint);\n const bookmarks = data.bookmarks || [];\n if (!bookmarks || bookmarks.length === 0) {\n info(\"No bookmarks found.\");\n return;\n }\n header(\"Bookmarks\");\n formatTable(\n bookmarks.map((b: any) => ({\n ID: shortId(b.id),\n Command: b.command || \"-\",\n Description: b.description || \"-\",\n Category: b.category || \"-\",\n Project: b.project || b.projectId || \"-\",\n })),\n );\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // bookmark create\n cmd\n .command(\"create\")\n .description(\"Create a new bookmark\")\n .requiredOption(\"-c, --command <cmd>\", \"Command to bookmark\")\n .option(\"--description <desc>\", \"Bookmark description\")\n .option(\"--category <cat>\", \"Category\")\n .option(\"--project <id>\", \"Project ID\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const body: Record<string, any> = { command: options.command };\n if (options.description) body.description = options.description;\n if (options.category) body.category = options.category;\n if (options.project) body.project = options.project;\n const result = await apiPost<any>(url, \"/api/bookmarks\", body);\n success(`Bookmark created: ${shortId(result?.id)}`);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // bookmark update\n cmd\n .command(\"update\")\n .description(\"Update a bookmark\")\n .requiredOption(\"-i, --id <id>\", \"Bookmark ID\")\n .option(\"-c, --command <cmd>\", \"New command\")\n .option(\"--description <desc>\", \"New description\")\n .option(\"--category <cat>\", \"New category\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const body: Record<string, any> = {};\n if (options.command) body.command = options.command;\n if (options.description) body.description = options.description;\n if (options.category) body.category = options.category;\n if (Object.keys(body).length === 0) {\n fail(\n \"No fields to update. Provide at least one of --command, --description, or --category.\",\n );\n return;\n }\n await apiPut<any>(url, `/api/bookmarks/${options.id}`, body);\n success(`Bookmark ${shortId(options.id)} updated.`);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // bookmark delete\n cmd\n .command(\"delete\")\n .description(\"Delete a bookmark\")\n .requiredOption(\"-i, --id <id>\", \"Bookmark ID\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n await apiDelete<any>(url, `/api/bookmarks/${options.id}`);\n success(`Bookmark ${shortId(options.id)} deleted.`);\n } catch (err: any) {\n fail(err.message);\n }\n });\n\n // bookmark execute\n cmd\n .command(\"execute\")\n .description(\"Execute a bookmarked command\")\n .requiredOption(\"-i, --id <id>\", \"Bookmark ID\")\n .option(\"--session <sessionId>\", \"Session ID to execute in\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (options) => {\n try {\n const url = getAgentUrl(options);\n const body: Record<string, any> = {};\n if (options.session) body.sessionId = options.session;\n const result = await apiPost<any>(\n url,\n `/api/bookmarks/${options.id}/execute`,\n body,\n );\n success(`Bookmark ${shortId(options.id)} executed.`);\n if (result?.output) {\n console.log(result.output);\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 registerBookmark } from \"../../cli/commands/bookmark.cmd.js\";\n\nexport function registerCommands(\n program: Command,\n _hostServices: HostServices,\n): void {\n registerBookmark(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: \"bookmark\",\n version: \"2.2.0\",\n description: \"Bookmarked command management — CRUD and execute\",\n tags: [\"backend\", \"cli\"],\n cliCommand: \"bookmark\",\n apiPrefix: \"/api/bookmarks\",\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": "E29820E5E0F6A45164756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|