@tom2012/cc-web 2026.5.18-i → 2026.5.18-j

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 (40) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/track-flow/__tests__/prompt-translator.test.js +14 -2
  3. package/backend/dist/track-flow/__tests__/prompt-translator.test.js.map +1 -1
  4. package/backend/dist/track-flow/__tests__/run-state-file.test.d.ts +2 -0
  5. package/backend/dist/track-flow/__tests__/run-state-file.test.d.ts.map +1 -0
  6. package/backend/dist/track-flow/__tests__/run-state-file.test.js +125 -0
  7. package/backend/dist/track-flow/__tests__/run-state-file.test.js.map +1 -0
  8. package/backend/dist/track-flow/llm-dispatcher.d.ts +16 -7
  9. package/backend/dist/track-flow/llm-dispatcher.d.ts.map +1 -1
  10. package/backend/dist/track-flow/llm-dispatcher.js +55 -46
  11. package/backend/dist/track-flow/llm-dispatcher.js.map +1 -1
  12. package/backend/dist/track-flow/prompt-translator.d.ts +12 -7
  13. package/backend/dist/track-flow/prompt-translator.d.ts.map +1 -1
  14. package/backend/dist/track-flow/prompt-translator.js +33 -19
  15. package/backend/dist/track-flow/prompt-translator.js.map +1 -1
  16. package/backend/dist/track-flow/run-state-file.d.ts +43 -0
  17. package/backend/dist/track-flow/run-state-file.d.ts.map +1 -0
  18. package/backend/dist/track-flow/run-state-file.js +134 -0
  19. package/backend/dist/track-flow/run-state-file.js.map +1 -0
  20. package/backend/dist/track-flow/runtime.d.ts +1 -0
  21. package/backend/dist/track-flow/runtime.d.ts.map +1 -1
  22. package/backend/dist/track-flow/runtime.js +88 -1
  23. package/backend/dist/track-flow/runtime.js.map +1 -1
  24. package/frontend/dist/assets/{ChatOverlay-9d5dpS5b.js → ChatOverlay-BhRFsbbR.js} +1 -1
  25. package/frontend/dist/assets/{GraphPreview-C6qEXitD.js → GraphPreview-D6ZEeVED.js} +1 -1
  26. package/frontend/dist/assets/{MobilePage-CFU9G20m.js → MobilePage-WRYXRAc8.js} +3 -3
  27. package/frontend/dist/assets/{OfficePreview-_l7j8IV8.js → OfficePreview-DyaPvJlf.js} +2 -2
  28. package/frontend/dist/assets/{PdfPreview-DTUBbS18.js → PdfPreview-B52kU16y.js} +1 -1
  29. package/frontend/dist/assets/{ProjectPage-DlHo3QQu.js → ProjectPage-DQ2F8xZb.js} +3 -3
  30. package/frontend/dist/assets/{SettingsPage-C3gzKiEP.js → SettingsPage-CgLJryAs.js} +1 -1
  31. package/frontend/dist/assets/{SkillHubPage-YwjsOoUC.js → SkillHubPage-D8kn7S1o.js} +1 -1
  32. package/frontend/dist/assets/{chevron-down-DodPtCYb.js → chevron-down-DWfB7z-t.js} +1 -1
  33. package/frontend/dist/assets/{index-CRR0fz5Z.js → index-BhJADLPx.js} +2 -2
  34. package/frontend/dist/assets/{index-L7gDJlsf.js → index-CGrwyTes.js} +1 -1
  35. package/frontend/dist/assets/{index-CryLBIY6.js → index-DSFa9HJl.js} +1 -1
  36. package/frontend/dist/assets/{jszip.min-6qCZ4RHI.js → jszip.min-BS4NYaGC.js} +1 -1
  37. package/frontend/dist/assets/{search-CMAXJLdz.js → search-C5-inwaf.js} +1 -1
  38. package/frontend/dist/assets/{select-5_sxYgAx.js → select-C6vHKLtQ.js} +1 -1
  39. package/frontend/dist/index.html +1 -1
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A self-hosted web application (distributed as npm package) that provides a browser-based interface for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) CLI sessions. Create projects, each with a persistent terminal running Claude Code, and interact with them through a real-time terminal UI.
4
4
 
5
- **Current version**: v2026.5.18-i | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
5
+ **Current version**: v2026.5.18-j | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
6
6
 
7
7
  ## Features
8
8
 
@@ -26,9 +26,21 @@ const prompt_translator_1 = require("../prompt-translator");
26
26
  (0, vitest_1.expect)(r).toContain('.ccweb-flow-train.json');
27
27
  (0, vitest_1.expect)(r).toContain('has_error');
28
28
  });
