@burdenoff/vibe-agent 1.3.2 → 2.1.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 (164) hide show
  1. package/dist/app-31chs2a1.js +17180 -0
  2. package/dist/app-31chs2a1.js.map +170 -0
  3. package/dist/chunk-pm1hna8x-473akrq0.js +16826 -0
  4. package/dist/chunk-pm1hna8x-473akrq0.js.map +11 -0
  5. package/dist/cli.js +4686 -1146
  6. package/dist/cli.js.map +51 -1
  7. package/dist/highlights-eq9cgrbb.scm +604 -0
  8. package/dist/highlights-ghv9g403.scm +205 -0
  9. package/dist/highlights-hk7bwhj4.scm +284 -0
  10. package/dist/highlights-r812a2qc.scm +150 -0
  11. package/dist/highlights-x6tmsnaa.scm +115 -0
  12. package/dist/index-5xngv42g.js +2546 -0
  13. package/dist/index-5xngv42g.js.map +26 -0
  14. package/dist/index-6aq4nc58.js +11429 -0
  15. package/dist/index-6aq4nc58.js.map +21 -0
  16. package/dist/index-ac2ebaf8.js +4 -0
  17. package/dist/index-ac2ebaf8.js.map +9 -0
  18. package/dist/index-g8dczzvv.js +33 -0
  19. package/dist/index-g8dczzvv.js.map +9 -0
  20. package/dist/index-gmz54dkc.js +28402 -0
  21. package/dist/index-gmz54dkc.js.map +11 -0
  22. package/dist/index-t06ktmx9.js +216 -0
  23. package/dist/index-t06ktmx9.js.map +11 -0
  24. package/dist/index.js +69 -87
  25. package/dist/index.js.map +10 -1
  26. package/dist/injections-73j83es3.scm +27 -0
  27. package/dist/package-0158fp3w.js +136 -0
  28. package/dist/package-0158fp3w.js.map +9 -0
  29. package/dist/plugin-system-bg1pzjj9.js +453 -0
  30. package/dist/plugin-system-bg1pzjj9.js.map +11 -0
  31. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  32. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  33. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  34. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  35. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  36. package/package.json +33 -44
  37. package/dist/app.d.ts +0 -15
  38. package/dist/app.d.ts.map +0 -1
  39. package/dist/app.js +0 -600
  40. package/dist/app.js.map +0 -1
  41. package/dist/cli.d.ts +0 -3
  42. package/dist/cli.d.ts.map +0 -1
  43. package/dist/db/schema.d.ts +0 -121
  44. package/dist/db/schema.d.ts.map +0 -1
  45. package/dist/db/schema.js +0 -473
  46. package/dist/db/schema.js.map +0 -1
  47. package/dist/index.d.ts +0 -2
  48. package/dist/index.d.ts.map +0 -1
  49. package/dist/middleware/ModuleAuth.d.ts +0 -61
  50. package/dist/middleware/ModuleAuth.d.ts.map +0 -1
  51. package/dist/middleware/ModuleAuth.js +0 -223
  52. package/dist/middleware/ModuleAuth.js.map +0 -1
  53. package/dist/middleware/auth.d.ts +0 -3
  54. package/dist/middleware/auth.d.ts.map +0 -1
  55. package/dist/middleware/auth.js +0 -11
  56. package/dist/middleware/auth.js.map +0 -1
  57. package/dist/migrations/remove-notes-prompts.d.ts +0 -13
  58. package/dist/migrations/remove-notes-prompts.d.ts.map +0 -1
  59. package/dist/migrations/remove-notes-prompts.js +0 -148
  60. package/dist/migrations/remove-notes-prompts.js.map +0 -1
  61. package/dist/routes/bookmarks.d.ts +0 -3
  62. package/dist/routes/bookmarks.d.ts.map +0 -1
  63. package/dist/routes/bookmarks.js +0 -195
  64. package/dist/routes/bookmarks.js.map +0 -1
  65. package/dist/routes/config.d.ts +0 -3
  66. package/dist/routes/config.d.ts.map +0 -1
  67. package/dist/routes/config.js +0 -106
  68. package/dist/routes/config.js.map +0 -1
  69. package/dist/routes/files.d.ts +0 -3
  70. package/dist/routes/files.d.ts.map +0 -1
  71. package/dist/routes/files.js +0 -313
  72. package/dist/routes/files.js.map +0 -1
  73. package/dist/routes/git.d.ts +0 -3
  74. package/dist/routes/git.d.ts.map +0 -1
  75. package/dist/routes/git.js +0 -427
  76. package/dist/routes/git.js.map +0 -1
  77. package/dist/routes/logs.d.ts +0 -9
  78. package/dist/routes/logs.d.ts.map +0 -1
  79. package/dist/routes/logs.js +0 -107
  80. package/dist/routes/logs.js.map +0 -1
  81. package/dist/routes/moduleRegistry.d.ts +0 -41
  82. package/dist/routes/moduleRegistry.d.ts.map +0 -1
  83. package/dist/routes/moduleRegistry.js +0 -356
  84. package/dist/routes/moduleRegistry.js.map +0 -1
  85. package/dist/routes/notifications.d.ts +0 -3
  86. package/dist/routes/notifications.d.ts.map +0 -1
  87. package/dist/routes/notifications.js +0 -255
  88. package/dist/routes/notifications.js.map +0 -1
  89. package/dist/routes/plugin-state.d.ts +0 -19
  90. package/dist/routes/plugin-state.d.ts.map +0 -1
  91. package/dist/routes/plugin-state.js +0 -139
  92. package/dist/routes/plugin-state.js.map +0 -1
  93. package/dist/routes/plugins.d.ts +0 -3
  94. package/dist/routes/plugins.d.ts.map +0 -1
  95. package/dist/routes/plugins.js +0 -118
  96. package/dist/routes/plugins.js.map +0 -1
  97. package/dist/routes/projects.d.ts +0 -3
  98. package/dist/routes/projects.d.ts.map +0 -1
  99. package/dist/routes/projects.js +0 -456
  100. package/dist/routes/projects.js.map +0 -1
  101. package/dist/routes/tasks.d.ts +0 -3
  102. package/dist/routes/tasks.d.ts.map +0 -1
  103. package/dist/routes/tasks.js +0 -187
  104. package/dist/routes/tasks.js.map +0 -1
  105. package/dist/routes/tmux.d.ts +0 -3
  106. package/dist/routes/tmux.d.ts.map +0 -1
  107. package/dist/routes/tmux.js +0 -1287
  108. package/dist/routes/tmux.js.map +0 -1
  109. package/dist/routes/tunnel.d.ts +0 -25
  110. package/dist/routes/tunnel.d.ts.map +0 -1
  111. package/dist/routes/tunnel.js +0 -498
  112. package/dist/routes/tunnel.js.map +0 -1
  113. package/dist/services/ModulePermissions.d.ts +0 -100
  114. package/dist/services/ModulePermissions.d.ts.map +0 -1
  115. package/dist/services/ModulePermissions.js +0 -322
  116. package/dist/services/ModulePermissions.js.map +0 -1
  117. package/dist/services/ModuleRegistryService.d.ts +0 -152
  118. package/dist/services/ModuleRegistryService.d.ts.map +0 -1
  119. package/dist/services/ModuleRegistryService.js +0 -547
  120. package/dist/services/ModuleRegistryService.js.map +0 -1
  121. package/dist/services/agent.service.d.ts +0 -19
  122. package/dist/services/agent.service.d.ts.map +0 -1
  123. package/dist/services/agent.service.js +0 -91
  124. package/dist/services/agent.service.js.map +0 -1
  125. package/dist/services/bootstrap.d.ts +0 -22
  126. package/dist/services/bootstrap.d.ts.map +0 -1
  127. package/dist/services/bootstrap.js +0 -283
  128. package/dist/services/bootstrap.js.map +0 -1
  129. package/dist/services/completion.d.ts +0 -46
  130. package/dist/services/completion.d.ts.map +0 -1
  131. package/dist/services/completion.js +0 -317
  132. package/dist/services/completion.js.map +0 -1
  133. package/dist/services/gateway-client.d.ts +0 -61
  134. package/dist/services/gateway-client.d.ts.map +0 -1
  135. package/dist/services/gateway-client.js +0 -147
  136. package/dist/services/gateway-client.js.map +0 -1
  137. package/dist/services/logger.d.ts +0 -61
  138. package/dist/services/logger.d.ts.map +0 -1
  139. package/dist/services/logger.js +0 -223
  140. package/dist/services/logger.js.map +0 -1
  141. package/dist/services/plugin-manager.d.ts +0 -105
  142. package/dist/services/plugin-manager.d.ts.map +0 -1
  143. package/dist/services/plugin-manager.js +0 -250
  144. package/dist/services/plugin-manager.js.map +0 -1
  145. package/dist/services/plugin-state-backend.d.ts +0 -22
  146. package/dist/services/plugin-state-backend.d.ts.map +0 -1
  147. package/dist/services/plugin-state-backend.js +0 -103
  148. package/dist/services/plugin-state-backend.js.map +0 -1
  149. package/dist/services/plugin-state-external.d.ts +0 -36
  150. package/dist/services/plugin-state-external.d.ts.map +0 -1
  151. package/dist/services/plugin-state-external.js +0 -144
  152. package/dist/services/plugin-state-external.js.map +0 -1
  153. package/dist/services/plugin-state-router.d.ts +0 -40
  154. package/dist/services/plugin-state-router.d.ts.map +0 -1
  155. package/dist/services/plugin-state-router.js +0 -82
  156. package/dist/services/plugin-state-router.js.map +0 -1
  157. package/dist/services/port-utils.d.ts +0 -11
  158. package/dist/services/port-utils.d.ts.map +0 -1
  159. package/dist/services/port-utils.js +0 -39
  160. package/dist/services/port-utils.js.map +0 -1
  161. package/dist/services/service-manager.d.ts +0 -50
  162. package/dist/services/service-manager.d.ts.map +0 -1
  163. package/dist/services/service-manager.js +0 -389
  164. package/dist/services/service-manager.js.map +0 -1
