@tom2012/cc-web 2026.5.14-a → 2026.5.15-a

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 (236) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/index.d.ts.map +1 -1
  3. package/backend/dist/index.js +51 -0
  4. package/backend/dist/index.js.map +1 -1
  5. package/backend/dist/routes/flows.d.ts.map +1 -1
  6. package/backend/dist/routes/flows.js +10 -0
  7. package/backend/dist/routes/flows.js.map +1 -1
  8. package/backend/dist/routes/global-tracks.d.ts +11 -0
  9. package/backend/dist/routes/global-tracks.d.ts.map +1 -0
  10. package/backend/dist/routes/global-tracks.js +86 -0
  11. package/backend/dist/routes/global-tracks.js.map +1 -0
  12. package/backend/dist/routes/tracks.d.ts +14 -0
  13. package/backend/dist/routes/tracks.d.ts.map +1 -0
  14. package/backend/dist/routes/tracks.js +184 -0
  15. package/backend/dist/routes/tracks.js.map +1 -0
  16. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts +11 -0
  17. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts.map +1 -0
  18. package/backend/dist/tracks/__tests__/verify-track-t1.js +293 -0
  19. package/backend/dist/tracks/__tests__/verify-track-t1.js.map +1 -0
  20. package/backend/dist/tracks/__tests__/verify-track.d.ts +20 -0
  21. package/backend/dist/tracks/__tests__/verify-track.d.ts.map +1 -0
  22. package/backend/dist/tracks/__tests__/verify-track.js +187 -0
  23. package/backend/dist/tracks/__tests__/verify-track.js.map +1 -0
  24. package/backend/dist/tracks/ask-user-bridge.d.ts +59 -0
  25. package/backend/dist/tracks/ask-user-bridge.d.ts.map +1 -0
  26. package/backend/dist/tracks/ask-user-bridge.js +186 -0
  27. package/backend/dist/tracks/ask-user-bridge.js.map +1 -0
  28. package/backend/dist/tracks/ccweb-train-adapter.d.ts +40 -0
  29. package/backend/dist/tracks/ccweb-train-adapter.d.ts.map +1 -0
  30. package/backend/dist/tracks/ccweb-train-adapter.js +111 -0
  31. package/backend/dist/tracks/ccweb-train-adapter.js.map +1 -0
  32. package/backend/dist/tracks/cross-lock.d.ts +30 -0
  33. package/backend/dist/tracks/cross-lock.d.ts.map +1 -0
  34. package/backend/dist/tracks/cross-lock.js +44 -0
  35. package/backend/dist/tracks/cross-lock.js.map +1 -0
  36. package/backend/dist/tracks/index.d.ts +20 -0
  37. package/backend/dist/tracks/index.d.ts.map +1 -0
  38. package/backend/dist/tracks/index.js +42 -0
  39. package/backend/dist/tracks/index.js.map +1 -0
  40. package/backend/dist/tracks/registry.d.ts +56 -0
  41. package/backend/dist/tracks/registry.d.ts.map +1 -0
  42. package/backend/dist/tracks/registry.js +161 -0
  43. package/backend/dist/tracks/registry.js.map +1 -0
  44. package/backend/dist/tracks/store.d.ts +37 -0
  45. package/backend/dist/tracks/store.d.ts.map +1 -0
  46. package/backend/dist/tracks/store.js +254 -0
  47. package/backend/dist/tracks/store.js.map +1 -0
  48. package/backend/dist/tracks/track-runner.d.ts +62 -0
  49. package/backend/dist/tracks/track-runner.d.ts.map +1 -0
  50. package/backend/dist/tracks/track-runner.js +134 -0
  51. package/backend/dist/tracks/track-runner.js.map +1 -0
  52. package/backend/dist/tracks/train-loader.d.ts +44 -0
  53. package/backend/dist/tracks/train-loader.d.ts.map +1 -0
  54. package/backend/dist/tracks/train-loader.js +32 -0
  55. package/backend/dist/tracks/train-loader.js.map +1 -0
  56. package/backend/dist/tracks/types-train.d.ts +12 -0
  57. package/backend/dist/tracks/types-train.d.ts.map +1 -0
  58. package/backend/dist/tracks/types-train.js +13 -0
  59. package/backend/dist/tracks/types-train.js.map +1 -0
  60. package/backend/dist/tracks/types.d.ts +66 -0
  61. package/backend/dist/tracks/types.d.ts.map +1 -0
  62. package/backend/dist/tracks/types.js +12 -0
  63. package/backend/dist/tracks/types.js.map +1 -0
  64. package/backend/dist/tracks/workflow-data-watcher.d.ts +47 -0
  65. package/backend/dist/tracks/workflow-data-watcher.d.ts.map +1 -0
  66. package/backend/dist/tracks/workflow-data-watcher.js +166 -0
  67. package/backend/dist/tracks/workflow-data-watcher.js.map +1 -0
  68. package/backend/package-lock.json +107 -0
  69. package/backend/package.json +6 -1
  70. package/backend/vendor/@train-lang/adapter-spec/dist/index.d.ts +164 -0
  71. package/backend/vendor/@train-lang/adapter-spec/dist/index.d.ts.map +1 -0
  72. package/backend/vendor/@train-lang/adapter-spec/dist/index.js +13 -0
  73. package/backend/vendor/@train-lang/adapter-spec/dist/index.js.map +1 -0
  74. package/backend/vendor/@train-lang/adapter-spec/package.json +15 -0
  75. package/backend/vendor/@train-lang/core/dist/ast-cache.d.ts +74 -0
  76. package/backend/vendor/@train-lang/core/dist/ast-cache.d.ts.map +1 -0
  77. package/backend/vendor/@train-lang/core/dist/ast-cache.js +157 -0
  78. package/backend/vendor/@train-lang/core/dist/ast-cache.js.map +1 -0
  79. package/backend/vendor/@train-lang/core/dist/ast.d.ts +350 -0
  80. package/backend/vendor/@train-lang/core/dist/ast.d.ts.map +1 -0
  81. package/backend/vendor/@train-lang/core/dist/ast.js +15 -0
  82. package/backend/vendor/@train-lang/core/dist/ast.js.map +1 -0
  83. package/backend/vendor/@train-lang/core/dist/builder.d.ts +21 -0
  84. package/backend/vendor/@train-lang/core/dist/builder.d.ts.map +1 -0
  85. package/backend/vendor/@train-lang/core/dist/builder.js +1221 -0
  86. package/backend/vendor/@train-lang/core/dist/builder.js.map +1 -0
  87. package/backend/vendor/@train-lang/core/dist/builtins.d.ts +17 -0
  88. package/backend/vendor/@train-lang/core/dist/builtins.d.ts.map +1 -0
  89. package/backend/vendor/@train-lang/core/dist/builtins.js +488 -0
  90. package/backend/vendor/@train-lang/core/dist/builtins.js.map +1 -0
  91. package/backend/vendor/@train-lang/core/dist/index.d.ts +54 -0
  92. package/backend/vendor/@train-lang/core/dist/index.d.ts.map +1 -0
  93. package/backend/vendor/@train-lang/core/dist/index.js +66 -0
  94. package/backend/vendor/@train-lang/core/dist/index.js.map +1 -0
  95. package/backend/vendor/@train-lang/core/dist/interpreter.d.ts +110 -0
  96. package/backend/vendor/@train-lang/core/dist/interpreter.d.ts.map +1 -0
  97. package/backend/vendor/@train-lang/core/dist/interpreter.js +894 -0
  98. package/backend/vendor/@train-lang/core/dist/interpreter.js.map +1 -0
  99. package/backend/vendor/@train-lang/core/dist/lexer.d.ts +88 -0
  100. package/backend/vendor/@train-lang/core/dist/lexer.d.ts.map +1 -0
  101. package/backend/vendor/@train-lang/core/dist/lexer.js +243 -0
  102. package/backend/vendor/@train-lang/core/dist/lexer.js.map +1 -0
  103. package/backend/vendor/@train-lang/core/dist/module-loader.d.ts +74 -0
  104. package/backend/vendor/@train-lang/core/dist/module-loader.d.ts.map +1 -0
  105. package/backend/vendor/@train-lang/core/dist/module-loader.js +134 -0
  106. package/backend/vendor/@train-lang/core/dist/module-loader.js.map +1 -0
  107. package/backend/vendor/@train-lang/core/dist/parser.d.ts +135 -0
  108. package/backend/vendor/@train-lang/core/dist/parser.d.ts.map +1 -0
  109. package/backend/vendor/@train-lang/core/dist/parser.js +838 -0
  110. package/backend/vendor/@train-lang/core/dist/parser.js.map +1 -0
  111. package/backend/vendor/@train-lang/core/dist/prompt-composer.d.ts +49 -0
  112. package/backend/vendor/@train-lang/core/dist/prompt-composer.d.ts.map +1 -0
  113. package/backend/vendor/@train-lang/core/dist/prompt-composer.js +159 -0
  114. package/backend/vendor/@train-lang/core/dist/prompt-composer.js.map +1 -0
  115. package/backend/vendor/@train-lang/core/dist/runtime.d.ts +146 -0
  116. package/backend/vendor/@train-lang/core/dist/runtime.d.ts.map +1 -0
  117. package/backend/vendor/@train-lang/core/dist/runtime.js +156 -0
  118. package/backend/vendor/@train-lang/core/dist/runtime.js.map +1 -0
  119. package/backend/vendor/@train-lang/core/dist/type-descriptor.d.ts +18 -0
  120. package/backend/vendor/@train-lang/core/dist/type-descriptor.d.ts.map +1 -0
  121. package/backend/vendor/@train-lang/core/dist/type-descriptor.js +94 -0
  122. package/backend/vendor/@train-lang/core/dist/type-descriptor.js.map +1 -0
  123. package/backend/vendor/@train-lang/core/dist/validation.d.ts +44 -0
  124. package/backend/vendor/@train-lang/core/dist/validation.d.ts.map +1 -0
  125. package/backend/vendor/@train-lang/core/dist/validation.js +271 -0
  126. package/backend/vendor/@train-lang/core/dist/validation.js.map +1 -0
  127. package/backend/vendor/@train-lang/core/package.json +35 -0
  128. package/frontend/dist/assets/{ChatOverlay-DsfZXjjz.js → ChatOverlay-D0AFod2I.js} +1 -1
  129. package/frontend/dist/assets/{GraphPreview-BGZHA8KW.js → GraphPreview-BTnlkocf.js} +2 -2
  130. package/frontend/dist/assets/{MobilePage-B-FiVfUE.js → MobilePage-CnjdRqIt.js} +3 -3
  131. package/frontend/dist/assets/{OfficePreview-CvHPeAlI.js → OfficePreview-nTZKPD9R.js} +2 -2
  132. package/frontend/dist/assets/{PdfPreview-D1OVG7jG.js → PdfPreview-DlB-s5M8.js} +1 -1
  133. package/frontend/dist/assets/{ProjectPage-CyKEenc5.js → ProjectPage-C_3_sZbd.js} +5 -5
  134. package/frontend/dist/assets/{SettingsPage-CIe3HZml.js → SettingsPage-BYSCQKoh.js} +2 -2
  135. package/frontend/dist/assets/{SkillHubPage-CG1-G4Pf.js → SkillHubPage-CUgZXyeE.js} +3 -3
  136. package/frontend/dist/assets/TrackEditor-R2lmPugZ.js +14 -0
  137. package/frontend/dist/assets/abap-LPLW346S.js +7 -0
  138. package/frontend/dist/assets/apex-Dk-jUCUV.js +7 -0
  139. package/frontend/dist/assets/azcli-DPUMmPlX.js +7 -0
  140. package/frontend/dist/assets/bat-C1Qbg1bV.js +7 -0
  141. package/frontend/dist/assets/bicep-D-e-VSJi.js +7 -0
  142. package/frontend/dist/assets/cameligo-CjUqTgqL.js +7 -0
  143. package/frontend/dist/assets/{chevron-down-CS7uu2Ol.js → chevron-down-Bc6Xpnnk.js} +1 -1
  144. package/frontend/dist/assets/clojure-BWsu6Kju.js +7 -0
  145. package/frontend/dist/assets/codicon-DCmgc-ay.ttf +0 -0
  146. package/frontend/dist/assets/coffee-DeC36AK3.js +7 -0
  147. package/frontend/dist/assets/cpp-DcZnmBWT.js +7 -0
  148. package/frontend/dist/assets/csharp-DqBXBMf0.js +7 -0
  149. package/frontend/dist/assets/csp-CkO7y8ul.js +7 -0
  150. package/frontend/dist/assets/css-OAcfVtED.js +7 -0
  151. package/frontend/dist/assets/cssMode-oT-78_Ke.js +7 -0
  152. package/frontend/dist/assets/cypher-40UGrUjD.js +7 -0
  153. package/frontend/dist/assets/dart-DmixyLor.js +7 -0
  154. package/frontend/dist/assets/dockerfile-CayO4nTA.js +7 -0
  155. package/frontend/dist/assets/ecl-DRrKCuVc.js +7 -0
  156. package/frontend/dist/assets/editor-B5EY1bb8.css +1 -0
  157. package/frontend/dist/assets/editor.main-CKHkO4rf.js +37 -0
  158. package/frontend/dist/assets/elixir-J3qpp9mX.js +7 -0
  159. package/frontend/dist/assets/flow9-DzW2c4Im.js +7 -0
  160. package/frontend/dist/assets/freemarker2-gLqtlSdW.js +7 -0
  161. package/frontend/dist/assets/fsharp-D00tn_6c.js +7 -0
  162. package/frontend/dist/assets/go-NnNmgWK_.js +7 -0
  163. package/frontend/dist/assets/graphql-C9_--VLF.js +7 -0
  164. package/frontend/dist/assets/handlebars-CMR-cKzv.js +7 -0
  165. package/frontend/dist/assets/hcl-BhbOULbp.js +7 -0
  166. package/frontend/dist/assets/html-er6LXl7Q.js +7 -0
  167. package/frontend/dist/assets/htmlMode-BY7CWp3G.js +7 -0
  168. package/frontend/dist/assets/index-BmPb0Wl1.css +1 -0
  169. package/frontend/dist/assets/{index-DN91i4kg.js → index-C6JmYBh3.js} +1 -1
  170. package/frontend/dist/assets/{index-BThL9NV3.js → index-C7QaGdFu.js} +2 -2
  171. package/frontend/dist/assets/{index-DCc5jmus.js → index-CuoDBJ4_.js} +1 -1
  172. package/frontend/dist/assets/index-LxjrLxfp.js +1 -0
  173. package/frontend/dist/assets/ini-zR-_X5iG.js +7 -0
  174. package/frontend/dist/assets/java-CSTjsyoZ.js +7 -0
  175. package/frontend/dist/assets/javascript-R0QZ7Rw2.js +7 -0
  176. package/frontend/dist/assets/jsonMode-dh6Js0Qv.js +7 -0
  177. package/frontend/dist/assets/{jszip.min-DHcltCpp.js → jszip.min-D7W3wEX7.js} +1 -1
  178. package/frontend/dist/assets/julia-DioMOKVu.js +7 -0
  179. package/frontend/dist/assets/kotlin-Dsb0PKmW.js +7 -0
  180. package/frontend/dist/assets/less-CZYLoAVD.js +7 -0
  181. package/frontend/dist/assets/lexon-d5JUiwNk.js +7 -0
  182. package/frontend/dist/assets/liquid-ggFR895M.js +7 -0
  183. package/frontend/dist/assets/lua-1Al72GG8.js +7 -0
  184. package/frontend/dist/assets/m3-hx1xCPC3.js +7 -0
  185. package/frontend/dist/assets/markdown-DPGrH1xZ.js +7 -0
  186. package/frontend/dist/assets/mdx-B4WBy0Yh.js +7 -0
  187. package/frontend/dist/assets/mips-CYbZjkIm.js +7 -0
  188. package/frontend/dist/assets/msdax-DAioKM5A.js +7 -0
  189. package/frontend/dist/assets/mysql-7e9GUebS.js +7 -0
  190. package/frontend/dist/assets/objective-c-BGf8QNjz.js +7 -0
  191. package/frontend/dist/assets/pascal-hEDRz3un.js +7 -0
  192. package/frontend/dist/assets/pascaligo-gqEhN6pG.js +7 -0
  193. package/frontend/dist/assets/perl-CN8Ht9Vk.js +7 -0
  194. package/frontend/dist/assets/pgsql-CRCqHQBx.js +7 -0
  195. package/frontend/dist/assets/php-DTZrlAwe.js +7 -0
  196. package/frontend/dist/assets/pla-CRmh4UcC.js +7 -0
  197. package/frontend/dist/assets/postiats-Car2G7g8.js +7 -0
  198. package/frontend/dist/assets/powerquery-BJKl8V3o.js +7 -0
  199. package/frontend/dist/assets/powershell-Du7a_J7r.js +7 -0
  200. package/frontend/dist/assets/protobuf-ChneWI0H.js +7 -0
  201. package/frontend/dist/assets/pug-BH6LSJaf.js +7 -0
  202. package/frontend/dist/assets/python-AIGmVleM.js +7 -0
  203. package/frontend/dist/assets/qsharp-CU-Hxpxi.js +7 -0
  204. package/frontend/dist/assets/r-Bw-W15zh.js +7 -0
  205. package/frontend/dist/assets/razor-BGAZW957.js +7 -0
  206. package/frontend/dist/assets/redis-bY-X9-ol.js +7 -0
  207. package/frontend/dist/assets/redshift-CMu3ubbS.js +7 -0
  208. package/frontend/dist/assets/restructuredtext-KNkiWGNN.js +7 -0
  209. package/frontend/dist/assets/ruby-dQWMhU86.js +7 -0
  210. package/frontend/dist/assets/rust-BAcHhnEU.js +7 -0
  211. package/frontend/dist/assets/sb-Bidr5w2z.js +7 -0
  212. package/frontend/dist/assets/scala-imTtxsGY.js +7 -0
  213. package/frontend/dist/assets/scheme-BY-WHKiB.js +7 -0
  214. package/frontend/dist/assets/scss-NDoRP52C.js +7 -0
  215. package/frontend/dist/assets/{select-C09dwvOR.js → select-B9gOzVx5.js} +1 -1
  216. package/frontend/dist/assets/shell-DrIjotnh.js +7 -0
  217. package/frontend/dist/assets/solidity-DTahNycF.js +7 -0
  218. package/frontend/dist/assets/sophia-DtyrjGkZ.js +7 -0
  219. package/frontend/dist/assets/sparql-CFuS5E3z.js +7 -0
  220. package/frontend/dist/assets/sql-BRxcnbRv.js +7 -0
  221. package/frontend/dist/assets/st-Dz4uh7MK.js +7 -0
  222. package/frontend/dist/assets/swift-Digsrw1G.js +11 -0
  223. package/frontend/dist/assets/systemverilog-7TDrkMau.js +7 -0
  224. package/frontend/dist/assets/tcl-BtaFcnDi.js +7 -0
  225. package/frontend/dist/assets/tsMode-UrEEwBkN.js +7 -0
  226. package/frontend/dist/assets/twig-Deid_oBs.js +7 -0
  227. package/frontend/dist/assets/typescript-BTfMCp5C.js +7 -0
  228. package/frontend/dist/assets/typespec-zUaxhbG8.js +7 -0
  229. package/frontend/dist/assets/{user-Bj8X-WCQ.js → user-BG-Xqf8M.js} +1 -1
  230. package/frontend/dist/assets/vb-DK0rKJzo.js +7 -0
  231. package/frontend/dist/assets/wgsl-B8fNVlOQ.js +7 -0
  232. package/frontend/dist/assets/xml-BCL5DPdB.js +7 -0
  233. package/frontend/dist/assets/yaml-B__nW1c2.js +7 -0
  234. package/frontend/dist/index.html +2 -2
  235. package/package.json +2 -1
  236. package/frontend/dist/assets/index-BkQ6KI1l.css +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-data-watcher.js","sourceRoot":"","sources":["../../src/tracks/workflow-data-watcher.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@
