@taskcast/cli 1.2.0 → 1.2.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/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/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +131 -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 +27 -416
- 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/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":"ping.js","sourceRoot":"","sources":["../../src/commands/ping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAQrD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,UAAwB,KAAK;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAA;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACpC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;QAC9D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;IACrD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAA;QACnC,IAAI,IAAI,CAAA;QACR,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,aAAa,CAAC,CAAA;gBAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;QACzB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,SAAS,KAAK,CAAC,CAAA;QACrE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../../src/commands/playground.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+BhE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { createRequire } from 'module';
|
|
4
|
+
export function registerPlaygroundCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command('playground')
|
|
7
|
+
.description('Serve only the playground UI (no engine)')
|
|
8
|
+
.option('-p, --port <port>', 'port to listen on', '5173')
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
const port = Number(options.port);
|
|
11
|
+
try {
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const pkgPath = require.resolve('@taskcast/playground/package.json');
|
|
14
|
+
const distDir = join(dirname(pkgPath), 'dist');
|
|
15
|
+
if (!existsSync(distDir)) {
|
|
16
|
+
console.error('[taskcast] Playground dist not found. Run `pnpm --filter @taskcast/playground build` first.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const { OpenAPIHono } = await import('@hono/zod-openapi');
|
|
20
|
+
const app = new OpenAPIHono();
|
|
21
|
+
const { serveStatic } = await import('@hono/node-server/serve-static');
|
|
22
|
+
app.use('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: (p) => p.replace(/^\/_playground/, '') }));
|
|
23
|
+
app.get('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: () => '/index.html' }));
|
|
24
|
+
app.get('/', (c) => c.redirect('/_playground/'));
|
|
25
|
+
const { serve } = await import('@hono/node-server');
|
|
26
|
+
serve({ fetch: app.fetch, port }, () => {
|
|
27
|
+
console.log(`[taskcast] Playground UI at http://localhost:${port}/_playground/`);
|
|
28
|
+
console.log('[taskcast] Use "External" mode in the UI to connect to a remote server.');
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
console.error('[taskcast] @taskcast/playground not available.');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=playground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playground.js","sourceRoot":"","sources":["../../src/commands/playground.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAEtC,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAA;YACpE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAA;gBAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YACzD,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAA;YAC7B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAA;YACtE,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC7H,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;YAClG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAA0C,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAA;YACzF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YACnD,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE;gBACrC,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,eAAe,CAAC,CAAA;gBAChF,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAA;YACxF,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4H3D"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Redis } from 'ioredis';
|
|
2
|
+
import postgres from 'postgres';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { join, dirname } from 'path';
|
|
5
|
+
import { createRequire } from 'module';
|
|
6
|
+
import { TaskEngine, WorkerManager, loadConfigFile, resolveAdminToken, MemoryBroadcastProvider, MemoryShortTermStore, } from '@taskcast/core';
|
|
7
|
+
import { createTaskcastApp } from '@taskcast/server';
|
|
8
|
+
import { createRedisAdapters } from '@taskcast/redis';
|
|
9
|
+
import { PostgresLongTermStore } from '@taskcast/postgres';
|
|
10
|
+
import { createSqliteAdapters } from '@taskcast/sqlite';
|
|
11
|
+
import { promptCreateGlobalConfig, createDefaultGlobalConfig } from '../utils.js';
|
|
12
|
+
export function registerStartCommand(program) {
|
|
13
|
+
program
|
|
14
|
+
.command('start', { isDefault: true })
|
|
15
|
+
.description('Start the taskcast server in foreground (default)')
|
|
16
|
+
.option('-c, --config <path>', 'config file path')
|
|
17
|
+
.option('-p, --port <port>', 'port to listen on', '3721')
|
|
18
|
+
.option('-s, --storage <type>', 'storage backend: memory | redis | sqlite', 'memory')
|
|
19
|
+
.option('--db-path <path>', 'SQLite database file path (default: ./taskcast.db)')
|
|
20
|
+
.option('--playground', 'serve the interactive playground UI at /_playground/')
|
|
21
|
+
.option('-v, --verbose', 'enable verbose logging')
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
let { config: fileConfig, source } = await loadConfigFile(options.config);
|
|
24
|
+
if (source === 'none') {
|
|
25
|
+
const shouldCreate = await promptCreateGlobalConfig();
|
|
26
|
+
if (shouldCreate) {
|
|
27
|
+
const createdPath = createDefaultGlobalConfig();
|
|
28
|
+
if (createdPath) {
|
|
29
|
+
const created = await loadConfigFile(createdPath);
|
|
30
|
+
fileConfig = created.config;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const port = Number(options.port ?? fileConfig.port ?? 3721);
|
|
35
|
+
const redisUrl = process.env['TASKCAST_REDIS_URL'] ?? fileConfig.adapters?.broadcast?.url;
|
|
36
|
+
const postgresUrl = process.env['TASKCAST_POSTGRES_URL'] ?? fileConfig.adapters?.longTermStore?.url;
|
|
37
|
+
let shortTermStore;
|
|
38
|
+
let broadcast;
|
|
39
|
+
let longTermStore;
|
|
40
|
+
const storage = options.storage ?? process.env['TASKCAST_STORAGE'] ?? (redisUrl ? 'redis' : 'memory');
|
|
41
|
+
if (storage === 'sqlite') {
|
|
42
|
+
const sqliteOpts = options.dbPath ? { path: options.dbPath } : {};
|
|
43
|
+
const adapters = createSqliteAdapters(sqliteOpts);
|
|
44
|
+
broadcast = new MemoryBroadcastProvider();
|
|
45
|
+
shortTermStore = adapters.shortTermStore;
|
|
46
|
+
longTermStore = adapters.longTermStore;
|
|
47
|
+
console.log(`[taskcast] Using SQLite storage at ${options.dbPath ?? './taskcast.db'}`);
|
|
48
|
+
}
|
|
49
|
+
else if (storage === 'redis' || redisUrl) {
|
|
50
|
+
const pubClient = new Redis(redisUrl);
|
|
51
|
+
const subClient = new Redis(redisUrl);
|
|
52
|
+
const storeClient = new Redis(redisUrl);
|
|
53
|
+
const adapters = createRedisAdapters(pubClient, subClient, storeClient);
|
|
54
|
+
broadcast = adapters.broadcast;
|
|
55
|
+
shortTermStore = adapters.shortTermStore;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.warn('[taskcast] No TASKCAST_REDIS_URL configured — using in-memory adapters');
|
|
59
|
+
broadcast = new MemoryBroadcastProvider();
|
|
60
|
+
shortTermStore = new MemoryShortTermStore();
|
|
61
|
+
}
|
|
62
|
+
if (storage !== 'sqlite' && postgresUrl) {
|
|
63
|
+
const sql = postgres(postgresUrl);
|
|
64
|
+
longTermStore = new PostgresLongTermStore(sql);
|
|
65
|
+
}
|
|
66
|
+
const engineOpts = { shortTermStore, broadcast };
|
|
67
|
+
if (longTermStore !== undefined)
|
|
68
|
+
engineOpts.longTermStore = longTermStore;
|
|
69
|
+
const engine = new TaskEngine(engineOpts);
|
|
70
|
+
const authMode = (process.env['TASKCAST_AUTH_MODE'] ?? fileConfig.auth?.mode ?? 'none');
|
|
71
|
+
// Worker assignment system
|
|
72
|
+
const workersEnabled = fileConfig.workers?.enabled ?? false;
|
|
73
|
+
let workerManager;
|
|
74
|
+
if (workersEnabled) {
|
|
75
|
+
console.log('[taskcast] Worker assignment system enabled');
|
|
76
|
+
const wmOpts = {
|
|
77
|
+
engine,
|
|
78
|
+
shortTermStore,
|
|
79
|
+
broadcast,
|
|
80
|
+
};
|
|
81
|
+
if (longTermStore !== undefined)
|
|
82
|
+
wmOpts.longTermStore = longTermStore;
|
|
83
|
+
if (fileConfig.workers?.defaults)
|
|
84
|
+
wmOpts.defaults = fileConfig.workers.defaults;
|
|
85
|
+
workerManager = new WorkerManager(wmOpts);
|
|
86
|
+
}
|
|
87
|
+
// Resolve admin token (auto-generate + print if adminApi is enabled)
|
|
88
|
+
resolveAdminToken(fileConfig);
|
|
89
|
+
const serverOpts = {
|
|
90
|
+
engine,
|
|
91
|
+
shortTermStore,
|
|
92
|
+
auth: { mode: authMode },
|
|
93
|
+
config: fileConfig,
|
|
94
|
+
verbose: options.verbose ?? false,
|
|
95
|
+
};
|
|
96
|
+
if (workerManager !== undefined)
|
|
97
|
+
serverOpts.workerManager = workerManager;
|
|
98
|
+
const { app, stop } = createTaskcastApp(serverOpts);
|
|
99
|
+
// Serve playground static files if --playground and dist exists
|
|
100
|
+
if (options.playground) {
|
|
101
|
+
try {
|
|
102
|
+
const require = createRequire(import.meta.url);
|
|
103
|
+
const pkgPath = require.resolve('@taskcast/playground/package.json');
|
|
104
|
+
const distDir = join(dirname(pkgPath), 'dist');
|
|
105
|
+
if (existsSync(distDir)) {
|
|
106
|
+
const { serveStatic } = await import('@hono/node-server/serve-static');
|
|
107
|
+
app.use('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: (p) => p.replace(/^\/_playground/, '') }));
|
|
108
|
+
// SPA fallback: serve index.html for non-asset paths
|
|
109
|
+
app.get('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: () => '/index.html' }));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.warn('[taskcast] Playground dist not found. Run `pnpm --filter @taskcast/playground build` first.');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
console.warn('[taskcast] @taskcast/playground not available, skipping playground UI.');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const { serve } = await import('@hono/node-server');
|
|
120
|
+
const server = serve({ fetch: app.fetch, port }, () => {
|
|
121
|
+
console.log(`[taskcast] Server started on http://localhost:${port}`);
|
|
122
|
+
if (options.playground) {
|
|
123
|
+
console.log(`[taskcast] Playground UI at http://localhost:${port}/_playground/`);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// Clean up scheduler/heartbeat on shutdown
|
|
127
|
+
process.on('SIGTERM', () => { stop(); server.close?.(); });
|
|
128
|
+
process.on('SIGINT', () => { stop(); server.close?.(); });
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface TaskListItem {
|
|
3
|
+
id: string;
|
|
4
|
+
type?: string;
|
|
5
|
+
status: string;
|
|
6
|
+
createdAt: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function formatTaskList(tasks: TaskListItem[]): string;
|
|
9
|
+
export declare function formatTaskInspect(task: any, events: any[]): string;
|
|
10
|
+
export declare function registerTasksCommand(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAa5D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAyBlE;AAmBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwE3D"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { NodeConfigManager } from '../node-config.js';
|
|
2
|
+
import { createClientFromNodeAsync } from '../client.js';
|
|
3
|
+
export function formatTaskList(tasks) {
|
|
4
|
+
if (tasks.length === 0)
|
|
5
|
+
return 'No tasks found.';
|
|
6
|
+
const header = `${'ID'.padEnd(28)}${'TYPE'.padEnd(13)}${'STATUS'.padEnd(11)}CREATED`;
|
|
7
|
+
const rows = tasks.map((t) => {
|
|
8
|
+
const id = (t.id ?? '').padEnd(28);
|
|
9
|
+
const type = (t.type ?? '').padEnd(13);
|
|
10
|
+
const status = (t.status ?? '').padEnd(11);
|
|
11
|
+
const created = formatTimestamp(t.createdAt);
|
|
12
|
+
return `${id}${type}${status}${created}`;
|
|
13
|
+
});
|
|
14
|
+
return [header, ...rows].join('\n');
|
|
15
|
+
}
|
|
16
|
+
export function formatTaskInspect(task, events) {
|
|
17
|
+
const lines = [];
|
|
18
|
+
lines.push(`Task: ${task.id}`);
|
|
19
|
+
lines.push(` Type: ${task.type ?? ''}`);
|
|
20
|
+
lines.push(` Status: ${task.status}`);
|
|
21
|
+
lines.push(` Params: ${task.params != null ? JSON.stringify(task.params) : ''}`);
|
|
22
|
+
lines.push(` Created: ${formatTimestamp(task.createdAt)}`);
|
|
23
|
+
if (events.length > 0) {
|
|
24
|
+
const last5 = events.slice(-5);
|
|
25
|
+
lines.push('');
|
|
26
|
+
lines.push(`Recent Events (last ${last5.length}):`);
|
|
27
|
+
for (let i = 0; i < last5.length; i++) {
|
|
28
|
+
const e = last5[i];
|
|
29
|
+
const series = e.seriesId ? `series:${e.seriesId}` : '';
|
|
30
|
+
const ts = formatTimestamp(e.timestamp);
|
|
31
|
+
lines.push(` #${i} ${(e.type ?? '').padEnd(13)}${(e.level ?? '').padEnd(7)}${series.padEnd(17)}${ts}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
lines.push('');
|
|
36
|
+
lines.push('No events.');
|
|
37
|
+
}
|
|
38
|
+
return lines.join('\n');
|
|
39
|
+
}
|
|
40
|
+
function formatTimestamp(ts) {
|
|
41
|
+
if (!ts)
|
|
42
|
+
return '';
|
|
43
|
+
const d = new Date(ts);
|
|
44
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
45
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Call _request on the server-sdk client.
|
|
49
|
+
* The SDK doesn't expose a listTasks method, so we use the internal _request
|
|
50
|
+
* to leverage the already-configured auth token and fetch function.
|
|
51
|
+
*/
|
|
52
|
+
async function clientRequest(client, method, path) {
|
|
53
|
+
// Access the private _request method via bracket notation
|
|
54
|
+
return client._request(method, path);
|
|
55
|
+
}
|
|
56
|
+
export function registerTasksCommand(program) {
|
|
57
|
+
const tasks = program
|
|
58
|
+
.command('tasks')
|
|
59
|
+
.description('Manage tasks on a Taskcast server');
|
|
60
|
+
tasks
|
|
61
|
+
.command('list')
|
|
62
|
+
.description('List tasks')
|
|
63
|
+
.option('--status <status>', 'Filter by status (e.g. running)')
|
|
64
|
+
.option('--type <type>', 'Filter by task type (e.g. llm.*)')
|
|
65
|
+
.option('--limit <limit>', 'Maximum number of tasks to show', '20')
|
|
66
|
+
.option('--node <name>', 'Named node to query')
|
|
67
|
+
.action(async (opts) => {
|
|
68
|
+
const mgr = new NodeConfigManager();
|
|
69
|
+
let node;
|
|
70
|
+
if (opts.node) {
|
|
71
|
+
node = mgr.get(opts.node);
|
|
72
|
+
if (!node) {
|
|
73
|
+
console.error(`Node "${opts.node}" not found`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
node = mgr.getCurrent();
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const client = await createClientFromNodeAsync(node);
|
|
82
|
+
const params = new URLSearchParams();
|
|
83
|
+
if (opts.status)
|
|
84
|
+
params.set('status', opts.status);
|
|
85
|
+
if (opts.type)
|
|
86
|
+
params.set('type', opts.type);
|
|
87
|
+
const qs = params.toString();
|
|
88
|
+
const path = `/tasks${qs ? `?${qs}` : ''}`;
|
|
89
|
+
const body = await clientRequest(client, 'GET', path);
|
|
90
|
+
const limit = parseInt(opts.limit ?? '20', 10);
|
|
91
|
+
const tasks = body.tasks.slice(0, limit);
|
|
92
|
+
console.log(formatTaskList(tasks));
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.error(`Error: ${err.message}`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
tasks
|
|
100
|
+
.command('inspect')
|
|
101
|
+
.description('Inspect a task and its recent events')
|
|
102
|
+
.argument('<taskId>', 'Task ID to inspect')
|
|
103
|
+
.option('--node <name>', 'Named node to query')
|
|
104
|
+
.action(async (taskId, opts) => {
|
|
105
|
+
const mgr = new NodeConfigManager();
|
|
106
|
+
let node;
|
|
107
|
+
if (opts.node) {
|
|
108
|
+
node = mgr.get(opts.node);
|
|
109
|
+
if (!node) {
|
|
110
|
+
console.error(`Node "${opts.node}" not found`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
node = mgr.getCurrent();
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const client = await createClientFromNodeAsync(node);
|
|
119
|
+
const task = await client.getTask(taskId);
|
|
120
|
+
const events = await client.getHistory(taskId);
|
|
121
|
+
console.log(formatTaskInspect(task, events));
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
console.error(`Error: ${err.message}`);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|