@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.
Files changed (272) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/index.d.ts.map +1 -1
  3. package/backend/dist/index.js +9 -21
  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/global-tracks.d.ts +2 -5
  10. package/backend/dist/routes/global-tracks.d.ts.map +1 -1
  11. package/backend/dist/routes/global-tracks.js +2 -28
  12. package/backend/dist/routes/global-tracks.js.map +1 -1
  13. package/backend/dist/routes/track-flows.d.ts +12 -0
  14. package/backend/dist/routes/track-flows.d.ts.map +1 -0
  15. package/backend/dist/routes/track-flows.js +225 -0
  16. package/backend/dist/routes/track-flows.js.map +1 -0
  17. package/backend/dist/routes/tracks.d.ts +3 -9
  18. package/backend/dist/routes/tracks.d.ts.map +1 -1
  19. package/backend/dist/routes/tracks.js +3 -153
  20. package/backend/dist/routes/tracks.js.map +1 -1
  21. package/backend/dist/terminal-manager-singleton.d.ts +9 -0
  22. package/backend/dist/terminal-manager-singleton.d.ts.map +1 -0
  23. package/backend/dist/terminal-manager-singleton.js +6 -0
  24. package/backend/dist/terminal-manager-singleton.js.map +1 -0
  25. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts +2 -0
  26. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts.map +1 -0
  27. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js +65 -0
  28. package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js.map +1 -0
  29. package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts +2 -0
  30. package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts.map +1 -0
  31. package/backend/dist/track-flow/__tests__/if-expr-parser.test.js +76 -0
  32. package/backend/dist/track-flow/__tests__/if-expr-parser.test.js.map +1 -0
  33. package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts +2 -0
  34. package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts.map +1 -0
  35. package/backend/dist/track-flow/__tests__/prompt-translator.test.js +59 -0
  36. package/backend/dist/track-flow/__tests__/prompt-translator.test.js.map +1 -0
  37. package/backend/dist/track-flow/__tests__/run-registry.test.d.ts +2 -0
  38. package/backend/dist/track-flow/__tests__/run-registry.test.d.ts.map +1 -0
  39. package/backend/dist/track-flow/__tests__/run-registry.test.js +54 -0
  40. package/backend/dist/track-flow/__tests__/run-registry.test.js.map +1 -0
  41. package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts +2 -0
  42. package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts.map +1 -0
  43. package/backend/dist/track-flow/__tests__/train-json-sync.test.js +93 -0
  44. package/backend/dist/track-flow/__tests__/train-json-sync.test.js.map +1 -0
  45. package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts +2 -0
  46. package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts.map +1 -0
  47. package/backend/dist/track-flow/__tests__/verify-flow-v3.js +177 -0
  48. package/backend/dist/track-flow/__tests__/verify-flow-v3.js.map +1 -0
  49. package/backend/dist/track-flow/audit-log.d.ts +22 -0
  50. package/backend/dist/track-flow/audit-log.d.ts.map +1 -0
  51. package/backend/dist/track-flow/audit-log.js +56 -0
  52. package/backend/dist/track-flow/audit-log.js.map +1 -0
  53. package/backend/dist/track-flow/if-expr-evaluator.d.ts +14 -0
  54. package/backend/dist/track-flow/if-expr-evaluator.d.ts.map +1 -0
  55. package/backend/dist/track-flow/if-expr-evaluator.js +73 -0
  56. package/backend/dist/track-flow/if-expr-evaluator.js.map +1 -0
  57. package/backend/dist/track-flow/if-expr-parser.d.ts +34 -0
  58. package/backend/dist/track-flow/if-expr-parser.d.ts.map +1 -0
  59. package/backend/dist/track-flow/if-expr-parser.js +176 -0
  60. package/backend/dist/track-flow/if-expr-parser.js.map +1 -0
  61. package/backend/dist/track-flow/index.d.ts +10 -0
  62. package/backend/dist/track-flow/index.d.ts.map +1 -0
  63. package/backend/dist/track-flow/index.js +26 -0
  64. package/backend/dist/track-flow/index.js.map +1 -0
  65. package/backend/dist/track-flow/llm-dispatcher.d.ts +36 -0
  66. package/backend/dist/track-flow/llm-dispatcher.d.ts.map +1 -0
  67. package/backend/dist/track-flow/llm-dispatcher.js +145 -0
  68. package/backend/dist/track-flow/llm-dispatcher.js.map +1 -0
  69. package/backend/dist/track-flow/prompt-translator.d.ts +19 -0
  70. package/backend/dist/track-flow/prompt-translator.d.ts.map +1 -0
  71. package/backend/dist/track-flow/prompt-translator.js +60 -0
  72. package/backend/dist/track-flow/prompt-translator.js.map +1 -0
  73. package/backend/dist/track-flow/run-id.d.ts +2 -0
  74. package/backend/dist/track-flow/run-id.d.ts.map +1 -0
  75. package/backend/dist/track-flow/run-id.js +7 -0
  76. package/backend/dist/track-flow/run-id.js.map +1 -0
  77. package/backend/dist/track-flow/run-registry.d.ts +77 -0
  78. package/backend/dist/track-flow/run-registry.d.ts.map +1 -0
  79. package/backend/dist/track-flow/run-registry.js +148 -0
  80. package/backend/dist/track-flow/run-registry.js.map +1 -0
  81. package/backend/dist/track-flow/runtime.d.ts +59 -0
  82. package/backend/dist/track-flow/runtime.d.ts.map +1 -0
  83. package/backend/dist/track-flow/runtime.js +204 -0
  84. package/backend/dist/track-flow/runtime.js.map +1 -0
  85. package/backend/dist/track-flow/store.d.ts +20 -0
  86. package/backend/dist/track-flow/store.d.ts.map +1 -0
  87. package/backend/dist/track-flow/store.js +158 -0
  88. package/backend/dist/track-flow/store.js.map +1 -0
  89. package/backend/dist/track-flow/train-json-sync.d.ts +31 -0
  90. package/backend/dist/track-flow/train-json-sync.d.ts.map +1 -0
  91. package/backend/dist/track-flow/train-json-sync.js +130 -0
  92. package/backend/dist/track-flow/train-json-sync.js.map +1 -0
  93. package/backend/dist/track-flow-ws.d.ts +5 -0
  94. package/backend/dist/track-flow-ws.d.ts.map +1 -0
  95. package/backend/dist/track-flow-ws.js +14 -0
  96. package/backend/dist/track-flow-ws.js.map +1 -0
  97. package/backend/dist/tracks/ask-user-bridge.d.ts +1 -6
  98. package/backend/dist/tracks/ask-user-bridge.d.ts.map +1 -1
  99. package/backend/dist/tracks/ask-user-bridge.js +0 -22
  100. package/backend/dist/tracks/ask-user-bridge.js.map +1 -1
  101. package/backend/dist/tracks/index.d.ts +1 -5
  102. package/backend/dist/tracks/index.d.ts.map +1 -1
  103. package/backend/dist/tracks/index.js +1 -10
  104. package/backend/dist/tracks/index.js.map +1 -1
  105. package/backend/package-lock.json +2066 -124
  106. package/backend/package.json +6 -5
  107. package/frontend/dist/assets/{ChatOverlay-DPM_F615.js → ChatOverlay-BsozN13k.js} +1 -1
  108. package/frontend/dist/assets/{GraphPreview-CJhh33L8.js → GraphPreview-Bagqaatf.js} +2 -2
  109. package/frontend/dist/assets/{MobilePage-Cx9v8Udp.js → MobilePage-BTKA6Dxj.js} +3 -3
  110. package/frontend/dist/assets/{OfficePreview-h6zYBZFQ.js → OfficePreview-CMRAt1Qb.js} +2 -2
  111. package/frontend/dist/assets/{PdfPreview-DbYFye7c.js → PdfPreview-DM7Lq8lA.js} +1 -1
  112. package/frontend/dist/assets/ProjectPage-3rERYJYF.js +26 -0
  113. package/frontend/dist/assets/{TrackGraphEditor-Fd0xVSp_.css → ProjectPage-DFCEXprr.css} +32 -1
  114. package/frontend/dist/assets/{SettingsPage-BkApTPbw.js → SettingsPage-CA9PjfJR.js} +2 -2
  115. package/frontend/dist/assets/{SkillHubPage-BwfU-hel.js → SkillHubPage-DLt5DGX6.js} +3 -3
  116. package/frontend/dist/assets/{chevron-down-D4Vj-5wB.js → chevron-down-D7HR2Yyz.js} +1 -1
  117. package/frontend/dist/assets/{index-CKxFfdqR.js → index-fIUNz576.js} +1 -1
  118. package/frontend/dist/assets/{index-DUIOrPha.js → index-k0ydgbQO.js} +7 -7
  119. package/frontend/dist/assets/{index-C-2GBtXy.js → index-tE28G1ot.js} +1 -1
  120. package/frontend/dist/assets/index-tSU3-nNc.css +1 -0
  121. package/frontend/dist/assets/{jszip.min-Bn769Ot7.js → jszip.min-BDxK042T.js} +1 -1
  122. package/frontend/dist/assets/{select-CXSNG3yW.js → select-C6nWxQ7S.js} +2 -2
  123. package/frontend/dist/assets/{user-Chl3LWFq.js → user-DbW3r9c3.js} +1 -1
  124. package/frontend/dist/index.html +2 -2
  125. package/package.json +1 -1
  126. package/backend/vendor/@tom2012/train-core/dist/ast-cache.d.ts +0 -74
  127. package/backend/vendor/@tom2012/train-core/dist/ast-cache.d.ts.map +0 -1
  128. package/backend/vendor/@tom2012/train-core/dist/ast-cache.js +0 -157
  129. package/backend/vendor/@tom2012/train-core/dist/ast-cache.js.map +0 -1
  130. package/backend/vendor/@tom2012/train-core/dist/ast.d.ts +0 -350
  131. package/backend/vendor/@tom2012/train-core/dist/ast.d.ts.map +0 -1
  132. package/backend/vendor/@tom2012/train-core/dist/ast.js +0 -15
  133. package/backend/vendor/@tom2012/train-core/dist/ast.js.map +0 -1
  134. package/backend/vendor/@tom2012/train-core/dist/builder.d.ts +0 -21
  135. package/backend/vendor/@tom2012/train-core/dist/builder.d.ts.map +0 -1
  136. package/backend/vendor/@tom2012/train-core/dist/builder.js +0 -1254
  137. package/backend/vendor/@tom2012/train-core/dist/builder.js.map +0 -1
  138. package/backend/vendor/@tom2012/train-core/dist/builtins.d.ts +0 -17
  139. package/backend/vendor/@tom2012/train-core/dist/builtins.d.ts.map +0 -1
  140. package/backend/vendor/@tom2012/train-core/dist/builtins.js +0 -500
  141. package/backend/vendor/@tom2012/train-core/dist/builtins.js.map +0 -1
  142. package/backend/vendor/@tom2012/train-core/dist/index.d.ts +0 -54
  143. package/backend/vendor/@tom2012/train-core/dist/index.d.ts.map +0 -1
  144. package/backend/vendor/@tom2012/train-core/dist/index.js +0 -66
  145. package/backend/vendor/@tom2012/train-core/dist/index.js.map +0 -1
  146. package/backend/vendor/@tom2012/train-core/dist/interpreter.d.ts +0 -110
  147. package/backend/vendor/@tom2012/train-core/dist/interpreter.d.ts.map +0 -1
  148. package/backend/vendor/@tom2012/train-core/dist/interpreter.js +0 -943
  149. package/backend/vendor/@tom2012/train-core/dist/interpreter.js.map +0 -1
  150. package/backend/vendor/@tom2012/train-core/dist/lexer.d.ts +0 -88
  151. package/backend/vendor/@tom2012/train-core/dist/lexer.d.ts.map +0 -1
  152. package/backend/vendor/@tom2012/train-core/dist/lexer.js +0 -243
  153. package/backend/vendor/@tom2012/train-core/dist/lexer.js.map +0 -1
  154. package/backend/vendor/@tom2012/train-core/dist/module-loader.d.ts +0 -74
  155. package/backend/vendor/@tom2012/train-core/dist/module-loader.d.ts.map +0 -1
  156. package/backend/vendor/@tom2012/train-core/dist/module-loader.js +0 -149
  157. package/backend/vendor/@tom2012/train-core/dist/module-loader.js.map +0 -1
  158. package/backend/vendor/@tom2012/train-core/dist/parser.d.ts +0 -138
  159. package/backend/vendor/@tom2012/train-core/dist/parser.d.ts.map +0 -1
  160. package/backend/vendor/@tom2012/train-core/dist/parser.js +0 -861
  161. package/backend/vendor/@tom2012/train-core/dist/parser.js.map +0 -1
  162. package/backend/vendor/@tom2012/train-core/dist/prompt-composer.d.ts +0 -49
  163. package/backend/vendor/@tom2012/train-core/dist/prompt-composer.d.ts.map +0 -1
  164. package/backend/vendor/@tom2012/train-core/dist/prompt-composer.js +0 -159
  165. package/backend/vendor/@tom2012/train-core/dist/prompt-composer.js.map +0 -1
  166. package/backend/vendor/@tom2012/train-core/dist/runtime.d.ts +0 -146
  167. package/backend/vendor/@tom2012/train-core/dist/runtime.d.ts.map +0 -1
  168. package/backend/vendor/@tom2012/train-core/dist/runtime.js +0 -156
  169. package/backend/vendor/@tom2012/train-core/dist/runtime.js.map +0 -1
  170. package/backend/vendor/@tom2012/train-core/dist/type-descriptor.d.ts +0 -18
  171. package/backend/vendor/@tom2012/train-core/dist/type-descriptor.d.ts.map +0 -1
  172. package/backend/vendor/@tom2012/train-core/dist/type-descriptor.js +0 -94
  173. package/backend/vendor/@tom2012/train-core/dist/type-descriptor.js.map +0 -1
  174. package/backend/vendor/@tom2012/train-core/dist/validation.d.ts +0 -44
  175. package/backend/vendor/@tom2012/train-core/dist/validation.d.ts.map +0 -1
  176. package/backend/vendor/@tom2012/train-core/dist/validation.js +0 -271
  177. package/backend/vendor/@tom2012/train-core/dist/validation.js.map +0 -1
  178. package/backend/vendor/@tom2012/train-core/package.json +0 -35
  179. package/frontend/dist/assets/ProjectPage-9CEnUXvW.css +0 -32
  180. package/frontend/dist/assets/ProjectPage-DaPmvQ-H.js +0 -26
  181. package/frontend/dist/assets/TrackEditor-BbM0eHTD.js +0 -14
  182. package/frontend/dist/assets/TrackGraphEditor-DzEqAGFN.js +0 -2
  183. package/frontend/dist/assets/abap-LPLW346S.js +0 -7
  184. package/frontend/dist/assets/apex-Dk-jUCUV.js +0 -7
  185. package/frontend/dist/assets/azcli-DPUMmPlX.js +0 -7
  186. package/frontend/dist/assets/bat-C1Qbg1bV.js +0 -7
  187. package/frontend/dist/assets/bicep-D-e-VSJi.js +0 -7
  188. package/frontend/dist/assets/cameligo-CjUqTgqL.js +0 -7
  189. package/frontend/dist/assets/clojure-BWsu6Kju.js +0 -7
  190. package/frontend/dist/assets/codicon-DCmgc-ay.ttf +0 -0
  191. package/frontend/dist/assets/coffee-DeC36AK3.js +0 -7
  192. package/frontend/dist/assets/cpp-DcZnmBWT.js +0 -7
  193. package/frontend/dist/assets/csharp-DqBXBMf0.js +0 -7
  194. package/frontend/dist/assets/csp-CkO7y8ul.js +0 -7
  195. package/frontend/dist/assets/css-OAcfVtED.js +0 -7
  196. package/frontend/dist/assets/cssMode-5whH06Yl.js +0 -7
  197. package/frontend/dist/assets/cypher-40UGrUjD.js +0 -7
  198. package/frontend/dist/assets/dart-DmixyLor.js +0 -7
  199. package/frontend/dist/assets/dockerfile-CayO4nTA.js +0 -7
  200. package/frontend/dist/assets/ecl-DRrKCuVc.js +0 -7
  201. package/frontend/dist/assets/editor-B5EY1bb8.css +0 -1
  202. package/frontend/dist/assets/editor.main-CnjJg6pv.js +0 -37
  203. package/frontend/dist/assets/elixir-J3qpp9mX.js +0 -7
  204. package/frontend/dist/assets/flow9-DzW2c4Im.js +0 -7
  205. package/frontend/dist/assets/freemarker2-CUgILTtX.js +0 -7
  206. package/frontend/dist/assets/fsharp-D00tn_6c.js +0 -7
  207. package/frontend/dist/assets/go-NnNmgWK_.js +0 -7
  208. package/frontend/dist/assets/graphql-C9_--VLF.js +0 -7
  209. package/frontend/dist/assets/handlebars-C2avKkbK.js +0 -7
  210. package/frontend/dist/assets/hcl-BhbOULbp.js +0 -7
  211. package/frontend/dist/assets/html-ZYUiGgvr.js +0 -7
  212. package/frontend/dist/assets/htmlMode-CeliqUBd.js +0 -7
  213. package/frontend/dist/assets/index-COjNnvQB.css +0 -1
  214. package/frontend/dist/assets/index-DjmvYdMM.js +0 -1
  215. package/frontend/dist/assets/ini-zR-_X5iG.js +0 -7
  216. package/frontend/dist/assets/java-CSTjsyoZ.js +0 -7
  217. package/frontend/dist/assets/javascript-0VRCllAK.js +0 -7
  218. package/frontend/dist/assets/jsonMode-Dwqu43-Y.js +0 -7
  219. package/frontend/dist/assets/julia-DioMOKVu.js +0 -7
  220. package/frontend/dist/assets/kotlin-Dsb0PKmW.js +0 -7
  221. package/frontend/dist/assets/less-CZYLoAVD.js +0 -7
  222. package/frontend/dist/assets/lexon-d5JUiwNk.js +0 -7
  223. package/frontend/dist/assets/liquid-E2ejTVvo.js +0 -7
  224. package/frontend/dist/assets/lua-1Al72GG8.js +0 -7
  225. package/frontend/dist/assets/m3-hx1xCPC3.js +0 -7
  226. package/frontend/dist/assets/markdown-DPGrH1xZ.js +0 -7
  227. package/frontend/dist/assets/mdx-CqJmnu86.js +0 -7
  228. package/frontend/dist/assets/mips-CYbZjkIm.js +0 -7
  229. package/frontend/dist/assets/msdax-DAioKM5A.js +0 -7
  230. package/frontend/dist/assets/mysql-7e9GUebS.js +0 -7
  231. package/frontend/dist/assets/objective-c-BGf8QNjz.js +0 -7
  232. package/frontend/dist/assets/pascal-hEDRz3un.js +0 -7
  233. package/frontend/dist/assets/pascaligo-gqEhN6pG.js +0 -7
  234. package/frontend/dist/assets/perl-CN8Ht9Vk.js +0 -7
  235. package/frontend/dist/assets/pgsql-CRCqHQBx.js +0 -7
  236. package/frontend/dist/assets/php-DTZrlAwe.js +0 -7
  237. package/frontend/dist/assets/pla-CRmh4UcC.js +0 -7
  238. package/frontend/dist/assets/postiats-Car2G7g8.js +0 -7
  239. package/frontend/dist/assets/powerquery-BJKl8V3o.js +0 -7
  240. package/frontend/dist/assets/powershell-Du7a_J7r.js +0 -7
  241. package/frontend/dist/assets/protobuf-ChneWI0H.js +0 -7
  242. package/frontend/dist/assets/pug-BH6LSJaf.js +0 -7
  243. package/frontend/dist/assets/python-BYNiBUNZ.js +0 -7
  244. package/frontend/dist/assets/qsharp-CU-Hxpxi.js +0 -7
  245. package/frontend/dist/assets/r-Bw-W15zh.js +0 -7
  246. package/frontend/dist/assets/razor-2YR0XVnP.js +0 -7
  247. package/frontend/dist/assets/redis-bY-X9-ol.js +0 -7
  248. package/frontend/dist/assets/redshift-CMu3ubbS.js +0 -7
  249. package/frontend/dist/assets/restructuredtext-KNkiWGNN.js +0 -7
  250. package/frontend/dist/assets/ruby-dQWMhU86.js +0 -7
  251. package/frontend/dist/assets/rust-BAcHhnEU.js +0 -7
  252. package/frontend/dist/assets/sb-Bidr5w2z.js +0 -7
  253. package/frontend/dist/assets/scala-imTtxsGY.js +0 -7
  254. package/frontend/dist/assets/scheme-BY-WHKiB.js +0 -7
  255. package/frontend/dist/assets/scss-NDoRP52C.js +0 -7
  256. package/frontend/dist/assets/shell-DrIjotnh.js +0 -7
  257. package/frontend/dist/assets/solidity-DTahNycF.js +0 -7
  258. package/frontend/dist/assets/sophia-DtyrjGkZ.js +0 -7
  259. package/frontend/dist/assets/sparql-CFuS5E3z.js +0 -7
  260. package/frontend/dist/assets/sql-BRxcnbRv.js +0 -7
  261. package/frontend/dist/assets/st-Dz4uh7MK.js +0 -7
  262. package/frontend/dist/assets/swift-Digsrw1G.js +0 -11
  263. package/frontend/dist/assets/systemverilog-7TDrkMau.js +0 -7
  264. package/frontend/dist/assets/tcl-BtaFcnDi.js +0 -7
  265. package/frontend/dist/assets/tsMode-DrjOLXjA.js +0 -7
  266. package/frontend/dist/assets/twig-Deid_oBs.js +0 -7
  267. package/frontend/dist/assets/typescript--8YtfOFf.js +0 -7
  268. package/frontend/dist/assets/typespec-zUaxhbG8.js +0 -7
  269. package/frontend/dist/assets/vb-DK0rKJzo.js +0 -7
  270. package/frontend/dist/assets/wgsl-B8fNVlOQ.js +0 -7
  271. package/frontend/dist/assets/xml-CGj_sBRG.js +0 -7
  272. 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,0CAiFC;AAhHD,uCAAwB;AACxB,2CAA4B;AAC5B,uDAAgH;AAoBhH;;;;;;;;GAQG;AACI,KAAK,UAAU,eAAe,CAAC,IAAqB;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAA;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAO,CAAA;IAE3C,oBAAoB;IACpB,IAAA,kCAAgB,EAAC,GAAG,EAAE,IAAA,mCAAiB,EAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;IAE7E,iCAAiC;IACjC,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,IAAI,CAAC;QACH,cAAc,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,mBAAmB;QACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEhC,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,MAAM,YAAY,GAAG,GAAG,CAAA;QACxB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAA,mCAAiB,EAAC,GAAG,CAAC,CAAA;gBACtB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;YAC9B,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;gBACvC,IAAA,mCAAiB,EAAC,GAAG,CAAC,CAAA;gBACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,SAAS,qBAAqB,EAAE,CAAA;YAC/E,CAAC;YACD,IAAI,OAAO,GAAG,cAAc,CAAA;YAC5B,IAAI,CAAC;gBACH,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,CAAA;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;YACD,IAAI,OAAO,GAAG,cAAc,GAAG,CAAC,EAAE,CAAC;gBACjC,uBAAuB;gBACvB,MAAK;YACP,CAAC;YACD,MAAM,KAAK,CAAC,YAAY,CAAC,CAAA;QAC3B,CAAC;QAED,iCAAiC;QACjC,MAAM,MAAM,GAAG,MAAM,IAAA,sCAAoB,EAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAA,mCAAiB,EAAC,GAAG,CAAC,CAAA;YACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,wBAAwB,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,EAAE,CAAA;QACxF,CAAC;QAED,0BAA0B;QAC1B,MAAM,mBAAmB,GAAG,IAAA,mCAAiB,EAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAkD,EAAE,CAAA;QAClE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;YAC3C,MAAM,IAAI,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;YACnC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACvD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACtE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAA,mCAAiB,EAAC,GAAG,CAAC,CAAA;YACtB,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,gBAAgB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACpD,CAAA;QACH,CAAC;QAED,IAAA,mCAAiB,EAAC,GAAG,CAAC,CAAA;QACtB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAA;IACxE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAA,mCAAiB,EAAC,GAAG,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;QACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAgB,CAAW,CAAC,OAAO,EAAE,EAAE,CAAA;IAC1E,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACvC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IACvC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC"}
@@ -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,2 @@
1
+ export declare function newRunId(): string;
2
+ //# sourceMappingURL=run-id.d.ts.map
@@ -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,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newRunId = newRunId;
4
+ function newRunId() {
5
+ return `run_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
6
+ }
7
+ //# sourceMappingURL=run-id.js.map
@@ -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"}