@@ -0,0 +1,453 @@
1
+ // @bun
2
+ import"./index-g8dczzvv.js";
3
+
4
+ // src/core/plugin-system.ts
5
+ import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync, writeFileSync } from "fs";
6
+ import { join as join2 } from "path";
7
+ import os2 from "os";
8
+ import { execSync } from "child_process";
9
+
10
+ // src/services/logger.ts
11
+ import {
12
+ existsSync,
13
+ mkdirSync,
14
+ statSync,
15
+ renameSync,
16
+ unlinkSync,
17
+ createReadStream
18
+ } from "fs";
19
+ import { join } from "path";
20
+ import os from "os";
21
+ import { EventEmitter } from "events";
22
+ import { createInterface } from "readline";
23
+ var LOG_DIR = join(os.homedir(), ".vibecontrols", "logs");
24
+ var LOG_FILE = join(LOG_DIR, "agent.log");
25
+ var MAX_FILE_SIZE = 10 * 1024 * 1024;
26
+ var MAX_ROTATED_FILES = 7;
27
+ var LEVEL_PRIORITY = {
28
+ debug: 0,
29
+ info: 1,
30
+ warn: 2,
31
+ error: 3
32
+ };
33
+ var COLORS = {
34
+ debug: "\x1B[90m",
35
+ info: "\x1B[36m",
36
+ warn: "\x1B[33m",
37
+ error: "\x1B[31m"
38
+ };
39
+ var RESET = "\x1B[0m";
40
+
41
+ class AgentLogger extends EventEmitter {
42
+ fileHandle = null;
43
+ currentDay = "";
44
+ minLevel;
45
+ consoleOutput;
46
+ writeBuffer = [];
47
+ flushTimer = null;
48
+ constructor() {
49
+ super();
50
+ this.setMaxListeners(100);
51
+ this.minLevel = process.env.LOG_LEVEL ?? "info";
52
+ this.consoleOutput = true;
53
+ this.ensureLogDir();
54
+ }
55
+ debug(source, message, metadata) {
56
+ this.log("debug", source, message, metadata);
57
+ }
58
+ info(source, message, metadata) {
59
+ this.log("info", source, message, metadata);
60
+ }
61
+ warn(source, message, metadata) {
62
+ this.log("warn", source, message, metadata);
63
+ }
64
+ error(source, message, metadata) {
65
+ this.log("error", source, message, metadata);
66
+ }
67
+ setLevel(level) {
68
+ this.minLevel = level;
69
+ }
70
+ async readHistory(options) {
71
+ const { level, source, from, to, limit = 200, offset = 0 } = options ?? {};
72
+ const entries = [];
73
+ if (!existsSync(LOG_FILE))
74
+ return entries;
75
+ return new Promise((resolve) => {
76
+ const rl = createInterface({ input: createReadStream(LOG_FILE, "utf8") });
77
+ let skipped = 0;
78
+ rl.on("line", (line) => {
79
+ if (entries.length >= limit) {
80
+ rl.close();
81
+ return;
82
+ }
83
+ try {
84
+ const entry = JSON.parse(line);
85
+ if (level && LEVEL_PRIORITY[entry.level] < LEVEL_PRIORITY[level])
86
+ return;
87
+ if (source && !entry.source.includes(source))
88
+ return;
89
+ if (from && entry.timestamp < from)
90
+ return;
91
+ if (to && entry.timestamp > to)
92
+ return;
93
+ if (skipped < offset) {
94
+ skipped++;
95
+ return;
96
+ }
97
+ entries.push(entry);
98
+ } catch {}
99
+ });
100
+ rl.on("close", () => resolve(entries));
101
+ rl.on("error", () => resolve(entries));
102
+ });
103
+ }
104
+ close() {
105
+ this.flushSync();
106
+ if (this.flushTimer) {
107
+ clearTimeout(this.flushTimer);
108
+ this.flushTimer = null;
109
+ }
110
+ }
111
+ log(level, source, message, metadata) {
112
+ if (LEVEL_PRIORITY[level] < LEVEL_PRIORITY[this.minLevel])
113
+ return;
114
+ const entry = {
115
+ timestamp: new Date().toISOString(),
116
+ level,
117
+ source,
118
+ message,
119
+ ...metadata && Object.keys(metadata).length > 0 ? { metadata } : {}
120
+ };
121
+ this.writeBuffer.push(JSON.stringify(entry) + `
122
+ `);
123
+ this.scheduleFlush();
124
+ this.emit("log", entry);
125
+ if (this.consoleOutput) {
126
+ const color = COLORS[level];
127
+ const levelTag = level.toUpperCase().padEnd(5);
128
+ const sourceTag = source ? ` [${source}]` : "";
129
+ const metaStr = metadata && Object.keys(metadata).length > 0 ? ` ${JSON.stringify(metadata)}` : "";
130
+ const ts = entry.timestamp.split("T")[1]?.slice(0, 12) ?? entry.timestamp;
131
+ process.stdout.write(`${color}${ts} ${levelTag}${RESET}${sourceTag} ${message}${metaStr}
132
+ `);
133
+ }
134
+ }
135
+ scheduleFlush() {
136
+ if (this.flushTimer)
137
+ return;
138
+ this.flushTimer = setTimeout(() => {
139
+ this.flushSync();
140
+ this.flushTimer = null;
141
+ }, 100);
142
+ }
143
+ flushSync() {
144
+ if (this.writeBuffer.length === 0)
145
+ return;
146
+ this.checkRotation();
147
+ try {
148
+ const data = this.writeBuffer.join("");
149
+ this.writeBuffer = [];
150
+ Bun.write(Bun.file(LOG_FILE), data, { createPath: true });
151
+ const file = Bun.file(LOG_FILE);
152
+ const writer = file.writer();
153
+ writer.write(data);
154
+ writer.flush();
155
+ writer.end();
156
+ } catch {
157
+ this.writeBuffer = [];
158
+ }
159
+ }
160
+ checkRotation() {
161
+ const today = new Date().toISOString().split("T")[0];
162
+ if (this.currentDay && this.currentDay !== today) {
163
+ this.rotate();
164
+ this.currentDay = today;
165
+ return;
166
+ }
167
+ this.currentDay = today;
168
+ try {
169
+ if (existsSync(LOG_FILE)) {
170
+ const stats = statSync(LOG_FILE);
171
+ if (stats.size >= MAX_FILE_SIZE) {
172
+ this.rotate();
173
+ }
174
+ }
175
+ } catch {}
176
+ }
177
+ rotate() {
178
+ for (let i = MAX_ROTATED_FILES;i >= 1; i--) {
179
+ const from = i === 1 ? LOG_FILE : `${LOG_FILE}.${i - 1}`;
180
+ const to = `${LOG_FILE}.${i}`;
181
+ try {
182
+ if (existsSync(from)) {
183
+ if (i === MAX_ROTATED_FILES && existsSync(to)) {
184
+ unlinkSync(to);
185
+ }
186
+ renameSync(from, to);
187
+ }
188
+ } catch {}
189
+ }
190
+ }
191
+ ensureLogDir() {
192
+ if (!existsSync(LOG_DIR)) {
193
+ mkdirSync(LOG_DIR, { recursive: true });
194
+ }
195
+ }
196
+ }
197
+ var logger = new AgentLogger;
198
+
199
+ // src/core/plugin-system.ts
200
+ var VIBECONTROLS_DIR = join2(os2.homedir(), ".vibecontrols");
201
+ var REGISTRY_FILE = join2(VIBECONTROLS_DIR, "plugins.json");
202
+
203
+ class PluginManager {
204
+ registry = [];
205
+ loaded = new Map;
206
+ constructor() {
207
+ this.ensureDir();
208
+ this.loadRegistry();
209
+ }
210
+ ensureDir() {
211
+ if (!existsSync2(VIBECONTROLS_DIR)) {
212
+ mkdirSync2(VIBECONTROLS_DIR, { recursive: true });
213
+ }
214
+ }
215
+ loadRegistry() {
216
+ try {
217
+ if (existsSync2(REGISTRY_FILE)) {
218
+ const raw = readFileSync(REGISTRY_FILE, "utf-8");
219
+ this.registry = JSON.parse(raw);
220
+ }
221
+ } catch {
222
+ this.registry = [];
223
+ }
224
+ }
225
+ saveRegistry() {
226
+ this.ensureDir();
227
+ writeFileSync(REGISTRY_FILE, JSON.stringify(this.registry, null, 2), "utf-8");
228
+ }
229
+ async install(packageName) {
230
+ logger.info("plugin-manager", `Installing ${packageName}...`);
231
+ try {
232
+ execSync(`npm install -g ${packageName}`, {
233
+ timeout: 120000,
234
+ stdio: "pipe"
235
+ });
236
+ } catch (err) {
237
+ const message = err instanceof Error ? err.message : String(err);
238
+ throw new Error(`Failed to install ${packageName}: ${message}`, {
239
+ cause: err
240
+ });
241
+ }
242
+ const plugin = await this.importPlugin(packageName);
243
+ const entry = {
244
+ packageName,
245
+ version: plugin.version,
246
+ pluginName: plugin.name,
247
+ installedAt: new Date().toISOString()
248
+ };
249
+ this.registry = this.registry.filter((e) => e.packageName !== packageName);
250
+ this.registry.push(entry);
251
+ this.saveRegistry();
252
+ logger.info("plugin-manager", `Installed ${packageName}@${plugin.version} (${plugin.name})`);
253
+ return entry;
254
+ }
255
+ async installAndLoad(packageName, app, hostServices) {
256
+ const entry = await this.install(packageName);
257
+ const plugin = this.loaded.get(entry.packageName);
258
+ if (plugin) {
259
+ if (plugin.providers?.tunnel) {
260
+ hostServices.serviceRegistry.registerProvider("tunnel", plugin.providers.tunnel, plugin.name);
261
+ }
262
+ if (plugin.providers?.session) {
263
+ hostServices.serviceRegistry.registerProvider("session", plugin.providers.session, plugin.name);
264
+ }
265
+ if (plugin.onServerStart) {
266
+ await plugin.onServerStart(app, hostServices);
267
+ }
268
+ }
269
+ return entry;
270
+ }
271
+ async remove(packageName) {
272
+ logger.info("plugin-manager", `Removing ${packageName}...`);
273
+ const plugin = this.loaded.get(packageName);
274
+ if (plugin?.onServerStop) {
275
+ try {
276
+ await plugin.onServerStop();
277
+ } catch (err) {
278
+ logger.warn("plugin-manager", `Error stopping ${packageName}: ${err}`);
279
+ }
280
+ }
281
+ if (plugin) {
282
+ const serviceRegistry = this.loaded.get(packageName);
283
+ this.loaded.delete(packageName);
284
+ }
285
+ try {
286
+ execSync(`npm uninstall -g ${packageName}`, {
287
+ timeout: 60000,
288
+ stdio: "pipe"
289
+ });
290
+ } catch {}
291
+ this.registry = this.registry.filter((e) => e.packageName !== packageName);
292
+ this.saveRegistry();
293
+ logger.info("plugin-manager", `Removed ${packageName}`);
294
+ }
295
+ async loadAll() {
296
+ this.loaded.clear();
297
+ for (const entry of this.registry) {
298
+ try {
299
+ await this.importPlugin(entry.packageName);
300
+ logger.info("plugin-manager", `Loaded ${entry.packageName} (${entry.pluginName})`);
301
+ } catch (err) {
302
+ logger.warn("plugin-manager", `Failed to load ${entry.packageName}: ${err}`);
303
+ }
304
+ }
305
+ }
306
+ async importPlugin(packageName) {
307
+ const mod = await import(packageName);
308
+ let plugin;
309
+ if (mod.vibePlugin && typeof mod.vibePlugin.name === "string") {
310
+ plugin = mod.vibePlugin;
311
+ } else if (mod.default?.vibePlugin && typeof mod.default.vibePlugin.name === "string") {
312
+ plugin = mod.default.vibePlugin;
313
+ } else if (mod.default && typeof mod.default.name === "string" && typeof mod.default.version === "string") {
314
+ plugin = mod.default;
315
+ }
316
+ if (!plugin) {
317
+ throw new Error(`${packageName} does not export a valid VibePlugin`);
318
+ }
319
+ this.loaded.set(packageName, plugin);
320
+ return plugin;
321
+ }
322
+ async dispatchCliSetup(program, hostServices) {
323
+ for (const [pkg, plugin] of this.loaded) {
324
+ if (plugin.onCliSetup) {
325
+ try {
326
+ await plugin.onCliSetup(program, hostServices);
327
+ } catch (err) {
328
+ logger.warn("plugin-manager", `onCliSetup failed for ${pkg}: ${err}`);
329
+ }
330
+ }
331
+ }
332
+ }
333
+ async dispatchServerStart(app, hostServices) {
334
+ const sorted = this.sortByDependencies();
335
+ for (const [pkg, plugin] of sorted) {
336
+ if (plugin.providers?.tunnel) {
337
+ hostServices.serviceRegistry.registerProvider("tunnel", plugin.providers.tunnel, plugin.name);
338
+ }
339
+ if (plugin.providers?.session) {
340
+ hostServices.serviceRegistry.registerProvider("session", plugin.providers.session, plugin.name);
341
+ }
342
+ if (plugin.onServerStart) {
343
+ try {
344
+ await plugin.onServerStart(app, hostServices);
345
+ } catch (err) {
346
+ logger.error("plugin-manager", `onServerStart failed for ${pkg}: ${err}`);
347
+ }
348
+ }
349
+ }
350
+ }
351
+ async dispatchServerReady(app, hostServices) {
352
+ for (const [pkg, plugin] of this.loaded) {
353
+ if (plugin.onServerReady) {
354
+ try {
355
+ await plugin.onServerReady(app, hostServices);
356
+ } catch (err) {
357
+ logger.warn("plugin-manager", `onServerReady failed for ${pkg}: ${err}`);
358
+ }
359
+ }
360
+ }
361
+ }
362
+ async dispatchServerStop() {
363
+ for (const [pkg, plugin] of this.loaded) {
364
+ if (plugin.onServerStop) {
365
+ try {
366
+ await plugin.onServerStop();
367
+ } catch (err) {
368
+ logger.warn("plugin-manager", `onServerStop failed for ${pkg}: ${err}`);
369
+ }
370
+ }
371
+ }
372
+ }
373
+ async reloadAll(app, hostServices) {
374
+ await this.dispatchServerStop();
375
+ this.loaded.clear();
376
+ this.loadRegistry();
377
+ await this.loadAll();
378
+ await this.dispatchServerStart(app, hostServices);
379
+ await this.dispatchServerReady(app, hostServices);
380
+ }
381
+ sortByDependencies() {
382
+ const entries = Array.from(this.loaded.entries());
383
+ const nameToPackage = new Map;
384
+ for (const [pkg, plugin] of entries) {
385
+ nameToPackage.set(plugin.name, pkg);
386
+ }
387
+ const visited = new Set;
388
+ const sorted = [];
389
+ const visit = (pkg) => {
390
+ if (visited.has(pkg))
391
+ return;
392
+ visited.add(pkg);
393
+ const plugin = this.loaded.get(pkg);
394
+ if (plugin?.dependencies) {
395
+ for (const dep of plugin.dependencies) {
396
+ const depPkg = nameToPackage.get(dep);
397
+ if (depPkg && this.loaded.has(depPkg)) {
398
+ visit(depPkg);
399
+ }
400
+ }
401
+ }
402
+ sorted.push([pkg, this.loaded.get(pkg)]);
403
+ };
404
+ for (const [pkg] of entries) {
405
+ visit(pkg);
406
+ }
407
+ return sorted;
408
+ }
409
+ getPluginDetails() {
410
+ return this.registry.map((entry) => {
411
+ const plugin = this.loaded.get(entry.packageName);
412
+ return {
413
+ packageName: entry.packageName,
414
+ pluginName: entry.pluginName,
415
+ version: plugin?.version ?? entry.version,
416
+ description: plugin?.description,
417
+ cliCommand: plugin?.cliCommand,
418
+ apiPrefix: plugin?.apiPrefix,
419
+ dependencies: plugin?.dependencies,
420
+ installedAt: entry.installedAt,
421
+ loaded: !!plugin,
422
+ hasCliSetup: !!plugin?.onCliSetup,
423
+ hasServerStart: !!plugin?.onServerStart,
424
+ hasServerStop: !!plugin?.onServerStop,
425
+ hasServerReady: !!plugin?.onServerReady,
426
+ hasProviders: !!(plugin?.providers?.tunnel || plugin?.providers?.session)
427
+ };
428
+ });
429
+ }
430
+ getRegistry() {
431
+ return [...this.registry];
432
+ }
433
+ getLoaded(packageName) {
434
+ return this.loaded.get(packageName);
435
+ }
436
+ getAllLoaded() {
437
+ return new Map(this.loaded);
438
+ }
439
+ isInstalled(packageName) {
440
+ return this.registry.some((e) => e.packageName === packageName);
441
+ }
442
+ isLoaded(packageName) {
443
+ return this.loaded.has(packageName);
444
+ }
445
+ }
446
+ export {
447
+ PluginManager
448
+ };
449
+
450
+ export { logger, PluginManager };
451
+
452
+ //# debugId=F4797DFDC3D16D8C64756E2164756E21
453
+ //# sourceMappingURL=plugin-system-bg1pzjj9.js.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/plugin-system.ts", "../src/services/logger.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Plugin System\n *\n * Manages the lifecycle of VibeControls plugins (install, load, start, stop, remove).\n * Plugins are npm packages installed globally, loaded via dynamic import.\n *\n * Plugin registry persisted at ~/.vibecontrols/plugins.json\n *\n * Lifecycle:\n * install → load → onServerStart → onServerReady → ... → onServerStop → remove\n *\n * CLI lifecycle:\n * load → onCliSetup → program.parse() → ...\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport os from \"node:os\";\nimport { execSync } from \"node:child_process\";\nimport type { Command } from \"commander\";\nimport type { Elysia } from \"elysia\";\n\nimport type { TunnelProvider } from \"./providers/tunnel.provider.js\";\nimport type { SessionProvider } from \"./providers/session.provider.js\";\nimport type { StorageProvider } from \"./providers/storage.provider.js\";\nimport type { ServiceRegistry } from \"./service-registry.js\";\nimport type { PluginEntry, PluginInfo, LogLevel } from \"./types.js\";\nimport { logger } from \"../services/logger.js\";\n\n// ── Host Services (passed to plugins) ───────────────────────────────────\n\nexport interface HostServices {\n /** KV storage for plugin data */\n storage: StorageProvider;\n /** Structured logger */\n logger: {\n debug(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void;\n info(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void;\n warn(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void;\n error(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void;\n setLevel(level: LogLevel): void;\n };\n /** Service registry for inter-plugin communication */\n serviceRegistry: ServiceRegistry;\n /** Get a registered provider */\n getProvider<T extends TunnelProvider | SessionProvider>(\n type: \"tunnel\" | \"session\",\n ): T | undefined;\n /** Get the agent's base URL (local) */\n getAgentBaseUrl(): string;\n /** Get the agent version */\n getAgentVersion(): string;\n}\n\n// ── Plugin Interface ────────────────────────────────────────────────────\n\nexport interface VibePlugin {\n /** Unique plugin name (e.g., \"tunnel-cloudflare\", \"session-tmux\") */\n name: string;\n /** Semver version string */\n version: string;\n /** Short description */\n description?: string;\n\n // Discovery metadata\n /** Base CLI command name (e.g., \"ssh\" → `vibe ssh ...`) */\n cliCommand?: string;\n /** Base API route prefix (e.g., \"/api/ssh\") */\n apiPrefix?: string;\n /** Other plugin names this plugin depends on */\n dependencies?: string[];\n\n // Provider registration\n providers?: {\n tunnel?: TunnelProvider;\n session?: SessionProvider;\n };\n\n // Lifecycle hooks\n /** Called during CLI setup to register commander commands */\n onCliSetup?: (\n program: Command,\n hostServices: HostServices,\n ) => void | Promise<void>;\n /** Called when the server starts (before listening) */\n onServerStart?: (\n app: Elysia,\n hostServices: HostServices,\n ) => void | Promise<void>;\n /** Called after the server is listening */\n onServerReady?: (\n app: Elysia,\n hostServices: HostServices,\n ) => void | Promise<void>;\n /** Called when the server is stopping */\n onServerStop?: () => void | Promise<void>;\n}\n\n// ── Registry Path ───────────────────────────────────────────────────────\n\nconst VIBECONTROLS_DIR = join(os.homedir(), \".vibecontrols\");\nconst REGISTRY_FILE = join(VIBECONTROLS_DIR, \"plugins.json\");\n\n// ── Plugin Manager ──────────────────────────────────────────────────────\n\nexport class PluginManager {\n private registry: PluginEntry[] = [];\n private loaded = new Map<string, VibePlugin>();\n\n constructor() {\n this.ensureDir();\n this.loadRegistry();\n }\n\n // ── Registry Persistence ────────────────────────────────────────────\n\n private ensureDir(): void {\n if (!existsSync(VIBECONTROLS_DIR)) {\n mkdirSync(VIBECONTROLS_DIR, { recursive: true });\n }\n }\n\n private loadRegistry(): void {\n try {\n if (existsSync(REGISTRY_FILE)) {\n const raw = readFileSync(REGISTRY_FILE, \"utf-8\");\n this.registry = JSON.parse(raw);\n }\n } catch {\n this.registry = [];\n }\n }\n\n private saveRegistry(): void {\n this.ensureDir();\n writeFileSync(\n REGISTRY_FILE,\n JSON.stringify(this.registry, null, 2),\n \"utf-8\",\n );\n }\n\n // ── Install ─────────────────────────────────────────────────────────\n\n /**\n * Install a plugin package globally via npm.\n */\n async install(packageName: string): Promise<PluginEntry> {\n logger.info(\"plugin-manager\", `Installing ${packageName}...`);\n\n // npm install -g\n try {\n execSync(`npm install -g ${packageName}`, {\n timeout: 120_000,\n stdio: \"pipe\",\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to install ${packageName}: ${message}`, {\n cause: err,\n });\n }\n\n // Dynamic import to validate\n const plugin = await this.importPlugin(packageName);\n\n // Save to registry (deduplicate)\n const entry: PluginEntry = {\n packageName,\n version: plugin.version,\n pluginName: plugin.name,\n installedAt: new Date().toISOString(),\n };\n\n this.registry = this.registry.filter((e) => e.packageName !== packageName);\n this.registry.push(entry);\n this.saveRegistry();\n\n logger.info(\n \"plugin-manager\",\n `Installed ${packageName}@${plugin.version} (${plugin.name})`,\n );\n return entry;\n }\n\n /**\n * Install and immediately load a plugin into a running server.\n */\n async installAndLoad(\n packageName: string,\n app: Elysia,\n hostServices: HostServices,\n ): Promise<PluginEntry> {\n const entry = await this.install(packageName);\n\n // Load and start\n const plugin = this.loaded.get(entry.packageName);\n if (plugin) {\n // Register providers\n if (plugin.providers?.tunnel) {\n hostServices.serviceRegistry.registerProvider(\n \"tunnel\",\n plugin.providers.tunnel,\n plugin.name,\n );\n }\n if (plugin.providers?.session) {\n hostServices.serviceRegistry.registerProvider(\n \"session\",\n plugin.providers.session,\n plugin.name,\n );\n }\n\n // Call onServerStart\n if (plugin.onServerStart) {\n await plugin.onServerStart(app, hostServices);\n }\n }\n\n return entry;\n }\n\n // ── Remove ──────────────────────────────────────────────────────────\n\n /**\n * Remove a plugin package.\n */\n async remove(packageName: string): Promise<void> {\n logger.info(\"plugin-manager\", `Removing ${packageName}...`);\n\n // Stop plugin if loaded\n const plugin = this.loaded.get(packageName);\n if (plugin?.onServerStop) {\n try {\n await plugin.onServerStop();\n } catch (err) {\n logger.warn(\"plugin-manager\", `Error stopping ${packageName}: ${err}`);\n }\n }\n\n // Unregister providers and services\n if (plugin) {\n const serviceRegistry = this.loaded.get(packageName);\n // We'll handle service cleanup in the caller\n this.loaded.delete(packageName);\n }\n\n // npm uninstall -g\n try {\n execSync(`npm uninstall -g ${packageName}`, {\n timeout: 60_000,\n stdio: \"pipe\",\n });\n } catch {\n // Package might not be globally installed — that's ok\n }\n\n // Remove from registry\n this.registry = this.registry.filter((e) => e.packageName !== packageName);\n this.saveRegistry();\n\n logger.info(\"plugin-manager\", `Removed ${packageName}`);\n }\n\n // ── Load ────────────────────────────────────────────────────────────\n\n /**\n * Load all registered plugins into memory.\n */\n async loadAll(): Promise<void> {\n this.loaded.clear();\n\n for (const entry of this.registry) {\n try {\n await this.importPlugin(entry.packageName);\n logger.info(\n \"plugin-manager\",\n `Loaded ${entry.packageName} (${entry.pluginName})`,\n );\n } catch (err) {\n logger.warn(\n \"plugin-manager\",\n `Failed to load ${entry.packageName}: ${err}`,\n );\n }\n }\n }\n\n /**\n * Import a plugin module and extract the VibePlugin export.\n */\n private async importPlugin(packageName: string): Promise<VibePlugin> {\n const mod = await import(packageName);\n\n // Support multiple export patterns:\n // 1. { vibePlugin: VibePlugin }\n // 2. { default: { vibePlugin: VibePlugin } }\n // 3. { default: VibePlugin }\n let plugin: VibePlugin | undefined;\n\n if (mod.vibePlugin && typeof mod.vibePlugin.name === \"string\") {\n plugin = mod.vibePlugin;\n } else if (\n mod.default?.vibePlugin &&\n typeof mod.default.vibePlugin.name === \"string\"\n ) {\n plugin = mod.default.vibePlugin;\n } else if (\n mod.default &&\n typeof mod.default.name === \"string\" &&\n typeof mod.default.version === \"string\"\n ) {\n plugin = mod.default;\n }\n\n if (!plugin) {\n throw new Error(`${packageName} does not export a valid VibePlugin`);\n }\n\n this.loaded.set(packageName, plugin);\n return plugin;\n }\n\n // ── Dispatch Lifecycle ──────────────────────────────────────────────\n\n /**\n * Dispatch onCliSetup to all loaded plugins.\n */\n async dispatchCliSetup(\n program: Command,\n hostServices: HostServices,\n ): Promise<void> {\n for (const [pkg, plugin] of this.loaded) {\n if (plugin.onCliSetup) {\n try {\n await plugin.onCliSetup(program, hostServices);\n } catch (err) {\n logger.warn(\"plugin-manager\", `onCliSetup failed for ${pkg}: ${err}`);\n }\n }\n }\n }\n\n /**\n * Dispatch onServerStart to all loaded plugins and register providers.\n */\n async dispatchServerStart(\n app: Elysia,\n hostServices: HostServices,\n ): Promise<void> {\n // Sort by dependencies (simple topological sort)\n const sorted = this.sortByDependencies();\n\n for (const [pkg, plugin] of sorted) {\n // Register providers first\n if (plugin.providers?.tunnel) {\n hostServices.serviceRegistry.registerProvider(\n \"tunnel\",\n plugin.providers.tunnel,\n plugin.name,\n );\n }\n if (plugin.providers?.session) {\n hostServices.serviceRegistry.registerProvider(\n \"session\",\n plugin.providers.session,\n plugin.name,\n );\n }\n\n // Call onServerStart\n if (plugin.onServerStart) {\n try {\n await plugin.onServerStart(app, hostServices);\n } catch (err) {\n logger.error(\n \"plugin-manager\",\n `onServerStart failed for ${pkg}: ${err}`,\n );\n }\n }\n }\n }\n\n /**\n * Dispatch onServerReady to all loaded plugins.\n */\n async dispatchServerReady(\n app: Elysia,\n hostServices: HostServices,\n ): Promise<void> {\n for (const [pkg, plugin] of this.loaded) {\n if (plugin.onServerReady) {\n try {\n await plugin.onServerReady(app, hostServices);\n } catch (err) {\n logger.warn(\n \"plugin-manager\",\n `onServerReady failed for ${pkg}: ${err}`,\n );\n }\n }\n }\n }\n\n /**\n * Dispatch onServerStop to all loaded plugins.\n */\n async dispatchServerStop(): Promise<void> {\n for (const [pkg, plugin] of this.loaded) {\n if (plugin.onServerStop) {\n try {\n await plugin.onServerStop();\n } catch (err) {\n logger.warn(\n \"plugin-manager\",\n `onServerStop failed for ${pkg}: ${err}`,\n );\n }\n }\n }\n }\n\n /**\n * Reload all plugins (stop, clear, load, start).\n */\n async reloadAll(app: Elysia, hostServices: HostServices): Promise<void> {\n await this.dispatchServerStop();\n this.loaded.clear();\n this.loadRegistry();\n await this.loadAll();\n await this.dispatchServerStart(app, hostServices);\n await this.dispatchServerReady(app, hostServices);\n }\n\n // ── Dependency Sorting ──────────────────────────────────────────────\n\n private sortByDependencies(): Array<[string, VibePlugin]> {\n const entries = Array.from(this.loaded.entries());\n const nameToPackage = new Map<string, string>();\n for (const [pkg, plugin] of entries) {\n nameToPackage.set(plugin.name, pkg);\n }\n\n // Simple topological sort\n const visited = new Set<string>();\n const sorted: Array<[string, VibePlugin]> = [];\n\n const visit = (pkg: string) => {\n if (visited.has(pkg)) return;\n visited.add(pkg);\n\n const plugin = this.loaded.get(pkg);\n if (plugin?.dependencies) {\n for (const dep of plugin.dependencies) {\n const depPkg = nameToPackage.get(dep);\n if (depPkg && this.loaded.has(depPkg)) {\n visit(depPkg);\n }\n }\n }\n sorted.push([pkg, this.loaded.get(pkg)!]);\n };\n\n for (const [pkg] of entries) {\n visit(pkg);\n }\n\n return sorted;\n }\n\n // ── Introspection ───────────────────────────────────────────────────\n\n /**\n * Get details of all installed plugins.\n */\n getPluginDetails(): PluginInfo[] {\n return this.registry.map((entry) => {\n const plugin = this.loaded.get(entry.packageName);\n return {\n packageName: entry.packageName,\n pluginName: entry.pluginName,\n version: plugin?.version ?? entry.version,\n description: plugin?.description,\n cliCommand: plugin?.cliCommand,\n apiPrefix: plugin?.apiPrefix,\n dependencies: plugin?.dependencies,\n installedAt: entry.installedAt,\n loaded: !!plugin,\n hasCliSetup: !!plugin?.onCliSetup,\n hasServerStart: !!plugin?.onServerStart,\n hasServerStop: !!plugin?.onServerStop,\n hasServerReady: !!plugin?.onServerReady,\n hasProviders: !!(\n plugin?.providers?.tunnel || plugin?.providers?.session\n ),\n };\n });\n }\n\n /**\n * Get the registry entries.\n */\n getRegistry(): PluginEntry[] {\n return [...this.registry];\n }\n\n /**\n * Get a loaded plugin by package name.\n */\n getLoaded(packageName: string): VibePlugin | undefined {\n return this.loaded.get(packageName);\n }\n\n /**\n * Get all loaded plugins.\n */\n getAllLoaded(): Map<string, VibePlugin> {\n return new Map(this.loaded);\n }\n\n /**\n * Check if a plugin is installed.\n */\n isInstalled(packageName: string): boolean {\n return this.registry.some((e) => e.packageName === packageName);\n }\n\n /**\n * Check if a plugin is loaded.\n */\n isLoaded(packageName: string): boolean {\n return this.loaded.has(packageName);\n }\n}\n",
6
+ "/**\n * Structured Logger with Rotation for VibeControls Agent\n *\n * Features:\n * - JSON-structured log entries written to ~/.vibecontrols/logs/agent.log\n * - Dual rotation: daily OR 10MB (whichever comes first)\n * - Keeps 7 rotated files (agent.log.1 … agent.log.7)\n * - Log levels: debug, info, warn, error\n * - Each entry: { timestamp, level, source, message, metadata? }\n * - EventEmitter-based: exposes tailable stream for real-time consumption\n * - Console output in development mode (with ANSI colors)\n */\n\nimport {\n existsSync,\n mkdirSync,\n statSync,\n renameSync,\n unlinkSync,\n createReadStream,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport os from \"node:os\";\nimport { EventEmitter } from \"node:events\";\nimport { createInterface } from \"node:readline\";\n\nimport type { LogLevel, LogEntry } from \"../core/types.js\";\n\n// ── Constants ────────────────────────────────────────────────────────────\n\nconst LOG_DIR = join(os.homedir(), \".vibecontrols\", \"logs\");\nconst LOG_FILE = join(LOG_DIR, \"agent.log\");\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\nconst MAX_ROTATED_FILES = 7;\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nconst COLORS: Record<LogLevel, string> = {\n debug: \"\\x1b[90m\",\n info: \"\\x1b[36m\",\n warn: \"\\x1b[33m\",\n error: \"\\x1b[31m\",\n};\nconst RESET = \"\\x1b[0m\";\n\n// ── Logger Class ─────────────────────────────────────────────────────────\n\nclass AgentLogger extends EventEmitter {\n private fileHandle: ReturnType<typeof Bun.file> | null = null;\n private currentDay: string = \"\";\n private minLevel: LogLevel;\n private consoleOutput: boolean;\n private writeBuffer: string[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n super();\n this.setMaxListeners(100);\n this.minLevel = (process.env.LOG_LEVEL as LogLevel) ?? \"info\";\n this.consoleOutput =\n process.env.NODE_ENV === \"development\" ||\n process.env.LOG_CONSOLE === \"true\";\n this.ensureLogDir();\n }\n\n // ── Public API ─────────────────────────────────────────────────────\n\n debug(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void {\n this.log(\"debug\", source, message, metadata);\n }\n\n info(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void {\n this.log(\"info\", source, message, metadata);\n }\n\n warn(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void {\n this.log(\"warn\", source, message, metadata);\n }\n\n error(\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void {\n this.log(\"error\", source, message, metadata);\n }\n\n setLevel(level: LogLevel): void {\n this.minLevel = level;\n }\n\n async readHistory(options?: {\n level?: LogLevel;\n source?: string;\n from?: string;\n to?: string;\n limit?: number;\n offset?: number;\n }): Promise<LogEntry[]> {\n const { level, source, from, to, limit = 200, offset = 0 } = options ?? {};\n const entries: LogEntry[] = [];\n\n if (!existsSync(LOG_FILE)) return entries;\n\n return new Promise((resolve) => {\n const rl = createInterface({ input: createReadStream(LOG_FILE, \"utf8\") });\n let skipped = 0;\n\n rl.on(\"line\", (line) => {\n if (entries.length >= limit) {\n rl.close();\n return;\n }\n\n try {\n const entry: LogEntry = JSON.parse(line);\n if (level && LEVEL_PRIORITY[entry.level] < LEVEL_PRIORITY[level])\n return;\n if (source && !entry.source.includes(source)) return;\n if (from && entry.timestamp < from) return;\n if (to && entry.timestamp > to) return;\n\n if (skipped < offset) {\n skipped++;\n return;\n }\n\n entries.push(entry);\n } catch {\n // Skip malformed lines\n }\n });\n\n rl.on(\"close\", () => resolve(entries));\n rl.on(\"error\", () => resolve(entries));\n });\n }\n\n close(): void {\n this.flushSync();\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n // ── Internal ───────────────────────────────────────────────────────\n\n private log(\n level: LogLevel,\n source: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void {\n if (LEVEL_PRIORITY[level] < LEVEL_PRIORITY[this.minLevel]) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n source,\n message,\n ...(metadata && Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n\n // Write to file (buffered)\n this.writeBuffer.push(JSON.stringify(entry) + \"\\n\");\n this.scheduleFlush();\n\n // Emit for WebSocket/SSE listeners\n this.emit(\"log\", entry);\n\n // Console output\n if (this.consoleOutput) {\n const color = COLORS[level];\n const levelTag = level.toUpperCase().padEnd(5);\n const sourceTag = source ? ` [${source}]` : \"\";\n const metaStr =\n metadata && Object.keys(metadata).length > 0\n ? ` ${JSON.stringify(metadata)}`\n : \"\";\n const ts = entry.timestamp.split(\"T\")[1]?.slice(0, 12) ?? entry.timestamp;\n process.stdout.write(\n `${color}${ts} ${levelTag}${RESET}${sourceTag} ${message}${metaStr}\\n`,\n );\n }\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => {\n this.flushSync();\n this.flushTimer = null;\n }, 100);\n }\n\n private flushSync(): void {\n if (this.writeBuffer.length === 0) return;\n\n this.checkRotation();\n\n try {\n const data = this.writeBuffer.join(\"\");\n this.writeBuffer = [];\n Bun.write(Bun.file(LOG_FILE), data, { createPath: true });\n // Use appendFile for proper append behavior\n const file = Bun.file(LOG_FILE);\n const writer = file.writer();\n writer.write(data);\n writer.flush();\n writer.end();\n } catch {\n // Best effort — don't crash if logging fails\n this.writeBuffer = [];\n }\n }\n\n private checkRotation(): void {\n const today = new Date().toISOString().split(\"T\")[0];\n\n if (this.currentDay && this.currentDay !== today) {\n this.rotate();\n this.currentDay = today;\n return;\n }\n this.currentDay = today;\n\n try {\n if (existsSync(LOG_FILE)) {\n const stats = statSync(LOG_FILE);\n if (stats.size >= MAX_FILE_SIZE) {\n this.rotate();\n }\n }\n } catch {\n // stat failed — skip\n }\n }\n\n private rotate(): void {\n for (let i = MAX_ROTATED_FILES; i >= 1; i--) {\n const from = i === 1 ? LOG_FILE : `${LOG_FILE}.${i - 1}`;\n const to = `${LOG_FILE}.${i}`;\n try {\n if (existsSync(from)) {\n if (i === MAX_ROTATED_FILES && existsSync(to)) {\n unlinkSync(to);\n }\n renameSync(from, to);\n }\n } catch {\n // Best-effort rotation\n }\n }\n }\n\n private ensureLogDir(): void {\n if (!existsSync(LOG_DIR)) {\n mkdirSync(LOG_DIR, { recursive: true });\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────\n\nexport const logger = new AgentLogger();\nexport default logger;\n"
7
+ ],
8
+ "mappings": ";;;;AAeA,uBAAS,0BAAY;AACrB,iBAAS;AACT;AACA;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AACA;AACA;AACA;AAMA,IAAM,UAAU,KAAK,GAAG,QAAQ,GAAG,iBAAiB,MAAM;AAC1D,IAAM,WAAW,KAAK,SAAS,WAAW;AAC1C,IAAM,gBAAgB,KAAK,OAAO;AAClC,IAAM,oBAAoB;AAE1B,IAAM,iBAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAEA,IAAM,SAAmC;AAAA,EACvC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AACA,IAAM,QAAQ;AAAA;AAId,MAAM,oBAAoB,aAAa;AAAA,EAC7B,aAAiD;AAAA,EACjD,aAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,cAAwB,CAAC;AAAA,EACzB,aAAmD;AAAA,EAE3D,WAAW,GAAG;AAAA,IACZ,MAAM;AAAA,IACN,KAAK,gBAAgB,GAAG;AAAA,IACxB,KAAK,WAAY,QAAQ,IAAI,aAA0B;AAAA,IACvD,KAAK,gBACH;AAAA,IAEF,KAAK,aAAa;AAAA;AAAA,EAKpB,KAAK,CACH,QACA,SACA,UACM;AAAA,IACN,KAAK,IAAI,SAAS,QAAQ,SAAS,QAAQ;AAAA;AAAA,EAG7C,IAAI,CACF,QACA,SACA,UACM;AAAA,IACN,KAAK,IAAI,QAAQ,QAAQ,SAAS,QAAQ;AAAA;AAAA,EAG5C,IAAI,CACF,QACA,SACA,UACM;AAAA,IACN,KAAK,IAAI,QAAQ,QAAQ,SAAS,QAAQ;AAAA;AAAA,EAG5C,KAAK,CACH,QACA,SACA,UACM;AAAA,IACN,KAAK,IAAI,SAAS,QAAQ,SAAS,QAAQ;AAAA;AAAA,EAG7C,QAAQ,CAAC,OAAuB;AAAA,IAC9B,KAAK,WAAW;AAAA;AAAA,OAGZ,YAAW,CAAC,SAOM;AAAA,IACtB,QAAQ,OAAO,QAAQ,MAAM,IAAI,QAAQ,KAAK,SAAS,MAAM,WAAW,CAAC;AAAA,IACzE,MAAM,UAAsB,CAAC;AAAA,IAE7B,IAAI,CAAC,WAAW,QAAQ;AAAA,MAAG,OAAO;AAAA,IAElC,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,MAAM,KAAK,gBAAgB,EAAE,OAAO,iBAAiB,UAAU,MAAM,EAAE,CAAC;AAAA,MACxE,IAAI,UAAU;AAAA,MAEd,GAAG,GAAG,QAAQ,CAAC,SAAS;AAAA,QACtB,IAAI,QAAQ,UAAU,OAAO;AAAA,UAC3B,GAAG,MAAM;AAAA,UACT;AAAA,QACF;AAAA,QAEA,IAAI;AAAA,UACF,MAAM,QAAkB,KAAK,MAAM,IAAI;AAAA,UACvC,IAAI,SAAS,eAAe,MAAM,SAAS,eAAe;AAAA,YACxD;AAAA,UACF,IAAI,UAAU,CAAC,MAAM,OAAO,SAAS,MAAM;AAAA,YAAG;AAAA,UAC9C,IAAI,QAAQ,MAAM,YAAY;AAAA,YAAM;AAAA,UACpC,IAAI,MAAM,MAAM,YAAY;AAAA,YAAI;AAAA,UAEhC,IAAI,UAAU,QAAQ;AAAA,YACpB;AAAA,YACA;AAAA,UACF;AAAA,UAEA,QAAQ,KAAK,KAAK;AAAA,UAClB,MAAM;AAAA,OAGT;AAAA,MAED,GAAG,GAAG,SAAS,MAAM,QAAQ,OAAO,CAAC;AAAA,MACrC,GAAG,GAAG,SAAS,MAAM,QAAQ,OAAO,CAAC;AAAA,KACtC;AAAA;AAAA,EAGH,KAAK,GAAS;AAAA,IACZ,KAAK,UAAU;AAAA,IACf,IAAI,KAAK,YAAY;AAAA,MACnB,aAAa,KAAK,UAAU;AAAA,MAC5B,KAAK,aAAa;AAAA,IACpB;AAAA;AAAA,EAKM,GAAG,CACT,OACA,QACA,SACA,UACM;AAAA,IACN,IAAI,eAAe,SAAS,eAAe,KAAK;AAAA,MAAW;AAAA,IAE3D,MAAM,QAAkB;AAAA,MACtB,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,SACI,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IACrE;AAAA,IAGA,KAAK,YAAY,KAAK,KAAK,UAAU,KAAK,IAAI;AAAA,CAAI;AAAA,IAClD,KAAK,cAAc;AAAA,IAGnB,KAAK,KAAK,OAAO,KAAK;AAAA,IAGtB,IAAI,KAAK,eAAe;AAAA,MACtB,MAAM,QAAQ,OAAO;AAAA,MACrB,MAAM,WAAW,MAAM,YAAY,EAAE,OAAO,CAAC;AAAA,MAC7C,MAAM,YAAY,SAAS,KAAK,YAAY;AAAA,MAC5C,MAAM,UACJ,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,IACvC,IAAI,KAAK,UAAU,QAAQ,MAC3B;AAAA,MACN,MAAM,KAAK,MAAM,UAAU,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE,KAAK,MAAM;AAAA,MAChE,QAAQ,OAAO,MACb,GAAG,QAAQ,MAAM,WAAW,QAAQ,aAAa,UAAU;AAAA,CAC7D;AAAA,IACF;AAAA;AAAA,EAGM,aAAa,GAAS;AAAA,IAC5B,IAAI,KAAK;AAAA,MAAY;AAAA,IACrB,KAAK,aAAa,WAAW,MAAM;AAAA,MACjC,KAAK,UAAU;AAAA,MACf,KAAK,aAAa;AAAA,OACjB,GAAG;AAAA;AAAA,EAGA,SAAS,GAAS;AAAA,IACxB,IAAI,KAAK,YAAY,WAAW;AAAA,MAAG;AAAA,IAEnC,KAAK,cAAc;AAAA,IAEnB,IAAI;AAAA,MACF,MAAM,OAAO,KAAK,YAAY,KAAK,EAAE;AAAA,MACrC,KAAK,cAAc,CAAC;AAAA,MACpB,IAAI,MAAM,IAAI,KAAK,QAAQ,GAAG,MAAM,EAAE,YAAY,KAAK,CAAC;AAAA,MAExD,MAAM,OAAO,IAAI,KAAK,QAAQ;AAAA,MAC9B,MAAM,SAAS,KAAK,OAAO;AAAA,MAC3B,OAAO,MAAM,IAAI;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,OAAO,IAAI;AAAA,MACX,MAAM;AAAA,MAEN,KAAK,cAAc,CAAC;AAAA;AAAA;AAAA,EAIhB,aAAa,GAAS;AAAA,IAC5B,MAAM,QAAQ,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IAElD,IAAI,KAAK,cAAc,KAAK,eAAe,OAAO;AAAA,MAChD,KAAK,OAAO;AAAA,MACZ,KAAK,aAAa;AAAA,MAClB;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAAA,IAElB,IAAI;AAAA,MACF,IAAI,WAAW,QAAQ,GAAG;AAAA,QACxB,MAAM,QAAQ,SAAS,QAAQ;AAAA,QAC/B,IAAI,MAAM,QAAQ,eAAe;AAAA,UAC/B,KAAK,OAAO;AAAA,QACd;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAKF,MAAM,GAAS;AAAA,IACrB,SAAS,IAAI,kBAAmB,KAAK,GAAG,KAAK;AAAA,MAC3C,MAAM,OAAO,MAAM,IAAI,WAAW,GAAG,YAAY,IAAI;AAAA,MACrD,MAAM,KAAK,GAAG,YAAY;AAAA,MAC1B,IAAI;AAAA,QACF,IAAI,WAAW,IAAI,GAAG;AAAA,UACpB,IAAI,MAAM,qBAAqB,WAAW,EAAE,GAAG;AAAA,YAC7C,WAAW,EAAE;AAAA,UACf;AAAA,UACA,WAAW,MAAM,EAAE;AAAA,QACrB;AAAA,QACA,MAAM;AAAA,IAGV;AAAA;AAAA,EAGM,YAAY,GAAS;AAAA,IAC3B,IAAI,CAAC,WAAW,OAAO,GAAG;AAAA,MACxB,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IACxC;AAAA;AAEJ;AAIO,IAAM,SAAS,IAAI;;;ADrK1B,IAAM,mBAAmB,MAAK,IAAG,QAAQ,GAAG,eAAe;AAC3D,IAAM,gBAAgB,MAAK,kBAAkB,cAAc;AAAA;AAIpD,MAAM,cAAc;AAAA,EACjB,WAA0B,CAAC;AAAA,EAC3B,SAAS,IAAI;AAAA,EAErB,WAAW,GAAG;AAAA,IACZ,KAAK,UAAU;AAAA,IACf,KAAK,aAAa;AAAA;AAAA,EAKZ,SAAS,GAAS;AAAA,IACxB,IAAI,CAAC,YAAW,gBAAgB,GAAG;AAAA,MACjC,WAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAAA,IACjD;AAAA;AAAA,EAGM,YAAY,GAAS;AAAA,IAC3B,IAAI;AAAA,MACF,IAAI,YAAW,aAAa,GAAG;AAAA,QAC7B,MAAM,MAAM,aAAa,eAAe,OAAO;AAAA,QAC/C,KAAK,WAAW,KAAK,MAAM,GAAG;AAAA,MAChC;AAAA,MACA,MAAM;AAAA,MACN,KAAK,WAAW,CAAC;AAAA;AAAA;AAAA,EAIb,YAAY,GAAS;AAAA,IAC3B,KAAK,UAAU;AAAA,IACf,cACE,eACA,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC,GACrC,OACF;AAAA;AAAA,OAQI,QAAO,CAAC,aAA2C;AAAA,IACvD,OAAO,KAAK,kBAAkB,cAAc,gBAAgB;AAAA,IAG5D,IAAI;AAAA,MACF,SAAS,kBAAkB,eAAe;AAAA,QACxC,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAAA,MACD,OAAO,KAAK;AAAA,MACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,MAAM,IAAI,MAAM,qBAAqB,gBAAgB,WAAW;AAAA,QAC9D,OAAO;AAAA,MACT,CAAC;AAAA;AAAA,IAIH,MAAM,SAAS,MAAM,KAAK,aAAa,WAAW;AAAA,IAGlD,MAAM,QAAqB;AAAA,MACzB;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,IACtC;AAAA,IAEA,KAAK,WAAW,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,IACzE,KAAK,SAAS,KAAK,KAAK;AAAA,IACxB,KAAK,aAAa;AAAA,IAElB,OAAO,KACL,kBACA,aAAa,eAAe,OAAO,YAAY,OAAO,OACxD;AAAA,IACA,OAAO;AAAA;AAAA,OAMH,eAAc,CAClB,aACA,KACA,cACsB;AAAA,IACtB,MAAM,QAAQ,MAAM,KAAK,QAAQ,WAAW;AAAA,IAG5C,MAAM,SAAS,KAAK,OAAO,IAAI,MAAM,WAAW;AAAA,IAChD,IAAI,QAAQ;AAAA,MAEV,IAAI,OAAO,WAAW,QAAQ;AAAA,QAC5B,aAAa,gBAAgB,iBAC3B,UACA,OAAO,UAAU,QACjB,OAAO,IACT;AAAA,MACF;AAAA,MACA,IAAI,OAAO,WAAW,SAAS;AAAA,QAC7B,aAAa,gBAAgB,iBAC3B,WACA,OAAO,UAAU,SACjB,OAAO,IACT;AAAA,MACF;AAAA,MAGA,IAAI,OAAO,eAAe;AAAA,QACxB,MAAM,OAAO,cAAc,KAAK,YAAY;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAQH,OAAM,CAAC,aAAoC;AAAA,IAC/C,OAAO,KAAK,kBAAkB,YAAY,gBAAgB;AAAA,IAG1D,MAAM,SAAS,KAAK,OAAO,IAAI,WAAW;AAAA,IAC1C,IAAI,QAAQ,cAAc;AAAA,MACxB,IAAI;AAAA,QACF,MAAM,OAAO,aAAa;AAAA,QAC1B,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK,kBAAkB,kBAAkB,gBAAgB,KAAK;AAAA;AAAA,IAEzE;AAAA,IAGA,IAAI,QAAQ;AAAA,MACV,MAAM,kBAAkB,KAAK,OAAO,IAAI,WAAW;AAAA,MAEnD,KAAK,OAAO,OAAO,WAAW;AAAA,IAChC;AAAA,IAGA,IAAI;AAAA,MACF,SAAS,oBAAoB,eAAe;AAAA,QAC1C,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAAA,MACD,MAAM;AAAA,IAKR,KAAK,WAAW,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,IACzE,KAAK,aAAa;AAAA,IAElB,OAAO,KAAK,kBAAkB,WAAW,aAAa;AAAA;AAAA,OAQlD,QAAO,GAAkB;AAAA,IAC7B,KAAK,OAAO,MAAM;AAAA,IAElB,WAAW,SAAS,KAAK,UAAU;AAAA,MACjC,IAAI;AAAA,QACF,MAAM,KAAK,aAAa,MAAM,WAAW;AAAA,QACzC,OAAO,KACL,kBACA,UAAU,MAAM,gBAAgB,MAAM,aACxC;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,OAAO,KACL,kBACA,kBAAkB,MAAM,gBAAgB,KAC1C;AAAA;AAAA,IAEJ;AAAA;AAAA,OAMY,aAAY,CAAC,aAA0C;AAAA,IACnE,MAAM,MAAM,MAAa;AAAA,IAMzB,IAAI;AAAA,IAEJ,IAAI,IAAI,cAAc,OAAO,IAAI,WAAW,SAAS,UAAU;AAAA,MAC7D,SAAS,IAAI;AAAA,IACf,EAAO,SACL,IAAI,SAAS,cACb,OAAO,IAAI,QAAQ,WAAW,SAAS,UACvC;AAAA,MACA,SAAS,IAAI,QAAQ;AAAA,IACvB,EAAO,SACL,IAAI,WACJ,OAAO,IAAI,QAAQ,SAAS,YAC5B,OAAO,IAAI,QAAQ,YAAY,UAC/B;AAAA,MACA,SAAS,IAAI;AAAA,IACf;AAAA,IAEA,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MAAM,GAAG,gDAAgD;AAAA,IACrE;AAAA,IAEA,KAAK,OAAO,IAAI,aAAa,MAAM;AAAA,IACnC,OAAO;AAAA;AAAA,OAQH,iBAAgB,CACpB,SACA,cACe;AAAA,IACf,YAAY,KAAK,WAAW,KAAK,QAAQ;AAAA,MACvC,IAAI,OAAO,YAAY;AAAA,QACrB,IAAI;AAAA,UACF,MAAM,OAAO,WAAW,SAAS,YAAY;AAAA,UAC7C,OAAO,KAAK;AAAA,UACZ,OAAO,KAAK,kBAAkB,yBAAyB,QAAQ,KAAK;AAAA;AAAA,MAExE;AAAA,IACF;AAAA;AAAA,OAMI,oBAAmB,CACvB,KACA,cACe;AAAA,IAEf,MAAM,SAAS,KAAK,mBAAmB;AAAA,IAEvC,YAAY,KAAK,WAAW,QAAQ;AAAA,MAElC,IAAI,OAAO,WAAW,QAAQ;AAAA,QAC5B,aAAa,gBAAgB,iBAC3B,UACA,OAAO,UAAU,QACjB,OAAO,IACT;AAAA,MACF;AAAA,MACA,IAAI,OAAO,WAAW,SAAS;AAAA,QAC7B,aAAa,gBAAgB,iBAC3B,WACA,OAAO,UAAU,SACjB,OAAO,IACT;AAAA,MACF;AAAA,MAGA,IAAI,OAAO,eAAe;AAAA,QACxB,IAAI;AAAA,UACF,MAAM,OAAO,cAAc,KAAK,YAAY;AAAA,UAC5C,OAAO,KAAK;AAAA,UACZ,OAAO,MACL,kBACA,4BAA4B,QAAQ,KACtC;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA;AAAA,OAMI,oBAAmB,CACvB,KACA,cACe;AAAA,IACf,YAAY,KAAK,WAAW,KAAK,QAAQ;AAAA,MACvC,IAAI,OAAO,eAAe;AAAA,QACxB,IAAI;AAAA,UACF,MAAM,OAAO,cAAc,KAAK,YAAY;AAAA,UAC5C,OAAO,KAAK;AAAA,UACZ,OAAO,KACL,kBACA,4BAA4B,QAAQ,KACtC;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA;AAAA,OAMI,mBAAkB,GAAkB;AAAA,IACxC,YAAY,KAAK,WAAW,KAAK,QAAQ;AAAA,MACvC,IAAI,OAAO,cAAc;AAAA,QACvB,IAAI;AAAA,UACF,MAAM,OAAO,aAAa;AAAA,UAC1B,OAAO,KAAK;AAAA,UACZ,OAAO,KACL,kBACA,2BAA2B,QAAQ,KACrC;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA;AAAA,OAMI,UAAS,CAAC,KAAa,cAA2C;AAAA,IACtE,MAAM,KAAK,mBAAmB;AAAA,IAC9B,KAAK,OAAO,MAAM;AAAA,IAClB,KAAK,aAAa;AAAA,IAClB,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,KAAK,oBAAoB,KAAK,YAAY;AAAA,IAChD,MAAM,KAAK,oBAAoB,KAAK,YAAY;AAAA;AAAA,EAK1C,kBAAkB,GAAgC;AAAA,IACxD,MAAM,UAAU,MAAM,KAAK,KAAK,OAAO,QAAQ,CAAC;AAAA,IAChD,MAAM,gBAAgB,IAAI;AAAA,IAC1B,YAAY,KAAK,WAAW,SAAS;AAAA,MACnC,cAAc,IAAI,OAAO,MAAM,GAAG;AAAA,IACpC;AAAA,IAGA,MAAM,UAAU,IAAI;AAAA,IACpB,MAAM,SAAsC,CAAC;AAAA,IAE7C,MAAM,QAAQ,CAAC,QAAgB;AAAA,MAC7B,IAAI,QAAQ,IAAI,GAAG;AAAA,QAAG;AAAA,MACtB,QAAQ,IAAI,GAAG;AAAA,MAEf,MAAM,SAAS,KAAK,OAAO,IAAI,GAAG;AAAA,MAClC,IAAI,QAAQ,cAAc;AAAA,QACxB,WAAW,OAAO,OAAO,cAAc;AAAA,UACrC,MAAM,SAAS,cAAc,IAAI,GAAG;AAAA,UACpC,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,GAAG;AAAA,YACrC,MAAM,MAAM;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,GAAG,CAAE,CAAC;AAAA;AAAA,IAG1C,YAAY,QAAQ,SAAS;AAAA,MAC3B,MAAM,GAAG;AAAA,IACX;AAAA,IAEA,OAAO;AAAA;AAAA,EAQT,gBAAgB,GAAiB;AAAA,IAC/B,OAAO,KAAK,SAAS,IAAI,CAAC,UAAU;AAAA,MAClC,MAAM,SAAS,KAAK,OAAO,IAAI,MAAM,WAAW;AAAA,MAChD,OAAO;AAAA,QACL,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,SAAS,QAAQ,WAAW,MAAM;AAAA,QAClC,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,aAAa,MAAM;AAAA,QACnB,QAAQ,CAAC,CAAC;AAAA,QACV,aAAa,CAAC,CAAC,QAAQ;AAAA,QACvB,gBAAgB,CAAC,CAAC,QAAQ;AAAA,QAC1B,eAAe,CAAC,CAAC,QAAQ;AAAA,QACzB,gBAAgB,CAAC,CAAC,QAAQ;AAAA,QAC1B,cAAc,CAAC,EACb,QAAQ,WAAW,UAAU,QAAQ,WAAW;AAAA,MAEpD;AAAA,KACD;AAAA;AAAA,EAMH,WAAW,GAAkB;AAAA,IAC3B,OAAO,CAAC,GAAG,KAAK,QAAQ;AAAA;AAAA,EAM1B,SAAS,CAAC,aAA6C;AAAA,IACrD,OAAO,KAAK,OAAO,IAAI,WAAW;AAAA;AAAA,EAMpC,YAAY,GAA4B;AAAA,IACtC,OAAO,IAAI,IAAI,KAAK,MAAM;AAAA;AAAA,EAM5B,WAAW,CAAC,aAA8B;AAAA,IACxC,OAAO,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA;AAAA,EAMhE,QAAQ,CAAC,aAA8B;AAAA,IACrC,OAAO,KAAK,OAAO,IAAI,WAAW;AAAA;AAEtC;",
9
+ "debugId": "F4797DFDC3D16D8C64756E2164756E21",
10
+ "names": []
11
+ }
package/package.json CHANGED
@@ -1,32 +1,25 @@
1
1
  {
2
2
  "name": "@burdenoff/vibe-agent",
3
- "version": "1.3.2",
3
+ "version": "2.1.0",
4
4
  "main": "./dist/index.js",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "vibe": "dist/cli.js"
8
8
  },
