groundswell 0.0.3 → 1.0.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 (292) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -9
  3. package/dist/cache/cache-key.d.ts +20 -0
  4. package/dist/cache/cache-key.d.ts.map +1 -1
  5. package/dist/cache/cache-key.js +9 -0
  6. package/dist/cache/cache-key.js.map +1 -1
  7. package/dist/core/agent.d.ts +120 -29
  8. package/dist/core/agent.d.ts.map +1 -1
  9. package/dist/core/agent.js +584 -177
  10. package/dist/core/agent.js.map +1 -1
  11. package/dist/core/mcp-handler.d.ts +63 -5
  12. package/dist/core/mcp-handler.d.ts.map +1 -1
  13. package/dist/core/mcp-handler.js +184 -4
  14. package/dist/core/mcp-handler.js.map +1 -1
  15. package/dist/core/workflow-context.d.ts +6 -2
  16. package/dist/core/workflow-context.d.ts.map +1 -1
  17. package/dist/core/workflow-context.js +99 -4
  18. package/dist/core/workflow-context.js.map +1 -1
  19. package/dist/core/workflow.d.ts +315 -13
  20. package/dist/core/workflow.d.ts.map +1 -1
  21. package/dist/core/workflow.js +552 -30
  22. package/dist/core/workflow.js.map +1 -1
  23. package/dist/debugger/event-replayer.d.ts +422 -0
  24. package/dist/debugger/event-replayer.d.ts.map +1 -0
  25. package/dist/debugger/event-replayer.js +639 -0
  26. package/dist/debugger/event-replayer.js.map +1 -0
  27. package/dist/debugger/tree-debugger.d.ts +170 -1
  28. package/dist/debugger/tree-debugger.d.ts.map +1 -1
  29. package/dist/debugger/tree-debugger.js +423 -1
  30. package/dist/debugger/tree-debugger.js.map +1 -1
  31. package/dist/decorators/step.d.ts.map +1 -1
  32. package/dist/decorators/step.js +129 -47
  33. package/dist/decorators/step.js.map +1 -1
  34. package/dist/harnesses/claude-code-harness.d.ts +391 -0
  35. package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
  36. package/dist/harnesses/claude-code-harness.js +1076 -0
  37. package/dist/harnesses/claude-code-harness.js.map +1 -0
  38. package/dist/harnesses/harness-registry.d.ts +440 -0
  39. package/dist/harnesses/harness-registry.d.ts.map +1 -0
  40. package/dist/harnesses/harness-registry.js +543 -0
  41. package/dist/harnesses/harness-registry.js.map +1 -0
  42. package/dist/harnesses/index.d.ts +12 -0
  43. package/dist/harnesses/index.d.ts.map +1 -0
  44. package/dist/harnesses/index.js +11 -0
  45. package/dist/harnesses/index.js.map +1 -0
  46. package/dist/harnesses/pi-harness.d.ts +219 -0
  47. package/dist/harnesses/pi-harness.d.ts.map +1 -0
  48. package/dist/harnesses/pi-harness.js +676 -0
  49. package/dist/harnesses/pi-harness.js.map +1 -0
  50. package/dist/harnesses/pi-schema-converter.d.ts +24 -0
  51. package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
  52. package/dist/harnesses/pi-schema-converter.js +81 -0
  53. package/dist/harnesses/pi-schema-converter.js.map +1 -0
  54. package/dist/harnesses/register-defaults.d.ts +24 -0
  55. package/dist/harnesses/register-defaults.d.ts.map +1 -0
  56. package/dist/harnesses/register-defaults.js +40 -0
  57. package/dist/harnesses/register-defaults.js.map +1 -0
  58. package/dist/harnesses/session-store.d.ts +201 -0
  59. package/dist/harnesses/session-store.d.ts.map +1 -0
  60. package/dist/harnesses/session-store.js +254 -0
  61. package/dist/harnesses/session-store.js.map +1 -0
  62. package/dist/index.d.ts +12 -2
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +17 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/reflection/reflection.d.ts.map +1 -1
  67. package/dist/reflection/reflection.js +19 -4
  68. package/dist/reflection/reflection.js.map +1 -1
  69. package/dist/types/agent.d.ts +1253 -2
  70. package/dist/types/agent.d.ts.map +1 -1
  71. package/dist/types/agent.js +418 -1
  72. package/dist/types/agent.js.map +1 -1
  73. package/dist/types/decorators.d.ts +10 -1
  74. package/dist/types/decorators.d.ts.map +1 -1
  75. package/dist/types/events.d.ts +26 -0
  76. package/dist/types/events.d.ts.map +1 -1
  77. package/dist/types/harnesses.d.ts +474 -0
  78. package/dist/types/harnesses.d.ts.map +1 -0
  79. package/dist/types/harnesses.js +2 -0
  80. package/dist/types/harnesses.js.map +1 -0
  81. package/dist/types/index.d.ts +9 -1
  82. package/dist/types/index.d.ts.map +1 -1
  83. package/dist/types/index.js +6 -0
  84. package/dist/types/index.js.map +1 -1
  85. package/dist/types/providers.d.ts +691 -0
  86. package/dist/types/providers.d.ts.map +1 -0
  87. package/dist/types/providers.js +14 -0
  88. package/dist/types/providers.js.map +1 -0
  89. package/dist/types/restart.d.ts +132 -0
  90. package/dist/types/restart.d.ts.map +1 -0
  91. package/dist/types/restart.js +2 -0
  92. package/dist/types/restart.js.map +1 -0
  93. package/dist/types/streaming.d.ts +194 -0
  94. package/dist/types/streaming.d.ts.map +1 -0
  95. package/dist/types/streaming.js +67 -0
  96. package/dist/types/streaming.js.map +1 -0
  97. package/dist/types/workflow-context.d.ts +137 -1
  98. package/dist/types/workflow-context.d.ts.map +1 -1
  99. package/dist/utils/agent-validation.d.ts +88 -0
  100. package/dist/utils/agent-validation.d.ts.map +1 -0
  101. package/dist/utils/agent-validation.js +87 -0
  102. package/dist/utils/agent-validation.js.map +1 -0
  103. package/dist/utils/delay.d.ts +7 -0
  104. package/dist/utils/delay.d.ts.map +1 -0
  105. package/dist/utils/delay.js +9 -0
  106. package/dist/utils/delay.js.map +1 -0
  107. package/dist/utils/harness-config.d.ts +180 -0
  108. package/dist/utils/harness-config.d.ts.map +1 -0
  109. package/dist/utils/harness-config.js +311 -0
  110. package/dist/utils/harness-config.js.map +1 -0
  111. package/dist/utils/index.d.ts +9 -1
  112. package/dist/utils/index.d.ts.map +1 -1
  113. package/dist/utils/index.js +8 -1
  114. package/dist/utils/index.js.map +1 -1
  115. package/dist/utils/model-spec.d.ts +110 -0
  116. package/dist/utils/model-spec.d.ts.map +1 -0
  117. package/dist/utils/model-spec.js +149 -0
  118. package/dist/utils/model-spec.js.map +1 -0
  119. package/dist/utils/provider-config.d.ts +10 -0
  120. package/dist/utils/provider-config.d.ts.map +1 -0
  121. package/dist/utils/provider-config.js +10 -0
  122. package/dist/utils/provider-config.js.map +1 -0
  123. package/dist/utils/restart-analysis.d.ts +202 -0
  124. package/dist/utils/restart-analysis.d.ts.map +1 -0
  125. package/dist/utils/restart-analysis.js +426 -0
  126. package/dist/utils/restart-analysis.js.map +1 -0
  127. package/dist/utils/session-serialization.d.ts +118 -0
  128. package/dist/utils/session-serialization.d.ts.map +1 -0
  129. package/dist/utils/session-serialization.js +217 -0
  130. package/dist/utils/session-serialization.js.map +1 -0
  131. package/package.json +31 -5
  132. package/CHANGELOG.md +0 -188
  133. package/dist/__tests__/adversarial/attachChild-performance.test.d.ts +0 -16
  134. package/dist/__tests__/adversarial/attachChild-performance.test.d.ts.map +0 -1
  135. package/dist/__tests__/adversarial/attachChild-performance.test.js +0 -187
  136. package/dist/__tests__/adversarial/attachChild-performance.test.js.map +0 -1
  137. package/dist/__tests__/adversarial/circular-reference.test.d.ts +0 -13
  138. package/dist/__tests__/adversarial/circular-reference.test.d.ts.map +0 -1
  139. package/dist/__tests__/adversarial/circular-reference.test.js +0 -92
  140. package/dist/__tests__/adversarial/circular-reference.test.js.map +0 -1
  141. package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts +0 -16
  142. package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts.map +0 -1
  143. package/dist/__tests__/adversarial/complex-circular-reference.test.js +0 -127
  144. package/dist/__tests__/adversarial/complex-circular-reference.test.js.map +0 -1
  145. package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts +0 -21
  146. package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts.map +0 -1
  147. package/dist/__tests__/adversarial/concurrent-task-failures.test.js +0 -667
  148. package/dist/__tests__/adversarial/concurrent-task-failures.test.js.map +0 -1
  149. package/dist/__tests__/adversarial/deep-analysis.test.d.ts +0 -6
  150. package/dist/__tests__/adversarial/deep-analysis.test.d.ts.map +0 -1
  151. package/dist/__tests__/adversarial/deep-analysis.test.js +0 -877
  152. package/dist/__tests__/adversarial/deep-analysis.test.js.map +0 -1
  153. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts +0 -13
  154. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts.map +0 -1
  155. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js +0 -186
  156. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js.map +0 -1
  157. package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts +0 -6
  158. package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts.map +0 -1
  159. package/dist/__tests__/adversarial/e2e-prd-validation.test.js +0 -626
  160. package/dist/__tests__/adversarial/e2e-prd-validation.test.js.map +0 -1
  161. package/dist/__tests__/adversarial/edge-case.test.d.ts +0 -6
  162. package/dist/__tests__/adversarial/edge-case.test.d.ts.map +0 -1
  163. package/dist/__tests__/adversarial/edge-case.test.js +0 -857
  164. package/dist/__tests__/adversarial/edge-case.test.js.map +0 -1
  165. package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts +0 -20
  166. package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts.map +0 -1
  167. package/dist/__tests__/adversarial/error-merge-strategy.test.js +0 -907
  168. package/dist/__tests__/adversarial/error-merge-strategy.test.js.map +0 -1
  169. package/dist/__tests__/adversarial/incremental-performance.test.d.ts +0 -2
  170. package/dist/__tests__/adversarial/incremental-performance.test.d.ts.map +0 -1
  171. package/dist/__tests__/adversarial/incremental-performance.test.js +0 -113
  172. package/dist/__tests__/adversarial/incremental-performance.test.js.map +0 -1
  173. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts +0 -22
  174. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts.map +0 -1
  175. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js +0 -383
  176. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js.map +0 -1
  177. package/dist/__tests__/adversarial/observer-propagation.test.d.ts +0 -21
  178. package/dist/__tests__/adversarial/observer-propagation.test.d.ts.map +0 -1
  179. package/dist/__tests__/adversarial/observer-propagation.test.js +0 -404
  180. package/dist/__tests__/adversarial/observer-propagation.test.js.map +0 -1
  181. package/dist/__tests__/adversarial/parent-validation.test.d.ts +0 -13
  182. package/dist/__tests__/adversarial/parent-validation.test.d.ts.map +0 -1
  183. package/dist/__tests__/adversarial/parent-validation.test.js +0 -128
  184. package/dist/__tests__/adversarial/parent-validation.test.js.map +0 -1
  185. package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts +0 -20
  186. package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts.map +0 -1
  187. package/dist/__tests__/adversarial/prd-12-2-compliance.test.js +0 -482
  188. package/dist/__tests__/adversarial/prd-12-2-compliance.test.js.map +0 -1
  189. package/dist/__tests__/adversarial/prd-compliance.test.d.ts +0 -6
  190. package/dist/__tests__/adversarial/prd-compliance.test.d.ts.map +0 -1
  191. package/dist/__tests__/adversarial/prd-compliance.test.js +0 -886
  192. package/dist/__tests__/adversarial/prd-compliance.test.js.map +0 -1
  193. package/dist/__tests__/compatibility/backward-compatibility.test.d.ts +0 -22
  194. package/dist/__tests__/compatibility/backward-compatibility.test.d.ts.map +0 -1
  195. package/dist/__tests__/compatibility/backward-compatibility.test.js +0 -1843
  196. package/dist/__tests__/compatibility/backward-compatibility.test.js.map +0 -1
  197. package/dist/__tests__/helpers/index.d.ts +0 -10
  198. package/dist/__tests__/helpers/index.d.ts.map +0 -1
  199. package/dist/__tests__/helpers/index.js +0 -10
  200. package/dist/__tests__/helpers/index.js.map +0 -1
  201. package/dist/__tests__/helpers/tree-verification.d.ts +0 -90
  202. package/dist/__tests__/helpers/tree-verification.d.ts.map +0 -1
  203. package/dist/__tests__/helpers/tree-verification.js +0 -202
  204. package/dist/__tests__/helpers/tree-verification.js.map +0 -1
  205. package/dist/__tests__/integration/agent-workflow.test.d.ts +0 -2
  206. package/dist/__tests__/integration/agent-workflow.test.d.ts.map +0 -1
  207. package/dist/__tests__/integration/agent-workflow.test.js +0 -256
  208. package/dist/__tests__/integration/agent-workflow.test.js.map +0 -1
  209. package/dist/__tests__/integration/bidirectional-consistency.test.d.ts +0 -14
  210. package/dist/__tests__/integration/bidirectional-consistency.test.d.ts.map +0 -1
  211. package/dist/__tests__/integration/bidirectional-consistency.test.js +0 -668
  212. package/dist/__tests__/integration/bidirectional-consistency.test.js.map +0 -1
  213. package/dist/__tests__/integration/observer-logging.test.d.ts +0 -2
  214. package/dist/__tests__/integration/observer-logging.test.d.ts.map +0 -1
  215. package/dist/__tests__/integration/observer-logging.test.js +0 -517
  216. package/dist/__tests__/integration/observer-logging.test.js.map +0 -1
  217. package/dist/__tests__/integration/tree-mirroring.test.d.ts +0 -2
  218. package/dist/__tests__/integration/tree-mirroring.test.d.ts.map +0 -1
  219. package/dist/__tests__/integration/tree-mirroring.test.js +0 -117
  220. package/dist/__tests__/integration/tree-mirroring.test.js.map +0 -1
  221. package/dist/__tests__/integration/workflow-reparenting.test.d.ts +0 -12
  222. package/dist/__tests__/integration/workflow-reparenting.test.d.ts.map +0 -1
  223. package/dist/__tests__/integration/workflow-reparenting.test.js +0 -239
  224. package/dist/__tests__/integration/workflow-reparenting.test.js.map +0 -1
  225. package/dist/__tests__/unit/agent.test.d.ts +0 -2
  226. package/dist/__tests__/unit/agent.test.d.ts.map +0 -1
  227. package/dist/__tests__/unit/agent.test.js +0 -143
  228. package/dist/__tests__/unit/agent.test.js.map +0 -1
  229. package/dist/__tests__/unit/cache-key.test.d.ts +0 -5
  230. package/dist/__tests__/unit/cache-key.test.d.ts.map +0 -1
  231. package/dist/__tests__/unit/cache-key.test.js +0 -145
  232. package/dist/__tests__/unit/cache-key.test.js.map +0 -1
  233. package/dist/__tests__/unit/cache.test.d.ts +0 -5
  234. package/dist/__tests__/unit/cache.test.d.ts.map +0 -1
  235. package/dist/__tests__/unit/cache.test.js +0 -132
  236. package/dist/__tests__/unit/cache.test.js.map +0 -1
  237. package/dist/__tests__/unit/context.test.d.ts +0 -2
  238. package/dist/__tests__/unit/context.test.d.ts.map +0 -1
  239. package/dist/__tests__/unit/context.test.js +0 -220
  240. package/dist/__tests__/unit/context.test.js.map +0 -1
  241. package/dist/__tests__/unit/decorators.test.d.ts +0 -2
  242. package/dist/__tests__/unit/decorators.test.d.ts.map +0 -1
  243. package/dist/__tests__/unit/decorators.test.js +0 -162
  244. package/dist/__tests__/unit/decorators.test.js.map +0 -1
  245. package/dist/__tests__/unit/introspection-tools.test.d.ts +0 -5
  246. package/dist/__tests__/unit/introspection-tools.test.d.ts.map +0 -1
  247. package/dist/__tests__/unit/introspection-tools.test.js +0 -191
  248. package/dist/__tests__/unit/introspection-tools.test.js.map +0 -1
  249. package/dist/__tests__/unit/logger.test.d.ts +0 -2
  250. package/dist/__tests__/unit/logger.test.d.ts.map +0 -1
  251. package/dist/__tests__/unit/logger.test.js +0 -241
  252. package/dist/__tests__/unit/logger.test.js.map +0 -1
  253. package/dist/__tests__/unit/observable.test.d.ts +0 -2
  254. package/dist/__tests__/unit/observable.test.d.ts.map +0 -1
  255. package/dist/__tests__/unit/observable.test.js +0 -251
  256. package/dist/__tests__/unit/observable.test.js.map +0 -1
  257. package/dist/__tests__/unit/prompt.test.d.ts +0 -2
  258. package/dist/__tests__/unit/prompt.test.d.ts.map +0 -1
  259. package/dist/__tests__/unit/prompt.test.js +0 -113
  260. package/dist/__tests__/unit/prompt.test.js.map +0 -1
  261. package/dist/__tests__/unit/reflection.test.d.ts +0 -5
  262. package/dist/__tests__/unit/reflection.test.d.ts.map +0 -1
  263. package/dist/__tests__/unit/reflection.test.js +0 -160
  264. package/dist/__tests__/unit/reflection.test.js.map +0 -1
  265. package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts +0 -2
  266. package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts.map +0 -1
  267. package/dist/__tests__/unit/tree-debugger-incremental.test.js +0 -136
  268. package/dist/__tests__/unit/tree-debugger-incremental.test.js.map +0 -1
  269. package/dist/__tests__/unit/tree-debugger.test.d.ts +0 -2
  270. package/dist/__tests__/unit/tree-debugger.test.d.ts.map +0 -1
  271. package/dist/__tests__/unit/tree-debugger.test.js +0 -69
  272. package/dist/__tests__/unit/tree-debugger.test.js.map +0 -1
  273. package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts +0 -2
  274. package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts.map +0 -1
  275. package/dist/__tests__/unit/utils/workflow-error-utils.test.js +0 -154
  276. package/dist/__tests__/unit/utils/workflow-error-utils.test.js.map +0 -1
  277. package/dist/__tests__/unit/workflow-detachChild.test.d.ts +0 -2
  278. package/dist/__tests__/unit/workflow-detachChild.test.d.ts.map +0 -1
  279. package/dist/__tests__/unit/workflow-detachChild.test.js +0 -76
  280. package/dist/__tests__/unit/workflow-detachChild.test.js.map +0 -1
  281. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts +0 -2
  282. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts.map +0 -1
  283. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js +0 -122
  284. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js.map +0 -1
  285. package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts +0 -2
  286. package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts.map +0 -1
  287. package/dist/__tests__/unit/workflow-isDescendantOf.test.js +0 -140
  288. package/dist/__tests__/unit/workflow-isDescendantOf.test.js.map +0 -1
  289. package/dist/__tests__/unit/workflow.test.d.ts +0 -2
  290. package/dist/__tests__/unit/workflow.test.d.ts.map +0 -1
  291. package/dist/__tests__/unit/workflow.test.js +0 -330
  292. package/dist/__tests__/unit/workflow.test.js.map +0 -1
