@coralai/sps-cli 0.44.0 → 0.45.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/README.md +1 -1
- package/dist/console-assets/assets/index-BGs71Um2.css +1 -0
- package/dist/console-assets/assets/index-BsHLiTM2.js +236 -0
- package/dist/console-assets/index.html +2 -2
- package/dist/console-server/index.d.ts.map +1 -1
- package/dist/console-server/index.js +25 -5
- package/dist/console-server/index.js.map +1 -1
- package/dist/console-server/lib/cardReader.d.ts +27 -0
- package/dist/console-server/lib/cardReader.d.ts.map +1 -0
- package/dist/console-server/lib/cardReader.js +131 -0
- package/dist/console-server/lib/cardReader.js.map +1 -0
- package/dist/console-server/lib/spawnCli.d.ts +31 -0
- package/dist/console-server/lib/spawnCli.d.ts.map +1 -0
- package/dist/console-server/lib/spawnCli.js +64 -0
- package/dist/console-server/lib/spawnCli.js.map +1 -0
- package/dist/console-server/routes/cards.d.ts +7 -0
- package/dist/console-server/routes/cards.d.ts.map +1 -0
- package/dist/console-server/routes/cards.js +81 -0
- package/dist/console-server/routes/cards.js.map +1 -0
- package/dist/console-server/routes/chat.d.ts +24 -0
- package/dist/console-server/routes/chat.d.ts.map +1 -0
- package/dist/console-server/routes/chat.js +335 -0
- package/dist/console-server/routes/chat.js.map +1 -0
- package/dist/console-server/routes/logs.d.ts +14 -0
- package/dist/console-server/routes/logs.d.ts.map +1 -0
- package/dist/console-server/routes/logs.js +215 -0
- package/dist/console-server/routes/logs.js.map +1 -0
- package/dist/console-server/routes/pipeline.d.ts +8 -0
- package/dist/console-server/routes/pipeline.d.ts.map +1 -0
- package/dist/console-server/routes/pipeline.js +96 -0
- package/dist/console-server/routes/pipeline.js.map +1 -0
- package/dist/console-server/routes/skills.d.ts +7 -0
- package/dist/console-server/routes/skills.d.ts.map +1 -0
- package/dist/console-server/routes/skills.js +242 -0
- package/dist/console-server/routes/skills.js.map +1 -0
- package/dist/console-server/routes/system.d.ts +1 -1
- package/dist/console-server/routes/system.d.ts.map +1 -1
- package/dist/console-server/routes/system.js +78 -1
- package/dist/console-server/routes/system.js.map +1 -1
- package/dist/console-server/routes/workers.d.ts +7 -0
- package/dist/console-server/routes/workers.d.ts.map +1 -0
- package/dist/console-server/routes/workers.js +133 -0
- package/dist/console-server/routes/workers.js.map +1 -0
- package/dist/console-server/sse/projectStream.d.ts +10 -0
- package/dist/console-server/sse/projectStream.d.ts.map +1 -0
- package/dist/console-server/sse/projectStream.js +86 -0
- package/dist/console-server/sse/projectStream.js.map +1 -0
- package/dist/console-server/watchers/cardWatcher.d.ts +1 -3
- package/dist/console-server/watchers/cardWatcher.d.ts.map +1 -1
- package/dist/console-server/watchers/cardWatcher.js +28 -22
- package/dist/console-server/watchers/cardWatcher.js.map +1 -1
- package/dist/console-server/watchers/markerWatcher.d.ts +7 -0
- package/dist/console-server/watchers/markerWatcher.d.ts.map +1 -0
- package/dist/console-server/watchers/markerWatcher.js +53 -0
- package/dist/console-server/watchers/markerWatcher.js.map +1 -0
- package/dist/console-server/watchers/pipelinePoller.d.ts +2 -0
- package/dist/console-server/watchers/pipelinePoller.d.ts.map +1 -0
- package/dist/console-server/watchers/pipelinePoller.js +52 -0
- package/dist/console-server/watchers/pipelinePoller.js.map +1 -0
- package/package.json +1 -1
- package/dist/console-assets/assets/index-Bhd2f9AP.js +0 -125
- package/dist/console-assets/assets/index-bsAN2a12.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers.js","sourceRoot":"","sources":["../../../src/console-server/routes/workers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module console-server/sse/projectStream
|
|
3
|
+
* @description /stream/projects/:name —— 单项目的 card / worker / pipeline 事件流
|
|
4
|
+
*
|
|
5
|
+
* 订阅 eventBus,过滤 project 匹配的事件,以 SSE 格式写给客户端。
|
|
6
|
+
* 支持 Last-Event-ID 断线补偿。
|
|
7
|
+
*/
|
|
8
|
+
import { Hono } from 'hono';
|
|
9
|
+
export declare function createProjectStreamRoute(): Hono;
|
|
10
|
+
//# sourceMappingURL=projectStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectStream.d.ts","sourceRoot":"","sources":["../../../src/console-server/sse/projectStream.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAe5B,wBAAgB,wBAAwB,IAAI,IAAI,CAsE/C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module console-server/sse/projectStream
|
|
3
|
+
* @description /stream/projects/:name —— 单项目的 card / worker / pipeline 事件流
|
|
4
|
+
*
|
|
5
|
+
* 订阅 eventBus,过滤 project 匹配的事件,以 SSE 格式写给客户端。
|
|
6
|
+
* 支持 Last-Event-ID 断线补偿。
|
|
7
|
+
*/
|
|
8
|
+
import { Hono } from 'hono';
|
|
9
|
+
import { eventBus } from './eventBus.js';
|
|
10
|
+
const HEARTBEAT_MS = 15_000;
|
|
11
|
+
function formatSse(id, event, data) {
|
|
12
|
+
return `id: ${id}\nevent: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
13
|
+
}
|
|
14
|
+
function isProjectEvent(record, project) {
|
|
15
|
+
if (typeof record.data !== 'object' || record.data === null)
|
|
16
|
+
return false;
|
|
17
|
+
const d = record.data;
|
|
18
|
+
return d.project === project;
|
|
19
|
+
}
|
|
20
|
+
export function createProjectStreamRoute() {
|
|
21
|
+
const app = new Hono();
|
|
22
|
+
app.get('/:project', (c) => {
|
|
23
|
+
const project = c.req.param('project');
|
|
24
|
+
const lastEventId = Number.parseInt(c.req.header('last-event-id') ?? '0', 10) || 0;
|
|
25
|
+
c.header('Content-Type', 'text/event-stream');
|
|
26
|
+
c.header('Cache-Control', 'no-cache, no-transform');
|
|
27
|
+
c.header('Connection', 'keep-alive');
|
|
28
|
+
c.header('X-Accel-Buffering', 'no');
|
|
29
|
+
const stream = new ReadableStream({
|
|
30
|
+
start(controller) {
|
|
31
|
+
const enc = new TextEncoder();
|
|
32
|
+
let closed = false;
|
|
33
|
+
const safeWrite = (chunk) => {
|
|
34
|
+
if (closed)
|
|
35
|
+
return;
|
|
36
|
+
try {
|
|
37
|
+
controller.enqueue(enc.encode(chunk));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
closed = true;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// 1. 补发断线期间的历史事件
|
|
44
|
+
if (lastEventId > 0) {
|
|
45
|
+
const history = eventBus.since(lastEventId).filter((r) => isProjectEvent(r, project));
|
|
46
|
+
for (const r of history) {
|
|
47
|
+
safeWrite(formatSse(r.id, r.event, r.data));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 2. 订阅实时
|
|
51
|
+
const onEvent = (record) => {
|
|
52
|
+
if (!isProjectEvent(record, project))
|
|
53
|
+
return;
|
|
54
|
+
safeWrite(formatSse(record.id, record.event, record.data));
|
|
55
|
+
};
|
|
56
|
+
eventBus.on('*', onEvent);
|
|
57
|
+
// 3. 心跳保活
|
|
58
|
+
const heartbeat = setInterval(() => {
|
|
59
|
+
safeWrite(`: heartbeat ${Date.now()}\n\n`);
|
|
60
|
+
}, HEARTBEAT_MS);
|
|
61
|
+
// 4. 客户端断开 → 清理
|
|
62
|
+
c.req.raw.signal?.addEventListener('abort', () => {
|
|
63
|
+
closed = true;
|
|
64
|
+
eventBus.off('*', onEvent);
|
|
65
|
+
clearInterval(heartbeat);
|
|
66
|
+
try {
|
|
67
|
+
controller.close();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* ignore */
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
return new Response(stream, {
|
|
76
|
+
headers: {
|
|
77
|
+
'Content-Type': 'text/event-stream',
|
|
78
|
+
'Cache-Control': 'no-cache, no-transform',
|
|
79
|
+
Connection: 'keep-alive',
|
|
80
|
+
'X-Accel-Buffering': 'no',
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
return app;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=projectStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectStream.js","sourceRoot":"","sources":["../../../src/console-server/sse/projectStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module console-server/watchers/cardWatcher
|
|
3
|
-
* @description chokidar 监听
|
|
4
|
-
*
|
|
5
|
-
* 文件变化 → card.created / card.updated / card.deleted 事件
|
|
3
|
+
* @description chokidar 监听 cards 目录变化,推 card.created/updated/deleted 事件
|
|
6
4
|
*/
|
|
7
5
|
import { type FSWatcher } from 'chokidar';
|
|
8
6
|
export declare function startCardWatcher(coralRoot: string): FSWatcher;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardWatcher.d.ts","sourceRoot":"","sources":["../../../src/console-server/watchers/cardWatcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cardWatcher.d.ts","sourceRoot":"","sources":["../../../src/console-server/watchers/cardWatcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AA+BpD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAY7D"}
|
|
@@ -1,42 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module console-server/watchers/cardWatcher
|
|
3
|
-
* @description chokidar 监听
|
|
4
|
-
*
|
|
5
|
-
* 文件变化 → card.created / card.updated / card.deleted 事件
|
|
3
|
+
* @description chokidar 监听 cards 目录变化,推 card.created/updated/deleted 事件
|
|
6
4
|
*/
|
|
7
5
|
import chokidar from 'chokidar';
|
|
8
|
-
import {
|
|
6
|
+
import { resolve } from 'node:path';
|
|
7
|
+
import { readCard } from '../lib/cardReader.js';
|
|
9
8
|
import { eventBus } from '../sse/eventBus.js';
|
|
9
|
+
const HOME = process.env.HOME || '/home/coral';
|
|
10
10
|
function extractProjectAndSeq(path) {
|
|
11
|
-
// 路径形如 ~/.coral/projects/<project>/cards/<seq>-<slug>.md
|
|
12
11
|
const match = path.match(/projects\/([^/]+)\/cards\/(\d+)(?:-[^/]*)?\.md$/);
|
|
13
12
|
if (!match)
|
|
14
13
|
return null;
|
|
15
|
-
|
|
14
|
+
const seq = Number.parseInt(match[2] ?? '', 10);
|
|
15
|
+
if (!Number.isFinite(seq))
|
|
16
|
+
return null;
|
|
17
|
+
return { project: match[1] ?? '', seq };
|
|
18
|
+
}
|
|
19
|
+
function publishCardEvent(event, path) {
|
|
20
|
+
const info = extractProjectAndSeq(path);
|
|
21
|
+
if (!info)
|
|
22
|
+
return;
|
|
23
|
+
const projectDir = resolve(HOME, '.coral', 'projects', info.project);
|
|
24
|
+
if (event === 'card.deleted') {
|
|
25
|
+
eventBus.publish('card.deleted', info);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const card = readCard(projectDir, info.seq);
|
|
29
|
+
eventBus.publish(event, {
|
|
30
|
+
project: info.project,
|
|
31
|
+
seq: info.seq,
|
|
32
|
+
card: card ?? null,
|
|
33
|
+
});
|
|
16
34
|
}
|
|
17
35
|
export function startCardWatcher(coralRoot) {
|
|
18
|
-
const pattern = `${coralRoot}/cards
|
|
36
|
+
const pattern = `${coralRoot}/projects/*/cards/*.md`;
|
|
19
37
|
const watcher = chokidar.watch(pattern, {
|
|
20
38
|
persistent: true,
|
|
21
39
|
ignoreInitial: true,
|
|
22
40
|
awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },
|
|
23
41
|
});
|
|
24
42
|
watcher
|
|
25
|
-
.on('add', (path) =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
eventBus.publish('card.created', { ...info, path: basename(path) });
|
|
29
|
-
})
|
|
30
|
-
.on('change', (path) => {
|
|
31
|
-
const info = extractProjectAndSeq(path);
|
|
32
|
-
if (info)
|
|
33
|
-
eventBus.publish('card.updated', { ...info, path: basename(path) });
|
|
34
|
-
})
|
|
35
|
-
.on('unlink', (path) => {
|
|
36
|
-
const info = extractProjectAndSeq(path);
|
|
37
|
-
if (info)
|
|
38
|
-
eventBus.publish('card.deleted', info);
|
|
39
|
-
});
|
|
43
|
+
.on('add', (path) => publishCardEvent('card.created', path))
|
|
44
|
+
.on('change', (path) => publishCardEvent('card.updated', path))
|
|
45
|
+
.on('unlink', (path) => publishCardEvent('card.deleted', path));
|
|
40
46
|
return watcher;
|
|
41
47
|
}
|
|
42
48
|
//# sourceMappingURL=cardWatcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardWatcher.js","sourceRoot":"","sources":["../../../src/console-server/watchers/cardWatcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cardWatcher.js","sourceRoot":"","sources":["../../../src/console-server/watchers/cardWatcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,QAA4B,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,aAAa,CAAC;AAE/C,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC5E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY;IACnD,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QAC7B,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;QACtB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,IAAI,IAAI,IAAI;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,OAAO,GAAG,GAAG,SAAS,wBAAwB,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;QACtC,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;KAChE,CAAC,CAAC;IACH,OAAO;SACJ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;SAC3D,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;SAC9D,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module console-server/watchers/markerWatcher
|
|
3
|
+
* @description 监听 runtime/worker-*-current.json,推 worker.updated 事件
|
|
4
|
+
*/
|
|
5
|
+
import { type FSWatcher } from 'chokidar';
|
|
6
|
+
export declare function startMarkerWatcher(coralRoot: string): FSWatcher;
|
|
7
|
+
//# sourceMappingURL=markerWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markerWatcher.d.ts","sourceRoot":"","sources":["../../../src/console-server/watchers/markerWatcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAkCpD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAY/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module console-server/watchers/markerWatcher
|
|
3
|
+
* @description 监听 runtime/worker-*-current.json,推 worker.updated 事件
|
|
4
|
+
*/
|
|
5
|
+
import chokidar from 'chokidar';
|
|
6
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { basename } from 'node:path';
|
|
8
|
+
import { eventBus } from '../sse/eventBus.js';
|
|
9
|
+
function extractProjectAndSlot(path) {
|
|
10
|
+
const m = path.match(/projects\/([^/]+)\/runtime\/worker-(\d+)-current\.json$/);
|
|
11
|
+
if (!m)
|
|
12
|
+
return null;
|
|
13
|
+
const slot = Number.parseInt(m[2] ?? '', 10);
|
|
14
|
+
if (!Number.isFinite(slot))
|
|
15
|
+
return null;
|
|
16
|
+
return { project: m[1] ?? '', slot };
|
|
17
|
+
}
|
|
18
|
+
function publishMarker(event, path) {
|
|
19
|
+
const info = extractProjectAndSlot(path);
|
|
20
|
+
if (!info)
|
|
21
|
+
return;
|
|
22
|
+
let marker = null;
|
|
23
|
+
if (event !== 'worker.deleted' && existsSync(path)) {
|
|
24
|
+
try {
|
|
25
|
+
marker = JSON.parse(readFileSync(path, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// 写入中,下次再推
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
eventBus.publish('worker.updated', {
|
|
33
|
+
project: info.project,
|
|
34
|
+
slot: info.slot,
|
|
35
|
+
marker,
|
|
36
|
+
markerFile: basename(path),
|
|
37
|
+
deleted: event === 'worker.deleted',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export function startMarkerWatcher(coralRoot) {
|
|
41
|
+
const pattern = `${coralRoot}/projects/*/runtime/worker-*-current.json`;
|
|
42
|
+
const watcher = chokidar.watch(pattern, {
|
|
43
|
+
persistent: true,
|
|
44
|
+
ignoreInitial: true,
|
|
45
|
+
awaitWriteFinish: { stabilityThreshold: 80, pollInterval: 40 },
|
|
46
|
+
});
|
|
47
|
+
watcher
|
|
48
|
+
.on('add', (path) => publishMarker('worker.added', path))
|
|
49
|
+
.on('change', (path) => publishMarker('worker.updated', path))
|
|
50
|
+
.on('unlink', (path) => publishMarker('worker.deleted', path));
|
|
51
|
+
return watcher;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=markerWatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markerWatcher.js","sourceRoot":"","sources":["../../../src/console-server/watchers/markerWatcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,QAA4B,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAChF,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,IAAY;IAChD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,IAAI,KAAK,KAAK,gBAAgB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;YACX,OAAO;QACT,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM;QACN,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,KAAK,KAAK,gBAAgB;KACpC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,OAAO,GAAG,GAAG,SAAS,2CAA2C,CAAC;IACxE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;QACtC,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;KAC/D,CAAC,CAAC;IACH,OAAO;SACJ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;SACxD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;SAC7D,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipelinePoller.d.ts","sourceRoot":"","sources":["../../../src/console-server/watchers/pipelinePoller.ts"],"names":[],"mappings":"AA+BA,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,SAAO,GAAG,MAAM,IAAI,CAwBpF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module console-server/watchers/pipelinePoller
|
|
3
|
+
* @description 轮询每个项目的 supervisor.pid,状态变化推 pipeline.status
|
|
4
|
+
* 用 2s 间隔;chokidar 对 pid 变化不敏感,所以用 setInterval
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { eventBus } from '../sse/eventBus.js';
|
|
9
|
+
function pipelineState(projectDir) {
|
|
10
|
+
const pidFile = resolve(projectDir, 'runtime', 'supervisor.pid');
|
|
11
|
+
if (!existsSync(pidFile))
|
|
12
|
+
return { pid: null, status: 'idle' };
|
|
13
|
+
try {
|
|
14
|
+
const pid = Number.parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
15
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
16
|
+
return { pid: null, status: 'idle' };
|
|
17
|
+
try {
|
|
18
|
+
process.kill(pid, 0);
|
|
19
|
+
return { pid, status: 'running' };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { pid: null, status: 'idle' };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { pid: null, status: 'idle' };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function startPipelinePoller(coralRoot, intervalMs = 2000) {
|
|
30
|
+
const projectsDir = resolve(coralRoot, 'projects');
|
|
31
|
+
const previous = new Map();
|
|
32
|
+
const tick = () => {
|
|
33
|
+
if (!existsSync(projectsDir))
|
|
34
|
+
return;
|
|
35
|
+
const projects = readdirSync(projectsDir, { withFileTypes: true })
|
|
36
|
+
.filter((e) => e.isDirectory())
|
|
37
|
+
.map((e) => e.name);
|
|
38
|
+
for (const name of projects) {
|
|
39
|
+
const state = pipelineState(resolve(projectsDir, name));
|
|
40
|
+
const prev = previous.get(name);
|
|
41
|
+
if (!prev || prev.status !== state.status || prev.pid !== state.pid) {
|
|
42
|
+
eventBus.publish('pipeline.status', { project: name, ...state });
|
|
43
|
+
previous.set(name, state);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const id = setInterval(tick, intervalMs);
|
|
48
|
+
// 启动时跑一次,让 UI 得到初始值
|
|
49
|
+
tick();
|
|
50
|
+
return () => clearInterval(id);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=pipelinePoller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipelinePoller.js","sourceRoot":"","sources":["../../../src/console-server/watchers/pipelinePoller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAO9C,SAAS,aAAa,CAAC,UAAkB;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,UAAU,GAAG,IAAI;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE9C,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO;QACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC/D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;gBACpE,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;gBACjE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzC,oBAAoB;IACpB,IAAI,EAAE,CAAC;IAEP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC"}
|