29
- (0, vitest_1.it)('outputs 为空时不追加系统指令段', () => {
29
+ (0, vitest_1.it)('outputs 为空时仍追加系统指令段(v-j:done flag 是完成信号源)', () => {
30
30
  const r = (0, prompt_translator_1.translatePrompt)('单纯咨询 @{area}', vars, { area: '逆合成' }, []);
31
- (0, vitest_1.expect)(r).not.toContain('【系统指令】');
31
+ (0, vitest_1.expect)(r).toContain('【系统指令】');
32
+ (0, vitest_1.expect)(r).toContain('run-state.json');
33
+ (0, vitest_1.expect)(r).toContain('.done');
34
+ });
35
+ (0, vitest_1.it)('ctx 传入时系统指令含具体 basename + nodeId', () => {
36
+ const r = (0, prompt_translator_1.translatePrompt)('@{area}', vars, { area: 'x' }, [], { basename: 'flow1', nodeId: 'n_llm_a' });
37
+ (0, vitest_1.expect)(r).toContain('.ccweb/tracks/flow1.run-state.json');
38
+ (0, vitest_1.expect)(r).toContain('nodes.n_llm_a.done');
39
+ (0, vitest_1.expect)(r).toContain('nodes.n_llm_a.failed');
40
+ });
41
+ (0, vitest_1.it)('done flag 指令对 LLM 多步操作友好(明确说"可多步后标")', () => {
42
+ const r = (0, prompt_translator_1.translatePrompt)('@{area}', vars, { area: 'x' }, [], { basename: 'flow1', nodeId: 'n1' });
43
+ (0, vitest_1.expect)(r).toContain('LLM 可以多步交互后再标记');
32
44
  });
33
45
  (0, vitest_1.it)('未声明的 key 保留字面(不替换)', () => {
34
46
  const r = (0, prompt_translator_1.translatePrompt)('@{未知}', vars, {}, []);
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-translator.test.js","sourceRoot":"","sources":["../../../src/track-flow/__tests__/prompt-translator.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-translator.test.js","sourceRoot":"","sources":["../../../src/track-flow/__tests__/prompt-translator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run-state-file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state-file.test.d.ts","sourceRoot":"","sources":["../../../src/track-flow/__tests__/run-state-file.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const run_state_file_1 = require("../run-state-file");
41
+ let folder;
42
+ (0, vitest_1.beforeEach)(() => {
43
+ folder = fs.mkdtempSync(path.join(os.tmpdir(), 'run-state-'));
44
+ });
45
+ (0, vitest_1.afterEach)(() => {
46
+ fs.rmSync(folder, { recursive: true, force: true });
47
+ });
48
+ (0, vitest_1.describe)('run-state-file', () => {
49
+ (0, vitest_1.it)('initialRunState 含所有节点 idle + iter=0', () => {
50
+ const s = (0, run_state_file_1.initialRunState)('r1', 'flow1', [
51
+ { id: 'n_a', type: 'user_input', label: '入口' },
52
+ { id: 'n_b', type: 'llm' },
53
+ ]);
54
+ (0, vitest_1.expect)(s.runId).toBe('r1');
55
+ (0, vitest_1.expect)(s.status).toBe('pending');
56
+ (0, vitest_1.expect)(s.nodes.n_a.status).toBe('idle');
57
+ (0, vitest_1.expect)(s.nodes.n_a.iter).toBe(0);
58
+ (0, vitest_1.expect)(s.nodes.n_a.label).toBe('入口');
59
+ (0, vitest_1.expect)(s.nodes.n_b.label).toBeUndefined();
60
+ });
61
+ (0, vitest_1.it)('writeRunState + readRunState 往返', () => {
62
+ const init = (0, run_state_file_1.initialRunState)('r1', 'flow1', [{ id: 'n_a', type: 'llm' }]);
63
+ (0, run_state_file_1.writeRunState)(folder, 'flow1', init);
64
+ const read = (0, run_state_file_1.readRunState)(folder, 'flow1');
65
+ (0, vitest_1.expect)(read?.runId).toBe('r1');
66
+ (0, vitest_1.expect)(read?.nodes.n_a.type).toBe('llm');
67
+ });
68
+ (0, vitest_1.it)('文件不存在时 readRunState 返 null', () => {
69
+ (0, vitest_1.expect)((0, run_state_file_1.readRunState)(folder, 'nope')).toBeNull();
70
+ });
71
+ (0, vitest_1.it)('版本号不为 1 时 readRunState 拒绝', () => {
72
+ const target = path.join(folder, '.ccweb', 'tracks', 'flow1.run-state.json');
73
+ fs.mkdirSync(path.dirname(target), { recursive: true });
74
+ fs.writeFileSync(target, JSON.stringify({ version: 99, runId: 'x' }));
75
+ (0, vitest_1.expect)((0, run_state_file_1.readRunState)(folder, 'flow1')).toBeNull();
76
+ });
77
+ (0, vitest_1.it)('patchRunState read-modify-write', () => {
78
+ (0, run_state_file_1.writeRunState)(folder, 'flow1', (0, run_state_file_1.initialRunState)('r1', 'flow1', [{ id: 'n_a', type: 'llm' }]));
79
+ (0, run_state_file_1.patchRunState)(folder, 'flow1', (cur) => ({
80
+ ...cur,
81
+ status: 'running',
82
+ nodes: { ...cur.nodes, n_a: { ...cur.nodes.n_a, status: 'active', iter: 1 } },
83
+ }));
84
+ const read = (0, run_state_file_1.readRunState)(folder, 'flow1');
85
+ (0, vitest_1.expect)(read?.status).toBe('running');
86
+ (0, vitest_1.expect)(read?.nodes.n_a.status).toBe('active');
87
+ (0, vitest_1.expect)(read?.nodes.n_a.iter).toBe(1);
88
+ });
89
+ (0, vitest_1.it)('patchRunState 在文件不存在时返 null(不创建)', () => {
90
+ const r = (0, run_state_file_1.patchRunState)(folder, 'absent', (cur) => cur);
91
+ (0, vitest_1.expect)(r).toBeNull();
92
+ });
93
+ (0, vitest_1.it)('getRunStateMtime 文件不存在返 0', () => {
94
+ (0, vitest_1.expect)((0, run_state_file_1.getRunStateMtime)(folder, 'nope')).toBe(0);
95
+ });
96
+ (0, vitest_1.it)('getRunStateMtime 在 write 后递增', () => {
97
+ (0, run_state_file_1.writeRunState)(folder, 'f', (0, run_state_file_1.initialRunState)('r', 'f', []));
98
+ (0, vitest_1.expect)((0, run_state_file_1.getRunStateMtime)(folder, 'f')).toBeGreaterThan(0);
99
+ });
100
+ (0, vitest_1.it)('runStateRelativePath 返相对路径(给 LLM prompt 用)', () => {
101
+ (0, vitest_1.expect)((0, run_state_file_1.runStateRelativePath)('research-loop')).toBe('.ccweb/tracks/research-loop.run-state.json');
102
+ });
103
+ (0, vitest_1.it)('LLM 模拟修改 done flag → readRunState 能读出', () => {
104
+ (0, run_state_file_1.writeRunState)(folder, 'f', (0, run_state_file_1.initialRunState)('r', 'f', [{ id: 'n_a', type: 'llm' }]));
105
+ // 模拟 LLM Edit 文件加 done=true
106
+ (0, run_state_file_1.patchRunState)(folder, 'f', (cur) => ({
107
+ ...cur,
108
+ nodes: { ...cur.nodes, n_a: { ...cur.nodes.n_a, done: true } },
109
+ }));
110
+ const s = (0, run_state_file_1.readRunState)(folder, 'f');
111
+ (0, vitest_1.expect)(s?.nodes.n_a.done).toBe(true);
112
+ (0, vitest_1.expect)(s?.nodes.n_a.failed).toBeUndefined();
113
+ });
114
+ (0, vitest_1.it)('LLM 自报 failed=true + reason → readRunState 能读出', () => {
115
+ (0, run_state_file_1.writeRunState)(folder, 'f', (0, run_state_file_1.initialRunState)('r', 'f', [{ id: 'n_a', type: 'llm' }]));
116
+ (0, run_state_file_1.patchRunState)(folder, 'f', (cur) => ({
117
+ ...cur,
118
+ nodes: { ...cur.nodes, n_a: { ...cur.nodes.n_a, failed: true, reason: '用户输入不合理' } },
119
+ }));
120
+ const s = (0, run_state_file_1.readRunState)(folder, 'f');
121
+ (0, vitest_1.expect)(s?.nodes.n_a.failed).toBe(true);
122
+ (0, vitest_1.expect)(s?.nodes.n_a.reason).toBe('用户输入不合理');
123
+ });
124
+ });
125
+ //# sourceMappingURL=run-state-file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state-file.test.js","sourceRoot":"","sources":["../../../src/track-flow/__tests__/run-state-file.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  export type Injector = (text: string) => void | Promise<void>;
2
2
  export interface DispatchOptions {
3
3
  projectFolder: string;
4
+ basename: string;
5
+ nodeId: string;
6
+ expectedIter: number;
4
7
  injector: Injector;
5
8
  prompt: string;
6
9
  beforeSnapshot: Record<string, unknown>;
@@ -18,6 +21,7 @@ export type DispatchResult = {
18
21
  old: unknown;
19
22
  new: unknown;
20
23
  }[];
24
+ missingOutputs?: string[];
21
25
  } | {
22
26
  kind: 'failed';
23
27
  reason: string;
@@ -25,13 +29,18 @@ export type DispatchResult = {
25
29
  kind: 'cancelled';
26
30
  };
27
31
  /**
28
- * Dispatch one LLM call:
29
- * 1. Atomic-write snapshot to cwd train.json + workflow_data.json
30
- * 2. Inject prompt into project PTY
31
- * 3. Poll train.json mtime — wait until LLM writes (or timeout/cancel)
32
- * 4. Reload train.json (with flush wait + retry) → filter by whitelist
33
- * 5. Diff vs beforeSnapshot; if any output is NOT changed → failed
34
- * 6. Cleanup cwd files
32
+ * v-j 起的完成判定:
33
+ * 1. cwd train.json snapshot(业务变量)
34
+ * 2. inject prompt 系统指令告诉 LLM 完成后改 `.ccweb/tracks/<basename>.run-state.json`
35
+ * 中 nodes[nodeId].done=true,或失败时 nodes[nodeId].failed=true + reason='...'
36
+ * 3. polling run-state.json mtime;每次变化读 nodes[nodeId]:
37
+ * - failed=true 立即 kind:'failed' + LLM 给的 reason
38
+ * - done=true → kind:'success',仍读 train.json varsDiff;outputs 检查降级
39
+ * 为 missingOutputs warning(不阻进下一节点,由 runtime 选择处理)
40
+ * 4. timeout / signal aborted / PTY ref 变化 走原有 fail-fast 路径
41
+ *
42
+ * **不再**依赖 train.json mtime 作为完成信号 —— LLM 多步调用过程中会反复改 train.json,
43
+ * mtime 触发完成会让 LLM 第一次 Edit 就被强制结束节点。
35
44
  */
36
45
  export declare function dispatchLlmCall(opts: DispatchOptions): Promise<DispatchResult>;
37
46
  //# sourceMappingURL=llm-dispatcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-dispatcher.d.ts","sourceRoot":"","sources":["../../src/track-flow/llm-dispatcher.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE7D,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,MAAM,EAAE,WAAW,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAIlB,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;CACrC;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CAAE,GAClH;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAEzB;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAmGpF"}
1
+ {"version":3,"file":"llm-dispatcher.d.ts","sourceRoot":"","sources":["../../src/track-flow/llm-dispatcher.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE7D,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IAGpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,MAAM,EAAE,WAAW,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;CACrC;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7I;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAEzB;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAwGpF"}
@@ -37,42 +37,37 @@ exports.dispatchLlmCall = dispatchLlmCall;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const train_json_sync_1 = require("./train-json-sync");
40
+ const run_state_file_1 = require("./run-state-file");
40
41
  /**
41
- * Dispatch one LLM call:
42
- * 1. Atomic-write snapshot to cwd train.json + workflow_data.json
43
- * 2. Inject prompt into project PTY
44
- * 3. Poll train.json mtime — wait until LLM writes (or timeout/cancel)
45
- * 4. Reload train.json (with flush wait + retry) → filter by whitelist
46
- * 5. Diff vs beforeSnapshot; if any output is NOT changed → failed
47
- * 6. Cleanup cwd files
42
+ * v-j 起的完成判定:
43
+ * 1. cwd train.json snapshot(业务变量)
44
+ * 2. inject prompt 系统指令告诉 LLM 完成后改 `.ccweb/tracks/<basename>.run-state.json`
45
+ * 中 nodes[nodeId].done=true,或失败时 nodes[nodeId].failed=true + reason='...'
46
+ * 3. polling run-state.json mtime;每次变化读 nodes[nodeId]:
47
+ * - failed=true 立即 kind:'failed' + LLM 给的 reason
48
+ * - done=true → kind:'success',仍读 train.json varsDiff;outputs 检查降级
49
+ * 为 missingOutputs warning(不阻进下一节点,由 runtime 选择处理)
50
+ * 4. timeout / signal aborted / PTY ref 变化 走原有 fail-fast 路径
51
+ *
52
+ * **不再**依赖 train.json mtime 作为完成信号 —— LLM 多步调用过程中会反复改 train.json,
53
+ * mtime 触发完成会让 LLM 第一次 Edit 就被强制结束节点。
48
54
  */
49
55
  async function dispatchLlmCall(opts) {
50
56
  const cwd = opts.projectFolder;
51
- // v-h: cwd 文件改为 ccweb 私有名(避免 daemon cleanupStaleCwdFiles 抹掉
52
- // 用户项目自有的 train.json)。文件名必须与 train-json-sync.ts 同步。
53
- const trainJsonPath = path.join(cwd, '.ccweb-flow-train.json');
54
57
  const timeoutMs = opts.timeoutMs ?? 600000;
55
- // 1. Write snapshot
58
+ // 1. snapshot(业务变量初值)
56
59
  (0, train_json_sync_1.copyToProjectCwd)(cwd, (0, train_json_sync_1.filterByWhitelist)(opts.beforeSnapshot, opts.whitelist));
57
- // 记录 initial mtime(snapshot 刚写完)
58
- let initialMtimeMs = 0;
60
+ // 记录 run-state 初始 mtime(runtime 刚写完 active 状态)
61
+ const initialMtimeMs = (0, run_state_file_1.getRunStateMtime)(opts.projectFolder, opts.basename);
59
62
  try {
60
- initialMtimeMs = fs.statSync(trainJsonPath).mtimeMs;
61
- }
62
- catch {
63
- initialMtimeMs = Date.now();
64
- }
65
- try {
66
- // 2. Inject prompt — 记录注入时的 PTY ref,polling 中比对检测 crash
63
+ // 2. inject prompt
67
64
  const ptyRefAtInject = opts.getTerminalRef?.() ?? null;
68
- // v-h Q4 fix:PTY 未启动 / 已死 → 立即 fail,不再傻等 600s 超时。
69
- // (getTerminalRef 未传时跳过此检查保留向后兼容,单测 mock injector 用得到)
70
65
  if (opts.getTerminalRef && ptyRefAtInject === null) {
71
66
  (0, train_json_sync_1.cleanupProjectCwd)(cwd);
72
67
  return { kind: 'failed', reason: 'PTY 未启动或已退出,无法注入 prompt。请确保 CLI 已运行后重新运行工作轨' };
73
68
  }
74
69
  await opts.injector(opts.prompt);
75
- // 3. Poll for mtime change
70
+ // 3. polling run-state.json,读 nodes[nodeId].done / .failed
76
71
  const startedAt = Date.now();
77
72
  const pollInterval = 500;
78
73
  while (true) {
@@ -82,10 +77,8 @@ async function dispatchLlmCall(opts) {
82
77
  }
83
78
  if (Date.now() - startedAt > timeoutMs) {
84
79
  (0, train_json_sync_1.cleanupProjectCwd)(cwd);
85
- return { kind: 'failed', reason: `LLM 调用超时(${timeoutMs}ms 内未修改 .ccweb-flow-train.json)` };
80
+ return { kind: 'failed', reason: `LLM 调用超时(${timeoutMs}ms 内未标 done/failed)` };
86
81
  }
87
- // PTY crash 检测:注入后 PTY 实例换了(terminal-manager 重启),prompt
88
- // 落到了已死的 PTY,新 PTY 不会处理它,再等也没用。
89
82
  if (ptyRefAtInject && opts.getTerminalRef) {
90
83
  const cur = opts.getTerminalRef();
91
84
  if (cur !== ptyRefAtInject) {
@@ -93,26 +86,48 @@ async function dispatchLlmCall(opts) {
93
86
  return { kind: 'failed', reason: 'PTY 在 LLM 调用中重启,prompt 落空。请重新运行' };
94
87
  }
95
88
  }
96
- let mtimeMs = initialMtimeMs;
97
- try {
98
- mtimeMs = fs.statSync(trainJsonPath).mtimeMs;
99
- }
100
- catch {
101
- /* file deleted during call? continue polling */
102
- }
89
+ const mtimeMs = (0, run_state_file_1.getRunStateMtime)(opts.projectFolder, opts.basename);
103
90
  if (mtimeMs > initialMtimeMs + 1) {
104
- // 跳出 polling,进入 reload
105
- break;
91
+ // run-state.json LLM 改了。读出来看 nodes[nodeId]
92
+ const cur = (0, run_state_file_1.readRunState)(opts.projectFolder, opts.basename);
93
+ if (cur === null) {
94
+ // codex P3:文件存在但 readRunState 返 null = schema 不识别(版本不匹配
95
+ // / 文件损坏)。fail-fast 不傻等超时。
96
+ const filePath = path.join(opts.projectFolder, '.ccweb', 'tracks', `${opts.basename}.run-state.json`);
97
+ if (fs.existsSync(filePath)) {
98
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
99
+ return { kind: 'failed', reason: 'run-state.json 解析失败或版本不支持(请检查文件)' };
100
+ }
101
+ // 文件不存在:runtime 还没写 active 状态?等一轮
102
+ await sleep(pollInterval);
103
+ continue;
104
+ }
105
+ const nodeState = cur.nodes?.[opts.nodeId];
106
+ // codex P0:iter 校验。LLM 上一轮可能写过 done=true,runtime 进新一轮时
107
+ // 清了 done=false,但 LLM 进程仍活着可能再写。只 accept 当前 iter 的标记。
108
+ if (nodeState && nodeState.iter === opts.expectedIter) {
109
+ if (nodeState.failed === true) {
110
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
111
+ // codex P2 #5:reason 必须是字符串才采纳
112
+ const reason = typeof nodeState.reason === 'string' && nodeState.reason.length > 0
113
+ ? `LLM 自报失败:${nodeState.reason}`
114
+ : 'LLM 标记 failed=true 但未给有效 reason';
115
+ return { kind: 'failed', reason };
116
+ }
117
+ if (nodeState.done === true) {
118
+ break; // 完成
119
+ }
120
+ }
121
+ // 否则只是 LLM 改了别的字段 / iter 不匹配的 stale 标记,继续等
106
122
  }
107
123
  await sleep(pollInterval);
108
124
  }
109
- // 4. Reload(含 200/500ms 等待 + 重试)
125
+ // 4. reload train.json 拿变量更新 diff
110
126
  const reload = await (0, train_json_sync_1.reloadFromProjectCwd)(cwd);
111
127
  if (!reload.ok || !reload.data) {
112
128
  (0, train_json_sync_1.cleanupProjectCwd)(cwd);
113
129
  return { kind: 'failed', reason: `.ccweb-flow-train.json reload 失败:${reload.error ?? 'unknown'}` };
114
130
  }
115
- // 5. Diff + outputs check
116
131
  const newSnapshotFiltered = (0, train_json_sync_1.filterByWhitelist)(reload.data, opts.whitelist);
117
132
  const varsDiff = [];
118
133
  for (const k of Object.keys(newSnapshotFiltered)) {
@@ -122,18 +137,12 @@ async function dispatchLlmCall(opts) {
122
137
  varsDiff.push({ key: k, old: oldV, new: newV });
123
138
  }
124
139
  }
125
- // outputs 中每个字段必须出现在 varsDiff(spec §6.2 step 5)
140
+ // outputs 校验降级为 warning:done=true 但某些 outputs 未改 → 仍 success,
141
+ // 但返回 missingOutputs 让 runtime 记 warning(spec §6.2 调整:相信 LLM 自报)
126
142
  const changedKeys = new Set(varsDiff.map((d) => d.key));
127
143
  const missingOutputs = opts.outputs.filter((k) => !changedKeys.has(k));
128
- if (missingOutputs.length > 0) {
129
- (0, train_json_sync_1.cleanupProjectCwd)(cwd);
130
- return {
131
- kind: 'failed',
132
- reason: `LLM 未按要求修改字段:${missingOutputs.join(', ')}`,
133
- };
134
- }
135
144
  (0, train_json_sync_1.cleanupProjectCwd)(cwd);
136
- return { kind: 'success', newSnapshot: newSnapshotFiltered, varsDiff };
145
+ return { kind: 'success', newSnapshot: newSnapshotFiltered, varsDiff, missingOutputs: missingOutputs.length > 0 ? missingOutputs : undefined };
137
146
  }
138
147
  catch (e) {
139
148
  (0, train_json_sync_1.cleanupProjectCwd)(cwd);
@@ -1 +1 @@
1
- {"version":3,"file":"llm-dispatcher.js","sourceRoot":"","sources":["../../src/track-flow/llm-dispatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-dispatcher.js","sourceRoot":"","sources":["../../src/track-flow/llm-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -5,15 +5,20 @@ export interface VarDecl {
5
5
  }
6
6
  /**
7
7
  * Translate a prompt template by replacing @{key} (input) and ${key}
8
- * (output) placeholders with descriptive metadata, then optionally append
9
- * a system instruction section telling the LLM to modify train.json.
8
+ * (output) placeholders with descriptive metadata, then append the
9
+ * v-j 系统指令段告诉 LLM
10
+ * - 业务变量存 `.ccweb-flow-train.json`(${key} 引用的字段最好也更新)
11
+ * - 运行进度存 `.ccweb/tracks/<basename>.run-state.json`
12
+ * - 完成任务后必须改 run-state.json 把 `nodes.<nodeId>.done` 设为 true
13
+ * - 任务不可完成时把 `nodes.<nodeId>.failed` 设为 true + 写 reason 字符串
10
14
  *
11
- * spec §7
12
- * - @{key} `key(description)='<value>'`
13
- * - ${key} → `修改变量 key(description;记录路径为 train.json 中的 key:key)=<value> 为...`
14
- * - 末尾系统指令段(仅 outputs 非空时)
15
+ * spec §7(v-j 修订):完成判定从 "outputs 改了 = 完成" 改为 "LLM 自报 done=true",
16
+ * 避免 LLM 第一次 Edit 就被强制结束节点(影响多步操作场景)。
15
17
  *
16
18
  * Unknown keys (not in `variables`) are preserved literally to aid debugging.
17
19
  */
18
- export declare function translatePrompt(template: string, variables: VarDecl[], snapshot: Record<string, unknown>, outputs: string[]): string;
20
+ export declare function translatePrompt(template: string, variables: VarDecl[], snapshot: Record<string, unknown>, outputs: string[], ctx?: {
21
+ basename: string;
22
+ nodeId: string;
23
+ }): string;
19
24
  //# sourceMappingURL=prompt-translator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-translator.d.ts","sourceRoot":"","sources":["../../src/track-flow/prompt-translator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;CACtB;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAAE,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,MAAM,EAAE,GAChB,MAAM,CAmBR"}
1
+ {"version":3,"file":"prompt-translator.d.ts","sourceRoot":"","sources":["../../src/track-flow/prompt-translator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;CACtB;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAAE,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,CAAC,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC,MAAM,CAkBR"}
@@ -19,17 +19,19 @@ function formatValue(v) {
19
19
  }
20
20
  /**
21
21
  * Translate a prompt template by replacing @{key} (input) and ${key}
22
- * (output) placeholders with descriptive metadata, then optionally append
23
- * a system instruction section telling the LLM to modify train.json.
22
+ * (output) placeholders with descriptive metadata, then append the
23
+ * v-j 系统指令段告诉 LLM
24
+ * - 业务变量存 `.ccweb-flow-train.json`(${key} 引用的字段最好也更新)
25
+ * - 运行进度存 `.ccweb/tracks/<basename>.run-state.json`
26
+ * - 完成任务后必须改 run-state.json 把 `nodes.<nodeId>.done` 设为 true
27
+ * - 任务不可完成时把 `nodes.<nodeId>.failed` 设为 true + 写 reason 字符串
24
28
  *
25
- * spec §7
26
- * - @{key} `key(description)='<value>'`
27
- * - ${key} → `修改变量 key(description;记录路径为 train.json 中的 key:key)=<value> 为...`
28
- * - 末尾系统指令段(仅 outputs 非空时)
29
+ * spec §7(v-j 修订):完成判定从 "outputs 改了 = 完成" 改为 "LLM 自报 done=true",
30
+ * 避免 LLM 第一次 Edit 就被强制结束节点(影响多步操作场景)。
29
31
  *
30
32
  * Unknown keys (not in `variables`) are preserved literally to aid debugging.
31
33
  */
32
- function translatePrompt(template, variables, snapshot, outputs) {
34
+ function translatePrompt(template, variables, snapshot, outputs, ctx) {
33
35
  const byKey = new Map(variables.map((v) => [v.key, v]));
34
36
  let result = template.replace(/@\{(\w+)\}/g, (_m, key) => {
35
37
  const decl = byKey.get(key);
@@ -43,20 +45,32 @@ function translatePrompt(template, variables, snapshot, outputs) {
43
45
  return `\${${key}}`;
44
46
  return `修改变量 ${key}(${decl.description};记录路径为 .ccweb-flow-train.json 中的 key:${key})=${formatValue(snapshot[key] ?? null)} 为...`;
45
47
  });
46
- if (outputs.length > 0) {
47
- result += '\n\n' + buildSystemInstruction(outputs);
48
- }
48
+ // 系统指令始终追加(v-j:即便 outputs 为空,也得告诉 LLM 通过 done flag 结束节点)
49
+ result += '\n\n' + buildSystemInstruction(outputs, ctx);
49
50
  return result;
50
51
  }
51
- function buildSystemInstruction(outputs) {
52
- // 文件名必须与 train-json-sync.ts 的 TRAIN_JSON_NAME 同步(v-h 改成 ccweb
53
- // 私有名,避开用户项目自有的 train.json)。
54
- return [
52
+ function buildSystemInstruction(outputs, ctx) {
53
+ const runStatePath = ctx
54
+ ? `.ccweb/tracks/${ctx.basename}.run-state.json`
55
+ : '.ccweb/tracks/<basename>.run-state.json';
56
+ const nodeId = ctx?.nodeId ?? '<节点 id>';
57
+ const lines = [
55
58
  '【系统指令】',
56
- '本工作轨的全局变量记录在当前目录的 .ccweb-flow-train.json 文件中。',
57
- '本节点完成时,请用 Edit/Write 工具修改 .ccweb-flow-train.json 文件,',
58
- `更新以下字段:${outputs.join(', ')}`,
59
- '(其他字段不要改)。完成修改后告知"已写入"。',
60
- ].join('\n');
59
+ '运行进度记录在文件 `' + runStatePath + '`(相对当前项目根目录)。',
60
+ `本节点 id \`${nodeId}\`,状态在该文件的 \`nodes.${nodeId}\` 下。`,
61
+ '',
62
+ '完成本节点的任务后,请用 Edit/Write 工具修改 run-state.json:',
63
+ ` 把 \`nodes.${nodeId}.done\` 设为 true。`,
64
+ '',
65
+ '如果任务无法完成(如用户输入不合理 / 资源不可用),请改 run-state.json:',
66
+ ` 把 \`nodes.${nodeId}.failed\` 设为 true,并把 \`nodes.${nodeId}.reason\` 设为字符串(说明原因)。`,
67
+ '',
68
+ 'ccweb 实时监听该文件;done=true 后进入下一节点,failed=true 后停止整个工作轨。',
69
+ '在 done/failed 标记前 ccweb 不会推进,**LLM 可以多步交互后再标记**。',
70
+ ];
71
+ if (outputs.length > 0) {
72
+ lines.push('', '业务变量在 `.ccweb-flow-train.json`,本节点声明的输出字段:' + outputs.join(', '), '(任务过程中也请用 Edit/Write 更新这些字段,未更新会在 audit log 留 warning 但不阻塞)。');
73
+ }
74
+ return lines.join('\n');
61
75
  }
62
76
  //# sourceMappingURL=prompt-translator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-translator.js","sourceRoot":"","sources":["../../src/track-flow/prompt-translator.ts"],"names":[],"mappings":";;AAgCA,0CAwBC;AAlDD;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,CAAU;IAC7B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;IACtF,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IACrE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AACtD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,eAAe,CAC7B,QAAgB,EAChB,SAAoB,EACpB,QAAiC,EACjC,OAAiB;IAEjB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAExE,IAAI,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,GAAW,EAAE,EAAE;QAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,GAAG,GAAG,CAAA;QAC7B,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,GAAW,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO,MAAM,GAAG,GAAG,CAAA;QAC9B,OAAO,QAAQ,GAAG,IAAI,IAAI,CAAC,WAAW,wCAAwC,GAAG,KAAK,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAA;IACjI,CAAC,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAiB;IAC/C,8DAA8D;IAC9D,6BAA6B;IAC7B,OAAO;QACL,QAAQ;QACR,+CAA+C;QAC/C,sDAAsD;QACtD,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9B,yBAAyB;KAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"prompt-translator.js","sourceRoot":"","sources":["../../src/track-flow/prompt-translator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export type RunStateStatus = 'pending' | 'running' | 'waiting_user_input' | 'completed' | 'failed' | 'cancelled';
2
+ export type NodeStatus = 'idle' | 'active' | 'completed' | 'failed' | 'skipped' | 'waiting_user_input';
3
+ export interface NodeRunState {
4
+ label?: string;
5
+ type: 'user_input' | 'llm' | 'if';
6
+ status: NodeStatus;
7
+ iter: number;
8
+ lastActiveAt?: number;
9
+ lastCompletedAt?: number;
10
+ done?: boolean;
11
+ failed?: boolean;
12
+ reason?: string | null;
13
+ }
14
+ export interface RunStateFile {
15
+ version: 1;
16
+ runId: string;
17
+ basename: string;
18
+ startedAt: number;
19
+ finishedAt?: number | null;
20
+ status: RunStateStatus;
21
+ currentNodeId: string | null;
22
+ nodes: Record<string, NodeRunState>;
23
+ error?: {
24
+ nodeId?: string;
25
+ message: string;
26
+ } | null;
27
+ }
28
+ export declare function writeRunState(projectFolder: string, basename: string, state: RunStateFile): boolean;
29
+ /** 读取 run-state.json。文件不存在 / parse 失败返 null。 */
30
+ export declare function readRunState(projectFolder: string, basename: string): RunStateFile | null;
31
+ /** statSync mtime — dispatcher polling 用。 */
32
+ export declare function getRunStateMtime(projectFolder: string, basename: string): number;
33
+ /** 返回 sidecar 文件**相对项目根**的路径,用于 prompt 系统指令告知 LLM。 */
34
+ export declare function runStateRelativePath(basename: string): string;
35
+ export declare function initialRunState(runId: string, basename: string, nodes: {
36
+ id: string;
37
+ type: NodeRunState['type'];
38
+ label?: string;
39
+ }[]): RunStateFile;
40
+ /** Mutate-and-write helper:runtime 在每个状态切换点调一次,承担 read-modify-write 与
41
+ * 原子写。文件可能并发被 LLM 改写(done flag),所以必须 read 最新值再 merge。 */
42
+ export declare function patchRunState(projectFolder: string, basename: string, patcher: (cur: RunStateFile) => RunStateFile): RunStateFile | null;
43
+ //# sourceMappingURL=run-state-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state-file.d.ts","sourceRoot":"","sources":["../../src/track-flow/run-state-file.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,cAAc,GACtB,SAAS,GAAG,SAAS,GAAG,oBAAoB,GAC5C,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;AAExC,MAAM,MAAM,UAAU,GAClB,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,oBAAoB,CAAA;AAEjF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,YAAY,GAAG,KAAK,GAAG,IAAI,CAAA;IACjC,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACpD;AAkBD,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GAClB,OAAO,CAET;AAED,gDAAgD;AAChD,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,YAAY,GAAG,IAAI,CAWrB;AAED,6CAA6C;AAC7C,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMhF;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAClE,YAAY,CAqBd;AAED;0DAC0D;AAC1D,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,YAAY,GAC3C,YAAY,GAAG,IAAI,CAMrB"}