@tom2012/cc-web 2026.5.18-b → 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 +9 -21
- 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/global-tracks.d.ts +2 -5
- package/backend/dist/routes/global-tracks.d.ts.map +1 -1
- package/backend/dist/routes/global-tracks.js +2 -28
- package/backend/dist/routes/global-tracks.js.map +1 -1
- 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/routes/tracks.d.ts +3 -9
- package/backend/dist/routes/tracks.d.ts.map +1 -1
- package/backend/dist/routes/tracks.js +3 -153
- package/backend/dist/routes/tracks.js.map +1 -1
- 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/dist/tracks/ask-user-bridge.d.ts +1 -6
- package/backend/dist/tracks/ask-user-bridge.d.ts.map +1 -1
- package/backend/dist/tracks/ask-user-bridge.js +0 -22
- package/backend/dist/tracks/ask-user-bridge.js.map +1 -1
- package/backend/dist/tracks/index.d.ts +1 -5
- package/backend/dist/tracks/index.d.ts.map +1 -1
- package/backend/dist/tracks/index.js +1 -10
- package/backend/dist/tracks/index.js.map +1 -1
- package/backend/package-lock.json +2066 -124
- package/backend/package.json +6 -5
- package/frontend/dist/assets/{ChatOverlay-DPM_F615.js → ChatOverlay-BsozN13k.js} +1 -1
- package/frontend/dist/assets/{GraphPreview-CJhh33L8.js → GraphPreview-Bagqaatf.js} +2 -2
- package/frontend/dist/assets/{MobilePage-Cx9v8Udp.js → MobilePage-BTKA6Dxj.js} +3 -3
- package/frontend/dist/assets/{OfficePreview-h6zYBZFQ.js → OfficePreview-CMRAt1Qb.js} +2 -2
- package/frontend/dist/assets/{PdfPreview-DbYFye7c.js → PdfPreview-DM7Lq8lA.js} +1 -1
- package/frontend/dist/assets/ProjectPage-3rERYJYF.js +26 -0
- package/frontend/dist/assets/{TrackGraphEditor-Fd0xVSp_.css → ProjectPage-DFCEXprr.css} +32 -1
- package/frontend/dist/assets/{SettingsPage-BkApTPbw.js → SettingsPage-CA9PjfJR.js} +2 -2
- package/frontend/dist/assets/{SkillHubPage-BwfU-hel.js → SkillHubPage-DLt5DGX6.js} +3 -3
- package/frontend/dist/assets/{chevron-down-D4Vj-5wB.js → chevron-down-D7HR2Yyz.js} +1 -1
- package/frontend/dist/assets/{index-CKxFfdqR.js → index-fIUNz576.js} +1 -1
- package/frontend/dist/assets/{index-DUIOrPha.js → index-k0ydgbQO.js} +7 -7
- package/frontend/dist/assets/{index-C-2GBtXy.js → index-tE28G1ot.js} +1 -1
- package/frontend/dist/assets/index-tSU3-nNc.css +1 -0
- package/frontend/dist/assets/{jszip.min-Bn769Ot7.js → jszip.min-BDxK042T.js} +1 -1
- package/frontend/dist/assets/{select-CXSNG3yW.js → select-C6nWxQ7S.js} +2 -2
- package/frontend/dist/assets/{user-Chl3LWFq.js → user-DbW3r9c3.js} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/backend/vendor/@tom2012/train-core/dist/ast-cache.d.ts +0 -74
- package/backend/vendor/@tom2012/train-core/dist/ast-cache.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/ast-cache.js +0 -157
- package/backend/vendor/@tom2012/train-core/dist/ast-cache.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/ast.d.ts +0 -350
- package/backend/vendor/@tom2012/train-core/dist/ast.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/ast.js +0 -15
- package/backend/vendor/@tom2012/train-core/dist/ast.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/builder.d.ts +0 -21
- package/backend/vendor/@tom2012/train-core/dist/builder.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/builder.js +0 -1254
- package/backend/vendor/@tom2012/train-core/dist/builder.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/builtins.d.ts +0 -17
- package/backend/vendor/@tom2012/train-core/dist/builtins.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/builtins.js +0 -500
- package/backend/vendor/@tom2012/train-core/dist/builtins.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/index.d.ts +0 -54
- package/backend/vendor/@tom2012/train-core/dist/index.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/index.js +0 -66
- package/backend/vendor/@tom2012/train-core/dist/index.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/interpreter.d.ts +0 -110
- package/backend/vendor/@tom2012/train-core/dist/interpreter.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/interpreter.js +0 -943
- package/backend/vendor/@tom2012/train-core/dist/interpreter.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/lexer.d.ts +0 -88
- package/backend/vendor/@tom2012/train-core/dist/lexer.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/lexer.js +0 -243
- package/backend/vendor/@tom2012/train-core/dist/lexer.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/module-loader.d.ts +0 -74
- package/backend/vendor/@tom2012/train-core/dist/module-loader.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/module-loader.js +0 -149
- package/backend/vendor/@tom2012/train-core/dist/module-loader.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/parser.d.ts +0 -138
- package/backend/vendor/@tom2012/train-core/dist/parser.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/parser.js +0 -861
- package/backend/vendor/@tom2012/train-core/dist/parser.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/prompt-composer.d.ts +0 -49
- package/backend/vendor/@tom2012/train-core/dist/prompt-composer.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/prompt-composer.js +0 -159
- package/backend/vendor/@tom2012/train-core/dist/prompt-composer.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/runtime.d.ts +0 -146
- package/backend/vendor/@tom2012/train-core/dist/runtime.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/runtime.js +0 -156
- package/backend/vendor/@tom2012/train-core/dist/runtime.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/type-descriptor.d.ts +0 -18
- package/backend/vendor/@tom2012/train-core/dist/type-descriptor.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/type-descriptor.js +0 -94
- package/backend/vendor/@tom2012/train-core/dist/type-descriptor.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/validation.d.ts +0 -44
- package/backend/vendor/@tom2012/train-core/dist/validation.d.ts.map +0 -1
- package/backend/vendor/@tom2012/train-core/dist/validation.js +0 -271
- package/backend/vendor/@tom2012/train-core/dist/validation.js.map +0 -1
- package/backend/vendor/@tom2012/train-core/package.json +0 -35
- package/frontend/dist/assets/ProjectPage-9CEnUXvW.css +0 -32
- package/frontend/dist/assets/ProjectPage-DaPmvQ-H.js +0 -26
- package/frontend/dist/assets/TrackEditor-BbM0eHTD.js +0 -14
- package/frontend/dist/assets/TrackGraphEditor-DzEqAGFN.js +0 -2
- package/frontend/dist/assets/abap-LPLW346S.js +0 -7
- package/frontend/dist/assets/apex-Dk-jUCUV.js +0 -7
- package/frontend/dist/assets/azcli-DPUMmPlX.js +0 -7
- package/frontend/dist/assets/bat-C1Qbg1bV.js +0 -7
- package/frontend/dist/assets/bicep-D-e-VSJi.js +0 -7
- package/frontend/dist/assets/cameligo-CjUqTgqL.js +0 -7
- package/frontend/dist/assets/clojure-BWsu6Kju.js +0 -7
- package/frontend/dist/assets/codicon-DCmgc-ay.ttf +0 -0
- package/frontend/dist/assets/coffee-DeC36AK3.js +0 -7
- package/frontend/dist/assets/cpp-DcZnmBWT.js +0 -7
- package/frontend/dist/assets/csharp-DqBXBMf0.js +0 -7
- package/frontend/dist/assets/csp-CkO7y8ul.js +0 -7
- package/frontend/dist/assets/css-OAcfVtED.js +0 -7
- package/frontend/dist/assets/cssMode-5whH06Yl.js +0 -7
- package/frontend/dist/assets/cypher-40UGrUjD.js +0 -7
- package/frontend/dist/assets/dart-DmixyLor.js +0 -7
- package/frontend/dist/assets/dockerfile-CayO4nTA.js +0 -7
- package/frontend/dist/assets/ecl-DRrKCuVc.js +0 -7
- package/frontend/dist/assets/editor-B5EY1bb8.css +0 -1
- package/frontend/dist/assets/editor.main-CnjJg6pv.js +0 -37
- package/frontend/dist/assets/elixir-J3qpp9mX.js +0 -7
- package/frontend/dist/assets/flow9-DzW2c4Im.js +0 -7
- package/frontend/dist/assets/freemarker2-CUgILTtX.js +0 -7
- package/frontend/dist/assets/fsharp-D00tn_6c.js +0 -7
- package/frontend/dist/assets/go-NnNmgWK_.js +0 -7
- package/frontend/dist/assets/graphql-C9_--VLF.js +0 -7
- package/frontend/dist/assets/handlebars-C2avKkbK.js +0 -7
- package/frontend/dist/assets/hcl-BhbOULbp.js +0 -7
- package/frontend/dist/assets/html-ZYUiGgvr.js +0 -7
- package/frontend/dist/assets/htmlMode-CeliqUBd.js +0 -7
- package/frontend/dist/assets/index-COjNnvQB.css +0 -1
- package/frontend/dist/assets/index-DjmvYdMM.js +0 -1
- package/frontend/dist/assets/ini-zR-_X5iG.js +0 -7
- package/frontend/dist/assets/java-CSTjsyoZ.js +0 -7
- package/frontend/dist/assets/javascript-0VRCllAK.js +0 -7
- package/frontend/dist/assets/jsonMode-Dwqu43-Y.js +0 -7
- package/frontend/dist/assets/julia-DioMOKVu.js +0 -7
- package/frontend/dist/assets/kotlin-Dsb0PKmW.js +0 -7
- package/frontend/dist/assets/less-CZYLoAVD.js +0 -7
- package/frontend/dist/assets/lexon-d5JUiwNk.js +0 -7
- package/frontend/dist/assets/liquid-E2ejTVvo.js +0 -7
- package/frontend/dist/assets/lua-1Al72GG8.js +0 -7
- package/frontend/dist/assets/m3-hx1xCPC3.js +0 -7
- package/frontend/dist/assets/markdown-DPGrH1xZ.js +0 -7
- package/frontend/dist/assets/mdx-CqJmnu86.js +0 -7
- package/frontend/dist/assets/mips-CYbZjkIm.js +0 -7
- package/frontend/dist/assets/msdax-DAioKM5A.js +0 -7
- package/frontend/dist/assets/mysql-7e9GUebS.js +0 -7
- package/frontend/dist/assets/objective-c-BGf8QNjz.js +0 -7
- package/frontend/dist/assets/pascal-hEDRz3un.js +0 -7
- package/frontend/dist/assets/pascaligo-gqEhN6pG.js +0 -7
- package/frontend/dist/assets/perl-CN8Ht9Vk.js +0 -7
- package/frontend/dist/assets/pgsql-CRCqHQBx.js +0 -7
- package/frontend/dist/assets/php-DTZrlAwe.js +0 -7
- package/frontend/dist/assets/pla-CRmh4UcC.js +0 -7
- package/frontend/dist/assets/postiats-Car2G7g8.js +0 -7
- package/frontend/dist/assets/powerquery-BJKl8V3o.js +0 -7
- package/frontend/dist/assets/powershell-Du7a_J7r.js +0 -7
- package/frontend/dist/assets/protobuf-ChneWI0H.js +0 -7
- package/frontend/dist/assets/pug-BH6LSJaf.js +0 -7
- package/frontend/dist/assets/python-BYNiBUNZ.js +0 -7
- package/frontend/dist/assets/qsharp-CU-Hxpxi.js +0 -7
- package/frontend/dist/assets/r-Bw-W15zh.js +0 -7
- package/frontend/dist/assets/razor-2YR0XVnP.js +0 -7
- package/frontend/dist/assets/redis-bY-X9-ol.js +0 -7
- package/frontend/dist/assets/redshift-CMu3ubbS.js +0 -7
- package/frontend/dist/assets/restructuredtext-KNkiWGNN.js +0 -7
- package/frontend/dist/assets/ruby-dQWMhU86.js +0 -7
- package/frontend/dist/assets/rust-BAcHhnEU.js +0 -7
- package/frontend/dist/assets/sb-Bidr5w2z.js +0 -7
- package/frontend/dist/assets/scala-imTtxsGY.js +0 -7
- package/frontend/dist/assets/scheme-BY-WHKiB.js +0 -7
- package/frontend/dist/assets/scss-NDoRP52C.js +0 -7
- package/frontend/dist/assets/shell-DrIjotnh.js +0 -7
- package/frontend/dist/assets/solidity-DTahNycF.js +0 -7
- package/frontend/dist/assets/sophia-DtyrjGkZ.js +0 -7
- package/frontend/dist/assets/sparql-CFuS5E3z.js +0 -7
- package/frontend/dist/assets/sql-BRxcnbRv.js +0 -7
- package/frontend/dist/assets/st-Dz4uh7MK.js +0 -7
- package/frontend/dist/assets/swift-Digsrw1G.js +0 -11
- package/frontend/dist/assets/systemverilog-7TDrkMau.js +0 -7
- package/frontend/dist/assets/tcl-BtaFcnDi.js +0 -7
- package/frontend/dist/assets/tsMode-DrjOLXjA.js +0 -7
- package/frontend/dist/assets/twig-Deid_oBs.js +0 -7
- package/frontend/dist/assets/typescript--8YtfOFf.js +0 -7
- package/frontend/dist/assets/typespec-zUaxhbG8.js +0 -7
- package/frontend/dist/assets/vb-DK0rKJzo.js +0 -7
- package/frontend/dist/assets/wgsl-B8fNVlOQ.js +0 -7
- package/frontend/dist/assets/xml-CGj_sBRG.js +0 -7
- package/frontend/dist/assets/yaml-of0AgMN8.js +0 -7
|
@@ -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
|
|
@@ -0,0 +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,4BAA4B,GAAG,KAAK,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAA;IACrH,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,OAAO;QACL,QAAQ;QACR,mCAAmC;QACnC,0CAA0C;QAC1C,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9B,yBAAyB;KAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-id.d.ts","sourceRoot":"","sources":["../../src/track-flow/run-id.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAEjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-id.js","sourceRoot":"","sources":["../../src/track-flow/run-id.ts"],"names":[],"mappings":";;AAAA,4BAEC;AAFD,SAAgB,QAAQ;IACtB,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;AACtE,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export type RunStatus = 'pending' | 'running' | 'waiting_user_input' | 'completed' | 'failed' | 'cancelled';
|
|
2
|
+
export interface RunQuota {
|
|
3
|
+
maxIterPerNode: number;
|
|
4
|
+
maxLlmCalls: number;
|
|
5
|
+
maxRunDurationMs: number;
|
|
6
|
+
}
|
|
7
|
+
export interface RunInfo {
|
|
8
|
+
runId: string;
|
|
9
|
+
projectId: string;
|
|
10
|
+
basename: string;
|
|
11
|
+
status: RunStatus;
|
|
12
|
+
startedAt: number;
|
|
13
|
+
quota: RunQuota;
|
|
14
|
+
iterCounts: Map<string, number>;
|
|
15
|
+
llmCallsCount: number;
|
|
16
|
+
cancelAbortController: AbortController;
|
|
17
|
+
error?: {
|
|
18
|
+
nodeId?: string;
|
|
19
|
+
message: string;
|
|
20
|
+
};
|
|
21
|
+
pendingUserInput?: {
|
|
22
|
+
nodeId: string;
|
|
23
|
+
fields: {
|
|
24
|
+
varKey: string;
|
|
25
|
+
description: string;
|
|
26
|
+
uiHint?: string;
|
|
27
|
+
variants?: string[];
|
|
28
|
+
}[];
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* In-memory registry of active flow runs.
|
|
33
|
+
*
|
|
34
|
+
* Lock semantics(spec §8.3):同一 (projectId, basename) 同时只允许 1 个 active run。
|
|
35
|
+
* 重复 register 抛 FLOW_ALREADY_RUNNING(路由层映射为 409)。
|
|
36
|
+
*/
|
|
37
|
+
export declare class FlowRunRegistry {
|
|
38
|
+
private byRunId;
|
|
39
|
+
private activeByPath;
|
|
40
|
+
start(opts: {
|
|
41
|
+
runId: string;
|
|
42
|
+
projectId: string;
|
|
43
|
+
basename: string;
|
|
44
|
+
quotaOverride?: Partial<RunQuota>;
|
|
45
|
+
}): RunInfo;
|
|
46
|
+
get(runId: string): RunInfo | undefined;
|
|
47
|
+
findActive(projectId: string, basename: string): RunInfo | undefined;
|
|
48
|
+
listActive(projectId: string): RunInfo[];
|
|
49
|
+
/**
|
|
50
|
+
* Check & increment quotas. Returns null if all pass, or error message if exceeded.
|
|
51
|
+
* 调用方在每节点循环开始前调一次。
|
|
52
|
+
*/
|
|
53
|
+
checkQuotaForNode(runId: string, nodeId: string): string | null;
|
|
54
|
+
checkQuotaBeforeLlmCall(runId: string): string | null;
|
|
55
|
+
/** Return remaining quotas for WS payload (spec §9.5 last bullet). */
|
|
56
|
+
remainingQuota(runId: string, currentNodeId?: string): {
|
|
57
|
+
iterRemaining?: number;
|
|
58
|
+
llmCallsRemaining: number;
|
|
59
|
+
durationRemainingMs: number;
|
|
60
|
+
};
|
|
61
|
+
updateStatus(runId: string, status: RunStatus, error?: RunInfo['error']): void;
|
|
62
|
+
setPendingUserInput(runId: string, payload: RunInfo['pendingUserInput']): void;
|
|
63
|
+
clearPendingUserInput(runId: string): void;
|
|
64
|
+
cancel(runId: string): boolean;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Singleton registry instance used by routes / runtime.
|
|
68
|
+
*/
|
|
69
|
+
export declare const flowRunRegistry: FlowRunRegistry;
|
|
70
|
+
/**
|
|
71
|
+
* Cleanup stale cwd train.json / workflow_data.json on daemon startup.
|
|
72
|
+
* spec §9.6:daemon 重启检测到 cwd 文件存在视为"上次 run 异常中断",删除。
|
|
73
|
+
*
|
|
74
|
+
* Pass a list of project folders to clean.
|
|
75
|
+
*/
|
|
76
|
+
export declare function cleanupStaleCwdFiles(projectFolders: string[]): void;
|
|
77
|
+
//# sourceMappingURL=run-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-registry.d.ts","sourceRoot":"","sources":["../../src/track-flow/run-registry.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,oBAAoB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;AAE3G,MAAM,WAAW,QAAQ;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,SAAS,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,QAAQ,CAAA;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,qBAAqB,EAAE,eAAe,CAAA;IACtC,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,EAAE,CAAA;KAAE,CAAA;CAC/H;AAQD;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,YAAY,CAA4B;IAEhD,KAAK,CAAC,IAAI,EAAE;QACV,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;KAClC,GAAG,OAAO;IAwBX,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIvC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAMpE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAOxC;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAc/D,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUrD,sEAAsE;IACtE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG;QACrD,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,iBAAiB,EAAE,MAAM,CAAA;QACzB,mBAAmB,EAAE,MAAM,CAAA;KAC5B;IAaD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAU9E,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAK9E,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAO/B;AAMD;;GAEG;AACH,eAAO,MAAM,eAAe,iBAAwB,CAAA;AAEpD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAInE"}
|