@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,47 @@
1
+ import type { SiteGraph, SiteLoc } from "./types.js";
2
+ /**
3
+ * The actor graph: a derived, presentation-level view of a {@link SiteGraph} with
4
+ * **actors as nodes and messages as edges**. It is a PURE projection of an
5
+ * already-built site graph (no program/table access); the site graph stays canonical
6
+ * (journal, ordinals, and runtime marks all key off sites) and this view is recovered
7
+ * on demand, the same category as SCC loop-box recovery. An agent-relevance filter
8
+ * keeps the view about collaboration: an edge must touch at least one actor, so
9
+ * endpoint-to-endpoint plumbing is dropped and endpoints left dangling are pruned.
10
+ * Aggregated actor edges also carry the deduped producer artifact types of their
11
+ * contributing site edges as `types` — the message types flowing between the lanes.
12
+ */
13
+ /** A node: an actor lane, or one of the virtual endpoints `source` / `sink` / `workspace`. */
14
+ export interface ActorNode {
15
+ /**
16
+ * An actor-site id (`actor#1`); `"source"` / `"sink"` — the orchestrator's enter
17
+ * and exit roles, kept unmerged so the graph reads as a pipeline; or `"workspace"`.
18
+ */
19
+ id: string;
20
+ name?: string;
21
+ loc?: SiteLoc;
22
+ /** Enclosing promoted fan-out id when the actor site is a lane family (×N). */
23
+ family?: string;
24
+ }
25
+ /** A message edge: aggregated site data-flow between two actor lanes. */
26
+ export interface ActorEdge {
27
+ from: string;
28
+ to: string;
29
+ /** OR over the contributing site edges' exactness (a may-projection forces false). */
30
+ exact: boolean;
31
+ /** How many site data-edges collapsed into this actor edge. */
32
+ count: number;
33
+ /**
34
+ * The producer artifact types carried by the contributing site edges — the message
35
+ * types on this actor edge (provenance: values of these types flow `from` -> `to`).
36
+ * Deduped, in contribution order (site-edge iteration order). Present iff non-empty;
37
+ * contributing edges with no type (e.g. `source` edges) add nothing.
38
+ */
39
+ types?: string[];
40
+ }
41
+ export interface ActorGraph {
42
+ nodes: ActorNode[];
43
+ edges: ActorEdge[];
44
+ }
45
+ /** Project a site graph to its derived actor graph (pure). */
46
+ export declare function toActorGraph(graph: SiteGraph): ActorGraph;
47
+ //# sourceMappingURL=actor-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-graph.d.ts","sourceRoot":"","sources":["../../src/analysis/actor-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAY,MAAM,YAAY,CAAC;AAE/D;;;;;;;;;;GAUG;AAEH,8FAA8F;AAC9F,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,KAAK,EAAE,OAAO,CAAC;IACf,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAMD,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAwFzD"}
@@ -0,0 +1,95 @@
1
+ const SOURCE = "source";
2
+ const SINK = "sink";
3
+ const WORKSPACE = "workspace";
4
+ /** Project a site graph to its derived actor graph (pure). */
5
+ export function toActorGraph(graph) {
6
+ const kindOf = new Map(graph.nodes.map((node) => [node.id, node.kind]));
7
+ const actorsOf = new Map(graph.nodes.filter((node) => node.kind === "ask").map((node) => [node.id, node.actors ?? []]));
8
+ // The lane(s) a site projects onto. The virtual source/sink pass through UNMERGED
9
+ // (two roles of the orchestrator, kept apart so the graph reads as a pipeline
10
+ // rather than a hub with back-edges into its start); world-reads -> the single
11
+ // workspace node; asks -> their actor set (empty when unresolved); join/fan-out
12
+ // relays -> nothing (dropped: additive relay labels guarantee a direct
13
+ // producer -> consumer edge already exists, so no transitive composition is lost).
14
+ const project = (id) => {
15
+ if (id === SOURCE || id === SINK)
16
+ return [id];
17
+ const kind = kindOf.get(id);
18
+ if (kind === "world-read")
19
+ return [WORKSPACE];
20
+ if (kind === "ask")
21
+ return actorsOf.get(id) ?? [];
22
+ return [];
23
+ };
24
+ // Aggregate contributed edges by (from, to): count them, OR their exactness, and
25
+ // collect the deduped producer types in contribution order.
26
+ const agg = new Map();
27
+ const contribute = (from, to, exact, type) => {
28
+ const key = `${from}|${to}`;
29
+ const existing = agg.get(key);
30
+ if (existing === undefined) {
31
+ agg.set(key, { count: 1, exact, from, to, ...(type === undefined ? {} : { types: [type] }) });
32
+ return;
33
+ }
34
+ existing.count += 1;
35
+ existing.exact = existing.exact || exact;
36
+ if (type !== undefined) {
37
+ const types = (existing.types ??= []);
38
+ if (!types.includes(type))
39
+ types.push(type);
40
+ }
41
+ };
42
+ for (const edge of graph.edges) {
43
+ if (edge.kind !== "data")
44
+ continue; // context edges dissolve (same actor = same node)
45
+ // source -> world-read drops: the workspace is itself an origin, not fed by source.
46
+ if (edge.from === SOURCE && kindOf.get(edge.to) === "world-read")
47
+ continue;
48
+ const fromNodes = project(edge.from);
49
+ const toNodes = project(edge.to);
50
+ if (fromNodes.length === 0 || toNodes.length === 0)
51
+ continue; // a relay endpoint: drop
52
+ // A non-singleton (may) projection on either side forces every contributed edge
53
+ // inexact — the ask might run in any of its candidate lanes.
54
+ const exact = edge.exact && fromNodes.length === 1 && toNodes.length === 1;
55
+ for (const from of fromNodes)
56
+ for (const to of toNodes)
57
+ contribute(from, to, exact, edge.type);
58
+ }
59
+ // Agent-relevance filter: an actor edge must touch at least one actor, so
60
+ // endpoint-to-endpoint plumbing (e.g. `workspace -> sink`, a world read flowing
61
+ // untouched into the result) is dropped — honest in the site graph, noise in a
62
+ // collaboration view. We filter the aggregated set (one pass) rather than skipping
63
+ // at contribution, so the rule sits in one place next to the pruning it feeds.
64
+ const isEndpoint = (id) => id === SOURCE || id === SINK || id === WORKSPACE;
65
+ const kept = [...agg.values()].filter((edge) => !(isEndpoint(edge.from) && isEndpoint(edge.to)));
66
+ // Prune any endpoint node the filter (or the projection) leaves with no incident
67
+ // edge — a dangling source/workspace/sink bubble is as noisy as the edge was. Actor
68
+ // nodes always render, even edge-less.
69
+ const incident = new Set();
70
+ for (const edge of kept) {
71
+ incident.add(edge.from);
72
+ incident.add(edge.to);
73
+ }
74
+ // Node order: source first, workspace second, actors in site order (graph.actors is
75
+ // already source-ordered), sink LAST — so `flowchart LR` reads as a pipeline.
76
+ const nodes = [];
77
+ if (incident.has(SOURCE))
78
+ nodes.push({ id: SOURCE });
79
+ if (incident.has(WORKSPACE))
80
+ nodes.push({ id: WORKSPACE });
81
+ for (const actor of graph.actors) {
82
+ nodes.push({
83
+ id: actor.id,
84
+ loc: actor.loc,
85
+ ...(actor.name === undefined ? {} : { name: actor.name }),
86
+ ...(actor.within === undefined ? {} : { family: actor.within }),
87
+ });
88
+ }
89
+ if (incident.has(SINK))
90
+ nodes.push({ id: SINK });
91
+ const position = new Map(nodes.map((node, index) => [node.id, index]));
92
+ const rank = (id) => position.get(id) ?? Number.MAX_SAFE_INTEGER;
93
+ const edges = kept.sort((a, b) => rank(a.from) - rank(b.from) || rank(a.to) - rank(b.to));
94
+ return { edges, nodes };
95
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * 子代理模型的编译期规则(docs/dynamic-workflow/authoring.md「Choosing a model per subagent」;
3
+ * docs/analysis.md「Diagnostics」的 9010 行)。
4
+ *
5
+ * 规则只有一句:**一个脚本能交给子代理的模型名,在运行前就是一个封闭集合**。launch 工具据此在确认窗
6
+ * 之前把每个名字对着宿主的模型目录解析一遍(docs/dynamic-workflow/launch.md「Models the script
7
+ * names」),窗上显示的就是将要生效的模型,解不出来的名字作为 9011 退回、什么都不跑。
8
+ *
9
+ * 集合的两个来源:
10
+ *
11
+ * 1. `model("…")` 调用的实参——必须是非空的无洞字符串字面量(9010)。`ModelRef` 只能由它造出
12
+ * (facade 里是私有构造器 + 私有成员的 class,`new` 与对象字面量都造不出来),所以任何类型为
13
+ * `ModelRef` 的值都来自某一次 `model()`,名字已经在集合里。
14
+ * 2. 每个 `agent(name, persona)` 站点上 persona 的 `model` 属性的**类型**:必须是 `ModelRef`、
15
+ * 字符串字面量类型,或它们的联合(9010)。联合里的每个字面量成员都进集合。
16
+ *
17
+ * 为什么判**类型**而不是判语法上的字面量:`const FLASH = "…"`、`hard ? "a" : "b"`、`MODELS[k]`
18
+ * 这些写法运行期取哪个值不定,但取值集合 checker 已经算好了——按类型判,一条规则就同时覆盖
19
+ * 内联字面量、const 绑定和三目,而一个被拓宽成 `string` 的值(`let`、参数、带洞模板、先装进
20
+ * 变量的 persona 对象)恰好就是集合不封闭的那一类。
21
+ *
22
+ * 为什么内联的 persona 对象字面量要**按语法取 `model` 的初值表达式**再问它的类型,而不是问整个
23
+ * 对象的类型:对象字面量的属性类型在上下文类型不含字面量类型时会被拓宽(`{ model: "x" }` 在
24
+ * `AgentPersona` 的上下文里,属性类型是 `string`),按对象类型判会把最常见的写法误报掉。初值
25
+ * 表达式自己的类型不受这条拓宽影响。
26
+ *
27
+ * 与 actor-names.ts(9005/9006)不同,本诊断**没有运行期兜底**:下游没有第二处去查「一个子代理的
28
+ * model 可能是什么」。宿主在建会话时查不到绑定只会让那一次 ask 大声失败(只有类型断言能走到那
29
+ * 一步),而那已经是确认窗之后了。所以这里宁可多报,不可漏报。
30
+ *
31
+ * 顺带:`ModelRef` 在运行期不存在(lowering 把 `model("x")` 抹成 `"x"`,沙箱里没有这个 class),
32
+ * 所以脚本在**值位置**引用 `ModelRef`(`x instanceof ModelRef`)也在这里以 9010 报出,
33
+ * 而不是留成一个运行期 ReferenceError。
34
+ */
35
+ import type { CompileDiagnostic, WorkflowProgram } from "../compiler/compile.js";
36
+ import { type SiteTable } from "./sites.js";
37
+ /** 模型名不封闭(persona 的 `model` 类型、`model()` 的实参、值位置的 `ModelRef`)。 */
38
+ export declare const MODEL_REFERENCE_CODE = 9010;
39
+ /**
40
+ * 脚本里的模型名在宿主的模型目录里解析不出来(没有、歧义、被停用、档位不对)。**不是**本包产出的
41
+ * 诊断——编译器不知道宿主配了哪些模型——而是 launch 工具(packages/core)在 `resolveInput` 之后
42
+ * 按 {@link ModelReference} 的位置报出来的;码放在这里,好让两处共用一个数、诊断表只有一份。
43
+ */
44
+ export declare const MODEL_UNRESOLVED_CODE = 9011;
45
+ /** 脚本能交给子代理的一个模型名,及它在脚本里出现的一处位置。 */
46
+ export interface ModelReference {
47
+ /** 名字,**逐字**如脚本所写:运行期 persona 里带的就是这个串,launch 的绑定表以它为键。 */
48
+ name: string;
49
+ line: number;
50
+ column: number;
51
+ }
52
+ export interface ActorModels {
53
+ /** 每处出现一条,按发现顺序(`model()` 调用在前,其后是各 `agent()` 站点)。 */
54
+ references: ModelReference[];
55
+ /** 9010;非空即脚本不可提交。 */
56
+ diagnostics: CompileDiagnostic[];
57
+ }
58
+ /** 收集模型名集合与 9010 诊断。只在编译干净的程序上调用。 */
59
+ export declare function collectActorModels(workflow: WorkflowProgram, table: SiteTable): ActorModels;
60
+ //# sourceMappingURL=actor-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-models.d.ts","sourceRoot":"","sources":["../../src/analysis/actor-models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAa,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE5F,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE7E,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,sBAAsB;IACtB,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAmBD,qCAAqC;AACrC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,CA4F3F"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * 子代理模型的编译期规则(docs/dynamic-workflow/authoring.md「Choosing a model per subagent」;
3
+ * docs/analysis.md「Diagnostics」的 9010 行)。
4
+ *
5
+ * 规则只有一句:**一个脚本能交给子代理的模型名,在运行前就是一个封闭集合**。launch 工具据此在确认窗
6
+ * 之前把每个名字对着宿主的模型目录解析一遍(docs/dynamic-workflow/launch.md「Models the script
7
+ * names」),窗上显示的就是将要生效的模型,解不出来的名字作为 9011 退回、什么都不跑。
8
+ *
9
+ * 集合的两个来源:
10
+ *
11
+ * 1. `model("…")` 调用的实参——必须是非空的无洞字符串字面量(9010)。`ModelRef` 只能由它造出
12
+ * (facade 里是私有构造器 + 私有成员的 class,`new` 与对象字面量都造不出来),所以任何类型为
13
+ * `ModelRef` 的值都来自某一次 `model()`,名字已经在集合里。
14
+ * 2. 每个 `agent(name, persona)` 站点上 persona 的 `model` 属性的**类型**:必须是 `ModelRef`、
15
+ * 字符串字面量类型,或它们的联合(9010)。联合里的每个字面量成员都进集合。
16
+ *
17
+ * 为什么判**类型**而不是判语法上的字面量:`const FLASH = "…"`、`hard ? "a" : "b"`、`MODELS[k]`
18
+ * 这些写法运行期取哪个值不定,但取值集合 checker 已经算好了——按类型判,一条规则就同时覆盖
19
+ * 内联字面量、const 绑定和三目,而一个被拓宽成 `string` 的值(`let`、参数、带洞模板、先装进
20
+ * 变量的 persona 对象)恰好就是集合不封闭的那一类。
21
+ *
22
+ * 为什么内联的 persona 对象字面量要**按语法取 `model` 的初值表达式**再问它的类型,而不是问整个
23
+ * 对象的类型:对象字面量的属性类型在上下文类型不含字面量类型时会被拓宽(`{ model: "x" }` 在
24
+ * `AgentPersona` 的上下文里,属性类型是 `string`),按对象类型判会把最常见的写法误报掉。初值
25
+ * 表达式自己的类型不受这条拓宽影响。
26
+ *
27
+ * 与 actor-names.ts(9005/9006)不同,本诊断**没有运行期兜底**:下游没有第二处去查「一个子代理的
28
+ * model 可能是什么」。宿主在建会话时查不到绑定只会让那一次 ask 大声失败(只有类型断言能走到那
29
+ * 一步),而那已经是确认窗之后了。所以这里宁可多报,不可漏报。
30
+ *
31
+ * 顺带:`ModelRef` 在运行期不存在(lowering 把 `model("x")` 抹成 `"x"`,沙箱里没有这个 class),
32
+ * 所以脚本在**值位置**引用 `ModelRef`(`x instanceof ModelRef`)也在这里以 9010 报出,
33
+ * 而不是留成一个运行期 ReferenceError。
34
+ */
35
+ import ts from "typescript";
36
+ import { facadeMemberOf, valueFunctionOfSymbol } from "../facade/registry.js";
37
+ import { findWorkflowBody, resolveSymbol } from "./sites.js";
38
+ /** 模型名不封闭(persona 的 `model` 类型、`model()` 的实参、值位置的 `ModelRef`)。 */
39
+ export const MODEL_REFERENCE_CODE = 9010;
40
+ /**
41
+ * 脚本里的模型名在宿主的模型目录里解析不出来(没有、歧义、被停用、档位不对)。**不是**本包产出的
42
+ * 诊断——编译器不知道宿主配了哪些模型——而是 launch 工具(packages/core)在 `resolveInput` 之后
43
+ * 按 {@link ModelReference} 的位置报出来的;码放在这里,好让两处共用一个数、诊断表只有一份。
44
+ */
45
+ export const MODEL_UNRESOLVED_CODE = 9011;
46
+ /** 被拒的 `model` 值的统一说明:给出三种改法,好让作者一次改对。 */
47
+ const WIDENED_MODEL_MESSAGE = "A subagent's `model` must be known before the run starts: a string literal, a union of " +
48
+ 'string literals, or a ModelRef from model("…"). This value\'s type is {type}, which could ' +
49
+ "be any model name. Write the name inline, add `as const` where it is declared, or declare " +
50
+ "the candidates with model() and choose among those ModelRefs at run time.";
51
+ const MODEL_CALL_MESSAGE = "model() takes the model name as a non-empty string literal (a model id or " +
52
+ '"providerId/modelId", optionally with "$level"): every model a script can use is checked ' +
53
+ "against the configured models before the run starts. Put runtime choices in which ModelRef " +
54
+ "you pass, not in the name.";
55
+ const MODEL_REF_VALUE_MESSAGE = "ModelRef exists only as a type: at run time a ModelRef is its model name. Use it in type " +
56
+ "positions only; compare ModelRefs directly or keep a table keyed by your own choice.";
57
+ /** 收集模型名集合与 9010 诊断。只在编译干净的程序上调用。 */
58
+ export function collectActorModels(workflow, table) {
59
+ const { program, scriptFile, toScriptLoc } = workflow;
60
+ const checker = program.getTypeChecker();
61
+ const references = [];
62
+ const diagnostics = [];
63
+ const locOf = (node) => toScriptLoc(node.getStart(scriptFile));
64
+ const report = (at, message) => {
65
+ const loc = locOf(at);
66
+ diagnostics.push({ code: MODEL_REFERENCE_CODE, column: loc.column, line: loc.line, message });
67
+ };
68
+ const collect = (name, at) => {
69
+ const loc = locOf(at);
70
+ references.push({ column: loc.column, line: loc.line, name });
71
+ };
72
+ // 1. model() 调用与值位置的 ModelRef:一趟走完整个脚本体(含嵌套函数——模型表常在顶层,
73
+ // 但写在 helper 里的 model() 同样在集合里)。
74
+ const walk = (node) => {
75
+ if (ts.isCallExpression(node)) {
76
+ if (valueFunctionOfSymbol(resolveSymbol(node.expression, checker)) === "model") {
77
+ const arg = node.arguments[0];
78
+ if (arg !== undefined && ts.isStringLiteralLike(arg) && arg.text.trim().length > 0) {
79
+ collect(arg.text, arg);
80
+ }
81
+ else {
82
+ report(arg ?? node, MODEL_CALL_MESSAGE);
83
+ }
84
+ }
85
+ }
86
+ else if (ts.isIdentifier(node) && isModelRefClass(resolveSymbol(node, checker))) {
87
+ if (!isTypePosition(node))
88
+ report(node, MODEL_REF_VALUE_MESSAGE);
89
+ }
90
+ ts.forEachChild(node, walk);
91
+ };
92
+ walk(findWorkflowBody(scriptFile));
93
+ // 2. 每个 agent() 站点上 persona 的 model。
94
+ const checkModelValue = (expr, type) => {
95
+ const members = type.isUnion() ? type.types : [type];
96
+ for (const member of members) {
97
+ // 可选属性带进来的 undefined = 「没选模型」,不是一个名字。
98
+ if ((member.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0)
99
+ continue;
100
+ if (isModelRefType(member))
101
+ continue;
102
+ if (member.isStringLiteral()) {
103
+ if (member.value.trim().length > 0) {
104
+ collect(member.value, expr);
105
+ continue;
106
+ }
107
+ }
108
+ report(expr, WIDENED_MODEL_MESSAGE.replace("{type}", `'${checker.typeToString(type)}'`));
109
+ return;
110
+ }
111
+ };
112
+ const checkPersona = (persona) => {
113
+ if (ts.isParenthesizedExpression(persona)) {
114
+ checkPersona(persona.expression);
115
+ return;
116
+ }
117
+ if (ts.isConditionalExpression(persona)) {
118
+ checkPersona(persona.whenTrue);
119
+ checkPersona(persona.whenFalse);
120
+ return;
121
+ }
122
+ if (ts.isObjectLiteralExpression(persona)) {
123
+ const modelExpr = lastModelInitializer(persona);
124
+ if (modelExpr === "spread") {
125
+ checkPersonaType(persona);
126
+ }
127
+ else if (modelExpr !== undefined) {
128
+ checkModelValue(modelExpr, modelValueType(modelExpr, checker));
129
+ }
130
+ return;
131
+ }
132
+ checkPersonaType(persona);
133
+ };
134
+ // 不是内联对象字面量:按实参的类型取 model 属性。字符串 persona(= system prompt)没有 model。
135
+ const checkPersonaType = (persona) => {
136
+ const type = checker.getTypeAtLocation(persona);
137
+ const members = type.isUnion() ? type.types : [type];
138
+ for (const member of members) {
139
+ if ((member.flags & ts.TypeFlags.StringLike) !== 0)
140
+ continue;
141
+ const property = checker.getPropertyOfType(member, "model");
142
+ if (property === undefined)
143
+ continue;
144
+ checkModelValue(persona, checker.getTypeOfSymbolAtLocation(property, persona));
145
+ }
146
+ };
147
+ for (const site of table.actors) {
148
+ const persona = site.call.arguments[1];
149
+ if (persona !== undefined)
150
+ checkPersona(persona);
151
+ }
152
+ return { diagnostics, references };
153
+ }
154
+ /**
155
+ * 内联 persona 字面量里**最后一次**写下的 `model` 的初值表达式。它之后若还有展开,展开可能盖掉它,
156
+ * 回 `"spread"` 交给按类型的判定;从没写过 `model` 但有展开时同样回 `"spread"`;两者都没有即 undefined。
157
+ */
158
+ function lastModelInitializer(literal) {
159
+ let found;
160
+ for (const property of literal.properties) {
161
+ if (ts.isSpreadAssignment(property)) {
162
+ found = "spread";
163
+ }
164
+ else if (ts.isPropertyAssignment(property) && propertyNameText(property.name) === "model") {
165
+ found = property.initializer;
166
+ }
167
+ else if (ts.isShorthandPropertyAssignment(property) && property.name.text === "model") {
168
+ found = property.name;
169
+ }
170
+ }
171
+ return found;
172
+ }
173
+ /** 初值表达式自己的类型(不经对象字面量的属性拓宽);shorthand `{ model }` 取被引用绑定的类型。 */
174
+ function modelValueType(expr, checker) {
175
+ const parent = expr.parent;
176
+ if (ts.isShorthandPropertyAssignment(parent) && parent.name === expr) {
177
+ const value = checker.getShorthandAssignmentValueSymbol(parent);
178
+ if (value !== undefined)
179
+ return checker.getTypeOfSymbolAtLocation(value, expr);
180
+ }
181
+ return checker.getTypeAtLocation(expr);
182
+ }
183
+ function propertyNameText(name) {
184
+ if (ts.isIdentifier(name) || ts.isStringLiteralLike(name) || ts.isNumericLiteral(name)) {
185
+ return name.text;
186
+ }
187
+ return undefined;
188
+ }
189
+ /** facade 里的 `ModelRef` class 符号。 */
190
+ function isModelRefClass(symbol) {
191
+ const member = facadeMemberOf(symbol);
192
+ return (member !== undefined &&
193
+ member.container === undefined &&
194
+ member.member === "ModelRef" &&
195
+ symbol !== undefined &&
196
+ (symbol.flags & ts.SymbolFlags.Class) !== 0);
197
+ }
198
+ /** 这个类型就是 facade 的 `ModelRef`(它的实例类型)。 */
199
+ function isModelRefType(type) {
200
+ return isModelRefClass(type.getSymbol());
201
+ }
202
+ /** 标识符处在类型位置(`x: ModelRef`、`typeof ModelRef`、`A.ModelRef` 的限定名链上)。 */
203
+ function isTypePosition(node) {
204
+ let parent = node.parent;
205
+ while (ts.isQualifiedName(parent))
206
+ parent = parent.parent;
207
+ return ts.isTypeReferenceNode(parent) || ts.isTypeQueryNode(parent);
208
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 具名 actor 重名的编译期 courtesy 诊断。
3
+ *
4
+ * 规则本身是**运行期**的:引擎在 createActor 查非空有效名的重复,撞上即 run 级失败
5
+ * (`DuplicateActorName`)。理由是具名 actor 是修订续跑(amend-resume)缓存导入的身份键,
6
+ * 而任何 run 都是未来修订的潜在前驱——前驱里重名会让导入匹配歧义。
7
+ *
8
+ * 这里做**字面量能看穿的那一半**,两条子句:
9
+ *
10
+ * 1. **两处同名**:两个 `agent(...)` 站点的有效名是同一个字符串字面量时,在后一处报一条可
11
+ * 定位的诊断,让作者在便宜的那一侧改名,而不是跑到一半失败。任何动态成分
12
+ * (`` `worker-${i}` ``、标识符、展开、shorthand 属性)一律跳过——那些只有运行期能查。
13
+ * 2. **fan-out 里的静态名**:一个 `agent("x")` 站点跑在 fan-out 体内时,每个元素都建一个新
14
+ * actor 而它们共用同一个名字——一个站点,N 次重名,运行期必然大声失败。
15
+ *
16
+ * 子句 1 **只会漏报、不会误报**:跳过一个可能重名的站点没有代价(引擎兜底),而误伤一个
17
+ * 合法脚本会挡住提交。
18
+ *
19
+ * `.map` 的集合可能只有 ≤1 个
20
+ * 元素,那样的脚本在运行期其实合法,所以这条子句理论上会误报。接受它的理由是代价不对称——
21
+ * 修复是免费的(改成逐元素名 `` `x-${item}` `` 或匿名),而不报的代价是模型烧掉一整个 run
22
+ * 才学到这条规则。`paths.map((p) => agent("reviewer").ask(…))` 正是 fan-out 的教科书写法,
23
+ * 沉默地留给运行期是最坏的一档。
24
+ *
25
+ * fan-out 的判定**复用站点表的分类**(`analysis/sites.ts` 的 `IterationCandidate`:带内联
26
+ * 回调的数组方法 + `for...of`),不自己再造一套循环识别。代价是普通 `for` / `while` /
27
+ * `do` 循环不在那张分类里,因而不被本子句覆盖——它们回落到子句 1 的老姿态(看不见,归运行期)。
28
+ * 那正是漏报方向,与本模块的保守取向一致。
29
+ *
30
+ * `CreateWorkflow` 与
31
+ * `SaveWorkflow` 两个 handler 都先走 `analyzeScript`(本诊断在 `analyzeWorkflowScript` 的
32
+ * authoring 批次里),`!ok` 即带诊断早返回、**不 submit / 不落盘**,所以一条 9005/9006 确实
33
+ * 挡住提交与保存。但 run service 的 `compileOnce`(submit 与 resume 的重编译)只复验
34
+ * typecheck / schema / world.run 字面量三项,**不含**本诊断——所以它不是 submit 路径上的
35
+ * 强制门,别把它当承重结构:具名唯一性的权威始终是引擎 createActor 的运行期查重。
36
+ */
37
+ import type { CompileDiagnostic, WorkflowProgram } from "../compiler/compile.js";
38
+ import type { SiteTable } from "./sites.js";
39
+ /** 两处字面量同名(子句 1)。9001 = facade-siting、9002 = schema、9003 = world-run、9004 = phase。 */
40
+ export declare const DUPLICATE_ACTOR_NAME_CODE = 9005;
41
+ /**
42
+ * fan-out 体内的静态名(子句 2),单独一个码而不是复用 9005。
43
+ *
44
+ * 两条子句是同一条规则,但**确定性不同**:9005 只在静态确定重名时出现,9006 是上面那条刻意
45
+ * 接受误报的子句。读端因此需要能区分它们——特别是分析侧的 fixture 语料:
46
+ * 那些脚本从不执行,只用来钉图形状,其中静态名 + fan-out 的组合恰恰是**分析器必须正确处理**
47
+ * 的形状(`ActorNode.family`、actor 标签),所以语料要豁免 9006 而对 9005 保持严格。
48
+ * 共用一个码就只能靠匹配 message 文本来区分,而按错误文本分流正是本仓库处处禁止的。
49
+ */
50
+ export declare const FANOUT_ACTOR_NAME_CODE = 9006;
51
+ /**
52
+ * 收集字面量重名诊断。非空即脚本不可提交(`analyzeWorkflowScript` 与 world.run / phase
53
+ * 的编译期规则同席)。
54
+ */
55
+ export declare function collectDuplicateActorNames(workflow: WorkflowProgram, table: SiteTable): CompileDiagnostic[];
56
+ //# sourceMappingURL=actor-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-names.d.ts","sourceRoot":"","sources":["../../src/analysis/actor-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,sFAAsF;AACtF,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,SAAS,GACf,iBAAiB,EAAE,CAgDrB"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * 具名 actor 重名的编译期 courtesy 诊断。
3
+ *
4
+ * 规则本身是**运行期**的:引擎在 createActor 查非空有效名的重复,撞上即 run 级失败
5
+ * (`DuplicateActorName`)。理由是具名 actor 是修订续跑(amend-resume)缓存导入的身份键,
6
+ * 而任何 run 都是未来修订的潜在前驱——前驱里重名会让导入匹配歧义。
7
+ *
8
+ * 这里做**字面量能看穿的那一半**,两条子句:
9
+ *
10
+ * 1. **两处同名**:两个 `agent(...)` 站点的有效名是同一个字符串字面量时,在后一处报一条可
11
+ * 定位的诊断,让作者在便宜的那一侧改名,而不是跑到一半失败。任何动态成分
12
+ * (`` `worker-${i}` ``、标识符、展开、shorthand 属性)一律跳过——那些只有运行期能查。
13
+ * 2. **fan-out 里的静态名**:一个 `agent("x")` 站点跑在 fan-out 体内时,每个元素都建一个新
14
+ * actor 而它们共用同一个名字——一个站点,N 次重名,运行期必然大声失败。
15
+ *
16
+ * 子句 1 **只会漏报、不会误报**:跳过一个可能重名的站点没有代价(引擎兜底),而误伤一个
17
+ * 合法脚本会挡住提交。
18
+ *
19
+ * `.map` 的集合可能只有 ≤1 个
20
+ * 元素,那样的脚本在运行期其实合法,所以这条子句理论上会误报。接受它的理由是代价不对称——
21
+ * 修复是免费的(改成逐元素名 `` `x-${item}` `` 或匿名),而不报的代价是模型烧掉一整个 run
22
+ * 才学到这条规则。`paths.map((p) => agent("reviewer").ask(…))` 正是 fan-out 的教科书写法,
23
+ * 沉默地留给运行期是最坏的一档。
24
+ *
25
+ * fan-out 的判定**复用站点表的分类**(`analysis/sites.ts` 的 `IterationCandidate`:带内联
26
+ * 回调的数组方法 + `for...of`),不自己再造一套循环识别。代价是普通 `for` / `while` /
27
+ * `do` 循环不在那张分类里,因而不被本子句覆盖——它们回落到子句 1 的老姿态(看不见,归运行期)。
28
+ * 那正是漏报方向,与本模块的保守取向一致。
29
+ *
30
+ * `CreateWorkflow` 与
31
+ * `SaveWorkflow` 两个 handler 都先走 `analyzeScript`(本诊断在 `analyzeWorkflowScript` 的
32
+ * authoring 批次里),`!ok` 即带诊断早返回、**不 submit / 不落盘**,所以一条 9005/9006 确实
33
+ * 挡住提交与保存。但 run service 的 `compileOnce`(submit 与 resume 的重编译)只复验
34
+ * typecheck / schema / world.run 字面量三项,**不含**本诊断——所以它不是 submit 路径上的
35
+ * 强制门,别把它当承重结构:具名唯一性的权威始终是引擎 createActor 的运行期查重。
36
+ */
37
+ import ts from "typescript";
38
+ /** 两处字面量同名(子句 1)。9001 = facade-siting、9002 = schema、9003 = world-run、9004 = phase。 */
39
+ export const DUPLICATE_ACTOR_NAME_CODE = 9005;
40
+ /**
41
+ * fan-out 体内的静态名(子句 2),单独一个码而不是复用 9005。
42
+ *
43
+ * 两条子句是同一条规则,但**确定性不同**:9005 只在静态确定重名时出现,9006 是上面那条刻意
44
+ * 接受误报的子句。读端因此需要能区分它们——特别是分析侧的 fixture 语料:
45
+ * 那些脚本从不执行,只用来钉图形状,其中静态名 + fan-out 的组合恰恰是**分析器必须正确处理**
46
+ * 的形状(`ActorNode.family`、actor 标签),所以语料要豁免 9006 而对 9005 保持严格。
47
+ * 共用一个码就只能靠匹配 message 文本来区分,而按错误文本分流正是本仓库处处禁止的。
48
+ */
49
+ export const FANOUT_ACTOR_NAME_CODE = 9006;
50
+ /**
51
+ * 收集字面量重名诊断。非空即脚本不可提交(`analyzeWorkflowScript` 与 world.run / phase
52
+ * 的编译期规则同席)。
53
+ */
54
+ export function collectDuplicateActorNames(workflow, table) {
55
+ const diagnostics = [];
56
+ const claimed = new Map();
57
+ // fan-out 体的集合来自站点表的 IterationCandidate(数组方法的内联回调体 + for...of 的
58
+ // 循环体),与 `ActorNode.fanOutId` 判定「站点是否落在 fan-out 体内」用的是同一个概念。
59
+ const fanOutBodies = new Set(table.iterations.map((iteration) => iteration.body));
60
+ for (const site of table.actors) {
61
+ // 站点表的 `site.name` 在这里**用不得**:它会退回到绑定名(`const planner = agent()`
62
+ // 记作 "planner"),那是给图用的展示标签,不是运行期的有效名。这里要的是引擎会看见的
63
+ // 那个值,所以自己从实参读。
64
+ const name = staticEffectiveName(site.call);
65
+ if (name === undefined || name === "")
66
+ continue;
67
+ const first = claimed.get(name);
68
+ if (first === undefined)
69
+ claimed.set(name, site.call);
70
+ const loc = workflow.toScriptLoc(site.call.getStart(workflow.scriptFile));
71
+ // 一个站点最多报一条:fan-out 子句更具体(它连修法都不同——逐元素名而不是换个名字),
72
+ // 所以它优先。名字仍照常登记,后面同名的站点该报还报。
73
+ if (isInsideFanOut(site.call, fanOutBodies)) {
74
+ diagnostics.push({
75
+ code: FANOUT_ACTOR_NAME_CODE,
76
+ column: loc.column,
77
+ line: loc.line,
78
+ message: `this agent(...) runs once per element of a fan-out but its name "${name}" is a fixed ` +
79
+ `string, so every element creates a different actor under the same name — the run ` +
80
+ `fails with DuplicateActorName as soon as the collection holds more than one item. ` +
81
+ `An actor name must be unique within a run: it is the identity key an amended re-run ` +
82
+ `matches its imported cache against. Build a per-element name (\`${name}-\${item}\`), ` +
83
+ `or drop the name — anonymous actors are legal (they just never reuse cached work).`,
84
+ });
85
+ continue;
86
+ }
87
+ if (first === undefined)
88
+ continue;
89
+ // 诊断落在**后一处**:先出现的那个名字是既有事实,要改的是后来的这一个。
90
+ const firstLoc = workflow.toScriptLoc(first.getStart(workflow.scriptFile));
91
+ diagnostics.push({
92
+ code: DUPLICATE_ACTOR_NAME_CODE,
93
+ column: loc.column,
94
+ line: loc.line,
95
+ message: `two actors are named "${name}" (the first is on line ${firstLoc.line}): an actor name ` +
96
+ `must be unique within a run. The name is the identity key an amended re-run matches ` +
97
+ `its imported cache against, and any run can become the predecessor of one, so a ` +
98
+ `repeated name makes that match ambiguous. Give this one its own name, or drop the ` +
99
+ `name entirely — anonymous actors are legal (they just never reuse cached work).`,
100
+ });
101
+ }
102
+ return diagnostics;
103
+ }
104
+ /**
105
+ * 该调用是否**词法上**落在某个 fan-out 体内。从调用本身起走父链(调用可以就是体本身:
106
+ * `paths.map((p) => agent("x"))` 的箭头简写体),命中任一候选体即是。
107
+ */
108
+ function isInsideFanOut(call, fanOutBodies) {
109
+ for (let node = call; node !== undefined; node = node.parent) {
110
+ if (fanOutBodies.has(node))
111
+ return true;
112
+ }
113
+ return false;
114
+ }
115
+ /**
116
+ * 一个 `agent(...)` 调用静态可知的**有效名**,否则 undefined(= 跳过)。
117
+ *
118
+ * 与引擎的 `normalizePersona` 同一条规则:persona.name 压过 name 实参;字符串 persona 是
119
+ * system prompt、不带名字。任何一处看不穿就整体放弃——宁可漏报。
120
+ *
121
+ * facade 的 `AgentPersona` **今天不声明 name**,所以脚本写得出的 persona 从不带名字,有效名
122
+ * 一律落到 name 实参。persona 这一段因此现在从不触发;留着是为了与 normalizePersona 同步,
123
+ * 而不是为了今天生效——一旦 facade 长出 name 而这里还按 name 实参判定,一个被 persona 改过名
124
+ * 的 actor 就会被**误报**,而误报会挡住合法脚本(漏报没有代价:引擎运行期兜底)。
125
+ */
126
+ function staticEffectiveName(call) {
127
+ const [nameArg, personaArg] = call.arguments;
128
+ if (personaArg !== undefined && !ts.isStringLiteralLike(personaArg)) {
129
+ if (!ts.isObjectLiteralExpression(personaArg))
130
+ return undefined; // 动态 persona:可能带 name
131
+ for (const property of personaArg.properties) {
132
+ // 展开可能带进一个 name,静态说不准。
133
+ if (ts.isSpreadAssignment(property))
134
+ return undefined;
135
+ // 计算键(`{ ["na" + "me"]: … }`)也说不准:它**可能就是** name。这里必须整体放弃而
136
+ // 不是 `continue`——continue 会落回 name 实参,等于断言 persona 没有改名,那是一次
137
+ // 猜测,而猜错的方向恰好是误报(挡住合法脚本)。
138
+ if (property.name !== undefined && ts.isComputedPropertyName(property.name))
139
+ return undefined;
140
+ if (property.name === undefined || !isNameKey(property.name))
141
+ continue;
142
+ if (!ts.isPropertyAssignment(property))
143
+ return undefined; // shorthand / 方法:动态
144
+ return ts.isStringLiteralLike(property.initializer)
145
+ ? property.initializer.text
146
+ : undefined;
147
+ }
148
+ // 对象字面量里没有 name,落回 name 实参。
149
+ }
150
+ return nameArg !== undefined && ts.isStringLiteralLike(nameArg) ? nameArg.text : undefined;
151
+ }
152
+ /** 属性键是否**静态确定**就是 `name`(计算键在调用点已整体放弃,不走这里)。 */
153
+ function isNameKey(key) {
154
+ return (ts.isIdentifier(key) || ts.isStringLiteralLike(key)) && key.text === "name";
155
+ }