@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.
Files changed (62) hide show
  1. package/README.md +1 -1
  2. package/dist/console-assets/assets/index-BGs71Um2.css +1 -0
  3. package/dist/console-assets/assets/index-BsHLiTM2.js +236 -0
  4. package/dist/console-assets/index.html +2 -2
  5. package/dist/console-server/index.d.ts.map +1 -1
  6. package/dist/console-server/index.js +25 -5
  7. package/dist/console-server/index.js.map +1 -1
  8. package/dist/console-server/lib/cardReader.d.ts +27 -0
  9. package/dist/console-server/lib/cardReader.d.ts.map +1 -0
  10. package/dist/console-server/lib/cardReader.js +131 -0
  11. package/dist/console-server/lib/cardReader.js.map +1 -0
  12. package/dist/console-server/lib/spawnCli.d.ts +31 -0
  13. package/dist/console-server/lib/spawnCli.d.ts.map +1 -0
  14. package/dist/console-server/lib/spawnCli.js +64 -0
  15. package/dist/console-server/lib/spawnCli.js.map +1 -0
  16. package/dist/console-server/routes/cards.d.ts +7 -0
  17. package/dist/console-server/routes/cards.d.ts.map +1 -0
  18. package/dist/console-server/routes/cards.js +81 -0
  19. package/dist/console-server/routes/cards.js.map +1 -0
  20. package/dist/console-server/routes/chat.d.ts +24 -0
  21. package/dist/console-server/routes/chat.d.ts.map +1 -0
  22. package/dist/console-server/routes/chat.js +335 -0
  23. package/dist/console-server/routes/chat.js.map +1 -0
  24. package/dist/console-server/routes/logs.d.ts +14 -0
  25. package/dist/console-server/routes/logs.d.ts.map +1 -0
  26. package/dist/console-server/routes/logs.js +215 -0
  27. package/dist/console-server/routes/logs.js.map +1 -0
  28. package/dist/console-server/routes/pipeline.d.ts +8 -0
  29. package/dist/console-server/routes/pipeline.d.ts.map +1 -0
  30. package/dist/console-server/routes/pipeline.js +96 -0
  31. package/dist/console-server/routes/pipeline.js.map +1 -0
  32. package/dist/console-server/routes/skills.d.ts +7 -0
  33. package/dist/console-server/routes/skills.d.ts.map +1 -0
  34. package/dist/console-server/routes/skills.js +242 -0
  35. package/dist/console-server/routes/skills.js.map +1 -0
  36. package/dist/console-server/routes/system.d.ts +1 -1
  37. package/dist/console-server/routes/system.d.ts.map +1 -1
  38. package/dist/console-server/routes/system.js +78 -1
  39. package/dist/console-server/routes/system.js.map +1 -1
  40. package/dist/console-server/routes/workers.d.ts +7 -0
  41. package/dist/console-server/routes/workers.d.ts.map +1 -0
  42. package/dist/console-server/routes/workers.js +133 -0
  43. package/dist/console-server/routes/workers.js.map +1 -0
  44. package/dist/console-server/sse/projectStream.d.ts +10 -0
  45. package/dist/console-server/sse/projectStream.d.ts.map +1 -0
  46. package/dist/console-server/sse/projectStream.js +86 -0
  47. package/dist/console-server/sse/projectStream.js.map +1 -0
  48. package/dist/console-server/watchers/cardWatcher.d.ts +1 -3
  49. package/dist/console-server/watchers/cardWatcher.d.ts.map +1 -1
  50. package/dist/console-server/watchers/cardWatcher.js +28 -22
  51. package/dist/console-server/watchers/cardWatcher.js.map +1 -1
  52. package/dist/console-server/watchers/markerWatcher.d.ts +7 -0
  53. package/dist/console-server/watchers/markerWatcher.d.ts.map +1 -0
  54. package/dist/console-server/watchers/markerWatcher.js +53 -0
  55. package/dist/console-server/watchers/markerWatcher.js.map +1 -0
  56. package/dist/console-server/watchers/pipelinePoller.d.ts +2 -0
  57. package/dist/console-server/watchers/pipelinePoller.d.ts.map +1 -0
  58. package/dist/console-server/watchers/pipelinePoller.js +52 -0
  59. package/dist/console-server/watchers/pipelinePoller.js.map +1 -0
  60. package/package.json +1 -1
  61. package/dist/console-assets/assets/index-Bhd2f9AP.js +0 -125
  62. package/dist/console-assets/assets/index-bsAN2a12.css +0 -1
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;500;600;700&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
10
- <script type="module" crossorigin src="/assets/index-Bhd2f9AP.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-bsAN2a12.css">
10
+ <script type="module" crossorigin src="/assets/index-BsHLiTM2.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-BGs71Um2.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/console-server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQ3D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAU3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAeD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CA0H9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/console-server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQ3D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAmB3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAeD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAoI9B"}
@@ -19,10 +19,19 @@ import { cors } from 'hono/cors';
19
19
  import { existsSync, readFileSync } from 'node:fs';