11
11
  "dependencies": {
12
12
  "@azure/msal-node": "^3.8.10",
13
13
  "@microsoft/microsoft-graph-client": "^3.0.7",
14
+ "@train-lang/adapter-spec": "file:./vendor/@train-lang/adapter-spec",
15
+ "@train-lang/core": "file:./vendor/@train-lang/core",
14
16
  "@types/js-yaml": "^4.0.9",
15
17
  "adm-zip": "^0.5.16",
16
18
  "bcryptjs": "^2.4.3",
@@ -46,6 +48,32 @@
46
48
  "typescript": "^5.3.3"
47
49
  }
48
50
  },
51
+ "../../train-lang/packages/adapter-spec": {
52
+ "name": "@train-lang/adapter-spec",
53
+ "version": "0.0.0",
54
+ "extraneous": true,
55
+ "license": "MIT",
56
+ "devDependencies": {
57
+ "typescript": "^5.6.0"
58
+ }
59
+ },
60
+ "../../train-lang/packages/core": {
61
+ "name": "@train-lang/core",
62
+ "version": "0.0.0",
63
+ "extraneous": true,
64
+ "license": "MIT",
65
+ "dependencies": {
66
+ "@train-lang/adapter-spec": "workspace:*",
67
+ "chevrotain": "^11.0.3"
68
+ },
69
+ "devDependencies": {
70
+ "@train-lang/adapter-fake-gen": "workspace:*",
71
+ "@train-lang/adapter-mock": "workspace:*",
72
+ "@types/node": "^22.0.0",
73
+ "typescript": "^5.6.0",
74
+ "vitest": "^2.1.0"
75
+ }
76
+ },
49
77
  "node_modules/@azure/msal-common": {
50
78
  "version": "15.17.0",
51
79
  "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.17.0.tgz",
@@ -87,6 +115,45 @@
87
115
  "node": ">=6.9.0"
88
116
  }
