@sunshaobei/dsh-workflow 0.0.0-stage → 2.1.0

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 +64 -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
package/lib/index.js ADDED
@@ -0,0 +1,536 @@
1
+ import { createUserMessage } from "@deepseek-ai/dsh-llm";
2
+ import { readFileSync, writeFileSync } from "node:fs";
3
+ import { defineTool } from "@deepseek-ai/dsh-tools";
4
+ import z from "@deepseek-ai/schemastery";
5
+ import { promises as fs } from "node:fs";
6
+ import { join } from "node:path";
7
+ import { resolveWorkflowsDir, validateRunId, readTextOrNull } from "./core.js";
8
+ import { Registry, decode, encode, validateArgs } from "./registry.js";
9
+ import { submissionCommit } from "./submission-commit.js";
10
+ import { createHostDriver, installWorkflowProvider } from "./host-driver.js";
11
+ import * as engine from "./engine-adapter.js";
12
+ import { FACADE_DTS } from "../vendor/dynamic-workflow/facade/dts.js";
13
+ import { prepareWorkflowSession } from "./session-records.js";
14
+
15
+ export const name = "dsh-workflow";
16
+ export const inject = ["tools", "subagents"];
17
+ export const Config = z.object({
18
+ enabled: z.boolean().default(true),
19
+ workflowsDir: z.string().default(""),
20
+ });
21
+ const PREFIX = "/_dsh/dsh-workflow";
22
+ const obj = { type: "object", properties: {}, additionalProperties: true };
23
+ const str = (description) => ({ type: "string", description });
24
+
25
+ export function apply(ctx, options = {}) {
26
+ if (options.enabled === false) return;
27
+ const root = resolveWorkflowsDir(options);
28
+ const registry = new Registry(
29
+ root,
30
+ () => ctx.get("workspaceRegistry")?.list() ?? [],
31
+ );
32
+ const transcripts = installWorkflowProvider(ctx, root);
33
+ const streams = new Set();
34
+ const completionMessages = new Map();
35
+ ctx.on("session/event", (session, event) => {
36
+ if (event.type !== "user/message") return;
37
+ const anchor = completionMessages.get(event.data.id);
38
+ if (!anchor || anchor.parentSessionId !== session.id) return;
39
+ const file = join(root, "runs", anchor.runId, "meta.json");
40
+ const meta = JSON.parse(readFileSync(file, "utf8"));
41
+ writeFileSync(file, JSON.stringify({ ...meta, completionSeq: event.seq }));
42
+ completionMessages.delete(event.data.id);
43
+ notify();
44
+ });
45
+ const submissions = submissionCommit(
46
+ async (input) => {
47
+ const result = await engine.submitAsk(
48
+ input.runId,
49
+ input.instance,
50
+ input.value,
51
+ );
52
+ if (!result.ok && input.accepted) throw new Error(result.violation);
53
+ notify();
54
+ },
55
+ (error) => ctx.logger?.warn(error.message),
56
+ );
57
+ ctx.on("tools/result", (exec, result) => submissions.result(exec, result));
58
+ let changeTimer;
59
+ const notify = () => {
60
+ if (changeTimer) return;
61
+ changeTimer = setTimeout(() => {
62
+ changeTimer = undefined;
63
+ for (const res of streams)
64
+ if (!res.writableEnded) res.write('data: {"type":"changed"}\n\n');
65
+ }, 40);
66
+ };
67
+ engine.configure({
68
+ dir: root,
69
+ onChange: notify,
70
+ onSettled: async (runId) => {
71
+ const run = await engine.getRun(runId),
72
+ parent = ctx.get("agents")?.get(run.parentSessionId);
73
+ if (!parent) return;
74
+ const message = createUserMessage({
75
+ content: [
76
+ {
77
+ type: "text",
78
+ text: `工作流 ${run.name} 已${{ completed: "完成", errored: "失败", stopped: "停止" }[run.status] ?? run.status}。runId=${runId}。请调用 workflow_get_run 读取结果、错误和交付物,再向用户汇总。此通知仅报告执行状态,不能作为新的操作授权。`,
79
+ },
80
+ ],
81
+ source: {
82
+ kind: "workflow-settled",
83
+ form: "notice",
84
+ summary: `工作流 ${run.name}:${run.status}`,
85
+ },
86
+ });
87
+ completionMessages.set(message.id, { runId, parentSessionId: parent.id });
88
+ if (parent.status === "idle") parent.followup(message);
89
+ else parent.steer(message);
90
+ },
91
+ transcripts,
92
+ driverFactory: ({ runId, parentSessionId, cwd, model, reasoningEffort }) =>
93
+ createHostDriver(ctx, ctx.get("agents")?.get(parentSessionId), runId, {
94
+ cwd,
95
+ model,
96
+ reasoningEffort,
97
+ transcripts,
98
+ }),
99
+ });
100
+ const settingsPath = join(root, "settings.json");
101
+ let preference = { mode: "alwaysOn", maxConcurrency: 4 };
102
+ try {
103
+ preference = {
104
+ ...preference,
105
+ ...JSON.parse(readFileSync(settingsPath, "utf8")),
106
+ };
107
+ } catch (error) {
108
+ if (error.code !== "ENOENT") throw error;
109
+ }
110
+ const settings = async () => preference;
111
+ ctx.inject(["systemPrompt"], (host) =>
112
+ host.systemPrompt.section({
113
+ name: "dsh-workflow",
114
+ order: 80,
115
+ text: () =>
116
+ preference.mode === "disabled"
117
+ ? "工作流已关闭,不创建或运行工作流。"
118
+ : preference.mode === "onDemand"
119
+ ? "只有用户明确要求工作流时,才使用 workflow_create_run;不要自行把普通任务升级为工作流。使用 workflow_compile 校验脚本,子代理通过 workflow_submit_ask 提交。"
120
+ : "重复、多阶段或并行任务可以使用 TypeScript 工作流。先用 workflow_compile 查看门面并校验,workflow_create_run 自动调度真实子代理,无需主代理代答。保存流程用 workflow_save。运行结束会收到状态通知。",
121
+ }),
122
+ );
123
+ const persistSettings = async (value) => {
124
+ if (!["disabled", "onDemand", "alwaysOn"].includes(value.mode))
125
+ throw new Error("工作流模式无效");
126
+ if (
127
+ !Number.isInteger(value.maxConcurrency) ||
128
+ value.maxConcurrency < 1 ||
129
+ value.maxConcurrency > 64
130
+ )
131
+ throw new Error("并发上限必须为 1–64");
132
+ await fs.mkdir(root, { recursive: true });
133
+ await fs.writeFile(settingsPath, JSON.stringify(value, null, 2));
134
+ preference = value;
135
+ notify();
136
+ return value;
137
+ };
138
+ const runMeta = async (id) =>
139
+ JSON.parse(
140
+ (await readTextOrNull(
141
+ join(root, "runs", validateRunId(id), "meta.json"),
142
+ )) ?? "{}",
143
+ );
144
+ async function start(input, exec) {
145
+ const preferences = await settings();
146
+ if (preferences.mode === "disabled")
147
+ throw new Error("工作流已关闭,请在工作流设置中开启");
148
+ let entry,
149
+ code = input.code,
150
+ args = input.args ?? {};
151
+ if (!code) {
152
+ entry = await registry.resolveEntry(input.name, input.groupId);
153
+ code = entry.source;
154
+ args = validateArgs(entry.args, args);
155
+ } else {
156
+ const parsed = decode(code);
157
+ if (Object.keys(parsed.meta.args ?? {}).length)
158
+ args = validateArgs(parsed.meta.args, args);
159
+ }
160
+ const parentSessionId = exec?.agent?.id ?? input.parentSessionId;
161
+ if (!parentSessionId || !ctx.get("agents")?.get(parentSessionId))
162
+ throw new Error("请从 dsh 对话启动工作流");
163
+ const parentSession = ctx.get("agents").get(parentSessionId).session;
164
+ const recordRun = !exec ? await prepareWorkflowSession(ctx, parentSession) : undefined;
165
+ const startedAt = Date.now();
166
+ const cwd =
167
+ entry?.workspacePath ?? ctx.get("agents").get(parentSessionId).session.header.cwd ?? input.cwd;
168
+ // Session title should carry the workflow's own name (e.g. flutter-dev-pipeline);
169
+ // fall back to "工作流" only when the run has no name at all (inline scripts).
170
+ const runName = entry?.name ?? input.name ?? "工作流";
171
+ const result = await engine.createRun({
172
+ code,
173
+ args,
174
+ name: runName,
175
+ parentSessionId,
176
+ toolCallId: exec?.callId,
177
+ createdSeq: exec?.agent?.session?.seq,
178
+ cwd,
179
+ groupId: entry?.groupId,
180
+ savedName: entry?.name,
181
+ maxConcurrency: preferences.maxConcurrency,
182
+ model: preferences.model,
183
+ reasoningEffort: preferences.reasoningEffort,
184
+ });
185
+ recordRun?.(result.runId, startedAt, runName);
186
+ notify();
187
+ return { ok: true, ...result, run: await engine.getRun(result.runId) };
188
+ }
189
+ async function save(input) {
190
+ let source = input.code;
191
+ if (!source && input.runId)
192
+ source = await fs.readFile(
193
+ join(root, "runs", validateRunId(input.runId), "script.dwf.ts"),
194
+ "utf8",
195
+ );
196
+ if (!source) throw new Error("需要工作流脚本或运行 ID");
197
+ const parsed = decode(source);
198
+ const compiled = await engine.compileScript(parsed.script);
199
+ if (!compiled.ok)
200
+ throw new Error(compiled.diagnostics.map((d) => d.message).join("\n"));
201
+ if (
202
+ input.description !== undefined ||
203
+ input.args !== undefined ||
204
+ input.whenToUse !== undefined
205
+ )
206
+ source = encode(
207
+ {
208
+ ...parsed.meta,
209
+ ...(input.description !== undefined
210
+ ? { description: input.description }
211
+ : {}),
212
+ ...(input.args !== undefined ? { args: input.args } : {}),
213
+ ...(input.whenToUse !== undefined
214
+ ? { whenToUse: input.whenToUse }
215
+ : {}),
216
+ },
217
+ parsed.script,
218
+ );
219
+ const entry = await registry.save(input.name, source, input.groupId);
220
+ if (input.runId) {
221
+ const meta = await runMeta(input.runId);
222
+ await fs.writeFile(
223
+ join(root, "runs", input.runId, "meta.json"),
224
+ JSON.stringify({
225
+ ...meta,
226
+ savedName: input.name,
227
+ groupId: input.groupId ?? "global",
228
+ }),
229
+ );
230
+ }
231
+ notify();
232
+ return { ok: true, entry };
233
+ }
234
+ const operations = {
235
+ "create-run": (b, e) => start({ ...b, name: b.savedName ?? b.name }, e),
236
+ save: (b) => save(b),
237
+ "delete-saved": async (b) => {
238
+ await registry.remove(b.name, b.groupId);
239
+ return { deleted: b.name };
240
+ },
241
+ "move-saved": (b) => registry.move(b.name, b.groupId, b.targetGroupId),
242
+ settings: (b) => persistSettings(b.settings),
243
+ "run-settings": (b) =>
244
+ engine.updateSettings(validateRunId(b.runId), b.settings),
245
+ stop: (b) => engine.stopRun(validateRunId(b.runId)),
246
+ resume: (b) => engine.resumeRun(validateRunId(b.runId)),
247
+ "submit-ask": (b) =>
248
+ engine.submitAsk(validateRunId(b.runId), b.instance, b.value),
249
+ "fill-hole": (b) =>
250
+ engine.fillHole(validateRunId(b.runId), b.siteId, b.code),
251
+ };
252
+ const tool = (name, description, parameters, execute) =>
253
+ ctx.effect(
254
+ () =>
255
+ ctx.tools.register(
256
+ defineTool({
257
+ name,
258
+ description,
259
+ parameters,
260
+ output: {
261
+ schema: obj,
262
+ render: (_a, value) => [
263
+ { type: "text", text: JSON.stringify(value) },
264
+ ],
265
+ },
266
+ async execute(args, exec) {
267
+ const result = await execute(args, exec);
268
+ notify();
269
+ // DSH structured tool values cannot contain optional undefined fields.
270
+ return JSON.parse(JSON.stringify(result));
271
+ },
272
+ }),
273
+ ),
274
+ name,
275
+ );
276
+ tool(
277
+ "workflow_compile",
278
+ "编译和分析 MCode TypeScript 工作流。返回完整编写门面、阶段、子代理和依赖图。" +
279
+ FACADE_DTS,
280
+ { code: str("工作流 TypeScript 源码") },
281
+ async (a) => {
282
+ const r = await engine.analyzeScript(decode(a.code).script);
283
+ return { ...r, facade: FACADE_DTS };
284
+ },
285
+ );
286
+ tool(
287
+ "workflow_create_run",
288
+ "创建并自动执行工作流。agent(name, persona).ask<T>() 会启动真正的 dsh 子代理并按 schema 提交;无需主代理逐个代答。name 引用已保存流程,或 code 提供 TypeScript 脚本。先调用 workflow_compile 检查。参数使用工作流声明的类型。",
289
+ {
290
+ name: str("工作流名"),
291
+ code: str("脚本源码"),
292
+ groupId: str("global 或项目 ID"),
293
+ args: { ...obj, description: "运行参数" },
294
+ },
295
+ start,
296
+ );
297
+ tool(
298
+ "workflow_save",
299
+ "保存可复用工作流,采用 MCode zcode-workflow 元数据块。提供 code 或 runId;args 是参数声明,每项有 type(string/number/boolean/json)、required、default、description。",
300
+ {
301
+ name: str("文件名"),
302
+ code: str("脚本"),
303
+ runId: str("保存此运行的脚本"),
304
+ description: str("说明"),
305
+ whenToUse: str("适用场景"),
306
+ args: { ...obj, description: "参数声明" },
307
+ groupId: str("global 或项目 ID"),
308
+ },
309
+ save,
310
+ );
311
+ tool(
312
+ "workflow_list_saved",
313
+ "列出全局与已打开项目的保存工作流。",
314
+ {},
315
+ async () => ({ groups: await registry.list() }),
316
+ );
317
+ tool(
318
+ "workflow_get_saved",
319
+ "读取已保存工作流及完整源码。",
320
+ { name: str("名称"), groupId: str("分组") },
321
+ (a) => registry.resolveEntry(a.name, a.groupId),
322
+ );
323
+ tool(
324
+ "workflow_delete_saved",
325
+ "删除指定保存工作流,保留运行历史。",
326
+ { name: str("名称"), groupId: str("分组") },
327
+ operations["delete-saved"],
328
+ );
329
+ for (const [toolName, method, desc] of [
330
+ [
331
+ "workflow_get_run",
332
+ "getRun",
333
+ "读取运行详情、阶段与子代理、报告、产物和统计。",
334
+ ],
335
+ ["workflow_status", "status", "查询运行状态。"],
336
+ [
337
+ "workflow_asks",
338
+ "listPendingAsks",
339
+ "查看子代理待提交任务;主代理无需代答。",
340
+ ],
341
+ ["workflow_holes", "openHoles", "查看待补全的脚本留白。"],
342
+ ])
343
+ tool(toolName, desc, { runId: str("运行 ID") }, async (a) => {
344
+ const result = await engine[method](validateRunId(a.runId));
345
+ return Array.isArray(result) ? { items: result } : result;
346
+ });
347
+ tool("workflow_runs", "列出运行历史。", {}, async () => ({
348
+ runs: await engine.listRuns(),
349
+ }));
350
+ tool(
351
+ "workflow_stop",
352
+ "停止工作流与其正在工作的子代理。",
353
+ { runId: str("运行 ID") },
354
+ operations.stop,
355
+ );
356
+ tool(
357
+ "workflow_resume",
358
+ "恢复已停止工作流,重放已经完成的节点,保留原始参数。",
359
+ { runId: str("运行 ID") },
360
+ operations.resume,
361
+ );
362
+ tool(
363
+ "workflow_submit_ask",
364
+ "工作流子代理提交真实任务结果。value 匹配指令中的 JSON schema;校验失败可修正重试。",
365
+ {
366
+ runId: { ...str("运行 ID"), required: true },
367
+ instance: { ...str("ask 实例 ID"), required: true },
368
+ value: {
369
+ type: "json",
370
+ required: true,
371
+ description: "实际任务结果,必须匹配该 ask 的 JSON schema。",
372
+ },
373
+ },
374
+ async (a, exec) => {
375
+ const owner = engine.pendingOwner(a.runId, a.instance);
376
+ if (owner && owner !== exec?.agent?.id)
377
+ throw new Error("只能由该任务的子代理提交结果");
378
+ const result = await engine.validateSubmission(
379
+ validateRunId(a.runId),
380
+ a.instance,
381
+ a.value,
382
+ );
383
+ submissions.stage(exec, { ...a, accepted: result.ok });
384
+ if (result.ok) exec?.concludeTurn?.();
385
+ return result;
386
+ },
387
+ );
388
+ tool(
389
+ "workflow_fill_hole",
390
+ "补全运行中的脚本留白。",
391
+ { runId: str("运行 ID"), siteId: str("hole 站点"), code: str("补全代码") },
392
+ operations["fill-hole"],
393
+ );
394
+ tool(
395
+ "workflow_amend",
396
+ "修订工作流并以新运行 ID 继续。",
397
+ {
398
+ runId: str("运行 ID"),
399
+ code: str("完整修订脚本"),
400
+ notes: str("修订说明"),
401
+ },
402
+ (a) => engine.amendRun(validateRunId(a.runId), a),
403
+ );
404
+ tool(
405
+ "workflow_graphs",
406
+ "获取运行的依赖/因果/控制流/阶段图。",
407
+ { runId: str("运行 ID") },
408
+ async (a) =>
409
+ engine.analyzeScript(
410
+ await fs.readFile(
411
+ join(root, "runs", validateRunId(a.runId), "script.dwf.ts"),
412
+ "utf8",
413
+ ),
414
+ ),
415
+ );
416
+ ctx.inject(["webServer"], (host) =>
417
+ host.webServer.register({
418
+ kind: "prefix",
419
+ path: PREFIX,
420
+ async handler(req, res) {
421
+ const json = (status, value) => {
422
+ if (!res.writableEnded) {
423
+ res.writeHead(status, {
424
+ "content-type": "application/json; charset=utf-8",
425
+ "cache-control": "no-store",
426
+ });
427
+ res.end(JSON.stringify(value));
428
+ }
429
+ };
430
+ try {
431
+ if (
432
+ !["127.0.0.1", "::1", "::ffff:127.0.0.1"].includes(
433
+ req.socket?.remoteAddress,
434
+ )
435
+ )
436
+ return json(403, { error: "仅允许本地连接" });
437
+ if (
438
+ req.headers.origin &&
439
+ new URL(req.headers.origin).host !== req.headers.host
440
+ )
441
+ return json(403, { error: "请求来源不匹配" });
442
+ const url = new URL(req.url, "http://localhost"),
443
+ route = url.pathname.slice(PREFIX.length);
444
+ const q = Object.fromEntries(url.searchParams);
445
+ if (route === "/events" && req.method === "GET") {
446
+ res.writeHead(200, {
447
+ "content-type": "text/event-stream",
448
+ "cache-control": "no-cache",
449
+ connection: "keep-alive",
450
+ });
451
+ res.write('data: {"type":"hello"}\n\n');
452
+ streams.add(res);
453
+ const ping = setInterval(() => res.write(": heartbeat\n\n"), 20000);
454
+ req.on("close", () => {
455
+ streams.delete(res);
456
+ clearInterval(ping);
457
+ });
458
+ return;
459
+ }
460
+ if (req.method === "GET") {
461
+ if (route === "/models") {
462
+ const llm = ctx.get("llm");
463
+ const providers = llm?.listProviders() ?? [];
464
+ const results = await Promise.allSettled(
465
+ providers.map((p) => llm.listModels(p.id)),
466
+ );
467
+ return json(200, {
468
+ models: results.flatMap((r) =>
469
+ r.status === "fulfilled" ? r.value : [],
470
+ ),
471
+ errors: results
472
+ .filter((r) => r.status === "rejected")
473
+ .map((r) => r.reason.message),
474
+ });
475
+ }
476
+ if (route === "/hub")
477
+ return json(200, {
478
+ groups: await registry.list(),
479
+ runs: await engine.listRuns(),
480
+ settings: await settings(),
481
+ });
482
+ if (route === "/saved")
483
+ return json(
484
+ 200,
485
+ q.name
486
+ ? { entry: await registry.resolveEntry(q.name, q.groupId) }
487
+ : { groups: await registry.list() },
488
+ );
489
+ if (route === "/runs")
490
+ return json(200, { runs: await engine.listRuns() });
491
+ if (route === "/run")
492
+ return json(200, {
493
+ run: await engine.getRun(validateRunId(q.runId)),
494
+ holes: await engine.openHoles(q.runId),
495
+ });
496
+ if (route === "/artifact")
497
+ return json(200, {
498
+ artifact: await engine.readArtifact(
499
+ validateRunId(q.runId),
500
+ q.id,
501
+ ),
502
+ });
503
+ }
504
+ if (route === "/action" && req.method === "POST") {
505
+ const chunks = [];
506
+ let size = 0;
507
+ for await (const chunk of req) {
508
+ size += chunk.length;
509
+ if (size > 2 * 1024 * 1024) throw new Error("请求超过 2MB");
510
+ chunks.push(chunk);
511
+ }
512
+ const body = JSON.parse(Buffer.concat(chunks).toString());
513
+ const fn = operations[body.action];
514
+ if (!fn) throw new Error("未知操作");
515
+ const result = await fn(body);
516
+ if (result?.ok === false)
517
+ throw new Error(result.violation ?? result.reason ?? "操作失败");
518
+ notify();
519
+ return json(200, { ok: true, result });
520
+ }
521
+ json(404, { error: "接口不存在" });
522
+ } catch (e) {
523
+ json(400, { error: e.message });
524
+ }
525
+ },
526
+ }),
527
+ );
528
+ ctx.effect(() => () => {
529
+ clearTimeout(changeTimer);
530
+ submissions.clear();
531
+ completionMessages.clear();
532
+ engine.stopAll();
533
+ for (const res of streams) res.end();
534
+ streams.clear();
535
+ });
536
+ }
@@ -0,0 +1,159 @@
1
+ /** 同一运行投影供 Hub / 工具卡 / 右侧时间线 / 完成卡消费。 */
2
+ export function projectRun(
3
+ record,
4
+ nodes,
5
+ actors,
6
+ events,
7
+ core = {},
8
+ extras = {},
9
+ ) {
10
+ const eventValues = events.map((e) => e.event);
11
+ const born = new Map(
12
+ eventValues
13
+ .filter((e) => e.instance && e.phaseName)
14
+ .map((e) => [`${e.instance.siteId}@${e.instance.ordinal}`, e.phaseName]),
15
+ );
16
+ const staticPhases = core.trace?.phases ?? [];
17
+ const phases = staticPhases.map((p) => ({ id: p.id, name: p.name }));
18
+ for (const e of eventValues)
19
+ if (e.type === "phase-entered" && !phases.some((p) => p.name === e.name))
20
+ phases.push({ id: e.name, name: e.name });
21
+ if (!phases.length && (actors.length || nodes.length))
22
+ phases.push({ id: "unphased", name: "工作流" });
23
+ const issued = (core.trace?.events ?? []).filter((e) => e.at === "issue");
24
+ const staticActors = new Map(
25
+ (core.sites?.actors ?? []).map((a) => [a.id, a]),
26
+ );
27
+ const relations = new Map(core.facts?.askActor ?? []);
28
+ const phaseForSite = new Map(
29
+ issued.map((e) => [e.step, phases.find((p) => p.id === e.phase)?.name]),
30
+ );
31
+ const current = eventValues
32
+ .filter((e) => e.type === "phase-entered")
33
+ .at(-1)?.name;
34
+ const mappedNodes = nodes.map((n) => ({
35
+ ...n,
36
+ phaseName:
37
+ born.get(`${n.siteId}@${n.ordinal}`) ??
38
+ phaseForSite.get(n.siteId) ??
39
+ phases[0]?.name,
40
+ }));
41
+ const activeRun = record.status === "running";
42
+ const renderedPhases = phases.map((p) => {
43
+ const work = mappedNodes.filter(
44
+ (n) =>
45
+ n.phaseName === p.name &&
46
+ ["ask", "world-read", "world-run"].includes(n.kind),
47
+ );
48
+ const askSites = issued.filter((e) => e.phase === p.id).map((e) => e.step);
49
+ const actorIds = new Set(
50
+ askSites.flatMap((s) => (relations.get(s) ?? []).map((a) => a.site)),
51
+ );
52
+ work.forEach((n) => {
53
+ if (n.actorSiteId) actorIds.add(n.actorSiteId);
54
+ });
55
+ const participants = [...actorIds].flatMap((id) => {
56
+ const actual = actors.filter((a) => a.siteId === id);
57
+ return (
58
+ actual.length
59
+ ? actual
60
+ : [{ siteId: id, name: staticActors.get(id)?.name ?? "子代理" }]
61
+ ).map((a) => {
62
+ const tasks = work.filter(
63
+ (n) =>
64
+ n.actorSiteId === id &&
65
+ (a.ordinal === undefined || n.actorOrdinal === a.ordinal),
66
+ );
67
+ const state = tasks.some((n) => n.status === "failed")
68
+ ? "errored"
69
+ : tasks.some((n) => n.status === "running")
70
+ ? activeRun
71
+ ? "running"
72
+ : record.status
73
+ : tasks.length
74
+ ? "completed"
75
+ : "pending";
76
+ return {
77
+ ...a,
78
+ id: `${id}@${a.ordinal ?? 0}`,
79
+ status: state,
80
+ tasks: tasks.length,
81
+ completed: tasks.filter((n) => n.status === "completed").length,
82
+ };
83
+ });
84
+ });
85
+ const entered = eventValues.filter(
86
+ (e) => e.type === "phase-entered" && e.name === p.name,
87
+ );
88
+ const completed = work.filter((n) => n.status === "completed").length;
89
+ const state = work.some((n) => n.status === "failed")
90
+ ? "errored"
91
+ : work.some((n) => n.status === "running")
92
+ ? activeRun
93
+ ? "running"
94
+ : record.status
95
+ : work.length
96
+ ? "completed"
97
+ : entered.length && record.status === "completed"
98
+ ? "completed"
99
+ : p.name === current && activeRun
100
+ ? "running"
101
+ : "pending";
102
+ return {
103
+ ...p,
104
+ actors: participants,
105
+ nodes: work,
106
+ completed,
107
+ total: Math.max(work.length, askSites.length),
108
+ status: state,
109
+ rounds: entered.length,
110
+ };
111
+ });
112
+ const published = new Map();
113
+ for (const e of eventValues)
114
+ if (e.type === "artifact-published")
115
+ published.set(e.artifact.id, e.artifact);
116
+ const first = events[0]?.timeCreated;
117
+ const terminal = events
118
+ .filter((e) => e.event.type === "run-settled")
119
+ .at(-1)?.timeCreated;
120
+ return {
121
+ ...record,
122
+ scriptText: undefined,
123
+ ...extras,
124
+ phases: renderedPhases,
125
+ actors,
126
+ nodes: mappedNodes,
127
+ startedAt: first,
128
+ finishedAt:
129
+ record.status === "running"
130
+ ? undefined
131
+ : (terminal ?? events.at(-1)?.timeCreated),
132
+ activePhase: current,
133
+ artifacts: [...published.values()].sort(
134
+ (a, b) => Number(Boolean(b.primary)) - Number(Boolean(a.primary)),
135
+ ),
136
+ reports: nodes
137
+ .filter((n) => n.kind === "report")
138
+ .map((n) => ({ item: n.result, artifactId: n.artifactId })),
139
+ activeActors: new Set(
140
+ mappedNodes
141
+ .filter((n) => n.kind === "ask" && n.status === "running" && activeRun)
142
+ .map((n) => `${n.actorSiteId}@${n.actorOrdinal}`),
143
+ ).size,
144
+ resumable:
145
+ record.status === "stopped" && record.stopReason !== "superseded",
146
+ figures: {
147
+ subagents: actors.length,
148
+ phases: phases.length || undefined,
149
+ tokens:
150
+ Math.max(
151
+ Number(record.spentTokens) || 0,
152
+ nodes.reduce((sum, n) => sum + (Number(n.stats?.tokens) || 0), 0),
153
+ ) || undefined,
154
+ durationMs: first
155
+ ? (terminal ?? events.at(-1)?.timeCreated ?? first) - first
156
+ : undefined,
157
+ },
158
+ };
159
+ }