@tom2012/cc-web 2026.6.17-b → 2026.9.6-c

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 (239) hide show
  1. package/CHANGELOG.json +96 -21
  2. package/backend/dist/adapters/claude-adapter.d.ts +4 -0
  3. package/backend/dist/adapters/claude-adapter.d.ts.map +1 -1
  4. package/backend/dist/adapters/claude-adapter.js +18 -2
  5. package/backend/dist/adapters/claude-adapter.js.map +1 -1
  6. package/backend/dist/adapters/types.d.ts +8 -0
  7. package/backend/dist/adapters/types.d.ts.map +1 -1
  8. package/backend/dist/auth.d.ts.map +0 -0
  9. package/backend/dist/config.d.ts +0 -0
  10. package/backend/dist/config.js +0 -0
  11. package/backend/dist/config.js.map +0 -0
  12. package/backend/dist/hooks-manager.d.ts +0 -1
  13. package/backend/dist/hooks-manager.d.ts.map +1 -1
  14. package/backend/dist/hooks-manager.js +19 -19
  15. package/backend/dist/hooks-manager.js.map +1 -1
  16. package/backend/dist/index.d.ts.map +1 -1
  17. package/backend/dist/index.js +76 -1
  18. package/backend/dist/index.js.map +1 -1
  19. package/backend/dist/logger.d.ts.map +1 -1
  20. package/backend/dist/logger.js +3 -0
  21. package/backend/dist/logger.js.map +1 -1
  22. package/backend/dist/routes/auth.d.ts +0 -0
  23. package/backend/dist/routes/auth.d.ts.map +0 -0
  24. package/backend/dist/routes/auth.js.map +0 -0
  25. package/backend/dist/routes/projects.d.ts.map +0 -0
  26. package/backend/dist/routes/projects.js.map +0 -0
  27. package/backend/dist/session-manager.d.ts +0 -0
  28. package/backend/dist/session-manager.d.ts.map +0 -0
  29. package/backend/dist/session-manager.js +0 -0
  30. package/backend/dist/session-manager.js.map +0 -0
  31. package/backend/dist/terminal-manager.d.ts +10 -1
  32. package/backend/dist/terminal-manager.d.ts.map +1 -1
  33. package/backend/dist/terminal-manager.js +19 -2
  34. package/backend/dist/terminal-manager.js.map +1 -1
  35. package/backend/dist/types.d.ts +0 -0
  36. package/backend/dist/types.d.ts.map +0 -0
  37. package/backend/dist/types.js +0 -0
  38. package/backend/dist/types.js.map +0 -0
  39. package/frontend/dist/assets/{ChatOverlay-Dp1BzsYb.js → ChatOverlay-CymdKeQK.js} +1 -1
  40. package/frontend/dist/assets/{ClaudeMemPage-CpzMjJnb.js → ClaudeMemPage-BZ4UtUoz.js} +1 -1
  41. package/frontend/dist/assets/{GraphPreview-DDY1yVOX.js → GraphPreview-21EwV_e_.js} +1 -1
  42. package/frontend/dist/assets/{MobilePage-BnnE820D.js → MobilePage-99vv9cWh.js} +3 -3
  43. package/frontend/dist/assets/{NotebookPage-BOiYcs-l.js → NotebookPage-B-mcSRJm.js} +1 -1
  44. package/frontend/dist/assets/{OfficePreview-C5N2gr8-.js → OfficePreview-C3rHS2Te.js} +2 -2
  45. package/frontend/dist/assets/{PdfPreview-COG-9AQa.js → PdfPreview-B-toyaoA.js} +1 -1
  46. package/frontend/dist/assets/{ProjectPage-ARPH_J5o.js → ProjectPage-CShqyrUl.js} +4 -4
  47. package/frontend/dist/assets/{ProjectSettingsPage-CMWcT-5r.js → ProjectSettingsPage-FxkEGuUP.js} +1 -1
  48. package/frontend/dist/assets/{SettingsPage-BMrIDtg8.js → SettingsPage-B-bqNp6b.js} +1 -1
  49. package/frontend/dist/assets/{SkillHubPage-Bq93A7Rt.js → SkillHubPage-DN79j9Is.js} +1 -1
  50. package/frontend/dist/assets/{check-circle-2-BGT1eH1f.js → check-circle-2-DRT7EX5I.js} +1 -1
  51. package/frontend/dist/assets/{chevron-down-Bbg11n9i.js → chevron-down-DdtdiM4b.js} +1 -1
  52. package/frontend/dist/assets/{chevron-left-BmStQriC.js → chevron-left-Chv-EE6G.js} +1 -1
  53. package/frontend/dist/assets/{file-text-D9WjmbhK.js → file-text-D3ZDULSr.js} +1 -1
  54. package/frontend/dist/assets/{index-EFhMcMWk.js → index-BIGQ6n-i.js} +2 -2
  55. package/frontend/dist/assets/index-BpdaJxoa.css +1 -0
  56. package/frontend/dist/assets/{index-BRqvDxO6.js → index-CH1oLpmL.js} +1 -1
  57. package/frontend/dist/assets/{index-Bhp9CVTp.js → index-Dbm49BgL.js} +1 -1
  58. package/frontend/dist/assets/{index-COZnAgez.js → index-xJR85RJZ.js} +1 -1
  59. package/frontend/dist/assets/{jszip.min-Dyo__hKc.js → jszip.min-CMcZF4_M.js} +1 -1
  60. package/frontend/dist/assets/{save-CAjdgnp7.js → save-Dhw-I0uF.js} +1 -1
  61. package/frontend/dist/assets/{search-DmWhhICR.js → search-zoOED2R0.js} +1 -1
  62. package/frontend/dist/assets/{select-DAfsBGCS.js → select-B7xEE81_.js} +1 -1
  63. package/frontend/dist/assets/{tabs-zra46FZv.js → tabs-BCHX4LWy.js} +1 -1
  64. package/frontend/dist/assets/{textarea-BG4Tvy0e.js → textarea-CGPmR1Ae.js} +1 -1
  65. package/frontend/dist/index.html +2 -2
  66. package/package.json +36 -10
  67. package/backend/dist/backup/config.d.ts +0 -10
  68. package/backend/dist/backup/config.d.ts.map +0 -1
  69. package/backend/dist/backup/config.js +0 -128
  70. package/backend/dist/backup/config.js.map +0 -1
  71. package/backend/dist/backup/engine.d.ts +0 -22
  72. package/backend/dist/backup/engine.d.ts.map +0 -1
  73. package/backend/dist/backup/engine.js +0 -298
  74. package/backend/dist/backup/engine.js.map +0 -1
  75. package/backend/dist/backup/providers/dropbox.d.ts +0 -25
  76. package/backend/dist/backup/providers/dropbox.d.ts.map +0 -1
  77. package/backend/dist/backup/providers/dropbox.js +0 -320
  78. package/backend/dist/backup/providers/dropbox.js.map +0 -1
  79. package/backend/dist/backup/providers/google-drive.d.ts +0 -29
  80. package/backend/dist/backup/providers/google-drive.d.ts.map +0 -1
  81. package/backend/dist/backup/providers/google-drive.js +0 -303
  82. package/backend/dist/backup/providers/google-drive.js.map +0 -1
  83. package/backend/dist/backup/providers/index.d.ts +0 -3
  84. package/backend/dist/backup/providers/index.d.ts.map +0 -1
  85. package/backend/dist/backup/providers/index.js +0 -19
  86. package/backend/dist/backup/providers/index.js.map +0 -1
  87. package/backend/dist/backup/providers/onedrive.d.ts +0 -29
  88. package/backend/dist/backup/providers/onedrive.d.ts.map +0 -1
  89. package/backend/dist/backup/providers/onedrive.js +0 -317
  90. package/backend/dist/backup/providers/onedrive.js.map +0 -1
  91. package/backend/dist/backup/scheduler.d.ts +0 -6
  92. package/backend/dist/backup/scheduler.d.ts.map +0 -1
  93. package/backend/dist/backup/scheduler.js +0 -55
  94. package/backend/dist/backup/scheduler.js.map +0 -1
  95. package/backend/dist/backup/types.d.ts +0 -73
  96. package/backend/dist/backup/types.d.ts.map +0 -1
  97. package/backend/dist/backup/types.js +0 -4
  98. package/backend/dist/backup/types.js.map +0 -1
  99. package/backend/dist/chat-process-manager.d.ts +0 -45
  100. package/backend/dist/chat-process-manager.d.ts.map +0 -1
  101. package/backend/dist/chat-process-manager.js +0 -258
  102. package/backend/dist/chat-process-manager.js.map +0 -1
  103. package/backend/dist/flows/runner.d.ts +0 -37
  104. package/backend/dist/flows/runner.d.ts.map +0 -1
  105. package/backend/dist/flows/runner.js +0 -660
  106. package/backend/dist/flows/runner.js.map +0 -1
  107. package/backend/dist/flows/store.d.ts +0 -40
  108. package/backend/dist/flows/store.d.ts.map +0 -1
  109. package/backend/dist/flows/store.js +0 -284
  110. package/backend/dist/flows/store.js.map +0 -1
  111. package/backend/dist/flows/types.d.ts +0 -176
  112. package/backend/dist/flows/types.d.ts.map +0 -1
  113. package/backend/dist/flows/types.js +0 -25
  114. package/backend/dist/flows/types.js.map +0 -1
  115. package/backend/dist/information/condenser.d.ts +0 -12
  116. package/backend/dist/information/condenser.d.ts.map +0 -1
  117. package/backend/dist/information/condenser.js +0 -568
  118. package/backend/dist/information/condenser.js.map +0 -1
  119. package/backend/dist/information/conversation-sync.d.ts +0 -22
  120. package/backend/dist/information/conversation-sync.d.ts.map +0 -1
  121. package/backend/dist/information/conversation-sync.js +0 -500
  122. package/backend/dist/information/conversation-sync.js.map +0 -1
  123. package/backend/dist/information/types.d.ts +0 -36
  124. package/backend/dist/information/types.d.ts.map +0 -1
  125. package/backend/dist/information/types.js +0 -4
  126. package/backend/dist/information/types.js.map +0 -1
  127. package/backend/dist/memory-pool/buoyancy.d.ts +0 -2
  128. package/backend/dist/memory-pool/buoyancy.d.ts.map +0 -1
  129. package/backend/dist/memory-pool/buoyancy.js +0 -12
  130. package/backend/dist/memory-pool/buoyancy.js.map +0 -1
  131. package/backend/dist/memory-pool/global-pool-manager.d.ts +0 -12
  132. package/backend/dist/memory-pool/global-pool-manager.d.ts.map +0 -1
  133. package/backend/dist/memory-pool/global-pool-manager.js +0 -295
  134. package/backend/dist/memory-pool/global-pool-manager.js.map +0 -1
  135. package/backend/dist/memory-pool/pool-lock.d.ts +0 -2
  136. package/backend/dist/memory-pool/pool-lock.d.ts.map +0 -1
  137. package/backend/dist/memory-pool/pool-lock.js +0 -31
  138. package/backend/dist/memory-pool/pool-lock.js.map +0 -1
  139. package/backend/dist/memory-pool/pool-manager.d.ts +0 -57
  140. package/backend/dist/memory-pool/pool-manager.d.ts.map +0 -1
  141. package/backend/dist/memory-pool/pool-manager.js +0 -322
  142. package/backend/dist/memory-pool/pool-manager.js.map +0 -1
  143. package/backend/dist/memory-pool/templates.d.ts +0 -5
  144. package/backend/dist/memory-pool/templates.d.ts.map +0 -1
  145. package/backend/dist/memory-pool/templates.js +0 -234
  146. package/backend/dist/memory-pool/templates.js.map +0 -1
  147. package/backend/dist/memory-pool/types.d.ts +0 -61
  148. package/backend/dist/memory-pool/types.d.ts.map +0 -1
  149. package/backend/dist/memory-pool/types.js +0 -4
  150. package/backend/dist/memory-pool/types.js.map +0 -1
  151. package/backend/dist/plan-control/checker.d.ts +0 -3
  152. package/backend/dist/plan-control/checker.d.ts.map +0 -1
  153. package/backend/dist/plan-control/checker.js +0 -103
  154. package/backend/dist/plan-control/checker.js.map +0 -1
  155. package/backend/dist/plan-control/executor.d.ts +0 -93
  156. package/backend/dist/plan-control/executor.d.ts.map +0 -1
  157. package/backend/dist/plan-control/executor.js +0 -955
  158. package/backend/dist/plan-control/executor.js.map +0 -1
  159. package/backend/dist/plan-control/parser.d.ts +0 -12
  160. package/backend/dist/plan-control/parser.d.ts.map +0 -1
  161. package/backend/dist/plan-control/parser.js +0 -216
  162. package/backend/dist/plan-control/parser.js.map +0 -1
  163. package/backend/dist/plan-control/templates.d.ts +0 -4
  164. package/backend/dist/plan-control/templates.d.ts.map +0 -1
  165. package/backend/dist/plan-control/templates.js +0 -271
  166. package/backend/dist/plan-control/templates.js.map +0 -1
  167. package/backend/dist/plan-control/types.d.ts +0 -102
  168. package/backend/dist/plan-control/types.d.ts.map +0 -1
  169. package/backend/dist/plan-control/types.js +0 -12
  170. package/backend/dist/plan-control/types.js.map +0 -1
  171. package/backend/dist/routes/backup.d.ts +0 -4
  172. package/backend/dist/routes/backup.d.ts.map +0 -1
  173. package/backend/dist/routes/backup.js +0 -274
  174. package/backend/dist/routes/backup.js.map +0 -1
  175. package/backend/dist/routes/flows.d.ts +0 -5
  176. package/backend/dist/routes/flows.d.ts.map +0 -1
  177. package/backend/dist/routes/flows.js +0 -457
  178. package/backend/dist/routes/flows.js.map +0 -1
  179. package/backend/dist/routes/global-flows.d.ts +0 -3
  180. package/backend/dist/routes/global-flows.d.ts.map +0 -1
  181. package/backend/dist/routes/global-flows.js +0 -90
  182. package/backend/dist/routes/global-flows.js.map +0 -1
  183. package/backend/dist/routes/information.d.ts +0 -3
  184. package/backend/dist/routes/information.d.ts.map +0 -1
  185. package/backend/dist/routes/information.js +0 -159
  186. package/backend/dist/routes/information.js.map +0 -1
  187. package/backend/dist/routes/memory-pool.d.ts +0 -3
  188. package/backend/dist/routes/memory-pool.d.ts.map +0 -1
  189. package/backend/dist/routes/memory-pool.js +0 -837
  190. package/backend/dist/routes/memory-pool.js.map +0 -1
  191. package/backend/dist/routes/plan-control.d.ts +0 -15
  192. package/backend/dist/routes/plan-control.d.ts.map +0 -1
  193. package/backend/dist/routes/plan-control.js +0 -337
  194. package/backend/dist/routes/plan-control.js.map +0 -1
  195. package/backend/dist/routes/share.d.ts +0 -3
  196. package/backend/dist/routes/share.d.ts.map +0 -1
  197. package/backend/dist/routes/share.js +0 -167
  198. package/backend/dist/routes/share.js.map +0 -1
  199. package/backend/dist/routes/sounds.d.ts +0 -3
  200. package/backend/dist/routes/sounds.d.ts.map +0 -1
  201. package/backend/dist/routes/sounds.js +0 -285
  202. package/backend/dist/routes/sounds.js.map +0 -1
  203. package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts +0 -24
  204. package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts.map +0 -1
  205. package/backend/dist/tracks/__tests__/verify-starter-templates.js +0 -175
  206. package/backend/dist/tracks/__tests__/verify-starter-templates.js.map +0 -1
  207. package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts +0 -23
  208. package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts.map +0 -1
  209. package/backend/dist/tracks/__tests__/verify-track-cancel.js +0 -153
  210. package/backend/dist/tracks/__tests__/verify-track-cancel.js.map +0 -1
  211. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts +0 -11
  212. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts.map +0 -1
  213. package/backend/dist/tracks/__tests__/verify-track-t1.js +0 -293
  214. package/backend/dist/tracks/__tests__/verify-track-t1.js.map +0 -1
  215. package/backend/dist/tracks/__tests__/verify-track.d.ts +0 -20
  216. package/backend/dist/tracks/__tests__/verify-track.d.ts.map +0 -1
  217. package/backend/dist/tracks/__tests__/verify-track.js +0 -187
  218. package/backend/dist/tracks/__tests__/verify-track.js.map +0 -1
  219. package/backend/dist/tracks/registry.d.ts +0 -61
  220. package/backend/dist/tracks/registry.d.ts.map +0 -1
  221. package/backend/dist/tracks/registry.js +0 -202
  222. package/backend/dist/tracks/registry.js.map +0 -1
  223. package/backend/dist/tracks/track-runner.d.ts +0 -69
  224. package/backend/dist/tracks/track-runner.d.ts.map +0 -1
  225. package/backend/dist/tracks/track-runner.js +0 -158
  226. package/backend/dist/tracks/track-runner.js.map +0 -1
  227. package/backend/dist/tracks/train-loader.d.ts +0 -44
  228. package/backend/dist/tracks/train-loader.d.ts.map +0 -1
  229. package/backend/dist/tracks/train-loader.js +0 -32
  230. package/backend/dist/tracks/train-loader.js.map +0 -1
  231. package/backend/dist/tracks/types-train.d.ts +0 -12
  232. package/backend/dist/tracks/types-train.d.ts.map +0 -1
  233. package/backend/dist/tracks/types-train.js +0 -13
  234. package/backend/dist/tracks/types-train.js.map +0 -1
  235. package/backend/dist/usage-terminal.d.ts +0 -18
  236. package/backend/dist/usage-terminal.d.ts.map +0 -1
  237. package/backend/dist/usage-terminal.js +0 -191
  238. package/backend/dist/usage-terminal.js.map +0 -1
  239. package/frontend/dist/assets/index-GfCaMXPO.css +0 -1