20
20
  import { dirname, resolve } from 'node:path';
21
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';
22
26
  import { createProjectsRoute } from './routes/projects.js';
27
+ import { createSkillsRoute } from './routes/skills.js';
23
28
  import { createSystemRoute } from './routes/system.js';
29
+ import { createWorkersRoute } from './routes/workers.js';
24
30
  import { eventBus } from './sse/eventBus.js';
31
+ import { createProjectStreamRoute } from './sse/projectStream.js';
25
32
  import { startCardWatcher } from './watchers/cardWatcher.js';
33
+ import { startMarkerWatcher } from './watchers/markerWatcher.js';
34
+ import { startPipelinePoller } from './watchers/pipelinePoller.js';
26
35
  const HOME = process.env.HOME || '/home/coral';
27
36
  const CORAL_ROOT = resolve(HOME, '.coral');
28
37
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -59,7 +68,16 @@ export async function startConsoleServer(opts) {
59
68
  }
60
69
  // API 路由
61
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/logs', createLogsRoute(log));
75
+ app.route('/api/skills', createSkillsRoute());
62
76
  app.route('/api/system', createSystemRoute(version, startedAt));
77
+ app.route('/api/chat', createChatRoute(log));
78
+ app.route('/stream/projects', createProjectStreamRoute());
79
+ app.route('/stream/logs', createLogsStreamRoute(log));
80
+ app.route('/stream/chat', createChatStreamRoute());
63
81
  // SSE heartbeat(占位,M3 加完整事件流)
