@tom2012/cc-web 2026.5.18-c → 2026.5.18-e

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 (112) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/index.d.ts.map +1 -1
  3. package/backend/dist/index.js +7 -0
  4. package/backend/dist/index.js.map +1 -1
  5. package/backend/dist/routes/_flow-injector.d.ts +4 -0
  6. package/backend/dist/routes/_flow-injector.d.ts.map +1 -0
  7. package/backend/dist/routes/_flow-injector.js +17 -0
  8. package/backend/dist/routes/_flow-injector.js.map +1 -0
  9. package/backend/dist/routes/track-flows.d.ts +12 -0
  10. package/backend/dist/routes/track-flows.d.ts.map +1 -0
  11. package/backend/dist/routes/track-flows.js +225 -0
  12. package/backend/dist/routes/track-flows.js.map +1 -0
  13. package/backend/dist/terminal-manager-singleton.d.ts +9 -0
  14. package/backend/dist/terminal-manager-singleton.d.ts.map +1 -0
  15. package/backend/dist/terminal-manager-singleton.js +6 -0
  16. package/backend/dist/terminal-manager-singleton.js.map +1 -0
  17. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts +2 -0
  18. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts.map +1 -0
  19. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js +65 -0
  20. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js.map +1 -0
  21. package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts +2 -0
  22. package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts.map +1 -0
  23. package/backend/dist/track-flow/__tests__/if-expr-parser.test.js +76 -0
  24. package/backend/dist/track-flow/__tests__/if-expr-parser.test.js.map +1 -0
  25. package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts +2 -0
  26. package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts.map +1 -0
  27. package/backend/dist/track-flow/__tests__/prompt-translator.test.js +59 -0
  28. package/backend/dist/track-flow/__tests__/prompt-translator.test.js.map +1 -0
  29. package/backend/dist/track-flow/__tests__/run-registry.test.d.ts +2 -0
  30. package/backend/dist/track-flow/__tests__/run-registry.test.d.ts.map +1 -0
  31. package/backend/dist/track-flow/__tests__/run-registry.test.js +54 -0
  32. package/backend/dist/track-flow/__tests__/run-registry.test.js.map +1 -0
  33. package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts +2 -0
  34. package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts.map +1 -0
  35. package/backend/dist/track-flow/__tests__/train-json-sync.test.js +93 -0
  36. package/backend/dist/track-flow/__tests__/train-json-sync.test.js.map +1 -0
  37. package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts +2 -0
  38. package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts.map +1 -0
  39. package/backend/dist/track-flow/__tests__/verify-flow-v3.js +177 -0
  40. package/backend/dist/track-flow/__tests__/verify-flow-v3.js.map +1 -0
  41. package/backend/dist/track-flow/audit-log.d.ts +22 -0
  42. package/backend/dist/track-flow/audit-log.d.ts.map +1 -0
  43. package/backend/dist/track-flow/audit-log.js +56 -0
  44. package/backend/dist/track-flow/audit-log.js.map +1 -0
  45. package/backend/dist/track-flow/if-expr-evaluator.d.ts +14 -0
  46. package/backend/dist/track-flow/if-expr-evaluator.d.ts.map +1 -0
  47. package/backend/dist/track-flow/if-expr-evaluator.js +73 -0
  48. package/backend/dist/track-flow/if-expr-evaluator.js.map +1 -0
  49. package/backend/dist/track-flow/if-expr-parser.d.ts +34 -0
  50. package/backend/dist/track-flow/if-expr-parser.d.ts.map +1 -0
  51. package/backend/dist/track-flow/if-expr-parser.js +176 -0
  52. package/backend/dist/track-flow/if-expr-parser.js.map +1 -0
  53. package/backend/dist/track-flow/index.d.ts +10 -0
  54. package/backend/dist/track-flow/index.d.ts.map +1 -0
  55. package/backend/dist/track-flow/index.js +26 -0
  56. package/backend/dist/track-flow/index.js.map +1 -0
  57. package/backend/dist/track-flow/llm-dispatcher.d.ts +36 -0
  58. package/backend/dist/track-flow/llm-dispatcher.d.ts.map +1 -0
  59. package/backend/dist/track-flow/llm-dispatcher.js +145 -0
  60. package/backend/dist/track-flow/llm-dispatcher.js.map +1 -0
  61. package/backend/dist/track-flow/prompt-translator.d.ts +19 -0
  62. package/backend/dist/track-flow/prompt-translator.d.ts.map +1 -0
  63. package/backend/dist/track-flow/prompt-translator.js +60 -0
  64. package/backend/dist/track-flow/prompt-translator.js.map +1 -0
  65. package/backend/dist/track-flow/run-id.d.ts +2 -0
  66. package/backend/dist/track-flow/run-id.d.ts.map +1 -0
  67. package/backend/dist/track-flow/run-id.js +7 -0
  68. package/backend/dist/track-flow/run-id.js.map +1 -0
  69. package/backend/dist/track-flow/run-registry.d.ts +77 -0
  70. package/backend/dist/track-flow/run-registry.d.ts.map +1 -0
  71. package/backend/dist/track-flow/run-registry.js +148 -0
  72. package/backend/dist/track-flow/run-registry.js.map +1 -0
  73. package/backend/dist/track-flow/runtime.d.ts +59 -0
  74. package/backend/dist/track-flow/runtime.d.ts.map +1 -0
  75. package/backend/dist/track-flow/runtime.js +204 -0
  76. package/backend/dist/track-flow/runtime.js.map +1 -0
  77. package/backend/dist/track-flow/store.d.ts +20 -0
  78. package/backend/dist/track-flow/store.d.ts.map +1 -0
  79. package/backend/dist/track-flow/store.js +158 -0
  80. package/backend/dist/track-flow/store.js.map +1 -0
  81. package/backend/dist/track-flow/train-json-sync.d.ts +31 -0
  82. package/backend/dist/track-flow/train-json-sync.d.ts.map +1 -0
  83. package/backend/dist/track-flow/train-json-sync.js +130 -0
  84. package/backend/dist/track-flow/train-json-sync.js.map +1 -0
  85. package/backend/dist/track-flow-ws.d.ts +5 -0
  86. package/backend/dist/track-flow-ws.d.ts.map +1 -0
  87. package/backend/dist/track-flow-ws.js +14 -0
  88. package/backend/dist/track-flow-ws.js.map +1 -0
  89. package/backend/package-lock.json +2071 -66
  90. package/backend/package.json +7 -2
  91. package/frontend/dist/assets/{ChatOverlay-i8gy2y-T.js → ChatOverlay-BsozN13k.js} +1 -1
  92. package/frontend/dist/assets/{GraphPreview-CoOHeDk0.js → GraphPreview-Bagqaatf.js} +2 -2
  93. package/frontend/dist/assets/{MobilePage-ZYuVSqIu.js → MobilePage-BTKA6Dxj.js} +3 -3
  94. package/frontend/dist/assets/{OfficePreview-BP_FVyDv.js → OfficePreview-CMRAt1Qb.js} +2 -2
  95. package/frontend/dist/assets/{PdfPreview-B_Is_82c.js → PdfPreview-DM7Lq8lA.js} +1 -1
  96. package/frontend/dist/assets/ProjectPage-3rERYJYF.js +26 -0
  97. package/frontend/dist/assets/ProjectPage-DFCEXprr.css +32 -0
  98. package/frontend/dist/assets/{SettingsPage-DlqnuIy1.js → SettingsPage-CA9PjfJR.js} +2 -2
  99. package/frontend/dist/assets/{SkillHubPage-FFefLcmN.js → SkillHubPage-DLt5DGX6.js} +2 -2
  100. package/frontend/dist/assets/{chevron-down-DqAoFpmS.js → chevron-down-D7HR2Yyz.js} +1 -1
  101. package/frontend/dist/assets/{index-Bj-uhUZY.js → index-fIUNz576.js} +1 -1
  102. package/frontend/dist/assets/{index-B5mDtgD1.js → index-k0ydgbQO.js} +7 -7
  103. package/frontend/dist/assets/{index-DzYZJMgp.js → index-tE28G1ot.js} +1 -1
  104. package/frontend/dist/assets/index-tSU3-nNc.css +1 -0
  105. package/frontend/dist/assets/{jszip.min-DW73pE0J.js → jszip.min-BDxK042T.js} +1 -1
  106. package/frontend/dist/assets/{select-HgZm25ew.js → select-C6nWxQ7S.js} +2 -2
  107. package/frontend/dist/assets/{user-BOTyiGCj.js → user-DbW3r9c3.js} +1 -1
  108. package/frontend/dist/index.html +2 -2
  109. package/package.json +1 -1
  110. package/frontend/dist/assets/ProjectPage-9CEnUXvW.css +0 -32
  111. package/frontend/dist/assets/ProjectPage-Bi7P0xvD.js +0 -26
  112. package/frontend/dist/assets/index-mxYmpvtf.css +0 -1