@@ -1,877 +0,0 @@
1
- /**
2
- * Deep Analysis Tests
3
- * These tests probe deeper into edge cases, error scenarios, and potential bugs
4
- */
5
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
6
- var useValue = arguments.length > 2;
7
- for (var i = 0; i < initializers.length; i++) {
8
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
9
- }
10
- return useValue ? value : void 0;
11
- };
12
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
13
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
14
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
15
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
16
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
17
- var _, done = false;
18
- for (var i = decorators.length - 1; i >= 0; i--) {
19
- var context = {};
20
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
21
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
22
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
23
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
24
- if (kind === "accessor") {
25
- if (result === void 0) continue;
26
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
27
- if (_ = accept(result.get)) descriptor.get = _;
28
- if (_ = accept(result.set)) descriptor.set = _;
29
- if (_ = accept(result.init)) initializers.unshift(_);
30
- }
31
- else if (_ = accept(result)) {
32
- if (kind === "field") initializers.unshift(_);
33
- else descriptor[key] = _;
34
- }
35
- }
36
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
37
- done = true;
38
- };
39
- import { describe, it, expect } from 'vitest';
40
- import { Workflow, Step, Task, ObservedState } from '../../index.js';
41
- import { WorkflowTreeDebugger } from '../../debugger/tree-debugger.js';
42
- describe('Deep Analysis Tests', () => {
43
- describe('Observable Edge Cases', () => {
44
- it('should handle Observable.subscribe with empty observer object', async () => {
45
- class TestWorkflow extends Workflow {
46
- async run() {
47
- this.emitEvent({ type: 'stepStart', node: this.node, step: 'test' });
48
- }
49
- }
50
- const workflow = new TestWorkflow();
51
- const debuggerInstance = new WorkflowTreeDebugger(workflow);
52
- // Subscribe with empty observer - should not crash
53
- debuggerInstance.events.subscribe({});
54
- await workflow.run();
55
- });
56
- it('should handle Observable.unsubscribe during event emission', async () => {
57
- class TestWorkflow extends Workflow {
58
- async run() {
59
- for (let i = 0; i < 10; i++) {
60
- this.emitEvent({ type: 'stepStart', node: this.node, step: `step-${i}` });
61
- }
62
- }
63
- }
64
- const workflow = new TestWorkflow();
65
- const debuggerInstance = new WorkflowTreeDebugger(workflow);
66
- let count = 0;
67
- const subscription = debuggerInstance.events.subscribe({
68
- next: () => {
69
- count++;
70
- if (count === 5) {
71
- subscription.unsubscribe();
72
- }
73
- },
74
- });
75
- await workflow.run();
76
- // Should have received 5 events before unsubscribing
77
- expect(count).toBe(5);
78
- });
79
- });
80
- describe('WorkflowLogger Edge Cases', () => {
81
- it('should handle logger.child() with empty parentLogId', async () => {
82
- class TestWorkflow extends Workflow {
83
- async run() {
84
- const childLogger = this.logger.child('');
85
- childLogger.info('Child log with empty parent');
86
- }
87
- }
88
- const workflow = new TestWorkflow();
89
- await workflow.run();
90
- expect(workflow.node.logs.length).toBe(1);
91
- // Empty string is passed through as parentLogId
92
- expect(workflow.node.logs[0].parentLogId).toBeUndefined();
93
- });
94
- it('should handle logger with very long messages', async () => {
95
- class TestWorkflow extends Workflow {
96
- async run() {
97
- const longMessage = 'A'.repeat(10000);
98
- this.logger.info(longMessage);
99
- }
100
- }
101
- const workflow = new TestWorkflow();
102
- await workflow.run();
103
- expect(workflow.node.logs[0].message.length).toBe(10000);
104
- });
105
- it('should handle logger with special characters in data', async () => {
106
- class TestWorkflow extends Workflow {
107
- async run() {
108
- this.logger.info('Test', {
109
- null: null,
110
- undefined: undefined,
111
- circular: { self: null },
112
- function: () => { },
113
- symbol: Symbol('test'),
114
- });
115
- }
116
- }
117
- const workflow = new TestWorkflow();
118
- // Should not throw
119
- await workflow.run();
120
- });
121
- });
122
- describe('Step Decorator Edge Cases', () => {
123
- it('should handle @Step on synchronous method that returns Promise', async () => {
124
- let TestWorkflow = (() => {
125
- let _classSuper = Workflow;
126
- let _instanceExtraInitializers = [];
127
- let _testStep_decorators;
128
- return class TestWorkflow extends _classSuper {
129
- static {
130
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
131
- _testStep_decorators = [Step()];
132
- __esDecorate(this, null, _testStep_decorators, { kind: "method", name: "testStep", static: false, private: false, access: { has: obj => "testStep" in obj, get: obj => obj.testStep }, metadata: _metadata }, null, _instanceExtraInitializers);
133
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
134
- }
135
- async testStep() {
136
- return Promise.resolve('done');
137
- }
138
- async run() {
139
- return this.testStep();
140
- }
141
- constructor() {
142
- super(...arguments);
143
- __runInitializers(this, _instanceExtraInitializers);
144
- }
145
- };
146
- })();
147
- const workflow = new TestWorkflow();
148
- const result = await workflow.run();
149
- expect(result).toBe('done');
150
- });
151
- it('should handle @Step that returns undefined', async () => {
152
- let TestWorkflow = (() => {
153
- let _classSuper = Workflow;
154
- let _instanceExtraInitializers = [];
155
- let _testStep_decorators;
156
- return class TestWorkflow extends _classSuper {
157
- static {
158
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
159
- _testStep_decorators = [Step()];
160
- __esDecorate(this, null, _testStep_decorators, { kind: "method", name: "testStep", static: false, private: false, access: { has: obj => "testStep" in obj, get: obj => obj.testStep }, metadata: _metadata }, null, _instanceExtraInitializers);
161
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
162
- }
163
- async testStep() {
164
- // No return
165
- }
166
- async run() {
167
- return this.testStep();
168
- }
169
- constructor() {
170
- super(...arguments);
171
- __runInitializers(this, _instanceExtraInitializers);
172
- }
173
- };
174
- })();
175
- const workflow = new TestWorkflow();
176
- const result = await workflow.run();
177
- expect(result).toBeUndefined();
178
- });
179
- it('should handle @Step that throws non-Error', async () => {
180
- let TestWorkflow = (() => {
181
- let _classSuper = Workflow;
182
- let _instanceExtraInitializers = [];
183
- let _testStep_decorators;
184
- return class TestWorkflow extends _classSuper {
185
- static {
186
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
187
- _testStep_decorators = [Step()];
188
- __esDecorate(this, null, _testStep_decorators, { kind: "method", name: "testStep", static: false, private: false, access: { has: obj => "testStep" in obj, get: obj => obj.testStep }, metadata: _metadata }, null, _instanceExtraInitializers);
189
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
190
- }
191
- async testStep() {
192
- throw 'string error';
193
- }
194
- async run() {
195
- try {
196
- await this.testStep();
197
- }
198
- catch (err) {
199
- // Non-Error throws get wrapped with 'Unknown error' message
200
- // but the original is preserved
201
- expect(err.message).toBe('Unknown error');
202
- expect(err.original).toBe('string error');
203
- }
204
- }
205
- constructor() {
206
- super(...arguments);
207
- __runInitializers(this, _instanceExtraInitializers);
208
- }
209
- };
210
- })();
211
- const workflow = new TestWorkflow();
212
- await workflow.run();
213
- });
214
- it('should handle @Step that throws null', async () => {
215
- let TestWorkflow = (() => {
216
- let _classSuper = Workflow;
217
- let _instanceExtraInitializers = [];
218
- let _testStep_decorators;
219
- return class TestWorkflow extends _classSuper {
220
- static {
221
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
222
- _testStep_decorators = [Step()];
223
- __esDecorate(this, null, _testStep_decorators, { kind: "method", name: "testStep", static: false, private: false, access: { has: obj => "testStep" in obj, get: obj => obj.testStep }, metadata: _metadata }, null, _instanceExtraInitializers);
224
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
225
- }
226
- async testStep() {
227
- throw null;
228
- }
229
- async run() {
230
- try {
231
- await this.testStep();
232
- }
233
- catch (err) {
234
- expect(err).not.toBeNull();
235
- }
236
- }
237
- constructor() {
238
- super(...arguments);
239
- __runInitializers(this, _instanceExtraInitializers);
240
- }
241
- };
242
- })();
243
- const workflow = new TestWorkflow();
244
- await workflow.run();
245
- });
246
- });
247
- describe('Task Decorator Edge Cases', () => {
248
- it('should handle @Task that returns primitive value', async () => {
249
- let TestWorkflow = (() => {
250
- let _classSuper = Workflow;
251
- let _instanceExtraInitializers = [];
252
- let _returnsString_decorators;
253
- return class TestWorkflow extends _classSuper {
254
- static {
255
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
256
- _returnsString_decorators = [Task()];
257
- __esDecorate(this, null, _returnsString_decorators, { kind: "method", name: "returnsString", static: false, private: false, access: { has: obj => "returnsString" in obj, get: obj => obj.returnsString }, metadata: _metadata }, null, _instanceExtraInitializers);
258
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
259
- }
260
- async returnsString() {
261
- return 'not a workflow';
262
- }
263
- async run() {
264
- return this.returnsString();
265
- }
266
- constructor() {
267
- super(...arguments);
268
- __runInitializers(this, _instanceExtraInitializers);
269
- }
270
- };
271
- })();
272
- const workflow = new TestWorkflow();
273
- const result = await workflow.run();
274
- expect(result).toBe('not a workflow');
275
- expect(workflow.children.length).toBe(0);
276
- });
277
- it('should handle @Task that returns number', async () => {
278
- let TestWorkflow = (() => {
279
- let _classSuper = Workflow;
280
- let _instanceExtraInitializers = [];
281
- let _returnsNumber_decorators;
282
- return class TestWorkflow extends _classSuper {
283
- static {
284
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
285
- _returnsNumber_decorators = [Task()];
286
- __esDecorate(this, null, _returnsNumber_decorators, { kind: "method", name: "returnsNumber", static: false, private: false, access: { has: obj => "returnsNumber" in obj, get: obj => obj.returnsNumber }, metadata: _metadata }, null, _instanceExtraInitializers);
287
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
288
- }
289
- async returnsNumber() {
290
- return 42;
291
- }
292
- async run() {
293
- return this.returnsNumber();
294
- }
295
- constructor() {
296
- super(...arguments);
297
- __runInitializers(this, _instanceExtraInitializers);
298
- }
299
- };
300
- })();
301
- const workflow = new TestWorkflow();
302
- const result = await workflow.run();
303
- expect(result).toBe(42);
304
- });
305
- it('should handle @Task that returns object with id property (duck typing)', async () => {
306
- let TestWorkflow = (() => {
307
- let _classSuper = Workflow;
308
- let _instanceExtraInitializers = [];
309
- let _returnsDuck_decorators;
310
- return class TestWorkflow extends _classSuper {
311
- static {
312
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
313
- _returnsDuck_decorators = [Task()];
314
- __esDecorate(this, null, _returnsDuck_decorators, { kind: "method", name: "returnsDuck", static: false, private: false, access: { has: obj => "returnsDuck" in obj, get: obj => obj.returnsDuck }, metadata: _metadata }, null, _instanceExtraInitializers);
315
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
316
- }
317
- async returnsDuck() {
318
- return { id: 'duck-123', name: 'Duck' };
319
- }
320
- async run() {
321
- return this.returnsDuck();
322
- }
323
- constructor() {
324
- super(...arguments);
325
- __runInitializers(this, _instanceExtraInitializers);
326
- }
327
- };
328
- })();
329
- const workflow = new TestWorkflow();
330
- const result = await workflow.run();
331
- // Duck typing - objects with 'id' property get parent attached
332
- // The returned object is mutated to have a parent property
333
- expect(result.id).toBe('duck-123');
334
- expect(result.name).toBe('Duck');
335
- expect(result.parent).toBeDefined();
336
- // Duck typing treats it as a workflow and attaches it
337
- expect(workflow.children.length).toBe(1);
338
- });
339
- it('should handle @Task with concurrent on single non-workflow', async () => {
340
- let TestWorkflow = (() => {
341
- let _classSuper = Workflow;
342
- let _instanceExtraInitializers = [];
343
- let _returnsString_decorators;
344
- return class TestWorkflow extends _classSuper {
345
- static {
346
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
347
- _returnsString_decorators = [Task({ concurrent: true })];
348
- __esDecorate(this, null, _returnsString_decorators, { kind: "method", name: "returnsString", static: false, private: false, access: { has: obj => "returnsString" in obj, get: obj => obj.returnsString }, metadata: _metadata }, null, _instanceExtraInitializers);
349
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
350
- }
351
- async returnsString() {
352
- return 'not a workflow';
353
- }
354
- async run() {
355
- return this.returnsString();
356
- }
357
- constructor() {
358
- super(...arguments);
359
- __runInitializers(this, _instanceExtraInitializers);
360
- }
361
- };
362
- })();
363
- const workflow = new TestWorkflow();
364
- const result = await workflow.run();
365
- expect(result).toBe('not a workflow');
366
- });
367
- it('should handle @Task with concurrent: true but no run method', async () => {
368
- class ChildWorkflow extends Workflow {
369
- }
370
- let ParentWorkflow = (() => {
371
- let _classSuper = Workflow;
372
- let _instanceExtraInitializers = [];
373
- let _spawnChild_decorators;
374
- return class ParentWorkflow extends _classSuper {
375
- static {
376
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
377
- _spawnChild_decorators = [Task({ concurrent: true })];
378
- __esDecorate(this, null, _spawnChild_decorators, { kind: "method", name: "spawnChild", static: false, private: false, access: { has: obj => "spawnChild" in obj, get: obj => obj.spawnChild }, metadata: _metadata }, null, _instanceExtraInitializers);
379
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
380
- }
381
- async spawnChild() {
382
- return new ChildWorkflow('Child', this);
383
- }
384
- async run() {
385
- // Child will be attached but running it will throw
386
- return this.spawnChild();
387
- }
388
- constructor() {
389
- super(...arguments);
390
- __runInitializers(this, _instanceExtraInitializers);
391
- }
392
- };
393
- })();
394
- const workflow = new ParentWorkflow();
395
- await workflow.run();
396
- // Child should still be attached
397
- expect(workflow.children.length).toBe(1);
398
- });
399
- });
400
- describe('ObservedState Edge Cases', () => {
401
- it('should handle undefined value in observed state', async () => {
402
- let TestWorkflow = (() => {
403
- let _classSuper = Workflow;
404
- let _undefinedField_decorators;
405
- let _undefinedField_initializers = [];
406
- let _undefinedField_extraInitializers = [];
407
- return class TestWorkflow extends _classSuper {
408
- static {
409
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
410
- _undefinedField_decorators = [ObservedState()];
411
- __esDecorate(null, null, _undefinedField_decorators, { kind: "field", name: "undefinedField", static: false, private: false, access: { has: obj => "undefinedField" in obj, get: obj => obj.undefinedField, set: (obj, value) => { obj.undefinedField = value; } }, metadata: _metadata }, _undefinedField_initializers, _undefinedField_extraInitializers);
412
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
413
- }
414
- undefinedField = __runInitializers(this, _undefinedField_initializers, undefined);
415
- async run() {
416
- this.snapshotState();
417
- return this.node.stateSnapshot;
418
- }
419
- constructor() {
420
- super(...arguments);
421
- __runInitializers(this, _undefinedField_extraInitializers);
422
- }
423
- };
424
- })();
425
- const workflow = new TestWorkflow();
426
- const snapshot = await workflow.run();
427
- expect(snapshot?.undefinedField).toBeUndefined();
428
- });
429
- it('should handle circular reference in observed state', async () => {
430
- let TestWorkflow = (() => {
431
- let _classSuper = Workflow;
432
- let _circular_decorators;
433
- let _circular_initializers = [];
434
- let _circular_extraInitializers = [];
435
- return class TestWorkflow extends _classSuper {
436
- static {
437
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
438
- _circular_decorators = [ObservedState()];
439
- __esDecorate(null, null, _circular_decorators, { kind: "field", name: "circular", static: false, private: false, access: { has: obj => "circular" in obj, get: obj => obj.circular, set: (obj, value) => { obj.circular = value; } }, metadata: _metadata }, _circular_initializers, _circular_extraInitializers);
440
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
441
- }
442
- circular = __runInitializers(this, _circular_initializers, {});
443
- async run() {
444
- this.circular.self = this.circular;
445
- this.snapshotState();
446
- return this.node.stateSnapshot;
447
- }
448
- constructor() {
449
- super(...arguments);
450
- __runInitializers(this, _circular_extraInitializers);
451
- }
452
- };
453
- })();
454
- const workflow = new TestWorkflow();
455
- // Should not crash
456
- await workflow.run();
457
- });
458
- it('should handle deeply nested object in observed state', async () => {
459
- let TestWorkflow = (() => {
460
- let _classSuper = Workflow;
461
- let _nested_decorators;
462
- let _nested_initializers = [];
463
- let _nested_extraInitializers = [];
464
- return class TestWorkflow extends _classSuper {
465
- static {
466
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
467
- _nested_decorators = [ObservedState()];
468
- __esDecorate(null, null, _nested_decorators, { kind: "field", name: "nested", static: false, private: false, access: { has: obj => "nested" in obj, get: obj => obj.nested, set: (obj, value) => { obj.nested = value; } }, metadata: _metadata }, _nested_initializers, _nested_extraInitializers);
469
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
470
- }
471
- nested = __runInitializers(this, _nested_initializers, { level: 1 });
472
- async run() {
473
- for (let i = 2; i <= 100; i++) {
474
- this.nested = { level: i, child: this.nested };
475
- }
476
- this.snapshotState();
477
- return this.node.stateSnapshot;
478
- }
479
- constructor() {
480
- super(...arguments);
481
- __runInitializers(this, _nested_extraInitializers);
482
- }
483
- };
484
- })();
485
- const workflow = new TestWorkflow();
486
- const snapshot = await workflow.run();
487
- expect(snapshot?.nested).toBeDefined();
488
- });
489
- });
490
- describe('Workflow Construction Edge Cases', () => {
491
- it('should handle Workflow with no arguments', async () => {
492
- class TestWorkflow extends Workflow {
493
- async run() {
494
- return 'done';
495
- }
496
- }
497
- const workflow = new TestWorkflow();
498
- expect(workflow.node.name).toBe('TestWorkflow');
499
- expect(workflow.parent).toBeNull();
500
- });
501
- it('should handle Workflow with only parent argument', async () => {
502
- class ChildWorkflow extends Workflow {
503
- async run() {
504
- return 'done';
505
- }
506
- }
507
- class ParentWorkflow extends Workflow {
508
- async run() {
509
- const child = new ChildWorkflow(undefined, this);
510
- expect(child.parent).toBe(this);
511
- }
512
- }
513
- const workflow = new ParentWorkflow();
514
- await workflow.run();
515
- });
516
- it('should handle functional workflow pattern', async () => {
517
- const workflow = new Workflow({ name: 'FunctionalWorkflow' }, async (ctx) => {
518
- await ctx.step('test', async () => {
519
- return 'done';
520
- });
521
- });
522
- const result = await workflow.run();
523
- expect(result).toBeDefined();
524
- });
525
- });
526
- describe('Tree Debugger Edge Cases', () => {
527
- it('should handle toTreeString on deep hierarchy', async () => {
528
- // Create a root workflow with deep children
529
- class RootWorkflow extends Workflow {
530
- async run() {
531
- return 'done';
532
- }
533
- }
534
- const root = new RootWorkflow();
535
- let lastWorkflow = root;
536
- // Build deep hierarchy
537
- for (let i = 0; i < 20; i++) {
538
- const ChildWorkflow = class extends Workflow {
539
- async run() {
540
- return 'done';
541
- }
542
- };
543
- const child = new ChildWorkflow(`Workflow-${i}`, lastWorkflow);
544
- await child.run();
545
- lastWorkflow = child;
546
- }
547
- // Create debugger on the root
548
- const debuggerInstance = new WorkflowTreeDebugger(root);
549
- const treeString = debuggerInstance.toTreeString();
550
- expect(treeString.length).toBeGreaterThan(0);
551
- expect(treeString.split('\n').length).toBeGreaterThan(20);
552
- });
553
- it('should handle toLogString on workflow with no logs', async () => {
554
- class TestWorkflow extends Workflow {
555
- async run() {
556
- // No logs
557
- }
558
- }
559
- const workflow = new TestWorkflow();
560
- await workflow.run();
561
- const debuggerInstance = new WorkflowTreeDebugger(workflow);
562
- const logString = debuggerInstance.toLogString();
563
- expect(typeof logString).toBe('string');
564
- });
565
- it('should handle getNode on non-existent ID', async () => {
566
- class TestWorkflow extends Workflow {
567
- async run() {
568
- return 'done';
569
- }
570
- }
571
- const workflow = new TestWorkflow();
572
- const debuggerInstance = new WorkflowTreeDebugger(workflow);
573
- const node = debuggerInstance.getNode('non-existent-id');
574
- expect(node).toBeUndefined();
575
- });
576
- it('should handle getStats on complex tree', async () => {
577
- let ChildWorkflow = (() => {
578
- let _classSuper = Workflow;
579
- let _instanceExtraInitializers = [];
580
- let _step_decorators;
581
- return class ChildWorkflow extends _classSuper {
582
- static {
583
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
584
- _step_decorators = [Step()];
585
- __esDecorate(this, null, _step_decorators, { kind: "method", name: "step", static: false, private: false, access: { has: obj => "step" in obj, get: obj => obj.step }, metadata: _metadata }, null, _instanceExtraInitializers);
586
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
587
- }
588
- async step() {
589
- this.logger.info('Child log');
590
- return 'done';
591
- }
592
- async run() {
593
- return this.step();
594
- }
595
- constructor() {
596
- super(...arguments);
597
- __runInitializers(this, _instanceExtraInitializers);
598
- }
599
- };
600
- })();
601
- let ParentWorkflow = (() => {
602
- let _classSuper = Workflow;
603
- let _instanceExtraInitializers = [];
604
- let _spawnChildren_decorators;
605
- return class ParentWorkflow extends _classSuper {
606
- static {
607
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
608
- _spawnChildren_decorators = [Task({ concurrent: true })];
609
- __esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
610
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
611
- }
612
- async spawnChildren() {
613
- return [
614
- new ChildWorkflow('Child1', this),
615
- new ChildWorkflow('Child2', this),
616
- new ChildWorkflow('Child3', this),
617
- ];
618
- }
619
- async run() {
620
- await this.spawnChildren();
621
- await Promise.all(this.children.map(c => c.run()));
622
- }
623
- constructor() {
624
- super(...arguments);
625
- __runInitializers(this, _instanceExtraInitializers);
626
- }
627
- };
628
- })();
629
- const workflow = new ParentWorkflow();
630
- await workflow.run();
631
- const debuggerInstance = new WorkflowTreeDebugger(workflow);
632
- const stats = debuggerInstance.getStats();
633
- expect(stats.totalNodes).toBe(4); // 1 parent + 3 children
634
- expect(stats.totalLogs).toBeGreaterThan(0);
635
- expect(stats.totalEvents).toBeGreaterThan(0);
636
- expect(stats.byStatus).toBeDefined();
637
- });
638
- });
639
- describe('Event Propagation Edge Cases', () => {
640
- it('should handle events emitted during observer callback', async () => {
641
- class TestWorkflow extends Workflow {
642
- async run() {
643
- let callCount = 0;
644
- this.addObserver({
645
- onLog: () => { },
646
- onEvent: () => {
647
- callCount++;
648
- // Emit another event during callback
649
- if (callCount === 1) {
650
- this.emitEvent({ type: 'stepStart', node: this.node, step: 'nested' });
651
- }
652
- },
653
- onStateUpdated: () => { },
654
- onTreeChanged: () => { },
655
- });
656
- this.emitEvent({ type: 'stepStart', node: this.node, step: 'initial' });
657
- expect(callCount).toBeGreaterThanOrEqual(1);
658
- }
659
- }
660
- const workflow = new TestWorkflow();
661
- await workflow.run();
662
- });
663
- it('should handle multiple observers with different behaviors', async () => {
664
- class TestWorkflow extends Workflow {
665
- async run() {
666
- const results = {};
667
- this.addObserver({
668
- onLog: () => { results.observer1 = (results.observer1 || 0) + 1; },
669
- onEvent: () => { results.observer1 = (results.observer1 || 0) + 1; },
670
- onStateUpdated: () => { },
671
- onTreeChanged: () => { },
672
- });
673
- this.addObserver({
674
- onLog: () => { results.observer2 = (results.observer2 || 0) + 1; },
675
- onEvent: () => { results.observer2 = (results.observer2 || 0) + 1; },
676
- onStateUpdated: () => { },
677
- onTreeChanged: () => { },
678
- });
679
- this.emitEvent({ type: 'stepStart', node: this.node, step: 'test' });
680
- expect(results.observer1).toBeGreaterThan(0);
681
- expect(results.observer2).toBeGreaterThan(0);
682
- }
683
- }
684
- const workflow = new TestWorkflow();
685
- await workflow.run();
686
- });
687
- });
688
- describe('State Transition Edge Cases', () => {
689
- it('should handle status changes during execution', async () => {
690
- class TestWorkflow extends Workflow {
691
- async run() {
692
- expect(this.status).toBe('idle');
693
- this.setStatus('running');
694
- expect(this.status).toBe('running');
695
- this.setStatus('completed');
696
- expect(this.status).toBe('completed');
697
- }
698
- }
699
- const workflow = new TestWorkflow();
700
- await workflow.run();
701
- });
702
- it('should handle invalid status values', async () => {
703
- class TestWorkflow extends Workflow {
704
- async run() {
705
- // TypeScript should prevent this at compile time, but let's test runtime
706
- this.setStatus('invalid');
707
- // Status should be set (no validation at runtime)
708
- expect(this.status).toBe('invalid');
709
- }
710
- }
711
- const workflow = new TestWorkflow();
712
- await workflow.run();
713
- });
714
- });
715
- describe('Child Attachment Edge Cases', () => {
716
- it('should prevent attaching the same child twice', async () => {
717
- class ChildWorkflow extends Workflow {
718
- async run() {
719
- return 'done';
720
- }
721
- }
722
- class ParentWorkflow extends Workflow {
723
- async run() {
724
- const child = new ChildWorkflow('Child', this);
725
- // Try to attach again
726
- expect(() => {
727
- this.attachChild(child);
728
- }).toThrow('Child already attached');
729
- }
730
- }
731
- const workflow = new ParentWorkflow();
732
- await workflow.run();
733
- });
734
- it('should handle child with parent set in constructor', async () => {
735
- class ChildWorkflow extends Workflow {
736
- async run() {
737
- return 'done';
738
- }
739
- }
740
- class ParentWorkflow extends Workflow {
741
- async run() {
742
- const child = new ChildWorkflow('Child', this);
743
- // Child should already be attached
744
- expect(this.children.length).toBe(1);
745
- expect(this.children[0]).toBe(child);
746
- }
747
- }
748
- const workflow = new ParentWorkflow();
749
- await workflow.run();
750
- });
751
- });
752
- describe('Memory and Resource Edge Cases', () => {
753
- it('should handle rapid workflow creation and destruction', async () => {
754
- class TestWorkflow extends Workflow {
755
- async run() {
756
- return 'done';
757
- }
758
- }
759
- for (let i = 0; i < 100; i++) {
760
- const workflow = new TestWorkflow(`Workflow-${i}`);
761
- await workflow.run();
762
- }
763
- // If we got here without crashing, memory management is reasonable
764
- expect(true).toBe(true);
765
- });
766
- it('should handle many observers on single workflow', async () => {
767
- class TestWorkflow extends Workflow {
768
- async run() {
769
- this.emitEvent({ type: 'stepStart', node: this.node, step: 'test' });
770
- }
771
- }
772
- const workflow = new TestWorkflow();
773
- // Add 100 observers
774
- for (let i = 0; i < 100; i++) {
775
- workflow.addObserver({
776
- onLog: () => { },
777
- onEvent: () => { },
778
- onStateUpdated: () => { },
779
- onTreeChanged: () => { },
780
- });
781
- }
782
- await workflow.run();
783
- // Should complete without issues
784
- expect(true).toBe(true);
785
- });
786
- });
787
- describe('Error Recovery Edge Cases', () => {
788
- it('should handle error in @Step followed by another @Step', async () => {
789
- let TestWorkflow = (() => {
790
- let _classSuper = Workflow;
791
- let _instanceExtraInitializers = [];
792
- let _failingStep_decorators;
793
- let _successStep_decorators;
794
- return class TestWorkflow extends _classSuper {
795
- static {
796
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
797
- _failingStep_decorators = [Step()];
798
- _successStep_decorators = [Step()];
799
- __esDecorate(this, null, _failingStep_decorators, { kind: "method", name: "failingStep", static: false, private: false, access: { has: obj => "failingStep" in obj, get: obj => obj.failingStep }, metadata: _metadata }, null, _instanceExtraInitializers);
800
- __esDecorate(this, null, _successStep_decorators, { kind: "method", name: "successStep", static: false, private: false, access: { has: obj => "successStep" in obj, get: obj => obj.successStep }, metadata: _metadata }, null, _instanceExtraInitializers);
801
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
802
- }
803
- async failingStep() {
804
- throw new Error('Failed');
805
- }
806
- async successStep() {
807
- return 'success';
808
- }
809
- async run() {
810
- try {
811
- await this.failingStep();
812
- }
813
- catch (err) {
814
- // Expected
815
- }
816
- return await this.successStep();
817
- }
818
- constructor() {
819
- super(...arguments);
820
- __runInitializers(this, _instanceExtraInitializers);
821
- }
822
- };
823
- })();
824
- const workflow = new TestWorkflow();
825
- const result = await workflow.run();
826
- expect(result).toBe('success');
827
- });
828
- it('should handle multiple sequential errors', async () => {
829
- let TestWorkflow = (() => {
830
- let _classSuper = Workflow;
831
- let _instanceExtraInitializers = [];
832
- let _errorStep1_decorators;
833
- let _errorStep2_decorators;
834
- return class TestWorkflow extends _classSuper {
835
- static {
836
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
837
- _errorStep1_decorators = [Step()];
838
- _errorStep2_decorators = [Step()];
839
- __esDecorate(this, null, _errorStep1_decorators, { kind: "method", name: "errorStep1", static: false, private: false, access: { has: obj => "errorStep1" in obj, get: obj => obj.errorStep1 }, metadata: _metadata }, null, _instanceExtraInitializers);
840
- __esDecorate(this, null, _errorStep2_decorators, { kind: "method", name: "errorStep2", static: false, private: false, access: { has: obj => "errorStep2" in obj, get: obj => obj.errorStep2 }, metadata: _metadata }, null, _instanceExtraInitializers);
841
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
842
- }
843
- async errorStep1() {
844
- throw new Error('Error 1');
845
- }
846
- async errorStep2() {
847
- throw new Error('Error 2');
848
- }
849
- async run() {
850
- try {
851
- await this.errorStep1();
852
- }
853
- catch (err) {
854
- // Expected
855
- }
856
- try {
857
- await this.errorStep2();
858
- }
859
- catch (err) {
860
- // Expected
861
- }
862
- }
863
- constructor() {
864
- super(...arguments);
865
- __runInitializers(this, _instanceExtraInitializers);
866
- }
867
- };
868
- })();
869
- const workflow = new TestWorkflow();
870
- await workflow.run();
871
- // Should have multiple error events
872
- const errorEvents = workflow.node.events.filter(e => e.type === 'error');
873
- expect(errorEvents.length).toBe(2);
874
- });
875
- });
876
- });
877
- //# sourceMappingURL=deep-analysis.test.js.map