@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,125 @@
1
+ import ts from "typescript";
2
+ import { adoptFields, cloneValue, collapseInto, emptyValue, mergeInto, } from "./domain.js";
3
+ /**
4
+ * Array- and object-literal evaluation, split out of the core evaluator (taint.ts) like
5
+ * the call/relay rules in calls.ts — same `Evaluator` instance, free-function shape. A
6
+ * container literal is field-sensitive: a place element/property stores the LIVE value it
7
+ * denotes (aliasing), and spread copies its source's fields by reference (shallow copy).
8
+ *
9
+ * Both functions build a FRESH value for this pass; the evaluator hands it to
10
+ * `state.literalPlaceOf`, which adopts it on first sight and merges it into the persistent
11
+ * allocation-site place afterwards. So the value that flows on from a literal is storage
12
+ * that survives the pass (a callee may write through it), and the `changed` signal for a
13
+ * re-evaluation that grew is raised there — neither function touches `ev.s.changed`.
14
+ */
15
+ export function evalArrayLiteral(ev, node, ctx) {
16
+ const out = emptyValue();
17
+ if (node.elements.some((el) => ts.isSpreadElement(el))) {
18
+ // Sole-spread `[...xs]` where xs is a place: array spread shallow-copies, so each
19
+ // numeric element reference is shared (a write through `copy[k]` stays visible via
20
+ // `xs[k]`) — a plain fold would drop that sharing, hence spreadShare below.
21
+ // A spread beside other elements, or a non-place spread, still folds by value;
22
+ // reference sharing is not modeled for those cases.
23
+ const sole = node.elements[0];
24
+ if (node.elements.length === 1 && sole !== undefined && ts.isSpreadElement(sole) && spreadShare(ev, out, sole.expression)) {
25
+ return out;
26
+ }
27
+ for (const el of node.elements)
28
+ collapseInto(out, ev.evalExpr(el, ctx));
29
+ return out;
30
+ }
31
+ // An element that is a place stores the LIVE reference, so an object stored in an array
32
+ // stays aliased with its name (a write through either is seen through both).
33
+ node.elements.forEach((el, index) => out.fields.set(String(index), fieldValue(ev, el, ctx)));
34
+ return out;
35
+ }
36
+ export function evalObjectLiteral(ev, node, ctx) {
37
+ const out = emptyValue();
38
+ for (const prop of node.properties) {
39
+ if (ts.isPropertyAssignment(prop) && !ts.isComputedPropertyName(prop.name)) {
40
+ out.fields.set(prop.name.getText(ev.s.scriptFile), fieldValue(ev, prop.initializer, ctx));
41
+ }
42
+ else if (ts.isShorthandPropertyAssignment(prop)) {
43
+ // Shorthand `{ o }` stores o's live value (aliasing) when it is a place; an
44
+ // unresolvable name folds to empty (evalIdentifier would return the same).
45
+ // getSymbolAtLocation(prop.name) would return the object's
46
+ // PROPERTY symbol here, not the referenced local's value symbol, so envSlot
47
+ // would fabricate a fresh empty slot and the wrapped taint would be dropped at the
48
+ // literal — invisible at every downstream emission. getShorthandAssignmentValueSymbol
49
+ // resolves the actual value binding (the same symbol `{ o: o }` would read).
50
+ const sym = ev.checker.getShorthandAssignmentValueSymbol(prop);
51
+ out.fields.set(prop.name.text, sym === undefined ? emptyValue() : ev.s.envSlot(sym));
52
+ }
53
+ else if (ts.isSpreadAssignment(prop)) {
54
+ // Object spread `{ ...o }` shallow-copies: nested field references are shared, so a
55
+ // write through the literal's sub-object stays visible through o (spreadShare adopts
56
+ // o's fields by reference when o is a place). A plain mergeInto would deep-copy
57
+ // structure into independent nodes, hiding such a mutation from o.
58
+ if (!spreadShare(ev, out, prop.expression))
59
+ mergeInto(out, ev.evalExpr(prop.expression, ctx));
60
+ }
61
+ else if (ts.isMethodDeclaration(prop) && !ts.isComputedPropertyName(prop.name)) {
62
+ // Shorthand method: a function-valued field, callable through it (obj.run(x)).
63
+ // Without this case `obj.run` would resolve to no fns and the unknown-call
64
+ // fallback would never record its param actuals.
65
+ const fnVal = emptyValue();
66
+ fnVal.fns.add(prop);
67
+ out.fields.set(prop.name.getText(ev.s.scriptFile), fnVal);
68
+ }
69
+ else if (ts.isGetAccessorDeclaration(prop) && !ts.isComputedPropertyName(prop.name)) {
70
+ // Getter: the field's read value IS the getter's return summary (re-read each pass;
71
+ // the fixpoint converges) — without this case accessor fields would be invisible.
72
+ const id = ev.s.fnId.get(prop);
73
+ out.fields.set(prop.name.getText(ev.s.scriptFile), id === undefined ? emptyValue() : cloneValue(ev.s.summaryOf(id)));
74
+ }
75
+ else if (ts.isPropertyAssignment(prop)) {
76
+ // Computed key: cannot track the field name; fold the value into occs. The key
77
+ // expression must be evaluated too — both for effect (a facade sink inside the key
78
+ // was never visited, so its edges vanished) and because the key STRING becomes an
79
+ // observable property name (`Object.keys(o)`), so its taint joins the object
80
+ // ("strings launder nothing").
81
+ if (ts.isComputedPropertyName(prop.name))
82
+ collapseInto(out, ev.evalExpr(prop.name.expression, ctx));
83
+ collapseInto(out, ev.evalExpr(prop.initializer, ctx));
84
+ }
85
+ else if ((ts.isMethodDeclaration(prop) || ts.isGetAccessorDeclaration(prop) || ts.isSetAccessorDeclaration(prop)) &&
86
+ ts.isComputedPropertyName(prop.name)) {
87
+ // Computed method/accessor name (`{ [await ask()]() {} }`): the name becomes an
88
+ // observable key (`Object.keys`) and may host a facade sink, so evaluate the key and
89
+ // fold its taint in — same treatment as a computed property key. The member value can't
90
+ // be tracked under a dynamic key (opaque). The `!isComputedPropertyName` guards
91
+ // above exclude computed method/accessor names from every earlier branch, so this
92
+ // is the only place their key gets visited.
93
+ collapseInto(out, ev.evalExpr(prop.name.expression, ctx));
94
+ }
95
+ // SetAccessorDeclaration carries no read value; its writes are handled globally by
96
+ // settersByProp (see recordSetterWrite).
97
+ }
98
+ return out;
99
+ }
100
+ /** The value to store in a container-literal field: the live place if any, else a clone. */
101
+ function fieldValue(ev, expr, ctx) {
102
+ return ev.resolvePlace(expr) ?? ev.evalExpr(expr, ctx);
103
+ }
104
+ /**
105
+ * Shallow-copy spread sharing for a literal: if `expr` resolves to a place, adopt its
106
+ * field objects into `out` BY REFERENCE (+ merge container-level occs) and return true,
107
+ * so a write through the copy's sub-object stays visible through the source. `out` is this
108
+ * pass's fresh evaluation; the fixpoint change is signalled when it is merged into the
109
+ * literal's persistent place (state.literalPlaceOf), so this must NOT touch ev.s.changed
110
+ * (doing so would spin forever).
111
+ */
112
+ function spreadShare(ev, out, expr) {
113
+ const place = ev.resolvePlace(expr);
114
+ if (place === undefined)
115
+ return false;
116
+ // adoptFields can weak-merge a colliding field INTO the (persistent) source field without
117
+ // reporting growth here — a deliberate non-report, per this function's no-`changed`
118
+ // contract above. Safe: the merged-in value is the one runtime overwrites, so the fact is a
119
+ // spurious over-approximation whose propagation is merely DELAYED to the next pass that
120
+ // touches the source through a reporting path; it can never be lost, because nothing in
121
+ // this gen-only analysis removes it.
122
+ adoptFields(out, place);
123
+ mergeInto(out, place);
124
+ return true;
125
+ }
@@ -0,0 +1,60 @@
1
+ import type { ActorGraph } from "./actor-graph.js";
2
+ import { type CausalityGraph } from "./causality-graph.js";
3
+ import { type ControlFlowGraph } from "./flow-graph.js";
4
+ import type { HandoffGraph } from "./handoff-graph.js";
5
+ import type { SiteGraph } from "./types.js";
6
+ /** Emit a {@link SiteGraph} as a mermaid `flowchart TD`. Deterministic node/edge order. */
7
+ export declare function siteGraphToMermaid(graph: SiteGraph): string;
8
+ /** Emit an {@link ActorGraph} as a mermaid `flowchart LR`. Deterministic node/edge order. */
9
+ export declare function actorGraphToMermaid(graph: ActorGraph): string;
10
+ /**
11
+ * Emit a {@link CausalityGraph} as a mermaid `flowchart LR`: steps grouped into lane
12
+ * subgraphs, the returned artifact as a terminal node, and ONE arrow form — no dashes,
13
+ * no labels, no variants, exactly as the GUI renders it. `sequenceDiagram` was
14
+ * considered and rejected for the same reason as loop frames: its `loop`/`par`/`alt`
15
+ * blocks reintroduce the framing this design removes.
16
+ */
17
+ export declare function causalityGraphToMermaid(graph: CausalityGraph): string;
18
+ /**
19
+ * Emit the phase quotient as a mermaid `flowchart LR`: one node per phase, the same ONE
20
+ * arrow form as the step graph (self-loops and back edges included — a cycle among the
21
+ * arrows IS the loop), and the sink terminal derived from the phases of the steps that
22
+ * feed the return. Absent vocabulary means no diagram: a script with no `phase()` markers
23
+ * has nothing to draw here and the caller renders the step graph instead.
24
+ */
25
+ export declare function phaseGraphToMermaid(graph: CausalityGraph): string;
26
+ /**
27
+ * Emit the phase-level CONTROL-FLOW quotient as a mermaid `flowchart LR`: the same phase
28
+ * nodes as {@link phaseGraphToMermaid} so the two diagrams can be read side by side
29
+ * ("what must precede what" vs "where execution can go next"), plus the `entry` / `sink` /
30
+ * `abort` terminals. Arrows between one phase pair merge into one, labeled with the
31
+ * distinct edge kinds behind it (`via` in parentheses); a pair joined only by `next`
32
+ * renders unlabeled. Two phases that ran at the same time get one dashed `alongside` link
33
+ * on top, drawn from the earlier to the later — a node fact about the pair, not a path.
34
+ * Absent vocabulary means no diagram.
35
+ */
36
+ export declare function phaseFlowToMermaid(flow: ControlFlowGraph): string;
37
+ /**
38
+ * Emit the OCCURRENCE-level control-flow graph as a mermaid `flowchart TD` — the full CFG
39
+ * behind {@link phaseFlowToMermaid}'s quotient. Issue nodes are rectangles labelled by
40
+ * their occurrence id; marks are hexagons labelled by the phase name they switch to; the
41
+ * `entry` / `sink` / `abort` terminals share
42
+ * the endpoint palette of every other chart. When the script declares phases, nodes sit in
43
+ * one subgraph per phase (in `flow.phases` order) so a mark inside a loop reads as a jump
44
+ * between boxes. Edges keep the graph's canonical order and are drawn one arrow per edge —
45
+ * two edges between the same pair (`exit via=break` beside `next`) stay two arrows, because
46
+ * at this level they ARE two ways to get there. `next` renders unlabeled, every other kind
47
+ * carries {@link flowEdgeLabel}. Detached nodes (a never-called body) are dashed.
48
+ */
49
+ export declare function controlFlowToMermaid(flow: ControlFlowGraph): string;
50
+ /**
51
+ * Emit a {@link HandoffGraph} as a mermaid `flowchart LR`: one subgraph per phase (in the
52
+ * analyzer's participant order, which IS the stack order), one card per participant, and
53
+ * one arrow per hand-off — solid for a forward hand-off, dashed for a `back` one (all its
54
+ * contributing edges were loop carries), labelled with the artifact `types` when known.
55
+ * The graph itself carries only ids; pass the causality graph's `lanes` / `phases` to
56
+ * label cards and boxes with the author's names, exactly as `serializeHandoffGraph` echoes
57
+ * lane names for readability.
58
+ */
59
+ export declare function handoffGraphToMermaid(graph: HandoffGraph, names?: Pick<CausalityGraph, "lanes" | "phases">): string;
60
+ //# sourceMappingURL=mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/analysis/mermaid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAa,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAkB,KAAK,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAIL,KAAK,gBAAgB,EAGtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAW,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AACpF,OAAO,KAAK,EAAuB,SAAS,EAAY,MAAM,YAAY,CAAC;AAiC3E,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAsC3D;AA8ED,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAY7D;AAyBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA2BrE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA0BjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CA6CjE;AAkCD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAiDnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,KAAK,GAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,QAAQ,CAAiB,GAC9D,MAAM,CA4BR"}
@@ -0,0 +1,477 @@
1
+ import { WORKSPACE_LANE } from "./causality-graph.js";
2
+ import { FLOW_ABORT, FLOW_ENTRY, FLOW_SINK, } from "./flow-graph.js";
3
+ /**
4
+ * Pure mermaid emitters for the site graph and its derived actor graph. String
5
+ * builders over the graph types only (same purity rule as actor-graph.ts); the
6
+ * `pnpm charts` task renders these to `charts/` for live viewing.
7
+ *
8
+ * Two mermaid quirks the whole module exists to tame:
9
+ * - node ids may not contain `#`/`-`, so ids are sanitized (`ask#1` -> `ask_1`)
10
+ * while the ORIGINAL id is kept in the human-readable label;
11
+ * - label text is wrapped in double quotes with `"` rewritten to the `#quot;`
12
+ * entity, and backticks/newlines from user-derived text (agent names, glob
13
+ * patterns) stripped, so arbitrary script text cannot break the diagram syntax.
14
+ */
15
+ /** Mermaid node id: strip everything but word characters (`ask#1` -> `ask_1`). */
16
+ function safeId(id) {
17
+ return id.replace(/[^A-Za-z0-9_]/g, "_");
18
+ }
19
+ /** Escape user-derived label text: drop backticks/newlines, entity-encode quotes. */
20
+ function escapeLabel(text) {
21
+ return text
22
+ .replace(/`/g, "")
23
+ .replace(/[\r\n]+/g, " ")
24
+ .replace(/"/g, "#quot;");
25
+ }
26
+ /** Wrap already-escaped label content in the double quotes mermaid needs. */
27
+ function quote(content) {
28
+ return `"${content}"`;
29
+ }
30
+ /** Emit a {@link SiteGraph} as a mermaid `flowchart TD`. Deterministic node/edge order. */
31
+ export function siteGraphToMermaid(graph) {
32
+ const lines = ["flowchart TD"];
33
+ // Lane membership: an ask whose actor set is exactly one actor renders inside that
34
+ // actor's subgraph; multi-actor (may) and empty-actor asks stay top-level.
35
+ const laneAsks = new Map();
36
+ const laned = new Set();
37
+ for (const node of graph.nodes) {
38
+ if (node.kind === "ask" && node.actors !== undefined && node.actors.length === 1) {
39
+ const actorId = node.actors[0];
40
+ const list = laneAsks.get(actorId) ?? [];
41
+ list.push(node);
42
+ laneAsks.set(actorId, list);
43
+ laned.add(node.id);
44
+ }
45
+ }
46
+ // 1. Lane subgraphs, in actor source order; omit actors with no lane asks.
47
+ for (const actor of graph.actors) {
48
+ const asks = laneAsks.get(actor.id);
49
+ if (asks === undefined || asks.length === 0)
50
+ continue;
51
+ lines.push(` subgraph ${safeId(actor.id)}[${quote(laneTitle(actor))}]`);
52
+ for (const ask of asks)
53
+ lines.push(` ${siteNodeDef(ask, actor.within)}`);
54
+ lines.push(" end");
55
+ }
56
+ // 2. Remaining nodes top-level, in canonical node order.
57
+ for (const node of graph.nodes) {
58
+ if (laned.has(node.id))
59
+ continue;
60
+ lines.push(` ${siteNodeDef(node, undefined)}`);
61
+ }
62
+ // 3. Edges, in canonical edge order.
63
+ for (const edge of graph.edges)
64
+ lines.push(` ${siteEdgeLine(edge)}`);
65
+ // 4. A minimal palette: muted endpoints, world-reads, relays; asks stay default.
66
+ lines.push(...classDefs(graph));
67
+ return `${lines.join("\n")}\n`;
68
+ }
69
+ /** Subgraph title: `name (actor#1)`, plus a ` ×N per fan-out#K` marker for a lane family. */
70
+ function laneTitle(actor) {
71
+ const name = escapeLabel(actor.name ?? actor.id);
72
+ const family = actor.within === undefined ? "" : ` ×N per ${actor.within}`;
73
+ return `${name} (${actor.id})${family}`;
74
+ }
75
+ /**
76
+ * A node definition in the kind's shape. `laneFamily` is the enclosing subgraph's
77
+ * fan-out (undefined at top level); an ask omits its own `per fan-out#K` line only
78
+ * when the lane already carries the same marker, to avoid double-labeling.
79
+ */
80
+ function siteNodeDef(node, laneFamily) {
81
+ const id = safeId(node.id);
82
+ if (node.kind === "source" || node.kind === "sink") {
83
+ return `${id}([${quote(escapeLabel(node.label))}])`;
84
+ }
85
+ if (node.kind === "ask") {
86
+ const parts = [escapeLabel(node.label), node.id];
87
+ if (node.within !== undefined && node.within !== laneFamily)
88
+ parts.push(`per ${node.within}`);
89
+ return `${id}[${quote(parts.join("<br/>"))}]`;
90
+ }
91
+ if (node.kind === "world-read") {
92
+ const parts = [escapeLabel(node.label), node.id];
93
+ if (node.within !== undefined)
94
+ parts.push(`per ${node.within}`);
95
+ return `${id}[/${quote(parts.join("<br/>"))}/]`;
96
+ }
97
+ // An open hole: a subroutine shape (double bars) named by the hole and typed by T.
98
+ if (node.kind === "hole") {
99
+ const parts = [escapeLabel(node.label), node.id];
100
+ if (node.artifactType !== undefined)
101
+ parts.push(escapeLabel(node.artifactType));
102
+ return `${id}[[${quote(parts.join("<br/>"))}]]`;
103
+ }
104
+ // join / fan-out: hexagon labeled by the original id (a stable folding target).
105
+ const parts = [node.id];
106
+ if (node.kind === "join" && node.within !== undefined)
107
+ parts.push(`per ${node.within}`);
108
+ return `${id}{{${quote(parts.join("<br/>"))}}}`;
109
+ }
110
+ function siteEdgeLine(edge) {
111
+ const from = safeId(edge.from);
112
+ const to = safeId(edge.to);
113
+ // Context edges render as a dotted, arrowhead-less relation (not a flow).
114
+ if (edge.kind === "context")
115
+ return `${from} -. context .- ${to}`;
116
+ const arrow = edge.exact ? "-->" : "-.->";
117
+ // Label combines the join port (when present) and the producer artifact type,
118
+ // as `port N · T`; either alone renders bare. Type text is escaped (user-derived).
119
+ const parts = [];
120
+ if (edge.port !== undefined)
121
+ parts.push(`port ${edge.port}`);
122
+ if (edge.type !== undefined)
123
+ parts.push(escapeLabel(edge.type));
124
+ if (parts.length === 0)
125
+ return `${from} ${arrow} ${to}`;
126
+ return `${from} ${arrow}|${quote(parts.join(" · "))}| ${to}`;
127
+ }
128
+ function classDefs(graph) {
129
+ const idsOf = (kinds) => graph.nodes.filter((node) => kinds.includes(node.kind)).map((node) => safeId(node.id));
130
+ const out = [
131
+ " classDef endpoint fill:#eeeeef,stroke:#9a9aa5,color:#555566;",
132
+ " classDef world fill:#e8f0fe,stroke:#4285f4;",
133
+ " classDef relay fill:#fff2cc,stroke:#d6b656;",
134
+ ];
135
+ const endpoint = idsOf(["source", "sink"]);
136
+ const world = idsOf(["world-read"]);
137
+ const relay = idsOf(["join", "fan-out"]);
138
+ const hole = idsOf(["hole"]);
139
+ // 留白的 classDef 只在有留白时发:没有留白的脚本必须逐字节画出原来的图(快照钉住)。
140
+ if (hole.length > 0)
141
+ out.push(" classDef hole fill:#ffffff,stroke:#9a9aa5,stroke-dasharray: 4 3;");
142
+ if (endpoint.length > 0)
143
+ out.push(` class ${endpoint.join(",")} endpoint;`);
144
+ if (world.length > 0)
145
+ out.push(` class ${world.join(",")} world;`);
146
+ if (relay.length > 0)
147
+ out.push(` class ${relay.join(",")} relay;`);
148
+ if (hole.length > 0)
149
+ out.push(` class ${hole.join(",")} hole;`);
150
+ return out;
151
+ }
152
+ /** Emit an {@link ActorGraph} as a mermaid `flowchart LR`. Deterministic node/edge order. */
153
+ export function actorGraphToMermaid(graph) {
154
+ const lines = ["flowchart LR"];
155
+ for (const node of graph.nodes)
156
+ lines.push(` ${actorNodeDef(node)}`);
157
+ for (const edge of graph.edges)
158
+ lines.push(` ${actorEdgeLine(edge)}`);
159
+ // Muted source/sink endpoints, mirroring the site chart's palette. Only class the
160
+ // endpoints actually present — the agent-relevance filter may have pruned one.
161
+ const endpoints = graph.nodes.filter((n) => n.id === "source" || n.id === "sink").map((n) => safeId(n.id));
162
+ if (endpoints.length > 0) {
163
+ lines.push(" classDef endpoint fill:#eeeeef,stroke:#9a9aa5,color:#555566;");
164
+ lines.push(` class ${endpoints.join(",")} endpoint;`);
165
+ }
166
+ return `${lines.join("\n")}\n`;
167
+ }
168
+ function actorNodeDef(node) {
169
+ const id = safeId(node.id);
170
+ if (node.id === "source" || node.id === "sink")
171
+ return `${id}([${quote(node.id)}])`;
172
+ if (node.id === "workspace")
173
+ return `${id}[(${quote("workspace")})]`;
174
+ // A lane family (actor site inside a fan-out) renders as `×N`.
175
+ const label = escapeLabel(node.name ?? node.id) + (node.family === undefined ? "" : " ×N");
176
+ return `${id}[${quote(label)}]`;
177
+ }
178
+ function actorEdgeLine(edge) {
179
+ const from = safeId(edge.from);
180
+ const to = safeId(edge.to);
181
+ const arrow = edge.exact ? "-->" : "-.->";
182
+ // Label is the message types joined `", "`, with a ` ×N` multiplicity suffix when
183
+ // more than one site edge collapsed here; with no types, the bare `×N` (or nothing).
184
+ if (edge.types !== undefined && edge.types.length > 0) {
185
+ const label = edge.types.map(escapeLabel).join(", ") + (edge.count > 1 ? ` ×${edge.count}` : "");
186
+ return `${from} ${arrow}|${quote(label)}| ${to}`;
187
+ }
188
+ if (edge.count > 1)
189
+ return `${from} ${arrow}|${quote(`×${edge.count}`)}| ${to}`;
190
+ return `${from} ${arrow} ${to}`;
191
+ }
192
+ /**
193
+ * Emit a {@link CausalityGraph} as a mermaid `flowchart LR`: steps grouped into lane
194
+ * subgraphs, the returned artifact as a terminal node, and ONE arrow form — no dashes,
195
+ * no labels, no variants, exactly as the GUI renders it. `sequenceDiagram` was
196
+ * considered and rejected for the same reason as loop frames: its `loop`/`par`/`alt`
197
+ * blocks reintroduce the framing this design removes.
198
+ */
199
+ export function causalityGraphToMermaid(graph) {
200
+ const lines = ["flowchart LR"];
201
+ const byLane = new Map();
202
+ for (const step of graph.steps) {
203
+ const list = byLane.get(step.lane);
204
+ if (list === undefined)
205
+ byLane.set(step.lane, [step]);
206
+ else
207
+ list.push(step);
208
+ }
209
+ for (const lane of graph.lanes) {
210
+ const steps = byLane.get(lane.id) ?? [];
211
+ if (steps.length === 0)
212
+ continue;
213
+ lines.push(` subgraph ${safeId(lane.id)}[${quote(causalityLaneTitle(lane))}]`);
214
+ for (const step of steps)
215
+ lines.push(` ${stepNodeDef(step)}`);
216
+ lines.push(" end");
217
+ }
218
+ if (graph.sink !== undefined)
219
+ lines.push(` sink([${quote("sink")}])`);
220
+ for (const edge of graph.edges)
221
+ lines.push(` ${safeId(edge.from)} --> ${safeId(edge.to)}`);
222
+ for (const from of graph.sink?.fedBy ?? [])
223
+ lines.push(` ${safeId(from)} --> sink`);
224
+ if (graph.sink !== undefined) {
225
+ lines.push(" classDef endpoint fill:#eeeeef,stroke:#9a9aa5,color:#555566;");
226
+ lines.push(" class sink endpoint;");
227
+ }
228
+ return `${lines.join("\n")}\n`;
229
+ }
230
+ /**
231
+ * Emit the phase quotient as a mermaid `flowchart LR`: one node per phase, the same ONE
232
+ * arrow form as the step graph (self-loops and back edges included — a cycle among the
233
+ * arrows IS the loop), and the sink terminal derived from the phases of the steps that
234
+ * feed the return. Absent vocabulary means no diagram: a script with no `phase()` markers
235
+ * has nothing to draw here and the caller renders the step graph instead.
236
+ */
237
+ export function phaseGraphToMermaid(graph) {
238
+ const lines = ["flowchart LR"];
239
+ const phases = graph.phases ?? [];
240
+ for (const phase of phases) {
241
+ lines.push(` ${safeId(phase.id)}[${quote(escapeLabel(phase.name ?? phase.id))}]`);
242
+ }
243
+ // Phase → sink is not an edge in the model (the quotient excludes the sink); it is
244
+ // derived here from the fed-by steps' phases, in phase order.
245
+ const phaseOf = new Map(graph.steps.map((step) => [step.id, step.phase]));
246
+ const feeding = new Set((graph.sink?.fedBy ?? []).map((id) => phaseOf.get(id)).filter((id) => id !== undefined));
247
+ if (graph.sink !== undefined)
248
+ lines.push(` sink([${quote("sink")}])`);
249
+ for (const edge of graph.phaseEdges ?? []) {
250
+ lines.push(` ${safeId(edge.from)} --> ${safeId(edge.to)}`);
251
+ }
252
+ for (const phase of phases) {
253
+ if (feeding.has(phase.id))
254
+ lines.push(` ${safeId(phase.id)} --> sink`);
255
+ }
256
+ if (graph.sink !== undefined) {
257
+ lines.push(" classDef endpoint fill:#eeeeef,stroke:#9a9aa5,color:#555566;");
258
+ lines.push(" class sink endpoint;");
259
+ }
260
+ return `${lines.join("\n")}\n`;
261
+ }
262
+ /**
263
+ * Emit the phase-level CONTROL-FLOW quotient as a mermaid `flowchart LR`: the same phase
264
+ * nodes as {@link phaseGraphToMermaid} so the two diagrams can be read side by side
265
+ * ("what must precede what" vs "where execution can go next"), plus the `entry` / `sink` /
266
+ * `abort` terminals. Arrows between one phase pair merge into one, labeled with the
267
+ * distinct edge kinds behind it (`via` in parentheses); a pair joined only by `next`
268
+ * renders unlabeled. Two phases that ran at the same time get one dashed `alongside` link
269
+ * on top, drawn from the earlier to the later — a node fact about the pair, not a path.
270
+ * Absent vocabulary means no diagram.
271
+ */
272
+ export function phaseFlowToMermaid(flow) {
273
+ const lines = ["flowchart LR"];
274
+ const phaseEdges = flow.phaseEdges ?? [];
275
+ const terminals = [FLOW_ENTRY, FLOW_SINK, FLOW_ABORT].filter((id) => phaseEdges.some((edge) => edge.from === id || edge.to === id));
276
+ for (const id of terminals)
277
+ if (id === FLOW_ENTRY)
278
+ lines.push(` ${id}([${quote(id)}])`);
279
+ for (const phase of flow.phases ?? []) {
280
+ lines.push(` ${safeId(phase.id)}[${quote(escapeLabel(phase.name ?? phase.id))}]`);
281
+ }
282
+ for (const id of terminals)
283
+ if (id !== FLOW_ENTRY)
284
+ lines.push(` ${id}([${quote(id)}])`);
285
+ const byPair = new Map();
286
+ for (const edge of phaseEdges) {
287
+ const key = `${edge.from}|${edge.to}`;
288
+ const entry = byPair.get(key) ?? { from: edge.from, labels: [], to: edge.to };
289
+ const label = flowEdgeLabel(edge);
290
+ if (!entry.labels.includes(label))
291
+ entry.labels.push(label);
292
+ byPair.set(key, entry);
293
+ }
294
+ for (const { from, labels, to } of byPair.values()) {
295
+ const shown = labels.filter((label) => label !== "next");
296
+ const arrow = shown.length === 0 ? "-->" : `-->|${quote(shown.join(", "))}|`;
297
+ lines.push(` ${safeId(from)} ${arrow} ${safeId(to)}`);
298
+ }
299
+ // `alongside` is not a transfer of control, so it is drawn after the arrows and dashed:
300
+ // one link per pair, from the earlier phase to the later one in phase-table order.
301
+ const rank = new Map((flow.phases ?? []).map((phase, index) => [phase.id, index]));
302
+ const drawn = new Set();
303
+ for (const phase of flow.phases ?? []) {
304
+ for (const other of phase.alongside ?? []) {
305
+ const earlier = (rank.get(phase.id) ?? rank.size) < (rank.get(other) ?? rank.size);
306
+ const from = earlier ? phase.id : other;
307
+ const to = earlier ? other : phase.id;
308
+ if (drawn.has(`${from}|${to}`))
309
+ continue;
310
+ drawn.add(`${from}|${to}`);
311
+ lines.push(` ${safeId(from)} -.->|${quote("alongside")}| ${safeId(to)}`);
312
+ }
313
+ }
314
+ if (terminals.length > 0) {
315
+ lines.push(" classDef endpoint fill:#eeeeef,stroke:#9a9aa5,color:#555566;");
316
+ lines.push(` class ${terminals.join(",")} endpoint;`);
317
+ }
318
+ return `${lines.join("\n")}\n`;
319
+ }
320
+ function flowEdgeLabel(edge) {
321
+ return edge.via === undefined ? edge.kind : `${edge.kind} (${edge.via})`;
322
+ }
323
+ /** Symbols for nested iteration multiplicity: one enclosing region each, in order. */
324
+ const MULTIPLICITY_SYMBOLS = ["N", "M", "K", "P"];
325
+ /** Lane title: `name (actor#1)`, plus `×N·M` when enclosing iterations make it a family. */
326
+ function causalityLaneTitle(lane) {
327
+ const name = escapeLabel(lane.name ?? lane.id);
328
+ const head = lane.name === undefined ? name : `${name} (${lane.id})`;
329
+ const families = lane.families ?? [];
330
+ if (families.length === 0)
331
+ return head;
332
+ // Nested iterations MULTIPLY, so depth 2 reads `×N·M`.
333
+ const factors = families.map((_, index) => MULTIPLICITY_SYMBOLS[index] ?? "N").join("·");
334
+ return `${head} ×${factors}`;
335
+ }
336
+ /**
337
+ * A step node: `label`, its site id, and `×N` when its instances coexist — the textual
338
+ * stand-in for the GUI's stacked cards. A `serial` repeat needs no marker: the
339
+ * cycle-closing arrow already carries it.
340
+ */
341
+ function stepNodeDef(step) {
342
+ const parts = [escapeLabel(step.label), step.id];
343
+ if (step.repeat === "stack")
344
+ parts.push("×N");
345
+ if (step.lanes !== undefined)
346
+ parts.push(`may: ${step.lanes.join("|")}`);
347
+ const body = quote(parts.join("<br/>"));
348
+ if (step.kind === "hole")
349
+ return `${safeId(step.id)}[[${body}]]`;
350
+ return step.kind === "world-read" ? `${safeId(step.id)}[/${body}/]` : `${safeId(step.id)}[${body}]`;
351
+ }
352
+ /**
353
+ * Emit the OCCURRENCE-level control-flow graph as a mermaid `flowchart TD` — the full CFG
354
+ * behind {@link phaseFlowToMermaid}'s quotient. Issue nodes are rectangles labelled by
355
+ * their occurrence id; marks are hexagons labelled by the phase name they switch to; the
356
+ * `entry` / `sink` / `abort` terminals share
357
+ * the endpoint palette of every other chart. When the script declares phases, nodes sit in
358
+ * one subgraph per phase (in `flow.phases` order) so a mark inside a loop reads as a jump
359
+ * between boxes. Edges keep the graph's canonical order and are drawn one arrow per edge —
360
+ * two edges between the same pair (`exit via=break` beside `next`) stay two arrows, because
361
+ * at this level they ARE two ways to get there. `next` renders unlabeled, every other kind
362
+ * carries {@link flowEdgeLabel}. Detached nodes (a never-called body) are dashed.
363
+ */
364
+ export function controlFlowToMermaid(flow) {
365
+ const lines = ["flowchart TD"];
366
+ const terminals = [FLOW_ENTRY, FLOW_SINK, FLOW_ABORT].filter((id) => flow.edges.some((edge) => edge.from === id || edge.to === id));
367
+ const phaseName = new Map((flow.phases ?? []).map((phase) => [phase.id, phase.name ?? phase.id]));
368
+ const nodeDef = (node) => {
369
+ const id = safeId(node.id);
370
+ const tail = node.detached ? "<br/>detached" : "";
371
+ if (node.kind === "mark") {
372
+ return `${id}{{${quote(`${escapeLabel(phaseName.get(node.phase) ?? node.phase)}<br/>${node.id}${tail}`)}}}`;
373
+ }
374
+ return `${id}[${quote(`${node.id}${tail}`)}]`;
375
+ };
376
+ if (terminals.includes(FLOW_ENTRY))
377
+ lines.push(` ${FLOW_ENTRY}([${quote(FLOW_ENTRY)}])`);
378
+ if (flow.phases === undefined) {
379
+ for (const node of flow.nodes)
380
+ lines.push(` ${nodeDef(node)}`);
381
+ }
382
+ else {
383
+ for (const phase of flow.phases) {
384
+ const members = flow.nodes.filter((node) => node.phase === phase.id);
385
+ if (members.length === 0)
386
+ continue;
387
+ lines.push(` subgraph ${safeId(phase.id)}[${quote(escapeLabel(phase.name ?? phase.id))}]`);
388
+ for (const node of members)
389
+ lines.push(` ${nodeDef(node)}`);
390
+ lines.push(" end");
391
+ }
392
+ }
393
+ for (const id of terminals)
394
+ if (id !== FLOW_ENTRY)
395
+ lines.push(` ${id}([${quote(id)}])`);
396
+ for (const edge of flow.edges) {
397
+ const arrow = edge.kind === "next" ? "-->" : `-->|${quote(flowEdgeLabel(edge))}|`;
398
+ lines.push(` ${safeId(edge.from)} ${arrow} ${safeId(edge.to)}`);
399
+ }
400
+ if (terminals.length > 0) {
401
+ lines.push(" classDef endpoint fill:#eeeeef,stroke:#9a9aa5,color:#555566;");
402
+ lines.push(` class ${terminals.join(",")} endpoint;`);
403
+ }
404
+ const marks = flow.nodes.filter((node) => node.kind === "mark").map((node) => safeId(node.id));
405
+ if (marks.length > 0) {
406
+ lines.push(" classDef mark fill:#fff2cc,stroke:#d6b656;");
407
+ lines.push(` class ${marks.join(",")} mark;`);
408
+ }
409
+ const detached = flow.nodes.filter((node) => node.detached).map((node) => safeId(node.id));
410
+ if (detached.length > 0) {
411
+ lines.push(" classDef detached stroke-dasharray:4 3,color:#555566;");
412
+ lines.push(` class ${detached.join(",")} detached;`);
413
+ }
414
+ return `${lines.join("\n")}\n`;
415
+ }
416
+ /**
417
+ * Emit a {@link HandoffGraph} as a mermaid `flowchart LR`: one subgraph per phase (in the
418
+ * analyzer's participant order, which IS the stack order), one card per participant, and
419
+ * one arrow per hand-off — solid for a forward hand-off, dashed for a `back` one (all its
420
+ * contributing edges were loop carries), labelled with the artifact `types` when known.
421
+ * The graph itself carries only ids; pass the causality graph's `lanes` / `phases` to
422
+ * label cards and boxes with the author's names, exactly as `serializeHandoffGraph` echoes
423
+ * lane names for readability.
424
+ */
425
+ export function handoffGraphToMermaid(graph, names = { lanes: [] }) {
426
+ const lines = ["flowchart LR"];
427
+ const laneName = new Map(names.lanes.map((lane) => [lane.id, lane.name]));
428
+ const phaseName = new Map((names.phases ?? []).map((phase) => [phase.id, phase.name ?? phase.id]));
429
+ const byPhase = new Map();
430
+ for (const participant of graph.participants) {
431
+ const list = byPhase.get(participant.phase);
432
+ if (list === undefined)
433
+ byPhase.set(participant.phase, [participant]);
434
+ else
435
+ list.push(participant);
436
+ }
437
+ for (const [phase, participants] of byPhase) {
438
+ lines.push(` subgraph ${safeId(phase)}[${quote(escapeLabel(phaseName.get(phase) ?? phase))}]`);
439
+ for (const participant of participants) {
440
+ lines.push(` ${participantNodeDef(participant, laneName.get(participant.lane))}`);
441
+ }
442
+ lines.push(" end");
443
+ }
444
+ for (const handoff of graph.handoffs)
445
+ lines.push(` ${handoffEdgeLine(handoff)}`);
446
+ const workspace = graph.participants
447
+ .filter((participant) => participant.lane === WORKSPACE_LANE)
448
+ .map((participant) => safeId(participant.id));
449
+ if (workspace.length > 0) {
450
+ lines.push(" classDef world fill:#e8f0fe,stroke:#4285f4;");
451
+ lines.push(` class ${workspace.join(",")} world;`);
452
+ }
453
+ return `${lines.join("\n")}\n`;
454
+ }
455
+ /**
456
+ * A participant card: the lane's name (or id) with its multiplicity — `[i/N]` for a
457
+ * literal-cardinality member, `×N` for a family of unknown size — over the steps it holds.
458
+ * The workspace lane is a cylinder, as in the actor chart.
459
+ */
460
+ function participantNodeDef(participant, name) {
461
+ const id = safeId(participant.id);
462
+ let head = escapeLabel(name ?? participant.lane);
463
+ if (participant.member !== undefined)
464
+ head += ` [${participant.member.index + 1}/${participant.member.of}]`;
465
+ if (participant.many)
466
+ head += " ×N";
467
+ const body = quote(`${head}<br/>${participant.steps.join(", ")}`);
468
+ return participant.lane === WORKSPACE_LANE ? `${id}[(${body})]` : `${id}[${body}]`;
469
+ }
470
+ function handoffEdgeLine(handoff) {
471
+ const from = safeId(handoff.from);
472
+ const to = safeId(handoff.to);
473
+ const arrow = handoff.back ? "-.->" : "-->";
474
+ if (handoff.types === undefined || handoff.types.length === 0)
475
+ return `${from} ${arrow} ${to}`;
476
+ return `${from} ${arrow}|${quote(handoff.types.map(escapeLabel).join(", "))}| ${to}`;
477
+ }