@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.
- package/README.md +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +7 -0
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/_flow-injector.d.ts +4 -0
- package/backend/dist/routes/_flow-injector.d.ts.map +1 -0
- package/backend/dist/routes/_flow-injector.js +17 -0
- package/backend/dist/routes/_flow-injector.js.map +1 -0
- package/backend/dist/routes/track-flows.d.ts +12 -0
- package/backend/dist/routes/track-flows.d.ts.map +1 -0
- package/backend/dist/routes/track-flows.js +225 -0
- package/backend/dist/routes/track-flows.js.map +1 -0
- package/backend/dist/terminal-manager-singleton.d.ts +9 -0
- package/backend/dist/terminal-manager-singleton.d.ts.map +1 -0
- package/backend/dist/terminal-manager-singleton.js +6 -0
- package/backend/dist/terminal-manager-singleton.js.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js +65 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.js +76 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.js +59 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.js +54 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.js +93 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.js +177 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.js.map +1 -0
- package/backend/dist/track-flow/audit-log.d.ts +22 -0
- package/backend/dist/track-flow/audit-log.d.ts.map +1 -0
- package/backend/dist/track-flow/audit-log.js +56 -0
- package/backend/dist/track-flow/audit-log.js.map +1 -0
- package/backend/dist/track-flow/if-expr-evaluator.d.ts +14 -0
- package/backend/dist/track-flow/if-expr-evaluator.d.ts.map +1 -0
- package/backend/dist/track-flow/if-expr-evaluator.js +73 -0
- package/backend/dist/track-flow/if-expr-evaluator.js.map +1 -0
- package/backend/dist/track-flow/if-expr-parser.d.ts +34 -0
- package/backend/dist/track-flow/if-expr-parser.d.ts.map +1 -0
- package/backend/dist/track-flow/if-expr-parser.js +176 -0
- package/backend/dist/track-flow/if-expr-parser.js.map +1 -0
- package/backend/dist/track-flow/index.d.ts +10 -0
- package/backend/dist/track-flow/index.d.ts.map +1 -0
- package/backend/dist/track-flow/index.js +26 -0
- package/backend/dist/track-flow/index.js.map +1 -0
- package/backend/dist/track-flow/llm-dispatcher.d.ts +36 -0
- package/backend/dist/track-flow/llm-dispatcher.d.ts.map +1 -0
- package/backend/dist/track-flow/llm-dispatcher.js +145 -0
- package/backend/dist/track-flow/llm-dispatcher.js.map +1 -0
- package/backend/dist/track-flow/prompt-translator.d.ts +19 -0
- package/backend/dist/track-flow/prompt-translator.d.ts.map +1 -0
- package/backend/dist/track-flow/prompt-translator.js +60 -0
- package/backend/dist/track-flow/prompt-translator.js.map +1 -0
- package/backend/dist/track-flow/run-id.d.ts +2 -0
- package/backend/dist/track-flow/run-id.d.ts.map +1 -0
- package/backend/dist/track-flow/run-id.js +7 -0
- package/backend/dist/track-flow/run-id.js.map +1 -0
- package/backend/dist/track-flow/run-registry.d.ts +77 -0
- package/backend/dist/track-flow/run-registry.d.ts.map +1 -0
- package/backend/dist/track-flow/run-registry.js +148 -0
- package/backend/dist/track-flow/run-registry.js.map +1 -0
- package/backend/dist/track-flow/runtime.d.ts +59 -0
- package/backend/dist/track-flow/runtime.d.ts.map +1 -0
- package/backend/dist/track-flow/runtime.js +204 -0
- package/backend/dist/track-flow/runtime.js.map +1 -0
- package/backend/dist/track-flow/store.d.ts +20 -0
- package/backend/dist/track-flow/store.d.ts.map +1 -0
- package/backend/dist/track-flow/store.js +158 -0
- package/backend/dist/track-flow/store.js.map +1 -0
- package/backend/dist/track-flow/train-json-sync.d.ts +31 -0
- package/backend/dist/track-flow/train-json-sync.d.ts.map +1 -0
- package/backend/dist/track-flow/train-json-sync.js +130 -0
- package/backend/dist/track-flow/train-json-sync.js.map +1 -0
- package/backend/dist/track-flow-ws.d.ts +5 -0
- package/backend/dist/track-flow-ws.d.ts.map +1 -0
- package/backend/dist/track-flow-ws.js +14 -0
- package/backend/dist/track-flow-ws.js.map +1 -0
- package/backend/package-lock.json +2071 -66
- package/backend/package.json +7 -2
- package/frontend/dist/assets/{ChatOverlay-i8gy2y-T.js → ChatOverlay-BsozN13k.js} +1 -1
- package/frontend/dist/assets/{GraphPreview-CoOHeDk0.js → GraphPreview-Bagqaatf.js} +2 -2
- package/frontend/dist/assets/{MobilePage-ZYuVSqIu.js → MobilePage-BTKA6Dxj.js} +3 -3
- package/frontend/dist/assets/{OfficePreview-BP_FVyDv.js → OfficePreview-CMRAt1Qb.js} +2 -2
- package/frontend/dist/assets/{PdfPreview-B_Is_82c.js → PdfPreview-DM7Lq8lA.js} +1 -1
- package/frontend/dist/assets/ProjectPage-3rERYJYF.js +26 -0
- package/frontend/dist/assets/ProjectPage-DFCEXprr.css +32 -0
- package/frontend/dist/assets/{SettingsPage-DlqnuIy1.js → SettingsPage-CA9PjfJR.js} +2 -2
- package/frontend/dist/assets/{SkillHubPage-FFefLcmN.js → SkillHubPage-DLt5DGX6.js} +2 -2
- package/frontend/dist/assets/{chevron-down-DqAoFpmS.js → chevron-down-D7HR2Yyz.js} +1 -1
- package/frontend/dist/assets/{index-Bj-uhUZY.js → index-fIUNz576.js} +1 -1
- package/frontend/dist/assets/{index-B5mDtgD1.js → index-k0ydgbQO.js} +7 -7
- package/frontend/dist/assets/{index-DzYZJMgp.js → index-tE28G1ot.js} +1 -1
- package/frontend/dist/assets/index-tSU3-nNc.css +1 -0
- package/frontend/dist/assets/{jszip.min-DW73pE0J.js → jszip.min-BDxK042T.js} +1 -1
- package/frontend/dist/assets/{select-HgZm25ew.js → select-C6nWxQ7S.js} +2 -2
- package/frontend/dist/assets/{user-BOTyiGCj.js → user-DbW3r9c3.js} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/ProjectPage-9CEnUXvW.css +0 -32
- package/frontend/dist/assets/ProjectPage-Bi7P0xvD.js +0 -26
- 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
|