@auto-engineer/pipeline 1.65.0 → 1.67.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 (120) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +6 -6
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +135 -0
  5. package/dist/src/builder/define-v2.d.ts +101 -0
  6. package/dist/src/builder/define-v2.d.ts.map +1 -0
  7. package/dist/src/builder/define-v2.js +209 -0
  8. package/dist/src/builder/define-v2.js.map +1 -0
  9. package/dist/src/engine/command-dispatcher.d.ts +31 -0
  10. package/dist/src/engine/command-dispatcher.d.ts.map +1 -0
  11. package/dist/src/engine/command-dispatcher.js +26 -0
  12. package/dist/src/engine/command-dispatcher.js.map +1 -0
  13. package/dist/src/engine/event-router.d.ts +21 -0
  14. package/dist/src/engine/event-router.d.ts.map +1 -0
  15. package/dist/src/engine/event-router.js +22 -0
  16. package/dist/src/engine/event-router.js.map +1 -0
  17. package/dist/src/engine/index.d.ts +15 -0
  18. package/dist/src/engine/index.d.ts.map +1 -0
  19. package/dist/src/engine/index.js +15 -0
  20. package/dist/src/engine/index.js.map +1 -0
  21. package/dist/src/engine/pipeline-engine.d.ts +37 -0
  22. package/dist/src/engine/pipeline-engine.d.ts.map +1 -0
  23. package/dist/src/engine/pipeline-engine.js +53 -0
  24. package/dist/src/engine/pipeline-engine.js.map +1 -0
  25. package/dist/src/engine/projections/item-status.d.ts +9 -0
  26. package/dist/src/engine/projections/item-status.d.ts.map +1 -0
  27. package/dist/src/engine/projections/item-status.js +9 -0
  28. package/dist/src/engine/projections/item-status.js.map +1 -0
  29. package/dist/src/engine/projections/latest-run.d.ts +9 -0
  30. package/dist/src/engine/projections/latest-run.d.ts.map +1 -0
  31. package/dist/src/engine/projections/latest-run.js +9 -0
  32. package/dist/src/engine/projections/latest-run.js.map +1 -0
  33. package/dist/src/engine/projections/message-log.d.ts +9 -0
  34. package/dist/src/engine/projections/message-log.d.ts.map +1 -0
  35. package/dist/src/engine/projections/message-log.js +10 -0
  36. package/dist/src/engine/projections/message-log.js.map +1 -0
  37. package/dist/src/engine/projections/node-status.d.ts +9 -0
  38. package/dist/src/engine/projections/node-status.d.ts.map +1 -0
  39. package/dist/src/engine/projections/node-status.js +9 -0
  40. package/dist/src/engine/projections/node-status.js.map +1 -0
  41. package/dist/src/engine/projections/stats.d.ts +9 -0
  42. package/dist/src/engine/projections/stats.d.ts.map +1 -0
  43. package/dist/src/engine/projections/stats.js +9 -0
  44. package/dist/src/engine/projections/stats.js.map +1 -0
  45. package/dist/src/engine/sqlite-consumer.d.ts +11 -0
  46. package/dist/src/engine/sqlite-consumer.d.ts.map +1 -0
  47. package/dist/src/engine/sqlite-consumer.js +27 -0
  48. package/dist/src/engine/sqlite-consumer.js.map +1 -0
  49. package/dist/src/engine/sqlite-store.d.ts +10 -0
  50. package/dist/src/engine/sqlite-store.d.ts.map +1 -0
  51. package/dist/src/engine/sqlite-store.js +14 -0
  52. package/dist/src/engine/sqlite-store.js.map +1 -0
  53. package/dist/src/engine/workflow-processor.d.ts +20 -0
  54. package/dist/src/engine/workflow-processor.d.ts.map +1 -0
  55. package/dist/src/engine/workflow-processor.js +36 -0
  56. package/dist/src/engine/workflow-processor.js.map +1 -0
  57. package/dist/src/engine/workflows/await-workflow.d.ts +33 -0
  58. package/dist/src/engine/workflows/await-workflow.d.ts.map +1 -0
  59. package/dist/src/engine/workflows/await-workflow.js +45 -0
  60. package/dist/src/engine/workflows/await-workflow.js.map +1 -0
  61. package/dist/src/engine/workflows/phased-workflow.d.ts +64 -0
  62. package/dist/src/engine/workflows/phased-workflow.d.ts.map +1 -0
  63. package/dist/src/engine/workflows/phased-workflow.js +103 -0
  64. package/dist/src/engine/workflows/phased-workflow.js.map +1 -0
  65. package/dist/src/engine/workflows/settled-workflow.d.ts +62 -0
  66. package/dist/src/engine/workflows/settled-workflow.d.ts.map +1 -0
  67. package/dist/src/engine/workflows/settled-workflow.js +92 -0
  68. package/dist/src/engine/workflows/settled-workflow.js.map +1 -0
  69. package/dist/src/graph/types.d.ts +1 -1
  70. package/dist/src/graph/types.d.ts.map +1 -1
  71. package/dist/src/index.d.ts +2 -0
  72. package/dist/src/index.d.ts.map +1 -1
  73. package/dist/src/index.js +2 -0
  74. package/dist/src/index.js.map +1 -1
  75. package/dist/src/server/pipeline-server-v2.d.ts +48 -0
  76. package/dist/src/server/pipeline-server-v2.d.ts.map +1 -0
  77. package/dist/src/server/pipeline-server-v2.js +61 -0
  78. package/dist/src/server/pipeline-server-v2.js.map +1 -0
  79. package/dist/src/server/pipeline-server.d.ts +5 -1
  80. package/dist/src/server/pipeline-server.d.ts.map +1 -1
  81. package/dist/src/server/pipeline-server.js +71 -10
  82. package/dist/src/server/pipeline-server.js.map +1 -1
  83. package/dist/tsconfig.tsbuildinfo +1 -1
  84. package/ketchup-plan.md +13 -0
  85. package/package.json +3 -3
  86. package/src/builder/define-v2.specs.ts +236 -0
  87. package/src/builder/define-v2.ts +351 -0
  88. package/src/engine/command-dispatcher.specs.ts +62 -0
  89. package/src/engine/command-dispatcher.ts +46 -0
  90. package/src/engine/event-router.specs.ts +75 -0
  91. package/src/engine/event-router.ts +36 -0
  92. package/src/engine/index.ts +39 -0
  93. package/src/engine/pipeline-engine-e2e.specs.ts +776 -0
  94. package/src/engine/pipeline-engine.integration.specs.ts +126 -0
  95. package/src/engine/pipeline-engine.specs.ts +70 -0
  96. package/src/engine/pipeline-engine.ts +82 -0
  97. package/src/engine/projections/item-status.ts +11 -0
  98. package/src/engine/projections/latest-run.ts +10 -0
  99. package/src/engine/projections/message-log.ts +11 -0
  100. package/src/engine/projections/node-status.ts +10 -0
  101. package/src/engine/projections/projections.specs.ts +176 -0
  102. package/src/engine/projections/stats.ts +10 -0
  103. package/src/engine/sqlite-consumer.specs.ts +42 -0
  104. package/src/engine/sqlite-consumer.ts +34 -0
  105. package/src/engine/sqlite-store.specs.ts +46 -0
  106. package/src/engine/sqlite-store.ts +21 -0
  107. package/src/engine/workflow-processor.specs.ts +37 -0
  108. package/src/engine/workflow-processor.ts +57 -0
  109. package/src/engine/workflows/await-workflow.specs.ts +104 -0
  110. package/src/engine/workflows/await-workflow.ts +66 -0
  111. package/src/engine/workflows/phased-workflow.specs.ts +383 -0
  112. package/src/engine/workflows/phased-workflow.ts +153 -0
  113. package/src/engine/workflows/settled-workflow.specs.ts +364 -0
  114. package/src/engine/workflows/settled-workflow.ts +139 -0
  115. package/src/graph/types.ts +1 -1
  116. package/src/index.ts +2 -0
  117. package/src/server/pipeline-server-v2.specs.ts +91 -0
  118. package/src/server/pipeline-server-v2.ts +70 -0
  119. package/src/server/pipeline-server.specs.ts +327 -134
  120. package/src/server/pipeline-server.ts +77 -11
