@coralai/sps-cli 0.50.6 → 0.50.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/console-assets/assets/{index-C95GbuxW.js → index-CGiD8z0L.js} +1 -1
  2. package/dist/console-assets/index.html +1 -1
  3. package/dist/services/PipelineService.d.ts.map +1 -1
  4. package/dist/services/PipelineService.js +22 -0
  5. package/dist/services/PipelineService.js.map +1 -1
  6. package/package.json +1 -1
  7. package/dist/console/sse/eventBus.d.ts +0 -25
  8. package/dist/console/sse/eventBus.d.ts.map +0 -1
  9. package/dist/console/sse/eventBus.js +0 -32
  10. package/dist/console/sse/eventBus.js.map +0 -1
  11. package/dist/console-server/index.d.ts +0 -29
  12. package/dist/console-server/index.d.ts.map +0 -1
  13. package/dist/console-server/index.js +0 -180
  14. package/dist/console-server/index.js.map +0 -1
  15. package/dist/console-server/lib/cardReader.d.ts +0 -27
  16. package/dist/console-server/lib/cardReader.d.ts.map +0 -1
  17. package/dist/console-server/lib/cardReader.js +0 -201
  18. package/dist/console-server/lib/cardReader.js.map +0 -1
  19. package/dist/console-server/lib/lockFile.d.ts +0 -17
  20. package/dist/console-server/lib/lockFile.d.ts.map +0 -1
  21. package/dist/console-server/lib/lockFile.js +0 -61
  22. package/dist/console-server/lib/lockFile.js.map +0 -1
  23. package/dist/console-server/lib/portPicker.d.ts +0 -3
  24. package/dist/console-server/lib/portPicker.d.ts.map +0 -1
  25. package/dist/console-server/lib/portPicker.js +0 -25
  26. package/dist/console-server/lib/portPicker.js.map +0 -1
  27. package/dist/console-server/lib/spawnCli.d.ts +0 -31
  28. package/dist/console-server/lib/spawnCli.d.ts.map +0 -1
  29. package/dist/console-server/lib/spawnCli.js +0 -64
  30. package/dist/console-server/lib/spawnCli.js.map +0 -1
  31. package/dist/console-server/routes/cards.d.ts +0 -7
  32. package/dist/console-server/routes/cards.d.ts.map +0 -1
  33. package/dist/console-server/routes/cards.js +0 -185
  34. package/dist/console-server/routes/cards.js.map +0 -1
  35. package/dist/console-server/routes/chat.d.ts +0 -36
  36. package/dist/console-server/routes/chat.d.ts.map +0 -1
  37. package/dist/console-server/routes/chat.js +0 -458
  38. package/dist/console-server/routes/chat.js.map +0 -1
  39. package/dist/console-server/routes/logs.d.ts +0 -14
  40. package/dist/console-server/routes/logs.d.ts.map +0 -1
  41. package/dist/console-server/routes/logs.js +0 -283
  42. package/dist/console-server/routes/logs.js.map +0 -1
  43. package/dist/console-server/routes/pipeline.d.ts +0 -8
  44. package/dist/console-server/routes/pipeline.d.ts.map +0 -1
  45. package/dist/console-server/routes/pipeline.js +0 -96
  46. package/dist/console-server/routes/pipeline.js.map +0 -1
  47. package/dist/console-server/routes/projects.d.ts +0 -11
  48. package/dist/console-server/routes/projects.d.ts.map +0 -1
  49. package/dist/console-server/routes/projects.js +0 -583
  50. package/dist/console-server/routes/projects.js.map +0 -1
  51. package/dist/console-server/routes/skills.d.ts +0 -7
  52. package/dist/console-server/routes/skills.d.ts.map +0 -1
  53. package/dist/console-server/routes/skills.js +0 -267
  54. package/dist/console-server/routes/skills.js.map +0 -1
  55. package/dist/console-server/routes/system.d.ts +0 -7
  56. package/dist/console-server/routes/system.d.ts.map +0 -1
  57. package/dist/console-server/routes/system.js +0 -288
  58. package/dist/console-server/routes/system.js.map +0 -1
  59. package/dist/console-server/routes/workers.d.ts +0 -18
  60. package/dist/console-server/routes/workers.d.ts.map +0 -1
  61. package/dist/console-server/routes/workers.js +0 -351
  62. package/dist/console-server/routes/workers.js.map +0 -1
  63. package/dist/console-server/sse/eventBus.d.ts +0 -25
  64. package/dist/console-server/sse/eventBus.d.ts.map +0 -1
  65. package/dist/console-server/sse/eventBus.js +0 -32
  66. package/dist/console-server/sse/eventBus.js.map +0 -1
  67. package/dist/console-server/sse/projectStream.d.ts +0 -10
  68. package/dist/console-server/sse/projectStream.d.ts.map +0 -1
  69. package/dist/console-server/sse/projectStream.js +0 -86
  70. package/dist/console-server/sse/projectStream.js.map +0 -1
  71. package/dist/console-server/watchers/cardWatcher.d.ts +0 -17
  72. package/dist/console-server/watchers/cardWatcher.d.ts.map +0 -1
  73. package/dist/console-server/watchers/cardWatcher.js +0 -68
  74. package/dist/console-server/watchers/cardWatcher.js.map +0 -1
  75. package/dist/console-server/watchers/markerWatcher.d.ts +0 -7
  76. package/dist/console-server/watchers/markerWatcher.d.ts.map +0 -1
  77. package/dist/console-server/watchers/markerWatcher.js +0 -63
  78. package/dist/console-server/watchers/markerWatcher.js.map +0 -1
  79. package/dist/console-server/watchers/pipelinePoller.d.ts +0 -2
  80. package/dist/console-server/watchers/pipelinePoller.d.ts.map +0 -1
  81. package/dist/console-server/watchers/pipelinePoller.js +0 -52
  82. package/dist/console-server/watchers/pipelinePoller.js.map +0 -1
  83. package/dist/models/types.d.ts +0 -103
  84. package/dist/models/types.d.ts.map +0 -1
  85. package/dist/models/types.js +0 -17
  86. package/dist/models/types.js.map +0 -1
