@kernel.chat/kbot 3.54.0 → 3.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +314 -41
- package/dist/cli.js.map +1 -1
- package/dist/tools/admin.d.ts +2 -0
- package/dist/tools/admin.d.ts.map +1 -0
- package/dist/tools/admin.js +422 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/analytics.d.ts +2 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +338 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/db-admin.d.ts +2 -0
- package/dist/tools/db-admin.d.ts.map +1 -0
- package/dist/tools/db-admin.js +364 -0
- package/dist/tools/db-admin.js.map +1 -0
- package/dist/tools/deploy-all.d.ts +2 -0
- package/dist/tools/deploy-all.d.ts.map +1 -0
- package/dist/tools/deploy-all.js +261 -0
- package/dist/tools/deploy-all.js.map +1 -0
- package/dist/tools/env-manager.d.ts +2 -0
- package/dist/tools/env-manager.d.ts.map +1 -0
- package/dist/tools/env-manager.js +240 -0
- package/dist/tools/env-manager.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/monitor.d.ts +2 -0
- package/dist/tools/monitor.d.ts.map +1 -0
- package/dist/tools/monitor.js +270 -0
- package/dist/tools/monitor.js.map +1 -0
- package/dist/tools/music-theory.d.ts.map +1 -1
- package/dist/tools/music-theory.js +61 -1
- package/dist/tools/music-theory.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
// kbot DB Admin — Database management from the terminal
|
|
2
|
+
//
|
|
3
|
+
// Commands:
|
|
4
|
+
// db_backup — Dump database to file
|
|
5
|
+
// db_tables — List all tables with row counts
|
|
6
|
+
// db_inspect — Inspect table schema and sample data
|
|
7
|
+
// db_sql — Run raw SQL query
|
|
8
|
+
// db_migrations — List and run migrations
|
|
9
|
+
// db_health — Database health check (size, connections, slow queries)
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { registerTool } from './index.js';
|
|
14
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
15
|
+
const PROJECT_REF = 'eoxxpyixdieprsxlpwcs';
|
|
16
|
+
function shell(cmd, timeout = 60_000) {
|
|
17
|
+
try {
|
|
18
|
+
const output = execSync(cmd, {
|
|
19
|
+
encoding: 'utf-8', timeout,
|
|
20
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
21
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
22
|
+
}).trim();
|
|
23
|
+
return { ok: true, output };
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
const err = e;
|
|
27
|
+
return { ok: false, output: err.stderr || err.stdout || err.message || 'unknown error' };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function supabaseQuery(table, query) {
|
|
31
|
+
const url = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
|
|
32
|
+
const key = process.env.SUPABASE_SERVICE_KEY || process.env.SUPABASE_SERVICE_ROLE_KEY;
|
|
33
|
+
if (!url || !key)
|
|
34
|
+
throw new Error('Missing SUPABASE_URL or SUPABASE_SERVICE_KEY');
|
|
35
|
+
return execSync(`curl -sS "${url}/rest/v1/${table}?${query}" \
|
|
36
|
+
-H "apikey: ${key}" \
|
|
37
|
+
-H "Authorization: Bearer ${key}" \
|
|
38
|
+
-H "Content-Type: application/json" \
|
|
39
|
+
-H "Prefer: count=exact"`, {
|
|
40
|
+
encoding: 'utf-8', timeout: 30_000,
|
|
41
|
+
}).trim();
|
|
42
|
+
}
|
|
43
|
+
function supabaseRpc(fnName, body = {}) {
|
|
44
|
+
const url = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
|
|
45
|
+
const key = process.env.SUPABASE_SERVICE_KEY || process.env.SUPABASE_SERVICE_ROLE_KEY;
|
|
46
|
+
if (!url || !key)
|
|
47
|
+
throw new Error('Missing SUPABASE_URL or SUPABASE_SERVICE_KEY');
|
|
48
|
+
return execSync(`curl -sS -X POST "${url}/rest/v1/rpc/${fnName}" \
|
|
49
|
+
-H "apikey: ${key}" \
|
|
50
|
+
-H "Authorization: Bearer ${key}" \
|
|
51
|
+
-H "Content-Type: application/json" \
|
|
52
|
+
-d '${JSON.stringify(body)}'`, {
|
|
53
|
+
encoding: 'utf-8', timeout: 30_000,
|
|
54
|
+
}).trim();
|
|
55
|
+
}
|
|
56
|
+
function findProjectRoot() {
|
|
57
|
+
let dir = process.cwd();
|
|
58
|
+
for (let i = 0; i < 10; i++) {
|
|
59
|
+
if (existsSync(join(dir, 'supabase')))
|
|
60
|
+
return dir;
|
|
61
|
+
dir = join(dir, '..');
|
|
62
|
+
}
|
|
63
|
+
return process.cwd();
|
|
64
|
+
}
|
|
65
|
+
// ── Tools ────────────────────────────────────────────────────────────
|
|
66
|
+
export function registerDbAdminTools() {
|
|
67
|
+
let count = 0;
|
|
68
|
+
registerTool({
|
|
69
|
+
name: 'db_backup',
|
|
70
|
+
description: 'Create a database dump (schema + data) and save to a local file.',
|
|
71
|
+
parameters: {
|
|
72
|
+
output: { type: 'string', description: 'Output file path (default: ./backups/db-YYYY-MM-DD.sql)' },
|
|
73
|
+
schema_only: { type: 'string', description: 'If "true", dump schema only (no data)' },
|
|
74
|
+
},
|
|
75
|
+
tier: 'enterprise',
|
|
76
|
+
execute: async (args) => {
|
|
77
|
+
const root = findProjectRoot();
|
|
78
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
79
|
+
const backupDir = join(root, 'backups');
|
|
80
|
+
if (!existsSync(backupDir))
|
|
81
|
+
mkdirSync(backupDir, { recursive: true });
|
|
82
|
+
const outputPath = String(args.output || join(backupDir, `db-${date}.sql`));
|
|
83
|
+
const schemaFlag = String(args.schema_only) === 'true' ? '--schema-only' : '';
|
|
84
|
+
// Use supabase db dump
|
|
85
|
+
const { ok, output } = shell(`npx supabase db dump ${schemaFlag} --project-ref ${PROJECT_REF} -f "${outputPath}"`, 180_000);
|
|
86
|
+
if (!ok) {
|
|
87
|
+
// Fallback: try pg_dump via DATABASE_URL
|
|
88
|
+
const dbUrl = process.env.SUPABASE_DB_URL || process.env.DATABASE_URL;
|
|
89
|
+
if (dbUrl) {
|
|
90
|
+
const { ok: pgOk, output: pgOut } = shell(`pg_dump "${dbUrl}" ${schemaFlag ? '--schema-only' : ''} > "${outputPath}"`, 180_000);
|
|
91
|
+
if (pgOk)
|
|
92
|
+
return `✓ Backup saved to ${outputPath} (via pg_dump)`;
|
|
93
|
+
return `Error: both supabase db dump and pg_dump failed.\n\nSupabase: ${output}\npg_dump: ${pgOut}`;
|
|
94
|
+
}
|
|
95
|
+
return `Error: ${output}\n\nTip: Set DATABASE_URL or SUPABASE_DB_URL for pg_dump fallback.`;
|
|
96
|
+
}
|
|
97
|
+
return `✓ Backup saved to ${outputPath}`;
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
count++;
|
|
101
|
+
registerTool({
|
|
102
|
+
name: 'db_tables',
|
|
103
|
+
description: 'List all database tables with row counts and size estimates.',
|
|
104
|
+
parameters: {},
|
|
105
|
+
tier: 'pro',
|
|
106
|
+
execute: async () => {
|
|
107
|
+
// Query via Supabase REST - list known tables
|
|
108
|
+
const knownTables = [
|
|
109
|
+
'users', 'subscriptions', 'user_memory', 'conversations', 'messages',
|
|
110
|
+
'audit_log', 'message_states', 'moderation_queue', 'usage_costs',
|
|
111
|
+
'notifications', 'shared_conversations', 'feedback', 'tasks',
|
|
112
|
+
];
|
|
113
|
+
const results = [];
|
|
114
|
+
for (const table of knownTables) {
|
|
115
|
+
try {
|
|
116
|
+
const raw = supabaseQuery(table, 'select=id&limit=0');
|
|
117
|
+
// If we get an array back, table exists
|
|
118
|
+
const parsed = JSON.parse(raw);
|
|
119
|
+
// Try to get count
|
|
120
|
+
const countRaw = supabaseQuery(table, 'select=count&limit=1');
|
|
121
|
+
let rowCount = 'exists';
|
|
122
|
+
try {
|
|
123
|
+
const rows = JSON.parse(countRaw);
|
|
124
|
+
rowCount = Array.isArray(rows) ? String(rows.length) : 'exists';
|
|
125
|
+
}
|
|
126
|
+
catch { /* */ }
|
|
127
|
+
results.push({ table, rows: rowCount, status: '✓' });
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
results.push({ table, rows: '-', status: '✗ not found' });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Also check via information_schema RPC if available
|
|
134
|
+
try {
|
|
135
|
+
const raw = supabaseRpc('get_table_sizes');
|
|
136
|
+
const sizes = JSON.parse(raw);
|
|
137
|
+
return `── Database Tables ──\n\n` +
|
|
138
|
+
` ${'TABLE'.padEnd(30)} ${'ROWS'.padStart(8)} ${'SIZE'.padStart(10)}\n` +
|
|
139
|
+
` ${'─'.repeat(50)}\n` +
|
|
140
|
+
sizes.map(s => ` ${s.table_name.padEnd(30)} ${String(Math.round(s.row_estimate)).padStart(8)} ${s.total_size.padStart(10)}`).join('\n');
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Fallback: use the REST API probing results
|
|
144
|
+
return `── Database Tables ──\n\n` +
|
|
145
|
+
` ${'TABLE'.padEnd(30)} ${'STATUS'.padEnd(15)} ROWS\n` +
|
|
146
|
+
` ${'─'.repeat(50)}\n` +
|
|
147
|
+
results.map(r => ` ${r.table.padEnd(30)} ${r.status.padEnd(15)} ${r.rows}`).join('\n') +
|
|
148
|
+
`\n\n Tip: Create get_table_sizes() RPC for accurate counts.`;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
count++;
|
|
153
|
+
registerTool({
|
|
154
|
+
name: 'db_inspect',
|
|
155
|
+
description: 'Inspect a table: show columns, types, constraints, and sample rows.',
|
|
156
|
+
parameters: {
|
|
157
|
+
table: { type: 'string', description: 'Table name', required: true },
|
|
158
|
+
sample: { type: 'string', description: 'Number of sample rows (default: 5)', default: '5' },
|
|
159
|
+
},
|
|
160
|
+
tier: 'pro',
|
|
161
|
+
execute: async (args) => {
|
|
162
|
+
const table = String(args.table);
|
|
163
|
+
const sampleSize = parseInt(String(args.sample || '5'));
|
|
164
|
+
// Get sample data (which also reveals column structure)
|
|
165
|
+
const raw = supabaseQuery(table, `select=*&limit=${sampleSize}&order=created_at.desc`);
|
|
166
|
+
let rows;
|
|
167
|
+
try {
|
|
168
|
+
rows = JSON.parse(raw);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return `Error accessing table "${table}": ${raw}`;
|
|
172
|
+
}
|
|
173
|
+
if (!rows.length)
|
|
174
|
+
return `Table "${table}" exists but is empty.`;
|
|
175
|
+
// Infer columns from first row
|
|
176
|
+
const columns = Object.keys(rows[0]);
|
|
177
|
+
const types = columns.map(col => {
|
|
178
|
+
const val = rows[0][col];
|
|
179
|
+
if (val === null)
|
|
180
|
+
return 'nullable';
|
|
181
|
+
if (typeof val === 'number')
|
|
182
|
+
return Number.isInteger(val) ? 'integer' : 'numeric';
|
|
183
|
+
if (typeof val === 'boolean')
|
|
184
|
+
return 'boolean';
|
|
185
|
+
if (typeof val === 'string') {
|
|
186
|
+
if (/^\d{4}-\d{2}-\d{2}/.test(val))
|
|
187
|
+
return 'timestamp';
|
|
188
|
+
if (/^[0-9a-f]{8}-/.test(val))
|
|
189
|
+
return 'uuid';
|
|
190
|
+
return val.length > 100 ? 'text' : 'varchar';
|
|
191
|
+
}
|
|
192
|
+
if (typeof val === 'object')
|
|
193
|
+
return 'jsonb';
|
|
194
|
+
return typeof val;
|
|
195
|
+
});
|
|
196
|
+
let output = `── Table: ${table} ──\n\n`;
|
|
197
|
+
output += ` Columns (${columns.length}):\n`;
|
|
198
|
+
for (let i = 0; i < columns.length; i++) {
|
|
199
|
+
output += ` ${columns[i].padEnd(30)} ${types[i]}\n`;
|
|
200
|
+
}
|
|
201
|
+
output += `\n Sample rows (${Math.min(sampleSize, rows.length)}):\n`;
|
|
202
|
+
// Show compact version of each row
|
|
203
|
+
for (const row of rows) {
|
|
204
|
+
const compact = columns.map(col => {
|
|
205
|
+
const val = row[col];
|
|
206
|
+
if (val === null)
|
|
207
|
+
return 'null';
|
|
208
|
+
const str = String(val);
|
|
209
|
+
return str.length > 30 ? str.slice(0, 27) + '...' : str;
|
|
210
|
+
});
|
|
211
|
+
output += ` ${compact.join(' | ')}\n`;
|
|
212
|
+
}
|
|
213
|
+
return output;
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
count++;
|
|
217
|
+
registerTool({
|
|
218
|
+
name: 'db_sql',
|
|
219
|
+
description: 'Run a raw SQL query via Supabase RPC. Read-only queries recommended.',
|
|
220
|
+
parameters: {
|
|
221
|
+
query: { type: 'string', description: 'SQL query to execute', required: true },
|
|
222
|
+
},
|
|
223
|
+
tier: 'enterprise',
|
|
224
|
+
execute: async (args) => {
|
|
225
|
+
const query = String(args.query);
|
|
226
|
+
// Safety: warn on destructive queries
|
|
227
|
+
const lower = query.toLowerCase().trim();
|
|
228
|
+
if (lower.startsWith('drop') || lower.startsWith('truncate') || lower.startsWith('delete')) {
|
|
229
|
+
return '⚠ Destructive query blocked. Use the Supabase dashboard for DROP/TRUNCATE/DELETE operations.';
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
const result = supabaseRpc('run_sql', { sql: query });
|
|
233
|
+
const parsed = JSON.parse(result);
|
|
234
|
+
if (Array.isArray(parsed) && parsed.length) {
|
|
235
|
+
const cols = Object.keys(parsed[0]);
|
|
236
|
+
const header = cols.map(c => c.padEnd(20)).join(' ');
|
|
237
|
+
const sep = cols.map(() => '─'.repeat(20)).join('──');
|
|
238
|
+
const body = parsed.slice(0, 50).map((row) => cols.map(c => String(row[c] ?? 'null').slice(0, 20).padEnd(20)).join(' ')).join('\n');
|
|
239
|
+
return `${header}\n${sep}\n${body}` +
|
|
240
|
+
(parsed.length > 50 ? `\n\n... ${parsed.length - 50} more rows` : '') +
|
|
241
|
+
`\n\n${parsed.length} row(s)`;
|
|
242
|
+
}
|
|
243
|
+
return `Query executed. Result:\n${JSON.stringify(parsed, null, 2).slice(0, 2000)}`;
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
// Fallback: the run_sql RPC may not exist
|
|
247
|
+
return `Error: ${e.message}\n\nTip: Create a run_sql(sql text) function in Supabase, or use:\n npx supabase db query --project-ref ${PROJECT_REF}`;
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
count++;
|
|
252
|
+
registerTool({
|
|
253
|
+
name: 'db_migrations',
|
|
254
|
+
description: 'List database migrations and their status. Can also run pending migrations.',
|
|
255
|
+
parameters: {
|
|
256
|
+
action: { type: 'string', description: 'Action: "list", "run", "new"', default: 'list' },
|
|
257
|
+
name: { type: 'string', description: 'Migration name (for "new" action)' },
|
|
258
|
+
},
|
|
259
|
+
tier: 'enterprise',
|
|
260
|
+
execute: async (args) => {
|
|
261
|
+
const root = findProjectRoot();
|
|
262
|
+
const action = String(args.action || 'list');
|
|
263
|
+
const migrationsDir = join(root, 'supabase', 'migrations');
|
|
264
|
+
switch (action) {
|
|
265
|
+
case 'list': {
|
|
266
|
+
if (!existsSync(migrationsDir))
|
|
267
|
+
return 'No migrations directory found at supabase/migrations/';
|
|
268
|
+
// List local migration files
|
|
269
|
+
const { ok, output } = shell(`ls -1 "${migrationsDir}" | sort`, 10_000);
|
|
270
|
+
if (!ok)
|
|
271
|
+
return `Error listing migrations: ${output}`;
|
|
272
|
+
const files = output.split('\n').filter(f => f.endsWith('.sql'));
|
|
273
|
+
// Check remote status
|
|
274
|
+
const { ok: remoteOk, output: remoteOut } = shell(`npx supabase migration list --project-ref ${PROJECT_REF}`, 30_000);
|
|
275
|
+
return [
|
|
276
|
+
`── Local Migrations (${files.length}) ──`,
|
|
277
|
+
files.map(f => ` ${f}`).join('\n'),
|
|
278
|
+
'',
|
|
279
|
+
remoteOk ? `── Remote Status ──\n${remoteOut}` : '── Remote ──\n Could not fetch (run: npx supabase login)',
|
|
280
|
+
].join('\n');
|
|
281
|
+
}
|
|
282
|
+
case 'run': {
|
|
283
|
+
const { ok, output } = shell(`npx supabase db push --project-ref ${PROJECT_REF}`, 120_000);
|
|
284
|
+
return ok
|
|
285
|
+
? `✓ Migrations applied:\n${output}`
|
|
286
|
+
: `Error applying migrations: ${output}`;
|
|
287
|
+
}
|
|
288
|
+
case 'new': {
|
|
289
|
+
const name = String(args.name || 'unnamed');
|
|
290
|
+
const { ok, output } = shell(`npx supabase migration new "${name}"`, 10_000);
|
|
291
|
+
return ok
|
|
292
|
+
? `✓ Created migration: ${output}\n\nEdit the file, then run: kbot db migrations --action run`
|
|
293
|
+
: `Error: ${output}`;
|
|
294
|
+
}
|
|
295
|
+
default:
|
|
296
|
+
return `Unknown action: ${action}. Options: list, run, new`;
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
count++;
|
|
301
|
+
registerTool({
|
|
302
|
+
name: 'db_health',
|
|
303
|
+
description: 'Database health check: size, connection count, replication lag, slow queries.',
|
|
304
|
+
parameters: {},
|
|
305
|
+
tier: 'enterprise',
|
|
306
|
+
execute: async () => {
|
|
307
|
+
const sections = [];
|
|
308
|
+
// Try to get DB stats via RPC
|
|
309
|
+
try {
|
|
310
|
+
const raw = supabaseRpc('get_db_health');
|
|
311
|
+
const health = JSON.parse(raw);
|
|
312
|
+
sections.push([
|
|
313
|
+
`── Database Health ──`,
|
|
314
|
+
` Size: ${health.db_size || 'unknown'}`,
|
|
315
|
+
` Connections: ${health.active_connections || 'unknown'} / ${health.max_connections || 'unknown'}`,
|
|
316
|
+
` Cache hit: ${health.cache_hit_ratio || 'unknown'}`,
|
|
317
|
+
` Uptime: ${health.uptime || 'unknown'}`,
|
|
318
|
+
].join('\n'));
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// Fallback: basic connectivity check
|
|
322
|
+
const url = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL || '';
|
|
323
|
+
const start = Date.now();
|
|
324
|
+
try {
|
|
325
|
+
supabaseQuery('users', 'select=id&limit=1');
|
|
326
|
+
sections.push([
|
|
327
|
+
`── Database Health ──`,
|
|
328
|
+
` Status: ✓ Connected`,
|
|
329
|
+
` Latency: ${Date.now() - start}ms`,
|
|
330
|
+
` Note: Create get_db_health() RPC for detailed metrics`,
|
|
331
|
+
].join('\n'));
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
sections.push(`── Database Health ──\n Status: ✗ Connection failed`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Check edge function health
|
|
338
|
+
const url = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL || '';
|
|
339
|
+
if (url) {
|
|
340
|
+
const start = Date.now();
|
|
341
|
+
try {
|
|
342
|
+
execSync(`curl -sS -o /dev/null -w "%{http_code}" --max-time 5 "${url}/rest/v1/"`, {
|
|
343
|
+
encoding: 'utf-8', timeout: 10_000,
|
|
344
|
+
});
|
|
345
|
+
sections.push(`── REST API ──\n Status: ✓ UP (${Date.now() - start}ms)`);
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
sections.push(`── REST API ──\n Status: ✗ DOWN`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Check recent errors
|
|
352
|
+
try {
|
|
353
|
+
const raw = supabaseQuery('audit_log', `select=id&status=eq.error&created_at=gte.${new Date(Date.now() - 3600_000).toISOString()}&limit=100`);
|
|
354
|
+
const errors = JSON.parse(raw);
|
|
355
|
+
sections.push(`── Errors (1h) ──\n Count: ${errors.length}${errors.length > 10 ? ' ⚠ HIGH' : ''}`);
|
|
356
|
+
}
|
|
357
|
+
catch { /* */ }
|
|
358
|
+
return sections.join('\n\n');
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
count++;
|
|
362
|
+
return count;
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=db-admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-admin.js","sourceRoot":"","sources":["../../src/tools/db-admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-all.d.ts","sourceRoot":"","sources":["../../src/tools/deploy-all.ts"],"names":[],"mappings":"AAwFA,wBAAgB,sBAAsB,IAAI,MAAM,CAiN/C"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// kbot Deploy-All — Single command to ship everything
|
|
2
|
+
//
|
|
3
|
+
// Commands:
|
|
4
|
+
// deploy_all — Build web + deploy GH Pages + edge functions + npm + GitHub release
|
|
5
|
+
// deploy_web — Build and deploy web to GitHub Pages
|
|
6
|
+
// deploy_functions — Deploy all Supabase edge functions
|
|
7
|
+
// deploy_npm — Build and publish kbot to npm
|
|
8
|
+
// deploy_release — Create GitHub release from latest tag
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { registerTool } from './index.js';
|
|
13
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
14
|
+
function shell(cmd, cwd, timeout = 120_000) {
|
|
15
|
+
try {
|
|
16
|
+
const output = execSync(cmd, {
|
|
17
|
+
encoding: 'utf-8', cwd, timeout,
|
|
18
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
19
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
20
|
+
}).trim();
|
|
21
|
+
return { ok: true, output };
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
const err = e;
|
|
25
|
+
return { ok: false, output: err.stderr || err.stdout || err.message || 'unknown error' };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function findProjectRoot() {
|
|
29
|
+
let dir = process.cwd();
|
|
30
|
+
for (let i = 0; i < 10; i++) {
|
|
31
|
+
if (existsSync(join(dir, 'packages', 'kbot', 'package.json')))
|
|
32
|
+
return dir;
|
|
33
|
+
if (existsSync(join(dir, 'package.json')) && existsSync(join(dir, 'supabase')))
|
|
34
|
+
return dir;
|
|
35
|
+
dir = join(dir, '..');
|
|
36
|
+
}
|
|
37
|
+
return process.cwd();
|
|
38
|
+
}
|
|
39
|
+
function getVersion(root) {
|
|
40
|
+
const pkg = join(root, 'packages', 'kbot', 'package.json');
|
|
41
|
+
if (existsSync(pkg)) {
|
|
42
|
+
return JSON.parse(readFileSync(pkg, 'utf-8')).version;
|
|
43
|
+
}
|
|
44
|
+
return 'unknown';
|
|
45
|
+
}
|
|
46
|
+
async function runStep(name, cmd, cwd, timeout = 120_000) {
|
|
47
|
+
const start = Date.now();
|
|
48
|
+
const result = shell(cmd, cwd, timeout);
|
|
49
|
+
return {
|
|
50
|
+
step: name,
|
|
51
|
+
ok: result.ok,
|
|
52
|
+
output: result.output.slice(0, 500),
|
|
53
|
+
duration: Date.now() - start,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function formatResults(results, title) {
|
|
57
|
+
const totalTime = results.reduce((sum, r) => sum + r.duration, 0);
|
|
58
|
+
const passed = results.filter(r => r.ok).length;
|
|
59
|
+
const failed = results.filter(r => !r.ok).length;
|
|
60
|
+
const lines = results.map(r => {
|
|
61
|
+
const icon = r.ok ? '✓' : '✗';
|
|
62
|
+
const time = `${(r.duration / 1000).toFixed(1)}s`;
|
|
63
|
+
const detail = r.ok ? '' : `\n ${r.output.split('\n')[0]}`;
|
|
64
|
+
return ` ${icon} ${r.step.padEnd(30)} ${time}${detail}`;
|
|
65
|
+
});
|
|
66
|
+
return [
|
|
67
|
+
`── ${title} ──`,
|
|
68
|
+
` ${passed} passed / ${failed} failed / ${(totalTime / 1000).toFixed(1)}s total`,
|
|
69
|
+
``,
|
|
70
|
+
...lines,
|
|
71
|
+
].join('\n');
|
|
72
|
+
}
|
|
73
|
+
// ── Tools ────────────────────────────────────────────────────────────
|
|
74
|
+
export function registerDeployAllTools() {
|
|
75
|
+
let count = 0;
|
|
76
|
+
registerTool({
|
|
77
|
+
name: 'deploy_all',
|
|
78
|
+
description: 'Ship everything: type-check → build web → deploy GH Pages → deploy edge functions → publish npm → create GitHub release. Stops on first failure.',
|
|
79
|
+
parameters: {
|
|
80
|
+
skip: { type: 'string', description: 'Comma-separated steps to skip: "web", "functions", "npm", "release"' },
|
|
81
|
+
dry_run: { type: 'string', description: 'If "true", show what would happen without executing' },
|
|
82
|
+
},
|
|
83
|
+
tier: 'enterprise',
|
|
84
|
+
execute: async (args) => {
|
|
85
|
+
const root = findProjectRoot();
|
|
86
|
+
const kbotDir = join(root, 'packages', 'kbot');
|
|
87
|
+
const version = getVersion(root);
|
|
88
|
+
const skip = new Set(String(args.skip || '').split(',').map(s => s.trim()));
|
|
89
|
+
const dryRun = String(args.dry_run) === 'true';
|
|
90
|
+
if (dryRun) {
|
|
91
|
+
const steps = [
|
|
92
|
+
!skip.has('typecheck') && '1. Type-check (tsc --noEmit)',
|
|
93
|
+
!skip.has('web') && '2. Build web (npm run build)',
|
|
94
|
+
!skip.has('web') && '3. Deploy web (gh-pages)',
|
|
95
|
+
!skip.has('functions') && '4. Deploy edge functions (supabase functions deploy)',
|
|
96
|
+
!skip.has('npm') && '5. Publish npm (@kernel.chat/kbot)',
|
|
97
|
+
!skip.has('release') && '6. Create GitHub release (v' + version + ')',
|
|
98
|
+
].filter(Boolean);
|
|
99
|
+
return `── Dry Run: deploy_all v${version} ──\n\n${steps.join('\n')}\n\nUse without dry_run to execute.`;
|
|
100
|
+
}
|
|
101
|
+
const results = [];
|
|
102
|
+
// 1. Type-check
|
|
103
|
+
if (!skip.has('typecheck')) {
|
|
104
|
+
const r = await runStep('Type-check (kbot)', 'npx tsc --noEmit', kbotDir, 180_000);
|
|
105
|
+
results.push(r);
|
|
106
|
+
if (!r.ok)
|
|
107
|
+
return formatResults(results, `Deploy FAILED at type-check v${version}`);
|
|
108
|
+
}
|
|
109
|
+
// 2. Build web
|
|
110
|
+
if (!skip.has('web')) {
|
|
111
|
+
const r = await runStep('Build web', 'npm run build', root, 180_000);
|
|
112
|
+
results.push(r);
|
|
113
|
+
if (!r.ok)
|
|
114
|
+
return formatResults(results, `Deploy FAILED at web build v${version}`);
|
|
115
|
+
}
|
|
116
|
+
// 3. Deploy web to GH Pages
|
|
117
|
+
if (!skip.has('web')) {
|
|
118
|
+
const r = await runStep('Deploy GH Pages', 'npm run deploy', root, 180_000);
|
|
119
|
+
results.push(r);
|
|
120
|
+
if (!r.ok)
|
|
121
|
+
return formatResults(results, `Deploy FAILED at GH Pages v${version}`);
|
|
122
|
+
}
|
|
123
|
+
// 4. Deploy edge functions
|
|
124
|
+
if (!skip.has('functions')) {
|
|
125
|
+
const projectRef = 'eoxxpyixdieprsxlpwcs';
|
|
126
|
+
const functionsDir = join(root, 'supabase', 'functions');
|
|
127
|
+
if (existsSync(functionsDir)) {
|
|
128
|
+
// Get list of functions
|
|
129
|
+
const functions = ['claude-proxy', 'web-search', 'create-checkout', 'stripe-webhook',
|
|
130
|
+
'evaluate-chat', 'extract-insights', 'send-inquiry-email', 'create-portal',
|
|
131
|
+
'url-fetch', 'notify-webhook', 'delete-account', 'shared-conversation',
|
|
132
|
+
'task-scheduler', 'send-notification', 'send-announcement', 'import-conversation'];
|
|
133
|
+
for (const fn of functions) {
|
|
134
|
+
if (existsSync(join(functionsDir, fn))) {
|
|
135
|
+
const r = await runStep(`Deploy fn: ${fn}`, `npx supabase functions deploy ${fn} --project-ref ${projectRef}`, root, 60_000);
|
|
136
|
+
results.push(r);
|
|
137
|
+
// Don't stop on individual function failures
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// 5. Publish npm
|
|
143
|
+
if (!skip.has('npm')) {
|
|
144
|
+
const buildR = await runStep('Build kbot', 'npm run build', kbotDir, 120_000);
|
|
145
|
+
results.push(buildR);
|
|
146
|
+
if (buildR.ok) {
|
|
147
|
+
const pubR = await runStep('Publish npm', 'npm publish --access public', kbotDir, 60_000);
|
|
148
|
+
results.push(pubR);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// 6. GitHub release
|
|
152
|
+
if (!skip.has('release')) {
|
|
153
|
+
const tag = `v${version}`;
|
|
154
|
+
const r = await runStep('GitHub release', `gh release create "${tag}" --title "kbot ${tag}" --notes "Release ${tag}" --target main`, root, 30_000);
|
|
155
|
+
results.push(r);
|
|
156
|
+
}
|
|
157
|
+
return formatResults(results, `Deploy Complete v${version}`);
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
count++;
|
|
161
|
+
registerTool({
|
|
162
|
+
name: 'deploy_web',
|
|
163
|
+
description: 'Build and deploy the kernel.chat web companion to GitHub Pages.',
|
|
164
|
+
parameters: {},
|
|
165
|
+
tier: 'pro',
|
|
166
|
+
execute: async () => {
|
|
167
|
+
const root = findProjectRoot();
|
|
168
|
+
const results = [];
|
|
169
|
+
results.push(await runStep('Build', 'npm run build', root, 180_000));
|
|
170
|
+
if (!results[0].ok)
|
|
171
|
+
return formatResults(results, 'Web Deploy FAILED');
|
|
172
|
+
results.push(await runStep('Deploy', 'npm run deploy', root, 180_000));
|
|
173
|
+
return formatResults(results, 'Web Deploy');
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
count++;
|
|
177
|
+
registerTool({
|
|
178
|
+
name: 'deploy_functions',
|
|
179
|
+
description: 'Deploy all Supabase edge functions to production.',
|
|
180
|
+
parameters: {
|
|
181
|
+
function_name: { type: 'string', description: 'Deploy specific function only (optional)' },
|
|
182
|
+
},
|
|
183
|
+
tier: 'enterprise',
|
|
184
|
+
execute: async (args) => {
|
|
185
|
+
const root = findProjectRoot();
|
|
186
|
+
const projectRef = 'eoxxpyixdieprsxlpwcs';
|
|
187
|
+
const functionsDir = join(root, 'supabase', 'functions');
|
|
188
|
+
const results = [];
|
|
189
|
+
if (args.function_name) {
|
|
190
|
+
const fn = String(args.function_name);
|
|
191
|
+
results.push(await runStep(`Deploy ${fn}`, `npx supabase functions deploy ${fn} --project-ref ${projectRef}`, root, 60_000));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Deploy all
|
|
195
|
+
const functions = ['claude-proxy', 'web-search', 'create-checkout', 'stripe-webhook',
|
|
196
|
+
'evaluate-chat', 'extract-insights', 'send-inquiry-email', 'create-portal',
|
|
197
|
+
'url-fetch', 'notify-webhook', 'delete-account', 'shared-conversation',
|
|
198
|
+
'task-scheduler', 'send-notification', 'send-announcement', 'import-conversation'];
|
|
199
|
+
for (const fn of functions) {
|
|
200
|
+
if (existsSync(join(functionsDir, fn))) {
|
|
201
|
+
results.push(await runStep(fn, `npx supabase functions deploy ${fn} --project-ref ${projectRef}`, root, 60_000));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return formatResults(results, 'Edge Functions Deploy');
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
count++;
|
|
209
|
+
registerTool({
|
|
210
|
+
name: 'deploy_npm',
|
|
211
|
+
description: 'Build and publish @kernel.chat/kbot to npm.',
|
|
212
|
+
parameters: {
|
|
213
|
+
dry_run: { type: 'string', description: 'If "true", build but do not publish' },
|
|
214
|
+
},
|
|
215
|
+
tier: 'enterprise',
|
|
216
|
+
execute: async (args) => {
|
|
217
|
+
const root = findProjectRoot();
|
|
218
|
+
const kbotDir = join(root, 'packages', 'kbot');
|
|
219
|
+
const version = getVersion(root);
|
|
220
|
+
const results = [];
|
|
221
|
+
results.push(await runStep('Type-check', 'npx tsc --noEmit', kbotDir, 180_000));
|
|
222
|
+
if (!results[0].ok)
|
|
223
|
+
return formatResults(results, `npm Publish FAILED v${version}`);
|
|
224
|
+
results.push(await runStep('Build', 'npm run build', kbotDir, 120_000));
|
|
225
|
+
if (!results[1].ok)
|
|
226
|
+
return formatResults(results, `npm Publish FAILED v${version}`);
|
|
227
|
+
if (String(args.dry_run) === 'true') {
|
|
228
|
+
results.push({ step: 'Publish (dry run)', ok: true, output: 'Skipped — dry run', duration: 0 });
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
results.push(await runStep('Publish', 'npm publish --access public', kbotDir, 60_000));
|
|
232
|
+
}
|
|
233
|
+
return formatResults(results, `npm Publish v${version}`);
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
count++;
|
|
237
|
+
registerTool({
|
|
238
|
+
name: 'deploy_release',
|
|
239
|
+
description: 'Create a GitHub release for the current kbot version.',
|
|
240
|
+
parameters: {
|
|
241
|
+
notes: { type: 'string', description: 'Release notes (optional — auto-generated from git log if empty)' },
|
|
242
|
+
},
|
|
243
|
+
tier: 'enterprise',
|
|
244
|
+
execute: async (args) => {
|
|
245
|
+
const root = findProjectRoot();
|
|
246
|
+
const version = getVersion(root);
|
|
247
|
+
const tag = `v${version}`;
|
|
248
|
+
let notes = String(args.notes || '');
|
|
249
|
+
if (!notes) {
|
|
250
|
+
// Auto-generate from recent commits
|
|
251
|
+
const { ok, output } = shell('git log --oneline -10', root);
|
|
252
|
+
notes = ok ? `Release ${tag}\n\nRecent changes:\n${output}` : `Release ${tag}`;
|
|
253
|
+
}
|
|
254
|
+
const result = await runStep('Create release', `gh release create "${tag}" --title "kbot ${tag}" --notes "${notes.replace(/"/g, '\\"')}" --target main`, root, 30_000);
|
|
255
|
+
return formatResults([result], `GitHub Release ${tag}`);
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
count++;
|
|
259
|
+
return count;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=deploy-all.js.map
|