@burdenoff/vibe-agent 1.4.0 → 2.1.1
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-31chs2a1.js +17177 -0
- package/dist/app-31chs2a1.js.map +170 -0
- package/dist/chunk-pm1hna8x-473akrq0.js +16826 -0
- package/dist/chunk-pm1hna8x-473akrq0.js.map +11 -0
- package/dist/cli.js +4686 -1146
- package/dist/cli.js.map +51 -1
- package/dist/highlights-eq9cgrbb.scm +604 -0
- package/dist/highlights-ghv9g403.scm +205 -0
- package/dist/highlights-hk7bwhj4.scm +284 -0
- package/dist/highlights-r812a2qc.scm +150 -0
- package/dist/highlights-x6tmsnaa.scm +115 -0
- package/dist/index-5xngv42g.js +2546 -0
- package/dist/index-5xngv42g.js.map +26 -0
- package/dist/index-6aq4nc58.js +11429 -0
- package/dist/index-6aq4nc58.js.map +21 -0
- package/dist/index-ac2ebaf8.js +4 -0
- package/dist/index-ac2ebaf8.js.map +9 -0
- package/dist/index-g8dczzvv.js +33 -0
- package/dist/index-g8dczzvv.js.map +9 -0
- package/dist/index-gmz54dkc.js +28203 -0
- package/dist/index-gmz54dkc.js.map +11 -0
- package/dist/index-t06ktmx9.js +216 -0
- package/dist/index-t06ktmx9.js.map +11 -0
- package/dist/index.js +69 -87
- package/dist/index.js.map +10 -1
- package/dist/injections-73j83es3.scm +27 -0
- package/dist/package-hb6db316.js +136 -0
- package/dist/package-hb6db316.js.map +9 -0
- package/dist/plugin-system-bg1pzjj9.js +450 -0
- package/dist/plugin-system-bg1pzjj9.js.map +11 -0
- package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/package.json +26 -40
- package/dist/app.d.ts +0 -15
- package/dist/app.d.ts.map +0 -1
- package/dist/app.js +0 -600
- package/dist/app.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/db/schema.d.ts +0 -121
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -473
- package/dist/db/schema.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/ModuleAuth.d.ts +0 -61
- package/dist/middleware/ModuleAuth.d.ts.map +0 -1
- package/dist/middleware/ModuleAuth.js +0 -223
- package/dist/middleware/ModuleAuth.js.map +0 -1
- package/dist/middleware/auth.d.ts +0 -3
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/middleware/auth.js +0 -11
- package/dist/middleware/auth.js.map +0 -1
- package/dist/migrations/remove-notes-prompts.d.ts +0 -13
- package/dist/migrations/remove-notes-prompts.d.ts.map +0 -1
- package/dist/migrations/remove-notes-prompts.js +0 -148
- package/dist/migrations/remove-notes-prompts.js.map +0 -1
- package/dist/routes/bookmarks.d.ts +0 -3
- package/dist/routes/bookmarks.d.ts.map +0 -1
- package/dist/routes/bookmarks.js +0 -195
- package/dist/routes/bookmarks.js.map +0 -1
- package/dist/routes/config.d.ts +0 -3
- package/dist/routes/config.d.ts.map +0 -1
- package/dist/routes/config.js +0 -106
- package/dist/routes/config.js.map +0 -1
- package/dist/routes/files.d.ts +0 -3
- package/dist/routes/files.d.ts.map +0 -1
- package/dist/routes/files.js +0 -313
- package/dist/routes/files.js.map +0 -1
- package/dist/routes/git.d.ts +0 -3
- package/dist/routes/git.d.ts.map +0 -1
- package/dist/routes/git.js +0 -427
- package/dist/routes/git.js.map +0 -1
- package/dist/routes/logs.d.ts +0 -9
- package/dist/routes/logs.d.ts.map +0 -1
- package/dist/routes/logs.js +0 -107
- package/dist/routes/logs.js.map +0 -1
- package/dist/routes/moduleRegistry.d.ts +0 -41
- package/dist/routes/moduleRegistry.d.ts.map +0 -1
- package/dist/routes/moduleRegistry.js +0 -356
- package/dist/routes/moduleRegistry.js.map +0 -1
- package/dist/routes/notifications.d.ts +0 -3
- package/dist/routes/notifications.d.ts.map +0 -1
- package/dist/routes/notifications.js +0 -255
- package/dist/routes/notifications.js.map +0 -1
- package/dist/routes/plugin-state.d.ts +0 -19
- package/dist/routes/plugin-state.d.ts.map +0 -1
- package/dist/routes/plugin-state.js +0 -139
- package/dist/routes/plugin-state.js.map +0 -1
- package/dist/routes/plugins.d.ts +0 -3
- package/dist/routes/plugins.d.ts.map +0 -1
- package/dist/routes/plugins.js +0 -118
- package/dist/routes/plugins.js.map +0 -1
- package/dist/routes/projects.d.ts +0 -3
- package/dist/routes/projects.d.ts.map +0 -1
- package/dist/routes/projects.js +0 -456
- package/dist/routes/projects.js.map +0 -1
- package/dist/routes/tasks.d.ts +0 -3
- package/dist/routes/tasks.d.ts.map +0 -1
- package/dist/routes/tasks.js +0 -187
- package/dist/routes/tasks.js.map +0 -1
- package/dist/routes/tmux.d.ts +0 -3
- package/dist/routes/tmux.d.ts.map +0 -1
- package/dist/routes/tmux.js +0 -1287
- package/dist/routes/tmux.js.map +0 -1
- package/dist/routes/tunnel.d.ts +0 -25
- package/dist/routes/tunnel.d.ts.map +0 -1
- package/dist/routes/tunnel.js +0 -498
- package/dist/routes/tunnel.js.map +0 -1
- package/dist/services/ModulePermissions.d.ts +0 -100
- package/dist/services/ModulePermissions.d.ts.map +0 -1
- package/dist/services/ModulePermissions.js +0 -322
- package/dist/services/ModulePermissions.js.map +0 -1
- package/dist/services/ModuleRegistryService.d.ts +0 -152
- package/dist/services/ModuleRegistryService.d.ts.map +0 -1
- package/dist/services/ModuleRegistryService.js +0 -547
- package/dist/services/ModuleRegistryService.js.map +0 -1
- package/dist/services/agent.service.d.ts +0 -19
- package/dist/services/agent.service.d.ts.map +0 -1
- package/dist/services/agent.service.js +0 -91
- package/dist/services/agent.service.js.map +0 -1
- package/dist/services/bootstrap.d.ts +0 -22
- package/dist/services/bootstrap.d.ts.map +0 -1
- package/dist/services/bootstrap.js +0 -283
- package/dist/services/bootstrap.js.map +0 -1
- package/dist/services/completion.d.ts +0 -46
- package/dist/services/completion.d.ts.map +0 -1
- package/dist/services/completion.js +0 -317
- package/dist/services/completion.js.map +0 -1
- package/dist/services/gateway-client.d.ts +0 -61
- package/dist/services/gateway-client.d.ts.map +0 -1
- package/dist/services/gateway-client.js +0 -147
- package/dist/services/gateway-client.js.map +0 -1
- package/dist/services/logger.d.ts +0 -61
- package/dist/services/logger.d.ts.map +0 -1
- package/dist/services/logger.js +0 -223
- package/dist/services/logger.js.map +0 -1
- package/dist/services/plugin-manager.d.ts +0 -105
- package/dist/services/plugin-manager.d.ts.map +0 -1
- package/dist/services/plugin-manager.js +0 -250
- package/dist/services/plugin-manager.js.map +0 -1
- package/dist/services/plugin-state-backend.d.ts +0 -22
- package/dist/services/plugin-state-backend.d.ts.map +0 -1
- package/dist/services/plugin-state-backend.js +0 -103
- package/dist/services/plugin-state-backend.js.map +0 -1
- package/dist/services/plugin-state-external.d.ts +0 -36
- package/dist/services/plugin-state-external.d.ts.map +0 -1
- package/dist/services/plugin-state-external.js +0 -144
- package/dist/services/plugin-state-external.js.map +0 -1
- package/dist/services/plugin-state-router.d.ts +0 -40
- package/dist/services/plugin-state-router.d.ts.map +0 -1
- package/dist/services/plugin-state-router.js +0 -82
- package/dist/services/plugin-state-router.js.map +0 -1
- package/dist/services/port-utils.d.ts +0 -11
- package/dist/services/port-utils.d.ts.map +0 -1
- package/dist/services/port-utils.js +0 -39
- package/dist/services/port-utils.js.map +0 -1
- package/dist/services/service-manager.d.ts +0 -50
- package/dist/services/service-manager.d.ts.map +0 -1
- package/dist/services/service-manager.js +0 -389
- package/dist/services/service-manager.js.map +0 -1
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
logger
|
|
4
|
+
} from "./plugin-system-bg1pzjj9.js";
|
|
5
|
+
|
|
6
|
+
// src/core/service-registry.ts
|
|
7
|
+
class ServiceRegistry {
|
|
8
|
+
providers = new Map;
|
|
9
|
+
services = new Map;
|
|
10
|
+
registerProvider(type, provider, pluginName) {
|
|
11
|
+
const existing = this.providers.get(type);
|
|
12
|
+
if (existing) {
|
|
13
|
+
logger.warn("service-registry", `Replacing ${type} provider: ${existing.name} (from ${existing.pluginName}) \u2192 ${provider.name} (from ${pluginName})`);
|
|
14
|
+
}
|
|
15
|
+
this.providers.set(type, {
|
|
16
|
+
type,
|
|
17
|
+
name: provider.name,
|
|
18
|
+
instance: provider,
|
|
19
|
+
pluginName
|
|
20
|
+
});
|
|
21
|
+
logger.info("service-registry", `Registered ${type} provider: ${provider.name} (from ${pluginName})`);
|
|
22
|
+
}
|
|
23
|
+
getProvider(type) {
|
|
24
|
+
const entry = this.providers.get(type);
|
|
25
|
+
return entry?.instance;
|
|
26
|
+
}
|
|
27
|
+
hasProvider(type) {
|
|
28
|
+
return this.providers.has(type);
|
|
29
|
+
}
|
|
30
|
+
unregisterProvider(type, pluginName) {
|
|
31
|
+
const entry = this.providers.get(type);
|
|
32
|
+
if (entry?.pluginName === pluginName) {
|
|
33
|
+
this.providers.delete(type);
|
|
34
|
+
logger.info("service-registry", `Unregistered ${type} provider: ${entry.name} (from ${pluginName})`);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
registerService(pluginName, serviceName, service) {
|
|
40
|
+
const key = `${pluginName}:${serviceName}`;
|
|
41
|
+
this.services.set(key, {
|
|
42
|
+
name: serviceName,
|
|
43
|
+
instance: service,
|
|
44
|
+
pluginName
|
|
45
|
+
});
|
|
46
|
+
logger.info("service-registry", `Registered service: ${key}`);
|
|
47
|
+
}
|
|
48
|
+
getService(pluginName, serviceName) {
|
|
49
|
+
const key = `${pluginName}:${serviceName}`;
|
|
50
|
+
const entry = this.services.get(key);
|
|
51
|
+
return entry?.instance;
|
|
52
|
+
}
|
|
53
|
+
unregisterServices(pluginName) {
|
|
54
|
+
const keysToDelete = [];
|
|
55
|
+
for (const [key, entry] of this.services) {
|
|
56
|
+
if (entry.pluginName === pluginName) {
|
|
57
|
+
keysToDelete.push(key);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
for (const key of keysToDelete) {
|
|
61
|
+
this.services.delete(key);
|
|
62
|
+
}
|
|
63
|
+
if (keysToDelete.length > 0) {
|
|
64
|
+
logger.info("service-registry", `Unregistered ${keysToDelete.length} services from ${pluginName}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
listProviders() {
|
|
68
|
+
return Array.from(this.providers.values()).map((p) => ({
|
|
69
|
+
type: p.type,
|
|
70
|
+
name: p.name,
|
|
71
|
+
pluginName: p.pluginName
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
listServices() {
|
|
75
|
+
return Array.from(this.services.values()).map((s) => ({
|
|
76
|
+
pluginName: s.pluginName,
|
|
77
|
+
serviceName: s.name
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
clear() {
|
|
81
|
+
this.providers.clear();
|
|
82
|
+
this.services.clear();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/services/bootstrap.service.ts
|
|
87
|
+
import { execSync } from "child_process";
|
|
88
|
+
import os from "os";
|
|
89
|
+
function checkCommand(cmd) {
|
|
90
|
+
try {
|
|
91
|
+
const version = execSync(`${cmd} --version 2>&1 || ${cmd} -v 2>&1`, {
|
|
92
|
+
timeout: 5000,
|
|
93
|
+
stdio: "pipe"
|
|
94
|
+
}).toString().trim().split(`
|
|
95
|
+
`)[0];
|
|
96
|
+
return { installed: true, version };
|
|
97
|
+
} catch {
|
|
98
|
+
return { installed: false };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function checkDependencies() {
|
|
102
|
+
const deps = [
|
|
103
|
+
{ name: "bun", cmd: "bun", required: true, category: "runtime" },
|
|
104
|
+
{ name: "tmux", cmd: "tmux", required: false, category: "session" },
|
|
105
|
+
{ name: "ttyd", cmd: "ttyd", required: false, category: "session" },
|
|
106
|
+
{
|
|
107
|
+
name: "cloudflared",
|
|
108
|
+
cmd: "cloudflared",
|
|
109
|
+
required: false,
|
|
110
|
+
category: "tunnel"
|
|
111
|
+
}
|
|
112
|
+
];
|
|
113
|
+
return deps.map((dep) => {
|
|
114
|
+
const { installed, version } = checkCommand(dep.cmd);
|
|
115
|
+
return {
|
|
116
|
+
name: dep.name,
|
|
117
|
+
installed,
|
|
118
|
+
version,
|
|
119
|
+
required: dep.required,
|
|
120
|
+
category: dep.category
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async function installDependencies(deps) {
|
|
125
|
+
const platform = os.platform();
|
|
126
|
+
const result = {
|
|
127
|
+
success: true,
|
|
128
|
+
installed: [],
|
|
129
|
+
failed: [],
|
|
130
|
+
skipped: []
|
|
131
|
+
};
|
|
132
|
+
const checks = checkDependencies();
|
|
133
|
+
const toInstall = deps ? checks.filter((d) => deps.includes(d.name) && !d.installed) : checks.filter((d) => !d.installed);
|
|
134
|
+
for (const dep of toInstall) {
|
|
135
|
+
try {
|
|
136
|
+
logger.info("bootstrap", `Installing ${dep.name}...`);
|
|
137
|
+
if (dep.name === "tmux") {
|
|
138
|
+
await installTmux(platform);
|
|
139
|
+
} else if (dep.name === "ttyd") {
|
|
140
|
+
await installTtyd(platform);
|
|
141
|
+
} else if (dep.name === "cloudflared") {
|
|
142
|
+
await installCloudflared(platform);
|
|
143
|
+
} else {
|
|
144
|
+
result.skipped.push(dep.name);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const check = checkCommand(dep.name);
|
|
148
|
+
if (check.installed) {
|
|
149
|
+
result.installed.push(dep.name);
|
|
150
|
+
logger.info("bootstrap", `Successfully installed ${dep.name}: ${check.version}`);
|
|
151
|
+
} else {
|
|
152
|
+
result.failed.push(dep.name);
|
|
153
|
+
result.success = false;
|
|
154
|
+
logger.error("bootstrap", `Failed to install ${dep.name}: command not found after install`);
|
|
155
|
+
}
|
|
156
|
+
} catch (err) {
|
|
157
|
+
result.failed.push(dep.name);
|
|
158
|
+
result.success = false;
|
|
159
|
+
logger.error("bootstrap", `Failed to install ${dep.name}: ${err}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
async function installTmux(platform) {
|
|
165
|
+
if (platform === "darwin") {
|
|
166
|
+
execSync("brew install tmux", { timeout: 120000, stdio: "pipe" });
|
|
167
|
+
} else if (platform === "linux") {
|
|
168
|
+
try {
|
|
169
|
+
execSync("sudo apt-get install -y tmux", {
|
|
170
|
+
timeout: 120000,
|
|
171
|
+
stdio: "pipe"
|
|
172
|
+
});
|
|
173
|
+
} catch {
|
|
174
|
+
execSync("sudo yum install -y tmux", { timeout: 120000, stdio: "pipe" });
|
|
175
|
+
}
|
|
176
|
+
} else {
|
|
177
|
+
throw new Error(`Unsupported platform for tmux: ${platform}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function installTtyd(platform) {
|
|
181
|
+
if (platform === "darwin") {
|
|
182
|
+
execSync("brew install ttyd", { timeout: 120000, stdio: "pipe" });
|
|
183
|
+
} else if (platform === "linux") {
|
|
184
|
+
try {
|
|
185
|
+
execSync("sudo snap install ttyd --classic", {
|
|
186
|
+
timeout: 120000,
|
|
187
|
+
stdio: "pipe"
|
|
188
|
+
});
|
|
189
|
+
} catch {
|
|
190
|
+
const arch = os.arch() === "x64" ? "x86_64" : os.arch();
|
|
191
|
+
execSync(`curl -sLo /tmp/ttyd https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.${arch} && sudo install /tmp/ttyd /usr/local/bin/ttyd`, { timeout: 120000, stdio: "pipe" });
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
throw new Error(`Unsupported platform for ttyd: ${platform}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function installCloudflared(platform) {
|
|
198
|
+
if (platform === "darwin") {
|
|
199
|
+
execSync("brew install cloudflared", { timeout: 120000, stdio: "pipe" });
|
|
200
|
+
} else if (platform === "linux") {
|
|
201
|
+
const arch = os.arch();
|
|
202
|
+
let archStr = "amd64";
|
|
203
|
+
if (arch === "arm64" || arch === "aarch64")
|
|
204
|
+
archStr = "arm64";
|
|
205
|
+
else if (arch === "arm")
|
|
206
|
+
archStr = "arm";
|
|
207
|
+
execSync(`curl -sLo /tmp/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${archStr} && sudo install /tmp/cloudflared /usr/local/bin/cloudflared`, { timeout: 120000, stdio: "pipe" });
|
|
208
|
+
} else {
|
|
209
|
+
throw new Error(`Unsupported platform for cloudflared: ${platform}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export { ServiceRegistry, checkDependencies, installDependencies };
|
|
214
|
+
|
|
215
|
+
//# debugId=D2B021929084AA6364756E2164756E21
|
|
216
|
+
//# sourceMappingURL=index-t06ktmx9.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/service-registry.ts", "../src/services/bootstrap.service.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Service Registry\n *\n * Central registry for plugin-provided services and providers.\n * Plugins register providers (tunnel, session) and named services\n * that other plugins or the core agent can consume.\n *\n * Pattern: Decorator-based registration on the Elysia app instance.\n */\n\nimport type { TunnelProvider } from \"./providers/tunnel.provider.js\";\nimport type { SessionProvider } from \"./providers/session.provider.js\";\nimport { logger } from \"../services/logger.js\";\n\ntype ProviderType = \"tunnel\" | \"session\";\n\ninterface RegisteredProvider {\n type: ProviderType;\n name: string;\n instance: TunnelProvider | SessionProvider;\n pluginName: string;\n}\n\ninterface RegisteredService {\n name: string;\n instance: unknown;\n pluginName: string;\n}\n\nexport class ServiceRegistry {\n private providers = new Map<ProviderType, RegisteredProvider>();\n private services = new Map<string, RegisteredService>(); // key: \"pluginName:serviceName\"\n\n // ── Provider Registration ───────────────────────────────────────────\n\n /**\n * Register a provider for a given type.\n * Only one provider per type is active at a time (last one wins).\n */\n registerProvider(\n type: ProviderType,\n provider: TunnelProvider | SessionProvider,\n pluginName: string,\n ): void {\n const existing = this.providers.get(type);\n if (existing) {\n logger.warn(\n \"service-registry\",\n `Replacing ${type} provider: ${existing.name} (from ${existing.pluginName}) → ${provider.name} (from ${pluginName})`,\n );\n }\n\n this.providers.set(type, {\n type,\n name: provider.name,\n instance: provider,\n pluginName,\n });\n\n logger.info(\n \"service-registry\",\n `Registered ${type} provider: ${provider.name} (from ${pluginName})`,\n );\n }\n\n /**\n * Get the active provider for a given type.\n */\n getProvider<T extends TunnelProvider | SessionProvider>(\n type: ProviderType,\n ): T | undefined {\n const entry = this.providers.get(type);\n return entry?.instance as T | undefined;\n }\n\n /**\n * Check if a provider is registered for a type.\n */\n hasProvider(type: ProviderType): boolean {\n return this.providers.has(type);\n }\n\n /**\n * Unregister a provider by plugin name.\n */\n unregisterProvider(type: ProviderType, pluginName: string): boolean {\n const entry = this.providers.get(type);\n if (entry?.pluginName === pluginName) {\n this.providers.delete(type);\n logger.info(\n \"service-registry\",\n `Unregistered ${type} provider: ${entry.name} (from ${pluginName})`,\n );\n return true;\n }\n return false;\n }\n\n // ── Named Service Registration ──────────────────────────────────────\n\n /**\n * Register a named service from a plugin.\n */\n registerService(\n pluginName: string,\n serviceName: string,\n service: unknown,\n ): void {\n const key = `${pluginName}:${serviceName}`;\n this.services.set(key, {\n name: serviceName,\n instance: service,\n pluginName,\n });\n\n logger.info(\"service-registry\", `Registered service: ${key}`);\n }\n\n /**\n * Get a named service.\n */\n getService<T>(pluginName: string, serviceName: string): T | undefined {\n const key = `${pluginName}:${serviceName}`;\n const entry = this.services.get(key);\n return entry?.instance as T | undefined;\n }\n\n /**\n * Unregister all services from a plugin.\n */\n unregisterServices(pluginName: string): void {\n const keysToDelete: string[] = [];\n for (const [key, entry] of this.services) {\n if (entry.pluginName === pluginName) {\n keysToDelete.push(key);\n }\n }\n for (const key of keysToDelete) {\n this.services.delete(key);\n }\n if (keysToDelete.length > 0) {\n logger.info(\n \"service-registry\",\n `Unregistered ${keysToDelete.length} services from ${pluginName}`,\n );\n }\n }\n\n // ── Introspection ───────────────────────────────────────────────────\n\n /**\n * List all registered providers.\n */\n listProviders(): Array<{\n type: ProviderType;\n name: string;\n pluginName: string;\n }> {\n return Array.from(this.providers.values()).map((p) => ({\n type: p.type,\n name: p.name,\n pluginName: p.pluginName,\n }));\n }\n\n /**\n * List all registered services.\n */\n listServices(): Array<{\n pluginName: string;\n serviceName: string;\n }> {\n return Array.from(this.services.values()).map((s) => ({\n pluginName: s.pluginName,\n serviceName: s.name,\n }));\n }\n\n /**\n * Clear all registrations.\n */\n clear(): void {\n this.providers.clear();\n this.services.clear();\n }\n}\n",
|
|
6
|
+
"/**\n * Bootstrap Service\n *\n * Handles dependency checking and auto-installation for the vibe agent.\n * Checks for required system tools and optionally installs them.\n *\n * Required prerequisites:\n * - bun (runtime - already present if running this code)\n * - tmux (installed via session-tmux plugin, but checked here for setup)\n * - ttyd (installed via session-tmux plugin, but checked here for setup)\n * - cloudflared (installed via tunnel-cloudflare plugin, but checked here for setup)\n */\n\nimport { execSync } from \"node:child_process\";\nimport os from \"node:os\";\n\nimport { logger } from \"./logger.js\";\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport interface DependencyCheck {\n name: string;\n installed: boolean;\n version?: string;\n required: boolean;\n category: \"runtime\" | \"session\" | \"tunnel\" | \"tool\";\n}\n\nexport interface SetupResult {\n success: boolean;\n installed: string[];\n failed: string[];\n skipped: string[];\n}\n\n// ── Check Functions ─────────────────────────────────────────────────────\n\nfunction checkCommand(cmd: string): { installed: boolean; version?: string } {\n try {\n const version = execSync(`${cmd} --version 2>&1 || ${cmd} -v 2>&1`, {\n timeout: 5000,\n stdio: \"pipe\",\n })\n .toString()\n .trim()\n .split(\"\\n\")[0];\n return { installed: true, version };\n } catch {\n return { installed: false };\n }\n}\n\n/**\n * Check all dependencies and return their status.\n */\nexport function checkDependencies(): DependencyCheck[] {\n const deps: Array<{\n name: string;\n cmd: string;\n required: boolean;\n category: DependencyCheck[\"category\"];\n }> = [\n { name: \"bun\", cmd: \"bun\", required: true, category: \"runtime\" },\n { name: \"tmux\", cmd: \"tmux\", required: false, category: \"session\" },\n { name: \"ttyd\", cmd: \"ttyd\", required: false, category: \"session\" },\n {\n name: \"cloudflared\",\n cmd: \"cloudflared\",\n required: false,\n category: \"tunnel\",\n },\n ];\n\n return deps.map((dep) => {\n const { installed, version } = checkCommand(dep.cmd);\n return {\n name: dep.name,\n installed,\n version,\n required: dep.required,\n category: dep.category,\n };\n });\n}\n\n/**\n * Install missing dependencies.\n */\nexport async function installDependencies(\n deps?: string[],\n): Promise<SetupResult> {\n const platform = os.platform();\n const result: SetupResult = {\n success: true,\n installed: [],\n failed: [],\n skipped: [],\n };\n\n const checks = checkDependencies();\n const toInstall = deps\n ? checks.filter((d) => deps.includes(d.name) && !d.installed)\n : checks.filter((d) => !d.installed);\n\n for (const dep of toInstall) {\n try {\n logger.info(\"bootstrap\", `Installing ${dep.name}...`);\n\n if (dep.name === \"tmux\") {\n await installTmux(platform);\n } else if (dep.name === \"ttyd\") {\n await installTtyd(platform);\n } else if (dep.name === \"cloudflared\") {\n await installCloudflared(platform);\n } else {\n result.skipped.push(dep.name);\n continue;\n }\n\n // Verify installation\n const check = checkCommand(dep.name);\n if (check.installed) {\n result.installed.push(dep.name);\n logger.info(\n \"bootstrap\",\n `Successfully installed ${dep.name}: ${check.version}`,\n );\n } else {\n result.failed.push(dep.name);\n result.success = false;\n logger.error(\n \"bootstrap\",\n `Failed to install ${dep.name}: command not found after install`,\n );\n }\n } catch (err) {\n result.failed.push(dep.name);\n result.success = false;\n logger.error(\"bootstrap\", `Failed to install ${dep.name}: ${err}`);\n }\n }\n\n return result;\n}\n\n// ── Platform-Specific Installers ────────────────────────────────────────\n\nasync function installTmux(platform: string): Promise<void> {\n if (platform === \"darwin\") {\n execSync(\"brew install tmux\", { timeout: 120_000, stdio: \"pipe\" });\n } else if (platform === \"linux\") {\n try {\n execSync(\"sudo apt-get install -y tmux\", {\n timeout: 120_000,\n stdio: \"pipe\",\n });\n } catch {\n execSync(\"sudo yum install -y tmux\", { timeout: 120_000, stdio: \"pipe\" });\n }\n } else {\n throw new Error(`Unsupported platform for tmux: ${platform}`);\n }\n}\n\nasync function installTtyd(platform: string): Promise<void> {\n if (platform === \"darwin\") {\n execSync(\"brew install ttyd\", { timeout: 120_000, stdio: \"pipe\" });\n } else if (platform === \"linux\") {\n try {\n execSync(\"sudo snap install ttyd --classic\", {\n timeout: 120_000,\n stdio: \"pipe\",\n });\n } catch {\n // Try direct download\n const arch = os.arch() === \"x64\" ? \"x86_64\" : os.arch();\n execSync(\n `curl -sLo /tmp/ttyd https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.${arch} && sudo install /tmp/ttyd /usr/local/bin/ttyd`,\n { timeout: 120_000, stdio: \"pipe\" },\n );\n }\n } else {\n throw new Error(`Unsupported platform for ttyd: ${platform}`);\n }\n}\n\nasync function installCloudflared(platform: string): Promise<void> {\n if (platform === \"darwin\") {\n execSync(\"brew install cloudflared\", { timeout: 120_000, stdio: \"pipe\" });\n } else if (platform === \"linux\") {\n const arch = os.arch();\n let archStr = \"amd64\";\n if (arch === \"arm64\" || (arch as string) === \"aarch64\") archStr = \"arm64\";\n else if (arch === \"arm\") archStr = \"arm\";\n\n execSync(\n `curl -sLo /tmp/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${archStr} && sudo install /tmp/cloudflared /usr/local/bin/cloudflared`,\n { timeout: 120_000, stdio: \"pipe\" },\n );\n } else {\n throw new Error(`Unsupported platform for cloudflared: ${platform}`);\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "D2B021929084AA6364756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -1,88 +1,70 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
process.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const port = Number(process.env.PORT || 3005);
|
|
50
|
-
await app.listen({ port, host: "0.0.0.0" });
|
|
51
|
-
console.log(`🚀 VibeControls Agent is running on http://localhost:${port}`);
|
|
52
|
-
// Auto-start the single cloudflared tunnel for this agent (unless disabled).
|
|
53
|
-
// The tunnel URL is exposed via GET /api/agent-tunnel — the user copies it
|
|
54
|
-
// into the agent's tunnel URL field in the VibeControls UI.
|
|
55
|
-
let tunnelUrl = null;
|
|
56
|
-
if (process.env.AGENT_TUNNEL !== "false") {
|
|
57
|
-
try {
|
|
58
|
-
tunnelUrl = await startAgentTunnel(port);
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
console.warn("⚠️ Failed to start agent tunnel:", err instanceof Error ? err.message : err);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// ── Print formatted connection details ────────────────────────────
|
|
65
|
-
const apiKey = getAgentApiKey();
|
|
66
|
-
console.log(`\n \x1b[1m── Agent Connection Details ──\x1b[0m\n`);
|
|
67
|
-
console.log(` \x1b[1mAgent URL:\x1b[0m http://localhost:${port}`);
|
|
68
|
-
console.log(` \x1b[1mAPI Key:\x1b[0m ${apiKey}`);
|
|
69
|
-
if (process.env.AGENT_TUNNEL === "false") {
|
|
70
|
-
console.log(` \x1b[1mTunnel URL:\x1b[0m \x1b[33m(disabled via AGENT_TUNNEL=false)\x1b[0m`);
|
|
71
|
-
}
|
|
72
|
-
else if (tunnelUrl) {
|
|
73
|
-
console.log(` \x1b[1mTunnel URL:\x1b[0m \x1b[32m${tunnelUrl}\x1b[0m`);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
console.log(` \x1b[1mTunnel URL:\x1b[0m \x1b[33m(not running)\x1b[0m`);
|
|
77
|
-
console.log(` Start a tunnel manually: POST /api/agent-tunnel/start`);
|
|
78
|
-
}
|
|
79
|
-
console.log(`\n Copy the API Key and Tunnel URL into the VibeControls UI agent configuration.`);
|
|
80
|
-
console.log();
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
3
|
+
import"./index-t06ktmx9.js";
|
|
4
|
+
import"./index-g8dczzvv.js";
|
|
5
|
+
import {
|
|
6
|
+
createApp
|
|
7
|
+
} from "./app-31chs2a1.js";
|
|
8
|
+
import {
|
|
9
|
+
logger
|
|
10
|
+
} from "./plugin-system-bg1pzjj9.js";
|
|
11
|
+
|
|
12
|
+
// src/index.ts
|
|
13
|
+
if (typeof Bun === "undefined") {
|
|
14
|
+
console.error("ERROR: VibeControls Agent requires Bun runtime.");
|
|
15
|
+
console.error("Install Bun: https://bun.sh");
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
var port = parseInt(process.env.PORT || "3005", 10);
|
|
19
|
+
var host = process.env.HOST || "0.0.0.0";
|
|
20
|
+
var dbPath = process.env.DB_PATH || undefined;
|
|
21
|
+
var apiKey = process.env.AGENT_API_KEY || undefined;
|
|
22
|
+
var logLevel = process.env.LOG_LEVEL || "info";
|
|
23
|
+
var corsOrigin = process.env.CORS_ORIGIN || undefined;
|
|
24
|
+
async function main() {
|
|
25
|
+
logger.info("server", "Starting VibeControls Agent...", {
|
|
26
|
+
runtime: "bun",
|
|
27
|
+
bunVersion: Bun.version,
|
|
28
|
+
port,
|
|
29
|
+
host,
|
|
30
|
+
env: "development"
|
|
31
|
+
});
|
|
32
|
+
try {
|
|
33
|
+
const { app, start, stop } = await createApp({
|
|
34
|
+
port,
|
|
35
|
+
host,
|
|
36
|
+
dbPath,
|
|
37
|
+
apiKey,
|
|
38
|
+
logLevel,
|
|
39
|
+
corsOrigin
|
|
40
|
+
});
|
|
41
|
+
await start();
|
|
42
|
+
const appAny = app;
|
|
43
|
+
const key = appAny.decorator?.apiKey ?? appAny.store?.apiKey;
|
|
44
|
+
if (key) {
|
|
45
|
+
logger.info("server", `API Key: ${String(key).substring(0, 12)}...`);
|
|
46
|
+
console.log(`
|
|
47
|
+
\uD83D\uDD11 Agent API Key: ${key}
|
|
48
|
+
`);
|
|
81
49
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
50
|
+
console.log(`\u2705 VibeControls Agent running on http://${host}:${port}`);
|
|
51
|
+
console.log(` Health: http://localhost:${port}/health`);
|
|
52
|
+
console.log(` API: http://localhost:${port}/api/agent/status
|
|
53
|
+
`);
|
|
54
|
+
const shutdown = async (signal) => {
|
|
55
|
+
logger.info("server", `Received ${signal}, shutting down...`);
|
|
56
|
+
await stop();
|
|
57
|
+
process.exit(0);
|
|
58
|
+
};
|
|
59
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
60
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
61
|
+
} catch (err) {
|
|
62
|
+
logger.error("server", "Failed to start agent", { error: String(err) });
|
|
63
|
+
console.error("\u274C Failed to start VibeControls Agent:", err);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
main();
|
|
68
|
+
|
|
69
|
+
//# debugId=3C4CE68D5F47B28F64756E2164756E21
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"#!/usr/bin/env bun\n/**\n * VibeControls Agent — Server Entry Point\n *\n * Starts the Elysia-based agent server with all routes, plugins,\n * and WebSocket handlers.\n *\n * Environment variables:\n * PORT — Server port (default: 3005)\n * HOST — Bind address (default: 0.0.0.0)\n * DB_PATH — SQLite database path (default: ~/.vibecontrols/agent.db)\n * AGENT_API_KEY — Static API key (default: auto-generated)\n * LOG_LEVEL — Minimum log level: debug|info|warn|error (default: info)\n * CORS_ORIGIN — CORS origin (default: *)\n * NODE_ENV — Environment: development|production (default: production)\n */\n\nimport { createApp } from \"./app.js\";\nimport { logger } from \"./services/logger.js\";\nimport type { LogLevel } from \"./core/types.js\";\n\n// ── Runtime Check ───────────────────────────────────────────────────────\n\nif (typeof Bun === \"undefined\") {\n console.error(\"ERROR: VibeControls Agent requires Bun runtime.\");\n console.error(\"Install Bun: https://bun.sh\");\n process.exit(1);\n}\n\n// ── Configuration ───────────────────────────────────────────────────────\n\nconst port = parseInt(process.env.PORT || \"3005\", 10);\nconst host = process.env.HOST || \"0.0.0.0\";\nconst dbPath = process.env.DB_PATH || undefined; // Default handled by AgentDatabase\nconst apiKey = process.env.AGENT_API_KEY || undefined;\nconst logLevel = (process.env.LOG_LEVEL || \"info\") as LogLevel;\nconst corsOrigin = process.env.CORS_ORIGIN || undefined;\n\n// ── Startup ─────────────────────────────────────────────────────────────\n\nasync function main() {\n logger.info(\"server\", \"Starting VibeControls Agent...\", {\n runtime: \"bun\",\n bunVersion: Bun.version,\n port,\n host,\n env: process.env.NODE_ENV || \"production\",\n });\n\n try {\n const { app, start, stop } = await createApp({\n port,\n host,\n dbPath,\n apiKey,\n logLevel,\n corsOrigin,\n });\n\n await start();\n\n // Print API key for user\n const appAny = app as unknown as Record<string, Record<string, unknown>>;\n const key = appAny.decorator?.apiKey ?? appAny.store?.apiKey;\n if (key) {\n logger.info(\"server\", `API Key: ${String(key).substring(0, 12)}...`);\n console.log(`\\n🔑 Agent API Key: ${key}\\n`);\n }\n\n console.log(`✅ VibeControls Agent running on http://${host}:${port}`);\n console.log(` Health: http://localhost:${port}/health`);\n console.log(` API: http://localhost:${port}/api/agent/status\\n`);\n\n // ── Graceful Shutdown ─────────────────────────────────────────────\n const shutdown = async (signal: string) => {\n logger.info(\"server\", `Received ${signal}, shutting down...`);\n await stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n } catch (err) {\n logger.error(\"server\", \"Failed to start agent\", { error: String(err) });\n console.error(\"❌ Failed to start VibeControls Agent:\", err);\n process.exit(1);\n }\n}\n\nmain();\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;AAuBA,IAAI,OAAO,QAAQ,aAAa;AAAA,EAC9B,QAAQ,MAAM,iDAAiD;AAAA,EAC/D,QAAQ,MAAM,6BAA6B;AAAA,EAC3C,QAAQ,KAAK,CAAC;AAChB;AAIA,IAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,QAAQ,EAAE;AACpD,IAAM,OAAO,QAAQ,IAAI,QAAQ;AACjC,IAAM,SAAS,QAAQ,IAAI,WAAW;AACtC,IAAM,SAAS,QAAQ,IAAI,iBAAiB;AAC5C,IAAM,WAAY,QAAQ,IAAI,aAAa;AAC3C,IAAM,aAAa,QAAQ,IAAI,eAAe;AAI9C,eAAe,IAAI,GAAG;AAAA,EACpB,OAAO,KAAK,UAAU,kCAAkC;AAAA,IACtD,SAAS;AAAA,IACT,YAAY,IAAI;AAAA,IAChB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP,CAAC;AAAA,EAED,IAAI;AAAA,IACF,QAAQ,KAAK,OAAO,SAAS,MAAM,UAAU;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IAED,MAAM,MAAM;AAAA,IAGZ,MAAM,SAAS;AAAA,IACf,MAAM,MAAM,OAAO,WAAW,UAAU,OAAO,OAAO;AAAA,IACtD,IAAI,KAAK;AAAA,MACP,OAAO,KAAK,UAAU,YAAY,OAAO,GAAG,EAAE,UAAU,GAAG,EAAE,MAAM;AAAA,MACnE,QAAQ,IAAI;AAAA,8BAAsB;AAAA,CAAO;AAAA,IAC3C;AAAA,IAEA,QAAQ,IAAI,+CAAyC,QAAQ,MAAM;AAAA,IACnE,QAAQ,IAAI,+BAA+B,aAAa;AAAA,IACxD,QAAQ,IAAI,+BAA+B;AAAA,CAAyB;AAAA,IAGpE,MAAM,WAAW,OAAO,WAAmB;AAAA,MACzC,OAAO,KAAK,UAAU,YAAY,0BAA0B;AAAA,MAC5D,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK,CAAC;AAAA;AAAA,IAGhB,QAAQ,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC;AAAA,IAC7C,QAAQ,GAAG,WAAW,MAAM,SAAS,SAAS,CAAC;AAAA,IAC/C,OAAO,KAAK;AAAA,IACZ,OAAO,MAAM,UAAU,yBAAyB,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,IACtE,QAAQ,MAAM,8CAAwC,GAAG;AAAA,IACzD,QAAQ,KAAK,CAAC;AAAA;AAAA;AAIlB,KAAK;",
|
|
8
|
+
"debugId": "3C4CE68D5F47B28F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
; Query from: https://raw.githubusercontent.com/nvim-treesitter/nvim-treesitter/refs/heads/master/queries/markdown/injections.scm
|
|
2
|
+
(fenced_code_block
|
|
3
|
+
(info_string
|
|
4
|
+
(language) @_lang)
|
|
5
|
+
(code_fence_content) @injection.content
|
|
6
|
+
(#set-lang-from-info-string! @_lang))
|
|
7
|
+
|
|
8
|
+
((html_block) @injection.content
|
|
9
|
+
(#set! injection.language "html")
|
|
10
|
+
(#set! injection.combined)
|
|
11
|
+
(#set! injection.include-children))
|
|
12
|
+
|
|
13
|
+
((minus_metadata) @injection.content
|
|
14
|
+
(#set! injection.language "yaml")
|
|
15
|
+
(#offset! @injection.content 1 0 -1 0)
|
|
16
|
+
(#set! injection.include-children))
|
|
17
|
+
|
|
18
|
+
((plus_metadata) @injection.content
|
|
19
|
+
(#set! injection.language "toml")
|
|
20
|
+
(#offset! @injection.content 1 0 -1 0)
|
|
21
|
+
(#set! injection.include-children))
|
|
22
|
+
|
|
23
|
+
([
|
|
24
|
+
(inline)
|
|
25
|
+
(pipe_table_cell)
|
|
26
|
+
] @injection.content
|
|
27
|
+
(#set! injection.language "markdown_inline"))
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import"./index-g8dczzvv.js";
|
|
3
|
+
|
|
4
|
+
// package.json
|
|
5
|
+
var name = "@burdenoff/vibe-agent";
|
|
6
|
+
var version = "2.1.1";
|
|
7
|
+
var main = "./dist/index.js";
|
|
8
|
+
var type = "module";
|
|
9
|
+
var bin = {
|
|
10
|
+
vibe: "dist/cli.js"
|
|
11
|
+
};
|
|
12
|
+
var scripts = {
|
|
13
|
+
dev: "bun run --watch ./src/index.ts",
|
|
14
|
+
start: "bun run ./dist/index.js",
|
|
15
|
+
build: "bun build ./src/index.ts ./src/cli.ts --outdir=./dist --target=bun --splitting --sourcemap",
|
|
16
|
+
lint: "eslint ./src",
|
|
17
|
+
"lint:fix": "eslint ./src --fix",
|
|
18
|
+
format: "prettier . --write",
|
|
19
|
+
"format:check": "prettier . --check",
|
|
20
|
+
"type:check": "tsc --noEmit",
|
|
21
|
+
test: "bun test tests/ 2>/dev/null || echo 'Tests skipped'",
|
|
22
|
+
clean: "rimraf dist coverage",
|
|
23
|
+
prebuild: "bun run clean",
|
|
24
|
+
postbuild: "bun scripts/fix-duplicate-exports.ts && chmod +x dist/cli.js && echo 'Build completed successfully'",
|
|
25
|
+
sanity: "bun run format:check && bun run lint && bun run type:check && bun run build"
|
|
26
|
+
};
|
|
27
|
+
var keywords = [
|
|
28
|
+
"vibecontrols",
|
|
29
|
+
"vibe",
|
|
30
|
+
"agent",
|
|
31
|
+
"task-runner",
|
|
32
|
+
"terminal",
|
|
33
|
+
"tmux",
|
|
34
|
+
"tunnel",
|
|
35
|
+
"cloudflared",
|
|
36
|
+
"cli",
|
|
37
|
+
"devtools",
|
|
38
|
+
"remote-development",
|
|
39
|
+
"bun",
|
|
40
|
+
"elysia"
|
|
41
|
+
];
|
|
42
|
+
var author = {
|
|
43
|
+
name: "Vignesh T.V",
|
|
44
|
+
email: "vignesh@burdenoff.com",
|
|
45
|
+
url: "https://github.com/tvvignesh"
|
|
46
|
+
};
|
|
47
|
+
var license = "SEE LICENSE IN LICENSE";
|
|
48
|
+
var description = "VibeControls Agent CLI - Remote development environment management with terminal multiplexing, tunnels, and extensible plugins. Powered by Bun + Elysia.";
|
|
49
|
+
var dependencies = {
|
|
50
|
+
"@elysiajs/cors": "^1.3.1",
|
|
51
|
+
commander: "^14.0.3",
|
|
52
|
+
elysia: "^1.3.2"
|
|
53
|
+
};
|
|
54
|
+
var optionalDependencies = {
|
|
55
|
+
"@opentui/core": ">=0.0.0",
|
|
56
|
+
"@opentui/react": ">=0.0.0"
|
|
57
|
+
};
|
|
58
|
+
var devDependencies = {
|
|
59
|
+
"@eslint/js": "^10.0.1",
|
|
60
|
+
"@types/bun": "^1.2.7",
|
|
61
|
+
"@types/react": "^19.1.4",
|
|
62
|
+
eslint: "^10.0.1",
|
|
63
|
+
globals: "^17.3.0",
|
|
64
|
+
prettier: "^3.8.1",
|
|
65
|
+
react: "^19.1.0",
|
|
66
|
+
rimraf: "^6.1.3",
|
|
67
|
+
typescript: "^5.9.3",
|
|
68
|
+
"typescript-eslint": "^8.56.0"
|
|
69
|
+
};
|
|
70
|
+
var peerDependencies = {
|
|
71
|
+
react: "^19.0.0"
|
|
72
|
+
};
|
|
73
|
+
var repository = {
|
|
74
|
+
type: "git",
|
|
75
|
+
url: "git+https://github.com/algoshred/vibecontrols-agent.git"
|
|
76
|
+
};
|
|
77
|
+
var bugs = {
|
|
78
|
+
url: "https://github.com/algoshred/vibecontrols-agent/issues"
|
|
79
|
+
};
|
|
80
|
+
var homepage = "https://vibecontrols.com";
|
|
81
|
+
var publishConfig = {
|
|
82
|
+
access: "public",
|
|
83
|
+
registry: "https://registry.npmjs.org/"
|
|
84
|
+
};
|
|
85
|
+
var files = [
|
|
86
|
+
"dist/**/*",
|
|
87
|
+
"README.md",
|
|
88
|
+
"LICENSE",
|
|
89
|
+
".env.example"
|
|
90
|
+
];
|
|
91
|
+
var package_default = {
|
|
92
|
+
name,
|
|
93
|
+
version,
|
|
94
|
+
main,
|
|
95
|
+
type,
|
|
96
|
+
bin,
|
|
97
|
+
scripts,
|
|
98
|
+
keywords,
|
|
99
|
+
author,
|
|
100
|
+
license,
|
|
101
|
+
description,
|
|
102
|
+
dependencies,
|
|
103
|
+
optionalDependencies,
|
|
104
|
+
devDependencies,
|
|
105
|
+
peerDependencies,
|
|
106
|
+
repository,
|
|
107
|
+
bugs,
|
|
108
|
+
homepage,
|
|
109
|
+
publishConfig,
|
|
110
|
+
files
|
|
111
|
+
};
|
|
112
|
+
export {
|
|
113
|
+
version,
|
|
114
|
+
type,
|
|
115
|
+
scripts,
|
|
116
|
+
repository,
|
|
117
|
+
publishConfig,
|
|
118
|
+
peerDependencies,
|
|
119
|
+
optionalDependencies,
|
|
120
|
+
name,
|
|
121
|
+
main,
|
|
122
|
+
license,
|
|
123
|
+
keywords,
|
|
124
|
+
homepage,
|
|
125
|
+
files,
|
|
126
|
+
devDependencies,
|
|
127
|
+
description,
|
|
128
|
+
dependencies,
|
|
129
|
+
package_default as default,
|
|
130
|
+
bugs,
|
|
131
|
+
bin,
|
|
132
|
+
author
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
//# debugId=94B93EAA0F2FFFD364756E2164756E21
|
|
136
|
+
//# sourceMappingURL=package-hb6db316.js.map
|