@@ -0,0 +1,14 @@
1
+ import type { IfExprAst } from './if-expr-parser';
2
+ /**
3
+ * Evaluate an IfExprAst against a runtime scope (train.json snapshot).
4
+ * Returns boolean. Designed to NEVER throw — spec §5.4 null-safe semantics:
5
+ *
6
+ * - `x == null` / `null == x` / `x != null` / `null != x` → strict === / !==
7
+ * - 其他与 null 比较(如 `x == 5` 当 x=null)→ false(不报错)
8
+ * - 关系算子两边任一为 null → false
9
+ * - 类型不匹配(如 `"abc" > 5`)→ false
10
+ * - && / || 短路:null 视为 falsy
11
+ * - 未定义变量 = null
12
+ */
13
+ export declare function evaluateIfExpr(ast: IfExprAst, scope: Record<string, unknown>): boolean;
14
+ //# sourceMappingURL=if-expr-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"if-expr-evaluator.d.ts","sourceRoot":"","sources":["../../src/track-flow/if-expr-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAEtF"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateIfExpr = evaluateIfExpr;
4
+ /**
5
+ * Evaluate an IfExprAst against a runtime scope (train.json snapshot).
6
+ * Returns boolean. Designed to NEVER throw — spec §5.4 null-safe semantics:
7
+ *
8
+ * - `x == null` / `null == x` / `x != null` / `null != x` → strict === / !==
9
+ * - 其他与 null 比较(如 `x == 5` 当 x=null)→ false(不报错)
10
+ * - 关系算子两边任一为 null → false
11
+ * - 类型不匹配(如 `"abc" > 5`)→ false
12
+ * - && / || 短路:null 视为 falsy
13
+ * - 未定义变量 = null
14
+ */
15
+ function evaluateIfExpr(ast, scope) {
16
+ return !!evaluateValue(ast, scope);
17
+ }
18
+ /** Returns the raw value of the expression (used internally for short-circuit). */
19
+ function evaluateValue(ast, scope) {
20
+ if (ast.kind === 'literal')
21
+ return ast.value;
22
+ if (ast.kind === 'var') {
23
+ const v = scope[ast.name];
24
+ return v === undefined ? null : v;
25
+ }
26
+ if (ast.kind === 'and') {
27
+ const lv = evaluateValue(ast.left, scope);
28
+ if (!isTruthy(lv))
29
+ return false;
30
+ const rv = evaluateValue(ast.right, scope);
31
+ return isTruthy(rv);
32
+ }
33
+ if (ast.kind === 'or') {
34
+ const lv = evaluateValue(ast.left, scope);
35
+ if (isTruthy(lv))
36
+ return true;
37
+ const rv = evaluateValue(ast.right, scope);
38
+ return isTruthy(rv);
39
+ }
40
+ // compare
41
+ const left = evaluateValue(ast.left, scope);
42
+ const right = evaluateValue(ast.right, scope);
43
+ const op = ast.op;
44
+ // null-safe equality
45
+ if (op === '==')
46
+ return left === right;
47
+ if (op === '!=')
48
+ return left !== right;
49
+ // relational ops: 任一边为 null → false
50
+ if (left === null || right === null)
51
+ return false;
52
+ // 类型匹配才比较
53
+ if (typeof left === 'number' && typeof right === 'number') {
54
+ if (op === '>')
55
+ return left > right;
56
+ if (op === '<')
57
+ return left < right;
58
+ if (op === '>=')
59
+ return left >= right;
60
+ if (op === '<=')
61
+ return left <= right;
62
+ }
63
+ // 字符串:仅 == / != 处理过;> / < 不支持 → false
64
+ return false;
65
+ }
66
+ function isTruthy(v) {
67
+ if (v === null || v === undefined)
68
+ return false;
69
+ if (v === false || v === 0 || v === '')
70
+ return false;
71
+ return true;
72
+ }
73
+ //# sourceMappingURL=if-expr-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"if-expr-evaluator.js","sourceRoot":"","sources":["../../src/track-flow/if-expr-evaluator.ts"],"names":[],"mappings":";;AAaA,wCAEC;AAbD;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,GAAc,EAAE,KAA8B;IAC3E,OAAO,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACpC,CAAC;AAED,mFAAmF;AACnF,SAAS,aAAa,CAAC,GAAc,EAAE,KAA8B;IACnE,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,KAAK,CAAA;IAC5C,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACzB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAA;QAC/B,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAA;IACrB,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,IAAI,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAA;QAC7B,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAA;IACrB,CAAC;IACD,UAAU;IACV,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;IAEjB,qBAAqB;IACrB,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,KAAK,KAAK,CAAA;IACtC,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,KAAK,KAAK,CAAA;IAEtC,oCAAoC;IACpC,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAEjD,UAAU;IACV,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC1D,IAAI,EAAE,KAAK,GAAG;YAAE,OAAO,IAAI,GAAG,KAAK,CAAA;QACnC,IAAI,EAAE,KAAK,GAAG;YAAE,OAAO,IAAI,GAAG,KAAK,CAAA;QACnC,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,IAAI,IAAI,KAAK,CAAA;QACrC,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,IAAI,IAAI,KAAK,CAAA;IACvC,CAAC;IACD,sCAAsC;IACtC,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAC/C,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IACpD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Restricted expression language for IfNode.conditionExpr (spec §5.4).
3
+ *
4
+ * expr := term (('&&'|'||') term)* — left-associative, same priority
5
+ * term := atom (('=='|'!='|'>'|'<'|'>='|'<=') atom)?
6
+ * atom := varName | literal | '(' expr ')'
7
+ * literal := number | string | 'true' | 'false' | 'null'
8
+ * varName := [a-zA-Z_][a-zA-Z0-9_]*
9
+ *
10
+ * No function calls, no arithmetic, no field access — kept tiny so it can
11
+ * be evaluated safely without eval().
12
+ */
13
+ export type IfExprAst = {
14
+ kind: 'literal';
15
+ value: number | string | boolean | null;
16
+ } | {
17
+ kind: 'var';
18
+ name: string;
19
+ } | {
20
+ kind: 'compare';
21
+ op: '==' | '!=' | '>' | '<' | '>=' | '<=';
22
+ left: IfExprAst;
23
+ right: IfExprAst;
24
+ } | {
25
+ kind: 'and';
26
+ left: IfExprAst;
27
+ right: IfExprAst;
28
+ } | {
29
+ kind: 'or';
30
+ left: IfExprAst;
31
+ right: IfExprAst;
32
+ };
33
+ export declare function parseIfExpr(src: string): IfExprAst;
34
+ //# sourceMappingURL=if-expr-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"if-expr-parser.d.ts","sourceRoot":"","sources":["../../src/track-flow/if-expr-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACjG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAA;AAgJrD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAOlD"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * Restricted expression language for IfNode.conditionExpr (spec §5.4).
4
+ *
5
+ * expr := term (('&&'|'||') term)* — left-associative, same priority
6
+ * term := atom (('=='|'!='|'>'|'<'|'>='|'<=') atom)?
7
+ * atom := varName | literal | '(' expr ')'
8
+ * literal := number | string | 'true' | 'false' | 'null'
9
+ * varName := [a-zA-Z_][a-zA-Z0-9_]*
10
+ *
11
+ * No function calls, no arithmetic, no field access — kept tiny so it can
12
+ * be evaluated safely without eval().
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.parseIfExpr = parseIfExpr;
16
+ function tokenize(src) {
17
+ const tokens = [];
18
+ let i = 0;
19
+ while (i < src.length) {
20
+ const c = src[i];
21
+ if (/\s/.test(c)) {
22
+ i++;
23
+ continue;
24
+ }
25
+ // 字符串
26
+ if (c === '"') {
27
+ const end = src.indexOf('"', i + 1);
28
+ if (end === -1)
29
+ throw new Error(`unterminated string at position ${i}`);
30
+ tokens.push({ kind: 'str', value: src.slice(i + 1, end) });
31
+ i = end + 1;
32
+ continue;
33
+ }
34
+ // 数字(含可选 -)
35
+ if (/[0-9]/.test(c) || (c === '-' && /[0-9]/.test(src[i + 1] ?? ''))) {
36
+ let j = i + (c === '-' ? 1 : 0);
37
+ while (j < src.length && /[0-9.]/.test(src[j]))
38
+ j++;
39
+ const numStr = src.slice(i, j);
40
+ const num = Number(numStr);
41
+ if (Number.isNaN(num))
42
+ throw new Error(`invalid number "${numStr}"`);
43
+ tokens.push({ kind: 'num', value: num });
44
+ i = j;
45
+ continue;
46
+ }
47
+ // 标识符 / 关键字
48
+ if (/[a-zA-Z_]/.test(c)) {
49
+ let j = i;
50
+ while (j < src.length && /[a-zA-Z0-9_]/.test(src[j]))
51
+ j++;
52
+ const word = src.slice(i, j);
53
+ if (word === 'true' || word === 'false' || word === 'null') {
54
+ tokens.push({ kind: 'kw', value: word });
55
+ }
56
+ else {
57
+ tokens.push({ kind: 'ident', value: word });
58
+ }
59
+ i = j;
60
+ continue;
61
+ }
62
+ // 运算符
63
+ const two = src.slice(i, i + 2);
64
+ if (['==', '!=', '>=', '<=', '&&', '||'].includes(two)) {
65
+ tokens.push({ kind: 'op', value: two });
66
+ i += 2;
67
+ continue;
68
+ }
69
+ if (c === '>' || c === '<') {
70
+ tokens.push({ kind: 'op', value: c });
71
+ i += 1;
72
+ continue;
73
+ }
74
+ if (c === '(' || c === ')') {
75
+ tokens.push({ kind: 'punc', value: c });
76
+ i += 1;
77
+ continue;
78
+ }
79
+ throw new Error(`unexpected character '${c}' at position ${i}`);
80
+ }
81
+ return tokens;
82
+ }
83
+ class Parser {
84
+ constructor(tokens) {
85
+ this.tokens = tokens;
86
+ this.pos = 0;
87
+ }
88
+ parseExpr() {
89
+ let left = this.parseTerm();
90
+ while (this.peek('op', '&&') || this.peek('op', '||')) {
91
+ const op = this.tokens[this.pos].value;
92
+ this.pos++;
93
+ const right = this.parseTerm();
94
+ left = op === '&&'
95
+ ? { kind: 'and', left, right }
96
+ : { kind: 'or', left, right };
97
+ }
98
+ return left;
99
+ }
100
+ parseTerm() {
101
+ const left = this.parseAtom();
102
+ const op = this.peekOp(['==', '!=', '>', '<', '>=', '<=']);
103
+ if (op) {
104
+ this.pos++;
105
+ const right = this.parseAtom();
106
+ return { kind: 'compare', op, left, right };
107
+ }
108
+ return left;
109
+ }
110
+ parseAtom() {
111
+ const t = this.tokens[this.pos];
112
+ if (!t)
113
+ throw new Error('unexpected end of input');
114
+ if (t.kind === 'num') {
115
+ this.pos++;
116
+ return { kind: 'literal', value: t.value };
117
+ }
118
+ if (t.kind === 'str') {
119
+ this.pos++;
120
+ return { kind: 'literal', value: t.value };
121
+ }
122
+ if (t.kind === 'kw') {
123
+ this.pos++;
124
+ const v = t.value === 'true' ? true : t.value === 'false' ? false : null;
125
+ return { kind: 'literal', value: v };
126
+ }
127
+ if (t.kind === 'ident') {
128
+ this.pos++;
129
+ return { kind: 'var', name: t.value };
130
+ }
131
+ if (t.kind === 'punc' && t.value === '(') {
132
+ this.pos++;
133
+ const inner = this.parseExpr();
134
+ const close = this.tokens[this.pos];
135
+ if (!close || close.kind !== 'punc' || close.value !== ')') {
136
+ throw new Error('missing closing paren');
137
+ }
138
+ this.pos++;
139
+ return inner;
140
+ }
141
+ throw new Error(`unexpected token ${JSON.stringify(t)}`);
142
+ }
143
+ peek(kind, value) {
144
+ const t = this.tokens[this.pos];
145
+ if (!t)
146
+ return false;
147
+ if (t.kind !== kind)
148
+ return false;
149
+ if (value !== undefined && t.value !== value)
150
+ return false;
151
+ return true;
152
+ }
153
+ peekOp(ops) {
154
+ const t = this.tokens[this.pos];
155
+ if (!t || t.kind !== 'op')
156
+ return null;
157
+ if (!ops.includes(t.value))
158
+ return null;
159
+ return t.value;
160
+ }
161
+ ensureFullyConsumed() {
162
+ if (this.pos < this.tokens.length) {
163
+ throw new Error(`extra tokens after parse: ${JSON.stringify(this.tokens[this.pos])}`);
164
+ }
165
+ }
166
+ }
167
+ function parseIfExpr(src) {
168
+ const tokens = tokenize(src);
169
+ if (tokens.length === 0)
170
+ throw new Error('empty expression');
171
+ const parser = new Parser(tokens);
172
+ const ast = parser.parseExpr();
173
+ parser.ensureFullyConsumed();
174
+ return ast;
175
+ }
176
+ //# sourceMappingURL=if-expr-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"if-expr-parser.js","sourceRoot":"","sources":["../../src/track-flow/if-expr-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from './store';
2
+ export * from './prompt-translator';
3
+ export * from './if-expr-parser';
4
+ export * from './if-expr-evaluator';
5
+ export * from './train-json-sync';
6
+ export * from './run-registry';
7
+ export * from './llm-dispatcher';
8
+ export * from './audit-log';
9
+ export * from './runtime';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/track-flow/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
@@ -0,0 +1,26 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./store"), exports);
18
+ __exportStar(require("./prompt-translator"), exports);
19
+ __exportStar(require("./if-expr-parser"), exports);
20
+ __exportStar(require("./if-expr-evaluator"), exports);
21
+ __exportStar(require("./train-json-sync"), exports);
22
+ __exportStar(require("./run-registry"), exports);
23
+ __exportStar(require("./llm-dispatcher"), exports);
24
+ __exportStar(require("./audit-log"), exports);
25
+ __exportStar(require("./runtime"), exports);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/track-flow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,sDAAmC;AACnC,mDAAgC;AAChC,sDAAmC;AACnC,oDAAiC;AACjC,iDAA8B;AAC9B,mDAAgC;AAChC,8CAA2B;AAC3B,4CAAyB"}
@@ -0,0 +1,36 @@
1
+ export type Injector = (text: string) => void | Promise<void>;
2
+ export interface DispatchOptions {
3
+ projectFolder: string;
4
+ injector: Injector;
5
+ prompt: string;
6
+ beforeSnapshot: Record<string, unknown>;
7
+ outputs: string[];
8
+ whitelist: string[];
9
+ signal: AbortSignal;
10
+ timeoutMs?: number;
11
+ }
12
+ export type DispatchResult = {
13
+ kind: 'success';
14
+ newSnapshot: Record<string, unknown>;
15
+ varsDiff: {
16
+ key: string;
17
+ old: unknown;
18
+ new: unknown;
19
+ }[];
20
+ } | {
21
+ kind: 'failed';
22
+ reason: string;
23
+ } | {
24
+ kind: 'cancelled';
25
+ };
26
+ /**
27
+ * Dispatch one LLM call:
28
+ * 1. Atomic-write snapshot to cwd train.json + workflow_data.json
29
+ * 2. Inject prompt into project PTY
30
+ * 3. Poll train.json mtime — wait until LLM writes (or timeout/cancel)
31
+ * 4. Reload train.json (with flush wait + retry) → filter by whitelist
32
+ * 5. Diff vs beforeSnapshot; if any output is NOT changed → failed
33
+ * 6. Cleanup cwd files
34
+ */
35
+ export declare function dispatchLlmCall(opts: DispatchOptions): Promise<DispatchResult>;
36
+ //# sourceMappingURL=llm-dispatcher.d.ts.map
@@ -0,0 +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;CACnB;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,CAiFpF"}
@@ -0,0 +1,145 @@
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
+ exports.dispatchLlmCall = dispatchLlmCall;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const train_json_sync_1 = require("./train-json-sync");
40
+ /**
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
48
+ */
49
+ async function dispatchLlmCall(opts) {
50
+ const cwd = opts.projectFolder;
51
+ const trainJsonPath = path.join(cwd, 'train.json');
52
+ const timeoutMs = opts.timeoutMs ?? 600000;
53
+ // 1. Write snapshot
54
+ (0, train_json_sync_1.copyToProjectCwd)(cwd, (0, train_json_sync_1.filterByWhitelist)(opts.beforeSnapshot, opts.whitelist));
55
+ // 记录 initial mtime(snapshot 刚写完)
56
+ let initialMtimeMs = 0;
57
+ try {
58
+ initialMtimeMs = fs.statSync(trainJsonPath).mtimeMs;
59
+ }
60
+ catch {
61
+ initialMtimeMs = Date.now();
62
+ }
63
+ try {
64
+ // 2. Inject prompt
65
+ await opts.injector(opts.prompt);
66
+ // 3. Poll for mtime change
67
+ const startedAt = Date.now();
68
+ const pollInterval = 500;
69
+ while (true) {
70
+ if (opts.signal.aborted) {
71
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
72
+ return { kind: 'cancelled' };
73
+ }
74
+ if (Date.now() - startedAt > timeoutMs) {
75
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
76
+ return { kind: 'failed', reason: `LLM 调用超时(${timeoutMs}ms 内未修改 train.json)` };
77
+ }
78
+ let mtimeMs = initialMtimeMs;
79
+ try {
80
+ mtimeMs = fs.statSync(trainJsonPath).mtimeMs;
81
+ }
82
+ catch {
83
+ /* file deleted during call? continue polling */
84
+ }
85
+ if (mtimeMs > initialMtimeMs + 1) {
86
+ // 跳出 polling,进入 reload
87
+ break;
88
+ }
89
+ await sleep(pollInterval);
90
+ }
91
+ // 4. Reload(含 200/500ms 等待 + 重试)
92
+ const reload = await (0, train_json_sync_1.reloadFromProjectCwd)(cwd);
93
+ if (!reload.ok || !reload.data) {
94
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
95
+ return { kind: 'failed', reason: `train.json reload 失败:${reload.error ?? 'unknown'}` };
96
+ }
97
+ // 5. Diff + outputs check
98
+ const newSnapshotFiltered = (0, train_json_sync_1.filterByWhitelist)(reload.data, opts.whitelist);
99
+ const varsDiff = [];
100
+ for (const k of Object.keys(newSnapshotFiltered)) {
101
+ const oldV = opts.beforeSnapshot[k] ?? null;
102
+ const newV = newSnapshotFiltered[k];
103
+ if (!sameValue(oldV, newV)) {
104
+ varsDiff.push({ key: k, old: oldV, new: newV });
105
+ }
106
+ }
107
+ // outputs 中每个字段必须出现在 varsDiff(spec §6.2 step 5)
108
+ const changedKeys = new Set(varsDiff.map((d) => d.key));
109
+ const missingOutputs = opts.outputs.filter((k) => !changedKeys.has(k));
110
+ if (missingOutputs.length > 0) {
111
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
112
+ return {
113
+ kind: 'failed',
114
+ reason: `LLM 未按要求修改字段:${missingOutputs.join(', ')}`,
115
+ };
116
+ }
117
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
118
+ return { kind: 'success', newSnapshot: newSnapshotFiltered, varsDiff };
119
+ }
120
+ catch (e) {
121
+ (0, train_json_sync_1.cleanupProjectCwd)(cwd);
122
+ if (opts.signal.aborted)
123
+ return { kind: 'cancelled' };
124
+ return { kind: 'failed', reason: `dispatch 异常:${e.message}` };
125
+ }
126
+ }
127
+ function sameValue(a, b) {
128
+ if (a === b)
129
+ return true;
130
+ if (typeof a !== typeof b)
131
+ return false;
132
+ if (typeof a === 'object') {
133
+ try {
134
+ return JSON.stringify(a) === JSON.stringify(b);
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ }
140
+ return false;
141
+ }
142
+ function sleep(ms) {
143
+ return new Promise((resolve) => setTimeout(resolve, ms));
144
+ }
145
+ //# sourceMappingURL=llm-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-dispatcher.js","sourceRoot":"","sources":["../../src/track-flow/llm-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface VarDecl {
2
+ key: string;
3
+ description: string;
4
+ initialValue: unknown;
5
+ }
6
+ /**
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.
10
+ *
11
+ * spec §7:
12
+ * - @{key} → `key(description)='<value>'`
13
+ * - ${key} → `修改变量 key(description;记录路径为 train.json 中的 key:key)=<value> 为...`
14
+ * - 末尾系统指令段(仅 outputs 非空时)
15
+ *
16
+ * Unknown keys (not in `variables`) are preserved literally to aid debugging.
17
+ */
18
+ export declare function translatePrompt(template: string, variables: VarDecl[], snapshot: Record<string, unknown>, outputs: string[]): string;
19
+ //# sourceMappingURL=prompt-translator.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.translatePrompt = translatePrompt;
4
+ /**
5
+ * Format a value for embedding inside a translated prompt.
6
+ * - null/undefined → `null`
7
+ * - string → `'<value>'`(用单引号,转义内部 \' 和 \\)
8
+ * - number / bool → 字面量无引号
9
+ * - object/array → JSON.stringify 后用单引号包
10
+ */
11
+ function formatValue(v) {
12
+ if (v === null || v === undefined)
13
+ return 'null';
14
+ if (typeof v === 'string')
15
+ return `'${v.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
16
+ if (typeof v === 'number' || typeof v === 'boolean')
17
+ return String(v);
18
+ return `'${JSON.stringify(v).replace(/'/g, "\\'")}'`;
19
+ }
20
+ /**
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.
24
+ *
25
+ * spec §7:
26
+ * - @{key} → `key(description)='<value>'`
27
+ * - ${key} → `修改变量 key(description;记录路径为 train.json 中的 key:key)=<value> 为...`
28
+ * - 末尾系统指令段(仅 outputs 非空时)
29
+ *
30
+ * Unknown keys (not in `variables`) are preserved literally to aid debugging.
31
+ */
32
+ function translatePrompt(template, variables, snapshot, outputs) {
33
+ const byKey = new Map(variables.map((v) => [v.key, v]));
34
+ let result = template.replace(/@\{(\w+)\}/g, (_m, key) => {
35
+ const decl = byKey.get(key);
36
+ if (!decl)
37
+ return `@{${key}}`;
38
+ return `${key}(${decl.description})=${formatValue(snapshot[key] ?? null)}`;
39
+ });
40
+ result = result.replace(/\$\{(\w+)\}/g, (_m, key) => {
41
+ const decl = byKey.get(key);
42
+ if (!decl)
43
+ return `\${${key}}`;
44
+ return `修改变量 ${key}(${decl.description};记录路径为 train.json 中的 key:${key})=${formatValue(snapshot[key] ?? null)} 为...`;
45
+ });
46
+ if (outputs.length > 0) {
47
+ result += '\n\n' + buildSystemInstruction(outputs);
48
+ }
49
+ return result;
50
+ }
51
+ function buildSystemInstruction(outputs) {
52
+ return [
53
+ '【系统指令】',
54
+ '本工作轨的全局变量记录在当前目录的 train.json 文件中。',
55
+ '本节点完成时,请用 Edit/Write 工具修改 train.json 文件,',
56
+ `更新以下字段:${outputs.join(', ')}`,
57
+ '(其他字段不要改)。完成修改后告知"已写入"。',
58
+ ].join('\n');
59
+ }
60
+ //# sourceMappingURL=prompt-translator.js.map