64
82
  app.get('/stream/heartbeat', async (c) => {
65
83
  c.header('Content-Type', 'text/event-stream');
@@ -123,21 +141,23 @@ export async function startConsoleServer(opts) {
123
141
  const server = serve({ fetch: app.fetch, port, hostname: host });
124
142
  // 启动 watchers
125
143
  const watchers = [];
144
+ const stopFns = [];
126
145
  try {
127
146
  watchers.push(startCardWatcher(CORAL_ROOT));
128
- log.info(`cardWatcher started (${CORAL_ROOT}/projects/*/cards/*.md)`);
147
+ watchers.push(startMarkerWatcher(CORAL_ROOT));
148
+ stopFns.push(startPipelinePoller(CORAL_ROOT));
149
+ log.info('watchers started: cards, markers, pipeline-poller');
129
150
  }
130
151
  catch (err) {
131
- log.warn(`cardWatcher failed: ${err instanceof Error ? err.message : String(err)}`);
152
+ log.warn(`watcher setup failed: ${err instanceof Error ? err.message : String(err)}`);
132
153
  }
133
154
  const close = async () => {
134
- // watchers
155
+ for (const stop of stopFns)
156
+ stop();
135
157
  await Promise.all(watchers.map((w) => w.close()));
136
- // 关 server
137
158
  await new Promise((r) => {
138
159
  server.close(() => r());
139
160
  });
140
- // 清 event history
141
161
  eventBus.clearHistory();
142
162
  };
143
163
  return { server, close };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/console-server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,EAAmB,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,aAAa,CAAC;AAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAe1D,SAAS,oBAAoB;IAC3B,mEAAmE;IACnE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACnD,2EAA2E;IAC3E,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACnD,yDAAyD;IACzD,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAA0B;IAE1B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAE7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM;IACN,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,GAAG,CACL,QAAQ,EACR,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,EAAE,CAAC,CACrE,CAAC;QACF,GAAG,CAAC,GAAG,CACL,WAAW,EACX,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,EAAE,CAAC,CACrE,CAAC;IACJ,CAAC;IAED,SAAS;IACT,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhE,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;QAC9C,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACtC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,KAAK,CAAC,UAAU;gBACd,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,MAAM,IAAI,GAAG,GAAG,EAAE;oBAChB,IAAI,MAAM;wBAAE,OAAO;oBACnB,UAAU,CAAC,OAAO,CAChB,GAAG,CAAC,MAAM,CACR,kCAAkC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,MAAM,CACpF,CACF,CAAC;gBACJ,CAAC,CAAC;gBACF,IAAI,EAAE,CAAC;gBACP,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC3C,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC/C,MAAM,GAAG,IAAI,CAAC;oBACd,aAAa,CAAC,QAAQ,CAAC,CAAC;oBACxB,IAAI,CAAC;wBACH,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,CAAC;oBAAC,MAAM,CAAC;wBACP,YAAY;oBACd,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QACH,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,aAAa;IACb,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACrB,GAAG,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC,IAAI,CACX;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,uBAAuB;YAC9B,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,GAAG,CAAC,OAAO;SACpB,EACD,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACtD,IAAI,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAClE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACnD,qCAAqC;QACrC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACxB,oEAAoE,EACpE,GAAG,CACJ,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,8BAA8B;QAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,YAAY;IACZ,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,cAAc;IACd,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,wBAAwB,UAAU,yBAAyB,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,aAAa;QACb,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClD,WAAW;QACX,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,kBAAkB;QAClB,QAAQ,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/console-server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
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
@@ -0,0 +1 @@
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;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,CAWpD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAS3E"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * @module console-server/lib/cardReader
3
+ * @description 解析卡片 markdown + frontmatter,供 routes/cards 和 routes/projects 用
4
+ */
5
+ import { existsSync, readdirSync, readFileSync } 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
+ export function listCards(projectDir) {
73
+ const dir = cardsDir(projectDir);
74
+ if (!existsSync(dir))
75
+ return [];
76
+ const files = readdirSync(dir)
77
+ .filter((f) => /^\d+.*\.md$/.test(f))
78
+ .sort((a, b) => {
79
+ const ai = parseInt(a.match(/^\d+/)?.[0] ?? '0', 10);
80
+ const bi = parseInt(b.match(/^\d+/)?.[0] ?? '0', 10);
81
+ return bi - ai;
82
+ });
83
+ return files.map((f) => readCardFromFile(resolve(dir, f))).filter((c) => c !== null);
84
+ }
85
+ export function readCard(projectDir, seq) {
86
+ const dir = cardsDir(projectDir);
87
+ if (!existsSync(dir))
88
+ return null;
89
+ const file = readdirSync(dir).find((f) => new RegExp(`^${seq}[^0-9]`).test(f));
90
+ if (!file)
91
+ return null;
92
+ const path = resolve(dir, file);
93
+ const raw = readFileSync(path, 'utf-8');
94
+ const { frontmatter, body } = parseFrontmatter(raw);
95
+ return buildCardDetail(seq, frontmatter, body);
96
+ }
97
+ function readCardFromFile(path) {
98
+ try {
99
+ const raw = readFileSync(path, 'utf-8');
100
+ const { frontmatter } = parseFrontmatter(raw);
101
+ const seq = Number(frontmatter.seq);
102
+ if (!Number.isFinite(seq))
103
+ return null;
104
+ return buildCard(seq, frontmatter);
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ function buildCard(seq, fm) {
111
+ return {
112
+ seq,
113
+ title: String(fm.title ?? ''),
114
+ state: String(fm.state ?? 'Backlog'),
115
+ skills: Array.isArray(fm.skills) ? fm.skills : [],
116
+ labels: Array.isArray(fm.labels) ? fm.labels : [],
117
+ branch: fm.branch ? String(fm.branch) : null,
118
+ createdAt: fm.created ? String(fm.created) : null,
119
+ updatedAt: fm.updated ? String(fm.updated) : null,
120
+ };
121
+ }
122
+ function buildCardDetail(seq, fm, body) {
123
+ const card = buildCard(seq, fm);
124
+ return {
125
+ ...card,
126
+ body,
127
+ checklist: parseChecklist(body),
128
+ activeWorkerSlot: null, // 由 routes 合并 marker 数据填
129
+ };
130
+ }
131
+ //# sourceMappingURL=cardReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardReader.js","sourceRoot":"","sources":["../../../src/console-server/lib/cardReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,64 @@
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 { spawn, execFileSync } from 'node:child_process';
10
+ import { openSync } from 'node:fs';
11
+ function cliEntry() {
12
+ // process.argv[0] = node, process.argv[1] = sps/dist/main.js
13
+ return { node: process.argv[0] ?? 'node', entry: process.argv[1] ?? 'sps' };
14
+ }
15
+ export async function spawnCliSync(args, opts) {
16
+ const { node, entry } = cliEntry();
17
+ return new Promise((resolve) => {
18
+ const child = spawn(node, [entry, ...args], {
19
+ cwd: opts?.cwd,
20
+ stdio: ['ignore', 'pipe', 'pipe'],
21
+ });
22
+ let stdout = '';
23
+ let stderr = '';
24
+ child.stdout?.on('data', (d) => { stdout += d.toString(); });
25
+ child.stderr?.on('data', (d) => { stderr += d.toString(); });
26
+ const timer = opts?.timeoutMs
27
+ ? setTimeout(() => child.kill('SIGTERM'), opts.timeoutMs)
28
+ : null;
29
+ child.on('close', (code) => {
30
+ if (timer)
31
+ clearTimeout(timer);
32
+ resolve({ exitCode: code, stdout, stderr });
33
+ });
34
+ child.on('error', (err) => {
35
+ if (timer)
36
+ clearTimeout(timer);
37
+ resolve({ exitCode: -1, stdout, stderr: stderr + String(err) });
38
+ });
39
+ });
40
+ }
41
+ /**
42
+ * 后台长任务:spawn detach + pipe 到 log file
43
+ * 适合 sps tick / sps agent 这类生命周期持续的命令
44
+ */
45
+ export function spawnCliDetached(args, opts) {
46
+ const { node, entry } = cliEntry();
47
+ const logFd = openSync(opts.logPath, 'a');
48
+ const child = spawn(node, [entry, ...args], {
49
+ cwd: opts.cwd,
50
+ detached: true,
51
+ stdio: ['ignore', logFd, logFd],
52
+ });
53
+ // 不跟踪子进程,父退出后子继续跑
54
+ child.unref();
55
+ return child;
56
+ }
57
+ /**
58
+ * 同步版(慢路径 fallback):阻塞,较重的操作别用
59
+ */
60
+ export function spawnCliBlocking(args, cwd) {
61
+ const { node, entry } = cliEntry();
62
+ return execFileSync(node, [entry, ...args], { cwd, encoding: 'utf-8' });
63
+ }
64
+ //# sourceMappingURL=spawnCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawnCli.js","sourceRoot":"","sources":["../../../src/console-server/lib/spawnCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @module console-server/routes/cards
3
+ * @description 卡片相关 REST 路由
4
+ */
5
+ import { Hono } from 'hono';
6
+ export declare function createCardsRoute(): Hono;
7
+ //# sourceMappingURL=cards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../../src/console-server/routes/cards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmB5B,wBAAgB,gBAAgB,IAAI,IAAI,CAiFvC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @module console-server/routes/cards
3
+ * @description 卡片相关 REST 路由
4
+ */
5
+ import { Hono } from 'hono';
6
+ import { existsSync } from 'node:fs';
7
+ import { resolve } from 'node:path';
8
+ import { listCards, readCard } from '../lib/cardReader.js';
9
+ import { spawnCliSync } from '../lib/spawnCli.js';
10
+ const HOME = process.env.HOME || '/home/coral';
11
+ function projectDir(name) {
12
+ return resolve(HOME, '.coral', 'projects', name);
13
+ }
14
+ function notFound(c, name) {
15
+ return c.json({ type: 'not-found', title: 'Project not found', status: 404, detail: name }, 404);
16
+ }
17
+ export function createCardsRoute() {
18
+ const app = new Hono();
19
+ app.get('/:project/cards', (c) => {
20
+ const project = c.req.param('project');
21
+ const dir = projectDir(project);
22
+ if (!existsSync(dir))
23
+ return notFound(c, project);
24
+ const state = c.req.query('state');
25
+ let cards = listCards(dir);
26
+ if (state)
27
+ cards = cards.filter((card) => card.state === state);
28
+ return c.json({ data: cards });
29
+ });
30
+ app.get('/:project/cards/:seq', (c) => {
31
+ const project = c.req.param('project');
32
+ const seq = Number.parseInt(c.req.param('seq'), 10);
33
+ const dir = projectDir(project);
34
+ if (!existsSync(dir))
35
+ return notFound(c, project);
36
+ const detail = readCard(dir, seq);
37
+ if (!detail) {
38
+ return c.json({
39
+ type: 'not-found',
40
+ title: 'Card not found',
41
+ status: 404,
42
+ detail: `${project}/#${seq}`,
43
+ }, 404);
44
+ }
45
+ return c.json(detail);
46
+ });
47
+ app.post('/:project/cards', async (c) => {
48
+ const project = c.req.param('project');
49
+ const body = await c.req.json().catch(() => null);
50
+ if (!body || typeof body.title !== 'string' || !body.title.trim()) {
51
+ return c.json({ type: 'validation', title: 'title required', status: 422 }, 422);
52
+ }
53
+ const result = await spawnCliSync(['card', 'add', project, body.title], {
54
+ timeoutMs: 10_000,
55
+ });
56
+ if (result.exitCode !== 0) {
57
+ return c.json({ type: 'cli-error', title: 'card add failed', status: 500, detail: result.stderr }, 500);
58
+ }
59
+ return c.json({ ok: true, output: result.stdout.trim() });
60
+ });
61
+ app.post('/:project/cards/:seq/reset', async (c) => {
62
+ const project = c.req.param('project');
63
+ const seq = c.req.param('seq');
64
+ const result = await spawnCliSync(['reset', project, '--card', seq], { timeoutMs: 30_000 });
65
+ if (result.exitCode !== 0) {
66
+ return c.json({ type: 'cli-error', title: 'card reset failed', status: 500, detail: result.stderr }, 500);
67
+ }
68
+ return c.json({ ok: true });
69
+ });
70
+ app.post('/:project/cards/:seq/launch', async (c) => {
71
+ const project = c.req.param('project');
72
+ const seq = c.req.param('seq');
73
+ const result = await spawnCliSync(['worker', 'launch', project, seq], { timeoutMs: 10_000 });
74
+ if (result.exitCode !== 0) {
75
+ return c.json({ type: 'cli-error', title: 'worker launch failed', status: 500, detail: result.stderr }, 500);
76
+ }
77
+ return c.json({ ok: true });
78
+ });
79
+ return app;
80
+ }
81
+ //# sourceMappingURL=cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../src/console-server/routes/cards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @module console-server/routes/chat
3
+ * @description Chat sessions with real-time streaming
4
+ *
5
+ * 流式策略:
6
+ * - POST /sessions/:id/messages:立刻持久化 user msg,返回 user msg + pending assistantId
7
+ * - 异步 spawn sps agent,stdout chunk 逐份推 chat.message.chunk(带 assistantId)
8
+ * - 完成时推 chat.message.complete
9
+ * - 失败推 chat.message.complete(role=error)
10
+ *
11
+ * 前端按 assistantId 累积 chunk,组装完整消息。
12
+ */
13
+ import { Hono } from 'hono';
14
+ import { Logger } from '../../core/logger.js';
15
+ export interface ChatMessage {
16
+ id: string;
17
+ role: 'user' | 'assistant' | 'error';
18
+ content: string;
19
+ ts: string;
20
+ status?: 'streaming' | 'complete' | 'error';
21
+ }
22
+ export declare function createChatRoute(log: Logger): Hono;
23
+ export declare function createChatStreamRoute(): Hono;
24
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/console-server/routes/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAY5B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAM9C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;CAC7C;AAgMD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CA+EjD;AAGD,wBAAgB,qBAAqB,IAAI,IAAI,CAoE5C"}