89
117
  },
118
+ "node_modules/@chevrotain/cst-dts-gen": {
119
+ "version": "11.2.0",
120
+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.2.0.tgz",
121
+ "integrity": "sha512-ssJFvn/UXhQQeICw3SR/fZPmYVj+JM2mP+Lx7bZ51cOeHaMWOKp3AUMuyM3QR82aFFXTfcAp67P5GpPjGmbZWQ==",
122
+ "license": "Apache-2.0",
123
+ "dependencies": {
124
+ "@chevrotain/gast": "11.2.0",
125
+ "@chevrotain/types": "11.2.0",
126
+ "lodash-es": "4.17.23"
127
+ }
128
+ },
129
+ "node_modules/@chevrotain/gast": {
130
+ "version": "11.2.0",
131
+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.2.0.tgz",
132
+ "integrity": "sha512-c+KoD6eSI1xjAZZoNUW+V0l13UEn+a4ShmUrjIKs1BeEWCji0Kwhmqn5FSx1K4BhWL7IQKlV7wLR4r8lLArORQ==",
133
+ "license": "Apache-2.0",
134
+ "dependencies": {
135
+ "@chevrotain/types": "11.2.0",
136
+ "lodash-es": "4.17.23"
137
+ }
138
+ },
139
+ "node_modules/@chevrotain/regexp-to-ast": {
140
+ "version": "11.2.0",
141
+ "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.2.0.tgz",
142
+ "integrity": "sha512-lG73pBFqbXODTbXhdZwv0oyUaI+3Irm+uOv5/W79lI3g5hasYaJnVJOm3H2NkhA0Ef4XLBU4Scr7TJDJwgFkAw==",
143
+ "license": "Apache-2.0"
144
+ },
145
+ "node_modules/@chevrotain/types": {
146
+ "version": "11.2.0",
147
+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.2.0.tgz",
148
+ "integrity": "sha512-vBMSj/lz/LqolbGQEHB0tlpW5BnljHVtp+kzjQfQU+5BtGMTuZCPVgaAjtKvQYXnHb/8i/02Kii00y0tsuwfsw==",
149
+ "license": "Apache-2.0"
150
+ },
151
+ "node_modules/@chevrotain/utils": {
152
+ "version": "11.2.0",
153
+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.2.0.tgz",
154
+ "integrity": "sha512-+7whECg4yNWHottjvr2To2BRxL4XJVjIyyv5J4+bJ0iMOVU8j/8n1qPDLZS/90W/BObDR8VNL46lFbzY/Hosmw==",
155
+ "license": "Apache-2.0"
156
+ },
90
157
  "node_modules/@cspotcode/source-map-support": {
91
158
  "version": "0.8.1",
92
159
  "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
@@ -199,6 +266,14 @@
199
266
  "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==",
200
267
  "license": "MIT"
201
268
  },
