@codemation/core 0.13.2 → 0.15.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 +167 -0
- package/dist/{CostCatalogContract-Dxq1BTyi.d.cts → CostCatalogContract-Dwo-ZamG.d.cts} +2 -2
- package/dist/EngineRuntimeRegistration.types-BiNasx3G.d.cts +54 -0
- package/dist/EngineRuntimeRegistration.types-Dq4ucrdo.d.ts +21 -0
- package/dist/{InMemoryRunDataFactory-Csy2evr_.d.cts → InMemoryRunDataFactory-D2U9azmZ.d.cts} +4 -20
- package/dist/{InMemoryRunEventBusRegistry-Sa86VxuV.cjs → InMemoryRunEventBusRegistry-DO0WM9Lw.cjs} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-Sa86VxuV.cjs.map → InMemoryRunEventBusRegistry-DO0WM9Lw.cjs.map} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-Bwunvt1T.js → InMemoryRunEventBusRegistry-Layt2xgm.js} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-Bwunvt1T.js.map → InMemoryRunEventBusRegistry-Layt2xgm.js.map} +1 -1
- package/dist/{ItemsInputNormalizer-Bi8m-Ijs.d.cts → ItemsInputNormalizer-A5txcOWX.d.cts} +3 -98
- package/dist/{ItemsInputNormalizer-BbQTSEkZ.cjs → ItemsInputNormalizer-C1fv3sMW.cjs} +2 -2
- package/dist/ItemsInputNormalizer-C1fv3sMW.cjs.map +1 -0
- package/dist/{ItemsInputNormalizer-BYljnXU0.d.ts → ItemsInputNormalizer-D2vrMrX1.d.ts} +2 -62
- package/dist/{ItemsInputNormalizer-CSZGMgl3.js → ItemsInputNormalizer-fUYo4GLV.js} +2 -2
- package/dist/ItemsInputNormalizer-fUYo4GLV.js.map +1 -0
- package/dist/{RunIntentService-BitgkKaT.d.cts → RunIntentService-DKxuHTUz.d.cts} +2 -15
- package/dist/{RunIntentService-DYpqfu6D.d.ts → RunIntentService-DrpKli2k.d.ts} +2 -22
- package/dist/{agentMcpTypes-DGIwk6Ue.d.cts → agentMcpTypes-BHX4RQCC.d.cts} +25 -518
- package/dist/bootstrap/index.cjs +9 -5
- package/dist/bootstrap/index.d.cts +32 -106
- package/dist/bootstrap/index.d.ts +18 -17
- package/dist/bootstrap/index.js +6 -5
- package/dist/{bootstrap-DIv-vloi.cjs → bootstrap-CTB53rEF.cjs} +9 -60
- package/dist/bootstrap-CTB53rEF.cjs.map +1 -0
- package/dist/{bootstrap-Bkd-Nfbn.js → bootstrap-DmqKheCI.js} +6 -57
- package/dist/bootstrap-DmqKheCI.js.map +1 -0
- package/dist/browser.cjs +12 -11
- package/dist/browser.d.cts +4 -4
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +3 -2
- package/dist/contracts-7L1wJHdk.cjs +569 -0
- package/dist/contracts-7L1wJHdk.cjs.map +1 -0
- package/dist/contracts-CjJ5CZ7N.js +447 -0
- package/dist/contracts-CjJ5CZ7N.js.map +1 -0
- package/dist/contracts.cjs +9 -2
- package/dist/contracts.d.cts +5 -5
- package/dist/contracts.d.ts +2 -2
- package/dist/contracts.js +3 -2
- package/dist/{executionPersistenceContracts-CN9d7AnL.d.cts → deploymentManifestTypes-B8CDmZZK.d.cts} +65 -81
- package/dist/di-C6Ubf9o5.cjs +179 -0
- package/dist/di-C6Ubf9o5.cjs.map +1 -0
- package/dist/di-Cjiil7U-.js +114 -0
- package/dist/di-Cjiil7U-.js.map +1 -0
- package/dist/{index-rllWL4r-.d.ts → index-CRv3_pY3.d.ts} +112 -808
- package/dist/{index-BSQ2LoIh.d.ts → index-mnLS0iQl.d.ts} +39 -372
- package/dist/index.cjs +53 -111
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +50 -438
- package/dist/index.d.ts +5 -5
- package/dist/index.js +28 -94
- package/dist/index.js.map +1 -1
- package/dist/{params-DRUr0F5v.d.cts → params-CrK4iuG1.d.cts} +3 -13
- package/dist/{runtime-CWPdvJpC.js → runtime-CBFDpmiz.js} +112 -648
- package/dist/runtime-CBFDpmiz.js.map +1 -0
- package/dist/{runtime-_VdHwGkJ.cjs → runtime-Due-FOZ2.cjs} +137 -717
- package/dist/runtime-Due-FOZ2.cjs.map +1 -0
- package/dist/testing.cjs +8 -40
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +3 -32
- package/dist/testing.d.ts +3 -32
- package/dist/testing.js +6 -38
- package/dist/testing.js.map +1 -1
- package/dist/{di-LP2qSHkY.cjs → workflowTypes-BW6Hhee7.cjs} +4 -230
- package/dist/workflowTypes-BW6Hhee7.cjs.map +1 -0
- package/dist/{di-tom0pM2h.js → workflowTypes-DZtBTmKf.js} +3 -163
- package/dist/workflowTypes-DZtBTmKf.js.map +1 -0
- package/package.json +1 -1
- package/src/ai/AgentConnectionNodeCollector.ts +0 -4
- package/src/ai/AgentMessageConfigNormalizerFactory.ts +0 -4
- package/src/ai/AiHost.ts +0 -38
- package/src/ai/CallableToolConfig.ts +0 -9
- package/src/ai/CallableToolKindToken.ts +0 -4
- package/src/authoring/callableTool.types.ts +0 -3
- package/src/authoring/defineCollection.types.ts +0 -11
- package/src/authoring/defineHumanApprovalNode.types.ts +0 -116
- package/src/authoring/defineNode.types.ts +18 -32
- package/src/authoring/definePollingTrigger.types.ts +36 -155
- package/src/authoring/definePollingTriggerInternals.ts +0 -4
- package/src/authoring/index.ts +1 -0
- package/src/authoring/nodeBaseOptions.types.ts +4 -0
- package/src/binaries/boundedReadBinary.types.ts +0 -16
- package/src/bootstrap/index.ts +8 -2
- package/src/bootstrap/runtime/EngineRuntimeRegistrar.ts +0 -5
- package/src/bootstrap/runtime/EngineRuntimeRegistration.types.ts +0 -23
- package/src/browser.ts +0 -3
- package/src/contracts/AgentBindError.ts +0 -5
- package/src/contracts/Clock.ts +0 -1
- package/src/contracts/CodemationTelemetryAttributeNames.ts +0 -10
- package/src/contracts/NoOpAgentMcpIntegration.ts +0 -6
- package/src/contracts/NoOpTelemetrySpanScope.ts +0 -7
- package/src/contracts/RetryPolicy.ts +0 -2
- package/src/contracts/agentMcpTypes.ts +0 -34
- package/src/contracts/assertionTypes.ts +0 -33
- package/src/contracts/baseTypes.ts +0 -6
- package/src/contracts/collectionTypes.ts +0 -25
- package/src/contracts/credentialTypes.ts +13 -60
- package/src/contracts/deploymentManifestTypes.ts +158 -0
- package/src/contracts/dispatchTypes.ts +29 -0
- package/src/contracts/executionPersistenceContracts.ts +0 -33
- package/src/contracts/hitlSeamTypes.ts +0 -14
- package/src/contracts/humanTaskStoreTypes.ts +0 -2
- package/src/contracts/inboxChannelTypes.ts +0 -9
- package/src/contracts/index.ts +3 -0
- package/src/contracts/itemExpr.ts +7 -21
- package/src/contracts/itemMeta.ts +0 -3
- package/src/contracts/mcpTypes.ts +0 -16
- package/src/contracts/retryPolicySpec.types.ts +0 -10
- package/src/contracts/runFinishedAtFactory.ts +0 -1
- package/src/contracts/runTypes.ts +0 -74
- package/src/contracts/runtimeTypes.ts +4 -131
- package/src/contracts/telemetryTypes.ts +0 -7
- package/src/contracts/testTriggerTypes.ts +0 -43
- package/src/contracts/triggerInvokerTypes.ts +6 -0
- package/src/contracts/webhookTypes.ts +0 -8
- package/src/contracts/workflowActivationPolicy.ts +0 -5
- package/src/contracts/workflowTypes.ts +5 -80
- package/src/contracts/workspaceFileTypes.ts +10 -42
- package/src/contracts.ts +18 -10
- package/src/credentials/CredentialMaterialProvider.types.ts +0 -28
- package/src/credentials/ManagedCredentialMaterialWriteError.ts +0 -6
- package/src/credentials/ManagedMaterialFetchError.ts +0 -6
- package/src/credentials/OAuthFlowExecutor.types.ts +0 -15
- package/src/di/CoreTokens.ts +2 -6
- package/src/events/ConnectionInvocationEventPublisher.ts +0 -7
- package/src/events/NodeEventPublisher.ts +0 -1
- package/src/events/runEvents.ts +0 -8
- package/src/execution/ActivationEnqueueService.ts +0 -10
- package/src/execution/ChildExecutionScopeFactory.ts +0 -13
- package/src/execution/FanInMergeByOriginMerger.ts +0 -11
- package/src/execution/InProcessRetryRunner.ts +0 -1
- package/src/execution/ItemExprResolver.ts +0 -3
- package/src/execution/NodeActivationRequestComposer.ts +0 -3
- package/src/execution/NodeActivationRequestInputPreparer.ts +0 -5
- package/src/execution/NodeExecutionSnapshotFactory.ts +0 -1
- package/src/execution/NodeExecutor.ts +1 -17
- package/src/execution/NodeOutputNormalizer.ts +8 -1
- package/src/execution/NodeSuspensionHandler.ts +1 -39
- package/src/execution/PersistedRunStateTerminalBuilder.ts +0 -5
- package/src/execution/RunSuspendedError.ts +0 -10
- package/src/execution/RunnableOutputBehaviorResolver.ts +12 -0
- package/src/execution/WorkflowRunExecutionContextFactory.ts +0 -3
- package/src/index.ts +10 -2
- package/src/orchestration/AbortControllerFactory.ts +0 -4
- package/src/orchestration/Engine.ts +0 -9
- package/src/orchestration/NodeExecutionRequestHandlerService.ts +3 -4
- package/src/orchestration/RunContinuationService.ts +7 -39
- package/src/orchestration/RunStartService.ts +0 -7
- package/src/orchestration/TestSuiteOrchestrator.ts +0 -18
- package/src/orchestration/TestSuiteRunIdFactory.ts +0 -4
- package/src/orchestration/TriggerRuntimeService.ts +3 -2
- package/src/planning/CurrentStateFrontierPlanner.ts +0 -1
- package/src/planning/RunQueuePlanner.ts +0 -6
- package/src/policies/executionLimits/EngineExecutionLimitsPolicy.ts +0 -8
- package/src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts +0 -3
- package/src/runStorage/RunSummaryMapper.ts +0 -1
- package/src/runtime/EngineFactory.ts +6 -11
- package/src/runtime/RunIntentService.ts +0 -4
- package/src/runtime/WorkflowRepositoryWebhookTriggerMatcher.ts +0 -4
- package/src/runtime-types/InjectableRuntimeDecoratorComposerRegistry.ts +0 -4
- package/src/runtime-types/PersistedRuntimeTypeMetadataStoreRegistry.ts +0 -4
- package/src/runtime-types/PersistedRuntimeTypeNameResolver.ts +0 -1
- package/src/runtime-types/persistedRuntimeTypeModelRegistry.ts +0 -4
- package/src/runtime-types/runtimeTypeDecorators.types.ts +0 -12
- package/src/scheduler/ConfigDrivenOffloadPolicy.ts +0 -1
- package/src/scheduler/DefaultDrivingScheduler.ts +0 -6
- package/src/scheduler/InlineDrivingScheduler.ts +0 -13
- package/src/serialization/ItemsInputNormalizer.ts +0 -5
- package/src/testing/CapturingScheduler.ts +0 -3
- package/src/testing/EngineTestKitRunIdFactory.ts +0 -3
- package/src/testing/ItemHarnessNode.ts +0 -3
- package/src/testing/ItemHarnessNodeConfig.ts +0 -4
- package/src/testing/PrefixedSequentialIdGenerator.ts +0 -3
- package/src/testing/RegistrarEngineTestKit.types.ts +0 -2
- package/src/testing/RejectingCredentialSessionService.ts +0 -4
- package/src/testing/SubWorkflowRunnerTestNode.ts +0 -3
- package/src/testing/WorkflowTestHarnessManualTrigger.ts +0 -3
- package/src/testing/WorkflowTestKitBuilder.ts +0 -4
- package/src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts +0 -3
- package/src/testing.ts +0 -3
- package/src/triggers/polling/PollingTriggerDedupWindow.ts +0 -4
- package/src/triggers/polling/PollingTriggerLogger.ts +0 -5
- package/src/triggers/polling/PollingTriggerRuntime.ts +0 -5
- package/src/types/index.ts +0 -6
- package/src/validation/WorkflowEdgePortValidator.ts +0 -5
- package/src/workflow/definition/ConnectionInvocationIdFactory.ts +0 -7
- package/src/workflow/definition/ConnectionNodeIdFactory.ts +0 -6
- package/src/workflow/definition/NodeIterationIdFactory.ts +0 -13
- package/src/workflow/definition/WorkflowExecutableNodeClassifier.ts +0 -6
- package/src/workflow/dsl/ChainCursorResolver.ts +8 -15
- package/src/workflow/dsl/NodeIdSlugifier.ts +0 -9
- package/src/workflow/dsl/WhenBuilder.ts +49 -2
- package/src/workflow/dsl/WorkflowDefinitionError.ts +0 -9
- package/src/workflow/dsl/workflowBuilderTypes.ts +5 -0
- package/src/workflowSnapshots/MissingRuntimeParityGuard.ts +24 -0
- package/src/workflowSnapshots/PersistedWorkflowTokenRegistry.ts +0 -6
- package/src/workflowSnapshots/WorkflowParityMismatchError.ts +18 -0
- package/src/workflowSnapshots/WorkflowSnapshotCodec.ts +1 -5
- package/src/workflowSnapshots/index.ts +3 -0
- package/dist/EngineRuntimeRegistration.types-CqcTWexS.d.cts +0 -81
- package/dist/EngineRuntimeRegistration.types-Cr75cSfL.d.ts +0 -44
- package/dist/ItemsInputNormalizer-BbQTSEkZ.cjs.map +0 -1
- package/dist/ItemsInputNormalizer-CSZGMgl3.js.map +0 -1
- package/dist/bootstrap-Bkd-Nfbn.js.map +0 -1
- package/dist/bootstrap-DIv-vloi.cjs.map +0 -1
- package/dist/contracts-CK0x6w_G.cjs +0 -74
- package/dist/contracts-CK0x6w_G.cjs.map +0 -1
- package/dist/contracts-DXdfTdpW.js +0 -50
- package/dist/contracts-DXdfTdpW.js.map +0 -1
- package/dist/di-LP2qSHkY.cjs.map +0 -1
- package/dist/di-tom0pM2h.js.map +0 -1
- package/dist/runtime-CWPdvJpC.js.map +0 -1
- package/dist/runtime-_VdHwGkJ.cjs.map +0 -1
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
const require_di = require('./di-C6Ubf9o5.cjs');
|
|
2
|
+
let node_crypto = require("node:crypto");
|
|
3
|
+
node_crypto = require_di.__toESM(node_crypto);
|
|
4
|
+
let tsyringe = require("tsyringe");
|
|
5
|
+
tsyringe = require_di.__toESM(tsyringe);
|
|
6
|
+
|
|
7
|
+
//#region src/contracts/dispatchTypes.ts
|
|
8
|
+
function serializeDispatch(dispatch) {
|
|
9
|
+
return JSON.stringify(dispatch);
|
|
10
|
+
}
|
|
11
|
+
function deserializeDispatch(raw) {
|
|
12
|
+
return JSON.parse(raw);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/contracts/AgentBindError.ts
|
|
17
|
+
var AgentBindError = class extends Error {
|
|
18
|
+
constructor(message) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = "AgentBindError";
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/contracts/NoOpAgentMcpIntegration.ts
|
|
26
|
+
var NoOpAgentMcpIntegration = class {
|
|
27
|
+
async prepareMcpTools() {
|
|
28
|
+
return /* @__PURE__ */ new Map();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/contracts/assertionTypes.ts
|
|
34
|
+
const DEFAULT_ASSERTION_PASS_THRESHOLD = .5;
|
|
35
|
+
function deriveAssertionPassed(result) {
|
|
36
|
+
if (result.errored === true) return false;
|
|
37
|
+
const threshold = result.passThreshold ?? DEFAULT_ASSERTION_PASS_THRESHOLD;
|
|
38
|
+
return result.score >= threshold;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/runtime-types/persistedRuntimeTypeModelRegistry.ts
|
|
43
|
+
const persistedRuntimeTypeMetadataKey = Symbol.for("codemation.core.persistedRuntimeTypeMetadata");
|
|
44
|
+
var PersistedRuntimeTypeDecoratorDefaults = class {
|
|
45
|
+
static appPackageName = "app";
|
|
46
|
+
static apply(options) {
|
|
47
|
+
return {
|
|
48
|
+
...options,
|
|
49
|
+
packageName: options.packageName ?? this.appPackageName
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/runtime-types/PersistedRuntimeTypeNameResolver.ts
|
|
56
|
+
var PersistedRuntimeTypeNameResolver = class {
|
|
57
|
+
static resolve(target, override) {
|
|
58
|
+
const resolved = override ?? target.name;
|
|
59
|
+
if (!resolved) throw new Error("Persisted runtime token metadata requires a named class or an explicit decorator name override.");
|
|
60
|
+
return resolved;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/runtime-types/StackTraceCallSitePathResolver.ts
|
|
66
|
+
var StackTraceCallSitePathResolver = class {
|
|
67
|
+
static resolve(decoratorFileUrl) {
|
|
68
|
+
const stack = (/* @__PURE__ */ new Error()).stack ?? "";
|
|
69
|
+
for (const line of stack.split("\n")) {
|
|
70
|
+
const candidate = this.extractPath(line.trim());
|
|
71
|
+
if (!candidate) continue;
|
|
72
|
+
if (candidate === decoratorFileUrl || candidate.includes("runtimeTypeDecorators")) continue;
|
|
73
|
+
return candidate;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
static extractPath(line) {
|
|
77
|
+
const fileUrlMatch = line.match(/file:\/\/[^\s)]+/);
|
|
78
|
+
if (fileUrlMatch) return fileUrlMatch[0];
|
|
79
|
+
const parenMatch = line.match(/\((\/[^)]+)\)/);
|
|
80
|
+
if (parenMatch) return parenMatch[1];
|
|
81
|
+
return line.match(/at (\/[^\s]+)/)?.[1];
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region src/runtime-types/PersistedRuntimeTypeMetadataStoreRegistry.ts
|
|
87
|
+
var PersistedRuntimeTypeMetadataStore = class {
|
|
88
|
+
static define(target, kind, options, decoratorFileUrl) {
|
|
89
|
+
const normalizedOptions = PersistedRuntimeTypeDecoratorDefaults.apply(options);
|
|
90
|
+
const metadata = {
|
|
91
|
+
persistedName: PersistedRuntimeTypeNameResolver.resolve(target, normalizedOptions.name),
|
|
92
|
+
kind,
|
|
93
|
+
packageName: normalizedOptions.packageName ?? PersistedRuntimeTypeDecoratorDefaults.appPackageName,
|
|
94
|
+
sourceHint: normalizedOptions.moduleUrl ?? StackTraceCallSitePathResolver.resolve(decoratorFileUrl)
|
|
95
|
+
};
|
|
96
|
+
Object.defineProperty(target, persistedRuntimeTypeMetadataKey, {
|
|
97
|
+
configurable: false,
|
|
98
|
+
enumerable: false,
|
|
99
|
+
writable: false,
|
|
100
|
+
value: metadata
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
static get(target) {
|
|
104
|
+
if (!target || typeof target !== "function" && typeof target !== "object") return;
|
|
105
|
+
return target[persistedRuntimeTypeMetadataKey];
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
//#endregion
|
|
110
|
+
//#region src/runtime-types/InjectableRuntimeDecoratorComposerRegistry.ts
|
|
111
|
+
var InjectableRuntimeDecoratorComposer = class {
|
|
112
|
+
static compose(kind, options, decoratorFileUrl) {
|
|
113
|
+
return (target) => {
|
|
114
|
+
(0, tsyringe.injectable)()(target);
|
|
115
|
+
PersistedRuntimeTypeMetadataStore.define(target, kind, options, decoratorFileUrl);
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
//#endregion
|
|
121
|
+
//#region src/runtime-types/runtimeTypeDecorators.types.ts
|
|
122
|
+
function getPersistedRuntimeTypeMetadata(target) {
|
|
123
|
+
return PersistedRuntimeTypeMetadataStore.get(target);
|
|
124
|
+
}
|
|
125
|
+
function node(options = {}) {
|
|
126
|
+
return InjectableRuntimeDecoratorComposer.compose("node", options, require("url").pathToFileURL(__filename).href);
|
|
127
|
+
}
|
|
128
|
+
function tool(options = {}) {
|
|
129
|
+
return InjectableRuntimeDecoratorComposer.compose("tool", options, require("url").pathToFileURL(__filename).href);
|
|
130
|
+
}
|
|
131
|
+
function chatModel(options = {}) {
|
|
132
|
+
return InjectableRuntimeDecoratorComposer.compose("chatModel", options, require("url").pathToFileURL(__filename).href);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/workflowSnapshots/PersistedRuntimeTypeIdFactory.ts
|
|
137
|
+
var PersistedRuntimeTypeIdFactory = class {
|
|
138
|
+
static fromMetadata(args) {
|
|
139
|
+
const metadata = getPersistedRuntimeTypeMetadata(args.type);
|
|
140
|
+
if (!metadata) return;
|
|
141
|
+
const packageName = metadata.packageName;
|
|
142
|
+
if (!packageName) return;
|
|
143
|
+
return `${packageName}::${metadata.persistedName}`;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
//#endregion
|
|
148
|
+
//#region src/workflowSnapshots/PersistedWorkflowTokenRegistry.ts
|
|
149
|
+
var PersistedWorkflowTokenRegistry = class {
|
|
150
|
+
tokensById = /* @__PURE__ */ new Map();
|
|
151
|
+
tokenIdsByToken = /* @__PURE__ */ new Map();
|
|
152
|
+
register(type, packageId, persistedNameOverride) {
|
|
153
|
+
const tokenId = `${packageId}::${persistedNameOverride ?? this.displayNameForTypeToken(type)}`;
|
|
154
|
+
this.tokensById.set(tokenId, type);
|
|
155
|
+
this.tokenIdsByToken.set(type, tokenId);
|
|
156
|
+
return tokenId;
|
|
157
|
+
}
|
|
158
|
+
registerFromWorkflows(workflows) {
|
|
159
|
+
for (const workflow of workflows) for (const node$1 of workflow.nodes) {
|
|
160
|
+
this.registerDecoratedType(node$1.type);
|
|
161
|
+
this.registerDecoratedType(node$1.config.type);
|
|
162
|
+
this.registerNestedTypes(node$1.config);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
registerDecoratedType(type) {
|
|
166
|
+
if (this.tokenIdsByToken.has(type)) return;
|
|
167
|
+
const tokenId = PersistedRuntimeTypeIdFactory.fromMetadata({ type });
|
|
168
|
+
if (!tokenId) return;
|
|
169
|
+
this.tokensById.set(tokenId, type);
|
|
170
|
+
this.tokenIdsByToken.set(type, tokenId);
|
|
171
|
+
}
|
|
172
|
+
registerNestedTypes(value) {
|
|
173
|
+
if (Array.isArray(value)) {
|
|
174
|
+
for (const entry of value) this.registerNestedTypes(entry);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!value || typeof value !== "object") return;
|
|
178
|
+
const record = value;
|
|
179
|
+
const type = this.asTypeToken(record.type);
|
|
180
|
+
if (type) this.registerDecoratedType(type);
|
|
181
|
+
for (const v of Object.values(record)) this.registerNestedTypes(v);
|
|
182
|
+
}
|
|
183
|
+
displayNameForTypeToken(token) {
|
|
184
|
+
if (typeof token === "function" && token.name) return token.name;
|
|
185
|
+
if (typeof token === "string") return token;
|
|
186
|
+
return "";
|
|
187
|
+
}
|
|
188
|
+
asTypeToken(value) {
|
|
189
|
+
if (typeof value === "function" || typeof value === "string" || typeof value === "symbol") return value;
|
|
190
|
+
}
|
|
191
|
+
getTokenId(token) {
|
|
192
|
+
const existing = this.tokenIdsByToken.get(token);
|
|
193
|
+
if (existing) return existing;
|
|
194
|
+
const tokenId = PersistedRuntimeTypeIdFactory.fromMetadata({ type: token });
|
|
195
|
+
if (!tokenId) return;
|
|
196
|
+
this.tokensById.set(tokenId, token);
|
|
197
|
+
this.tokenIdsByToken.set(token, tokenId);
|
|
198
|
+
return tokenId;
|
|
199
|
+
}
|
|
200
|
+
resolve(tokenId) {
|
|
201
|
+
return this.tokensById.get(tokenId);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
//#endregion
|
|
206
|
+
//#region src/workflowSnapshots/WorkflowSnapshotCodec.ts
|
|
207
|
+
var WorkflowSnapshotCodec = class {
|
|
208
|
+
constructor(tokenRegistry) {
|
|
209
|
+
this.tokenRegistry = tokenRegistry;
|
|
210
|
+
}
|
|
211
|
+
create(workflow) {
|
|
212
|
+
return {
|
|
213
|
+
id: workflow.id,
|
|
214
|
+
name: workflow.name,
|
|
215
|
+
workflowErrorHandlerConfigured: workflow.workflowErrorHandler !== void 0,
|
|
216
|
+
...workflow.connections !== void 0 && workflow.connections.length > 0 ? { connections: workflow.connections } : {},
|
|
217
|
+
nodes: workflow.nodes.map((node$1) => {
|
|
218
|
+
const inspectorSummaryRows = this.safeInspectorSummary(node$1.config);
|
|
219
|
+
return {
|
|
220
|
+
id: node$1.id,
|
|
221
|
+
kind: node$1.kind,
|
|
222
|
+
name: node$1.name,
|
|
223
|
+
nodeTokenId: this.resolveTokenId(node$1.type),
|
|
224
|
+
configTokenId: this.resolveTokenId(node$1.config.type),
|
|
225
|
+
tokenName: this.resolveTokenName(node$1.type),
|
|
226
|
+
configTokenName: this.resolveTokenName(node$1.config.type),
|
|
227
|
+
config: this.serializeConfig(node$1.config),
|
|
228
|
+
...inspectorSummaryRows !== void 0 ? { inspectorSummary: inspectorSummaryRows } : {}
|
|
229
|
+
};
|
|
230
|
+
}),
|
|
231
|
+
edges: workflow.edges.map((edge) => ({
|
|
232
|
+
from: {
|
|
233
|
+
nodeId: edge.from.nodeId,
|
|
234
|
+
output: edge.from.output
|
|
235
|
+
},
|
|
236
|
+
to: {
|
|
237
|
+
nodeId: edge.to.nodeId,
|
|
238
|
+
input: edge.to.input
|
|
239
|
+
}
|
|
240
|
+
}))
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
hydrate(snapshotNode, liveConfig) {
|
|
244
|
+
const hydrated = this.mergeValue(liveConfig, snapshotNode.config);
|
|
245
|
+
const configToken = this.tokenRegistry.resolve(snapshotNode.configTokenId);
|
|
246
|
+
Object.assign(hydrated, {
|
|
247
|
+
type: configToken ?? liveConfig.type,
|
|
248
|
+
kind: snapshotNode.kind
|
|
249
|
+
});
|
|
250
|
+
if (snapshotNode.name && !("name" in hydrated && hydrated.name)) Object.assign(hydrated, { name: snapshotNode.name });
|
|
251
|
+
return hydrated;
|
|
252
|
+
}
|
|
253
|
+
serializeConfig(config) {
|
|
254
|
+
try {
|
|
255
|
+
const cloned = JSON.parse(JSON.stringify(config));
|
|
256
|
+
this.injectTokenIds(cloned, config);
|
|
257
|
+
return cloned;
|
|
258
|
+
} catch {
|
|
259
|
+
const fallback = {
|
|
260
|
+
kind: config.kind,
|
|
261
|
+
name: config.name,
|
|
262
|
+
id: config.id,
|
|
263
|
+
icon: config.icon,
|
|
264
|
+
description: config.description,
|
|
265
|
+
execution: config.execution
|
|
266
|
+
};
|
|
267
|
+
this.injectTokenIds(fallback, config);
|
|
268
|
+
return fallback;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
safeInspectorSummary(config) {
|
|
272
|
+
const fn = config.inspectorSummary;
|
|
273
|
+
if (typeof fn !== "function") return void 0;
|
|
274
|
+
let raw;
|
|
275
|
+
try {
|
|
276
|
+
raw = fn.call(config);
|
|
277
|
+
} catch {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (!Array.isArray(raw)) return void 0;
|
|
281
|
+
const rows = [];
|
|
282
|
+
for (const entry of raw) {
|
|
283
|
+
if (!entry || typeof entry !== "object") continue;
|
|
284
|
+
const { label, value } = entry;
|
|
285
|
+
if (typeof label !== "string" || typeof value !== "string") continue;
|
|
286
|
+
const trimmedLabel = label.trim();
|
|
287
|
+
if (trimmedLabel.length === 0) continue;
|
|
288
|
+
rows.push({
|
|
289
|
+
label: trimmedLabel,
|
|
290
|
+
value
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
return rows.length > 0 ? rows : void 0;
|
|
294
|
+
}
|
|
295
|
+
injectTokenIds(target, source) {
|
|
296
|
+
const type = this.asTypeToken(source.type);
|
|
297
|
+
if (type) target.tokenId = this.tokenRegistry.getTokenId(type) ?? this.resolveTokenName(type) ?? "unknown";
|
|
298
|
+
for (const [key, value] of Object.entries(source)) {
|
|
299
|
+
if (key === "type" || value == null) continue;
|
|
300
|
+
if (Array.isArray(value)) {
|
|
301
|
+
const targetArray = target[key];
|
|
302
|
+
if (Array.isArray(targetArray)) value.forEach((item, index) => {
|
|
303
|
+
if (item && typeof item === "object" && targetArray[index] && typeof targetArray[index] === "object") this.injectTokenIds(targetArray[index], item);
|
|
304
|
+
});
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
if (typeof value === "object") {
|
|
308
|
+
const targetValue = target[key];
|
|
309
|
+
if (targetValue && typeof targetValue === "object") this.injectTokenIds(targetValue, value);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
mergeValue(liveValue, snapshotValue) {
|
|
314
|
+
const liveRecord = this.asRecord(liveValue);
|
|
315
|
+
const snapshotRecord = this.asRecord(snapshotValue);
|
|
316
|
+
const hydrated = Object.create(liveValue && typeof liveValue === "object" ? Object.getPrototypeOf(liveValue) ?? Object.prototype : Object.prototype);
|
|
317
|
+
for (const [key, value] of Object.entries(snapshotRecord)) hydrated[key] = this.mergeNestedValue(liveRecord[key], value);
|
|
318
|
+
this.restoreNonSerializableProperties(liveRecord, hydrated);
|
|
319
|
+
this.restoreTypeProperty(hydrated);
|
|
320
|
+
return hydrated;
|
|
321
|
+
}
|
|
322
|
+
mergeNestedValue(liveValue, snapshotValue) {
|
|
323
|
+
if (Array.isArray(snapshotValue)) {
|
|
324
|
+
const liveArray = Array.isArray(liveValue) ? liveValue : [];
|
|
325
|
+
return snapshotValue.map((entry, index) => this.mergeNestedValue(liveArray[index], entry));
|
|
326
|
+
}
|
|
327
|
+
if (snapshotValue && typeof snapshotValue === "object") return this.mergeValue(liveValue, snapshotValue);
|
|
328
|
+
return snapshotValue;
|
|
329
|
+
}
|
|
330
|
+
restoreNonSerializableProperties(liveRecord, hydrated) {
|
|
331
|
+
for (const [key, value] of Object.entries(liveRecord)) if (typeof value === "function" || typeof value === "symbol") hydrated[key] = value;
|
|
332
|
+
for (const sym of Object.getOwnPropertySymbols(liveRecord)) hydrated[sym] = liveRecord[sym];
|
|
333
|
+
}
|
|
334
|
+
restoreTypeProperty(record) {
|
|
335
|
+
const tokenId = typeof record.tokenId === "string" ? record.tokenId : void 0;
|
|
336
|
+
if (!tokenId) return;
|
|
337
|
+
const type = this.tokenRegistry.resolve(tokenId);
|
|
338
|
+
if (type) record.type = type;
|
|
339
|
+
}
|
|
340
|
+
resolveTokenId(token) {
|
|
341
|
+
return this.tokenRegistry.getTokenId(token) ?? this.resolveTokenName(token) ?? "unknown";
|
|
342
|
+
}
|
|
343
|
+
resolveTokenName(token) {
|
|
344
|
+
if (typeof token === "function" && token.name) return token.name;
|
|
345
|
+
if (typeof token === "string") return token;
|
|
346
|
+
}
|
|
347
|
+
asTypeToken(value) {
|
|
348
|
+
if (typeof value === "function" || typeof value === "string" || typeof value === "symbol") return value;
|
|
349
|
+
}
|
|
350
|
+
asRecord(value) {
|
|
351
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
352
|
+
const record = value;
|
|
353
|
+
const out = { ...record };
|
|
354
|
+
for (const sym of Object.getOwnPropertySymbols(value)) out[sym] = record[sym];
|
|
355
|
+
return out;
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
//#endregion
|
|
360
|
+
//#region src/contracts/deploymentManifestTypes.ts
|
|
361
|
+
const DEPLOYMENT_MANIFEST_SCHEMA_VERSION = 2;
|
|
362
|
+
function serializeManifest(manifest) {
|
|
363
|
+
return JSON.stringify(manifest);
|
|
364
|
+
}
|
|
365
|
+
function deserializeManifest(raw) {
|
|
366
|
+
return JSON.parse(raw);
|
|
367
|
+
}
|
|
368
|
+
function isPollingTriggerConfig(config) {
|
|
369
|
+
return typeof config.getTriggerPollConfig === "function";
|
|
370
|
+
}
|
|
371
|
+
function resolveNodeTypeName(node$1) {
|
|
372
|
+
const configToken = node$1.config?.type;
|
|
373
|
+
if (typeof configToken?.name === "string" && configToken.name) return configToken.name;
|
|
374
|
+
const nodeToken = node$1.type;
|
|
375
|
+
if (typeof nodeToken?.name === "string" && nodeToken.name) return nodeToken.name;
|
|
376
|
+
return "Node";
|
|
377
|
+
}
|
|
378
|
+
function resolveCanvasNode(node$1) {
|
|
379
|
+
const config = node$1.config;
|
|
380
|
+
const type = resolveNodeTypeName(node$1);
|
|
381
|
+
const role = require_di.AgentConfigInspector.isAgentNodeConfig(config) ? "agent" : "workflowNode";
|
|
382
|
+
const triggerKind = node$1.kind === "trigger" ? config.triggerKind ?? "live" : void 0;
|
|
383
|
+
const c = config;
|
|
384
|
+
return {
|
|
385
|
+
id: node$1.id,
|
|
386
|
+
kind: node$1.kind,
|
|
387
|
+
name: node$1.name ?? config?.name,
|
|
388
|
+
type,
|
|
389
|
+
role,
|
|
390
|
+
...triggerKind !== void 0 && { triggerKind },
|
|
391
|
+
...c.declaredOutputPorts !== void 0 && { declaredOutputPorts: c.declaredOutputPorts },
|
|
392
|
+
...c.declaredInputPorts !== void 0 && { declaredInputPorts: c.declaredInputPorts }
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
function emitWorkflowManifest(workflow) {
|
|
396
|
+
const registry = new PersistedWorkflowTokenRegistry();
|
|
397
|
+
registry.registerFromWorkflows([workflow]);
|
|
398
|
+
const snapshot = new WorkflowSnapshotCodec(registry).create(workflow);
|
|
399
|
+
const canvas = {
|
|
400
|
+
id: workflow.id,
|
|
401
|
+
name: workflow.name,
|
|
402
|
+
nodes: workflow.nodes.map(resolveCanvasNode),
|
|
403
|
+
edges: workflow.edges
|
|
404
|
+
};
|
|
405
|
+
const triggers = workflow.nodes.filter((n) => n.kind === "trigger").map((n) => {
|
|
406
|
+
const config = n.config;
|
|
407
|
+
const cfg = config;
|
|
408
|
+
const triggerKind = config.triggerKind ?? "live";
|
|
409
|
+
const pollCfg = isPollingTriggerConfig(config) ? config.getTriggerPollConfig() : void 0;
|
|
410
|
+
const endpointKey = typeof cfg["endpointKey"] === "string" ? cfg["endpointKey"] : void 0;
|
|
411
|
+
const methods = Array.isArray(cfg["methods"]) ? cfg["methods"] : void 0;
|
|
412
|
+
const webhookFields = endpointKey !== void 0 && methods !== void 0 ? {
|
|
413
|
+
endpointKey,
|
|
414
|
+
methods
|
|
415
|
+
} : {};
|
|
416
|
+
const nodeTypeId = registry.getTokenId(config.type) ?? void 0;
|
|
417
|
+
const entry = {
|
|
418
|
+
nodeId: n.id,
|
|
419
|
+
triggerKind,
|
|
420
|
+
config: pollCfg !== void 0 ? pollCfg.config : webhookFields,
|
|
421
|
+
nodeTypeId
|
|
422
|
+
};
|
|
423
|
+
if (pollCfg?.pollIntervalMs !== void 0) return {
|
|
424
|
+
...entry,
|
|
425
|
+
pollIntervalMs: pollCfg.pollIntervalMs
|
|
426
|
+
};
|
|
427
|
+
return entry;
|
|
428
|
+
});
|
|
429
|
+
const credentialShapes = workflow.nodes.map((n) => {
|
|
430
|
+
const requirements = n.config.getCredentialRequirements?.();
|
|
431
|
+
if (!requirements || requirements.length === 0) return null;
|
|
432
|
+
return {
|
|
433
|
+
nodeId: n.id,
|
|
434
|
+
requirements
|
|
435
|
+
};
|
|
436
|
+
}).filter((s) => s !== null);
|
|
437
|
+
return {
|
|
438
|
+
manifestId: (0, node_crypto.randomUUID)(),
|
|
439
|
+
schemaVersion: DEPLOYMENT_MANIFEST_SCHEMA_VERSION,
|
|
440
|
+
workflowId: workflow.id,
|
|
441
|
+
canvas,
|
|
442
|
+
snapshot,
|
|
443
|
+
triggers,
|
|
444
|
+
credentialShapes
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
//#endregion
|
|
449
|
+
Object.defineProperty(exports, 'AgentBindError', {
|
|
450
|
+
enumerable: true,
|
|
451
|
+
get: function () {
|
|
452
|
+
return AgentBindError;
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
Object.defineProperty(exports, 'DEFAULT_ASSERTION_PASS_THRESHOLD', {
|
|
456
|
+
enumerable: true,
|
|
457
|
+
get: function () {
|
|
458
|
+
return DEFAULT_ASSERTION_PASS_THRESHOLD;
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
Object.defineProperty(exports, 'DEPLOYMENT_MANIFEST_SCHEMA_VERSION', {
|
|
462
|
+
enumerable: true,
|
|
463
|
+
get: function () {
|
|
464
|
+
return DEPLOYMENT_MANIFEST_SCHEMA_VERSION;
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
Object.defineProperty(exports, 'InjectableRuntimeDecoratorComposer', {
|
|
468
|
+
enumerable: true,
|
|
469
|
+
get: function () {
|
|
470
|
+
return InjectableRuntimeDecoratorComposer;
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
Object.defineProperty(exports, 'NoOpAgentMcpIntegration', {
|
|
474
|
+
enumerable: true,
|
|
475
|
+
get: function () {
|
|
476
|
+
return NoOpAgentMcpIntegration;
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
Object.defineProperty(exports, 'PersistedRuntimeTypeMetadataStore', {
|
|
480
|
+
enumerable: true,
|
|
481
|
+
get: function () {
|
|
482
|
+
return PersistedRuntimeTypeMetadataStore;
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
Object.defineProperty(exports, 'PersistedRuntimeTypeNameResolver', {
|
|
486
|
+
enumerable: true,
|
|
487
|
+
get: function () {
|
|
488
|
+
return PersistedRuntimeTypeNameResolver;
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
Object.defineProperty(exports, 'PersistedWorkflowTokenRegistry', {
|
|
492
|
+
enumerable: true,
|
|
493
|
+
get: function () {
|
|
494
|
+
return PersistedWorkflowTokenRegistry;
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
Object.defineProperty(exports, 'StackTraceCallSitePathResolver', {
|
|
498
|
+
enumerable: true,
|
|
499
|
+
get: function () {
|
|
500
|
+
return StackTraceCallSitePathResolver;
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
Object.defineProperty(exports, 'WorkflowSnapshotCodec', {
|
|
504
|
+
enumerable: true,
|
|
505
|
+
get: function () {
|
|
506
|
+
return WorkflowSnapshotCodec;
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
Object.defineProperty(exports, 'chatModel', {
|
|
510
|
+
enumerable: true,
|
|
511
|
+
get: function () {
|
|
512
|
+
return chatModel;
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
Object.defineProperty(exports, 'deriveAssertionPassed', {
|
|
516
|
+
enumerable: true,
|
|
517
|
+
get: function () {
|
|
518
|
+
return deriveAssertionPassed;
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
Object.defineProperty(exports, 'deserializeDispatch', {
|
|
522
|
+
enumerable: true,
|
|
523
|
+
get: function () {
|
|
524
|
+
return deserializeDispatch;
|
|
525
|
+
}
|
|
526
|
+
});
|
|
527
|
+
Object.defineProperty(exports, 'deserializeManifest', {
|
|
528
|
+
enumerable: true,
|
|
529
|
+
get: function () {
|
|
530
|
+
return deserializeManifest;
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
Object.defineProperty(exports, 'emitWorkflowManifest', {
|
|
534
|
+
enumerable: true,
|
|
535
|
+
get: function () {
|
|
536
|
+
return emitWorkflowManifest;
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
Object.defineProperty(exports, 'getPersistedRuntimeTypeMetadata', {
|
|
540
|
+
enumerable: true,
|
|
541
|
+
get: function () {
|
|
542
|
+
return getPersistedRuntimeTypeMetadata;
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
Object.defineProperty(exports, 'node', {
|
|
546
|
+
enumerable: true,
|
|
547
|
+
get: function () {
|
|
548
|
+
return node;
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
Object.defineProperty(exports, 'serializeDispatch', {
|
|
552
|
+
enumerable: true,
|
|
553
|
+
get: function () {
|
|
554
|
+
return serializeDispatch;
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
Object.defineProperty(exports, 'serializeManifest', {
|
|
558
|
+
enumerable: true,
|
|
559
|
+
get: function () {
|
|
560
|
+
return serializeManifest;
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
Object.defineProperty(exports, 'tool', {
|
|
564
|
+
enumerable: true,
|
|
565
|
+
get: function () {
|
|
566
|
+
return tool;
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
//# sourceMappingURL=contracts-7L1wJHdk.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts-7L1wJHdk.cjs","names":["metadata: PersistedRuntimeTypeMetadata","node","tokenRegistry: PersistedWorkflowTokenRegistryLike","node","fallback: Record<string, unknown>","raw: unknown","rows: Array<Readonly<{ label: string; value: string }>>","out: Record<PropertyKey, unknown>","node","AgentConfigInspector","triggers: ManifestTriggerConfig[]","webhookFields: JsonObject","entry: ManifestTriggerConfig","credentialShapes: ManifestNodeCredentialShape[]"],"sources":["../src/contracts/dispatchTypes.ts","../src/contracts/AgentBindError.ts","../src/contracts/NoOpAgentMcpIntegration.ts","../src/contracts/assertionTypes.ts","../src/runtime-types/persistedRuntimeTypeModelRegistry.ts","../src/runtime-types/PersistedRuntimeTypeNameResolver.ts","../src/runtime-types/StackTraceCallSitePathResolver.ts","../src/runtime-types/PersistedRuntimeTypeMetadataStoreRegistry.ts","../src/runtime-types/InjectableRuntimeDecoratorComposerRegistry.ts","../src/runtime-types/runtimeTypeDecorators.types.ts","../src/workflowSnapshots/PersistedRuntimeTypeIdFactory.ts","../src/workflowSnapshots/PersistedWorkflowTokenRegistry.ts","../src/workflowSnapshots/WorkflowSnapshotCodec.ts","../src/contracts/deploymentManifestTypes.ts"],"sourcesContent":["import type { BinaryAttachment, JsonValue, RunId, WorkflowId } from \"./workflowTypes\";\nimport type { NodeId } from \"./baseTypes\";\n\nexport type WorkspaceId = string;\n\nexport type DispatchBinaryRef = BinaryAttachment;\n\nexport interface DispatchItemMeta {\n readonly id: string;\n readonly json?: JsonValue;\n readonly binary?: Readonly<Record<string, DispatchBinaryRef>>;\n}\n\nexport interface WorkflowDispatch {\n readonly runId: RunId;\n readonly workspaceId: WorkspaceId;\n readonly workflowId: WorkflowId;\n readonly triggerNodeId: NodeId;\n readonly items: ReadonlyArray<DispatchItemMeta>;\n readonly triggerContext: JsonValue;\n}\n\nexport function serializeDispatch(dispatch: WorkflowDispatch): string {\n return JSON.stringify(dispatch);\n}\n\nexport function deserializeDispatch(raw: string): WorkflowDispatch {\n return JSON.parse(raw) as WorkflowDispatch;\n}\n","export class AgentBindError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AgentBindError\";\n }\n}\n","import type { AgentMcpIntegration, AgentMcpToolMap } from \"./agentMcpTypes\";\n\nexport class NoOpAgentMcpIntegration implements AgentMcpIntegration {\n async prepareMcpTools(): Promise<AgentMcpToolMap> {\n return new Map();\n }\n}\n","import type { JsonValue, NodeId } from \"./workflowTypes\";\n\nexport interface AssertionResult {\n readonly name: string;\n readonly score: number;\n readonly passThreshold?: number;\n readonly errored?: true;\n readonly expected?: JsonValue;\n readonly actual?: JsonValue;\n readonly message?: string;\n readonly details?: Readonly<Record<string, JsonValue>>;\n}\n\nexport const DEFAULT_ASSERTION_PASS_THRESHOLD = 0.5;\n\nexport function deriveAssertionPassed(result: {\n readonly score: number;\n readonly passThreshold?: number;\n readonly errored?: true;\n}): boolean {\n if (result.errored === true) return false;\n const threshold = result.passThreshold ?? DEFAULT_ASSERTION_PASS_THRESHOLD;\n return result.score >= threshold;\n}\n\nexport interface AssertionResultProvenance {\n readonly nodeId: NodeId;\n readonly iterationId?: string;\n readonly itemIndex?: number;\n}\n","export const persistedRuntimeTypeMetadataKey = Symbol.for(\"codemation.core.persistedRuntimeTypeMetadata\");\n\nexport type DecoratedRuntimeType = Readonly<{ name?: string }> & object;\n\nexport type PersistedRuntimeTypeKind = \"node\" | \"tool\" | \"chatModel\";\n\nexport interface PersistedRuntimeTypeDecoratorOptions {\n readonly name?: string;\n readonly packageName?: string;\n readonly moduleUrl?: string;\n}\n\nexport interface PersistedRuntimeTypeMetadata {\n readonly persistedName: string;\n readonly kind: PersistedRuntimeTypeKind;\n readonly packageName: string;\n readonly sourceHint?: string;\n}\n\nexport class PersistedRuntimeTypeDecoratorDefaults {\n static readonly appPackageName = \"app\";\n\n static apply(options: PersistedRuntimeTypeDecoratorOptions): PersistedRuntimeTypeDecoratorOptions {\n return {\n ...options,\n packageName: options.packageName ?? this.appPackageName,\n };\n }\n}\n","import type { DecoratedRuntimeType } from \"./persistedRuntimeTypeModelRegistry\";\n\nexport class PersistedRuntimeTypeNameResolver {\n static resolve(target: DecoratedRuntimeType, override: string | undefined): string {\n const resolved = override ?? target.name;\n if (!resolved) {\n throw new Error(\n \"Persisted runtime token metadata requires a named class or an explicit decorator name override.\",\n );\n }\n return resolved;\n }\n}\n","export class StackTraceCallSitePathResolver {\n static resolve(decoratorFileUrl: string): string | undefined {\n const stack = new Error().stack ?? \"\";\n for (const line of stack.split(\"\\n\")) {\n const candidate = this.extractPath(line.trim());\n if (!candidate) {\n continue;\n }\n if (candidate === decoratorFileUrl || candidate.includes(\"runtimeTypeDecorators\")) {\n continue;\n }\n return candidate;\n }\n return undefined;\n }\n\n private static extractPath(line: string): string | undefined {\n const fileUrlMatch = line.match(/file:\\/\\/[^\\s)]+/);\n if (fileUrlMatch) return fileUrlMatch[0];\n const parenMatch = line.match(/\\((\\/[^)]+)\\)/);\n if (parenMatch) return parenMatch[1];\n const bareMatch = line.match(/at (\\/[^\\s]+)/);\n return bareMatch?.[1];\n }\n}\n","import {\n PersistedRuntimeTypeDecoratorDefaults,\n persistedRuntimeTypeMetadataKey,\n type DecoratedRuntimeType,\n type PersistedRuntimeTypeDecoratorOptions,\n type PersistedRuntimeTypeKind,\n type PersistedRuntimeTypeMetadata,\n} from \"./persistedRuntimeTypeModelRegistry\";\nimport { PersistedRuntimeTypeNameResolver } from \"./PersistedRuntimeTypeNameResolver\";\nimport { StackTraceCallSitePathResolver } from \"./StackTraceCallSitePathResolver\";\n\nexport class PersistedRuntimeTypeMetadataStore {\n static define(\n target: DecoratedRuntimeType,\n kind: PersistedRuntimeTypeKind,\n options: PersistedRuntimeTypeDecoratorOptions,\n decoratorFileUrl: string,\n ): void {\n const normalizedOptions = PersistedRuntimeTypeDecoratorDefaults.apply(options);\n const metadata: PersistedRuntimeTypeMetadata = {\n persistedName: PersistedRuntimeTypeNameResolver.resolve(target, normalizedOptions.name),\n kind,\n packageName: normalizedOptions.packageName ?? PersistedRuntimeTypeDecoratorDefaults.appPackageName,\n sourceHint: normalizedOptions.moduleUrl ?? StackTraceCallSitePathResolver.resolve(decoratorFileUrl),\n };\n Object.defineProperty(target, persistedRuntimeTypeMetadataKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: metadata,\n });\n }\n\n static get(target: unknown): PersistedRuntimeTypeMetadata | undefined {\n if (!target || (typeof target !== \"function\" && typeof target !== \"object\")) {\n return undefined;\n }\n return (target as Record<PropertyKey, unknown>)[persistedRuntimeTypeMetadataKey] as\n | PersistedRuntimeTypeMetadata\n | undefined;\n }\n}\n","import { injectable } from \"../di\";\n\nimport { PersistedRuntimeTypeMetadataStore } from \"./PersistedRuntimeTypeMetadataStoreRegistry\";\nimport type {\n DecoratedRuntimeType,\n PersistedRuntimeTypeDecoratorOptions,\n PersistedRuntimeTypeKind,\n} from \"./persistedRuntimeTypeModelRegistry\";\n\nexport class InjectableRuntimeDecoratorComposer {\n static compose(\n kind: PersistedRuntimeTypeKind,\n options: PersistedRuntimeTypeDecoratorOptions,\n decoratorFileUrl: string,\n ): ClassDecorator {\n return (target) => {\n injectable()(target as never);\n PersistedRuntimeTypeMetadataStore.define(target as DecoratedRuntimeType, kind, options, decoratorFileUrl);\n };\n }\n}\n","import type {\n PersistedRuntimeTypeDecoratorOptions,\n PersistedRuntimeTypeMetadata,\n} from \"./persistedRuntimeTypeModelRegistry\";\n\nimport { InjectableRuntimeDecoratorComposer } from \"./InjectableRuntimeDecoratorComposerRegistry\";\nimport { PersistedRuntimeTypeMetadataStore } from \"./PersistedRuntimeTypeMetadataStoreRegistry\";\n\nexport type {\n PersistedRuntimeTypeDecoratorOptions,\n PersistedRuntimeTypeKind,\n PersistedRuntimeTypeMetadata,\n} from \"./persistedRuntimeTypeModelRegistry\";\n\nexport function getPersistedRuntimeTypeMetadata(target: unknown): PersistedRuntimeTypeMetadata | undefined {\n return PersistedRuntimeTypeMetadataStore.get(target);\n}\n\nexport function node(options: PersistedRuntimeTypeDecoratorOptions = {}): ClassDecorator {\n return InjectableRuntimeDecoratorComposer.compose(\"node\", options, import.meta.url);\n}\n\nexport function tool(options: PersistedRuntimeTypeDecoratorOptions = {}): ClassDecorator {\n return InjectableRuntimeDecoratorComposer.compose(\"tool\", options, import.meta.url);\n}\n\nexport function chatModel(options: PersistedRuntimeTypeDecoratorOptions = {}): ClassDecorator {\n return InjectableRuntimeDecoratorComposer.compose(\"chatModel\", options, import.meta.url);\n}\n\nexport { InjectableRuntimeDecoratorComposer } from \"./InjectableRuntimeDecoratorComposerRegistry\";\nexport { PersistedRuntimeTypeMetadataStore } from \"./PersistedRuntimeTypeMetadataStoreRegistry\";\nexport { PersistedRuntimeTypeNameResolver } from \"./PersistedRuntimeTypeNameResolver\";\nexport { StackTraceCallSitePathResolver } from \"./StackTraceCallSitePathResolver\";\n","import type { TypeToken } from \"../di\";\n\nimport { getPersistedRuntimeTypeMetadata } from \"../runtime-types/runtimeTypeDecorators.types\";\n\nimport type { PersistedTokenId } from \"../types\";\n\nexport class PersistedRuntimeTypeIdFactory {\n static fromMetadata(args: Readonly<{ type: TypeToken<unknown> }>): PersistedTokenId | undefined {\n const metadata = getPersistedRuntimeTypeMetadata(args.type);\n if (!metadata) {\n return undefined;\n }\n const packageName = metadata.packageName;\n if (!packageName) {\n return undefined;\n }\n return `${packageName}::${metadata.persistedName}` as PersistedTokenId;\n }\n}\n","import type { TypeToken } from \"../di\";\n\nimport type { PersistedTokenId, WorkflowDefinition } from \"../types\";\n\nimport { PersistedRuntimeTypeIdFactory } from \"./PersistedRuntimeTypeIdFactory\";\n\nexport class PersistedWorkflowTokenRegistry {\n private readonly tokensById = new Map<PersistedTokenId, TypeToken<unknown>>();\n private readonly tokenIdsByToken = new Map<TypeToken<unknown>, PersistedTokenId>();\n\n register(type: TypeToken<unknown>, packageId: string, persistedNameOverride?: string): PersistedTokenId {\n const tokenName = persistedNameOverride ?? this.displayNameForTypeToken(type);\n const tokenId = `${packageId}::${tokenName}` as PersistedTokenId;\n this.tokensById.set(tokenId, type);\n this.tokenIdsByToken.set(type, tokenId);\n return tokenId;\n }\n\n registerFromWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void {\n for (const workflow of workflows) {\n for (const node of workflow.nodes) {\n this.registerDecoratedType(node.type);\n this.registerDecoratedType(node.config.type);\n this.registerNestedTypes(node.config);\n }\n }\n }\n\n private registerDecoratedType(type: TypeToken<unknown>): void {\n if (this.tokenIdsByToken.has(type)) {\n return;\n }\n const tokenId = PersistedRuntimeTypeIdFactory.fromMetadata({ type });\n if (!tokenId) {\n return;\n }\n this.tokensById.set(tokenId, type);\n this.tokenIdsByToken.set(type, tokenId);\n }\n\n private registerNestedTypes(value: unknown): void {\n if (Array.isArray(value)) {\n for (const entry of value) this.registerNestedTypes(entry);\n return;\n }\n if (!value || typeof value !== \"object\") return;\n const record = value as Record<string, unknown>;\n const type = this.asTypeToken(record.type);\n if (type) this.registerDecoratedType(type);\n for (const v of Object.values(record)) this.registerNestedTypes(v);\n }\n\n private displayNameForTypeToken(token: TypeToken<unknown>): string {\n if (typeof token === \"function\" && token.name) return token.name;\n if (typeof token === \"string\") return token;\n return \"\";\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 getTokenId(token: TypeToken<unknown>): PersistedTokenId | undefined {\n const existing = this.tokenIdsByToken.get(token);\n if (existing) {\n return existing;\n }\n const tokenId = PersistedRuntimeTypeIdFactory.fromMetadata({ type: token });\n if (!tokenId) {\n return undefined;\n }\n this.tokensById.set(tokenId, token);\n this.tokenIdsByToken.set(token, tokenId);\n return tokenId;\n }\n\n resolve(tokenId: PersistedTokenId): TypeToken<unknown> | undefined {\n return this.tokensById.get(tokenId);\n }\n}\n","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 const inspectorSummaryRows = this.safeInspectorSummary(node.config);\n return {\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 ...(inspectorSummaryRows !== undefined ? { inspectorSummary: inspectorSummaryRows } : {}),\n };\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 description: config.description,\n execution: config.execution,\n };\n this.injectTokenIds(fallback, config as unknown as Record<string, unknown>);\n return fallback;\n }\n }\n\n private safeInspectorSummary(\n config: NodeConfigBase,\n ): ReadonlyArray<Readonly<{ label: string; value: string }>> | undefined {\n const fn = (config as { inspectorSummary?: () => unknown }).inspectorSummary;\n if (typeof fn !== \"function\") return undefined;\n let raw: unknown;\n try {\n raw = fn.call(config);\n } catch {\n return undefined;\n }\n if (!Array.isArray(raw)) return undefined;\n const rows: Array<Readonly<{ label: string; value: string }>> = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== \"object\") continue;\n const { label, value } = entry as { label?: unknown; value?: unknown };\n if (typeof label !== \"string\" || typeof value !== \"string\") continue;\n const trimmedLabel = label.trim();\n if (trimmedLabel.length === 0) continue;\n rows.push({ label: trimmedLabel, value });\n }\n return rows.length > 0 ? rows : undefined;\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<PropertyKey, 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<PropertyKey, 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<PropertyKey, unknown>,\n hydrated: Record<PropertyKey, 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 for (const sym of Object.getOwnPropertySymbols(liveRecord)) {\n hydrated[sym] = liveRecord[sym];\n }\n }\n\n private restoreTypeProperty(record: Record<PropertyKey, 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<PropertyKey, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n const record = value as Record<PropertyKey, unknown>;\n const out: Record<PropertyKey, unknown> = { ...(record as Record<string, unknown>) };\n for (const sym of Object.getOwnPropertySymbols(value)) {\n out[sym] = record[sym];\n }\n return out;\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { NodeId, WorkflowId } from \"./baseTypes\";\nimport type { CredentialRequirement } from \"./credentialTypes\";\nimport type { PersistedWorkflowSnapshot } from \"./runTypes\";\nimport type { JsonObject, NodeDefinition, PollingTriggerConfig } from \"./workflowTypes\";\nimport type { WorkflowDefinition } from \"../types\";\nimport { AgentConfigInspector } from \"../ai/AgentConfigInspectorFactory\";\nimport { PersistedWorkflowTokenRegistry } from \"../workflowSnapshots/PersistedWorkflowTokenRegistry\";\nimport { WorkflowSnapshotCodec } from \"../workflowSnapshots/WorkflowSnapshotCodec\";\n\nexport const DEPLOYMENT_MANIFEST_SCHEMA_VERSION = 2 as const;\n\nexport type DeploymentManifestSchemaVersion = typeof DEPLOYMENT_MANIFEST_SCHEMA_VERSION;\n\nexport type ManifestTriggerConfig = Readonly<{\n nodeId: NodeId;\n triggerKind: \"live\" | \"test\";\n config: JsonObject;\n pollIntervalMs?: number;\n nodeTypeId?: string;\n}>;\n\nexport type ManifestNodeCredentialShape = Readonly<{\n nodeId: NodeId;\n requirements: ReadonlyArray<CredentialRequirement>;\n}>;\n\nexport type WorkflowDeploymentManifest<TCanvas = JsonObject> = Readonly<{\n manifestId: string;\n schemaVersion: DeploymentManifestSchemaVersion;\n workflowId: WorkflowId;\n canvas: TCanvas;\n snapshot: PersistedWorkflowSnapshot;\n triggers: ReadonlyArray<ManifestTriggerConfig>;\n credentialShapes: ReadonlyArray<ManifestNodeCredentialShape>;\n}>;\n\nexport function serializeManifest<TCanvas>(manifest: WorkflowDeploymentManifest<TCanvas>): string {\n return JSON.stringify(manifest);\n}\n\nexport function deserializeManifest<TCanvas = JsonObject>(raw: string): WorkflowDeploymentManifest<TCanvas> {\n return JSON.parse(raw) as WorkflowDeploymentManifest<TCanvas>;\n}\n\nexport type ManifestCanvasNode = Readonly<{\n id: NodeId;\n kind: string;\n name: string | undefined;\n type?: string;\n role?: string;\n triggerKind?: \"live\" | \"test\";\n declaredOutputPorts?: ReadonlyArray<string>;\n declaredInputPorts?: ReadonlyArray<string>;\n}>;\n\nexport type ManifestCanvas = Readonly<{\n id: WorkflowId;\n name: string;\n nodes: ReadonlyArray<ManifestCanvasNode>;\n edges: WorkflowDefinition[\"edges\"];\n}>;\n\ntype TriggerNodeConfigShape = Readonly<{ triggerKind?: \"live\" | \"test\" }>;\n\nfunction isPollingTriggerConfig(config: unknown): config is PollingTriggerConfig {\n return typeof (config as PollingTriggerConfig).getTriggerPollConfig === \"function\";\n}\n\nfunction resolveNodeTypeName(node: NodeDefinition): string {\n const configToken = node.config?.type as Readonly<{ name?: unknown }> | undefined;\n if (typeof configToken?.name === \"string\" && configToken.name) {\n return configToken.name;\n }\n const nodeToken = node.type as Readonly<{ name?: unknown }> | undefined;\n if (typeof nodeToken?.name === \"string\" && nodeToken.name) {\n return nodeToken.name;\n }\n return \"Node\";\n}\n\nfunction resolveCanvasNode(node: NodeDefinition): ManifestCanvasNode {\n const config = node.config;\n const type = resolveNodeTypeName(node);\n const role = AgentConfigInspector.isAgentNodeConfig(config) ? \"agent\" : \"workflowNode\";\n const triggerKind = node.kind === \"trigger\" ? ((config as TriggerNodeConfigShape).triggerKind ?? \"live\") : undefined;\n const c = config as {\n declaredOutputPorts?: readonly string[];\n declaredInputPorts?: readonly string[];\n };\n return {\n id: node.id,\n kind: node.kind,\n name: node.name ?? config?.name,\n type,\n role,\n ...(triggerKind !== undefined && { triggerKind }),\n ...(c.declaredOutputPorts !== undefined && { declaredOutputPorts: c.declaredOutputPorts }),\n ...(c.declaredInputPorts !== undefined && { declaredInputPorts: c.declaredInputPorts }),\n };\n}\n\nexport function emitWorkflowManifest(workflow: WorkflowDefinition): WorkflowDeploymentManifest<ManifestCanvas> {\n const registry = new PersistedWorkflowTokenRegistry();\n registry.registerFromWorkflows([workflow]);\n const codec = new WorkflowSnapshotCodec(registry);\n const snapshot = codec.create(workflow);\n\n const canvas = {\n id: workflow.id,\n name: workflow.name,\n nodes: workflow.nodes.map(resolveCanvasNode),\n edges: workflow.edges,\n };\n\n const triggers: ManifestTriggerConfig[] = workflow.nodes\n .filter((n) => n.kind === \"trigger\")\n .map((n) => {\n const config = n.config;\n const cfg = config as unknown as Record<string, unknown>;\n const triggerKind = (config as TriggerNodeConfigShape).triggerKind ?? \"live\";\n const pollCfg = isPollingTriggerConfig(config) ? config.getTriggerPollConfig() : undefined;\n const endpointKey = typeof cfg[\"endpointKey\"] === \"string\" ? cfg[\"endpointKey\"] : undefined;\n const methods = Array.isArray(cfg[\"methods\"]) ? (cfg[\"methods\"] as string[]) : undefined;\n const webhookFields: JsonObject =\n endpointKey !== undefined && methods !== undefined ? { endpointKey, methods } : {};\n const nodeTypeId = registry.getTokenId(config.type) ?? undefined;\n const entry: ManifestTriggerConfig = {\n nodeId: n.id,\n triggerKind,\n config: pollCfg !== undefined ? pollCfg.config : webhookFields,\n nodeTypeId,\n };\n if (pollCfg?.pollIntervalMs !== undefined) {\n return { ...entry, pollIntervalMs: pollCfg.pollIntervalMs };\n }\n return entry;\n });\n\n const credentialShapes: ManifestNodeCredentialShape[] = workflow.nodes\n .map((n) => {\n const requirements = n.config.getCredentialRequirements?.();\n if (!requirements || requirements.length === 0) return null;\n return { nodeId: n.id, requirements } satisfies ManifestNodeCredentialShape;\n })\n .filter((s): s is ManifestNodeCredentialShape => s !== null);\n\n return {\n manifestId: randomUUID(),\n schemaVersion: DEPLOYMENT_MANIFEST_SCHEMA_VERSION,\n workflowId: workflow.id,\n canvas,\n snapshot,\n triggers,\n credentialShapes,\n };\n}\n"],"mappings":"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"}
|