@@ -1,187 +0,0 @@
1
- "use strict";
2
- /**
3
- * T0 verification script for the Track subsystem.
4
- *
5
- * NOT a vitest/jest test — ccweb backend has no test framework yet.
6
- * Runs as a standalone Node script to verify end-to-end:
7
- *
8
- * 1. TrackRunner can load a .tr file
9
- * 2. train-lang composes prompt + calls CcwebTrainAdapter
10
- * 3. CcwebTrainAdapter injects prompt (capture into a mock buffer)
11
- * 4. We programmatically simulate the LLM writing outputs by editing
12
- * workflow_data.json + setting task_progress[].finish = true
13
- * 5. WorkflowDataWatcher detects the finish signal
14
- * 6. Adapter reads variables.<name> → returns FaiResult.success
15
- * 7. train continues execution → main() returns
16
- * 8. TrackRunner reports ok=true with the returned value
17
- *
18
- * Run: cd backend && npx ts-node src/tracks/__tests__/verify-track.ts
19
- */
20
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- var desc = Object.getOwnPropertyDescriptor(m, k);
23
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
- desc = { enumerable: true, get: function() { return m[k]; } };
25
- }
26
- Object.defineProperty(o, k2, desc);
27
- }) : (function(o, m, k, k2) {
28
- if (k2 === undefined) k2 = k;
29
- o[k2] = m[k];
30
- }));
31
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
- Object.defineProperty(o, "default", { enumerable: true, value: v });
33
- }) : function(o, v) {
34
- o["default"] = v;
35
- });
36
- var __importStar = (this && this.__importStar) || (function () {
37
- var ownKeys = function(o) {
38
- ownKeys = Object.getOwnPropertyNames || function (o) {
39
- var ar = [];
40
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
- return ar;
42
- };
43
- return ownKeys(o);
44
- };
45
- return function (mod) {
46
- if (mod && mod.__esModule) return mod;
47
- var result = {};
48
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
- __setModuleDefault(result, mod);
50
- return result;
51
- };
52
- })();
53
- Object.defineProperty(exports, "__esModule", { value: true });
54
- const fs = __importStar(require("fs/promises"));
55
- const os = __importStar(require("os"));
56
- const path = __importStar(require("path"));
57
- const __1 = require("..");
58
- let failed = 0;
59
- function check(name, cond, msg) {
60
- if (cond) {
61
- console.log(` ✓ ${name}`);
62
- }
63
- else {
64
- failed++;
65
- console.error(` ✗ ${name}${msg ? ': ' + msg : ''}`);
66
- }
67
- }
68
- const DEMO_TR = `
69
- fai analyze(file_path: string, prompt: prompt) -> rating: int 0-10, comment: string maxLen=500 { }
70
-
71
- func main(input_path: string) -> string {
72
- let r = analyze(input_path, "评分 0-10")
73
- return r.comment
74
- }
75
-
76
- export main
77
- `;
78
- async function readWf(p) {
79
- const text = await fs.readFile(p, 'utf8');
80
- return JSON.parse(text);
81
- }
82
- async function writeWf(p, w) {
83
- await fs.writeFile(p, JSON.stringify(w, null, 2), 'utf8');
84
- }
85
- async function main() {
86
- console.log('=== Track T0 verification ===\n');
87
- const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ccweb-track-t0-'));
88
- console.log(`tmpDir = ${tmpDir}`);
89
- const trackPath = path.join(tmpDir, 'demo.tr');
90
- const wfPath = path.join(tmpDir, 'workflow_data.json');
91
- await fs.writeFile(trackPath, DEMO_TR, 'utf8');
92
- await writeWf(wfPath, {
93
- constants: {},
94
- variables: {},
95
- task_progress: [],
96
- });
97
- const watcher = (0, __1.createWorkflowDataWatcher)(wfPath);
98
- // Capture prompts injected by adapter
99
- const promptsInjected = [];
100
- // Mock injector: instead of writing to a PTY, it parses the
101
- // [Required outputs] section from the prompt, fabricates legal
102
- // values, and writes them to workflow_data.json after a short
103
- // delay (simulating LLM round-trip latency).
104
- const injector = async (text) => {
105
- promptsInjected.push(text);
106
- // Extract taskIndex from the ccweb header (first 3 lines)
107
- const m = text.match(/taskIndex = (\d+)/);
108
- if (!m)
109
- throw new Error('no taskIndex in prompt — adapter contract broken');
110
- const taskIndex = Number(m[1]);
111
- // Simulate LLM writing outputs after 30ms
112
- setTimeout(async () => {
113
- const wf = await readWf(wfPath);
114
- // Pretend the LLM gave rating=8 + comment="OK"
115
- wf.variables.rating = 8;
116
- wf.variables.comment = 'OK';
117
- wf.task_progress.push({
118
- nodeId: taskIndex,
119
- name: 'analyze',
120
- finish: true,
121
- startedAt: Date.now() - 10,
122
- finishedAt: Date.now(),
123
- });
124
- await writeWf(wfPath, wf);
125
- }, 30);
126
- };
127
- const runner = (0, __1.createTrackRunner)({
128
- projectId: 'demo-proj',
129
- injector,
130
- watcher,
131
- maxFaiAttempts: 2,
132
- defaultFaiTimeoutMs: 5000,
133
- });
134
- const result = await runner.run(trackPath, ['src/foo.ts']);
135
- // Assertions
136
- check('result.ok is true', result.ok, JSON.stringify(result.error));
137
- check('result.value is the LLM-supplied comment ("OK")', result.value === 'OK', `got: ${JSON.stringify(result.value)}`);
138
- check('injector called exactly once', promptsInjected.length === 1);
139
- check('prompt contains writeProtocolHint marker', promptsInjected[0]?.includes('[Write outputs to .ccweb/workflow_data.json') ?? false);
140
- check('prompt does NOT contain stale train default hint', !(promptsInjected[0]?.includes('stack[<callId>]') ?? false));
141
- check('prompt contains ccweb track context header (taskIndex)', promptsInjected[0]?.includes('taskIndex = ') ?? false);
142
- check('final workflow_data.task_progress has 1 finished entry', (await readWf(wfPath)).task_progress.length === 1);
143
- // Verify cancellation path
144
- console.log('\n--- cancellation path ---');
145
- await writeWf(wfPath, {
146
- constants: {},
147
- variables: {},
148
- task_progress: [],
149
- });
150
- // Use an injector that never resolves the finish signal
151
- const slowPromptsInjected = [];
152
- const slowInjector = async (text) => {
153
- slowPromptsInjected.push(text);
154
- // Don't write anything — simulate LLM hung
155
- };
156
- const watcher2 = (0, __1.createWorkflowDataWatcher)(wfPath);
157
- const cancelRunner = (0, __1.createTrackRunner)({
158
- projectId: 'demo-proj',
159
- injector: slowInjector,
160
- watcher: watcher2,
161
- maxFaiAttempts: 1,
162
- defaultFaiTimeoutMs: 60000, // long timeout — we'll cancel before this
163
- });
164
- // Cancel after 100ms
165
- const cancelTimer = setTimeout(() => cancelRunner.cancel(), 100);
166
- const cancelResult = await cancelRunner.run(trackPath, ['src/foo.ts']);
167
- clearTimeout(cancelTimer);
168
- check('cancel: ok is false', !cancelResult.ok);
169
- check('cancel: error is UserCancelError-like', /cancel/i.test(cancelResult.error?.errorType ?? '') ||
170
- /cancel/i.test(cancelResult.error?.message ?? ''), `got: ${JSON.stringify(cancelResult.error)}`);
171
- // Verify writeProtocolHint factory shape (smoke test)
172
- console.log('\n--- buildCcwebWriteProtocolHint shape ---');
173
- const hint = (0, __1.buildCcwebWriteProtocolHint)();
174
- check('hint mentions workflow_data.json', hint.includes('workflow_data.json'));
175
- check('hint mentions variables', hint.includes('variables.<name>'));
176
- check('hint mentions task_progress', hint.includes('task_progress'));
177
- check('hint mentions finish: true', hint.includes('finish: true'));
178
- // Cleanup
179
- await fs.rm(tmpDir, { recursive: true, force: true });
180
- console.log(`\n${failed === 0 ? '✅ ALL CHECKS PASSED' : `❌ ${failed} CHECK(S) FAILED`}`);
181
- process.exit(failed === 0 ? 0 : 1);
182
- }
183
- main().catch((e) => {
184
- console.error('verify-track crashed:', e);
185
- process.exit(2);
186
- });
187
- //# sourceMappingURL=verify-track.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify-track.js","sourceRoot":"","sources":["../../../src/tracks/__tests__/verify-track.ts"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- /**
2
- * TrackRunnerRegistry — per-project TrackRunner accounting.
3
- *
4
- * Singleton owned by backend/src/index.ts. Wraps creation of a runner
5
- * (with the project's PTY injector + workflow_data path) and exposes
6
- * lifecycle calls used by the HTTP route handlers.
7
- *
8
- * One project can have at most one in-flight track run; starting a
9
- * new one while another is running rejects with 'busy'.
10
- */
11
- import { type AskUserFieldSpec } from './ask-user-bridge';
12
- import type { TrackRunState } from './types';
13
- export interface TrackRegistryDeps {
14
- /** Look up the absolute project folder path by projectId. */
15
- getProjectFolder: (projectId: string) => string | null;
16
- /** Inject text into the project's active CLI PTY. */
17
- injectIntoPty: (projectId: string, text: string) => Promise<void> | void;
18
- /** Push a JSON message to all WS clients subscribed to this project. */
19
- broadcast: (projectId: string, message: Record<string, unknown>) => void;
20
- /** Pino-compatible logger. */
21
- logger?: {
22
- debug?: PinoLogFn;
23
- info?: PinoLogFn;
24
- warn?: PinoLogFn;
25
- error?: PinoLogFn;
26
- };
27
- }
28
- interface PinoLogFn {
29
- (obj: object, msg?: string): void;
30
- (msg: string, ...args: unknown[]): void;
31
- }
32
- export interface TrackRegistry {
33
- /** Start a track run. */
34
- start(projectId: string, absTrackPath: string, trackFilename: string, args?: unknown[]): Promise<{
35
- ok: true;
36
- runId: string;
37
- } | {
38
- ok: false;
39
- reason: string;
40
- }>;
41
- /** Cancel the in-flight run for a project. */
42
- abort(projectId: string): boolean;
43
- /** Submit user input for a pending ask_user request. */
44
- submitInput(projectId: string, requestId: string, data: Record<string, unknown>): {
45
- ok: boolean;
46
- message?: string;
47
- };
48
- /** Get the latest state for a project (running or last finished). */
49
- getState(projectId: string): TrackRunState | null;
50
- /** True if a run is in flight (status === running or paused). */
51
- isRunning(projectId: string): boolean;
52
- /** Get the pending ask_user request if any. */
53
- getPendingAskUser(projectId: string): {
54
- runId: string;
55
- requestId: string;
56
- fields: AskUserFieldSpec[];
57
- } | null;
58
- }
59
- export declare function createTrackRegistry(deps: TrackRegistryDeps): TrackRegistry;
60
- export {};
61
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tracks/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAA2C,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAClG,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,SAAS,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACtD,qDAAqD;IACrD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxE,wEAAwE;IACxE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACxE,8BAA8B;IAC9B,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,SAAS,CAAA;QACjB,IAAI,CAAC,EAAE,SAAS,CAAA;QAChB,IAAI,CAAC,EAAE,SAAS,CAAA;QAChB,KAAK,CAAC,EAAE,SAAS,CAAA;KAClB,CAAA;CACF;AAMD,UAAU,SAAS;IACjB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACxC;AAkBD,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,EAAE,GACf,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEvE,8CAA8C;IAC9C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAEjC,wDAAwD;IACxD,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAEpC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAA;IAEjD,iEAAiE;IACjE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAErC,+CAA+C;IAC/C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;QACpC,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,gBAAgB,EAAE,CAAA;KAC3B,GAAG,IAAI,CAAA;CACT;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAoK1E"}
@@ -1,202 +0,0 @@
1
- "use strict";
2
- /**
3
- * TrackRunnerRegistry — per-project TrackRunner accounting.
4
- *
5
- * Singleton owned by backend/src/index.ts. Wraps creation of a runner
6
- * (with the project's PTY injector + workflow_data path) and exposes
7
- * lifecycle calls used by the HTTP route handlers.
8
- *
9
- * One project can have at most one in-flight track run; starting a
10
- * new one while another is running rejects with 'busy'.
11
- */
12
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- var desc = Object.getOwnPropertyDescriptor(m, k);
15
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
- desc = { enumerable: true, get: function() { return m[k]; } };
17
- }
18
- Object.defineProperty(o, k2, desc);
19
- }) : (function(o, m, k, k2) {
20
- if (k2 === undefined) k2 = k;
21
- o[k2] = m[k];
22
- }));
23
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
- Object.defineProperty(o, "default", { enumerable: true, value: v });
25
- }) : function(o, v) {
26
- o["default"] = v;
27
- });
28
- var __importStar = (this && this.__importStar) || (function () {
29
- var ownKeys = function(o) {
30
- ownKeys = Object.getOwnPropertyNames || function (o) {
31
- var ar = [];
32
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
- return ar;
34
- };
35
- return ownKeys(o);
36
- };
37
- return function (mod) {
38
- if (mod && mod.__esModule) return mod;
39
- var result = {};
40
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
- __setModuleDefault(result, mod);
42
- return result;
43
- };
44
- })();
45
- Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.createTrackRegistry = createTrackRegistry;
47
- const path = __importStar(require("path"));
48
- const track_runner_1 = require("./track-runner");
49
- const workflow_data_watcher_1 = require("./workflow-data-watcher");
50
- const ask_user_bridge_1 = require("./ask-user-bridge");
51
- function createTrackRegistry(deps) {
52
- const projects = new Map();
53
- function emit(projectId, kind, payload) {
54
- deps.broadcast(projectId, { type: kind, ...payload });
55
- }
56
- return {
57
- async start(projectId, absTrackPath, trackFilename, args = []) {
58
- // Synchronous in-flight gate — set BEFORE any await to close the
59
- // race window between two concurrent start() calls.
60
- const existing = projects.get(projectId);
61
- if (existing && (existing.inFlight || existing.lastState?.status === 'running')) {
62
- return { ok: false, reason: 'a track is already running for this project' };
63
- }
64
- const projectFolder = deps.getProjectFolder(projectId);
65
- if (!projectFolder) {
66
- return { ok: false, reason: 'project not found' };
67
- }
68
- const runId = `track-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
69
- const workflowDataPath = path.join(projectFolder, '.ccweb', 'workflow_data.json');
70
- const watcher = (0, workflow_data_watcher_1.createWorkflowDataWatcher)(workflowDataPath);
71
- const bridge = (0, ask_user_bridge_1.createAskUserBridge)((event) => {
72
- emit(projectId, 'track_ask_user', event);
73
- });
74
- const runner = (0, track_runner_1.createTrackRunner)({
75
- projectId,
76
- injector: (text) => deps.injectIntoPty(projectId, text),
77
- watcher,
78
- logger: deps.logger,
79
- askUserBridge: bridge,
80
- // Pin the runner's runId to the one registry hands out, so
81
- // bridge.pending keys, registry.entry.runId, the runId returned
82
- // to the route, and state.runId all match. Pre-fix mismatch
83
- // made getPendingAskUser/submitInput/cancelAllForRun no-ops
84
- // since they looked up the wrong key.
85
- runId,
86
- onState: (state) => {
87
- // Ignore late callbacks from a previous run — only the run
88
- // whose runId matches the entry's current runId is allowed
89
- // to overwrite lastState. (Defense against runner finishing
90
- // after the entry has been replaced.)
91
- const e = projects.get(projectId);
92
- if (!e || e.runId !== runId)
93
- return;
94
- e.lastState = state;
95
- emit(projectId, 'track_status_change', {
96
- state: state,
97
- });
98
- },
99
- });
100
- const entry = {
101
- runner,
102
- bridge,
103
- lastState: null,
104
- trackFilename,
105
- inFlight: true,
106
- runId,
107
- };
108
- projects.set(projectId, entry);
109
- // Fire and forget — the run resolves later; route returns immediately.
110
- //
111
- // The .catch is defense-in-depth: track-runner converts its own
112
- // exceptions to TrackRunResult, so .then's callback handles every
113
- // expected outcome. But if track-runner ever throws (host bug, OOM,
114
- // future refactor), there's no .catch to break a rejected promise
115
- // chain — it escapes to logger.ts's unhandledRejection handler
116
- // which process.exit(1)s the entire daemon. The .catch keeps that
117
- // class of bug from killing ccweb.
118
- void runner
119
- .run(absTrackPath, args)
120
- .then((result) => {
121
- const e = projects.get(projectId);
122
- if (e && e.runId === runId) {
123
- e.inFlight = false;
124
- }
125
- deps.logger?.info?.({ projectId, runId, ok: result.ok, error: result.error }, '[TrackRegistry] run finished');
126
- emit(projectId, 'track_run_complete', {
127
- ok: result.ok,
128
- value: result.value,
129
- error: result.error,
130
- });
131
- })
132
- .catch((err) => {
133
- const message = err instanceof Error ? err.message : String(err);
134
- deps.logger?.error?.({ projectId, runId, err: message }, '[TrackRegistry] run threw — converted to failed event');
135
- // Synthesize a terminal state so isRunning() returns false and
136
- // the frontend's track_status_change consumers see a definite
137
- // end-of-run, not a stuck 'running'. Without this, runner-level
138
- // bugs that future-broke runner's NEVER-THROW contract would
139
- // leave the project stuck (entry.lastState would stay null/running).
140
- const e = projects.get(projectId);
141
- const failedState = {
142
- runId,
143
- trackFilename: e?.trackFilename ?? '',
144
- startedAt: e?.lastState?.startedAt ?? Date.now(),
145
- status: 'failed',
146
- endedAt: Date.now(),
147
- error: { errorType: 'RunnerThrew', message },
148
- };
149
- if (e && e.runId === runId) {
150
- e.inFlight = false;
151
- e.lastState = failedState;
152
- }
153
- emit(projectId, 'track_status_change', {
154
- state: failedState,
155
- });
156
- emit(projectId, 'track_run_complete', {
157
- ok: false,
158
- value: null,
159
- error: { errorType: 'RunnerThrew', message },
160
- });
161
- });
162
- return { ok: true, runId };
163
- },
164
- abort(projectId) {
165
- const entry = projects.get(projectId);
166
- if (!entry)
167
- return false;
168
- entry.runner.cancel();
169
- entry.bridge.cancelAllForRun(entry.runId, 'aborted');
170
- return true;
171
- },
172
- submitInput(projectId, requestId, data) {
173
- const entry = projects.get(projectId);
174
- if (!entry)
175
- return { ok: false, message: 'no track running for project' };
176
- // Pass values straight through — bridge.submitInput does per-field
177
- // type validation (text/number/bool/enum).
178
- return entry.bridge.submitInput(entry.runId, requestId, data);
179
- },
180
- getState(projectId) {
181
- return projects.get(projectId)?.lastState ?? null;
182
- },
183
- isRunning(projectId) {
184
- const entry = projects.get(projectId);
185
- if (!entry)
186
- return false;
187
- // Window 1: inFlight true during start() pre-state phase.
188
- // Window 2: lastState.status running/paused after first onState fires.
189
- if (entry.inFlight)
190
- return true;
191
- const running = ['running', 'paused'];
192
- return entry.lastState ? running.includes(entry.lastState.status) : false;
193
- },
194
- getPendingAskUser(projectId) {
195
- const entry = projects.get(projectId);
196
- if (!entry)
197
- return null;
198
- return entry.bridge.getPending(entry.runId);
199
- },
200
- };
201
- }
202
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tracks/registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFH,kDAoKC;AArPD,2CAA4B;AAE5B,iDAAoE;AACpE,mEAAmE;AACnE,uDAAkG;AA6ElG,SAAgB,mBAAmB,CAAC,IAAuB;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAA;IAEhD,SAAS,IAAI,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAgC;QAC7E,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,GAAG,EAAE;YAC3D,iEAAiE;YACjE,oDAAoD;YACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACxC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;gBAChF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6CAA6C,EAAE,CAAA;YAC7E,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAA;YACnD,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;YAE7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAA;YACjF,MAAM,OAAO,GAAG,IAAA,iDAAyB,EAAC,gBAAgB,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,IAAA,qCAAmB,EAAC,CAAC,KAAK,EAAE,EAAE;gBAC3C,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,KAA2C,CAAC,CAAA;YAChF,CAAC,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,IAAA,gCAAiB,EAAC;gBAC/B,SAAS;gBACT,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC;gBACvD,OAAO;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,aAAa,EAAE,MAAM;gBACrB,2DAA2D;gBAC3D,gEAAgE;gBAChE,4DAA4D;gBAC5D,4DAA4D;gBAC5D,sCAAsC;gBACtC,KAAK;gBACL,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,2DAA2D;oBAC3D,2DAA2D;oBAC3D,4DAA4D;oBAC5D,sCAAsC;oBACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oBACjC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK;wBAAE,OAAM;oBACnC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAA;oBACnB,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAAE;wBACrC,KAAK,EAAE,KAA2C;qBACnD,CAAC,CAAA;gBACJ,CAAC;aACF,CAAC,CAAA;YAEF,MAAM,KAAK,GAAiB;gBAC1B,MAAM;gBACN,MAAM;gBACN,SAAS,EAAE,IAAI;gBACf,aAAa;gBACb,QAAQ,EAAE,IAAI;gBACd,KAAK;aACN,CAAA;YACD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAE9B,uEAAuE;YACvE,EAAE;YACF,gEAAgE;YAChE,kEAAkE;YAClE,oEAAoE;YACpE,kEAAkE;YAClE,+DAA+D;YAC/D,kEAAkE;YAClE,mCAAmC;YACnC,KAAK,MAAM;iBACR,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC;iBACvB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBACjC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBAC3B,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAA;gBACpB,CAAC;gBACD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CACjB,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EACxD,8BAA8B,CAC/B,CAAA;gBACD,IAAI,CAAC,SAAS,EAAE,oBAAoB,EAAE;oBACpC,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC,CAAA;YACJ,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAChE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAClC,uDAAuD,CACxD,CAAA;gBACD,+DAA+D;gBAC/D,8DAA8D;gBAC9D,gEAAgE;gBAChE,6DAA6D;gBAC7D,qEAAqE;gBACrE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBACjC,MAAM,WAAW,GAAkB;oBACjC,KAAK;oBACL,aAAa,EAAE,CAAC,EAAE,aAAa,IAAI,EAAE;oBACrC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;oBAChD,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;oBACnB,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE;iBAC7C,CAAA;gBACD,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBAC3B,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAA;oBAClB,CAAC,CAAC,SAAS,GAAG,WAAW,CAAA;gBAC3B,CAAC;gBACD,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAAE;oBACrC,KAAK,EAAE,WAAiD;iBACzD,CAAC,CAAA;gBACF,IAAI,CAAC,SAAS,EAAE,oBAAoB,EAAE;oBACpC,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE;iBAC7C,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QAC5B,CAAC;QAED,KAAK,CAAC,SAAS;YACb,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACrC,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAA;YACxB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;YACrB,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YACpD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI;YACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACrC,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAA;YACzE,mEAAmE;YACnE,2CAA2C;YAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,IAA6B,CAAC,CAAA;QACxF,CAAC;QAED,QAAQ,CAAC,SAAS;YAChB,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,IAAI,IAAI,CAAA;QACnD,CAAC;QAED,SAAS,CAAC,SAAS;YACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACrC,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAA;YACxB,0DAA0D;YAC1D,uEAAuE;YACvE,IAAI,KAAK,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAA;YAC/B,MAAM,OAAO,GAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YACvD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC3E,CAAC;QAED,iBAAiB,CAAC,SAAS;YACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACrC,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAA;YACvB,OAAO,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC7C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,69 +0,0 @@
1
- /**
2
- * TrackRunner — thin wrapper around train-lang's runFile that wires
3
- * the CcwebTrainAdapter + WorkflowDataWatcher + writeProtocolHint into
4
- * a single ergonomic API for the rest of the ccweb backend.
5
- *
6
- * Lifecycle:
7
- * const runner = createTrackRunner({ ... deps ... })
8
- * const result = await runner.run(absTrackPath)
9
- * // result.ok / result.value / result.error
10
- *
11
- * Cancel mid-run: runner.cancel() → AbortController fires → train
12
- * short-circuits next fai dispatch + adapter reports FaiCancelled.
13
- *
14
- * train-lang is ESM and ccweb backend is CommonJS, so we use a
15
- * dynamic import (cached at first call). This is the standard
16
- * CJS→ESM interop pattern.
17
- *
18
- * 详见 ~/Obsidian/Base/cc-web/工作轨重构规划.md §9 T0。
19
- */
20
- import { type CcwebAdapterDeps } from './ccweb-train-adapter';
21
- import type { WorkflowDataWatcher } from './workflow-data-watcher';
22
- import type { TrackRunState } from './types';
23
- import { type AskUserBridge } from './ask-user-bridge';
24
- export interface TrackRunnerDeps {
25
- projectId: string;
26
- injector: CcwebAdapterDeps['injector'];
27
- watcher: WorkflowDataWatcher;
28
- /** Total fai attempts per call. Default 3. */
29
- maxFaiAttempts?: number;
30
- /** Per-fai-call timeout (ms). Default 600_000. */
31
- defaultFaiTimeoutMs?: number;
32
- /** Logger (pino). */
33
- logger?: CcwebAdapterDeps['logger'];
34
- /** Optional extra trace listener for UI progress. */
35
- onState?: (state: TrackRunState) => void;
36
- /**
37
- * Bridge for __ccweb_ask_user builtin. When provided, .tr code can
38
- * call __ccweb_ask_user({fields:[...]}) to suspend on user input.
39
- * Without a bridge, the builtin is not registered; calls fail with
40
- * "Undefined identifier '__ccweb_ask_user'".
41
- */
42
- askUserBridge?: AskUserBridge;
43
- /**
44
- * Pre-allocated runId. The caller (registry) needs to know the runId
45
- * synchronously before run() awaits, so it can route submitInput /
46
- * getPendingAskUser to the right bridge entry. If omitted, runner
47
- * generates one. Used so registry.entry.runId === bridge pending key.
48
- */
49
- runId?: string;
50
- }
51
- export interface TrackRunResult {
52
- ok: boolean;
53
- value: unknown;
54
- error?: {
55
- errorType: string;
56
- message: string;
57
- code?: string;
58
- };
59
- }
60
- export interface TrackRunner {
61
- /** Run a .tr file. Resolves when the track terminates (success/fail/cancel). */
62
- run(absTrackPath: string, args?: unknown[]): Promise<TrackRunResult>;
63
- /** Cancel an in-flight run. */
64
- cancel(): void;
65
- /** Current state snapshot. */
66
- getState(): TrackRunState | null;
67
- }
68
- export declare function createTrackRunner(deps: TrackRunnerDeps): TrackRunner;
69
- //# sourceMappingURL=track-runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"track-runner.d.ts","sourceRoot":"","sources":["../../src/tracks/track-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAA;IACtC,OAAO,EAAE,mBAAmB,CAAA;IAC5B,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,qBAAqB;IACrB,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACnC,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACxC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9D;AAyBD,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IACpE,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,8BAA8B;IAC9B,QAAQ,IAAI,aAAa,GAAG,IAAI,CAAA;CACjC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CA4IpE"}