9
- "engines": {
10
- "node": ">=18.0.0"
11
- },
12
9
  "scripts": {
13
- "dev": "node --watch --experimental-specifier-resolution=node ./dist/index.js",
14
- "dev:ts": "npx tsx --watch ./src/index.ts",
15
- "start": "node ./dist/index.js",
16
- "build": "tsc",
10
+ "dev": "bun run --watch ./src/index.ts",
11
+ "start": "bun run ./dist/index.js",
12
+ "build": "bun build ./src/index.ts ./src/cli.ts --outdir=./dist --target=bun --splitting --sourcemap",
17
13
  "lint": "eslint ./src",
18
14
  "lint:fix": "eslint ./src --fix",
19
- "format": "npx prettier . --write",
20
- "format:check": "npx prettier . --check",
15
+ "format": "prettier . --write",
16
+ "format:check": "prettier . --check",
21
17
  "type:check": "tsc --noEmit",
22
- "test": "node --test tests/**/*.test.ts 2>/dev/null || echo 'Tests skipped'",
23
- "db:clean": "node ./dist/scripts/clean-database.js",
24
- "db:migrate": "node ./dist/migrations/remove-notes-prompts.js",
25
- "prepublishOnly": "npm run build",
18
+ "test": "bun test tests/ 2>/dev/null || echo 'Tests skipped'",
26
19
  "clean": "rimraf dist coverage",
27
- "prebuild": "npm run clean",
20
+ "prebuild": "bun run clean",
28
21
  "postbuild": "chmod +x dist/cli.js && echo 'Build completed successfully'",
29
- "sanity": "npm run format:check && npm run lint && npm run type:check && npm run build"
22
+ "sanity": "bun run format:check && bun run lint && bun run type:check && bun run build"
30
23
  },