269
+ "node_modules/@train-lang/adapter-spec": {
270
+ "resolved": "vendor/@train-lang/adapter-spec",
271
+ "link": true
272
+ },
273
+ "node_modules/@train-lang/core": {
274
+ "resolved": "vendor/@train-lang/core",
275
+ "link": true
276
+ },
202
277
  "node_modules/@tsconfig/node10": {
203
278
  "version": "1.0.12",
204
279
  "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
@@ -733,6 +808,20 @@
733
808
  "url": "https://github.com/sponsors/ljharb"
734
809
  }
735
810
  },
811
+ "node_modules/chevrotain": {
812
+ "version": "11.2.0",
813
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.2.0.tgz",
814
+ "integrity": "sha512-mHCHTxM51nCklUw9RzRVc0DLjAh/SAUPM4k/zMInlTIo25ldWXOZoPt7XEIk/LwoT4lFVmJcu9g5MHtx371x3A==",
815
+ "license": "Apache-2.0",
816
+ "dependencies": {
817
+ "@chevrotain/cst-dts-gen": "11.2.0",
818
+ "@chevrotain/gast": "11.2.0",
819
+ "@chevrotain/regexp-to-ast": "11.2.0",
820
+ "@chevrotain/types": "11.2.0",
821
+ "@chevrotain/utils": "11.2.0",
822
+ "lodash-es": "4.17.23"
823
+ }
824
+ },
736
825
  "node_modules/chokidar": {
737
826
  "version": "3.6.0",
738
827
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -1723,6 +1812,12 @@
1723
1812
  "safe-buffer": "^5.0.1"
1724
1813
  }
