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.
- package/LICENSE +21 -0
- package/README.md +26 -9
- package/dist/cache/cache-key.d.ts +20 -0
- package/dist/cache/cache-key.d.ts.map +1 -1
- package/dist/cache/cache-key.js +9 -0
- package/dist/cache/cache-key.js.map +1 -1
- package/dist/core/agent.d.ts +120 -29
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +584 -177
- package/dist/core/agent.js.map +1 -1
- package/dist/core/mcp-handler.d.ts +63 -5
- package/dist/core/mcp-handler.d.ts.map +1 -1
- package/dist/core/mcp-handler.js +184 -4
- package/dist/core/mcp-handler.js.map +1 -1
- package/dist/core/workflow-context.d.ts +6 -2
- package/dist/core/workflow-context.d.ts.map +1 -1
- package/dist/core/workflow-context.js +99 -4
- package/dist/core/workflow-context.js.map +1 -1
- package/dist/core/workflow.d.ts +315 -13
- package/dist/core/workflow.d.ts.map +1 -1
- package/dist/core/workflow.js +552 -30
- package/dist/core/workflow.js.map +1 -1
- package/dist/debugger/event-replayer.d.ts +422 -0
- package/dist/debugger/event-replayer.d.ts.map +1 -0
- package/dist/debugger/event-replayer.js +639 -0
- package/dist/debugger/event-replayer.js.map +1 -0
- package/dist/debugger/tree-debugger.d.ts +170 -1
- package/dist/debugger/tree-debugger.d.ts.map +1 -1
- package/dist/debugger/tree-debugger.js +423 -1
- package/dist/debugger/tree-debugger.js.map +1 -1
- package/dist/decorators/step.d.ts.map +1 -1
- package/dist/decorators/step.js +129 -47
- package/dist/decorators/step.js.map +1 -1
- package/dist/harnesses/claude-code-harness.d.ts +391 -0
- package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
- package/dist/harnesses/claude-code-harness.js +1076 -0
- package/dist/harnesses/claude-code-harness.js.map +1 -0
- package/dist/harnesses/harness-registry.d.ts +440 -0
- package/dist/harnesses/harness-registry.d.ts.map +1 -0
- package/dist/harnesses/harness-registry.js +543 -0
- package/dist/harnesses/harness-registry.js.map +1 -0
- package/dist/harnesses/index.d.ts +12 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +11 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/pi-harness.d.ts +219 -0
- package/dist/harnesses/pi-harness.d.ts.map +1 -0
- package/dist/harnesses/pi-harness.js +676 -0
- package/dist/harnesses/pi-harness.js.map +1 -0
- package/dist/harnesses/pi-schema-converter.d.ts +24 -0
- package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
- package/dist/harnesses/pi-schema-converter.js +81 -0
- package/dist/harnesses/pi-schema-converter.js.map +1 -0
- package/dist/harnesses/register-defaults.d.ts +24 -0
- package/dist/harnesses/register-defaults.d.ts.map +1 -0
- package/dist/harnesses/register-defaults.js +40 -0
- package/dist/harnesses/register-defaults.js.map +1 -0
- package/dist/harnesses/session-store.d.ts +201 -0
- package/dist/harnesses/session-store.d.ts.map +1 -0
- package/dist/harnesses/session-store.js +254 -0
- package/dist/harnesses/session-store.js.map +1 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/reflection/reflection.d.ts.map +1 -1
- package/dist/reflection/reflection.js +19 -4
- package/dist/reflection/reflection.js.map +1 -1
- package/dist/types/agent.d.ts +1253 -2
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +418 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/decorators.d.ts +10 -1
- package/dist/types/decorators.d.ts.map +1 -1
- package/dist/types/events.d.ts +26 -0
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/harnesses.d.ts +474 -0
- package/dist/types/harnesses.d.ts.map +1 -0
- package/dist/types/harnesses.js +2 -0
- package/dist/types/harnesses.js.map +1 -0
- package/dist/types/index.d.ts +9 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/providers.d.ts +691 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +14 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/types/restart.d.ts +132 -0
- package/dist/types/restart.d.ts.map +1 -0
- package/dist/types/restart.js +2 -0
- package/dist/types/restart.js.map +1 -0
- package/dist/types/streaming.d.ts +194 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +67 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/workflow-context.d.ts +137 -1
- package/dist/types/workflow-context.d.ts.map +1 -1
- package/dist/utils/agent-validation.d.ts +88 -0
- package/dist/utils/agent-validation.d.ts.map +1 -0
- package/dist/utils/agent-validation.js +87 -0
- package/dist/utils/agent-validation.js.map +1 -0
- package/dist/utils/delay.d.ts +7 -0
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +9 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/harness-config.d.ts +180 -0
- package/dist/utils/harness-config.d.ts.map +1 -0
- package/dist/utils/harness-config.js +311 -0
- package/dist/utils/harness-config.js.map +1 -0
- package/dist/utils/index.d.ts +9 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +8 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/model-spec.d.ts +110 -0
- package/dist/utils/model-spec.d.ts.map +1 -0
- package/dist/utils/model-spec.js +149 -0
- package/dist/utils/model-spec.js.map +1 -0
- package/dist/utils/provider-config.d.ts +10 -0
- package/dist/utils/provider-config.d.ts.map +1 -0
- package/dist/utils/provider-config.js +10 -0
- package/dist/utils/provider-config.js.map +1 -0
- package/dist/utils/restart-analysis.d.ts +202 -0
- package/dist/utils/restart-analysis.d.ts.map +1 -0
- package/dist/utils/restart-analysis.js +426 -0
- package/dist/utils/restart-analysis.js.map +1 -0
- package/dist/utils/session-serialization.d.ts +118 -0
- package/dist/utils/session-serialization.d.ts.map +1 -0
- package/dist/utils/session-serialization.js +217 -0
- package/dist/utils/session-serialization.js.map +1 -0
- package/package.json +31 -5
- package/CHANGELOG.md +0 -188
- package/dist/__tests__/adversarial/attachChild-performance.test.d.ts +0 -16
- package/dist/__tests__/adversarial/attachChild-performance.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/attachChild-performance.test.js +0 -187
- package/dist/__tests__/adversarial/attachChild-performance.test.js.map +0 -1
- package/dist/__tests__/adversarial/circular-reference.test.d.ts +0 -13
- package/dist/__tests__/adversarial/circular-reference.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/circular-reference.test.js +0 -92
- package/dist/__tests__/adversarial/circular-reference.test.js.map +0 -1
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts +0 -16
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/complex-circular-reference.test.js +0 -127
- package/dist/__tests__/adversarial/complex-circular-reference.test.js.map +0 -1
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts +0 -21
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js +0 -667
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js.map +0 -1
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts +0 -6
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/deep-analysis.test.js +0 -877
- package/dist/__tests__/adversarial/deep-analysis.test.js.map +0 -1
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts +0 -13
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js +0 -186
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js.map +0 -1
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts +0 -6
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js +0 -626
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js.map +0 -1
- package/dist/__tests__/adversarial/edge-case.test.d.ts +0 -6
- package/dist/__tests__/adversarial/edge-case.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/edge-case.test.js +0 -857
- package/dist/__tests__/adversarial/edge-case.test.js.map +0 -1
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts +0 -20
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/error-merge-strategy.test.js +0 -907
- package/dist/__tests__/adversarial/error-merge-strategy.test.js.map +0 -1
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts +0 -2
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/incremental-performance.test.js +0 -113
- package/dist/__tests__/adversarial/incremental-performance.test.js.map +0 -1
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts +0 -22
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js +0 -383
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js.map +0 -1
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts +0 -21
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/observer-propagation.test.js +0 -404
- package/dist/__tests__/adversarial/observer-propagation.test.js.map +0 -1
- package/dist/__tests__/adversarial/parent-validation.test.d.ts +0 -13
- package/dist/__tests__/adversarial/parent-validation.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/parent-validation.test.js +0 -128
- package/dist/__tests__/adversarial/parent-validation.test.js.map +0 -1
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts +0 -20
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js +0 -482
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js.map +0 -1
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts +0 -6
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts.map +0 -1
- package/dist/__tests__/adversarial/prd-compliance.test.js +0 -886
- package/dist/__tests__/adversarial/prd-compliance.test.js.map +0 -1
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts +0 -22
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts.map +0 -1
- package/dist/__tests__/compatibility/backward-compatibility.test.js +0 -1843
- package/dist/__tests__/compatibility/backward-compatibility.test.js.map +0 -1
- package/dist/__tests__/helpers/index.d.ts +0 -10
- package/dist/__tests__/helpers/index.d.ts.map +0 -1
- package/dist/__tests__/helpers/index.js +0 -10
- package/dist/__tests__/helpers/index.js.map +0 -1
- package/dist/__tests__/helpers/tree-verification.d.ts +0 -90
- package/dist/__tests__/helpers/tree-verification.d.ts.map +0 -1
- package/dist/__tests__/helpers/tree-verification.js +0 -202
- package/dist/__tests__/helpers/tree-verification.js.map +0 -1
- package/dist/__tests__/integration/agent-workflow.test.d.ts +0 -2
- package/dist/__tests__/integration/agent-workflow.test.d.ts.map +0 -1
- package/dist/__tests__/integration/agent-workflow.test.js +0 -256
- package/dist/__tests__/integration/agent-workflow.test.js.map +0 -1
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts +0 -14
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts.map +0 -1
- package/dist/__tests__/integration/bidirectional-consistency.test.js +0 -668
- package/dist/__tests__/integration/bidirectional-consistency.test.js.map +0 -1
- package/dist/__tests__/integration/observer-logging.test.d.ts +0 -2
- package/dist/__tests__/integration/observer-logging.test.d.ts.map +0 -1
- package/dist/__tests__/integration/observer-logging.test.js +0 -517
- package/dist/__tests__/integration/observer-logging.test.js.map +0 -1
- package/dist/__tests__/integration/tree-mirroring.test.d.ts +0 -2
- package/dist/__tests__/integration/tree-mirroring.test.d.ts.map +0 -1
- package/dist/__tests__/integration/tree-mirroring.test.js +0 -117
- package/dist/__tests__/integration/tree-mirroring.test.js.map +0 -1
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts +0 -12
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts.map +0 -1
- package/dist/__tests__/integration/workflow-reparenting.test.js +0 -239
- package/dist/__tests__/integration/workflow-reparenting.test.js.map +0 -1
- package/dist/__tests__/unit/agent.test.d.ts +0 -2
- package/dist/__tests__/unit/agent.test.d.ts.map +0 -1
- package/dist/__tests__/unit/agent.test.js +0 -143
- package/dist/__tests__/unit/agent.test.js.map +0 -1
- package/dist/__tests__/unit/cache-key.test.d.ts +0 -5
- package/dist/__tests__/unit/cache-key.test.d.ts.map +0 -1
- package/dist/__tests__/unit/cache-key.test.js +0 -145
- package/dist/__tests__/unit/cache-key.test.js.map +0 -1
- package/dist/__tests__/unit/cache.test.d.ts +0 -5
- package/dist/__tests__/unit/cache.test.d.ts.map +0 -1
- package/dist/__tests__/unit/cache.test.js +0 -132
- package/dist/__tests__/unit/cache.test.js.map +0 -1
- package/dist/__tests__/unit/context.test.d.ts +0 -2
- package/dist/__tests__/unit/context.test.d.ts.map +0 -1
- package/dist/__tests__/unit/context.test.js +0 -220
- package/dist/__tests__/unit/context.test.js.map +0 -1
- package/dist/__tests__/unit/decorators.test.d.ts +0 -2
- package/dist/__tests__/unit/decorators.test.d.ts.map +0 -1
- package/dist/__tests__/unit/decorators.test.js +0 -162
- package/dist/__tests__/unit/decorators.test.js.map +0 -1
- package/dist/__tests__/unit/introspection-tools.test.d.ts +0 -5
- package/dist/__tests__/unit/introspection-tools.test.d.ts.map +0 -1
- package/dist/__tests__/unit/introspection-tools.test.js +0 -191
- package/dist/__tests__/unit/introspection-tools.test.js.map +0 -1
- package/dist/__tests__/unit/logger.test.d.ts +0 -2
- package/dist/__tests__/unit/logger.test.d.ts.map +0 -1
- package/dist/__tests__/unit/logger.test.js +0 -241
- package/dist/__tests__/unit/logger.test.js.map +0 -1
- package/dist/__tests__/unit/observable.test.d.ts +0 -2
- package/dist/__tests__/unit/observable.test.d.ts.map +0 -1
- package/dist/__tests__/unit/observable.test.js +0 -251
- package/dist/__tests__/unit/observable.test.js.map +0 -1
- package/dist/__tests__/unit/prompt.test.d.ts +0 -2
- package/dist/__tests__/unit/prompt.test.d.ts.map +0 -1
- package/dist/__tests__/unit/prompt.test.js +0 -113
- package/dist/__tests__/unit/prompt.test.js.map +0 -1
- package/dist/__tests__/unit/reflection.test.d.ts +0 -5
- package/dist/__tests__/unit/reflection.test.d.ts.map +0 -1
- package/dist/__tests__/unit/reflection.test.js +0 -160
- package/dist/__tests__/unit/reflection.test.js.map +0 -1
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts +0 -2
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts.map +0 -1
- package/dist/__tests__/unit/tree-debugger-incremental.test.js +0 -136
- package/dist/__tests__/unit/tree-debugger-incremental.test.js.map +0 -1
- package/dist/__tests__/unit/tree-debugger.test.d.ts +0 -2
- package/dist/__tests__/unit/tree-debugger.test.d.ts.map +0 -1
- package/dist/__tests__/unit/tree-debugger.test.js +0 -69
- package/dist/__tests__/unit/tree-debugger.test.js.map +0 -1
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts +0 -2
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts.map +0 -1
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js +0 -154
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js.map +0 -1
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts +0 -2
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts.map +0 -1
- package/dist/__tests__/unit/workflow-detachChild.test.js +0 -76
- package/dist/__tests__/unit/workflow-detachChild.test.js.map +0 -1
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts +0 -2
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts.map +0 -1
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js +0 -122
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js.map +0 -1
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts +0 -2
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts.map +0 -1
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js +0 -140
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js.map +0 -1
- package/dist/__tests__/unit/workflow.test.d.ts +0 -2
- package/dist/__tests__/unit/workflow.test.d.ts.map +0 -1
- package/dist/__tests__/unit/workflow.test.js +0 -330
- package/dist/__tests__/unit/workflow.test.js.map +0 -1
|
@@ -1,886 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRD Compliance Tests
|
|
3
|
-
* These tests verify that the implementation matches the PRD specifications
|
|
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('PRD Compliance Tests', () => {
|
|
43
|
-
describe('PRD Section 3.1: WorkflowNode Interface', () => {
|
|
44
|
-
it('should have all required WorkflowNode properties', async () => {
|
|
45
|
-
class TestWorkflow extends Workflow {
|
|
46
|
-
async run() {
|
|
47
|
-
return 'done';
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
const workflow = new TestWorkflow();
|
|
51
|
-
const node = workflow.getNode();
|
|
52
|
-
expect(node).toHaveProperty('id');
|
|
53
|
-
expect(node).toHaveProperty('name');
|
|
54
|
-
expect(node).toHaveProperty('parent');
|
|
55
|
-
expect(node).toHaveProperty('children');
|
|
56
|
-
expect(node).toHaveProperty('status');
|
|
57
|
-
expect(node).toHaveProperty('logs');
|
|
58
|
-
expect(node).toHaveProperty('events');
|
|
59
|
-
expect(node).toHaveProperty('stateSnapshot');
|
|
60
|
-
});
|
|
61
|
-
it('should initialize with correct default values', async () => {
|
|
62
|
-
class TestWorkflow extends Workflow {
|
|
63
|
-
async run() {
|
|
64
|
-
return 'done';
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
const workflow = new TestWorkflow();
|
|
68
|
-
const node = workflow.getNode();
|
|
69
|
-
expect(node.id).toBeDefined();
|
|
70
|
-
expect(node.name).toBe('TestWorkflow');
|
|
71
|
-
expect(node.parent).toBeNull();
|
|
72
|
-
expect(node.children).toEqual([]);
|
|
73
|
-
expect(node.status).toBe('idle');
|
|
74
|
-
expect(node.logs).toEqual([]);
|
|
75
|
-
expect(node.events).toEqual([]);
|
|
76
|
-
expect(node.stateSnapshot).toBeNull();
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe('PRD Section 3.2: WorkflowStatus Type', () => {
|
|
80
|
-
it('should support all 5 status values', async () => {
|
|
81
|
-
const validStatuses = ['idle', 'running', 'completed', 'failed', 'cancelled'];
|
|
82
|
-
class TestWorkflow extends Workflow {
|
|
83
|
-
async run() {
|
|
84
|
-
for (const status of validStatuses) {
|
|
85
|
-
this.setStatus(status);
|
|
86
|
-
expect(this.status).toBe(status);
|
|
87
|
-
expect(this.node.status).toBe(status);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const workflow = new TestWorkflow();
|
|
92
|
-
await workflow.run();
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe('PRD Section 4.1: LogEntry Interface', () => {
|
|
96
|
-
it('should create log entries with all required properties', async () => {
|
|
97
|
-
class TestWorkflow extends Workflow {
|
|
98
|
-
async run() {
|
|
99
|
-
this.logger.info('Test message', { key: 'value' });
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
const workflow = new TestWorkflow();
|
|
103
|
-
await workflow.run();
|
|
104
|
-
const log = workflow.node.logs[0];
|
|
105
|
-
expect(log).toHaveProperty('id');
|
|
106
|
-
expect(log).toHaveProperty('workflowId');
|
|
107
|
-
expect(log).toHaveProperty('timestamp');
|
|
108
|
-
expect(log).toHaveProperty('level');
|
|
109
|
-
expect(log).toHaveProperty('message');
|
|
110
|
-
expect(log).toHaveProperty('data');
|
|
111
|
-
});
|
|
112
|
-
it('should support all 4 log levels', async () => {
|
|
113
|
-
const levels = ['debug', 'info', 'warn', 'error'];
|
|
114
|
-
class TestWorkflow extends Workflow {
|
|
115
|
-
async run() {
|
|
116
|
-
this.logger.debug('debug msg');
|
|
117
|
-
this.logger.info('info msg');
|
|
118
|
-
this.logger.warn('warn msg');
|
|
119
|
-
this.logger.error('error msg');
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
const workflow = new TestWorkflow();
|
|
123
|
-
await workflow.run();
|
|
124
|
-
expect(workflow.node.logs.length).toBe(4);
|
|
125
|
-
workflow.node.logs.forEach((log, i) => {
|
|
126
|
-
expect(log.level).toBe(levels[i]);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
describe('PRD Section 4.2: WorkflowEvent Types', () => {
|
|
131
|
-
it('should emit stepStart event', async () => {
|
|
132
|
-
let TestWorkflow = (() => {
|
|
133
|
-
let _classSuper = Workflow;
|
|
134
|
-
let _instanceExtraInitializers = [];
|
|
135
|
-
let _testStep_decorators;
|
|
136
|
-
return class TestWorkflow extends _classSuper {
|
|
137
|
-
static {
|
|
138
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
139
|
-
_testStep_decorators = [Step()];
|
|
140
|
-
__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);
|
|
141
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
142
|
-
}
|
|
143
|
-
async testStep() {
|
|
144
|
-
return 'done';
|
|
145
|
-
}
|
|
146
|
-
async run() {
|
|
147
|
-
return this.testStep();
|
|
148
|
-
}
|
|
149
|
-
constructor() {
|
|
150
|
-
super(...arguments);
|
|
151
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
})();
|
|
155
|
-
const workflow = new TestWorkflow();
|
|
156
|
-
const events = [];
|
|
157
|
-
workflow.addObserver({
|
|
158
|
-
onLog: () => { },
|
|
159
|
-
onEvent: (e) => events.push(e),
|
|
160
|
-
onStateUpdated: () => { },
|
|
161
|
-
onTreeChanged: () => { },
|
|
162
|
-
});
|
|
163
|
-
await workflow.run();
|
|
164
|
-
const stepStart = events.find(e => e.type === 'stepStart');
|
|
165
|
-
expect(stepStart).toBeDefined();
|
|
166
|
-
if (stepStart?.type === 'stepStart') {
|
|
167
|
-
expect(stepStart.node).toBeDefined();
|
|
168
|
-
expect(stepStart.step).toBe('testStep');
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
it('should emit stepEnd event with duration', async () => {
|
|
172
|
-
let TestWorkflow = (() => {
|
|
173
|
-
let _classSuper = Workflow;
|
|
174
|
-
let _instanceExtraInitializers = [];
|
|
175
|
-
let _testStep_decorators;
|
|
176
|
-
return class TestWorkflow extends _classSuper {
|
|
177
|
-
static {
|
|
178
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
179
|
-
_testStep_decorators = [Step()];
|
|
180
|
-
__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);
|
|
181
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
182
|
-
}
|
|
183
|
-
async testStep() {
|
|
184
|
-
return 'done';
|
|
185
|
-
}
|
|
186
|
-
async run() {
|
|
187
|
-
return this.testStep();
|
|
188
|
-
}
|
|
189
|
-
constructor() {
|
|
190
|
-
super(...arguments);
|
|
191
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
})();
|
|
195
|
-
const workflow = new TestWorkflow();
|
|
196
|
-
const events = [];
|
|
197
|
-
workflow.addObserver({
|
|
198
|
-
onLog: () => { },
|
|
199
|
-
onEvent: (e) => events.push(e),
|
|
200
|
-
onStateUpdated: () => { },
|
|
201
|
-
onTreeChanged: () => { },
|
|
202
|
-
});
|
|
203
|
-
await workflow.run();
|
|
204
|
-
const stepEnd = events.find(e => e.type === 'stepEnd');
|
|
205
|
-
expect(stepEnd).toBeDefined();
|
|
206
|
-
if (stepEnd?.type === 'stepEnd') {
|
|
207
|
-
expect(stepEnd.node).toBeDefined();
|
|
208
|
-
expect(stepEnd.step).toBe('testStep');
|
|
209
|
-
expect(typeof stepEnd.duration).toBe('number');
|
|
210
|
-
expect(stepEnd.duration).toBeGreaterThanOrEqual(0);
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
it('should emit taskStart and taskEnd events', async () => {
|
|
214
|
-
class ChildWorkflow extends Workflow {
|
|
215
|
-
async run() {
|
|
216
|
-
return 'child';
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
let ParentWorkflow = (() => {
|
|
220
|
-
let _classSuper = Workflow;
|
|
221
|
-
let _instanceExtraInitializers = [];
|
|
222
|
-
let _spawnChild_decorators;
|
|
223
|
-
return class ParentWorkflow extends _classSuper {
|
|
224
|
-
static {
|
|
225
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
226
|
-
_spawnChild_decorators = [Task()];
|
|
227
|
-
__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);
|
|
228
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
229
|
-
}
|
|
230
|
-
async spawnChild() {
|
|
231
|
-
return new ChildWorkflow('Child', this);
|
|
232
|
-
}
|
|
233
|
-
async run() {
|
|
234
|
-
return this.spawnChild();
|
|
235
|
-
}
|
|
236
|
-
constructor() {
|
|
237
|
-
super(...arguments);
|
|
238
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
239
|
-
}
|
|
240
|
-
};
|
|
241
|
-
})();
|
|
242
|
-
const workflow = new ParentWorkflow();
|
|
243
|
-
const events = [];
|
|
244
|
-
workflow.addObserver({
|
|
245
|
-
onLog: () => { },
|
|
246
|
-
onEvent: (e) => events.push(e),
|
|
247
|
-
onStateUpdated: () => { },
|
|
248
|
-
onTreeChanged: () => { },
|
|
249
|
-
});
|
|
250
|
-
await workflow.run();
|
|
251
|
-
const taskStart = events.find(e => e.type === 'taskStart');
|
|
252
|
-
expect(taskStart).toBeDefined();
|
|
253
|
-
if (taskStart?.type === 'taskStart') {
|
|
254
|
-
expect(taskStart.task).toBe('spawnChild');
|
|
255
|
-
}
|
|
256
|
-
const taskEnd = events.find(e => e.type === 'taskEnd');
|
|
257
|
-
expect(taskEnd).toBeDefined();
|
|
258
|
-
if (taskEnd?.type === 'taskEnd') {
|
|
259
|
-
expect(taskEnd.task).toBe('spawnChild');
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
describe('PRD Section 5.1: WorkflowError Interface', () => {
|
|
264
|
-
it('should include all required fields in WorkflowError', async () => {
|
|
265
|
-
let TestWorkflow = (() => {
|
|
266
|
-
let _classSuper = Workflow;
|
|
267
|
-
let _instanceExtraInitializers = [];
|
|
268
|
-
let _testField_decorators;
|
|
269
|
-
let _testField_initializers = [];
|
|
270
|
-
let _testField_extraInitializers = [];
|
|
271
|
-
let _failingStep_decorators;
|
|
272
|
-
return class TestWorkflow extends _classSuper {
|
|
273
|
-
static {
|
|
274
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
275
|
-
_testField_decorators = [ObservedState()];
|
|
276
|
-
_failingStep_decorators = [Step()];
|
|
277
|
-
__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);
|
|
278
|
-
__esDecorate(null, null, _testField_decorators, { kind: "field", name: "testField", static: false, private: false, access: { has: obj => "testField" in obj, get: obj => obj.testField, set: (obj, value) => { obj.testField = value; } }, metadata: _metadata }, _testField_initializers, _testField_extraInitializers);
|
|
279
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
280
|
-
}
|
|
281
|
-
testField = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _testField_initializers, 'test-value'));
|
|
282
|
-
async failingStep() {
|
|
283
|
-
this.logger.info('About to fail');
|
|
284
|
-
throw new Error('Test error');
|
|
285
|
-
}
|
|
286
|
-
async run() {
|
|
287
|
-
try {
|
|
288
|
-
await this.failingStep();
|
|
289
|
-
}
|
|
290
|
-
catch (err) {
|
|
291
|
-
// Expected
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
constructor() {
|
|
295
|
-
super(...arguments);
|
|
296
|
-
__runInitializers(this, _testField_extraInitializers);
|
|
297
|
-
}
|
|
298
|
-
};
|
|
299
|
-
})();
|
|
300
|
-
const workflow = new TestWorkflow();
|
|
301
|
-
let capturedError;
|
|
302
|
-
workflow.addObserver({
|
|
303
|
-
onLog: () => { },
|
|
304
|
-
onEvent: (e) => {
|
|
305
|
-
if (e.type === 'error') {
|
|
306
|
-
capturedError = e.error;
|
|
307
|
-
}
|
|
308
|
-
},
|
|
309
|
-
onStateUpdated: () => { },
|
|
310
|
-
onTreeChanged: () => { },
|
|
311
|
-
});
|
|
312
|
-
await workflow.run();
|
|
313
|
-
expect(capturedError).toBeDefined();
|
|
314
|
-
expect(capturedError).toHaveProperty('message', 'Test error');
|
|
315
|
-
expect(capturedError).toHaveProperty('original');
|
|
316
|
-
expect(capturedError).toHaveProperty('workflowId');
|
|
317
|
-
expect(capturedError).toHaveProperty('stack');
|
|
318
|
-
expect(capturedError).toHaveProperty('state');
|
|
319
|
-
expect(capturedError).toHaveProperty('logs');
|
|
320
|
-
expect(Array.isArray(capturedError?.logs)).toBe(true);
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
describe('PRD Section 8.1: @Step Decorator Options', () => {
|
|
324
|
-
it('should support custom step name', async () => {
|
|
325
|
-
let TestWorkflow = (() => {
|
|
326
|
-
let _classSuper = Workflow;
|
|
327
|
-
let _instanceExtraInitializers = [];
|
|
328
|
-
let _someMethod_decorators;
|
|
329
|
-
return class TestWorkflow extends _classSuper {
|
|
330
|
-
static {
|
|
331
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
332
|
-
_someMethod_decorators = [Step({ name: 'CustomStepName' })];
|
|
333
|
-
__esDecorate(this, null, _someMethod_decorators, { kind: "method", name: "someMethod", static: false, private: false, access: { has: obj => "someMethod" in obj, get: obj => obj.someMethod }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
334
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
335
|
-
}
|
|
336
|
-
async someMethod() {
|
|
337
|
-
return 'done';
|
|
338
|
-
}
|
|
339
|
-
async run() {
|
|
340
|
-
return this.someMethod();
|
|
341
|
-
}
|
|
342
|
-
constructor() {
|
|
343
|
-
super(...arguments);
|
|
344
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
})();
|
|
348
|
-
const workflow = new TestWorkflow();
|
|
349
|
-
const events = [];
|
|
350
|
-
workflow.addObserver({
|
|
351
|
-
onLog: () => { },
|
|
352
|
-
onEvent: (e) => events.push(e),
|
|
353
|
-
onStateUpdated: () => { },
|
|
354
|
-
onTreeChanged: () => { },
|
|
355
|
-
});
|
|
356
|
-
await workflow.run();
|
|
357
|
-
const stepStart = events.find(e => e.type === 'stepStart');
|
|
358
|
-
if (stepStart?.type === 'stepStart') {
|
|
359
|
-
expect(stepStart.step).toBe('CustomStepName');
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
it('should snapshot state when requested', async () => {
|
|
363
|
-
let TestWorkflow = (() => {
|
|
364
|
-
let _classSuper = Workflow;
|
|
365
|
-
let _instanceExtraInitializers = [];
|
|
366
|
-
let _counter_decorators;
|
|
367
|
-
let _counter_initializers = [];
|
|
368
|
-
let _counter_extraInitializers = [];
|
|
369
|
-
let _testStep_decorators;
|
|
370
|
-
return class TestWorkflow extends _classSuper {
|
|
371
|
-
static {
|
|
372
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
373
|
-
_counter_decorators = [ObservedState()];
|
|
374
|
-
_testStep_decorators = [Step({ snapshotState: true })];
|
|
375
|
-
__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);
|
|
376
|
-
__esDecorate(null, null, _counter_decorators, { kind: "field", name: "counter", static: false, private: false, access: { has: obj => "counter" in obj, get: obj => obj.counter, set: (obj, value) => { obj.counter = value; } }, metadata: _metadata }, _counter_initializers, _counter_extraInitializers);
|
|
377
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
378
|
-
}
|
|
379
|
-
counter = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _counter_initializers, 42));
|
|
380
|
-
async testStep() {
|
|
381
|
-
this.counter = 100;
|
|
382
|
-
return 'done';
|
|
383
|
-
}
|
|
384
|
-
async run() {
|
|
385
|
-
return this.testStep();
|
|
386
|
-
}
|
|
387
|
-
constructor() {
|
|
388
|
-
super(...arguments);
|
|
389
|
-
__runInitializers(this, _counter_extraInitializers);
|
|
390
|
-
}
|
|
391
|
-
};
|
|
392
|
-
})();
|
|
393
|
-
const workflow = new TestWorkflow();
|
|
394
|
-
await workflow.run();
|
|
395
|
-
expect(workflow.node.stateSnapshot).not.toBeNull();
|
|
396
|
-
expect(workflow.node.stateSnapshot?.counter).toBe(100);
|
|
397
|
-
});
|
|
398
|
-
it('should log start when requested', async () => {
|
|
399
|
-
let TestWorkflow = (() => {
|
|
400
|
-
let _classSuper = Workflow;
|
|
401
|
-
let _instanceExtraInitializers = [];
|
|
402
|
-
let _testStep_decorators;
|
|
403
|
-
return class TestWorkflow extends _classSuper {
|
|
404
|
-
static {
|
|
405
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
406
|
-
_testStep_decorators = [Step({ logStart: true })];
|
|
407
|
-
__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);
|
|
408
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
409
|
-
}
|
|
410
|
-
async testStep() {
|
|
411
|
-
return 'done';
|
|
412
|
-
}
|
|
413
|
-
async run() {
|
|
414
|
-
return this.testStep();
|
|
415
|
-
}
|
|
416
|
-
constructor() {
|
|
417
|
-
super(...arguments);
|
|
418
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
419
|
-
}
|
|
420
|
-
};
|
|
421
|
-
})();
|
|
422
|
-
const workflow = new TestWorkflow();
|
|
423
|
-
await workflow.run();
|
|
424
|
-
const hasStartLog = workflow.node.logs.some(l => l.message.includes('STEP START'));
|
|
425
|
-
expect(hasStartLog).toBe(true);
|
|
426
|
-
});
|
|
427
|
-
it('should log finish when requested', async () => {
|
|
428
|
-
let TestWorkflow = (() => {
|
|
429
|
-
let _classSuper = Workflow;
|
|
430
|
-
let _instanceExtraInitializers = [];
|
|
431
|
-
let _testStep_decorators;
|
|
432
|
-
return class TestWorkflow extends _classSuper {
|
|
433
|
-
static {
|
|
434
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
435
|
-
_testStep_decorators = [Step({ logFinish: true })];
|
|
436
|
-
__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);
|
|
437
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
438
|
-
}
|
|
439
|
-
async testStep() {
|
|
440
|
-
return 'done';
|
|
441
|
-
}
|
|
442
|
-
async run() {
|
|
443
|
-
return this.testStep();
|
|
444
|
-
}
|
|
445
|
-
constructor() {
|
|
446
|
-
super(...arguments);
|
|
447
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
448
|
-
}
|
|
449
|
-
};
|
|
450
|
-
})();
|
|
451
|
-
const workflow = new TestWorkflow();
|
|
452
|
-
await workflow.run();
|
|
453
|
-
const hasEndLog = workflow.node.logs.some(l => l.message.includes('STEP END'));
|
|
454
|
-
expect(hasEndLog).toBe(true);
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
describe('PRD Section 8.2: @Task Decorator', () => {
|
|
458
|
-
it('should attach single child workflow', async () => {
|
|
459
|
-
class ChildWorkflow extends Workflow {
|
|
460
|
-
async run() {
|
|
461
|
-
return 'child';
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
let ParentWorkflow = (() => {
|
|
465
|
-
let _classSuper = Workflow;
|
|
466
|
-
let _instanceExtraInitializers = [];
|
|
467
|
-
let _spawnChild_decorators;
|
|
468
|
-
return class ParentWorkflow extends _classSuper {
|
|
469
|
-
static {
|
|
470
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
471
|
-
_spawnChild_decorators = [Task()];
|
|
472
|
-
__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);
|
|
473
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
474
|
-
}
|
|
475
|
-
async spawnChild() {
|
|
476
|
-
return new ChildWorkflow('Child', this);
|
|
477
|
-
}
|
|
478
|
-
async run() {
|
|
479
|
-
return this.spawnChild();
|
|
480
|
-
}
|
|
481
|
-
constructor() {
|
|
482
|
-
super(...arguments);
|
|
483
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
484
|
-
}
|
|
485
|
-
};
|
|
486
|
-
})();
|
|
487
|
-
const workflow = new ParentWorkflow();
|
|
488
|
-
await workflow.run();
|
|
489
|
-
expect(workflow.children.length).toBe(1);
|
|
490
|
-
expect(workflow.children[0].node.name).toBe('Child');
|
|
491
|
-
});
|
|
492
|
-
it('should attach multiple child workflows', async () => {
|
|
493
|
-
class ChildWorkflow extends Workflow {
|
|
494
|
-
async run() {
|
|
495
|
-
return 'child';
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
let ParentWorkflow = (() => {
|
|
499
|
-
let _classSuper = Workflow;
|
|
500
|
-
let _instanceExtraInitializers = [];
|
|
501
|
-
let _spawnChildren_decorators;
|
|
502
|
-
return class ParentWorkflow extends _classSuper {
|
|
503
|
-
static {
|
|
504
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
505
|
-
_spawnChildren_decorators = [Task()];
|
|
506
|
-
__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);
|
|
507
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
508
|
-
}
|
|
509
|
-
async spawnChildren() {
|
|
510
|
-
return [
|
|
511
|
-
new ChildWorkflow('Child1', this),
|
|
512
|
-
new ChildWorkflow('Child2', this),
|
|
513
|
-
new ChildWorkflow('Child3', this),
|
|
514
|
-
];
|
|
515
|
-
}
|
|
516
|
-
async run() {
|
|
517
|
-
return this.spawnChildren();
|
|
518
|
-
}
|
|
519
|
-
constructor() {
|
|
520
|
-
super(...arguments);
|
|
521
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
522
|
-
}
|
|
523
|
-
};
|
|
524
|
-
})();
|
|
525
|
-
const workflow = new ParentWorkflow();
|
|
526
|
-
await workflow.run();
|
|
527
|
-
expect(workflow.children.length).toBe(3);
|
|
528
|
-
});
|
|
529
|
-
it('should run workflows concurrently when concurrent: true', async () => {
|
|
530
|
-
let executionOrder = [];
|
|
531
|
-
class ChildWorkflow extends Workflow {
|
|
532
|
-
constructor(name, parent) {
|
|
533
|
-
super(name, parent);
|
|
534
|
-
}
|
|
535
|
-
async run() {
|
|
536
|
-
// Add a small delay
|
|
537
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
538
|
-
executionOrder.push(this.node.name);
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
let ParentWorkflow = (() => {
|
|
542
|
-
let _classSuper = Workflow;
|
|
543
|
-
let _instanceExtraInitializers = [];
|
|
544
|
-
let _spawnChildren_decorators;
|
|
545
|
-
return class ParentWorkflow extends _classSuper {
|
|
546
|
-
static {
|
|
547
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
548
|
-
_spawnChildren_decorators = [Task({ concurrent: true })];
|
|
549
|
-
__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);
|
|
550
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
551
|
-
}
|
|
552
|
-
async spawnChildren() {
|
|
553
|
-
return [
|
|
554
|
-
new ChildWorkflow('Child1', this),
|
|
555
|
-
new ChildWorkflow('Child2', this),
|
|
556
|
-
new ChildWorkflow('Child3', this),
|
|
557
|
-
];
|
|
558
|
-
}
|
|
559
|
-
async run() {
|
|
560
|
-
return this.spawnChildren();
|
|
561
|
-
}
|
|
562
|
-
constructor() {
|
|
563
|
-
super(...arguments);
|
|
564
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
565
|
-
}
|
|
566
|
-
};
|
|
567
|
-
})();
|
|
568
|
-
const workflow = new ParentWorkflow();
|
|
569
|
-
await workflow.run();
|
|
570
|
-
// All children should have been executed
|
|
571
|
-
expect(executionOrder.length).toBe(3);
|
|
572
|
-
// With concurrent execution, we can't guarantee order, but all should be present
|
|
573
|
-
expect(executionOrder).toContain('Child1');
|
|
574
|
-
expect(executionOrder).toContain('Child2');
|
|
575
|
-
expect(executionOrder).toContain('Child3');
|
|
576
|
-
});
|
|
577
|
-
});
|
|
578
|
-
describe('PRD Section 8.3: @ObservedState Decorator', () => {
|
|
579
|
-
it('should include marked fields in state snapshots', async () => {
|
|
580
|
-
let TestWorkflow = (() => {
|
|
581
|
-
let _classSuper = Workflow;
|
|
582
|
-
let _observedField_decorators;
|
|
583
|
-
let _observedField_initializers = [];
|
|
584
|
-
let _observedField_extraInitializers = [];
|
|
585
|
-
return class TestWorkflow extends _classSuper {
|
|
586
|
-
static {
|
|
587
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
588
|
-
_observedField_decorators = [ObservedState()];
|
|
589
|
-
__esDecorate(null, null, _observedField_decorators, { kind: "field", name: "observedField", static: false, private: false, access: { has: obj => "observedField" in obj, get: obj => obj.observedField, set: (obj, value) => { obj.observedField = value; } }, metadata: _metadata }, _observedField_initializers, _observedField_extraInitializers);
|
|
590
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
591
|
-
}
|
|
592
|
-
observedField = __runInitializers(this, _observedField_initializers, 'observed');
|
|
593
|
-
unobservedField = (__runInitializers(this, _observedField_extraInitializers), 'not-observed');
|
|
594
|
-
async run() {
|
|
595
|
-
this.snapshotState();
|
|
596
|
-
return this.node.stateSnapshot;
|
|
597
|
-
}
|
|
598
|
-
};
|
|
599
|
-
})();
|
|
600
|
-
const workflow = new TestWorkflow();
|
|
601
|
-
const snapshot = await workflow.run();
|
|
602
|
-
expect(snapshot).toHaveProperty('observedField', 'observed');
|
|
603
|
-
expect(snapshot).not.toHaveProperty('unobservedField');
|
|
604
|
-
});
|
|
605
|
-
it('should redact fields with redact: true', async () => {
|
|
606
|
-
let TestWorkflow = (() => {
|
|
607
|
-
let _classSuper = Workflow;
|
|
608
|
-
let _password_decorators;
|
|
609
|
-
let _password_initializers = [];
|
|
610
|
-
let _password_extraInitializers = [];
|
|
611
|
-
let _username_decorators;
|
|
612
|
-
let _username_initializers = [];
|
|
613
|
-
let _username_extraInitializers = [];
|
|
614
|
-
return class TestWorkflow extends _classSuper {
|
|
615
|
-
static {
|
|
616
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
617
|
-
_password_decorators = [ObservedState({ redact: true })];
|
|
618
|
-
_username_decorators = [ObservedState()];
|
|
619
|
-
__esDecorate(null, null, _password_decorators, { kind: "field", name: "password", static: false, private: false, access: { has: obj => "password" in obj, get: obj => obj.password, set: (obj, value) => { obj.password = value; } }, metadata: _metadata }, _password_initializers, _password_extraInitializers);
|
|
620
|
-
__esDecorate(null, null, _username_decorators, { kind: "field", name: "username", static: false, private: false, access: { has: obj => "username" in obj, get: obj => obj.username, set: (obj, value) => { obj.username = value; } }, metadata: _metadata }, _username_initializers, _username_extraInitializers);
|
|
621
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
622
|
-
}
|
|
623
|
-
password = __runInitializers(this, _password_initializers, 'secret123');
|
|
624
|
-
username = (__runInitializers(this, _password_extraInitializers), __runInitializers(this, _username_initializers, 'alice'));
|
|
625
|
-
async run() {
|
|
626
|
-
this.snapshotState();
|
|
627
|
-
return this.node.stateSnapshot;
|
|
628
|
-
}
|
|
629
|
-
constructor() {
|
|
630
|
-
super(...arguments);
|
|
631
|
-
__runInitializers(this, _username_extraInitializers);
|
|
632
|
-
}
|
|
633
|
-
};
|
|
634
|
-
})();
|
|
635
|
-
const workflow = new TestWorkflow();
|
|
636
|
-
const snapshot = await workflow.run();
|
|
637
|
-
expect(snapshot?.password).toBe('***');
|
|
638
|
-
expect(snapshot?.username).toBe('alice');
|
|
639
|
-
});
|
|
640
|
-
it('should hide fields with hidden: true', async () => {
|
|
641
|
-
let TestWorkflow = (() => {
|
|
642
|
-
let _classSuper = Workflow;
|
|
643
|
-
let _internalState_decorators;
|
|
644
|
-
let _internalState_initializers = [];
|
|
645
|
-
let _internalState_extraInitializers = [];
|
|
646
|
-
let _publicState_decorators;
|
|
647
|
-
let _publicState_initializers = [];
|
|
648
|
-
let _publicState_extraInitializers = [];
|
|
649
|
-
return class TestWorkflow extends _classSuper {
|
|
650
|
-
static {
|
|
651
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
652
|
-
_internalState_decorators = [ObservedState({ hidden: true })];
|
|
653
|
-
_publicState_decorators = [ObservedState()];
|
|
654
|
-
__esDecorate(null, null, _internalState_decorators, { kind: "field", name: "internalState", static: false, private: false, access: { has: obj => "internalState" in obj, get: obj => obj.internalState, set: (obj, value) => { obj.internalState = value; } }, metadata: _metadata }, _internalState_initializers, _internalState_extraInitializers);
|
|
655
|
-
__esDecorate(null, null, _publicState_decorators, { kind: "field", name: "publicState", static: false, private: false, access: { has: obj => "publicState" in obj, get: obj => obj.publicState, set: (obj, value) => { obj.publicState = value; } }, metadata: _metadata }, _publicState_initializers, _publicState_extraInitializers);
|
|
656
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
657
|
-
}
|
|
658
|
-
internalState = __runInitializers(this, _internalState_initializers, 'internal');
|
|
659
|
-
publicState = (__runInitializers(this, _internalState_extraInitializers), __runInitializers(this, _publicState_initializers, 'public'));
|
|
660
|
-
async run() {
|
|
661
|
-
this.snapshotState();
|
|
662
|
-
return this.node.stateSnapshot;
|
|
663
|
-
}
|
|
664
|
-
constructor() {
|
|
665
|
-
super(...arguments);
|
|
666
|
-
__runInitializers(this, _publicState_extraInitializers);
|
|
667
|
-
}
|
|
668
|
-
};
|
|
669
|
-
})();
|
|
670
|
-
const workflow = new TestWorkflow();
|
|
671
|
-
const snapshot = await workflow.run();
|
|
672
|
-
expect(snapshot).not.toHaveProperty('internalState');
|
|
673
|
-
expect(snapshot).toHaveProperty('publicState', 'public');
|
|
674
|
-
});
|
|
675
|
-
});
|
|
676
|
-
describe('PRD Section 11: Tree Debugger API', () => {
|
|
677
|
-
it('should implement getTree() method', async () => {
|
|
678
|
-
class TestWorkflow extends Workflow {
|
|
679
|
-
async run() {
|
|
680
|
-
return 'done';
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
const workflow = new TestWorkflow();
|
|
684
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
685
|
-
const tree = debuggerInstance.getTree();
|
|
686
|
-
expect(tree).toBeDefined();
|
|
687
|
-
expect(tree.id).toBe(workflow.id);
|
|
688
|
-
});
|
|
689
|
-
it('should implement getNode(id) method', async () => {
|
|
690
|
-
class ChildWorkflow extends Workflow {
|
|
691
|
-
async run() {
|
|
692
|
-
return 'child';
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
let ParentWorkflow = (() => {
|
|
696
|
-
let _classSuper = Workflow;
|
|
697
|
-
let _instanceExtraInitializers = [];
|
|
698
|
-
let _spawnChild_decorators;
|
|
699
|
-
return class ParentWorkflow extends _classSuper {
|
|
700
|
-
static {
|
|
701
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
702
|
-
_spawnChild_decorators = [Task()];
|
|
703
|
-
__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);
|
|
704
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
705
|
-
}
|
|
706
|
-
async spawnChild() {
|
|
707
|
-
return new ChildWorkflow('Child', this);
|
|
708
|
-
}
|
|
709
|
-
async run() {
|
|
710
|
-
return this.spawnChild();
|
|
711
|
-
}
|
|
712
|
-
constructor() {
|
|
713
|
-
super(...arguments);
|
|
714
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
715
|
-
}
|
|
716
|
-
};
|
|
717
|
-
})();
|
|
718
|
-
const workflow = new ParentWorkflow();
|
|
719
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
720
|
-
await workflow.run();
|
|
721
|
-
const childNode = debuggerInstance.getNode(workflow.children[0].id);
|
|
722
|
-
expect(childNode).toBeDefined();
|
|
723
|
-
expect(childNode?.name).toBe('Child');
|
|
724
|
-
});
|
|
725
|
-
it('should provide events Observable', async () => {
|
|
726
|
-
class TestWorkflow extends Workflow {
|
|
727
|
-
async run() {
|
|
728
|
-
return 'done';
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
const workflow = new TestWorkflow();
|
|
732
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
733
|
-
expect(debuggerInstance.events).toBeDefined();
|
|
734
|
-
expect(debuggerInstance.events.subscribe).toBeDefined();
|
|
735
|
-
});
|
|
736
|
-
it('should implement toTreeString() method', async () => {
|
|
737
|
-
class TestWorkflow extends Workflow {
|
|
738
|
-
async run() {
|
|
739
|
-
return 'done';
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
const workflow = new TestWorkflow();
|
|
743
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
744
|
-
const treeString = debuggerInstance.toTreeString();
|
|
745
|
-
expect(typeof treeString).toBe('string');
|
|
746
|
-
expect(treeString.length).toBeGreaterThan(0);
|
|
747
|
-
});
|
|
748
|
-
it('should implement toLogString() method', async () => {
|
|
749
|
-
class TestWorkflow extends Workflow {
|
|
750
|
-
async run() {
|
|
751
|
-
this.logger.info('Test log message');
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
const workflow = new TestWorkflow();
|
|
755
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
756
|
-
await workflow.run();
|
|
757
|
-
const logString = debuggerInstance.toLogString();
|
|
758
|
-
expect(typeof logString).toBe('string');
|
|
759
|
-
expect(logString).toContain('Test log message');
|
|
760
|
-
});
|
|
761
|
-
});
|
|
762
|
-
describe('PRD Section 12.2: Workflow Base Class', () => {
|
|
763
|
-
it('should have id, parent, children, and status properties', async () => {
|
|
764
|
-
class TestWorkflow extends Workflow {
|
|
765
|
-
async run() {
|
|
766
|
-
return 'done';
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
const workflow = new TestWorkflow();
|
|
770
|
-
expect(workflow.id).toBeDefined();
|
|
771
|
-
expect(workflow.parent).toBeDefined();
|
|
772
|
-
expect(workflow.children).toBeDefined();
|
|
773
|
-
expect(workflow.status).toBeDefined();
|
|
774
|
-
});
|
|
775
|
-
it('should have attachChild method', async () => {
|
|
776
|
-
class ChildWorkflow extends Workflow {
|
|
777
|
-
async run() {
|
|
778
|
-
return 'child';
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
class ParentWorkflow extends Workflow {
|
|
782
|
-
async run() {
|
|
783
|
-
const child = new ChildWorkflow('Child', this);
|
|
784
|
-
expect(workflow.children.length).toBe(1);
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
const workflow = new ParentWorkflow();
|
|
788
|
-
await workflow.run();
|
|
789
|
-
});
|
|
790
|
-
it('should have snapshotState method', async () => {
|
|
791
|
-
class TestWorkflow extends Workflow {
|
|
792
|
-
async run() {
|
|
793
|
-
this.snapshotState();
|
|
794
|
-
expect(this.node.stateSnapshot).not.toBeNull();
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
const workflow = new TestWorkflow();
|
|
798
|
-
await workflow.run();
|
|
799
|
-
});
|
|
800
|
-
it('should have setStatus method', async () => {
|
|
801
|
-
class TestWorkflow extends Workflow {
|
|
802
|
-
async run() {
|
|
803
|
-
this.setStatus('running');
|
|
804
|
-
expect(this.status).toBe('running');
|
|
805
|
-
expect(this.node.status).toBe('running');
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
const workflow = new TestWorkflow();
|
|
809
|
-
await workflow.run();
|
|
810
|
-
});
|
|
811
|
-
});
|
|
812
|
-
describe('PRD: Perfect 1:1 Tree Mirror Requirement', () => {
|
|
813
|
-
it('should maintain perfect tree structure in logs and events', async () => {
|
|
814
|
-
let ChildWorkflow = (() => {
|
|
815
|
-
let _classSuper = Workflow;
|
|
816
|
-
let _instanceExtraInitializers = [];
|
|
817
|
-
let _childStep_decorators;
|
|
818
|
-
return class ChildWorkflow extends _classSuper {
|
|
819
|
-
static {
|
|
820
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
821
|
-
_childStep_decorators = [Step()];
|
|
822
|
-
__esDecorate(this, null, _childStep_decorators, { kind: "method", name: "childStep", static: false, private: false, access: { has: obj => "childStep" in obj, get: obj => obj.childStep }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
823
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
824
|
-
}
|
|
825
|
-
async childStep() {
|
|
826
|
-
this.logger.info('Child step executed');
|
|
827
|
-
return 'child-step-done';
|
|
828
|
-
}
|
|
829
|
-
async run() {
|
|
830
|
-
return this.childStep();
|
|
831
|
-
}
|
|
832
|
-
constructor() {
|
|
833
|
-
super(...arguments);
|
|
834
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
835
|
-
}
|
|
836
|
-
};
|
|
837
|
-
})();
|
|
838
|
-
let ParentWorkflow = (() => {
|
|
839
|
-
let _classSuper = Workflow;
|
|
840
|
-
let _instanceExtraInitializers = [];
|
|
841
|
-
let _parentStep_decorators;
|
|
842
|
-
let _spawnChild_decorators;
|
|
843
|
-
return class ParentWorkflow extends _classSuper {
|
|
844
|
-
static {
|
|
845
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
846
|
-
_parentStep_decorators = [Step()];
|
|
847
|
-
_spawnChild_decorators = [Task()];
|
|
848
|
-
__esDecorate(this, null, _parentStep_decorators, { kind: "method", name: "parentStep", static: false, private: false, access: { has: obj => "parentStep" in obj, get: obj => obj.parentStep }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
849
|
-
__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);
|
|
850
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
851
|
-
}
|
|
852
|
-
async parentStep() {
|
|
853
|
-
this.logger.info('Parent step executed');
|
|
854
|
-
return 'parent-step-done';
|
|
855
|
-
}
|
|
856
|
-
async spawnChild() {
|
|
857
|
-
return new ChildWorkflow('Child', this);
|
|
858
|
-
}
|
|
859
|
-
async run() {
|
|
860
|
-
await this.parentStep();
|
|
861
|
-
await this.spawnChild();
|
|
862
|
-
await this.children[0].run();
|
|
863
|
-
}
|
|
864
|
-
constructor() {
|
|
865
|
-
super(...arguments);
|
|
866
|
-
__runInitializers(this, _instanceExtraInitializers);
|
|
867
|
-
}
|
|
868
|
-
};
|
|
869
|
-
})();
|
|
870
|
-
const workflow = new ParentWorkflow();
|
|
871
|
-
await workflow.run();
|
|
872
|
-
// Parent should have 1 child
|
|
873
|
-
expect(workflow.children.length).toBe(1);
|
|
874
|
-
expect(workflow.children[0].node.name).toBe('Child');
|
|
875
|
-
// Parent logs should exist
|
|
876
|
-
expect(workflow.node.logs.length).toBeGreaterThan(0);
|
|
877
|
-
// Parent events should exist
|
|
878
|
-
expect(workflow.node.events.length).toBeGreaterThan(0);
|
|
879
|
-
// Child should have logs
|
|
880
|
-
expect(workflow.children[0].node.logs.length).toBeGreaterThan(0);
|
|
881
|
-
// Child should have events
|
|
882
|
-
expect(workflow.children[0].node.events.length).toBeGreaterThan(0);
|
|
883
|
-
});
|
|
884
|
-
});
|
|
885
|
-
});
|
|
886
|
-
//# sourceMappingURL=prd-compliance.test.js.map
|