@sunshaobei/dsh-workflow 0.0.0-stage → 2.1.2

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 (386) hide show
  1. package/README.md +43 -2
  2. package/cordis.patch.yml +17 -0
  3. package/lib/client.js +14708 -0
  4. package/lib/core.js +137 -0
  5. package/lib/engine-adapter.js +1387 -0
  6. package/lib/host-driver.js +298 -0
  7. package/lib/index.js +536 -0
  8. package/lib/projection.js +159 -0
  9. package/lib/registry.js +218 -0
  10. package/lib/session-records.js +54 -0
  11. package/lib/submission-commit.js +34 -0
  12. package/lib/world-driver.js +275 -0
  13. package/package.json +67 -4
  14. package/vendor/PROVENANCE.md +9 -0
  15. package/vendor/dynamic-workflow/analysis/actor-graph.d.ts +47 -0
  16. package/vendor/dynamic-workflow/analysis/actor-graph.d.ts.map +1 -0
  17. package/vendor/dynamic-workflow/analysis/actor-graph.js +95 -0
  18. package/vendor/dynamic-workflow/analysis/actor-models.d.ts +60 -0
  19. package/vendor/dynamic-workflow/analysis/actor-models.d.ts.map +1 -0
  20. package/vendor/dynamic-workflow/analysis/actor-models.js +208 -0
  21. package/vendor/dynamic-workflow/analysis/actor-names.d.ts +56 -0
  22. package/vendor/dynamic-workflow/analysis/actor-names.d.ts.map +1 -0
  23. package/vendor/dynamic-workflow/analysis/actor-names.js +155 -0
  24. package/vendor/dynamic-workflow/analysis/analyze.d.ts +63 -0
  25. package/vendor/dynamic-workflow/analysis/analyze.d.ts.map +1 -0
  26. package/vendor/dynamic-workflow/analysis/analyze.js +92 -0
  27. package/vendor/dynamic-workflow/analysis/array-methods.d.ts +21 -0
  28. package/vendor/dynamic-workflow/analysis/array-methods.d.ts.map +1 -0
  29. package/vendor/dynamic-workflow/analysis/array-methods.js +132 -0
  30. package/vendor/dynamic-workflow/analysis/artifact-types.d.ts +39 -0
  31. package/vendor/dynamic-workflow/analysis/artifact-types.d.ts.map +1 -0
  32. package/vendor/dynamic-workflow/analysis/artifact-types.js +114 -0
  33. package/vendor/dynamic-workflow/analysis/artifacts.d.ts +67 -0
  34. package/vendor/dynamic-workflow/analysis/artifacts.d.ts.map +1 -0
  35. package/vendor/dynamic-workflow/analysis/artifacts.js +263 -0
  36. package/vendor/dynamic-workflow/analysis/assign.d.ts +42 -0
  37. package/vendor/dynamic-workflow/analysis/assign.d.ts.map +1 -0
  38. package/vendor/dynamic-workflow/analysis/assign.js +287 -0
  39. package/vendor/dynamic-workflow/analysis/callbacks.d.ts +71 -0
  40. package/vendor/dynamic-workflow/analysis/callbacks.d.ts.map +1 -0
  41. package/vendor/dynamic-workflow/analysis/callbacks.js +133 -0
  42. package/vendor/dynamic-workflow/analysis/calls.d.ts +40 -0
  43. package/vendor/dynamic-workflow/analysis/calls.d.ts.map +1 -0
  44. package/vendor/dynamic-workflow/analysis/calls.js +495 -0
  45. package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts +25 -0
  46. package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts.map +1 -0
  47. package/vendor/dynamic-workflow/analysis/causality-graph-lanes.js +161 -0
  48. package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts +163 -0
  49. package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts.map +1 -0
  50. package/vendor/dynamic-workflow/analysis/causality-graph-types.js +8 -0
  51. package/vendor/dynamic-workflow/analysis/causality-graph.d.ts +39 -0
  52. package/vendor/dynamic-workflow/analysis/causality-graph.d.ts.map +1 -0
  53. package/vendor/dynamic-workflow/analysis/causality-graph.js +530 -0
  54. package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts +29 -0
  55. package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts.map +1 -0
  56. package/vendor/dynamic-workflow/analysis/causality-order-calls.js +266 -0
  57. package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts +26 -0
  58. package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts.map +1 -0
  59. package/vendor/dynamic-workflow/analysis/causality-order-functions.js +116 -0
  60. package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts +5 -0
  61. package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts.map +1 -0
  62. package/vendor/dynamic-workflow/analysis/causality-order-loops.js +148 -0
  63. package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts +39 -0
  64. package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts.map +1 -0
  65. package/vendor/dynamic-workflow/analysis/causality-order-settle.js +263 -0
  66. package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts +110 -0
  67. package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts.map +1 -0
  68. package/vendor/dynamic-workflow/analysis/causality-order-state.js +162 -0
  69. package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts +79 -0
  70. package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts.map +1 -0
  71. package/vendor/dynamic-workflow/analysis/causality-order-strands.js +154 -0
  72. package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts +174 -0
  73. package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts.map +1 -0
  74. package/vendor/dynamic-workflow/analysis/causality-order-types.js +1 -0
  75. package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts +17 -0
  76. package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts.map +1 -0
  77. package/vendor/dynamic-workflow/analysis/causality-order-walk.js +282 -0
  78. package/vendor/dynamic-workflow/analysis/causality-order.d.ts +60 -0
  79. package/vendor/dynamic-workflow/analysis/causality-order.d.ts.map +1 -0
  80. package/vendor/dynamic-workflow/analysis/causality-order.js +110 -0
  81. package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts +60 -0
  82. package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts.map +1 -0
  83. package/vendor/dynamic-workflow/analysis/causality-reduce.js +198 -0
  84. package/vendor/dynamic-workflow/analysis/classes.d.ts +47 -0
  85. package/vendor/dynamic-workflow/analysis/classes.d.ts.map +1 -0
  86. package/vendor/dynamic-workflow/analysis/classes.js +264 -0
  87. package/vendor/dynamic-workflow/analysis/constants.d.ts +35 -0
  88. package/vendor/dynamic-workflow/analysis/constants.d.ts.map +1 -0
  89. package/vendor/dynamic-workflow/analysis/constants.js +23 -0
  90. package/vendor/dynamic-workflow/analysis/control-flow.d.ts +26 -0
  91. package/vendor/dynamic-workflow/analysis/control-flow.d.ts.map +1 -0
  92. package/vendor/dynamic-workflow/analysis/control-flow.js +132 -0
  93. package/vendor/dynamic-workflow/analysis/core-json.d.ts +45 -0
  94. package/vendor/dynamic-workflow/analysis/core-json.d.ts.map +1 -0
  95. package/vendor/dynamic-workflow/analysis/core-json.js +49 -0
  96. package/vendor/dynamic-workflow/analysis/core.d.ts +194 -0
  97. package/vendor/dynamic-workflow/analysis/core.d.ts.map +1 -0
  98. package/vendor/dynamic-workflow/analysis/core.js +204 -0
  99. package/vendor/dynamic-workflow/analysis/domain.d.ts +269 -0
  100. package/vendor/dynamic-workflow/analysis/domain.d.ts.map +1 -0
  101. package/vendor/dynamic-workflow/analysis/domain.js +523 -0
  102. package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts +56 -0
  103. package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts.map +1 -0
  104. package/vendor/dynamic-workflow/analysis/facade-misuse.js +350 -0
  105. package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts +11 -0
  106. package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts.map +1 -0
  107. package/vendor/dynamic-workflow/analysis/fanout-cardinality.js +121 -0
  108. package/vendor/dynamic-workflow/analysis/flow-graph.d.ts +113 -0
  109. package/vendor/dynamic-workflow/analysis/flow-graph.d.ts.map +1 -0
  110. package/vendor/dynamic-workflow/analysis/flow-graph.js +411 -0
  111. package/vendor/dynamic-workflow/analysis/flow-phase.d.ts +28 -0
  112. package/vendor/dynamic-workflow/analysis/flow-phase.d.ts.map +1 -0
  113. package/vendor/dynamic-workflow/analysis/flow-phase.js +104 -0
  114. package/vendor/dynamic-workflow/analysis/flow-strands.d.ts +39 -0
  115. package/vendor/dynamic-workflow/analysis/flow-strands.d.ts.map +1 -0
  116. package/vendor/dynamic-workflow/analysis/flow-strands.js +47 -0
  117. package/vendor/dynamic-workflow/analysis/flow-tree.d.ts +35 -0
  118. package/vendor/dynamic-workflow/analysis/flow-tree.d.ts.map +1 -0
  119. package/vendor/dynamic-workflow/analysis/flow-tree.js +33 -0
  120. package/vendor/dynamic-workflow/analysis/graph.d.ts +5 -0
  121. package/vendor/dynamic-workflow/analysis/graph.d.ts.map +1 -0
  122. package/vendor/dynamic-workflow/analysis/graph.js +199 -0
  123. package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts +48 -0
  124. package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts.map +1 -0
  125. package/vendor/dynamic-workflow/analysis/handoff-graph.js +0 -0
  126. package/vendor/dynamic-workflow/analysis/heap-ops.d.ts +14 -0
  127. package/vendor/dynamic-workflow/analysis/heap-ops.d.ts.map +1 -0
  128. package/vendor/dynamic-workflow/analysis/heap-ops.js +70 -0
  129. package/vendor/dynamic-workflow/analysis/hole-id.d.ts +28 -0
  130. package/vendor/dynamic-workflow/analysis/hole-id.d.ts.map +1 -0
  131. package/vendor/dynamic-workflow/analysis/hole-id.js +41 -0
  132. package/vendor/dynamic-workflow/analysis/hole-sites.d.ts +32 -0
  133. package/vendor/dynamic-workflow/analysis/hole-sites.d.ts.map +1 -0
  134. package/vendor/dynamic-workflow/analysis/hole-sites.js +215 -0
  135. package/vendor/dynamic-workflow/analysis/hole-splice.d.ts +45 -0
  136. package/vendor/dynamic-workflow/analysis/hole-splice.d.ts.map +1 -0
  137. package/vendor/dynamic-workflow/analysis/hole-splice.js +100 -0
  138. package/vendor/dynamic-workflow/analysis/interpret.d.ts +26 -0
  139. package/vendor/dynamic-workflow/analysis/interpret.d.ts.map +1 -0
  140. package/vendor/dynamic-workflow/analysis/interpret.js +200 -0
  141. package/vendor/dynamic-workflow/analysis/literals.d.ts +18 -0
  142. package/vendor/dynamic-workflow/analysis/literals.d.ts.map +1 -0
  143. package/vendor/dynamic-workflow/analysis/literals.js +125 -0
  144. package/vendor/dynamic-workflow/analysis/mermaid.d.ts +60 -0
  145. package/vendor/dynamic-workflow/analysis/mermaid.d.ts.map +1 -0
  146. package/vendor/dynamic-workflow/analysis/mermaid.js +477 -0
  147. package/vendor/dynamic-workflow/analysis/patterns.d.ts +31 -0
  148. package/vendor/dynamic-workflow/analysis/patterns.d.ts.map +1 -0
  149. package/vendor/dynamic-workflow/analysis/patterns.js +94 -0
  150. package/vendor/dynamic-workflow/analysis/phase-graph.d.ts +47 -0
  151. package/vendor/dynamic-workflow/analysis/phase-graph.d.ts.map +1 -0
  152. package/vendor/dynamic-workflow/analysis/phase-graph.js +334 -0
  153. package/vendor/dynamic-workflow/analysis/phases.d.ts +24 -0
  154. package/vendor/dynamic-workflow/analysis/phases.d.ts.map +1 -0
  155. package/vendor/dynamic-workflow/analysis/phases.js +54 -0
  156. package/vendor/dynamic-workflow/analysis/promise-ops.d.ts +52 -0
  157. package/vendor/dynamic-workflow/analysis/promise-ops.d.ts.map +1 -0
  158. package/vendor/dynamic-workflow/analysis/promise-ops.js +123 -0
  159. package/vendor/dynamic-workflow/analysis/relays.d.ts +12 -0
  160. package/vendor/dynamic-workflow/analysis/relays.d.ts.map +1 -0
  161. package/vendor/dynamic-workflow/analysis/relays.js +78 -0
  162. package/vendor/dynamic-workflow/analysis/serialize.d.ts +125 -0
  163. package/vendor/dynamic-workflow/analysis/serialize.d.ts.map +1 -0
  164. package/vendor/dynamic-workflow/analysis/serialize.js +321 -0
  165. package/vendor/dynamic-workflow/analysis/site-phases.d.ts +32 -0
  166. package/vendor/dynamic-workflow/analysis/site-phases.d.ts.map +1 -0
  167. package/vendor/dynamic-workflow/analysis/site-phases.js +69 -0
  168. package/vendor/dynamic-workflow/analysis/sites-labels.d.ts +71 -0
  169. package/vendor/dynamic-workflow/analysis/sites-labels.d.ts.map +1 -0
  170. package/vendor/dynamic-workflow/analysis/sites-labels.js +189 -0
  171. package/vendor/dynamic-workflow/analysis/sites.d.ts +267 -0
  172. package/vendor/dynamic-workflow/analysis/sites.d.ts.map +1 -0
  173. package/vendor/dynamic-workflow/analysis/sites.js +225 -0
  174. package/vendor/dynamic-workflow/analysis/state.d.ts +254 -0
  175. package/vendor/dynamic-workflow/analysis/state.d.ts.map +1 -0
  176. package/vendor/dynamic-workflow/analysis/state.js +569 -0
  177. package/vendor/dynamic-workflow/analysis/taint.d.ts +97 -0
  178. package/vendor/dynamic-workflow/analysis/taint.d.ts.map +1 -0
  179. package/vendor/dynamic-workflow/analysis/taint.js +649 -0
  180. package/vendor/dynamic-workflow/analysis/types.d.ts +100 -0
  181. package/vendor/dynamic-workflow/analysis/types.d.ts.map +1 -0
  182. package/vendor/dynamic-workflow/analysis/types.js +1 -0
  183. package/vendor/dynamic-workflow/analysis/world-run.d.ts +27 -0
  184. package/vendor/dynamic-workflow/analysis/world-run.d.ts.map +1 -0
  185. package/vendor/dynamic-workflow/analysis/world-run.js +44 -0
  186. package/vendor/dynamic-workflow/compiler/compile.d.ts +59 -0
  187. package/vendor/dynamic-workflow/compiler/compile.d.ts.map +1 -0
  188. package/vendor/dynamic-workflow/compiler/compile.js +159 -0
  189. package/vendor/dynamic-workflow/compiler/libs.generated.d.ts +3 -0
  190. package/vendor/dynamic-workflow/compiler/libs.generated.d.ts.map +1 -0
  191. package/vendor/dynamic-workflow/compiler/libs.generated.js +64 -0
  192. package/vendor/dynamic-workflow/engine/artifact-spec.d.ts +26 -0
  193. package/vendor/dynamic-workflow/engine/artifact-spec.d.ts.map +1 -0
  194. package/vendor/dynamic-workflow/engine/artifact-spec.js +173 -0
  195. package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts +54 -0
  196. package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts.map +1 -0
  197. package/vendor/dynamic-workflow/engine/ask-observation-types.js +19 -0
  198. package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts +28 -0
  199. package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts.map +1 -0
  200. package/vendor/dynamic-workflow/engine/cached-ask-facts.js +35 -0
  201. package/vendor/dynamic-workflow/engine/concurrency.d.ts +151 -0
  202. package/vendor/dynamic-workflow/engine/concurrency.d.ts.map +1 -0
  203. package/vendor/dynamic-workflow/engine/concurrency.js +282 -0
  204. package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts +17 -0
  205. package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts.map +1 -0
  206. package/vendor/dynamic-workflow/engine/engine-artifacts-primary.js +29 -0
  207. package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts +55 -0
  208. package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts.map +1 -0
  209. package/vendor/dynamic-workflow/engine/engine-artifacts.js +367 -0
  210. package/vendor/dynamic-workflow/engine/engine-config.d.ts +90 -0
  211. package/vendor/dynamic-workflow/engine/engine-config.d.ts.map +1 -0
  212. package/vendor/dynamic-workflow/engine/engine-config.js +6 -0
  213. package/vendor/dynamic-workflow/engine/engine-holes.d.ts +116 -0
  214. package/vendor/dynamic-workflow/engine/engine-holes.d.ts.map +1 -0
  215. package/vendor/dynamic-workflow/engine/engine-holes.js +142 -0
  216. package/vendor/dynamic-workflow/engine/engine-launch.d.ts +34 -0
  217. package/vendor/dynamic-workflow/engine/engine-launch.d.ts.map +1 -0
  218. package/vendor/dynamic-workflow/engine/engine-launch.js +26 -0
  219. package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts +35 -0
  220. package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts.map +1 -0
  221. package/vendor/dynamic-workflow/engine/engine-phase-stamp.js +74 -0
  222. package/vendor/dynamic-workflow/engine/engine-report.d.ts +27 -0
  223. package/vendor/dynamic-workflow/engine/engine-report.d.ts.map +1 -0
  224. package/vendor/dynamic-workflow/engine/engine-report.js +151 -0
  225. package/vendor/dynamic-workflow/engine/engine-resume.d.ts +18 -0
  226. package/vendor/dynamic-workflow/engine/engine-resume.d.ts.map +1 -0
  227. package/vendor/dynamic-workflow/engine/engine-resume.js +38 -0
  228. package/vendor/dynamic-workflow/engine/engine-settlement.d.ts +30 -0
  229. package/vendor/dynamic-workflow/engine/engine-settlement.d.ts.map +1 -0
  230. package/vendor/dynamic-workflow/engine/engine-settlement.js +79 -0
  231. package/vendor/dynamic-workflow/engine/engine-state.d.ts +99 -0
  232. package/vendor/dynamic-workflow/engine/engine-state.d.ts.map +1 -0
  233. package/vendor/dynamic-workflow/engine/engine-state.js +13 -0
  234. package/vendor/dynamic-workflow/engine/engine-world.d.ts +36 -0
  235. package/vendor/dynamic-workflow/engine/engine-world.d.ts.map +1 -0
  236. package/vendor/dynamic-workflow/engine/engine-world.js +189 -0
  237. package/vendor/dynamic-workflow/engine/engine.d.ts +263 -0
  238. package/vendor/dynamic-workflow/engine/engine.d.ts.map +1 -0
  239. package/vendor/dynamic-workflow/engine/engine.js +602 -0
  240. package/vendor/dynamic-workflow/engine/errors.d.ts +87 -0
  241. package/vendor/dynamic-workflow/engine/errors.d.ts.map +1 -0
  242. package/vendor/dynamic-workflow/engine/errors.js +56 -0
  243. package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts +10 -0
  244. package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts.map +1 -0
  245. package/vendor/dynamic-workflow/engine/hash-mismatch.js +15 -0
  246. package/vendor/dynamic-workflow/engine/hash.d.ts +16 -0
  247. package/vendor/dynamic-workflow/engine/hash.d.ts.map +1 -0
  248. package/vendor/dynamic-workflow/engine/hash.js +48 -0
  249. package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts +96 -0
  250. package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts.map +1 -0
  251. package/vendor/dynamic-workflow/engine/imported-cache-types.js +6 -0
  252. package/vendor/dynamic-workflow/engine/imported-cache.d.ts +127 -0
  253. package/vendor/dynamic-workflow/engine/imported-cache.d.ts.map +1 -0
  254. package/vendor/dynamic-workflow/engine/imported-cache.js +244 -0
  255. package/vendor/dynamic-workflow/engine/index.d.ts +11 -0
  256. package/vendor/dynamic-workflow/engine/index.d.ts.map +1 -0
  257. package/vendor/dynamic-workflow/engine/index.js +10 -0
  258. package/vendor/dynamic-workflow/engine/journal-memory.d.ts +32 -0
  259. package/vendor/dynamic-workflow/engine/journal-memory.d.ts.map +1 -0
  260. package/vendor/dynamic-workflow/engine/journal-memory.js +243 -0
  261. package/vendor/dynamic-workflow/engine/journal-read-types.d.ts +72 -0
  262. package/vendor/dynamic-workflow/engine/journal-read-types.d.ts.map +1 -0
  263. package/vendor/dynamic-workflow/engine/journal-read-types.js +28 -0
  264. package/vendor/dynamic-workflow/engine/persona.d.ts +20 -0
  265. package/vendor/dynamic-workflow/engine/persona.d.ts.map +1 -0
  266. package/vendor/dynamic-workflow/engine/persona.js +43 -0
  267. package/vendor/dynamic-workflow/engine/replay-order.d.ts +96 -0
  268. package/vendor/dynamic-workflow/engine/replay-order.d.ts.map +1 -0
  269. package/vendor/dynamic-workflow/engine/replay-order.js +229 -0
  270. package/vendor/dynamic-workflow/engine/run-terminal.d.ts +35 -0
  271. package/vendor/dynamic-workflow/engine/run-terminal.d.ts.map +1 -0
  272. package/vendor/dynamic-workflow/engine/run-terminal.js +7 -0
  273. package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts +22 -0
  274. package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts.map +1 -0
  275. package/vendor/dynamic-workflow/engine/scheduler-submit.js +84 -0
  276. package/vendor/dynamic-workflow/engine/scheduler-types.d.ts +105 -0
  277. package/vendor/dynamic-workflow/engine/scheduler-types.d.ts.map +1 -0
  278. package/vendor/dynamic-workflow/engine/scheduler-types.js +17 -0
  279. package/vendor/dynamic-workflow/engine/scheduler.d.ts +113 -0
  280. package/vendor/dynamic-workflow/engine/scheduler.d.ts.map +1 -0
  281. package/vendor/dynamic-workflow/engine/scheduler.js +484 -0
  282. package/vendor/dynamic-workflow/engine/types.d.ts +979 -0
  283. package/vendor/dynamic-workflow/engine/types.d.ts.map +1 -0
  284. package/vendor/dynamic-workflow/engine/types.js +26 -0
  285. package/vendor/dynamic-workflow/engine/world-read-input.d.ts +10 -0
  286. package/vendor/dynamic-workflow/engine/world-read-input.d.ts.map +1 -0
  287. package/vendor/dynamic-workflow/engine/world-read-input.js +55 -0
  288. package/vendor/dynamic-workflow/facade/artifact-caps.d.ts +48 -0
  289. package/vendor/dynamic-workflow/facade/artifact-caps.d.ts.map +1 -0
  290. package/vendor/dynamic-workflow/facade/artifact-caps.js +47 -0
  291. package/vendor/dynamic-workflow/facade/dts-hole.d.ts +16 -0
  292. package/vendor/dynamic-workflow/facade/dts-hole.d.ts.map +1 -0
  293. package/vendor/dynamic-workflow/facade/dts-hole.js +26 -0
  294. package/vendor/dynamic-workflow/facade/dts-model.d.ts +11 -0
  295. package/vendor/dynamic-workflow/facade/dts-model.d.ts.map +1 -0
  296. package/vendor/dynamic-workflow/facade/dts-model.js +18 -0
  297. package/vendor/dynamic-workflow/facade/dts-stream.d.ts +15 -0
  298. package/vendor/dynamic-workflow/facade/dts-stream.d.ts.map +1 -0
  299. package/vendor/dynamic-workflow/facade/dts-stream.js +41 -0
  300. package/vendor/dynamic-workflow/facade/dts.d.ts +29 -0
  301. package/vendor/dynamic-workflow/facade/dts.d.ts.map +1 -0
  302. package/vendor/dynamic-workflow/facade/dts.js +324 -0
  303. package/vendor/dynamic-workflow/facade/registry.d.ts +218 -0
  304. package/vendor/dynamic-workflow/facade/registry.d.ts.map +1 -0
  305. package/vendor/dynamic-workflow/facade/registry.js +203 -0
  306. package/vendor/dynamic-workflow/facade/report-caps.d.ts +40 -0
  307. package/vendor/dynamic-workflow/facade/report-caps.d.ts.map +1 -0
  308. package/vendor/dynamic-workflow/facade/report-caps.js +39 -0
  309. package/vendor/dynamic-workflow/facade/world-read-caps.d.ts +37 -0
  310. package/vendor/dynamic-workflow/facade/world-read-caps.d.ts.map +1 -0
  311. package/vendor/dynamic-workflow/facade/world-read-caps.js +36 -0
  312. package/vendor/dynamic-workflow/index.d.ts +41 -0
  313. package/vendor/dynamic-workflow/index.d.ts.map +1 -0
  314. package/vendor/dynamic-workflow/index.js +51 -0
  315. package/vendor/dynamic-workflow/lowering/index.d.ts +2 -0
  316. package/vendor/dynamic-workflow/lowering/index.d.ts.map +1 -0
  317. package/vendor/dynamic-workflow/lowering/index.js +1 -0
  318. package/vendor/dynamic-workflow/lowering/lower-hole.d.ts +16 -0
  319. package/vendor/dynamic-workflow/lowering/lower-hole.d.ts.map +1 -0
  320. package/vendor/dynamic-workflow/lowering/lower-hole.js +63 -0
  321. package/vendor/dynamic-workflow/lowering/lower.d.ts +82 -0
  322. package/vendor/dynamic-workflow/lowering/lower.d.ts.map +1 -0
  323. package/vendor/dynamic-workflow/lowering/lower.js +333 -0
  324. package/vendor/dynamic-workflow/projections.d.ts +26 -0
  325. package/vendor/dynamic-workflow/projections.d.ts.map +1 -0
  326. package/vendor/dynamic-workflow/projections.js +23 -0
  327. package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts +49 -0
  328. package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts.map +1 -0
  329. package/vendor/dynamic-workflow/schema/actor-submit-profiles.js +69 -0
  330. package/vendor/dynamic-workflow/schema/emit.d.ts +55 -0
  331. package/vendor/dynamic-workflow/schema/emit.d.ts.map +1 -0
  332. package/vendor/dynamic-workflow/schema/emit.js +325 -0
  333. package/vendor/dynamic-workflow/schema/jsdoc.d.ts +10 -0
  334. package/vendor/dynamic-workflow/schema/jsdoc.d.ts.map +1 -0
  335. package/vendor/dynamic-workflow/schema/jsdoc.js +83 -0
  336. package/vendor/dynamic-workflow/schema/serialize.d.ts +8 -0
  337. package/vendor/dynamic-workflow/schema/serialize.d.ts.map +1 -0
  338. package/vendor/dynamic-workflow/schema/serialize.js +20 -0
  339. package/vendor/dynamic-workflow/schema/synthesize.d.ts +48 -0
  340. package/vendor/dynamic-workflow/schema/synthesize.d.ts.map +1 -0
  341. package/vendor/dynamic-workflow/schema/synthesize.js +138 -0
  342. package/vendor/dynamic-workflow/schema/types.d.ts +67 -0
  343. package/vendor/dynamic-workflow/schema/types.d.ts.map +1 -0
  344. package/vendor/dynamic-workflow/schema/types.js +18 -0
  345. package/vendor/dynamic-workflow/schema/validate.d.ts +15 -0
  346. package/vendor/dynamic-workflow/schema/validate.d.ts.map +1 -0
  347. package/vendor/dynamic-workflow/schema/validate.js +213 -0
  348. package/vendor/dynamic-workflow/testing/index.d.ts +6 -0
  349. package/vendor/dynamic-workflow/testing/index.d.ts.map +1 -0
  350. package/vendor/dynamic-workflow/testing/index.js +5 -0
  351. package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts +9 -0
  352. package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts.map +1 -0
  353. package/vendor/dynamic-workflow/testing/journal-contract-artifacts.js +195 -0
  354. package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts +9 -0
  355. package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts.map +1 -0
  356. package/vendor/dynamic-workflow/testing/journal-contract-events.js +163 -0
  357. package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts +9 -0
  358. package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts.map +1 -0
  359. package/vendor/dynamic-workflow/testing/journal-contract-helpers.js +12 -0
  360. package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts +9 -0
  361. package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts.map +1 -0
  362. package/vendor/dynamic-workflow/testing/journal-contract-isolation.js +46 -0
  363. package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts +9 -0
  364. package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts.map +1 -0
  365. package/vendor/dynamic-workflow/testing/journal-contract-nodes.js +234 -0
  366. package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts +11 -0
  367. package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts.map +1 -0
  368. package/vendor/dynamic-workflow/testing/journal-contract-reads.js +281 -0
  369. package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts +9 -0
  370. package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts.map +1 -0
  371. package/vendor/dynamic-workflow/testing/journal-contract-runs.js +396 -0
  372. package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts +12 -0
  373. package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts.map +1 -0
  374. package/vendor/dynamic-workflow/testing/journal-contract-script.js +82 -0
  375. package/vendor/dynamic-workflow/testing/journal-contract.d.ts +15 -0
  376. package/vendor/dynamic-workflow/testing/journal-contract.d.ts.map +1 -0
  377. package/vendor/dynamic-workflow/testing/journal-contract.js +31 -0
  378. package/vendor/dynamic-workflow-runtime/child-cell-streams.js +128 -0
  379. package/vendor/dynamic-workflow-runtime/child-entry-file.js +43 -0
  380. package/vendor/dynamic-workflow-runtime/child-source.js +299 -0
  381. package/vendor/dynamic-workflow-runtime/harness.js +302 -0
  382. package/vendor/dynamic-workflow-runtime/index.js +4 -0
  383. package/vendor/dynamic-workflow-runtime/protocol.js +2 -0
  384. package/vendor/mcode-host/dynamic-workflow-import.js +269 -0
  385. package/vendor/mcode-host/workflow-git-world-read.js +183 -0
  386. package/vendor/mcode-host/workflow-world-read.js +282 -0