@@ -1,180 +0,0 @@
1
- /**
2
- * @module console-server
3
- * @description Hono HTTP server + SSE + chokidar watchers —— SPS Console 后端
4
- *
5
- * @role server
6
- * @layer console-server
7
- * @boundedContext console
8
- *
9
- * 启动流程:
10
- * 1. 选端口(默认 4311,冲突自动递增)
11
- * 2. 注册路由(/api/*)+ SSE(/stream/*)+ 静态资源(dist/console-assets/)
12
- * 3. 启动 chokidar watchers → eventBus
13
- * 4. 返回 server handle + cleanup 函数
14
- */
15
- import { serve } from '@hono/node-server';
16
- import { serveStatic } from '@hono/node-server/serve-static';
17
- import { Hono } from 'hono';
18
- import { cors } from 'hono/cors';
19
- import { existsSync, readFileSync } from 'node:fs';
20
- import { dirname, resolve } from 'node:path';
21
- import { fileURLToPath } from 'node:url';
22
- import { createCardsRoute } from './routes/cards.js';
23
- import { createChatRoute, createChatStreamRoute } from './routes/chat.js';
24
- import { createLogsRoute, createLogsStreamRoute } from './routes/logs.js';
25
- import { createPipelineRoute } from './routes/pipeline.js';
26
- import { createProjectsRoute } from './routes/projects.js';
27
- import { createSkillsRoute } from './routes/skills.js';
28
- import { createSystemRoute } from './routes/system.js';
29
- import { createWorkersRoute, createWorkersAggregateRoute } from './routes/workers.js';
30
- import { eventBus } from './sse/eventBus.js';
31
- import { createProjectStreamRoute } from './sse/projectStream.js';
32
- import { startCardWatcher } from './watchers/cardWatcher.js';
33
- import { startMarkerWatcher } from './watchers/markerWatcher.js';
34
- import { startPipelinePoller } from './watchers/pipelinePoller.js';
35
- const HOME = process.env.HOME || '/home/coral';
36
- const CORAL_ROOT = resolve(HOME, '.coral');
37
- const __dirname = dirname(fileURLToPath(import.meta.url));
38
- function findConsoleAssetsDir() {
39
- // npm install: dist/console-server/index.js → ../../console-assets
40
- const a = resolve(__dirname, '..', '..', 'console-assets');
41
- if (existsSync(resolve(a, 'index.html')))
42
- return a;
43
- // dev build: workflow-cli/dist/console-server/index.js → ../console-assets
44
- const b = resolve(__dirname, '..', 'console-assets');
45
- if (existsSync(resolve(b, 'index.html')))
46
- return b;
47
- // 源码运行:src/console-server → ../../console/dist (vite 输出)
48
- const c = resolve(__dirname, '..', '..', 'console', 'dist');
49
- if (existsSync(resolve(c, 'index.html')))
50
- return c;
51
- return null;
52
- }
53
- export async function startConsoleServer(opts) {
54
- const { port, host, dev, version, log } = opts;
55
- const startedAt = new Date();
56
- const app = new Hono();
57
- // 中间件
58
- app.use('*', async (c, next) => {
59
- const start = Date.now();
60
- await next();
61
- const ms = Date.now() - start;
62
- log.info(`${c.req.method} ${c.req.path} ${c.res.status} ${ms}ms`);
63
- });
64
- // CORS:dev 模式允许 vite dev server (localhost:5173)
65
- if (dev) {
66
- app.use('/api/*', cors({ origin: ['http://localhost:5173', 'http://127.0.0.1:5173'] }));
67
- app.use('/stream/*', cors({ origin: ['http://localhost:5173', 'http://127.0.0.1:5173'] }));
68
- }
69
- // API 路由
70
- app.route('/api/projects', createProjectsRoute());
71
- app.route('/api/projects', createCardsRoute());
72
- app.route('/api/projects', createPipelineRoute(log));
73
- app.route('/api/projects', createWorkersRoute());
74
- app.route('/api/workers', createWorkersAggregateRoute());
75
- app.route('/api/logs', createLogsRoute(log));
76
- app.route('/api/skills', createSkillsRoute());
77
- app.route('/api/system', createSystemRoute(version, startedAt));
78
- app.route('/api/chat', createChatRoute(log));
79
- app.route('/stream/projects', createProjectStreamRoute());
80
- app.route('/stream/logs', createLogsStreamRoute(log));
81
- app.route('/stream/chat', createChatStreamRoute());
82
- // SSE heartbeat(占位,M3 加完整事件流)
83
- app.get('/stream/heartbeat', async (c) => {
84
- c.header('Content-Type', 'text/event-stream');
85
- c.header('Cache-Control', 'no-cache');
86
- c.header('Connection', 'keep-alive');
87
- const stream = new ReadableStream({
88
- start(controller) {
89
- const enc = new TextEncoder();
90
- let closed = false;
91
- const send = () => {
92
- if (closed)
93
- return;
94
- controller.enqueue(enc.encode(`event: server.heartbeat\ndata: ${JSON.stringify({ ts: Date.now(), version })}\n\n`));
95
- };
96
- send();
97
- const interval = setInterval(send, 10_000);
98
- c.req.raw.signal?.addEventListener('abort', () => {
99
- closed = true;
100
- clearInterval(interval);
101
- try {
102
- controller.close();
103
- }
104
- catch {
105
- /* ignore */
106
- }
107
- });
108
- },
109
- });
110
- return new Response(stream);
111
- });
112
- // 错误 handler
113
- app.onError((err, c) => {
114
- log.error(`Unhandled error: ${err.message}\n${err.stack || ''}`);
115
- return c.json({
116
- type: 'internal',
117
- title: 'Internal Server Error',
118
- status: 500,
119
- detail: err.message,
120
- }, 500);
121
- });
122
- // 静态资源 + SPA fallback(非 dev 模式)
123
- const assetsDir = dev ? null : findConsoleAssetsDir();
124
- if (!dev && assetsDir) {
125
- const relativeRoot = assetsDir.replace(process.cwd() + '/', './');
126
- app.use('/*', serveStatic({ root: relativeRoot }));
127
- // SPA fallback:任何未命中的路径返回 index.html
128
- app.get('/*', async (c) => {
129
- const indexPath = resolve(assetsDir, 'index.html');
130
- return c.html(readFileSync(indexPath, 'utf-8'));
131
- });
132
- log.info(`Serving static assets from ${assetsDir}`);
133
- }
134
- else if (!dev && !assetsDir) {
135
- app.get('/', (c) => c.text('[sps console] Frontend not built. Run: cd console && npm run build', 503));
136
- }
137
- else {
138
- // dev 模式:重定向到 vite dev server
139
- app.get('/', (c) => c.redirect('http://localhost:5173'));
140
- }
141
- // 启动 server
142
- const server = serve({ fetch: app.fetch, port, hostname: host });
143
- // 启动 watchers
144
- const watchers = [];
145
- const stopFns = [];
146
- try {
147
- watchers.push(startCardWatcher(CORAL_ROOT));
148
- watchers.push(startMarkerWatcher(CORAL_ROOT));
149
- stopFns.push(startPipelinePoller(CORAL_ROOT));
150
- log.info('watchers started: cards, markers, pipeline-poller');
151
- }
152
- catch (err) {
153
- log.warn(`watcher setup failed: ${err instanceof Error ? err.message : String(err)}`);
154
- }
155
- const close = async () => {
156
- for (const stop of stopFns)
157
- stop();
158
- await Promise.all(watchers.map((w) => w.close().catch(() => { })));
159
- // 关键:SSE 是长连接,server.close() 会无限等它们。
160
- // 必须主动断开所有现有连接(node 18.2+ Server API)
161
- const s = server;
162
- try {
163
- s.closeIdleConnections?.();
164
- s.closeAllConnections?.();
165
- }
166
- catch {
167
- /* ignore */
168
- }
169
- // 即便如此,加个保险超时避免永久卡住
170
- await Promise.race([
171
- new Promise((r) => {
172
- server.close(() => r());
173
- }),
174
- new Promise((r) => setTimeout(r, 2000)),
175
- ]);
176
- eventBus.clearHistory();
177
- };
178
- return { server, close };
179
- }
180
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/console-server/index.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- export interface Card {
2
- seq: number;
3
- title: string;
4
- state: string;
5
- skills: string[];
6
- labels: string[];
7
- branch: string | null;
8
- createdAt: string | null;
9
- updatedAt: string | null;
10
- }
11
- export interface CardDetail extends Card {
12
- body: string;
13
- checklist: {
14
- total: number;
15
- done: number;
16
- percent: number;
17
- items: {
18
- text: string;
19
- done: boolean;
20
- }[];
21
- };
22
- activeWorkerSlot: number | null;
23
- }
24
- export declare function cardsDir(projectDir: string): string;
25
- export declare function listCards(projectDir: string): Card[];
26
- export declare function readCard(projectDir: string, seq: number): CardDetail | null;
27
- //# sourceMappingURL=cardReader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cardReader.d.ts","sourceRoot":"","sources":["../../../src/console-server/lib/cardReader.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACtG,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAgED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnD;AA6BD,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,CAyBpD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA2B3E"}
@@ -1,201 +0,0 @@
1
- /**
2
- * @module console-server/lib/cardReader
3
- * @description 解析卡片 markdown + frontmatter,供 routes/cards 和 routes/projects 用
4
- */
5
- import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
6
- import { resolve } from 'node:path';
7
- function parseFrontmatter(raw) {
8
- if (!raw.startsWith('---'))
9
- return { frontmatter: {}, body: raw };
10
- const end = raw.indexOf('\n---', 3);
11
- if (end === -1)
12
- return { frontmatter: {}, body: raw };
13
- const yaml = raw.slice(3, end).trim();
14
- const body = raw.slice(end + 4).replace(/^\n/, '');
15
- const fm = {};
16
- let currentKey = null;
17
- const arrayBuffer = [];
18
- const flushArray = () => {
19
- if (currentKey)
20
- fm[currentKey] = [...arrayBuffer];
21
- arrayBuffer.length = 0;
22
- currentKey = null;
23
- };
24
- for (const line of yaml.split('\n')) {
25
- const trimmed = line.trimEnd();
26
- if (!trimmed)
27
- continue;
28
- if (line.startsWith(' - ')) {
29
- arrayBuffer.push(line.slice(4).trim());
30
- continue;
31
- }
32
- if (currentKey && arrayBuffer.length > 0)
33
- flushArray();
34
- const m = trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*:\s*(.*)$/);
35
- if (m) {
36
- const [, key, value] = m;
37
- if (value === '') {
38
- currentKey = key ?? '';
39
- }
40
- else {
41
- fm[key ?? ''] = stripQuotes(value ?? '');
42
- }
43
- }
44
- }
45
- if (currentKey && arrayBuffer.length > 0)
46
- flushArray();
47
- return { frontmatter: fm, body };
48
- }
49
- function stripQuotes(s) {
50
- const t = s.trim();
51
- if ((t.startsWith('"') && t.endsWith('"')) || (t.startsWith("'") && t.endsWith("'"))) {
52
- return t.slice(1, -1);
53
- }
54
- return t;
55
- }
56
- function parseChecklist(body) {
57
- const lines = body.split('\n');
58
- const items = [];
59
- for (const line of lines) {
60
- const m = line.match(/^\s*-\s*\[([ x])\]\s*(.+?)\s*$/);
61
- if (m)
62
- items.push({ text: m[2] ?? '', done: m[1] === 'x' });
63
- }
64
- const total = items.length;
65
- const done = items.filter((i) => i.done).length;
66
- const percent = total === 0 ? 0 : Math.round((done / total) * 100);
67
- return { total, done, percent, items };
68
- }
69
- export function cardsDir(projectDir) {
70
- return resolve(projectDir, 'cards');
71
- }
72
- /**
73
- * v0.49.5 修复:MarkdownTaskBackend 把卡片存在 `cards/<state>/N-title.md` 子目录里,
74
- * 物理目录名就是 state(小写,如 planning/backlog/todo/inprogress/qa/done)。
75
- * 之前 listCards 只扫顶层 `cards/*.md` → 永远返回空。
76
- *
77
- * 改法:
78
- * - 遍历 cards/ 的所有一级子目录
79
- * - 子目录名小写,正规化成首字母大写的 canonical state(Planning/Backlog/...)
80
- * - card.state 直接用目录名,不再读 frontmatter(frontmatter 里通常没 state 字段)
81
- * - 顶层 *.md 也兼容读(老版本可能写过那)
82
- */
83
- const DIR_NAME_TO_STATE = {
84
- planning: 'Planning',
85
- backlog: 'Backlog',
86
- todo: 'Todo',
87
- inprogress: 'Inprogress',
88
- qa: 'QA',
89
- review: 'Review',
90
- done: 'Done',
91
- canceled: 'Canceled',
92
- };
93
- function normalizeState(dirName) {
94
- const lower = dirName.toLowerCase();
95
- return DIR_NAME_TO_STATE[lower] ?? dirName;
96
- }
97
- export function listCards(projectDir) {
98
- const dir = cardsDir(projectDir);
99
- if (!existsSync(dir))
100
- return [];
101
- const results = [];
102
- for (const entry of readdirSync(dir)) {
103
- const full = resolve(dir, entry);
104
- let isDir = false;
105
- try {
106
- isDir = statSync(full).isDirectory();
107
- }
108
- catch {
109
- continue;
110
- }
111
- if (isDir) {
112
- const stateFromDir = normalizeState(entry);
113
- for (const f of readdirSync(full)) {
114
- if (!/^\d+.*\.md$/.test(f))
115
- continue;
116
- const card = readCardFromFile(resolve(full, f), stateFromDir);
117
- if (card)
118
- results.push(card);
119
- }
120
- }
121
- else if (/^\d+.*\.md$/.test(entry)) {
122
- // 兼容:老格式/用户手动放的顶层 md
123
- const card = readCardFromFile(full, null);
124
- if (card)
125
- results.push(card);
126
- }
127
- }
128
- // 按 seq 倒序(新卡在前)
129
- return results.sort((a, b) => b.seq - a.seq);
130
- }
131
- export function readCard(projectDir, seq) {
132
- const dir = cardsDir(projectDir);
133
- if (!existsSync(dir))
134
- return null;
135
- // 先扫子目录找
136
- for (const entry of readdirSync(dir)) {
137
- const full = resolve(dir, entry);
138
- let isDir = false;
139
- try {
140
- isDir = statSync(full).isDirectory();
141
- }
142
- catch {
143
- continue;
144
- }
145
- if (!isDir)
146
- continue;
147
- const stateFromDir = normalizeState(entry);
148
- const file = readdirSync(full).find((f) => new RegExp(`^${seq}[^0-9]`).test(f));
149
- if (file) {
150
- const path = resolve(full, file);
151
- const raw = readFileSync(path, 'utf-8');
152
- const { frontmatter, body } = parseFrontmatter(raw);
153
- return buildCardDetail(seq, frontmatter, body, stateFromDir);
154
- }
155
- }
156
- // Fallback:顶层 md
157
- const topFile = readdirSync(dir).find((f) => new RegExp(`^${seq}[^0-9]`).test(f));
158
- if (!topFile)
159
- return null;
160
- const path = resolve(dir, topFile);
161
- const raw = readFileSync(path, 'utf-8');
162
- const { frontmatter, body } = parseFrontmatter(raw);
163
- return buildCardDetail(seq, frontmatter, body, null);
164
- }
165
- function readCardFromFile(path, stateFromDir) {
166
- try {
167
- const raw = readFileSync(path, 'utf-8');
168
- const { frontmatter } = parseFrontmatter(raw);
169
- const seq = Number(frontmatter.seq);
170
- if (!Number.isFinite(seq))
171
- return null;
172
- return buildCard(seq, frontmatter, stateFromDir);
173
- }
174
- catch {
175
- return null;
176
- }
177
- }
178
- function buildCard(seq, fm, stateFromDir) {
179
- // Priority: 物理目录名 > frontmatter.state > fallback 'Backlog'
180
- const state = stateFromDir ?? (fm.state ? String(fm.state) : 'Backlog');
181
- return {
182
- seq,
183
- title: String(fm.title ?? fm.name ?? ''),
184
- state,
185
- skills: Array.isArray(fm.skills) ? fm.skills : [],
186
- labels: Array.isArray(fm.labels) ? fm.labels : [],
187
- branch: fm.branch ? String(fm.branch) : null,
188
- createdAt: fm.created ? String(fm.created) : null,
189
- updatedAt: fm.updated ? String(fm.updated) : null,
190
- };
191
- }
192
- function buildCardDetail(seq, fm, body, stateFromDir) {
193
- const card = buildCard(seq, fm, stateFromDir);
194
- return {
195
- ...card,
196
- body,
197
- checklist: parseChecklist(body),
198
- activeWorkerSlot: null, // 由 routes 合并 marker 数据填
199
- };
200
- }
201
- //# sourceMappingURL=cardReader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cardReader.js","sourceRoot":"","sources":["../../../src/console-server/lib/cardReader.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- export interface LockPayload {
2
- pid: number;
3
- port: number;
4
- startedAt: string;
5
- version: string;
6
- }
7
- export declare const LOCK_PATH: string;
8
- export declare function readLock(): LockPayload | null;
9
- export declare function isProcessAlive(pid: number): boolean;
10
- export declare function acquireLock(pid: number, port: number, version: string): void;
11
- export declare function releaseLock(): void;
12
- /**
13
- * 检查已有 console 是否活着。
14
- * @returns payload if another console is running, null otherwise
15
- */
16
- export declare function detectRunningConsole(): LockPayload | null;
17
- //# sourceMappingURL=lockFile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lockFile.d.ts","sourceRoot":"","sources":["../../../src/console-server/lib/lockFile.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,eAAO,MAAM,SAAS,QAA0C,CAAC;AAEjE,wBAAgB,QAAQ,IAAI,WAAW,GAAG,IAAI,CAO7C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ5E;AAED,wBAAgB,WAAW,IAAI,IAAI,CAMlC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,IAAI,CAOzD"}
@@ -1,61 +0,0 @@
1
- /**
2
- * @module console-server/lib/lockFile
3
- * @description 单实例锁:~/.coral/console.lock 保存运行中 console 的 pid + port。
4
- * stale lock (进程已死) 会被重建。
5
- */
6
- import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
7
- import { resolve } from 'node:path';
8
- const HOME = process.env.HOME || '/home/coral';
9
- export const LOCK_PATH = resolve(HOME, '.coral', 'console.lock');
10
- export function readLock() {
11
- if (!existsSync(LOCK_PATH))
12
- return null;
13
- try {
14
- return JSON.parse(readFileSync(LOCK_PATH, 'utf-8'));
15
- }
16
- catch {
17
- return null;
18
- }
19
- }
20
- export function isProcessAlive(pid) {
21
- try {
22
- process.kill(pid, 0);
23
- return true;
24
- }
25
- catch {
26
- return false;
27
- }
28
- }
29
- export function acquireLock(pid, port, version) {
30
- const payload = {
31
- pid,
32
- port,
33
- startedAt: new Date().toISOString(),
34
- version,
35
- };
36
- writeFileSync(LOCK_PATH, JSON.stringify(payload, null, 2));
37
- }
38
- export function releaseLock() {
39
- try {
40
- if (existsSync(LOCK_PATH))
41
- unlinkSync(LOCK_PATH);
42
- }
43
- catch {
44
- /* ignore */
45
- }
46
- }
47
- /**
48
- * 检查已有 console 是否活着。
49
- * @returns payload if another console is running, null otherwise
50
- */
51
- export function detectRunningConsole() {
52
- const lock = readLock();
53
- if (!lock)
54
- return null;
55
- if (isProcessAlive(lock.pid))
56
- return lock;
57
- // stale lock —— 清理
58
- releaseLock();
59
- return null;
60
- }
61
- //# sourceMappingURL=lockFile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lockFile.js","sourceRoot":"","sources":["../../../src/console-server/lib/lockFile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,aAAa,CAAC;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAEjE,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAgB,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,IAAY,EAAE,OAAe;IACpE,MAAM,OAAO,GAAgB;QAC3B,GAAG;QACH,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;KACR,CAAC;IACF,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,mBAAmB;IACnB,WAAW,EAAE,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,3 +0,0 @@
1
- export declare function isPortAvailable(port: number, host?: string): Promise<boolean>;
2
- export declare function pickPort(preferred: number, maxTries?: number, host?: string): Promise<number>;
3
- //# sourceMappingURL=portPicker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"portPicker.d.ts","sourceRoot":"","sources":["../../../src/console-server/lib/portPicker.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CASxF;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,SAAK,EACb,IAAI,SAAc,GACjB,OAAO,CAAC,MAAM,CAAC,CASjB"}
@@ -1,25 +0,0 @@
1
- /**
2
- * @module console-server/lib/portPicker
3
- * @description 找可用端口。默认 4311 起尝试,连续 N 次失败则报错。
4
- */
5
- import { createServer } from 'node:net';
6
- export async function isPortAvailable(port, host = '127.0.0.1') {
7
- return new Promise((resolve) => {
8
- const server = createServer();
9
- server.once('error', () => resolve(false));
10
- server.once('listening', () => {
11
- server.close(() => resolve(true));
12
- });
13
- server.listen(port, host);
14
- });
15
- }
16
- export async function pickPort(preferred, maxTries = 10, host = '127.0.0.1') {
17
- for (let i = 0; i < maxTries; i++) {
18
- const port = preferred + i;
19
- // eslint-disable-next-line no-await-in-loop
20
- if (await isPortAvailable(port, host))
21
- return port;
22
- }
23
- throw new Error(`Ports ${preferred}–${preferred + maxTries - 1} all in use. Use --port <n> to specify.`);
24
- }
25
- //# sourceMappingURL=portPicker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"portPicker.js","sourceRoot":"","sources":["../../../src/console-server/lib/portPicker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAI,GAAG,WAAW;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,SAAiB,EACjB,QAAQ,GAAG,EAAE,EACb,IAAI,GAAG,WAAW;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC;QAC3B,4CAA4C;QAC5C,IAAI,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,SAAS,SAAS,IAAI,SAAS,GAAG,QAAQ,GAAG,CAAC,yCAAyC,CACxF,CAAC;AACJ,CAAC"}
@@ -1,31 +0,0 @@
1
- /**
2
- * @module console-server/lib/spawnCli
3
- * @description 把 sps console 接到现有 CLI 的底层工具:spawn 子进程跑 sps 命令
4
- *
5
- * 有两种调用:
6
- * - spawnCliSync: 短任务(如 card add),等完成拿到 stdout/stderr
7
- * - spawnCliDetached: 长任务(如 tick pipeline),后台跑 + detach + 写 pid 文件
8
- */
9
- import { type ChildProcess } from 'node:child_process';
10
- export interface CliResult {
11
- exitCode: number | null;
12
- stdout: string;
13
- stderr: string;
14
- }
15
- export declare function spawnCliSync(args: string[], opts?: {
16
- cwd?: string;
17
- timeoutMs?: number;
18
- }): Promise<CliResult>;
19
- /**
20
- * 后台长任务:spawn detach + pipe 到 log file
21
- * 适合 sps tick / sps agent 这类生命周期持续的命令
22
- */
23
- export declare function spawnCliDetached(args: string[], opts: {
24
- logPath: string;
25
- cwd?: string;
26
- }): ChildProcess;
27
- /**
28
- * 同步版(慢路径 fallback):阻塞,较重的操作别用
29
- */
30
- export declare function spawnCliBlocking(args: string[], cwd?: string): string;
31
- //# sourceMappingURL=spawnCli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spawnCli.d.ts","sourceRoot":"","sources":["../../../src/console-server/lib/spawnCli.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAS,KAAK,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AAQ5E,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,SAAS,CAAC,CAyBpB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,YAAY,CAWd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrE"}