@codemation/core 0.0.18 → 0.2.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/CHANGELOG.md +24 -0
- package/dist/EngineRuntimeRegistration.types-0sgV2XL2.d.ts +42 -0
- package/dist/EngineWorkflowRunnerService-Dx7bJsJR.d.cts +73 -0
- package/dist/InMemoryRunDataFactory-qIYQEar7.d.cts +94 -0
- package/dist/{InMemoryLiveWorkflowRepository-DxoualoC.d.ts → RunIntentService-BCvGdOSY.d.ts} +438 -9
- package/dist/{RunIntentService-BB4nqX3-.js → RunIntentService-BFA48UpH.js} +308 -71
- package/dist/RunIntentService-BFA48UpH.js.map +1 -0
- package/dist/{InMemoryLiveWorkflowRepository-orY1VsWG.d.cts → RunIntentService-CV8izV8t.d.cts} +214 -7
- package/dist/{RunIntentService-nRx-m0Xs.cjs → RunIntentService-DcxXf_AM.cjs} +318 -69
- package/dist/RunIntentService-DcxXf_AM.cjs.map +1 -0
- package/dist/bootstrap/index.cjs +14 -1135
- package/dist/bootstrap/index.d.cts +7 -60
- package/dist/bootstrap/index.d.ts +4 -40
- package/dist/bootstrap/index.js +3 -1122
- package/dist/bootstrap-D67Sf2BF.js +1136 -0
- package/dist/bootstrap-D67Sf2BF.js.map +1 -0
- package/dist/bootstrap-DoQHAEQJ.cjs +1203 -0
- package/dist/bootstrap-DoQHAEQJ.cjs.map +1 -0
- package/dist/{index-B4_ZRTyI.d.ts → index-BHmrZIHp.d.ts} +32 -251
- package/dist/index.cjs +98 -223
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +196 -6
- package/dist/index.d.ts +3 -3
- package/dist/index.js +92 -218
- package/dist/index.js.map +1 -1
- package/dist/testing.cjs +329 -3
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +181 -4
- package/dist/testing.d.ts +181 -3
- package/dist/testing.js +319 -2
- package/dist/testing.js.map +1 -1
- package/dist/workflowActivationPolicy-B8HzTk3o.js +201 -0
- package/dist/workflowActivationPolicy-B8HzTk3o.js.map +1 -0
- package/dist/workflowActivationPolicy-BzyzXLa_.cjs +231 -0
- package/dist/workflowActivationPolicy-BzyzXLa_.cjs.map +1 -0
- package/package.json +1 -1
- package/src/ai/AgentConnectionNodeCollector.ts +99 -0
- package/src/ai/AgentToolFactory.ts +38 -2
- package/src/ai/AiHost.ts +1 -1
- package/src/browser.ts +11 -0
- package/src/contracts/executionPersistenceContracts.ts +186 -0
- package/src/contracts/index.ts +1 -0
- package/src/contracts/runFinishedAtFactory.ts +5 -2
- package/src/contracts/runTypes.ts +10 -0
- package/src/contracts/runtimeTypes.ts +6 -2
- package/src/contracts/workflowTypes.ts +3 -2
- package/src/events/EventPublishingWorkflowExecutionRepository.ts +5 -0
- package/src/execution/ActivationEnqueueService.ts +8 -8
- package/src/execution/PersistedRunStateTerminalBuilder.ts +3 -0
- package/src/index.ts +6 -0
- package/src/orchestration/NodeExecutionRequestHandlerService.ts +11 -6
- package/src/orchestration/RunContinuationService.ts +94 -24
- package/src/planning/CurrentStateFrontierPlanner.ts +24 -1
- package/src/runStorage/InMemoryWorkflowExecutionRepository.ts +14 -1
- package/src/runtime/RunIntentService.ts +68 -14
- package/src/scheduler/DefaultDrivingScheduler.ts +21 -11
- package/src/scheduler/InlineDrivingScheduler.ts +17 -21
- package/src/testing/CapturingScheduler.ts +15 -0
- package/src/testing/EngineTestKitRunIdFactory.ts +24 -0
- package/src/testing/InMemoryTriggerSetupStateRepository.ts +21 -0
- package/src/testing/PrefixedSequentialIdGenerator.ts +17 -0
- package/src/testing/RegistrarEngineTestKit.types.ts +76 -0
- package/src/testing/RegistrarEngineTestKitFactory.ts +154 -0
- package/src/testing/SubWorkflowRunnerTestNode.ts +83 -0
- package/src/testing/WorkflowTestHarnessManualTrigger.ts +39 -0
- package/src/testing/WorkflowTestKit.types.ts +9 -0
- package/src/testing/WorkflowTestKitBuilder.ts +77 -0
- package/src/testing/WorkflowTestKitNodeRegistrationContextFactory.ts +17 -0
- package/src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts +26 -0
- package/src/testing.ts +19 -0
- package/src/types/index.ts +1 -0
- package/src/workflow/definition/ConnectionNodeIdFactory.ts +28 -0
- package/dist/InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs +0 -151
- package/dist/InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs.map +0 -1
- package/dist/InMemoryLiveWorkflowRepository-BoLNnVLg.js +0 -139
- package/dist/InMemoryLiveWorkflowRepository-BoLNnVLg.js.map +0 -1
- package/dist/RunIntentService-BB4nqX3-.js.map +0 -1
- package/dist/RunIntentService-ByuUYsAL.d.cts +0 -279
- package/dist/RunIntentService-nRx-m0Xs.cjs.map +0 -1
- package/dist/WorkflowSnapshotCodec-DSEzKyt3.d.cts +0 -22
- package/dist/bootstrap/index.cjs.map +0 -1
- package/dist/bootstrap/index.js.map +0 -1
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/workflowSnapshots/WorkflowSnapshotCodec.ts
|
|
3
|
-
var WorkflowSnapshotCodec = class {
|
|
4
|
-
constructor(tokenRegistry) {
|
|
5
|
-
this.tokenRegistry = tokenRegistry;
|
|
6
|
-
}
|
|
7
|
-
create(workflow) {
|
|
8
|
-
return {
|
|
9
|
-
id: workflow.id,
|
|
10
|
-
name: workflow.name,
|
|
11
|
-
workflowErrorHandlerConfigured: workflow.workflowErrorHandler !== void 0,
|
|
12
|
-
...workflow.connections !== void 0 && workflow.connections.length > 0 ? { connections: workflow.connections } : {},
|
|
13
|
-
nodes: workflow.nodes.map((node) => ({
|
|
14
|
-
id: node.id,
|
|
15
|
-
kind: node.kind,
|
|
16
|
-
name: node.name,
|
|
17
|
-
nodeTokenId: this.resolveTokenId(node.type),
|
|
18
|
-
configTokenId: this.resolveTokenId(node.config.type),
|
|
19
|
-
tokenName: this.resolveTokenName(node.type),
|
|
20
|
-
configTokenName: this.resolveTokenName(node.config.type),
|
|
21
|
-
config: this.serializeConfig(node.config)
|
|
22
|
-
})),
|
|
23
|
-
edges: workflow.edges.map((edge) => ({
|
|
24
|
-
from: {
|
|
25
|
-
nodeId: edge.from.nodeId,
|
|
26
|
-
output: edge.from.output
|
|
27
|
-
},
|
|
28
|
-
to: {
|
|
29
|
-
nodeId: edge.to.nodeId,
|
|
30
|
-
input: edge.to.input
|
|
31
|
-
}
|
|
32
|
-
}))
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
hydrate(snapshotNode, liveConfig) {
|
|
36
|
-
const hydrated = this.mergeValue(liveConfig, snapshotNode.config);
|
|
37
|
-
const configToken = this.tokenRegistry.resolve(snapshotNode.configTokenId);
|
|
38
|
-
Object.assign(hydrated, {
|
|
39
|
-
type: configToken ?? liveConfig.type,
|
|
40
|
-
kind: snapshotNode.kind
|
|
41
|
-
});
|
|
42
|
-
if (snapshotNode.name && !("name" in hydrated && hydrated.name)) Object.assign(hydrated, { name: snapshotNode.name });
|
|
43
|
-
return hydrated;
|
|
44
|
-
}
|
|
45
|
-
serializeConfig(config) {
|
|
46
|
-
try {
|
|
47
|
-
const cloned = JSON.parse(JSON.stringify(config));
|
|
48
|
-
this.injectTokenIds(cloned, config);
|
|
49
|
-
return cloned;
|
|
50
|
-
} catch {
|
|
51
|
-
const fallback = {
|
|
52
|
-
kind: config.kind,
|
|
53
|
-
name: config.name,
|
|
54
|
-
id: config.id,
|
|
55
|
-
icon: config.icon,
|
|
56
|
-
execution: config.execution
|
|
57
|
-
};
|
|
58
|
-
this.injectTokenIds(fallback, config);
|
|
59
|
-
return fallback;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
injectTokenIds(target, source) {
|
|
63
|
-
const type = this.asTypeToken(source.type);
|
|
64
|
-
if (type) target.tokenId = this.tokenRegistry.getTokenId(type) ?? this.resolveTokenName(type) ?? "unknown";
|
|
65
|
-
for (const [key, value] of Object.entries(source)) {
|
|
66
|
-
if (key === "type" || value == null) continue;
|
|
67
|
-
if (Array.isArray(value)) {
|
|
68
|
-
const targetArray = target[key];
|
|
69
|
-
if (Array.isArray(targetArray)) value.forEach((item, index) => {
|
|
70
|
-
if (item && typeof item === "object" && targetArray[index] && typeof targetArray[index] === "object") this.injectTokenIds(targetArray[index], item);
|
|
71
|
-
});
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
if (typeof value === "object") {
|
|
75
|
-
const targetValue = target[key];
|
|
76
|
-
if (targetValue && typeof targetValue === "object") this.injectTokenIds(targetValue, value);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
mergeValue(liveValue, snapshotValue) {
|
|
81
|
-
const liveRecord = this.asRecord(liveValue);
|
|
82
|
-
const snapshotRecord = this.asRecord(snapshotValue);
|
|
83
|
-
const hydrated = Object.create(liveValue && typeof liveValue === "object" ? Object.getPrototypeOf(liveValue) ?? Object.prototype : Object.prototype);
|
|
84
|
-
for (const [key, value] of Object.entries(snapshotRecord)) hydrated[key] = this.mergeNestedValue(liveRecord[key], value);
|
|
85
|
-
this.restoreNonSerializableProperties(liveRecord, hydrated);
|
|
86
|
-
this.restoreTypeProperty(hydrated);
|
|
87
|
-
return hydrated;
|
|
88
|
-
}
|
|
89
|
-
mergeNestedValue(liveValue, snapshotValue) {
|
|
90
|
-
if (Array.isArray(snapshotValue)) {
|
|
91
|
-
const liveArray = Array.isArray(liveValue) ? liveValue : [];
|
|
92
|
-
return snapshotValue.map((entry, index) => this.mergeNestedValue(liveArray[index], entry));
|
|
93
|
-
}
|
|
94
|
-
if (snapshotValue && typeof snapshotValue === "object") return this.mergeValue(liveValue, snapshotValue);
|
|
95
|
-
return snapshotValue;
|
|
96
|
-
}
|
|
97
|
-
restoreNonSerializableProperties(liveRecord, hydrated) {
|
|
98
|
-
for (const [key, value] of Object.entries(liveRecord)) if (typeof value === "function" || typeof value === "symbol") hydrated[key] = value;
|
|
99
|
-
}
|
|
100
|
-
restoreTypeProperty(record) {
|
|
101
|
-
const tokenId = typeof record.tokenId === "string" ? record.tokenId : void 0;
|
|
102
|
-
if (!tokenId) return;
|
|
103
|
-
const type = this.tokenRegistry.resolve(tokenId);
|
|
104
|
-
if (type) record.type = type;
|
|
105
|
-
}
|
|
106
|
-
resolveTokenId(token) {
|
|
107
|
-
return this.tokenRegistry.getTokenId(token) ?? this.resolveTokenName(token) ?? "unknown";
|
|
108
|
-
}
|
|
109
|
-
resolveTokenName(token) {
|
|
110
|
-
if (typeof token === "function" && token.name) return token.name;
|
|
111
|
-
if (typeof token === "string") return token;
|
|
112
|
-
}
|
|
113
|
-
asTypeToken(value) {
|
|
114
|
-
if (typeof value === "function" || typeof value === "string" || typeof value === "symbol") return value;
|
|
115
|
-
}
|
|
116
|
-
asRecord(value) {
|
|
117
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
118
|
-
return { ...value };
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
//#endregion
|
|
123
|
-
//#region src/runtime/InMemoryLiveWorkflowRepository.ts
|
|
124
|
-
var InMemoryLiveWorkflowRepository = class {
|
|
125
|
-
workflowsById = /* @__PURE__ */ new Map();
|
|
126
|
-
setWorkflows(workflows) {
|
|
127
|
-
this.workflowsById.clear();
|
|
128
|
-
for (const workflow of workflows) this.workflowsById.set(workflow.id, workflow);
|
|
129
|
-
}
|
|
130
|
-
list() {
|
|
131
|
-
return [...this.workflowsById.values()];
|
|
132
|
-
}
|
|
133
|
-
get(workflowId) {
|
|
134
|
-
return this.workflowsById.get(workflowId);
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
//#endregion
|
|
139
|
-
Object.defineProperty(exports, 'InMemoryLiveWorkflowRepository', {
|
|
140
|
-
enumerable: true,
|
|
141
|
-
get: function () {
|
|
142
|
-
return InMemoryLiveWorkflowRepository;
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
Object.defineProperty(exports, 'WorkflowSnapshotCodec', {
|
|
146
|
-
enumerable: true,
|
|
147
|
-
get: function () {
|
|
148
|
-
return WorkflowSnapshotCodec;
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
//# sourceMappingURL=InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs","names":["tokenRegistry: PersistedWorkflowTokenRegistryLike","fallback: Record<string, unknown>"],"sources":["../src/workflowSnapshots/WorkflowSnapshotCodec.ts","../src/runtime/InMemoryLiveWorkflowRepository.ts"],"sourcesContent":["import type { TypeToken } from \"../di\";\nimport type {\n NodeConfigBase,\n PersistedTokenId,\n PersistedWorkflowSnapshot,\n PersistedWorkflowSnapshotNode,\n PersistedWorkflowTokenRegistryLike,\n WorkflowDefinition,\n} from \"../types\";\n\nexport class WorkflowSnapshotCodec {\n constructor(private readonly tokenRegistry: PersistedWorkflowTokenRegistryLike) {}\n\n create(workflow: WorkflowDefinition): PersistedWorkflowSnapshot {\n return {\n id: workflow.id,\n name: workflow.name,\n workflowErrorHandlerConfigured: workflow.workflowErrorHandler !== undefined,\n ...(workflow.connections !== undefined && workflow.connections.length > 0\n ? { connections: workflow.connections }\n : {}),\n nodes: workflow.nodes.map((node) => ({\n id: node.id,\n kind: node.kind,\n name: node.name,\n nodeTokenId: this.resolveTokenId(node.type),\n configTokenId: this.resolveTokenId(node.config.type),\n tokenName: this.resolveTokenName(node.type),\n configTokenName: this.resolveTokenName(node.config.type),\n config: this.serializeConfig(node.config),\n })),\n edges: workflow.edges.map((edge) => ({\n from: { nodeId: edge.from.nodeId, output: edge.from.output },\n to: { nodeId: edge.to.nodeId, input: edge.to.input },\n })),\n };\n }\n\n hydrate(snapshotNode: PersistedWorkflowSnapshotNode, liveConfig: NodeConfigBase): NodeConfigBase {\n const hydrated = this.mergeValue(liveConfig, snapshotNode.config);\n const configToken = this.tokenRegistry.resolve(snapshotNode.configTokenId);\n Object.assign(hydrated, {\n type: configToken ?? liveConfig.type,\n kind: snapshotNode.kind,\n });\n if (snapshotNode.name && !(\"name\" in hydrated && hydrated.name)) {\n Object.assign(hydrated, { name: snapshotNode.name });\n }\n return hydrated as unknown as NodeConfigBase;\n }\n\n private serializeConfig(config: NodeConfigBase): unknown {\n try {\n const cloned = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n this.injectTokenIds(cloned, config as unknown as Record<string, unknown>);\n return cloned;\n } catch {\n const fallback: Record<string, unknown> = {\n kind: config.kind,\n name: config.name,\n id: config.id,\n icon: config.icon,\n execution: config.execution,\n };\n this.injectTokenIds(fallback, config as unknown as Record<string, unknown>);\n return fallback;\n }\n }\n\n private injectTokenIds(target: Record<string, unknown>, source: Record<string, unknown>): void {\n const type = this.asTypeToken(source.type);\n if (type) {\n target.tokenId = this.tokenRegistry.getTokenId(type) ?? this.resolveTokenName(type) ?? \"unknown\";\n }\n for (const [key, value] of Object.entries(source)) {\n if (key === \"type\" || value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n const targetArray = target[key];\n if (Array.isArray(targetArray)) {\n value.forEach((item, index) => {\n if (item && typeof item === \"object\" && targetArray[index] && typeof targetArray[index] === \"object\") {\n this.injectTokenIds(targetArray[index] as Record<string, unknown>, item as Record<string, unknown>);\n }\n });\n }\n continue;\n }\n if (typeof value === \"object\") {\n const targetValue = target[key];\n if (targetValue && typeof targetValue === \"object\") {\n this.injectTokenIds(targetValue as Record<string, unknown>, value as Record<string, unknown>);\n }\n }\n }\n }\n\n private mergeValue(liveValue: unknown, snapshotValue: unknown): Record<string, unknown> {\n const liveRecord = this.asRecord(liveValue);\n const snapshotRecord = this.asRecord(snapshotValue);\n const hydrated = Object.create(\n liveValue && typeof liveValue === \"object\"\n ? (Object.getPrototypeOf(liveValue) ?? Object.prototype)\n : Object.prototype,\n ) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(snapshotRecord)) {\n hydrated[key] = this.mergeNestedValue(liveRecord[key], value);\n }\n\n this.restoreNonSerializableProperties(liveRecord, hydrated);\n this.restoreTypeProperty(hydrated);\n return hydrated;\n }\n\n private mergeNestedValue(liveValue: unknown, snapshotValue: unknown): unknown {\n if (Array.isArray(snapshotValue)) {\n const liveArray = Array.isArray(liveValue) ? liveValue : [];\n return snapshotValue.map((entry, index) => this.mergeNestedValue(liveArray[index], entry));\n }\n if (snapshotValue && typeof snapshotValue === \"object\") {\n return this.mergeValue(liveValue, snapshotValue);\n }\n return snapshotValue;\n }\n\n private restoreNonSerializableProperties(\n liveRecord: Record<string, unknown>,\n hydrated: Record<string, unknown>,\n ): void {\n for (const [key, value] of Object.entries(liveRecord)) {\n if (typeof value === \"function\" || typeof value === \"symbol\") {\n hydrated[key] = value;\n }\n }\n }\n\n private restoreTypeProperty(record: Record<string, unknown>): void {\n const tokenId = typeof record.tokenId === \"string\" ? record.tokenId : undefined;\n if (!tokenId) {\n return;\n }\n const type = this.tokenRegistry.resolve(tokenId as PersistedTokenId);\n if (type) {\n record.type = type;\n }\n }\n\n private resolveTokenId(token: TypeToken<unknown>): PersistedTokenId {\n return (this.tokenRegistry.getTokenId(token) ?? this.resolveTokenName(token) ?? \"unknown\") as PersistedTokenId;\n }\n\n private resolveTokenName(token: TypeToken<unknown>): string | undefined {\n if (typeof token === \"function\" && token.name) {\n return token.name;\n }\n if (typeof token === \"string\") {\n return token;\n }\n return undefined;\n }\n\n private asTypeToken(value: unknown): TypeToken<unknown> | undefined {\n if (typeof value === \"function\" || typeof value === \"string\" || typeof value === \"symbol\") {\n return value as TypeToken<unknown>;\n }\n return undefined;\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n return { ...(value as Record<string, unknown>) };\n }\n}\n","import type { LiveWorkflowRepository, WorkflowDefinition, WorkflowId } from \"../types\";\n\nexport class InMemoryLiveWorkflowRepository implements LiveWorkflowRepository {\n private readonly workflowsById = new Map<WorkflowId, WorkflowDefinition>();\n\n setWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void {\n this.workflowsById.clear();\n for (const workflow of workflows) {\n this.workflowsById.set(workflow.id, workflow);\n }\n }\n\n list(): ReadonlyArray<WorkflowDefinition> {\n return [...this.workflowsById.values()];\n }\n\n get(workflowId: WorkflowId): WorkflowDefinition | undefined {\n return this.workflowsById.get(workflowId);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
//#region src/workflowSnapshots/WorkflowSnapshotCodec.ts
|
|
2
|
-
var WorkflowSnapshotCodec = class {
|
|
3
|
-
constructor(tokenRegistry) {
|
|
4
|
-
this.tokenRegistry = tokenRegistry;
|
|
5
|
-
}
|
|
6
|
-
create(workflow) {
|
|
7
|
-
return {
|
|
8
|
-
id: workflow.id,
|
|
9
|
-
name: workflow.name,
|
|
10
|
-
workflowErrorHandlerConfigured: workflow.workflowErrorHandler !== void 0,
|
|
11
|
-
...workflow.connections !== void 0 && workflow.connections.length > 0 ? { connections: workflow.connections } : {},
|
|
12
|
-
nodes: workflow.nodes.map((node) => ({
|
|
13
|
-
id: node.id,
|
|
14
|
-
kind: node.kind,
|
|
15
|
-
name: node.name,
|
|
16
|
-
nodeTokenId: this.resolveTokenId(node.type),
|
|
17
|
-
configTokenId: this.resolveTokenId(node.config.type),
|
|
18
|
-
tokenName: this.resolveTokenName(node.type),
|
|
19
|
-
configTokenName: this.resolveTokenName(node.config.type),
|
|
20
|
-
config: this.serializeConfig(node.config)
|
|
21
|
-
})),
|
|
22
|
-
edges: workflow.edges.map((edge) => ({
|
|
23
|
-
from: {
|
|
24
|
-
nodeId: edge.from.nodeId,
|
|
25
|
-
output: edge.from.output
|
|
26
|
-
},
|
|
27
|
-
to: {
|
|
28
|
-
nodeId: edge.to.nodeId,
|
|
29
|
-
input: edge.to.input
|
|
30
|
-
}
|
|
31
|
-
}))
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
hydrate(snapshotNode, liveConfig) {
|
|
35
|
-
const hydrated = this.mergeValue(liveConfig, snapshotNode.config);
|
|
36
|
-
const configToken = this.tokenRegistry.resolve(snapshotNode.configTokenId);
|
|
37
|
-
Object.assign(hydrated, {
|
|
38
|
-
type: configToken ?? liveConfig.type,
|
|
39
|
-
kind: snapshotNode.kind
|
|
40
|
-
});
|
|
41
|
-
if (snapshotNode.name && !("name" in hydrated && hydrated.name)) Object.assign(hydrated, { name: snapshotNode.name });
|
|
42
|
-
return hydrated;
|
|
43
|
-
}
|
|
44
|
-
serializeConfig(config) {
|
|
45
|
-
try {
|
|
46
|
-
const cloned = JSON.parse(JSON.stringify(config));
|
|
47
|
-
this.injectTokenIds(cloned, config);
|
|
48
|
-
return cloned;
|
|
49
|
-
} catch {
|
|
50
|
-
const fallback = {
|
|
51
|
-
kind: config.kind,
|
|
52
|
-
name: config.name,
|
|
53
|
-
id: config.id,
|
|
54
|
-
icon: config.icon,
|
|
55
|
-
execution: config.execution
|
|
56
|
-
};
|
|
57
|
-
this.injectTokenIds(fallback, config);
|
|
58
|
-
return fallback;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
injectTokenIds(target, source) {
|
|
62
|
-
const type = this.asTypeToken(source.type);
|
|
63
|
-
if (type) target.tokenId = this.tokenRegistry.getTokenId(type) ?? this.resolveTokenName(type) ?? "unknown";
|
|
64
|
-
for (const [key, value] of Object.entries(source)) {
|
|
65
|
-
if (key === "type" || value == null) continue;
|
|
66
|
-
if (Array.isArray(value)) {
|
|
67
|
-
const targetArray = target[key];
|
|
68
|
-
if (Array.isArray(targetArray)) value.forEach((item, index) => {
|
|
69
|
-
if (item && typeof item === "object" && targetArray[index] && typeof targetArray[index] === "object") this.injectTokenIds(targetArray[index], item);
|
|
70
|
-
});
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
if (typeof value === "object") {
|
|
74
|
-
const targetValue = target[key];
|
|
75
|
-
if (targetValue && typeof targetValue === "object") this.injectTokenIds(targetValue, value);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
mergeValue(liveValue, snapshotValue) {
|
|
80
|
-
const liveRecord = this.asRecord(liveValue);
|
|
81
|
-
const snapshotRecord = this.asRecord(snapshotValue);
|
|
82
|
-
const hydrated = Object.create(liveValue && typeof liveValue === "object" ? Object.getPrototypeOf(liveValue) ?? Object.prototype : Object.prototype);
|
|
83
|
-
for (const [key, value] of Object.entries(snapshotRecord)) hydrated[key] = this.mergeNestedValue(liveRecord[key], value);
|
|
84
|
-
this.restoreNonSerializableProperties(liveRecord, hydrated);
|
|
85
|
-
this.restoreTypeProperty(hydrated);
|
|
86
|
-
return hydrated;
|
|
87
|
-
}
|
|
88
|
-
mergeNestedValue(liveValue, snapshotValue) {
|
|
89
|
-
if (Array.isArray(snapshotValue)) {
|
|
90
|
-
const liveArray = Array.isArray(liveValue) ? liveValue : [];
|
|
91
|
-
return snapshotValue.map((entry, index) => this.mergeNestedValue(liveArray[index], entry));
|
|
92
|
-
}
|
|
93
|
-
if (snapshotValue && typeof snapshotValue === "object") return this.mergeValue(liveValue, snapshotValue);
|
|
94
|
-
return snapshotValue;
|
|
95
|
-
}
|
|
96
|
-
restoreNonSerializableProperties(liveRecord, hydrated) {
|
|
97
|
-
for (const [key, value] of Object.entries(liveRecord)) if (typeof value === "function" || typeof value === "symbol") hydrated[key] = value;
|
|
98
|
-
}
|
|
99
|
-
restoreTypeProperty(record) {
|
|
100
|
-
const tokenId = typeof record.tokenId === "string" ? record.tokenId : void 0;
|
|
101
|
-
if (!tokenId) return;
|
|
102
|
-
const type = this.tokenRegistry.resolve(tokenId);
|
|
103
|
-
if (type) record.type = type;
|
|
104
|
-
}
|
|
105
|
-
resolveTokenId(token) {
|
|
106
|
-
return this.tokenRegistry.getTokenId(token) ?? this.resolveTokenName(token) ?? "unknown";
|
|
107
|
-
}
|
|
108
|
-
resolveTokenName(token) {
|
|
109
|
-
if (typeof token === "function" && token.name) return token.name;
|
|
110
|
-
if (typeof token === "string") return token;
|
|
111
|
-
}
|
|
112
|
-
asTypeToken(value) {
|
|
113
|
-
if (typeof value === "function" || typeof value === "string" || typeof value === "symbol") return value;
|
|
114
|
-
}
|
|
115
|
-
asRecord(value) {
|
|
116
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
117
|
-
return { ...value };
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
//#endregion
|
|
122
|
-
//#region src/runtime/InMemoryLiveWorkflowRepository.ts
|
|
123
|
-
var InMemoryLiveWorkflowRepository = class {
|
|
124
|
-
workflowsById = /* @__PURE__ */ new Map();
|
|
125
|
-
setWorkflows(workflows) {
|
|
126
|
-
this.workflowsById.clear();
|
|
127
|
-
for (const workflow of workflows) this.workflowsById.set(workflow.id, workflow);
|
|
128
|
-
}
|
|
129
|
-
list() {
|
|
130
|
-
return [...this.workflowsById.values()];
|
|
131
|
-
}
|
|
132
|
-
get(workflowId) {
|
|
133
|
-
return this.workflowsById.get(workflowId);
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
//#endregion
|
|
138
|
-
export { WorkflowSnapshotCodec as n, InMemoryLiveWorkflowRepository as t };
|
|
139
|
-
//# sourceMappingURL=InMemoryLiveWorkflowRepository-BoLNnVLg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryLiveWorkflowRepository-BoLNnVLg.js","names":["tokenRegistry: PersistedWorkflowTokenRegistryLike","fallback: Record<string, unknown>"],"sources":["../src/workflowSnapshots/WorkflowSnapshotCodec.ts","../src/runtime/InMemoryLiveWorkflowRepository.ts"],"sourcesContent":["import type { TypeToken } from \"../di\";\nimport type {\n NodeConfigBase,\n PersistedTokenId,\n PersistedWorkflowSnapshot,\n PersistedWorkflowSnapshotNode,\n PersistedWorkflowTokenRegistryLike,\n WorkflowDefinition,\n} from \"../types\";\n\nexport class WorkflowSnapshotCodec {\n constructor(private readonly tokenRegistry: PersistedWorkflowTokenRegistryLike) {}\n\n create(workflow: WorkflowDefinition): PersistedWorkflowSnapshot {\n return {\n id: workflow.id,\n name: workflow.name,\n workflowErrorHandlerConfigured: workflow.workflowErrorHandler !== undefined,\n ...(workflow.connections !== undefined && workflow.connections.length > 0\n ? { connections: workflow.connections }\n : {}),\n nodes: workflow.nodes.map((node) => ({\n id: node.id,\n kind: node.kind,\n name: node.name,\n nodeTokenId: this.resolveTokenId(node.type),\n configTokenId: this.resolveTokenId(node.config.type),\n tokenName: this.resolveTokenName(node.type),\n configTokenName: this.resolveTokenName(node.config.type),\n config: this.serializeConfig(node.config),\n })),\n edges: workflow.edges.map((edge) => ({\n from: { nodeId: edge.from.nodeId, output: edge.from.output },\n to: { nodeId: edge.to.nodeId, input: edge.to.input },\n })),\n };\n }\n\n hydrate(snapshotNode: PersistedWorkflowSnapshotNode, liveConfig: NodeConfigBase): NodeConfigBase {\n const hydrated = this.mergeValue(liveConfig, snapshotNode.config);\n const configToken = this.tokenRegistry.resolve(snapshotNode.configTokenId);\n Object.assign(hydrated, {\n type: configToken ?? liveConfig.type,\n kind: snapshotNode.kind,\n });\n if (snapshotNode.name && !(\"name\" in hydrated && hydrated.name)) {\n Object.assign(hydrated, { name: snapshotNode.name });\n }\n return hydrated as unknown as NodeConfigBase;\n }\n\n private serializeConfig(config: NodeConfigBase): unknown {\n try {\n const cloned = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n this.injectTokenIds(cloned, config as unknown as Record<string, unknown>);\n return cloned;\n } catch {\n const fallback: Record<string, unknown> = {\n kind: config.kind,\n name: config.name,\n id: config.id,\n icon: config.icon,\n execution: config.execution,\n };\n this.injectTokenIds(fallback, config as unknown as Record<string, unknown>);\n return fallback;\n }\n }\n\n private injectTokenIds(target: Record<string, unknown>, source: Record<string, unknown>): void {\n const type = this.asTypeToken(source.type);\n if (type) {\n target.tokenId = this.tokenRegistry.getTokenId(type) ?? this.resolveTokenName(type) ?? \"unknown\";\n }\n for (const [key, value] of Object.entries(source)) {\n if (key === \"type\" || value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n const targetArray = target[key];\n if (Array.isArray(targetArray)) {\n value.forEach((item, index) => {\n if (item && typeof item === \"object\" && targetArray[index] && typeof targetArray[index] === \"object\") {\n this.injectTokenIds(targetArray[index] as Record<string, unknown>, item as Record<string, unknown>);\n }\n });\n }\n continue;\n }\n if (typeof value === \"object\") {\n const targetValue = target[key];\n if (targetValue && typeof targetValue === \"object\") {\n this.injectTokenIds(targetValue as Record<string, unknown>, value as Record<string, unknown>);\n }\n }\n }\n }\n\n private mergeValue(liveValue: unknown, snapshotValue: unknown): Record<string, unknown> {\n const liveRecord = this.asRecord(liveValue);\n const snapshotRecord = this.asRecord(snapshotValue);\n const hydrated = Object.create(\n liveValue && typeof liveValue === \"object\"\n ? (Object.getPrototypeOf(liveValue) ?? Object.prototype)\n : Object.prototype,\n ) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(snapshotRecord)) {\n hydrated[key] = this.mergeNestedValue(liveRecord[key], value);\n }\n\n this.restoreNonSerializableProperties(liveRecord, hydrated);\n this.restoreTypeProperty(hydrated);\n return hydrated;\n }\n\n private mergeNestedValue(liveValue: unknown, snapshotValue: unknown): unknown {\n if (Array.isArray(snapshotValue)) {\n const liveArray = Array.isArray(liveValue) ? liveValue : [];\n return snapshotValue.map((entry, index) => this.mergeNestedValue(liveArray[index], entry));\n }\n if (snapshotValue && typeof snapshotValue === \"object\") {\n return this.mergeValue(liveValue, snapshotValue);\n }\n return snapshotValue;\n }\n\n private restoreNonSerializableProperties(\n liveRecord: Record<string, unknown>,\n hydrated: Record<string, unknown>,\n ): void {\n for (const [key, value] of Object.entries(liveRecord)) {\n if (typeof value === \"function\" || typeof value === \"symbol\") {\n hydrated[key] = value;\n }\n }\n }\n\n private restoreTypeProperty(record: Record<string, unknown>): void {\n const tokenId = typeof record.tokenId === \"string\" ? record.tokenId : undefined;\n if (!tokenId) {\n return;\n }\n const type = this.tokenRegistry.resolve(tokenId as PersistedTokenId);\n if (type) {\n record.type = type;\n }\n }\n\n private resolveTokenId(token: TypeToken<unknown>): PersistedTokenId {\n return (this.tokenRegistry.getTokenId(token) ?? this.resolveTokenName(token) ?? \"unknown\") as PersistedTokenId;\n }\n\n private resolveTokenName(token: TypeToken<unknown>): string | undefined {\n if (typeof token === \"function\" && token.name) {\n return token.name;\n }\n if (typeof token === \"string\") {\n return token;\n }\n return undefined;\n }\n\n private asTypeToken(value: unknown): TypeToken<unknown> | undefined {\n if (typeof value === \"function\" || typeof value === \"string\" || typeof value === \"symbol\") {\n return value as TypeToken<unknown>;\n }\n return undefined;\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n return { ...(value as Record<string, unknown>) };\n }\n}\n","import type { LiveWorkflowRepository, WorkflowDefinition, WorkflowId } from \"../types\";\n\nexport class InMemoryLiveWorkflowRepository implements LiveWorkflowRepository {\n private readonly workflowsById = new Map<WorkflowId, WorkflowDefinition>();\n\n setWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void {\n this.workflowsById.clear();\n for (const workflow of workflows) {\n this.workflowsById.set(workflow.id, workflow);\n }\n }\n\n list(): ReadonlyArray<WorkflowDefinition> {\n return [...this.workflowsById.values()];\n }\n\n get(workflowId: WorkflowId): WorkflowDefinition | undefined {\n return this.workflowsById.get(workflowId);\n }\n}\n"],"mappings":"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"}
|