@@ -0,0 +1,569 @@
1
+ import ts from "typescript";
2
+ import { addOcc, addPlaceholder, collapse, emptyValue, isActorSite, isFunctionLike, mergeInto, phKey, provisionalFanoutId, } from "./domain.js";
3
+ import { findWorkflowBody } from "./domain.js";
4
+ export class TaintState {
5
+ table;
6
+ checker;
7
+ program;
8
+ scriptFile;
9
+ body;
10
+ // Site lookups keyed by their raw AST nodes (the table resolved them via the checker).
11
+ askByCall = new Map();
12
+ askSites = new Map();
13
+ worldByCall = new Map();
14
+ joinByCall = new Map();
15
+ actorByCall = new Map();
16
+ /** 留白调用 → 站点(开放与已补全都在;transfer 规则按有无 body 分派)。 */
17
+ holeByCall = new Map();
18
+ /** Per-element callback calls (`xs.map(fn)`, `Array.from(xs, fn)`, …), keyed by the CALL. */
19
+ candByCall = new Map();
20
+ candByForOf = new Map();
21
+ /**
22
+ * THE CALL ORACLE: for every call / `new` /
23
+ * tagged-template node, the script-local functions this pass applied there and HOW —
24
+ * `callee` (the node's callee value held the function: direct call, through a parameter,
25
+ * a field, a class member) or `argument` (the node handed the function to a library callee
26
+ * that may invoke it: a registry entry or the keystone rule). Monotone like every other
27
+ * accumulator; read after convergence by the ordering walk, which inlines exactly these
28
+ * bodies at exactly these sites instead of guessing from syntax.
29
+ */
30
+ applications = new Map();
31
+ /**
32
+ * The live abstract result of each `Promise.all` join call, keyed by the join CALL NODE
33
+ * and PERSISTENT across fixpoint passes (see {@link joinResultOf}). A join result IS a
34
+ * place whose element fields carry may-alias back-references to the (place) inputs, so
35
+ * resolvePlace returns it — letting `const [a, b] = await Promise.all([…])`
36
+ * destructure-alias the elements and a write through `res[k]` reach the original input.
37
+ */
38
+ joinResults = new Map();
39
+ /**
40
+ * The live abstract place of each conditional expression used as a place
41
+ * (`flag ? box1 : box2`), keyed by the ConditionalExpression NODE and persistent across
42
+ * passes (see {@link condPlaceOf}). Same canonical-heap requirement as {@link joinResults}.
43
+ */
44
+ condPlaces = new Map();
45
+ /** Allocation-site places of container literals; see {@link literalPlaceOf}. */
46
+ literalPlaces = new Map();
47
+ // Script-local functions (excluding iteration callbacks, handled inline).
48
+ fnId = new Map();
49
+ fnParamSymbols = new Map();
50
+ functions = [];
51
+ callbackNodes = new Set();
52
+ /**
53
+ * Object-literal set accessors, keyed by property name -> setter fn ids. Crude but
54
+ * sound: an assignment to ANY property of that name (on any object) records the
55
+ * assigned value as the setter's param-0 actual, so the setter body's flow is seen.
56
+ */
57
+ settersByProp = new Map();
58
+ /**
59
+ * One shared abstract instance per class declaration/expression, keyed by the class
60
+ * node. Static AND instance members conflate into this ONE value (a deliberate sound
61
+ * over-approximation: per-instance and static/instance precision are out of scope, so
62
+ * a write through any instance, through `this`, or through the class name is visible
63
+ * through every other). Persistent across fixpoint passes — growth is signalled like
64
+ * any env slot.
65
+ */
66
+ classInstances = new Map();
67
+ /** Class declarations/expressions in the workflow body, in discovery order. */
68
+ classes = [];
69
+ // Persistent fixpoint state.
70
+ env = new Map();
71
+ summaries = new Map();
72
+ paramActuals = new Map();
73
+ /**
74
+ * Per-placeholder-parameter set of values that MAY be passed to an INVOCATION of that
75
+ * parameter (keyed by `${fnId}:${param}`). Two capture sites (calls.ts handleUnknownCall):
76
+ * a direct call of a placeholder callee (`resolve(draft)` — resolve is param 0), and a
77
+ * placeholder-valued argument to an unknown call (`draft.then(onOk)` — the unknown `.then`
78
+ * may invoke onOk with the receiver pot). Consumed by the promise machinery: `new
79
+ * Unknown(fn)` and `await thenable` resolve to whatever fn's / then's callback params
80
+ * receive (the resolve/reject/continuation pattern). Distinct from {@link paramActuals},
81
+ * which records what a function receives when IT is called.
82
+ */
83
+ phCallActuals = new Map();
84
+ reachSet = new Set();
85
+ calledFns = new Map();
86
+ promotedOrders = new Set();
87
+ /**
88
+ * Per-`reduce`-candidate accumulator taint (keyed by candidate `order`), carried
89
+ * ACROSS fixpoint passes. The callback-return value that reduce threads into the
90
+ * accumulator param is a fresh local each pass, so binding the param from it
91
+ * directly never observed the return taint; this persistent slot fixes that.
92
+ */
93
+ reduceAcc = new Map();
94
+ // Sink accumulators (may contain placeholders; resolved at emission).
95
+ askInstr = new Map();
96
+ askRecv = new Map();
97
+ worldRead = new Map();
98
+ /** 开放留白的提示 sink(docs/analysis.md「Sites」:提示流入留白,如 ask 的 instructions)。 */
99
+ holePrompt = new Map();
100
+ joinInByPort = new Map();
101
+ fanoutInVal = new Map();
102
+ /**
103
+ * The ORACLE accumulators, keyed by source START OFFSET rather than by site id: the
104
+ * value each `await` operand carries, and the value each guard expression reads. They
105
+ * feed {@link emitOracle}, which only the temporal walk (causality-order.ts) consumes —
106
+ * nothing here changes a transfer rule, and a position keys nothing in the site
107
+ * vocabulary, which is what keeps the site-id stability rule untouched: no `order`
108
+ * counter and no per-kind counter is consulted.
109
+ */
110
+ awaitVal = new Map();
111
+ guardVal = new Map();
112
+ returnVal = emptyValue();
113
+ /**
114
+ * One script-global thrown-value set: every `throw` joins its operand into it and
115
+ * every `catch` binding reads all of it. A flow-insensitive over-approximation of
116
+ * exception routing — sound under gen-only, deliberately imprecise across disjoint
117
+ * `try` blocks. Persistent across passes so throws in one iteration reach catches
118
+ * in the next (fixpoint-safe).
119
+ */
120
+ thrownVal = emptyValue();
121
+ changed = false;
122
+ constructor(workflow, table) {
123
+ this.table = table;
124
+ this.checker = workflow.program.getTypeChecker();
125
+ this.program = workflow.program;
126
+ this.scriptFile = workflow.scriptFile;
127
+ this.body = findWorkflowBody(workflow.scriptFile);
128
+ this.buildLookups();
129
+ this.collectFunctions();
130
+ }
131
+ buildLookups() {
132
+ for (const site of this.table.asks) {
133
+ this.askByCall.set(site.call, site.id);
134
+ this.askSites.set(site.id, { instructions: site.instructions, receiver: site.receiver });
135
+ }
136
+ for (const site of this.table.worldReads)
137
+ this.worldByCall.set(site.call, { args: site.args, id: site.id });
138
+ for (const site of this.table.joins)
139
+ this.joinByCall.set(site.call, { arg: site.arg, id: site.id });
140
+ for (const site of this.table.actors)
141
+ this.actorByCall.set(site.call, site.id);
142
+ for (const site of this.table.holes)
143
+ this.holeByCall.set(site.call, site);
144
+ for (const cand of this.table.iterations) {
145
+ if (cand.form === "array-method" && cand.call !== undefined) {
146
+ this.candByCall.set(cand.call, cand);
147
+ // An inline callback literal is evaluated in place (array-methods.ts), never as a
148
+ // tracked function; a non-literal callback's functions are tracked and applied.
149
+ if (cand.callback !== undefined)
150
+ this.callbackNodes.add(cand.callback);
151
+ }
152
+ else if (cand.form === "for-of") {
153
+ // candidate.body === ForOfStatement.statement, so body.parent is the for-of.
154
+ this.candByForOf.set(cand.body.parent, cand);
155
+ }
156
+ }
157
+ }
158
+ collectFunctions() {
159
+ const visit = (node) => {
160
+ // One shared abstract instance per class (declaration or expression); constructors,
161
+ // methods and accessors are collected as tracked functions below (isFunctionLike
162
+ // covers them), so their bodies get summaries like any other function.
163
+ if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
164
+ this.classInstances.set(node, emptyValue());
165
+ this.classes.push(node);
166
+ }
167
+ if (isFunctionLike(node) && !this.callbackNodes.has(node)) {
168
+ const id = this.functions.length;
169
+ this.fnId.set(node, id);
170
+ this.functions.push(node);
171
+ const decl = node;
172
+ this.fnParamSymbols.set(id, decl.parameters.map((p) => ts.isIdentifier(p.name) ? this.checker.getSymbolAtLocation(p.name) : undefined));
173
+ // Object-literal set accessor: index it by property name so property writes
174
+ // can feed the setter's param (see settersByProp).
175
+ if (ts.isSetAccessorDeclaration(node) && !ts.isComputedPropertyName(node.name)) {
176
+ const name = node.name.getText(this.scriptFile);
177
+ const list = this.settersByProp.get(name);
178
+ if (list === undefined)
179
+ this.settersByProp.set(name, [id]);
180
+ else
181
+ list.push(id);
182
+ }
183
+ }
184
+ ts.forEachChild(node, visit);
185
+ };
186
+ for (const stmt of this.body.statements)
187
+ visit(stmt);
188
+ }
189
+ // -- monotone update primitives ------------------------------------------
190
+ /**
191
+ * Bind a symbol to an abstract value. A FRESH symbol ADOPTS the value object by
192
+ * reference (`env[sym] === value`); an already-bound slot weak-merges (sound smear).
193
+ * Adoption is what makes bindings alias rather than snapshot: passing a live place (env slot / live field) shares it, so a later
194
+ * write through any alias is visible through every other. Callers that must NOT
195
+ * alias pass a fresh clone/collapse (reads already return snapshots).
196
+ */
197
+ bindSymbol(sym, value) {
198
+ const existing = this.env.get(sym);
199
+ if (existing === undefined) {
200
+ this.env.set(sym, value);
201
+ this.changed = true;
202
+ return;
203
+ }
204
+ if (existing !== value && mergeInto(existing, value))
205
+ this.changed = true;
206
+ }
207
+ envSlot(sym) {
208
+ let slot = this.env.get(sym);
209
+ if (slot === undefined) {
210
+ slot = emptyValue();
211
+ this.env.set(sym, slot);
212
+ }
213
+ return slot;
214
+ }
215
+ summaryOf(id) {
216
+ let slot = this.summaries.get(id);
217
+ if (slot === undefined) {
218
+ slot = emptyValue();
219
+ this.summaries.set(id, slot);
220
+ }
221
+ return slot;
222
+ }
223
+ /** The shared abstract instance of a class node, created empty on demand (persistent). */
224
+ instanceOf(cls) {
225
+ let inst = this.classInstances.get(cls);
226
+ if (inst === undefined) {
227
+ inst = emptyValue();
228
+ this.classInstances.set(cls, inst);
229
+ }
230
+ return inst;
231
+ }
232
+ /**
233
+ * The shared abstract result of a join call, created empty on demand (persistent).
234
+ *
235
+ * THE CANONICAL-HEAP INVARIANT: every value that models runtime storage — anything that
236
+ * can be aliased, written through, or referenced from a `mayAlias` set — is keyed by a
237
+ * static program point and lives across fixpoint passes; per-pass temporaries are
238
+ * snapshots only. handleJoin used to mint a FRESH result value each pass, so
239
+ * `Promise.all([Promise.all([…])])` added a never-before-seen object to the outer
240
+ * element's `mayAlias` set every pass. That set dedups by IDENTITY (domain.ts), so
241
+ * `changed` stayed true forever and the fixpoint hit ITERATION_CAP. Keying the result by
242
+ * the call node makes the identity stable, so the union saturates.
243
+ */
244
+ joinResultOf(call) {
245
+ let result = this.joinResults.get(call);
246
+ if (result === undefined) {
247
+ result = emptyValue();
248
+ this.joinResults.set(call, result);
249
+ }
250
+ return result;
251
+ }
252
+ /**
253
+ * The shared abstract place of a conditional expression, created empty on demand
254
+ * (persistent). Same canonical-heap invariant as {@link joinResultOf}: a per-pass
255
+ * wrapper for `flag ? box1 : box2` diverged the fixpoint as soon as it became a
256
+ * `mayAlias` target — which a SYNTACTICALLY NESTED ternary place
257
+ * (`f2 ? (f ? box1 : box2) : box3`) does on every pass.
258
+ */
259
+ condPlaceOf(node) {
260
+ let place = this.condPlaces.get(node);
261
+ if (place === undefined) {
262
+ place = emptyValue();
263
+ this.condPlaces.set(node, place);
264
+ }
265
+ return place;
266
+ }
267
+ /**
268
+ * The allocation-site place of a container literal (`{…}` / `[…]`): the value its first
269
+ * evaluation produced, kept across passes and weak-merged with every re-evaluation
270
+ * (persistent). Same canonical-heap invariant as {@link joinResultOf}: a literal IS runtime
271
+ * storage — a callee writes through it (`fill([], v)`, `tag({ name }, t)` with
272
+ * `box.note = t`), a binding adopts it, a spread shares its fields — so a value recreated
273
+ * every pass can never settle once something persistent merges INTO it. The
274
+ * parameter write-back targeted the per-pass fresh literal, reported a change on every pass
275
+ * (the note it had just added was gone again), and the fixpoint hit ITERATION_CAP with no
276
+ * state growing at all. Any `f({ … })` whose callee mutates its parameter was affected.
277
+ *
278
+ * Adopting the first evaluation (rather than minting an empty slot) keeps the literal's
279
+ * aliasing: a field that stores a live place (`{ box }`, `[obj]`) keeps pointing at that
280
+ * slot, and later passes merge the same slot into itself — an identity no-op. Snapshot
281
+ * fields accumulate monotonically, exactly as an env slot bound to the literal always did.
282
+ */
283
+ literalPlaceOf(node, fresh) {
284
+ const place = this.literalPlaces.get(node);
285
+ if (place === undefined) {
286
+ this.literalPlaces.set(node, fresh);
287
+ return fresh;
288
+ }
289
+ if (mergeInto(place, fresh))
290
+ this.changed = true;
291
+ return place;
292
+ }
293
+ mergeReturn(value) {
294
+ if (mergeInto(this.returnVal, value))
295
+ this.changed = true;
296
+ }
297
+ /** Join a thrown operand into the script-global thrown-value set. */
298
+ mergeThrown(value) {
299
+ if (mergeInto(this.thrownVal, value))
300
+ this.changed = true;
301
+ }
302
+ /**
303
+ * Weak-merge into a keyed sink accumulator. Generic in the key so the oracle
304
+ * accumulators ({@link awaitVal} / {@link guardVal}), which are keyed by source offset
305
+ * rather than site id, share the one monotone update path every other sink uses.
306
+ */
307
+ mergeSink(map, id, value) {
308
+ let slot = map.get(id);
309
+ if (slot === undefined) {
310
+ slot = emptyValue();
311
+ map.set(id, slot);
312
+ }
313
+ if (mergeInto(slot, value))
314
+ this.changed = true;
315
+ }
316
+ mergeJoinIn(id, port, value) {
317
+ let ports = this.joinInByPort.get(id);
318
+ if (ports === undefined) {
319
+ ports = new Map();
320
+ this.joinInByPort.set(id, ports);
321
+ }
322
+ let slot = ports.get(port);
323
+ if (slot === undefined) {
324
+ slot = emptyValue();
325
+ ports.set(port, slot);
326
+ }
327
+ if (mergeInto(slot, value))
328
+ this.changed = true;
329
+ }
330
+ addParamActual(id, param, value) {
331
+ const key = `${id}:${param}`;
332
+ let slot = this.paramActuals.get(key);
333
+ if (slot === undefined) {
334
+ slot = emptyValue();
335
+ this.paramActuals.set(key, slot);
336
+ }
337
+ if (mergeInto(slot, value))
338
+ this.changed = true;
339
+ }
340
+ /** Record a value that may reach an invocation of the placeholder-parameter `key`. */
341
+ recordPhCall(key, value) {
342
+ let slot = this.phCallActuals.get(key);
343
+ if (slot === undefined) {
344
+ slot = emptyValue();
345
+ this.phCallActuals.set(key, slot);
346
+ }
347
+ if (mergeInto(slot, value))
348
+ this.changed = true;
349
+ }
350
+ /** The taint fed to invocations of a function's parameter `param`, if any. */
351
+ phCallActualsOf(id, param) {
352
+ return this.phCallActuals.get(`${id}:${param}`);
353
+ }
354
+ /** The persistent accumulator taint for a `reduce` candidate (empty until seeded). */
355
+ reduceAccOf(order) {
356
+ let slot = this.reduceAcc.get(order);
357
+ if (slot === undefined) {
358
+ slot = emptyValue();
359
+ this.reduceAcc.set(order, slot);
360
+ }
361
+ return slot;
362
+ }
363
+ /** Merge a pass's callback-return taint into a `reduce` candidate's accumulator. */
364
+ mergeReduceAcc(order, value) {
365
+ if (mergeInto(this.reduceAccOf(order), value))
366
+ this.changed = true;
367
+ }
368
+ /**
369
+ * Record a call against EVERY enclosing region, mirroring {@link markFacade}.
370
+ * Recording only the innermost region left a caller function `fn@f`
371
+ * unmarked when its call to `g` happened inside an iteration candidate's callback
372
+ * (region `cand@N`). Reachability then never propagated `fn@f`, so a sibling
373
+ * candidate whose callback calls `f` failed to promote to a fan-out — an
374
+ * under-approximation (a dropped may-flow), which this analysis must never do.
375
+ */
376
+ markCalled(regionStack, id) {
377
+ for (const region of regionStack) {
378
+ let called = this.calledFns.get(region);
379
+ if (called === undefined) {
380
+ called = new Set();
381
+ this.calledFns.set(region, called);
382
+ }
383
+ if (!called.has(id)) {
384
+ called.add(id);
385
+ this.changed = true;
386
+ }
387
+ }
388
+ }
389
+ /** Record that `fn` was applied at `site` (see {@link applications}). Not a fixpoint
390
+ * signal: applications feed no transfer rule, and the final pass re-records them all. */
391
+ recordApplication(site, fn, via) {
392
+ let applied = this.applications.get(site);
393
+ if (applied === undefined) {
394
+ applied = new Map();
395
+ this.applications.set(site, applied);
396
+ }
397
+ // `callee` wins over `argument` for one function at one site (both can happen for a
398
+ // function passed to itself; the callee reading is the one that surely runs).
399
+ if (applied.get(fn) !== "callee")
400
+ applied.set(fn, via);
401
+ }
402
+ /** Mark every enclosing region as reaching a facade site. */
403
+ markFacade(regionStack) {
404
+ for (const region of regionStack) {
405
+ if (!this.reachSet.has(region)) {
406
+ this.reachSet.add(region);
407
+ this.changed = true;
408
+ }
409
+ }
410
+ }
411
+ /** Propagate reachability across the call graph until it stops growing. */
412
+ propagateReachability() {
413
+ let grew = true;
414
+ while (grew) {
415
+ grew = false;
416
+ for (const [region, fns] of this.calledFns) {
417
+ if (this.reachSet.has(region))
418
+ continue;
419
+ for (const id of fns) {
420
+ if (this.reachSet.has(`fn@${id}`)) {
421
+ this.reachSet.add(region);
422
+ this.changed = true;
423
+ grew = true;
424
+ break;
425
+ }
426
+ }
427
+ }
428
+ }
429
+ }
430
+ /** Promote iteration candidates whose body region reaches a facade site. */
431
+ recomputePromotion() {
432
+ for (const cand of this.table.iterations) {
433
+ if (this.promotedOrders.has(cand.order))
434
+ continue;
435
+ if (this.reachSet.has(`cand@${cand.order}`)) {
436
+ this.promotedOrders.add(cand.order);
437
+ this.changed = true;
438
+ }
439
+ }
440
+ }
441
+ // -- emission ------------------------------------------------------------
442
+ emitFacts() {
443
+ const askData = new Map();
444
+ const askActor = new Map();
445
+ const worldReadData = new Map();
446
+ const joinIn = new Map();
447
+ const fanoutIn = new Map();
448
+ for (const [id, value] of this.askInstr)
449
+ askData.set(id, this.resolveArtifact(value));
450
+ for (const [id, value] of this.askRecv)
451
+ askActor.set(id, this.resolveActor(value));
452
+ for (const [id, value] of this.worldRead)
453
+ worldReadData.set(id, this.resolveArtifact(value));
454
+ const holeData = new Map();
455
+ for (const [id, value] of this.holePrompt)
456
+ holeData.set(id, this.resolveArtifact(value));
457
+ for (const [id, ports] of this.joinInByPort) {
458
+ const occs = [];
459
+ for (const [port, value] of ports) {
460
+ for (const occ of this.resolveArtifact(value)) {
461
+ occs.push({ exact: occ.exact, site: occ.site, ...(port >= 0 ? { port } : {}) });
462
+ }
463
+ }
464
+ joinIn.set(id, occs);
465
+ }
466
+ for (const [id, value] of this.fanoutInVal)
467
+ fanoutIn.set(id, this.resolveArtifact(value));
468
+ const promoted = this.table.iterations
469
+ .filter((cand) => this.promotedOrders.has(cand.order))
470
+ .sort((a, b) => a.order - b.order)
471
+ .map((cand) => ({ id: provisionalFanoutId(cand.order), label: "fan-out", loc: cand.loc, order: cand.order }));
472
+ return {
473
+ askActor,
474
+ askData,
475
+ fanoutIn,
476
+ holeData,
477
+ joinIn,
478
+ promoted,
479
+ returnData: this.resolveArtifact(this.returnVal),
480
+ worldReadData,
481
+ };
482
+ }
483
+ /**
484
+ * The ordering walk's oracle view, resolved directly off the CONVERGED interpreter
485
+ * state — the fused pass's replacement for the `awaitSettles`/`guardReads` members
486
+ * TaintFacts used to carry.
487
+ * Same keying (`node.getStart(scriptFile)` of the awaited/guard expression) and the
488
+ * SAME resolution pipeline as every artifact sink (placeholders expanded, collapsed,
489
+ * actor labels filtered) — so an awaited parameter still resolves to the union of the
490
+ * promises its callers passed in, across all call sites. That union is normative: the
491
+ * temporal walk must see today's context-INsensitive values bit-for-bit; caller-context
492
+ * precision is explicitly out of scope.
493
+ *
494
+ * Only meaningful after the fixpoint has converged; interpret.ts is the one caller.
495
+ */
496
+ emitOracle() {
497
+ const awaitSettles = new Map();
498
+ for (const [pos, value] of this.awaitVal)
499
+ awaitSettles.set(pos, this.resolveArtifact(value));
500
+ const guardReads = new Map();
501
+ for (const [pos, value] of this.guardVal)
502
+ guardReads.set(pos, this.resolveArtifact(value));
503
+ return { applications: this.applications, awaitSettles, guardReads };
504
+ }
505
+ resolveArtifact(value) {
506
+ return this.resolveOccs(value).filter((occ) => !isActorSite(occ.site));
507
+ }
508
+ resolveActor(value) {
509
+ return this.resolveOccs(value).filter((occ) => isActorSite(occ.site));
510
+ }
511
+ resolveOccs(value) {
512
+ return [...collapse(this.resolvePlaceholders(value, new Set())).occs.values()];
513
+ }
514
+ /** Expand parameter placeholders to the union of actual arguments across all calls. */
515
+ resolvePlaceholders(value, visiting, seen = new Set()) {
516
+ if (seen.has(value))
517
+ return emptyValue(); // cycle-safe: a shared field contributes once
518
+ seen.add(value);
519
+ const out = emptyValue();
520
+ for (const occ of value.occs.values())
521
+ addOcc(out, occ);
522
+ for (const ph of value.phs.values())
523
+ this.resolvePlaceholder(out, ph, visiting);
524
+ for (const [key, field] of value.fields)
525
+ out.fields.set(key, this.resolvePlaceholders(field, visiting, seen));
526
+ // A bound function reaching an emission point (e.g. a returned bound function) must not
527
+ // drop its prefix's taint; fold each resolved prefix arg in (collapsed at emission).
528
+ for (const el of value.bound ?? [])
529
+ mergeInto(out, this.resolvePlaceholders(el, visiting, seen));
530
+ return out;
531
+ }
532
+ resolvePlaceholder(out, ph, visiting) {
533
+ if (ph.rest === true) {
534
+ // A rest formal gathers every actual recorded at index >= ph.param (calls
535
+ // record actuals positionally, so a rest param has many keyed slots).
536
+ for (const [key, actual] of this.paramActuals) {
537
+ const sep = key.indexOf(":");
538
+ if (Number(key.slice(0, sep)) !== ph.fnId || Number(key.slice(sep + 1)) < ph.param)
539
+ continue;
540
+ if (visiting.has(key))
541
+ continue;
542
+ visiting.add(key);
543
+ mergeInto(out, this.resolvePlaceholders(actual, visiting));
544
+ visiting.delete(key);
545
+ }
546
+ return;
547
+ }
548
+ const key = phKey(ph);
549
+ if (visiting.has(key))
550
+ return; // recursion → bottom
551
+ const actual = this.paramActuals.get(key);
552
+ if (actual === undefined)
553
+ return;
554
+ visiting.add(key);
555
+ mergeInto(out, this.resolvePlaceholders(actual, visiting));
556
+ visiting.delete(key);
557
+ }
558
+ bindPlaceholderParams(fn, id) {
559
+ const params = fn.parameters;
560
+ (this.fnParamSymbols.get(id) ?? []).forEach((sym, param) => {
561
+ if (sym === undefined)
562
+ return;
563
+ const val = emptyValue();
564
+ const rest = params[param]?.dotDotDotToken !== undefined;
565
+ addPlaceholder(val, { fnId: id, param, ...(rest ? { rest: true } : {}) });
566
+ this.bindSymbol(sym, val);
567
+ });
568
+ }
569
+ }
@@ -0,0 +1,97 @@
1
+ import ts from "typescript";
2
+ import type { WorkflowProgram } from "../compiler/compile.js";
3
+ import type { SiteTable } from "./sites.js";
4
+ import { type AbstractValue } from "./domain.js";
5
+ import { TaintState } from "./state.js";
6
+ export interface EvalContext {
7
+ /** Enclosing dataflow regions, innermost last: "top", `fn@<id>`, `cand@<order>`. */
8
+ regionStack: string[];
9
+ /** Sink for `return` statements in this region. */
10
+ onReturn: (value: AbstractValue) => void;
11
+ }
12
+ /**
13
+ * The taint half of the fused interpreter:
14
+ * drive the whole-script transfer to a fixpoint. Emission is the caller's business —
15
+ * interpret.ts reads the converged state through `emitFacts` / `emitOracle` and runs
16
+ * the temporal walk over the same state.
17
+ */
18
+ export declare class Evaluator {
19
+ readonly s: TaintState;
20
+ readonly checker: ts.TypeChecker;
21
+ constructor(workflow: WorkflowProgram, table: SiteTable);
22
+ converge(): void;
23
+ private iterate;
24
+ private evalFunction;
25
+ /**
26
+ * Record a guard expression's value as the control-dependence oracle, keyed by the
27
+ * guard node's START OFFSET — the same node `traceOrder` hands to `controllersOf`, so a
28
+ * parenthesized guard is keyed by its ParenthesizedExpression. This is a SINK, not a
29
+ * flow: the value is recorded and not joined into anything, because a condition does not
30
+ * join the data contract (see the ConditionalExpression case in evalExpr). Consumed only
31
+ * by the causality graph.
32
+ */
33
+ recordGuard(node: ts.Expression, value: AbstractValue): void;
34
+ visit(node: ts.Node, ctx: EvalContext): void;
35
+ handleDeclaration(decl: ts.VariableDeclaration, ctx: EvalContext): void;
36
+ /**
37
+ * The LIVE (shared, unclonable) abstract value a *place expression* denotes, or
38
+ * undefined for non-places (calls, literals, computed access, operators). A place is
39
+ * an identifier (its env slot) or a chain of static property / literal-index element
40
+ * accesses rooted at a place. Value-preserving wrappers (parens / `as` / `satisfies` /
41
+ * non-null / type assertion) are peeled at every level. This is the single primitive
42
+ * behind aliasing: bindings, container-literal fields, write receivers and param
43
+ * write-back all resolve places through it. Reads must NOT call this (they clone).
44
+ *
45
+ * `create` governs missing field slots. WRITE receivers create empty fields on demand
46
+ * (`arr[0].f = t` materializes `arr[0]`). Read-side callers (aliasing binds,
47
+ * container-literal embedding, write-back actuals) pass `create=false`: an absent field
48
+ * returns undefined so the caller falls back to value semantics (readField's collapse),
49
+ * which correctly surfaces the container's own occurrences. Fabricating an empty field
50
+ * there would alias to a phantom and DROP the opaque container's taint (e.g. reading
51
+ * `review.feedback` off an opaque ask result must yield collapse(review), not ∅).
52
+ */
53
+ resolvePlace(expr: ts.Expression, create?: boolean): AbstractValue | undefined;
54
+ private placeField;
55
+ /**
56
+ * The parameter write-back target for an actual argument `arg` whose evaluated value is
57
+ * `value`. A place actual resolves to its live slot (write-back aliases through it, as
58
+ * before). An object/array LITERAL's evaluated value IS its allocation-site place
59
+ * (state.literalPlaceOf), and its FIELDS hold live places (`poke({ box })` — the literal's
60
+ * `box` field IS the box slot), so that value is the write-back target: `mergeHeapEffects`
61
+ * descends into it and a field the callee wrote through `p.box` lands on the shared `box`
62
+ * slot, while a field written on the literal itself (`tag({ name }, t)` → `box.note = t`)
63
+ * persists on the place and reaches whoever the callee hands the object to.
64
+ * A literal argument once skipped write-back entirely, so mutations through its live
65
+ * sub-objects were invisible to the caller; and when the literal was a per-pass fresh
66
+ * value, that write-back re-reported a change on every pass and the fixpoint never
67
+ * settled.
68
+ */
69
+ argWriteBackPlace(arg: ts.Expression, value: AbstractValue): AbstractValue | undefined;
70
+ /**
71
+ * Bind a destructuring pattern (or a single name). See {@link bindPattern} in patterns.ts;
72
+ * exposed as a thin method because the aliasing-bind machinery is used across modules.
73
+ */
74
+ bindPattern(name: ts.BindingName, value: AbstractValue, ctx: EvalContext, sourcePlace?: AbstractValue): void;
75
+ /** The live field at `key` of a place, for destructuring aliasing (see patterns.ts). */
76
+ extractField(container: AbstractValue, key: string): AbstractValue;
77
+ /** Read a statically-known field with smear-on-read, else collapse (see patterns.ts). */
78
+ selectField(value: AbstractValue, key: string): AbstractValue;
79
+ evalExpr(node: ts.Expression, ctx: EvalContext): AbstractValue;
80
+ private evalIdentifier;
81
+ /**
82
+ * The implicit `arguments` object as a rest-like placeholder gathering every actual of
83
+ * the nearest enclosing NON-arrow function (param index 0, rest). `arguments[i]` then
84
+ * reads a field of it → collapse keeps the placeholder → emission expands it to all
85
+ * recorded actuals (a sound over-approximation: `arguments[0]` yields the whole list).
86
+ * Arrow functions have no own `arguments`, so the ancestor walk skips them and binds the
87
+ * enclosing function's — matching JS's lexical `arguments`. Previously `arguments`
88
+ * resolved to the lib symbol with no env slot, so `arguments[0]` dropped every
89
+ * actual's taint.
90
+ */
91
+ private argumentsValue;
92
+ private evalBinary;
93
+ private evalPropertyAccess;
94
+ private evalElementAccess;
95
+ receiverSymbol(expr: ts.Expression): ts.Symbol | undefined;
96
+ }
97
+ //# sourceMappingURL=taint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taint.d.ts","sourceRoot":"","sources":["../../src/analysis/taint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAeL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA2BxC,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mDAAmD;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;gBAErB,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS;IAKvD,QAAQ,IAAI,IAAI;IAchB,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,YAAY;IAyCpB;;;;;;;OAOG;IACH,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAM5D,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;IA4D5C,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;IAqCvE;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,UAAQ,GAAG,aAAa,GAAG,SAAS;IAgG5E,OAAO,CAAC,UAAU;IAMlB;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,GAAG,SAAS;IAOtF;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,aAAa,GAAG,IAAI;IAI5G,wFAAwF;IACxF,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa;IAIlE,yFAAyF;IACzF,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa;IAM7D,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,aAAa;IAgI9D,OAAO,CAAC,cAAc;IAetB;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,UAAU;IA+BlB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,iBAAiB;IAYzB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,MAAM,GAAG,SAAS;CAG3D"}