@taskcast/cli 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +15 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/doctor.d.ts +23 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +95 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/logs.d.ts +11 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +171 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +84 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/node.d.ts +5 -0
- package/dist/commands/node.d.ts.map +1 -0
- package/dist/commands/node.js +57 -0
- package/dist/commands/node.js.map +1 -0
- package/dist/commands/ping.d.ts +9 -0
- package/dist/commands/ping.d.ts.map +1 -0
- package/dist/commands/ping.js +43 -0
- package/dist/commands/ping.js.map +1 -0
- package/dist/commands/playground.d.ts +3 -0
- package/dist/commands/playground.d.ts.map +1 -0
- package/dist/commands/playground.js +37 -0
- package/dist/commands/playground.js.map +1 -0
- package/dist/commands/service.d.ts +8 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +237 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +145 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/tasks.d.ts +11 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +129 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/ui.d.ts +3 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +103 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/index.js +41 -413
- package/dist/index.js.map +1 -1
- package/dist/node-config.d.ts +22 -0
- package/dist/node-config.d.ts.map +1 -0
- package/dist/node-config.js +71 -0
- package/dist/node-config.js.map +1 -0
- package/dist/service/interface.d.ts +26 -0
- package/dist/service/interface.d.ts.map +1 -0
- package/dist/service/interface.js +3 -0
- package/dist/service/interface.js.map +1 -0
- package/dist/service/launchd.d.ts +11 -0
- package/dist/service/launchd.d.ts.map +1 -0
- package/dist/service/launchd.js +97 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/paths.d.ts +12 -0
- package/dist/service/paths.d.ts.map +1 -0
- package/dist/service/paths.js +35 -0
- package/dist/service/paths.js.map +1 -0
- package/dist/service/resolve.d.ts +3 -0
- package/dist/service/resolve.d.ts.map +1 -0
- package/dist/service/resolve.js +10 -0
- package/dist/service/resolve.js.map +1 -0
- package/dist/service/systemd.d.ts +11 -0
- package/dist/service/systemd.d.ts.map +1 -0
- package/dist/service/systemd.js +86 -0
- package/dist/service/systemd.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +65 -0
- package/dist/utils.js.map +1 -0
- package/package.json +9 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgHxD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export function registerUiCommand(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('ui')
|
|
4
|
+
.alias('dashboard')
|
|
5
|
+
.description('Start the Taskcast Dashboard web UI')
|
|
6
|
+
.option('-p, --port <port>', 'Dashboard port', '3722')
|
|
7
|
+
.option('-s, --server <url>', 'Taskcast server URL', 'http://localhost:3721')
|
|
8
|
+
.option('--admin-token <token>', 'Admin token for auto-connect')
|
|
9
|
+
.action(async (opts) => {
|
|
10
|
+
const { dashboardDistPath } = await import('@taskcast/dashboard-web/dist-path');
|
|
11
|
+
const { Hono } = await import('hono');
|
|
12
|
+
const { serve } = await import('@hono/node-server');
|
|
13
|
+
const { existsSync, readFileSync, statSync } = await import('fs');
|
|
14
|
+
const { join: joinPath, extname, resolve: resolvePath } = await import('path');
|
|
15
|
+
if (!existsSync(dashboardDistPath)) {
|
|
16
|
+
console.error('[taskcast] Dashboard not built. Run: pnpm --filter @taskcast/dashboard-web build');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
// Exchange admin token for JWT at startup (never expose raw token to browser)
|
|
20
|
+
let dashboardJwt;
|
|
21
|
+
if (opts.adminToken) {
|
|
22
|
+
try {
|
|
23
|
+
const tokenRes = await fetch(`${opts.server}/admin/token`, {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: { 'Content-Type': 'application/json' },
|
|
26
|
+
body: JSON.stringify({ adminToken: opts.adminToken }),
|
|
27
|
+
});
|
|
28
|
+
if (tokenRes.ok) {
|
|
29
|
+
const { token } = await tokenRes.json();
|
|
30
|
+
dashboardJwt = token;
|
|
31
|
+
}
|
|
32
|
+
else if (tokenRes.status === 404) {
|
|
33
|
+
// Admin API not enabled — server may be in auth: none mode
|
|
34
|
+
console.log('[taskcast] Admin API not enabled, connecting without JWT');
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.error(`[taskcast] Failed to exchange admin token: ${tokenRes.status}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.error(`[taskcast] Cannot reach server at ${opts.server}: ${err instanceof Error ? err.message : err}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const MIME_TYPES = {
|
|
47
|
+
'.html': 'text/html',
|
|
48
|
+
'.js': 'application/javascript',
|
|
49
|
+
'.css': 'text/css',
|
|
50
|
+
'.json': 'application/json',
|
|
51
|
+
'.png': 'image/png',
|
|
52
|
+
'.jpg': 'image/jpeg',
|
|
53
|
+
'.jpeg': 'image/jpeg',
|
|
54
|
+
'.gif': 'image/gif',
|
|
55
|
+
'.svg': 'image/svg+xml',
|
|
56
|
+
'.ico': 'image/x-icon',
|
|
57
|
+
'.woff': 'font/woff',
|
|
58
|
+
'.woff2': 'font/woff2',
|
|
59
|
+
'.ttf': 'font/ttf',
|
|
60
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
61
|
+
'.map': 'application/json',
|
|
62
|
+
};
|
|
63
|
+
const app = new Hono();
|
|
64
|
+
// Auto-connect config endpoint (never exposes admin token — only pre-exchanged JWT)
|
|
65
|
+
app.get('/api/config', (c) => {
|
|
66
|
+
return c.json({
|
|
67
|
+
baseUrl: opts.server,
|
|
68
|
+
token: dashboardJwt,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
// Serve static dashboard files with SPA fallback
|
|
72
|
+
app.get('*', (c) => {
|
|
73
|
+
const urlPath = decodeURIComponent(new URL(c.req.url).pathname);
|
|
74
|
+
const resolved = resolvePath(joinPath(dashboardDistPath, urlPath));
|
|
75
|
+
// Path traversal protection: ensure resolved path stays within dashboard dist
|
|
76
|
+
if (!resolved.startsWith(dashboardDistPath)) {
|
|
77
|
+
return c.text('Not Found', 404);
|
|
78
|
+
}
|
|
79
|
+
let filePath = resolved;
|
|
80
|
+
// Try the exact file first, then fall back to index.html (SPA)
|
|
81
|
+
const isFile = existsSync(filePath) && statSync(filePath).isFile();
|
|
82
|
+
if (!isFile) {
|
|
83
|
+
filePath = joinPath(dashboardDistPath, 'index.html');
|
|
84
|
+
}
|
|
85
|
+
if (!existsSync(filePath)) {
|
|
86
|
+
return c.text('Not Found', 404);
|
|
87
|
+
}
|
|
88
|
+
const ext = extname(filePath);
|
|
89
|
+
const contentType = MIME_TYPES[ext] ?? 'application/octet-stream';
|
|
90
|
+
const body = readFileSync(filePath);
|
|
91
|
+
return c.body(body, 200, { 'Content-Type': contentType });
|
|
92
|
+
});
|
|
93
|
+
const port = Number(opts.port);
|
|
94
|
+
serve({ fetch: app.fetch, port }, () => {
|
|
95
|
+
console.log(`[taskcast] Dashboard running at http://localhost:${port}`);
|
|
96
|
+
console.log(`[taskcast] Connected to server: ${opts.server}`);
|
|
97
|
+
if (opts.adminToken) {
|
|
98
|
+
console.log(`[taskcast] Admin token provided for auto-connect`);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,424 +1,52 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Command } from 'commander';
|
|
3
|
-
import { Redis } from 'ioredis';
|
|
4
|
-
import postgres from 'postgres';
|
|
5
|
-
import { createInterface } from 'readline';
|
|
6
|
-
import { mkdirSync, writeFileSync, existsSync } from 'fs';
|
|
7
|
-
import { join, dirname } from 'path';
|
|
8
|
-
import { fileURLToPath } from 'url';
|
|
9
|
-
import { homedir } from 'os';
|
|
10
2
|
import { createRequire } from 'module';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# adapters:
|
|
26
|
-
# broadcast:
|
|
27
|
-
# provider: memory # memory | redis
|
|
28
|
-
# # url: redis://localhost:6379
|
|
29
|
-
# shortTermStore:
|
|
30
|
-
# provider: memory # memory | redis
|
|
31
|
-
# # url: redis://localhost:6379
|
|
32
|
-
# longTermStore:
|
|
33
|
-
# provider: postgres
|
|
34
|
-
# # url: postgresql://localhost:5432/taskcast
|
|
35
|
-
`;
|
|
36
|
-
async function promptCreateGlobalConfig() {
|
|
37
|
-
if (!process.stdin.isTTY)
|
|
38
|
-
return false;
|
|
39
|
-
const globalConfigPath = join(homedir(), '.taskcast', 'taskcast.config.yaml');
|
|
40
|
-
return new Promise((resolve) => {
|
|
41
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
42
|
-
rl.on('close', () => resolve(false));
|
|
43
|
-
rl.question(`[taskcast] No config file found.\n? Create a default config at ${globalConfigPath}? (Y/n) `, (answer) => {
|
|
44
|
-
const trimmed = answer.trim().toLowerCase();
|
|
45
|
-
resolve(trimmed === '' || trimmed === 'y' || trimmed === 'yes');
|
|
46
|
-
rl.close();
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
async function promptConfirm(message) {
|
|
51
|
-
if (!process.stdin.isTTY)
|
|
52
|
-
return false;
|
|
53
|
-
return new Promise((resolve) => {
|
|
54
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
55
|
-
rl.on('close', () => resolve(false));
|
|
56
|
-
rl.question(message, (answer) => {
|
|
57
|
-
const trimmed = answer.trim().toLowerCase();
|
|
58
|
-
resolve(trimmed === '' || trimmed === 'y' || trimmed === 'yes');
|
|
59
|
-
rl.close();
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
function createDefaultGlobalConfig() {
|
|
64
|
-
const globalDir = join(homedir(), '.taskcast');
|
|
65
|
-
const globalConfigPath = join(globalDir, 'taskcast.config.yaml');
|
|
66
|
-
try {
|
|
67
|
-
mkdirSync(globalDir, { recursive: true });
|
|
68
|
-
writeFileSync(globalConfigPath, DEFAULT_CONFIG_YAML);
|
|
69
|
-
console.log(`[taskcast] Created default config at ${globalConfigPath}`);
|
|
70
|
-
return globalConfigPath;
|
|
71
|
-
}
|
|
72
|
-
catch (err) {
|
|
73
|
-
console.warn(`[taskcast] Could not create config at ${globalConfigPath}: ${err.message}`);
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { registerStartCommand } from './commands/start.js';
|
|
5
|
+
import { registerMigrateCommand } from './commands/migrate.js';
|
|
6
|
+
import { registerPlaygroundCommand } from './commands/playground.js';
|
|
7
|
+
import { registerUiCommand } from './commands/ui.js';
|
|
8
|
+
import { registerNodeCommand } from './commands/node.js';
|
|
9
|
+
import { registerPingCommand } from './commands/ping.js';
|
|
10
|
+
import { registerDoctorCommand } from './commands/doctor.js';
|
|
11
|
+
import { registerLogsCommand, registerTailCommand } from './commands/logs.js';
|
|
12
|
+
import { registerTasksCommand } from './commands/tasks.js';
|
|
13
|
+
import { registerServiceCommand } from './commands/service.js';
|
|
14
|
+
const _require = createRequire(import.meta.url);
|
|
15
|
+
const { version } = _require('../package.json');
|
|
77
16
|
const program = new Command();
|
|
78
17
|
program
|
|
79
18
|
.name('taskcast')
|
|
80
19
|
.description('Taskcast — unified task tracking and streaming service')
|
|
81
|
-
.version(
|
|
82
|
-
program
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
const port = Number(options.port ?? fileConfig.port ?? 3721);
|
|
103
|
-
const redisUrl = process.env['TASKCAST_REDIS_URL'] ?? fileConfig.adapters?.broadcast?.url;
|
|
104
|
-
const postgresUrl = process.env['TASKCAST_POSTGRES_URL'] ?? fileConfig.adapters?.longTermStore?.url;
|
|
105
|
-
let shortTermStore;
|
|
106
|
-
let broadcast;
|
|
107
|
-
let longTermStore;
|
|
108
|
-
const storage = options.storage ?? process.env['TASKCAST_STORAGE'] ?? (redisUrl ? 'redis' : 'memory');
|
|
109
|
-
if (storage === 'sqlite') {
|
|
110
|
-
const sqliteOpts = options.dbPath ? { path: options.dbPath } : {};
|
|
111
|
-
const adapters = createSqliteAdapters(sqliteOpts);
|
|
112
|
-
broadcast = new MemoryBroadcastProvider();
|
|
113
|
-
shortTermStore = adapters.shortTermStore;
|
|
114
|
-
longTermStore = adapters.longTermStore;
|
|
115
|
-
console.log(`[taskcast] Using SQLite storage at ${options.dbPath ?? './taskcast.db'}`);
|
|
116
|
-
}
|
|
117
|
-
else if (storage === 'redis' || redisUrl) {
|
|
118
|
-
const pubClient = new Redis(redisUrl);
|
|
119
|
-
const subClient = new Redis(redisUrl);
|
|
120
|
-
const storeClient = new Redis(redisUrl);
|
|
121
|
-
const adapters = createRedisAdapters(pubClient, subClient, storeClient);
|
|
122
|
-
broadcast = adapters.broadcast;
|
|
123
|
-
shortTermStore = adapters.shortTermStore;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
console.warn('[taskcast] No TASKCAST_REDIS_URL configured — using in-memory adapters');
|
|
127
|
-
broadcast = new MemoryBroadcastProvider();
|
|
128
|
-
shortTermStore = new MemoryShortTermStore();
|
|
129
|
-
}
|
|
130
|
-
if (storage !== 'sqlite' && postgresUrl) {
|
|
131
|
-
const sql = postgres(postgresUrl);
|
|
132
|
-
longTermStore = new PostgresLongTermStore(sql);
|
|
133
|
-
}
|
|
134
|
-
const engineOpts = { shortTermStore, broadcast };
|
|
135
|
-
if (longTermStore !== undefined)
|
|
136
|
-
engineOpts.longTermStore = longTermStore;
|
|
137
|
-
const engine = new TaskEngine(engineOpts);
|
|
138
|
-
const authMode = (process.env['TASKCAST_AUTH_MODE'] ?? fileConfig.auth?.mode ?? 'none');
|
|
139
|
-
// Worker assignment system
|
|
140
|
-
const workersEnabled = fileConfig.workers?.enabled ?? false;
|
|
141
|
-
let workerManager;
|
|
142
|
-
if (workersEnabled) {
|
|
143
|
-
console.log('[taskcast] Worker assignment system enabled');
|
|
144
|
-
const wmOpts = {
|
|
145
|
-
engine,
|
|
146
|
-
shortTermStore,
|
|
147
|
-
broadcast,
|
|
148
|
-
};
|
|
149
|
-
if (longTermStore !== undefined)
|
|
150
|
-
wmOpts.longTermStore = longTermStore;
|
|
151
|
-
if (fileConfig.workers?.defaults)
|
|
152
|
-
wmOpts.defaults = fileConfig.workers.defaults;
|
|
153
|
-
workerManager = new WorkerManager(wmOpts);
|
|
154
|
-
}
|
|
155
|
-
// Resolve admin token (auto-generate + print if adminApi is enabled)
|
|
156
|
-
resolveAdminToken(fileConfig);
|
|
157
|
-
const serverOpts = {
|
|
158
|
-
engine,
|
|
159
|
-
shortTermStore,
|
|
160
|
-
auth: { mode: authMode },
|
|
161
|
-
config: fileConfig,
|
|
162
|
-
};
|
|
163
|
-
if (workerManager !== undefined)
|
|
164
|
-
serverOpts.workerManager = workerManager;
|
|
165
|
-
const { app, stop } = createTaskcastApp(serverOpts);
|
|
166
|
-
// Serve playground static files if --playground and dist exists
|
|
167
|
-
if (options.playground) {
|
|
168
|
-
try {
|
|
169
|
-
const require = createRequire(import.meta.url);
|
|
170
|
-
const pkgPath = require.resolve('@taskcast/playground/package.json');
|
|
171
|
-
const distDir = join(dirname(pkgPath), 'dist');
|
|
172
|
-
if (existsSync(distDir)) {
|
|
173
|
-
const { serveStatic } = await import('@hono/node-server/serve-static');
|
|
174
|
-
app.use('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: (p) => p.replace(/^\/_playground/, '') }));
|
|
175
|
-
// SPA fallback: serve index.html for non-asset paths
|
|
176
|
-
app.get('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: () => '/index.html' }));
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
console.warn('[taskcast] Playground dist not found. Run `pnpm --filter @taskcast/playground build` first.');
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
console.warn('[taskcast] @taskcast/playground not available, skipping playground UI.');
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
const { serve } = await import('@hono/node-server');
|
|
187
|
-
const server = serve({ fetch: app.fetch, port }, () => {
|
|
188
|
-
console.log(`[taskcast] Server started on http://localhost:${port}`);
|
|
189
|
-
if (options.playground) {
|
|
190
|
-
console.log(`[taskcast] Playground UI at http://localhost:${port}/_playground/`);
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
// Clean up scheduler/heartbeat on shutdown
|
|
194
|
-
process.on('SIGTERM', () => { stop(); server.close?.(); });
|
|
195
|
-
process.on('SIGINT', () => { stop(); server.close?.(); });
|
|
20
|
+
.version(version);
|
|
21
|
+
registerStartCommand(program);
|
|
22
|
+
registerMigrateCommand(program);
|
|
23
|
+
registerPlaygroundCommand(program);
|
|
24
|
+
registerUiCommand(program);
|
|
25
|
+
registerNodeCommand(program);
|
|
26
|
+
registerPingCommand(program);
|
|
27
|
+
registerDoctorCommand(program);
|
|
28
|
+
registerLogsCommand(program);
|
|
29
|
+
registerTailCommand(program);
|
|
30
|
+
registerTasksCommand(program);
|
|
31
|
+
registerServiceCommand(program);
|
|
32
|
+
// Backward-compat aliases for old daemon/stop/status placeholder commands
|
|
33
|
+
program.command('daemon').description('Alias for `taskcast service start`')
|
|
34
|
+
/* v8 ignore next 4 */
|
|
35
|
+
.action(async () => {
|
|
36
|
+
const { runServiceStart } = await import('./commands/service.js');
|
|
37
|
+
await runServiceStart();
|
|
196
38
|
});
|
|
197
|
-
program
|
|
198
|
-
|
|
199
|
-
.
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const port = Number(options.port);
|
|
203
|
-
try {
|
|
204
|
-
const require = createRequire(import.meta.url);
|
|
205
|
-
const pkgPath = require.resolve('@taskcast/playground/package.json');
|
|
206
|
-
const distDir = join(dirname(pkgPath), 'dist');
|
|
207
|
-
if (!existsSync(distDir)) {
|
|
208
|
-
console.error('[taskcast] Playground dist not found. Run `pnpm --filter @taskcast/playground build` first.');
|
|
209
|
-
process.exit(1);
|
|
210
|
-
}
|
|
211
|
-
const { OpenAPIHono } = await import('@hono/zod-openapi');
|
|
212
|
-
const app = new OpenAPIHono();
|
|
213
|
-
const { serveStatic } = await import('@hono/node-server/serve-static');
|
|
214
|
-
app.use('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: (p) => p.replace(/^\/_playground/, '') }));
|
|
215
|
-
app.get('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: () => '/index.html' }));
|
|
216
|
-
app.get('/', (c) => c.redirect('/_playground/'));
|
|
217
|
-
const { serve } = await import('@hono/node-server');
|
|
218
|
-
serve({ fetch: app.fetch, port }, () => {
|
|
219
|
-
console.log(`[taskcast] Playground UI at http://localhost:${port}/_playground/`);
|
|
220
|
-
console.log('[taskcast] Use "External" mode in the UI to connect to a remote server.');
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
console.error('[taskcast] @taskcast/playground not available.');
|
|
225
|
-
process.exit(1);
|
|
226
|
-
}
|
|
39
|
+
program.command('stop').description('Alias for `taskcast service stop`')
|
|
40
|
+
/* v8 ignore next 4 */
|
|
41
|
+
.action(async () => {
|
|
42
|
+
const { runServiceStop } = await import('./commands/service.js');
|
|
43
|
+
await runServiceStop();
|
|
227
44
|
});
|
|
228
|
-
program
|
|
229
|
-
|
|
230
|
-
.
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
.option('-s, --server <url>', 'Taskcast server URL', 'http://localhost:3721')
|
|
234
|
-
.option('--admin-token <token>', 'Admin token for auto-connect')
|
|
235
|
-
.action(async (opts) => {
|
|
236
|
-
const { dashboardDistPath } = await import('@taskcast/dashboard-web/dist-path');
|
|
237
|
-
const { Hono } = await import('hono');
|
|
238
|
-
const { serve } = await import('@hono/node-server');
|
|
239
|
-
const { existsSync, readFileSync, statSync } = await import('fs');
|
|
240
|
-
const { join: joinPath, extname, resolve: resolvePath } = await import('path');
|
|
241
|
-
if (!existsSync(dashboardDistPath)) {
|
|
242
|
-
console.error('[taskcast] Dashboard not built. Run: pnpm --filter @taskcast/dashboard-web build');
|
|
243
|
-
process.exit(1);
|
|
244
|
-
}
|
|
245
|
-
// Exchange admin token for JWT at startup (never expose raw token to browser)
|
|
246
|
-
let dashboardJwt;
|
|
247
|
-
if (opts.adminToken) {
|
|
248
|
-
try {
|
|
249
|
-
const tokenRes = await fetch(`${opts.server}/admin/token`, {
|
|
250
|
-
method: 'POST',
|
|
251
|
-
headers: { 'Content-Type': 'application/json' },
|
|
252
|
-
body: JSON.stringify({ adminToken: opts.adminToken }),
|
|
253
|
-
});
|
|
254
|
-
if (tokenRes.ok) {
|
|
255
|
-
const { token } = await tokenRes.json();
|
|
256
|
-
dashboardJwt = token;
|
|
257
|
-
}
|
|
258
|
-
else if (tokenRes.status === 404) {
|
|
259
|
-
// Admin API not enabled — server may be in auth: none mode
|
|
260
|
-
console.log('[taskcast] Admin API not enabled, connecting without JWT');
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
console.error(`[taskcast] Failed to exchange admin token: ${tokenRes.status}`);
|
|
264
|
-
process.exit(1);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
catch (err) {
|
|
268
|
-
console.error(`[taskcast] Cannot reach server at ${opts.server}: ${err instanceof Error ? err.message : err}`);
|
|
269
|
-
process.exit(1);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
const MIME_TYPES = {
|
|
273
|
-
'.html': 'text/html',
|
|
274
|
-
'.js': 'application/javascript',
|
|
275
|
-
'.css': 'text/css',
|
|
276
|
-
'.json': 'application/json',
|
|
277
|
-
'.png': 'image/png',
|
|
278
|
-
'.jpg': 'image/jpeg',
|
|
279
|
-
'.jpeg': 'image/jpeg',
|
|
280
|
-
'.gif': 'image/gif',
|
|
281
|
-
'.svg': 'image/svg+xml',
|
|
282
|
-
'.ico': 'image/x-icon',
|
|
283
|
-
'.woff': 'font/woff',
|
|
284
|
-
'.woff2': 'font/woff2',
|
|
285
|
-
'.ttf': 'font/ttf',
|
|
286
|
-
'.eot': 'application/vnd.ms-fontobject',
|
|
287
|
-
'.map': 'application/json',
|
|
288
|
-
};
|
|
289
|
-
const app = new Hono();
|
|
290
|
-
// Auto-connect config endpoint (never exposes admin token — only pre-exchanged JWT)
|
|
291
|
-
app.get('/api/config', (c) => {
|
|
292
|
-
return c.json({
|
|
293
|
-
baseUrl: opts.server,
|
|
294
|
-
token: dashboardJwt,
|
|
295
|
-
});
|
|
296
|
-
});
|
|
297
|
-
// Serve static dashboard files with SPA fallback
|
|
298
|
-
app.get('*', (c) => {
|
|
299
|
-
const urlPath = decodeURIComponent(new URL(c.req.url).pathname);
|
|
300
|
-
const resolved = resolvePath(joinPath(dashboardDistPath, urlPath));
|
|
301
|
-
// Path traversal protection: ensure resolved path stays within dashboard dist
|
|
302
|
-
if (!resolved.startsWith(dashboardDistPath)) {
|
|
303
|
-
return c.text('Not Found', 404);
|
|
304
|
-
}
|
|
305
|
-
let filePath = resolved;
|
|
306
|
-
// Try the exact file first, then fall back to index.html (SPA)
|
|
307
|
-
const isFile = existsSync(filePath) && statSync(filePath).isFile();
|
|
308
|
-
if (!isFile) {
|
|
309
|
-
filePath = joinPath(dashboardDistPath, 'index.html');
|
|
310
|
-
}
|
|
311
|
-
if (!existsSync(filePath)) {
|
|
312
|
-
return c.text('Not Found', 404);
|
|
313
|
-
}
|
|
314
|
-
const ext = extname(filePath);
|
|
315
|
-
const contentType = MIME_TYPES[ext] ?? 'application/octet-stream';
|
|
316
|
-
const body = readFileSync(filePath);
|
|
317
|
-
return c.body(body, 200, { 'Content-Type': contentType });
|
|
318
|
-
});
|
|
319
|
-
const port = Number(opts.port);
|
|
320
|
-
serve({ fetch: app.fetch, port }, () => {
|
|
321
|
-
console.log(`[taskcast] Dashboard running at http://localhost:${port}`);
|
|
322
|
-
console.log(`[taskcast] Connected to server: ${opts.server}`);
|
|
323
|
-
if (opts.adminToken) {
|
|
324
|
-
console.log(`[taskcast] Admin token provided for auto-connect`);
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
program
|
|
329
|
-
.command('daemon')
|
|
330
|
-
.description('Start the server as a background service (not yet implemented)')
|
|
331
|
-
.action(() => {
|
|
332
|
-
console.error('[taskcast] daemon mode is not yet implemented, use `taskcast start` for foreground mode');
|
|
333
|
-
process.exit(1);
|
|
334
|
-
});
|
|
335
|
-
program
|
|
336
|
-
.command('stop')
|
|
337
|
-
.description('Stop the background service (not yet implemented)')
|
|
338
|
-
.action(() => {
|
|
339
|
-
console.error('[taskcast] stop is not yet implemented');
|
|
340
|
-
process.exit(1);
|
|
341
|
-
});
|
|
342
|
-
program
|
|
343
|
-
.command('status')
|
|
344
|
-
.description('Show server status (not yet implemented)')
|
|
345
|
-
.action(() => {
|
|
346
|
-
console.error('[taskcast] status is not yet implemented');
|
|
347
|
-
process.exit(1);
|
|
348
|
-
});
|
|
349
|
-
program
|
|
350
|
-
.command('migrate')
|
|
351
|
-
.description('Run pending PostgreSQL migrations')
|
|
352
|
-
.option('--url <url>', 'Postgres connection URL (highest priority)')
|
|
353
|
-
.option('-c, --config <path>', 'config file path')
|
|
354
|
-
.option('-y, --yes', 'skip confirmation prompt')
|
|
355
|
-
.action(async (options) => {
|
|
356
|
-
// URL resolution priority: --url flag > env var > config file
|
|
357
|
-
const { config: fileConfig } = await loadConfigFile(options.config);
|
|
358
|
-
const pgUrl = resolvePostgresUrl({
|
|
359
|
-
url: options.url,
|
|
360
|
-
envUrl: process.env['TASKCAST_POSTGRES_URL'],
|
|
361
|
-
configUrl: fileConfig.adapters?.longTermStore?.url,
|
|
362
|
-
});
|
|
363
|
-
if (!pgUrl) {
|
|
364
|
-
console.error('[taskcast] No Postgres URL found. Provide --url, set TASKCAST_POSTGRES_URL, or configure adapters.longTermStore.url in config.');
|
|
365
|
-
process.exit(1);
|
|
366
|
-
}
|
|
367
|
-
const target = formatDisplayUrl(pgUrl);
|
|
368
|
-
// TODO: This path works in the monorepo only. For npm publishing,
|
|
369
|
-
// migrations would need to be bundled with the package.
|
|
370
|
-
const migrationsDir = join(dirname(fileURLToPath(import.meta.url)), '../../../migrations/postgres');
|
|
371
|
-
const sql = postgres(pgUrl);
|
|
372
|
-
try {
|
|
373
|
-
// Load migration files and check what's pending
|
|
374
|
-
const allFiles = loadMigrationFiles(migrationsDir);
|
|
375
|
-
// Ensure the migrations table exists so we can query applied versions
|
|
376
|
-
await sql.unsafe(`
|
|
377
|
-
CREATE TABLE IF NOT EXISTS _sqlx_migrations (
|
|
378
|
-
version BIGINT PRIMARY KEY,
|
|
379
|
-
description TEXT NOT NULL,
|
|
380
|
-
installed_on TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
381
|
-
success BOOLEAN NOT NULL,
|
|
382
|
-
checksum BYTEA NOT NULL,
|
|
383
|
-
execution_time BIGINT NOT NULL
|
|
384
|
-
)
|
|
385
|
-
`);
|
|
386
|
-
const appliedRows = await sql.unsafe('SELECT version FROM _sqlx_migrations WHERE success = true');
|
|
387
|
-
const appliedVersions = new Set(appliedRows.map((r) => Number(r['version'])));
|
|
388
|
-
const pending = allFiles.filter((f) => !appliedVersions.has(f.version));
|
|
389
|
-
if (pending.length === 0) {
|
|
390
|
-
console.log('[taskcast] Database is up to date.');
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
console.log(`[taskcast] Target: ${target}`);
|
|
394
|
-
console.log(`[taskcast] Pending migrations:`);
|
|
395
|
-
for (const file of pending) {
|
|
396
|
-
console.log(` ${file.filename}`);
|
|
397
|
-
}
|
|
398
|
-
if (!options.yes) {
|
|
399
|
-
if (!process.stdin.isTTY) {
|
|
400
|
-
console.error('[taskcast] No TTY detected. Re-run with --yes (-y) to skip confirmation.');
|
|
401
|
-
process.exit(1);
|
|
402
|
-
}
|
|
403
|
-
const confirmed = await promptConfirm(`Apply ${pending.length} migration(s) to ${target}? (Y/n) `);
|
|
404
|
-
if (!confirmed) {
|
|
405
|
-
console.log('[taskcast] Migration cancelled.');
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
const result = await runMigrations(sql, migrationsDir);
|
|
410
|
-
for (const filename of result.applied) {
|
|
411
|
-
console.log(` Applied ${filename}`);
|
|
412
|
-
}
|
|
413
|
-
console.log(`[taskcast] Applied ${result.applied.length} migration(s) successfully.`);
|
|
414
|
-
}
|
|
415
|
-
catch (err) {
|
|
416
|
-
console.error(`[taskcast] Migration failed: ${err.message}`);
|
|
417
|
-
process.exit(1);
|
|
418
|
-
}
|
|
419
|
-
finally {
|
|
420
|
-
await sql.end();
|
|
421
|
-
}
|
|
45
|
+
program.command('status').description('Alias for `taskcast service status`')
|
|
46
|
+
/* v8 ignore next 4 */
|
|
47
|
+
.action(async () => {
|
|
48
|
+
const { runServiceStatus } = await import('./commands/service.js');
|
|
49
|
+
await runServiceStatus();
|
|
422
50
|
});
|
|
423
51
|
program.parse();
|
|
424
52
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,iBAAiB,CAAwB,CAAA;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,yBAAyB,CAAC,OAAO,CAAC,CAAA;AAClC,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC1B,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAE/B,0EAA0E;AAC1E,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC;IACzE,sBAAsB;KACrB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;IACjE,MAAM,eAAe,EAAE,CAAA;AACzB,CAAC,CAAC,CAAA;AACJ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC;IACtE,sBAAsB;KACrB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;IAChE,MAAM,cAAc,EAAE,CAAA;AACxB,CAAC,CAAC,CAAA;AACJ,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,qCAAqC,CAAC;IAC1E,sBAAsB;KACrB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;IAClE,MAAM,gBAAgB,EAAE,CAAA;AAC1B,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface NodeEntry {
|
|
2
|
+
url: string;
|
|
3
|
+
token?: string;
|
|
4
|
+
tokenType?: 'jwt' | 'admin';
|
|
5
|
+
}
|
|
6
|
+
export interface NodeListEntry extends NodeEntry {
|
|
7
|
+
name: string;
|
|
8
|
+
current: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class NodeConfigManager {
|
|
11
|
+
private configPath;
|
|
12
|
+
constructor(configDir?: string);
|
|
13
|
+
getCurrent(): NodeEntry;
|
|
14
|
+
get(name: string): NodeEntry | undefined;
|
|
15
|
+
add(name: string, entry: NodeEntry): void;
|
|
16
|
+
remove(name: string): void;
|
|
17
|
+
use(name: string): void;
|
|
18
|
+
list(): NodeListEntry[];
|
|
19
|
+
private load;
|
|
20
|
+
private save;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=node-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-config.d.ts","sourceRoot":"","sources":["../src/node-config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AASD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAQ;gBAEd,SAAS,CAAC,EAAE,MAAM;IAK9B,UAAU,IAAI,SAAS;IASvB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAKxC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAMzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASvB,IAAI,IAAI,aAAa,EAAE;IASvB,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,IAAI;CAKb"}
|