31
24
  "keywords": [
32
25
  "vibecontrols",
@@ -39,7 +32,9 @@
39
32
  "cloudflared",
40
33
  "cli",
41
34
  "devtools",
42
- "remote-development"
35
+ "remote-development",
36
+ "bun",
37
+ "elysia"
43
38
  ],
44
39
  "author": {
45
40
  "name": "Vignesh T.V",
@@ -47,37 +42,31 @@
47
42
  "url": "https://github.com/tvvignesh"
48
43
  },
49
44
  "license": "SEE LICENSE IN LICENSE",
50
- "description": "VibeControls Agent CLI - Remote development environment management with terminal multiplexing, tunnels, and extensible plugins",
45
+ "description": "VibeControls Agent CLI - Remote development environment management with terminal multiplexing, tunnels, and extensible plugins. Powered by Bun + Elysia.",
51
46
  "dependencies": {
52
- "@fastify/cors": "^11.0.1",
53
- "@fastify/helmet": "^13.0.1",
54
- "better-sqlite3": "^11.10.0",
55
- "commander": "^14.0.0",
56
- "dotenv": "^16.6.1",
57
- "fastify": "^5.4.0",
58
- "jsonwebtoken": "^9.0.2",
59
- "ora": "^8.2.0",
60
- "ps-tree": "^1.2.0",
61
- "socket.io": "^4.8.1"
47
+ "@elysiajs/cors": "^1.3.1",
48
+ "commander": "^14.0.3",
49
+ "elysia": "^1.3.2"
50
+ },
51
+ "optionalDependencies": {
52
+ "@opentui/core": ">=0.0.0",
53
+ "@opentui/react": ">=0.0.0"
62
54
  },