1725
1814
  },
1815
+ "node_modules/lodash-es": {
1816
+ "version": "4.17.23",
1817
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
1818
+ "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",
1819
+ "license": "MIT"
1820
+ },
1726
1821
  "node_modules/lodash.includes": {
1727
1822
  "version": "4.3.0",
1728
1823
  "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
@@ -2901,6 +2996,18 @@
2901
2996
  "engines": {
2902
2997
  "node": ">=6"
2903
2998
  }
2999
+ },
3000
+ "vendor/@train-lang/adapter-spec": {
3001
+ "version": "0.1.0-ccweb",
3002
+ "license": "MIT"
3003
+ },
3004
+ "vendor/@train-lang/core": {
3005
+ "version": "0.1.0-ccweb",
3006
+ "license": "MIT",
3007
+ "dependencies": {
3008
+ "@train-lang/adapter-spec": "*",
3009
+ "chevrotain": "^11.0.3"
3010
+ }
2904
3011
  }
2905
3012
  }
2906
3013
  }
@@ -5,11 +5,16 @@
5
5
  "dev": "ts-node-dev --respawn --transpile-only src/index.ts",
6
6
  "build": "tsc",
7
7
  "start": "node dist/index.js",
8
- "postinstall": "chmod +x node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper 2>/dev/null || true"
8
+ "postinstall": "chmod +x node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper 2>/dev/null || true",
9
+ "verify:tracks:t0": "ts-node src/tracks/__tests__/verify-track.ts",
10
+ "verify:tracks:t1": "ts-node src/tracks/__tests__/verify-track-t1.ts",
11
+ "verify:tracks": "npm run verify:tracks:t0 && npm run verify:tracks:t1"
9
12
  },