@@ -0,0 +1,22 @@
1
+ export function createEventRouter(dispatcher) {
2
+ const mappings = new Map();
3
+ return {
4
+ register(mapping) {
5
+ const existing = mappings.get(mapping.eventType) ?? [];
6
+ mappings.set(mapping.eventType, [...existing, ...mapping.commands]);
7
+ },
8
+ async route(event) {
9
+ const commands = mappings.get(event.type);
10
+ if (!commands) {
11
+ return [];
12
+ }
13
+ const commandPromises = commands.map((command) => {
14
+ const data = typeof command.data === 'function' ? command.data(event) : command.data;
15
+ return dispatcher.dispatch({ type: command.commandType, data });
16
+ });
17
+ const resultArrays = await Promise.all(commandPromises);
18
+ return resultArrays.flat();
19
+ },
20
+ };
21
+ }
22
+ //# sourceMappingURL=event-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-router.js","sourceRoot":"","sources":["../../../src/engine/event-router.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,iBAAiB,CAAC,UAAsD;IACtF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE5D,OAAO;QACL,QAAQ,CAAC,OAAoB;YAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,KAAY;YACtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC/C,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;gBACrF,OAAO,UAAU,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACxD,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { createCommandDispatcher, dispatchAndStore } from './command-dispatcher';
2
+ export { createEventRouter } from './event-router';
3
+ export { createPipelineEngine } from './pipeline-engine';
4
+ export { itemStatusProjection } from './projections/item-status';
5
+ export { latestRunProjection } from './projections/latest-run';
6
+ export { messageLogProjection } from './projections/message-log';
7
+ export { nodeStatusProjection } from './projections/node-status';
8
+ export { statsProjection } from './projections/stats';
9
+ export { createConsumer } from './sqlite-consumer';
10
+ export { createPipelineStore, type PipelineStore } from './sqlite-store';
11
+ export { createWorkflowProcessor, type WorkflowRegistration } from './workflow-processor';
12
+ export { type AwaitInput, type AwaitOutput, type AwaitState, createAwaitWorkflow, decide as awaitDecide, evolve as awaitEvolve, initialState as awaitInitialState, } from './workflows/await-workflow';
13
+ export { createPhasedWorkflow, decide as phasedDecide, evolve as phasedEvolve, initialState as phasedInitialState, type PhasedInput, type PhasedItem, type PhasedOutput, type PhasedState, } from './workflows/phased-workflow';
14
+ export { createSettledWorkflow, decide as settledDecide, evolve as settledEvolve, initialState as settledInitialState, type SettledInput, type SettledOutput, type SettledState, } from './workflows/settled-workflow';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,mBAAmB,EACnB,MAAM,IAAI,WAAW,EACrB,MAAM,IAAI,WAAW,EACrB,YAAY,IAAI,iBAAiB,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,MAAM,IAAI,YAAY,EACtB,MAAM,IAAI,YAAY,EACtB,YAAY,IAAI,kBAAkB,EAClC,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,MAAM,IAAI,aAAa,EACvB,MAAM,IAAI,aAAa,EACvB,YAAY,IAAI,mBAAmB,EACnC,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { createCommandDispatcher, dispatchAndStore } from './command-dispatcher.js';
2
+ export { createEventRouter } from './event-router.js';
3
+ export { createPipelineEngine } from './pipeline-engine.js';
4
+ export { itemStatusProjection } from './projections/item-status.js';
5
+ export { latestRunProjection } from './projections/latest-run.js';
6
+ export { messageLogProjection } from './projections/message-log.js';
7
+ export { nodeStatusProjection } from './projections/node-status.js';
8
+ export { statsProjection } from './projections/stats.js';
9
+ export { createConsumer } from './sqlite-consumer.js';
10
+ export { createPipelineStore } from './sqlite-store.js';
11
+ export { createWorkflowProcessor } from './workflow-processor.js';
12
+ export { createAwaitWorkflow, decide as awaitDecide, evolve as awaitEvolve, initialState as awaitInitialState, } from './workflows/await-workflow.js';
13
+ export { createPhasedWorkflow, decide as phasedDecide, evolve as phasedEvolve, initialState as phasedInitialState, } from './workflows/phased-workflow.js';
14
+ export { createSettledWorkflow, decide as settledDecide, evolve as settledEvolve, initialState as settledInitialState, } from './workflows/settled-workflow.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAA6B,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAIL,mBAAmB,EACnB,MAAM,IAAI,WAAW,EACrB,MAAM,IAAI,WAAW,EACrB,YAAY,IAAI,iBAAiB,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,MAAM,IAAI,YAAY,EACtB,MAAM,IAAI,YAAY,EACtB,YAAY,IAAI,kBAAkB,GAKnC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,MAAM,IAAI,aAAa,EACvB,MAAM,IAAI,aAAa,EACvB,YAAY,IAAI,mBAAmB,GAIpC,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { WorkflowRegistration } from './workflow-processor.js';
2
+ type Event = {
3
+ type: string;
4
+ data: Record<string, unknown>;
5
+ };
6
+ type CommandHandler = (command: {
7
+ type: string;
8
+ data: Record<string, unknown>;
9
+ }) => Array<{
10
+ type: string;
11
+ data: Record<string, unknown>;
12
+ }> | Promise<Array<{
13
+ type: string;
14
+ data: Record<string, unknown>;
15
+ }>>;
16
+ type EmitMapping = {
17
+ eventType: string;
18
+ commands: Array<{
19
+ commandType: string;
20
+ data: Record<string, unknown> | ((event: Event) => Record<string, unknown>);
21
+ }>;
22
+ };
23
+ export declare function createPipelineEngine(): Promise<{
24
+ registerCommandHandler(commandType: string, handler: CommandHandler): void;
25
+ registerEmitMapping(mapping: EmitMapping): void;
26
+ registerWorkflow(registration: WorkflowRegistration): void;
27
+ registeredCommands(): string[];
28
+ onEvent(listener: (event: Event) => void): void;
29
+ processWorkflowEvent(event: Event): Event[];
30
+ dispatch(command: {
31
+ type: string;
32
+ data: Record<string, unknown>;
33
+ }): Promise<void>;
34
+ close(): Promise<void>;
35
+ }>;
36
+ export {};
37
+ //# sourceMappingURL=pipeline-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-engine.d.ts","sourceRoot":"","sources":["../../../src/engine/pipeline-engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAGpE,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAE7D,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KACG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACtD,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC,CAAC;AAEpE,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KAC7E,CAAC,CAAC;CACJ,CAAC;AAEF,wBAAsB,oBAAoB;wCAuBF,MAAM,WAAW,cAAc,GAAG,IAAI;iCAI7C,WAAW,GAAG,IAAI;mCAIhB,oBAAoB,GAAG,IAAI;0BAIpC,MAAM,EAAE;sBAIZ,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;gCAInB,KAAK,GAAG,KAAK,EAAE;sBAInB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;aAOxE,OAAO,CAAC,IAAI,CAAC;GAI/B"}
@@ -0,0 +1,53 @@
1
+ import { createCommandDispatcher, dispatchAndStore } from './command-dispatcher.js';
2
+ import { createEventRouter } from './event-router.js';
3
+ import { createPipelineStore } from './sqlite-store.js';
4
+ import { createWorkflowProcessor } from './workflow-processor.js';
5
+ export async function createPipelineEngine() {
6
+ const store = await createPipelineStore();
7
+ const dispatcher = createCommandDispatcher();
8
+ const router = createEventRouter(dispatcher);
9
+ const workflows = createWorkflowProcessor();
10
+ const eventListeners = [];
11
+ let streamCounter = 0;
12
+ async function processEvents(events) {
13
+ for (const event of events) {
14
+ for (const listener of eventListeners) {
15
+ listener(event);
16
+ }
17
+ const routedEvents = await router.route(event);
18
+ const workflowOutputs = workflows.process(event);
19
+ await processEvents(routedEvents);
20
+ await processEvents(workflowOutputs);
21
+ }
22
+ }
23
+ return {
24
+ registerCommandHandler(commandType, handler) {
25
+ dispatcher.register(commandType, handler);
26
+ },
27
+ registerEmitMapping(mapping) {
28
+ router.register(mapping);
29
+ },
30
+ registerWorkflow(registration) {
31
+ workflows.register(registration);
32
+ },
33
+ registeredCommands() {
34
+ return dispatcher.registeredTypes();
35
+ },
36
+ onEvent(listener) {
37
+ eventListeners.push(listener);
38
+ },
39
+ processWorkflowEvent(event) {
40
+ return workflows.process(event);
41
+ },
42
+ async dispatch(command) {
43
+ streamCounter++;
44
+ const streamName = `pipeline-${streamCounter}`;
45
+ const results = await dispatchAndStore(dispatcher, store.eventStore, streamName, command);
46
+ await processEvents(results);
47
+ },
48
+ async close() {
49
+ await store.close();
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=pipeline-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-engine.js","sourceRoot":"","sources":["../../../src/engine/pipeline-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAmBlE,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,KAAK,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAkC,EAAE,CAAC;IACzD,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,UAAU,aAAa,CAAC,MAAe;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;gBACtC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAEjD,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAClC,MAAM,aAAa,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO;QACL,sBAAsB,CAAC,WAAmB,EAAE,OAAuB;YACjE,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED,mBAAmB,CAAC,OAAoB;YACtC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,gBAAgB,CAAC,YAAkC;YACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QAED,kBAAkB;YAChB,OAAO,UAAU,CAAC,eAAe,EAAE,CAAC;QACtC,CAAC;QAED,OAAO,CAAC,QAAgC;YACtC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,oBAAoB,CAAC,KAAY;YAC/B,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,OAAwD;YACrE,aAAa,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,YAAY,aAAa,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC1F,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,KAAK;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve, type ItemStatusChangedEvent, type ItemStatusDocument } from '../../projections/item-status-projection';
2
+ export { evolve, type ItemStatusChangedEvent, type ItemStatusDocument };
3
+ export declare const itemStatusProjection: {
4
+ name: string;
5
+ canHandle: readonly ["ItemStatusChanged"];
6
+ evolve: typeof evolve;
7
+ getDocumentId: (event: ItemStatusChangedEvent) => string;
8
+ };
9
+ //# sourceMappingURL=item-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-status.d.ts","sourceRoot":"","sources":["../../../../src/engine/projections/item-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAExH,OAAO,EAAE,MAAM,EAAE,KAAK,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,CAAC;AAExE,eAAO,MAAM,oBAAoB;;;;2BAIR,sBAAsB;CAE9C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve } from '../../projections/item-status-projection.js';
2
+ export { evolve };
3
+ export const itemStatusProjection = {
4
+ name: 'item-status',
5
+ canHandle: ['ItemStatusChanged'],
6
+ evolve,
7
+ getDocumentId: (event) => `${event.data.correlationId}-${event.data.commandType}-${event.data.itemKey}`,
8
+ };
9
+ //# sourceMappingURL=item-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-status.js","sourceRoot":"","sources":["../../../../src/engine/projections/item-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwD,MAAM,0CAA0C,CAAC;AAExH,OAAO,EAAE,MAAM,EAAwD,CAAC;AAExE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,CAAC,mBAAmB,CAAU;IACzC,MAAM;IACN,aAAa,EAAE,CAAC,KAA6B,EAAE,EAAE,CAC/C,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;CAChF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve, type LatestRunDocument } from '../../projections/latest-run-projection';
2
+ export { evolve, type LatestRunDocument };
3
+ export declare const latestRunProjection: {
4
+ name: string;
5
+ canHandle: readonly ["PipelineRunStarted"];
6
+ evolve: typeof evolve;
7
+ getDocumentId: () => string;
8
+ };
9
+ //# sourceMappingURL=latest-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latest-run.d.ts","sourceRoot":"","sources":["../../../../src/engine/projections/latest-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAEzF,OAAO,EAAE,MAAM,EAAE,KAAK,iBAAiB,EAAE,CAAC;AAE1C,eAAO,MAAM,mBAAmB;;;;;CAK/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve } from '../../projections/latest-run-projection.js';
2
+ export { evolve };
3
+ export const latestRunProjection = {
4
+ name: 'latest-run',
5
+ canHandle: ['PipelineRunStarted'],
6
+ evolve,
7
+ getDocumentId: () => 'latest',
8
+ };
9
+ //# sourceMappingURL=latest-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latest-run.js","sourceRoot":"","sources":["../../../../src/engine/projections/latest-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA0B,MAAM,yCAAyC,CAAC;AAEzF,OAAO,EAAE,MAAM,EAA0B,CAAC;AAE1C,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,CAAC,oBAAoB,CAAU;IAC1C,MAAM;IACN,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ;CAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve, type MessageLogDocument, type MessageLogEvent } from '../../projections/message-log-projection';
2
+ export { evolve, type MessageLogDocument, type MessageLogEvent };
3
+ export declare const messageLogProjection: {
4
+ name: string;
5
+ canHandle: readonly ["CommandDispatched", "DomainEventEmitted", "PipelineRunStarted", "NodeStatusChanged"];
6
+ evolve: typeof evolve;
7
+ getDocumentId: () => string;
8
+ };
9
+ //# sourceMappingURL=message-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-log.d.ts","sourceRoot":"","sources":["../../../../src/engine/projections/message-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAEjH,OAAO,EAAE,MAAM,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,CAAC;AAEjE,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { nanoid } from 'nanoid';
2
+ import { evolve } from '../../projections/message-log-projection.js';
3
+ export { evolve };
4
+ export const messageLogProjection = {
5
+ name: 'message-log',
6
+ canHandle: ['CommandDispatched', 'DomainEventEmitted', 'PipelineRunStarted', 'NodeStatusChanged'],
7
+ evolve,
8
+ getDocumentId: () => nanoid(),
9
+ };
10
+ //# sourceMappingURL=message-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-log.js","sourceRoot":"","sources":["../../../../src/engine/projections/message-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,MAAM,EAAiD,MAAM,0CAA0C,CAAC;AAEjH,OAAO,EAAE,MAAM,EAAiD,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,CAAU;IAC1G,MAAM;IACN,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;CAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve, type NodeStatusChangedEvent, type NodeStatusDocument } from '../../projections/node-status-projection';
2
+ export { evolve, type NodeStatusChangedEvent, type NodeStatusDocument };
3
+ export declare const nodeStatusProjection: {
4
+ name: string;
5
+ canHandle: readonly ["NodeStatusChanged"];
6
+ evolve: typeof evolve;
7
+ getDocumentId: (event: NodeStatusChangedEvent) => string;
8
+ };
9
+ //# sourceMappingURL=node-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-status.d.ts","sourceRoot":"","sources":["../../../../src/engine/projections/node-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAExH,OAAO,EAAE,MAAM,EAAE,KAAK,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,CAAC;AAExE,eAAO,MAAM,oBAAoB;;;;2BAIR,sBAAsB;CAC9C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve } from '../../projections/node-status-projection.js';
2
+ export { evolve };
3
+ export const nodeStatusProjection = {
4
+ name: 'node-status',
5
+ canHandle: ['NodeStatusChanged'],
6
+ evolve,
7
+ getDocumentId: (event) => `${event.data.correlationId}-${event.data.commandName}`,
8
+ };
9
+ //# sourceMappingURL=node-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-status.js","sourceRoot":"","sources":["../../../../src/engine/projections/node-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwD,MAAM,0CAA0C,CAAC;AAExH,OAAO,EAAE,MAAM,EAAwD,CAAC;AAExE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,CAAC,mBAAmB,CAAU;IACzC,MAAM;IACN,aAAa,EAAE,CAAC,KAA6B,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;CAC1G,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve, type StatsDocument } from '../../projections/stats-projection';
2
+ export { evolve, type StatsDocument };
3
+ export declare const statsProjection: {
4
+ name: string;
5
+ canHandle: readonly ["CommandDispatched", "DomainEventEmitted"];
6
+ evolve: typeof evolve;
7
+ getDocumentId: () => string;
8
+ };
9
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../../src/engine/projections/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEhF,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,CAAC;AAEtC,eAAO,MAAM,eAAe;;;;;CAK3B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { evolve } from '../../projections/stats-projection.js';
2
+ export { evolve };
3
+ export const statsProjection = {
4
+ name: 'stats',
5
+ canHandle: ['CommandDispatched', 'DomainEventEmitted'],
6
+ evolve,
7
+ getDocumentId: () => 'global',
8
+ };
9
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../../src/engine/projections/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,oCAAoC,CAAC;AAEhF,OAAO,EAAE,MAAM,EAAsB,CAAC;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,CAAC,mBAAmB,EAAE,oBAAoB,CAAU;IAC/D,MAAM;IACN,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ;CAC9B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PipelineStore } from './sqlite-store.js';
2
+ type EventHandler = (event: {
3
+ type: string;
4
+ data: Record<string, unknown>;
5
+ }) => void;
6
+ export declare function createConsumer(store: PipelineStore): {
7
+ on(eventType: string, handler: EventHandler): void;
8
+ poll(): Promise<void>;
9
+ };
10
+ export {};
11
+ //# sourceMappingURL=sqlite-consumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-consumer.d.ts","sourceRoot":"","sources":["../../../src/engine/sqlite-consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAK,IAAI,CAAC;AAErF,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa;kBAMjC,MAAM,WAAW,YAAY,GAAG,IAAI;YAIpC,OAAO,CAAC,IAAI,CAAC;EAkB9B"}
@@ -0,0 +1,27 @@
1
+ import { readMessagesBatch, sqliteConnection } from '@event-driven-io/emmett-sqlite';
2
+ export function createConsumer(store) {
3
+ const handlers = new Map();
4
+ let lastPosition = 0n;
5
+ const connection = sqliteConnection({ fileName: store.fileName });
6
+ return {
7
+ on(eventType, handler) {
8
+ handlers.set(eventType, handler);
9
+ },
10
+ async poll() {
11
+ const { messages, currentGlobalPosition } = await readMessagesBatch(connection, {
12
+ after: lastPosition,
13
+ batchSize: 1000,
14
+ });
15
+ for (const message of messages) {
16
+ const handler = handlers.get(message.type);
17
+ if (handler) {
18
+ handler({ type: message.type, data: message.data });
19
+ }
20
+ }
21
+ if (messages.length > 0) {
22
+ lastPosition = currentGlobalPosition;
23
+ }
24
+ },
25
+ };
26
+ }
27
+ //# sourceMappingURL=sqlite-consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-consumer.js","sourceRoot":"","sources":["../../../src/engine/sqlite-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAKrF,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAElE,OAAO;QACL,EAAE,CAAC,SAAiB,EAAE,OAAqB;YACzC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,IAAI;YACR,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE;gBAC9E,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAA+B,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,YAAY,GAAG,qBAAqB,CAAC;YACvC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type SQLiteEventStore } from '@event-driven-io/emmett-sqlite';
2
+ export interface PipelineStore {
3
+ eventStore: SQLiteEventStore;
4
+ fileName: string;
5
+ close: () => Promise<void>;
6
+ }
7
+ export declare function createPipelineStore(options?: {
8
+ fileName?: string;
9
+ }): Promise<PipelineStore>;
10
+ //# sourceMappingURL=sqlite-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../src/engine/sqlite-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAE5F,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAYjG"}
@@ -0,0 +1,14 @@
1
+ import { getSQLiteEventStore } from '@event-driven-io/emmett-sqlite';
2
+ export async function createPipelineStore(options) {
3
+ const fileName = options?.fileName ?? 'file::memory:?cache=shared';
4
+ const eventStore = getSQLiteEventStore({
5
+ fileName,
6
+ schema: { autoMigration: 'CreateOrUpdate' },
7
+ });
8
+ return {
9
+ eventStore,
10
+ fileName,
11
+ close: async () => { },
12
+ };
13
+ }
14
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../../src/engine/sqlite-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAyB,MAAM,gCAAgC,CAAC;AAQ5F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA+B;IACvE,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,4BAA4B,CAAC;IACnE,MAAM,UAAU,GAAG,mBAAmB,CAAC;QACrC,QAAQ;QACR,MAAM,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE;KAC5C,CAAC,CAAC;IAEH,OAAO;QACL,UAAU;QACV,QAAQ;QACR,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ type Event = {
2
+ type: string;
3
+ data: Record<string, unknown>;
4
+ };
5
+ type WorkflowDef = {
6
+ decide: (input: Event, state: unknown) => Event | Event[];
7
+ evolve: (state: unknown, event: Event) => unknown;
8
+ initialState: () => unknown;
9
+ };
10
+ export type WorkflowRegistration = {
11
+ id: string;
12
+ workflow: WorkflowDef;
13
+ inputEvents: string[];
14
+ };
15
+ export declare function createWorkflowProcessor(): {
16
+ register(registration: WorkflowRegistration): void;
17
+ process(event: Event): Event[];
18
+ };
19
+ export {};
20
+ //# sourceMappingURL=workflow-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-processor.d.ts","sourceRoot":"","sources":["../../../src/engine/workflow-processor.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAE7D,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,GAAG,KAAK,EAAE,CAAC;IAC1D,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAClD,YAAY,EAAE,MAAM,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAgB,uBAAuB;2BAaZ,oBAAoB,GAAG,IAAI;mBAKnC,KAAK,GAAG,KAAK,EAAE;EAwBjC"}
@@ -0,0 +1,36 @@
1
+ export function createWorkflowProcessor() {
2
+ const registrations = new Map();
3
+ const eventsByWorkflow = new Map();
4
+ function rebuildState(reg, events) {
5
+ let state = reg.workflow.initialState();
6
+ for (const event of events) {
7
+ state = reg.workflow.evolve(state, event);
8
+ }
9
+ return state;
10
+ }
11
+ return {
12
+ register(registration) {
13
+ registrations.set(registration.id, registration);
14
+ eventsByWorkflow.set(registration.id, []);
15
+ },
16
+ process(event) {
17
+ const outputs = [];
18
+ for (const [id, reg] of registrations) {
19
+ if (!reg.inputEvents.includes(event.type)) {
20
+ continue;
21
+ }
22
+ const history = eventsByWorkflow.get(id);
23
+ history.push(event);
24
+ const state = rebuildState(reg, history);
25
+ const result = reg.workflow.decide(event, state);
26
+ const resultEvents = Array.isArray(result) ? result : [result];
27
+ for (const outputEvent of resultEvents) {
28
+ history.push(outputEvent);
29
+ outputs.push(outputEvent);
30
+ }
31
+ }
32
+ return outputs;
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=workflow-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-processor.js","sourceRoot":"","sources":["../../../src/engine/workflow-processor.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,uBAAuB;IACrC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEpD,SAAS,YAAY,CAAC,GAAyB,EAAE,MAAe;QAC9D,IAAI,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,QAAQ,CAAC,YAAkC;YACzC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YACjD,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,CAAC,KAAY;YAClB,MAAM,OAAO,GAAY,EAAE,CAAC;YAE5B,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,SAAS;gBACX,CAAC;gBAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEpB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACjD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAE/D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC1B,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ export type AwaitInput = {
2
+ type: 'StartAwait';
3
+ data: {
4
+ correlationId: string;
5
+ keys: string[];
6
+ };
7
+ } | {
8
+ type: 'KeyCompleted';
9
+ data: {
10
+ key: string;
11
+ result: Record<string, unknown>;
12
+ };
13
+ };
14
+ export type AwaitOutput = {
15
+ type: 'AwaitCompleted';
16
+ data: {
17
+ results: Record<string, Record<string, unknown>>;
18
+ };
19
+ };
20
+ export type AwaitState = {
21
+ status: 'idle' | 'waiting' | 'completed';
22
+ pendingKeys: string[];
23
+ results: Record<string, Record<string, unknown>>;
24
+ };
25
+ export declare function initialState(): AwaitState;
26
+ export declare function decide(input: AwaitInput, state: AwaitState): AwaitOutput | AwaitOutput[];
27
+ export declare function createAwaitWorkflow(): {
28
+ decide: typeof decide;
29
+ evolve: typeof evolve;
30
+ initialState: typeof initialState;
31
+ };
32
+ export declare function evolve(state: AwaitState, event: AwaitInput | AwaitOutput): AwaitState;
33
+ //# sourceMappingURL=await-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"await-workflow.d.ts","sourceRoot":"","sources":["../../../../src/engine/workflows/await-workflow.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAErF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD,CAAC;AAEF,wBAAgB,YAAY,IAAI,UAAU,CAMzC;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,EAAE,CAQxF;AAED,wBAAgB,mBAAmB,IAAI;IACrC,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,YAAY,CAAC;CACnC,CAEA;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,CAwBrF"}
@@ -0,0 +1,45 @@
1
+ export function initialState() {
2
+ return {
3
+ status: 'idle',
4
+ pendingKeys: [],
5
+ results: {},
6
+ };
7
+ }
8
+ export function decide(input, state) {
9
+ if (state.status !== 'waiting' || state.pendingKeys.length > 0) {
10
+ return [];
11
+ }
12
+ return {
13
+ type: 'AwaitCompleted',
14
+ data: { results: state.results },
15
+ };
16
+ }
17
+ export function createAwaitWorkflow() {
18
+ return { decide, evolve, initialState };
19
+ }
20
+ export function evolve(state, event) {
21
+ switch (event.type) {
22
+ case 'StartAwait':
23
+ return {
24
+ ...state,
25
+ status: 'waiting',
26
+ pendingKeys: event.data.keys,
27
+ results: {},
28
+ };
29
+ case 'KeyCompleted': {
30
+ if (!state.pendingKeys.includes(event.data.key)) {
31
+ return state;
32
+ }
33
+ return {
34
+ ...state,
35
+ pendingKeys: state.pendingKeys.filter((k) => k !== event.data.key),
36
+ results: { ...state.results, [event.data.key]: event.data.result },
37
+ };
38
+ }
39
+ case 'AwaitCompleted':
40
+ return { ...state, status: 'completed' };
41
+ default:
42
+ return state;
43
+ }
44
+ }
45
+ //# sourceMappingURL=await-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"await-workflow.js","sourceRoot":"","sources":["../../../../src/engine/workflows/await-workflow.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,EAAE;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAiB,EAAE,KAAiB;IACzD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IAKjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAiB,EAAE,KAA+B;IACvE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,OAAO;gBACL,GAAG,KAAK;gBACR,MAAM,EAAE,SAAS;gBACjB,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;gBAC5B,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO;gBACL,GAAG,KAAK;gBACR,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;gBAClE,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;aACnE,CAAC;QACJ,CAAC;QACD,KAAK,gBAAgB;YACnB,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAC3C;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}