63
55
  "devDependencies": {
64
- "@eslint/js": "^9.30.1",
65
- "@types/better-sqlite3": "^7.6.13",
66
- "@types/jsonwebtoken": "^9.0.10",
67
- "@types/node": "^24.0.11",
68
- "@types/ps-tree": "^1.1.6",
69
- "@types/ws": "^8.18.1",
70
- "eslint": "^9.30.1",
71
- "globals": "^16.3.0",
72
- "prettier": "^3.6.2",
73
- "rimraf": "^6.0.1",
74
- "typescript": "^5.8.3",
75
- "typescript-eslint": "^8.36.0"
56
+ "@eslint/js": "^10.0.1",
57
+ "@types/bun": "^1.2.7",
58
+ "@types/react": "^19.1.4",
59
+ "eslint": "^10.0.1",
60
+ "globals": "^17.3.0",
61
+ "prettier": "^3.8.1",
62
+ "react": "^19.1.0",
63
+ "rimraf": "^6.1.3",
64
+ "typescript": "^5.9.3",
65
+ "typescript-eslint": "^8.56.0"
66
+ },
67
+ "peerDependencies": {
68
+ "react": "^19.0.0"
76
69
  },
77
- "trustedDependencies": [
78
- "better-sqlite3",
79
- "cpu-features"
80
- ],
81
70
  "repository": {
82
71
  "type": "git",
83
72
  "url": "git+https://github.com/algoshred/vibecontrols-agent.git"