10
13
  "dependencies": {
11
14
  "@azure/msal-node": "^3.8.10",
12
15
  "@microsoft/microsoft-graph-client": "^3.0.7",
16
+ "@train-lang/core": "file:./vendor/@train-lang/core",
17
+ "@train-lang/adapter-spec": "file:./vendor/@train-lang/adapter-spec",
13
18
  "@types/js-yaml": "^4.0.9",
14
19
  "adm-zip": "^0.5.16",
15
20
  "bcryptjs": "^2.4.3",
@@ -0,0 +1,164 @@
1
+ /**
2
+ * @train-lang/adapter-spec — LLM adapter protocol for train.
3
+ *
4
+ * This package contains ONLY TypeScript type definitions; it has zero
5
+ * runtime dependencies. Every LLM adapter (OpenAI / Anthropic / Ollama /
6
+ * Claude Code / Codex / ccweb / etc.) implements the interfaces here.
7
+ *
8
+ * train's core (@train-lang/core) depends on this package and dispatches
9
+ * fai function calls through whatever LLMAdapter is configured at run
10
+ * time. Core itself never makes HTTP requests or spawns processes.
11
+ */
12
+ /**
13
+ * A runtime-friendly description of a train type. The core sends this
14
+ * to adapters so they can build structured-output schemas (e.g. JSON
15
+ * mode for OpenAI / Anthropic) and so they can validate responses.
16
+ */
17
+ export type TrainTypeDescriptor = ScalarTypeDescriptor | EnumTypeDescriptor | ArrayTypeDescriptor | ObjectTypeDescriptor;
18
+ export interface ScalarTypeDescriptor {
19
+ kind: 'scalar';
20
+ /** int / float / bool / string / prompt / any */
21
+ base: string;
22
+ constraint?: TypeConstraintDescriptor;
23
+ }
24
+ export type TypeConstraintDescriptor = {
25
+ kind: 'range';
26
+ min: number;
27
+ max: number;
28
+ } | {
29
+ kind: 'named';
30
+ key: string;
31
+ value: number | string;
32
+ };
33
+ export interface EnumTypeDescriptor {
34
+ kind: 'enum';
35
+ variants: string[];
36
+ }
37
+ export interface ArrayTypeDescriptor {
38
+ kind: 'array';
39
+ element: TrainTypeDescriptor;
40
+ constraint?: TypeConstraintDescriptor;
41
+ }
42
+ export interface ObjectTypeDescriptor {
43
+ kind: 'object';
44
+ fields: Record<string, TrainTypeDescriptor>;
45
+ }
46
+ export interface FaiInputSpec {
47
+ type: TrainTypeDescriptor;
48
+ /** Already JSON-friendly (numbers/strings/booleans/arrays/objects). */
49
+ value: unknown;
50
+ description?: string;
51
+ }
52
+ export interface FaiOutputSpec {
53
+ type: TrainTypeDescriptor;
54
+ description?: string;
55
+ }
56
+ export interface FaiCallOptions {
57
+ /** Hard timeout per attempt. Adapter should reject with `timeout`. */
58
+ timeoutMs: number;
59
+ /** Max number of total attempts (initial + retries). 1 = no retry. */
60
+ maxAttempts: number;
61
+ /** Which attempt this is (0 = first call; 1+ = retry-with-feedback). */
62
+ attempt: number;
63
+ /** Adapter-specific model identifier (e.g. "gpt-4o", "claude-sonnet-4-6"). */
64
+ model?: string;
65
+ /** Optional AbortSignal — if supported, adapter should cancel on abort. */
66
+ signal?: AbortSignal;
67
+ }
68
+ /**
69
+ * One LLM call corresponding to one fai function invocation.
70
+ *
71
+ * The `prompt` field is the already-composed full prompt text. The
72
+ * `inputs` / `outputs` maps carry the structural information so an
73
+ * adapter using JSON-mode / structured output / function calling can
74
+ * derive a strict schema without having to re-parse `prompt`.
75
+ */
76
+ export interface FaiCall {
77
+ /** Monotonic id within a run (used in trace, debugging). */
78
+ callId: number;
79
+ /** The source-level name of the fai function being invoked. */
80
+ fnName: string;
81
+ /** Fully composed prompt text. */
82
+ prompt: string;
83
+ /** Structured input parameters (excluding prompt-typed params). */
84
+ inputs: Record<string, FaiInputSpec>;
85
+ /** Required output schema (1+ entries). */
86
+ outputs: Record<string, FaiOutputSpec>;
87
+ options: FaiCallOptions;
88
+ }
89
+ export type FaiResult = FaiSuccess | FaiValidationError | FaiTimeout | FaiCancelled | FaiAdapterError;
90
+ export interface FaiSuccess {
91
+ kind: 'success';
92
+ /** JSON-friendly values matching the declared output schema. */
93
+ outputs: Record<string, unknown>;
94
+ /** Optional metadata (token counts, latency, etc.) for trace logs. */
95
+ meta?: Record<string, unknown>;
96
+ }
97
+ export interface FaiValidationError {
98
+ kind: 'validation-error';
99
+ errors: ValidationErrorItem[];
100
+ /** Raw outputs as produced by the LLM, for debugging. */
101
+ rawOutputs?: Record<string, unknown>;
102
+ }
103
+ export interface ValidationErrorItem {
104
+ outputName: string;
105
+ message: string;
106
+ expected: TrainTypeDescriptor;
107
+ actual?: unknown;
108
+ }
109
+ export interface FaiTimeout {
110
+ kind: 'timeout';
111
+ }
112
+ export interface FaiCancelled {
113
+ kind: 'cancelled';
114
+ }
115
+ export interface FaiAdapterError {
116
+ kind: 'error';
117
+ message: string;
118
+ /** If true, the runtime may retry once. If false, propagate immediately. */
119
+ recoverable: boolean;
120
+ }
121
+ export interface AdapterCapabilities {
122
+ /** Adapter is safe to invoke from multiple concurrent fai calls. */
123
+ parallel: boolean;
124
+ /** Adapter honors FaiCallOptions.signal abortion. */
125
+ cancellation: boolean;
126
+ /**
127
+ * Two paradigms supported by train:
128
+ * - false: "direct API" — adapter returns outputs in FaiSuccess.outputs.
129
+ * Core writes them into workflow_data.json.
130
+ * - true: "agent CLI" — adapter coordinates with an external agent
131
+ * that writes outputs directly to a file shared with core.
132
+ * Core trusts the file contents post-call.
133
+ */
134
+ writesWorkflowData: boolean;
135
+ }
136
+ export interface LLMAdapter {
137
+ /** Stable identifier (e.g. "openai", "anthropic", "claude-code", "mock"). */
138
+ readonly name: string;
139
+ /** Semver string of this adapter implementation. */
140
+ readonly version: string;
141
+ readonly capabilities: AdapterCapabilities;
142
+ /**
143
+ * Perform one fai call. The runtime constructs FaiCall, dispatches to
144
+ * `call`, awaits the result, validates it (if `writesWorkflowData` is
145
+ * false) or trusts the file (if true), and may invoke again with an
146
+ * incremented `attempt` if validation fails.
147
+ */
148
+ call(req: FaiCall): Promise<FaiResult>;
149
+ /**
150
+ * Optional preflight check at adapter registration time. Adapters that
151
+ * need API keys / network reachability / spawned subprocess should
152
+ * implement this so the runtime can fail fast.
153
+ */
154
+ healthCheck?(): Promise<{
155
+ ok: boolean;
156
+ message?: string;
157
+ }>;
158
+ /**
159
+ * Optional cleanup hook called when a run ends. Adapters that hold
160
+ * connections / subprocess handles can release them here.
161
+ */
162
+ close?(): Promise<void>;
163
+ }
164
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @train-lang/adapter-spec — LLM adapter protocol for train.
3
+ *
4
+ * This package contains ONLY TypeScript type definitions; it has zero
5
+ * runtime dependencies. Every LLM adapter (OpenAI / Anthropic / Ollama /
6
+ * Claude Code / Codex / ccweb / etc.) implements the interfaces here.
7
+ *
8
+ * train's core (@train-lang/core) depends on this package and dispatches
9
+ * fai function calls through whatever LLMAdapter is configured at run
10
+ * time. Core itself never makes HTTP requests or spawns processes.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@train-lang/adapter-spec",
3
+ "version": "0.1.0-ccweb",
4
+ "description": "train language LLM adapter protocol — type definitions only, zero runtime dependencies (vendored into ccweb)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * AST cache (spec §4.5).
3
+ *
4
+ * Persist parsed AST to `<stateDir>/ast/<relativeFile>.ast.json` keyed by
5
+ * sha256(source) + compilerVersion. On reload, verify both — if either
6
+ * mismatches, return null and the caller re-parses.
7
+ *
8
+ * The cache file is plain JSON (no functions, no circular refs). All
9
+ * train AST nodes are plain objects with primitive leaves + Range info,
10
+ * so JSON.stringify is lossless.
11
+ *
12
+ * `normalizeForCache` strips fields that vary between runs (range,
13
+ * future __id, etc.) so two ASTs of the same source can be compared
14
+ * for equivalence by deep-equal of their normalized forms.
15
+ */
16
+ import type * as ast from './ast.js';
17
+ /** Bump whenever AST shape changes — invalidates all caches. */
18
+ export declare const AST_CACHE_VERSION = "train-core-0.1.0";
19
+ export interface AstCacheRecord {
20
+ sourceFile: string;
21
+ sourceHash: string;
22
+ compilerVersion: string;
23
+ compiledAt: string;
24
+ ast: ast.Program;
25
+ }
26
+ /** Compute the cache key for a source string. */
27
+ export declare function sourceHash(source: string): string;
28
+ /** Resolve cache file path under stateDir. */
29
+ export declare function cacheFilePath(stateDir: string, relSourceFile: string): string;
30
+ /**
31
+ * Save AST to cache file. Atomic: write to tmp then rename.
32
+ * Creates parent dirs as needed. Throws on filesystem errors.
33
+ */
34
+ export declare function saveCache(cachePath: string, record: AstCacheRecord): Promise<void>;
35
+ /**
36
+ * Load AST from cache file. Returns null if:
37
+ * - file does not exist
38
+ * - file is corrupt / not valid JSON / missing fields
39
+ * - sourceHash does not match the caller's expected hash
40
+ * - compilerVersion does not match AST_CACHE_VERSION
41
+ *
42
+ * Never throws on cache miss — caller should re-parse on null.
43
+ */
44
+ export declare function loadCache(cachePath: string, expectedHash: string, expectedCompilerVersion?: string): Promise<AstCacheRecord | null>;
45
+ export declare function normalizeForCache(node: unknown): unknown;
46
+ /**
47
+ * High-level facade: parse with cache.
48
+ *
49
+ * If a valid cached AST exists, return it. Otherwise call `parseFresh`,
50
+ * save the result to cache, and return it.
51
+ *
52
+ * `parseFresh` returns the AST plus any errors. Cache only on no-error.
53
+ */
54
+ export interface ParseWithCacheResult {
55
+ ast: ast.Program | null;
56
+ source: string;
57
+ fromCache: boolean;
58
+ /** Hash of source used for cache lookup. */
59
+ hash: string;
60
+ /** Any error from parseFresh, if cache was missed. */
61
+ lexErrors: ReadonlyArray<unknown>;
62
+ parseErrors: ReadonlyArray<unknown>;
63
+ }
64
+ export declare function parseWithCache(opts: {
65
+ source: string;
66
+ sourceFile: string;
67
+ stateDir: string;
68
+ parseFresh: (src: string) => {
69
+ ast: ast.Program | null;
70
+ lexErrors: ReadonlyArray<unknown>;
71
+ parseErrors: ReadonlyArray<unknown>;
72
+ };
73
+ }): Promise<ParseWithCacheResult>;
74
+ //# sourceMappingURL=ast-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-cache.d.ts","sourceRoot":"","sources":["../src/ast-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAA;AAEpC,gEAAgE;AAChE,eAAO,MAAM,iBAAiB,qBAAqB,CAAA;AAEnD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAA;CACjB;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,uBAAuB,GAAE,MAA0B,GAClD,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA4BhC;AAoBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAiBxD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IACjC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;CACpC;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;QAC3B,GAAG,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;QACvB,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;QACjC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;KACpC,CAAA;CACF,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoChC"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * AST cache (spec §4.5).
3
+ *
4
+ * Persist parsed AST to `<stateDir>/ast/<relativeFile>.ast.json` keyed by
5
+ * sha256(source) + compilerVersion. On reload, verify both — if either
6
+ * mismatches, return null and the caller re-parses.
7
+ *
8
+ * The cache file is plain JSON (no functions, no circular refs). All
9
+ * train AST nodes are plain objects with primitive leaves + Range info,
10
+ * so JSON.stringify is lossless.
11
+ *
12
+ * `normalizeForCache` strips fields that vary between runs (range,
13
+ * future __id, etc.) so two ASTs of the same source can be compared
14
+ * for equivalence by deep-equal of their normalized forms.
15
+ */
16
+ import { promises as fs } from 'node:fs';
17
+ import { createHash } from 'node:crypto';
18
+ import * as path from 'node:path';
19
+ /** Bump whenever AST shape changes — invalidates all caches. */
20
+ export const AST_CACHE_VERSION = 'train-core-0.1.0';
21
+ /** Compute the cache key for a source string. */
22
+ export function sourceHash(source) {
23
+ return 'sha256-' + createHash('sha256').update(source, 'utf8').digest('hex');
24
+ }
25
+ /** Resolve cache file path under stateDir. */
26
+ export function cacheFilePath(stateDir, relSourceFile) {
27
+ return path.join(stateDir, 'ast', relSourceFile + '.ast.json');
28
+ }
29
+ /**
30
+ * Save AST to cache file. Atomic: write to tmp then rename.
31
+ * Creates parent dirs as needed. Throws on filesystem errors.
32
+ */
33
+ export async function saveCache(cachePath, record) {
34
+ await fs.mkdir(path.dirname(cachePath), { recursive: true });
35
+ const tmp = cachePath + '.tmp-' + process.pid;
36
+ const json = JSON.stringify(record);
37
+ await fs.writeFile(tmp, json, 'utf8');
38
+ await fs.rename(tmp, cachePath);
39
+ }
40
+ /**
41
+ * Load AST from cache file. Returns null if:
42
+ * - file does not exist
43
+ * - file is corrupt / not valid JSON / missing fields
44
+ * - sourceHash does not match the caller's expected hash
45
+ * - compilerVersion does not match AST_CACHE_VERSION
46
+ *
47
+ * Never throws on cache miss — caller should re-parse on null.
48
+ */
49
+ export async function loadCache(cachePath, expectedHash, expectedCompilerVersion = AST_CACHE_VERSION) {
50
+ let raw;
51
+ try {
52
+ raw = await fs.readFile(cachePath, 'utf8');
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ let parsed;
58
+ try {
59
+ parsed = JSON.parse(raw);
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ if (!parsed || typeof parsed !== 'object')
65
+ return null;
66
+ const record = parsed;
67
+ if (typeof record.sourceHash !== 'string' ||
68
+ typeof record.compilerVersion !== 'string' ||
69
+ typeof record.compiledAt !== 'string' ||
70
+ typeof record.sourceFile !== 'string' ||
71
+ !record.ast ||
72
+ typeof record.ast !== 'object') {
73
+ return null;
74
+ }
75
+ if (record.sourceHash !== expectedHash)
76
+ return null;
77
+ if (record.compilerVersion !== expectedCompilerVersion)
78
+ return null;
79
+ return record;
80
+ }
81
+ /**
82
+ * Normalize an AST for equivalence comparison. Strips fields that vary
83
+ * between parse runs but do not carry semantic meaning. See
84
+ * 工作流DSL测试方案.md §7.1 INV-14 for the formal contract.
85
+ *
86
+ * Currently strips:
87
+ * - `range` (chevrotain source offsets)
88
+ * - future `__id` (DFS node identifiers — not yet present)
89
+ *
90
+ * Preserves:
91
+ * - all semantic fields (type, name, value, params, body, children)
92
+ * - array order
93
+ *
94
+ * Numeric edge cases:
95
+ * - NaN / Infinity → string "NaN" / "Infinity" (JSON unfriendly otherwise)
96
+ */
97
+ const STRIP_KEYS = new Set(['range', '__id']);
98
+ export function normalizeForCache(node) {
99
+ if (node === null || typeof node !== 'object') {
100
+ if (typeof node === 'number') {
101
+ if (Number.isNaN(node))
102
+ return 'NaN';
103
+ if (!Number.isFinite(node))
104
+ return node > 0 ? 'Infinity' : '-Infinity';
105
+ }
106
+ return node;
107
+ }
108
+ if (Array.isArray(node)) {
109
+ return node.map(normalizeForCache);
110
+ }
111
+ const out = {};
112
+ for (const [k, v] of Object.entries(node)) {
113
+ if (STRIP_KEYS.has(k))
114
+ continue;
115
+ out[k] = normalizeForCache(v);
116
+ }
117
+ return out;
118
+ }
119
+ export async function parseWithCache(opts) {
120
+ const hash = sourceHash(opts.source);
121
+ const cachePath = cacheFilePath(opts.stateDir, opts.sourceFile);
122
+ const cached = await loadCache(cachePath, hash);
123
+ if (cached) {
124
+ return {
125
+ ast: cached.ast,
126
+ source: opts.source,
127
+ fromCache: true,
128
+ hash,
129
+ lexErrors: [],
130
+ parseErrors: [],
131
+ };
132
+ }
133
+ const fresh = opts.parseFresh(opts.source);
134
+ if (fresh.ast && fresh.lexErrors.length === 0 && fresh.parseErrors.length === 0) {
135
+ try {
136
+ await saveCache(cachePath, {
137
+ sourceFile: opts.sourceFile,
138
+ sourceHash: hash,
139
+ compilerVersion: AST_CACHE_VERSION,
140
+ compiledAt: new Date().toISOString(),
141
+ ast: fresh.ast,
142
+ });
143
+ }
144
+ catch {
145
+ // Cache save failure is non-fatal — the AST is still usable in memory.
146
+ }
147
+ }
148
+ return {
149
+ ast: fresh.ast,
150
+ source: opts.source,
151
+ fromCache: false,
152
+ hash,
153
+ lexErrors: fresh.lexErrors,
154
+ parseErrors: fresh.parseErrors,
155
+ };
156
+ }
157
+ //# sourceMappingURL=ast-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-cache.js","sourceRoot":"","sources":["../src/ast-cache.ts"],"names":[],"mappings":"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"}