@x12i/graphenix-plan-format 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-executable-plan-v2.d.ts","sourceRoot":"","sources":["../../src/validators/validate-executable-plan-v2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAqkB5F,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,GACZ,+BAA+B,CA+iBjC"}
@@ -0,0 +1,534 @@
1
+ import { EXECUTABLE_PLAN_FORMAT_V2 } from "@x12i/graphenix-executable-contracts";
2
+ import { execError, getExecutableProfile, getFinalizerNodeConfig, getTaskNodeConfig, isAiModelSelection, isExecutableFinalizerNode, isExecutableTaskNode, isRecord } from "@x12i/graphenix-executable-contracts";
3
+ import { EXECUTABLE_PROFILE_PATH } from "@x12i/graphenix-executable-contracts";
4
+ import { validateNormalizedExecutableGraph } from "@x12i/graphenix-authoring-format";
5
+ import { isProfileChoiceKeyFormat } from "@x12i/graphenix-authoring-format";
6
+ const FORBIDDEN_PLAN_FIELDS = [
7
+ "credentials",
8
+ "openrouterApiKey",
9
+ "providerResponse",
10
+ "tokenUsage",
11
+ "executionLog",
12
+ "traceEvents"
13
+ ];
14
+ const AI_MODEL_SLOTS = [
15
+ "preActionModel",
16
+ "skillModel",
17
+ "postActionModel",
18
+ "finalizerModel"
19
+ ];
20
+ const UNIT_KIND_INVOKE_MODE = {
21
+ externalPreUtility: "externalRunTask",
22
+ mainSkill: "mainRunTask",
23
+ pipelinePhase: "pipelinePhase",
24
+ externalPostUtility: "externalRunTask",
25
+ localSkill: "local",
26
+ finalizer: "finalizer",
27
+ validation: "none",
28
+ mapping: "none"
29
+ };
30
+ const AI_UNIT_KINDS = new Set([
31
+ "externalPreUtility",
32
+ "mainSkill",
33
+ "pipelinePhase",
34
+ "externalPostUtility",
35
+ "finalizer"
36
+ ]);
37
+ function containsForbiddenFields(value, path, errors) {
38
+ if (!isRecord(value))
39
+ return;
40
+ for (const field of FORBIDDEN_PLAN_FIELDS) {
41
+ if (field in value) {
42
+ errors.push(execError("EXECUTABLE_PLAN_FORBIDDEN_FIELD", `Executable plan must not contain ${field}.`, `${path}/${field}`));
43
+ }
44
+ }
45
+ for (const [key, child] of Object.entries(value)) {
46
+ if (isRecord(child) || Array.isArray(child)) {
47
+ containsForbiddenFields(child, `${path}/${key}`, errors);
48
+ }
49
+ }
50
+ }
51
+ function validateDirectModelSelection(selection, path, policy, errors) {
52
+ if (!isRecord(selection) || selection.kind !== "model")
53
+ return;
54
+ if (policy === "forbidden" || policy === "breakGlassOnly") {
55
+ errors.push(execError("EXECUTABLE_PLAN_V2_DIRECT_MODEL_FORBIDDEN", `Direct model selection is not allowed under directModelPolicy=${policy}.`, path));
56
+ }
57
+ }
58
+ function validateModelSelection(selection, path, policy, errors) {
59
+ if (!isAiModelSelection(selection)) {
60
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", "modelSelection must be a valid AiModelSelection.", path));
61
+ return;
62
+ }
63
+ if (isRecord(selection) &&
64
+ selection.kind === "profileChoice" &&
65
+ typeof selection.key === "string" &&
66
+ !isProfileChoiceKeyFormat(selection.key)) {
67
+ errors.push(execError("PROFILE_CHOICE_KEY_FORMAT_INVALID", `Invalid profileChoice key format: ${selection.key}.`, path));
68
+ }
69
+ validateDirectModelSelection(selection, path, policy, errors);
70
+ }
71
+ function getEmbeddedGraph(plan) {
72
+ const normalizedGraph = plan.normalizedGraph;
73
+ if (!isRecord(normalizedGraph))
74
+ return undefined;
75
+ if (normalizedGraph.mode === "embedded")
76
+ return normalizedGraph.graph;
77
+ return undefined;
78
+ }
79
+ function validateExecutionUnitsV2(nodeId, executionUnits, executionClass, directModelPolicy, errors) {
80
+ if (executionUnits.length === 0) {
81
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `nodePlans.${nodeId}.executionUnits must contain at least one unit.`, `/nodePlans/${nodeId}/executionUnits`));
82
+ return;
83
+ }
84
+ const seenUnitIds = new Set();
85
+ const seenOrders = new Set();
86
+ let mainSkillCount = 0;
87
+ for (const [index, unit] of executionUnits.entries()) {
88
+ const path = `/nodePlans/${nodeId}/executionUnits/${index}`;
89
+ if (!isRecord(unit)) {
90
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Execution unit ${index} on node ${nodeId} must be an object.`, path));
91
+ continue;
92
+ }
93
+ if (typeof unit.unitId !== "string" || unit.unitId.length === 0) {
94
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Execution unit ${index} on node ${nodeId} must define unitId.`, `${path}/unitId`));
95
+ }
96
+ else if (seenUnitIds.has(unit.unitId)) {
97
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Duplicate execution unit id "${unit.unitId}" on node ${nodeId}.`, `${path}/unitId`));
98
+ }
99
+ else {
100
+ seenUnitIds.add(unit.unitId);
101
+ }
102
+ if (unit.nodeId !== nodeId) {
103
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Execution unit ${index} must reference nodeId ${nodeId}.`, `${path}/nodeId`));
104
+ }
105
+ if (typeof unit.order !== "number" || !Number.isInteger(unit.order)) {
106
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Execution unit ${index} must define integer order.`, `${path}/order`));
107
+ }
108
+ else if (seenOrders.has(unit.order)) {
109
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Duplicate execution unit order ${unit.order} on node ${nodeId}.`, `${path}/order`));
110
+ }
111
+ else {
112
+ seenOrders.add(unit.order);
113
+ }
114
+ const unitKind = String(unit.unitKind ?? "");
115
+ const expectedInvokeMode = UNIT_KIND_INVOKE_MODE[unitKind];
116
+ if (!expectedInvokeMode) {
117
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Unknown unitKind "${unitKind}" on node ${nodeId}.`, `${path}/unitKind`));
118
+ }
119
+ else if (unit.invokeMode !== expectedInvokeMode) {
120
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Execution unit ${unit.unitId ?? index} must use invokeMode ${expectedInvokeMode}.`, `${path}/invokeMode`));
121
+ }
122
+ if (typeof unit.sourcePath !== "string") {
123
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Execution unit ${index} must define sourcePath.`, `${path}/sourcePath`));
124
+ }
125
+ if (unitKind === "mainSkill") {
126
+ mainSkillCount += 1;
127
+ }
128
+ if (AI_UNIT_KINDS.has(unitKind) && executionClass !== "localTask") {
129
+ validateModelSelection(unit.modelSelection, `${path}/modelSelection`, directModelPolicy, errors);
130
+ }
131
+ }
132
+ if (executionClass === "aiTask" && mainSkillCount !== 1) {
133
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `AI task node ${nodeId} must contain exactly one mainSkill unit.`, `/nodePlans/${nodeId}/executionUnits`));
134
+ }
135
+ const orders = [...seenOrders].sort((a, b) => a - b);
136
+ for (let index = 0; index < orders.length; index += 1) {
137
+ if (orders[index] !== index) {
138
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNIT_INVALID", `Execution unit orders on node ${nodeId} must be contiguous starting at 0.`, `/nodePlans/${nodeId}/executionUnits`));
139
+ break;
140
+ }
141
+ }
142
+ }
143
+ function validateTopology(plan, graph, errors) {
144
+ const topology = plan.topology;
145
+ if (!isRecord(topology)) {
146
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISSING", "topology is required.", "/topology"));
147
+ return;
148
+ }
149
+ const graphNodeIds = new Set(graph.graph.nodes.map((n) => n.id));
150
+ const graphEdgeIds = new Set(graph.graph.edges.map((e) => e.id));
151
+ const topoNodes = topology.nodes;
152
+ if (!Array.isArray(topoNodes)) {
153
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISSING", "topology.nodes is required.", "/topology/nodes"));
154
+ }
155
+ else {
156
+ const topoNodeIds = new Set();
157
+ for (const [index, nodeRef] of topoNodes.entries()) {
158
+ if (!isRecord(nodeRef) || typeof nodeRef.nodeId !== "string") {
159
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISMATCH", `topology.nodes[${index}] must define nodeId.`, `/topology/nodes/${index}`));
160
+ continue;
161
+ }
162
+ topoNodeIds.add(nodeRef.nodeId);
163
+ if (!graphNodeIds.has(nodeRef.nodeId)) {
164
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISMATCH", `topology node ${nodeRef.nodeId} not found in normalized graph.`, `/topology/nodes/${index}/nodeId`));
165
+ }
166
+ }
167
+ for (const nodeId of graphNodeIds) {
168
+ if (!topoNodeIds.has(nodeId)) {
169
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISMATCH", `Graph node ${nodeId} missing from topology.nodes.`, "/topology/nodes"));
170
+ }
171
+ }
172
+ }
173
+ const topoEdges = topology.edges;
174
+ if (!Array.isArray(topoEdges)) {
175
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISSING", "topology.edges is required.", "/topology/edges"));
176
+ }
177
+ else {
178
+ for (const [index, edgeRef] of topoEdges.entries()) {
179
+ if (!isRecord(edgeRef) || typeof edgeRef.edgeId !== "string") {
180
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISMATCH", `topology.edges[${index}] must define edgeId.`, `/topology/edges/${index}`));
181
+ continue;
182
+ }
183
+ if (!graphEdgeIds.has(edgeRef.edgeId)) {
184
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISMATCH", `topology edge ${edgeRef.edgeId} not found in normalized graph.`, `/topology/edges/${index}/edgeId`));
185
+ }
186
+ }
187
+ }
188
+ for (const field of [
189
+ "entryNodeIds",
190
+ "rootNodeIds",
191
+ "finalizerNodeIds",
192
+ "outputNodeIds",
193
+ "graphInputIds",
194
+ "graphOutputIds"
195
+ ]) {
196
+ if (!Array.isArray(topology[field])) {
197
+ errors.push(execError("EXECUTABLE_PLAN_V2_TOPOLOGY_MISSING", `topology.${field} is required.`, `/topology/${field}`));
198
+ }
199
+ }
200
+ }
201
+ function validateDeferredGates(plan, graph, errors) {
202
+ const deferredGates = plan.deferredGates;
203
+ if (!isRecord(deferredGates)) {
204
+ errors.push(execError("EXECUTABLE_PLAN_V2_DEFERRED_GATE_MISSING", "deferredGates is required.", "/deferredGates"));
205
+ return;
206
+ }
207
+ const nodeGates = deferredGates.nodeGates;
208
+ const edgeGates = deferredGates.edgeGates;
209
+ if (!isRecord(nodeGates)) {
210
+ errors.push(execError("EXECUTABLE_PLAN_V2_DEFERRED_GATE_MISSING", "deferredGates.nodeGates is required.", "/deferredGates/nodeGates"));
211
+ }
212
+ if (!isRecord(edgeGates)) {
213
+ errors.push(execError("EXECUTABLE_PLAN_V2_DEFERRED_GATE_MISSING", "deferredGates.edgeGates is required.", "/deferredGates/edgeGates"));
214
+ }
215
+ for (const node of graph.graph.nodes) {
216
+ const params = node.parameters;
217
+ if (!isRecord(params))
218
+ continue;
219
+ const conditions = params.conditions;
220
+ if (conditions !== undefined) {
221
+ const hasGate = isRecord(nodeGates) && node.id in nodeGates;
222
+ if (!hasGate) {
223
+ errors.push(execError("EXECUTABLE_PLAN_V2_DEFERRED_GATE_MISSING", `Node ${node.id} has conditions but no deferredGates.nodeGates entry.`, `/deferredGates/nodeGates/${node.id}`));
224
+ }
225
+ }
226
+ }
227
+ for (const edge of graph.graph.edges) {
228
+ const when = edge.when;
229
+ if (when !== undefined) {
230
+ const hasGate = isRecord(edgeGates) && edge.id in edgeGates;
231
+ if (!hasGate) {
232
+ errors.push(execError("EXECUTABLE_PLAN_V2_DEFERRED_GATE_MISSING", `Edge ${edge.id} has when condition but no deferredGates.edgeGates entry.`, `/deferredGates/edgeGates/${edge.id}`));
233
+ }
234
+ }
235
+ }
236
+ }
237
+ function validateNodeInvokeContract(nodeId, nodePlan, graph, errors) {
238
+ const invokeContract = nodePlan.invokeContract;
239
+ if (!isRecord(invokeContract)) {
240
+ errors.push(execError("EXECUTABLE_PLAN_V2_INVOKE_CONTRACT_MISSING", `nodePlans.${nodeId}.invokeContract is required.`, `/nodePlans/${nodeId}/invokeContract`));
241
+ return;
242
+ }
243
+ const graphNode = graph.graph.nodes.find((n) => n.id === nodeId);
244
+ const params = graphNode ? getTaskNodeConfig(graphNode) : undefined;
245
+ const hasTaskVariable = invokeContract.taskVariable !== undefined ||
246
+ params?.taskVariable !== undefined;
247
+ const hasInputsConfig = invokeContract.inputsConfig !== undefined ||
248
+ params?.inputsConfig !== undefined;
249
+ if (!hasTaskVariable && params) {
250
+ // taskVariable is optional for some nodes
251
+ }
252
+ if (!hasInputsConfig && params?.inputsConfig === undefined) {
253
+ // inputsConfig may be absent on minimal nodes — ok
254
+ }
255
+ if (typeof nodePlan.sourcePath !== "string") {
256
+ errors.push(execError("EXECUTABLE_PLAN_V2_INVOKE_CONTRACT_MISSING", `nodePlans.${nodeId}.sourcePath is required.`, `/nodePlans/${nodeId}/sourcePath`));
257
+ }
258
+ }
259
+ function validateDataPolicy(plan, errors) {
260
+ const policies = plan.policies;
261
+ if (!isRecord(policies) || !isRecord(policies.dataPolicy))
262
+ return;
263
+ const dataPolicy = policies.dataPolicy;
264
+ if (dataPolicy.storeFullRuntimeInputInPlan !== false) {
265
+ errors.push(execError("EXECUTABLE_PLAN_V2_DATA_POLICY_VIOLATION", "dataPolicy.storeFullRuntimeInputInPlan must be false.", "/policies/dataPolicy/storeFullRuntimeInputInPlan"));
266
+ }
267
+ if (isRecord(plan.runtimeInput) && Object.keys(plan.runtimeInput).length > 0) {
268
+ errors.push(execError("EXECUTABLE_PLAN_V2_DATA_POLICY_VIOLATION", "Plan must not contain full runtime input.", "/runtimeInput"));
269
+ }
270
+ if (isRecord(plan.input) && Object.keys(plan.input).length > 0) {
271
+ errors.push(execError("EXECUTABLE_PLAN_V2_DATA_POLICY_VIOLATION", "Plan must not contain full runtime input at top-level input.", "/input"));
272
+ }
273
+ }
274
+ export function validateExecutablePlanV2(plan) {
275
+ const errors = [];
276
+ if (!isRecord(plan)) {
277
+ return {
278
+ valid: false,
279
+ errors: [
280
+ execError("EXECUTABLE_PLAN_V2_INVALID", "Executable plan must be an object.", "")
281
+ ]
282
+ };
283
+ }
284
+ if (plan.format !== EXECUTABLE_PLAN_FORMAT_V2) {
285
+ errors.push(execError("EXECUTABLE_PLAN_V2_FORMAT_INVALID", `format must be ${EXECUTABLE_PLAN_FORMAT_V2}.`, "/format"));
286
+ }
287
+ if (typeof plan.planId !== "string" || plan.planId.length === 0) {
288
+ errors.push(execError("EXECUTABLE_PLAN_ID_MISSING", "planId is required.", "/planId"));
289
+ }
290
+ if (typeof plan.createdAt !== "string") {
291
+ errors.push(execError("EXECUTABLE_PLAN_CREATED_AT_MISSING", "createdAt is required.", "/createdAt"));
292
+ }
293
+ const source = plan.source;
294
+ if (!isRecord(source)) {
295
+ errors.push(execError("EXECUTABLE_PLAN_SOURCE_MISSING", "source is required.", "/source"));
296
+ }
297
+ else {
298
+ if (typeof source.graphId !== "string") {
299
+ errors.push(execError("EXECUTABLE_PLAN_SOURCE_GRAPH_ID_MISSING", "source.graphId is required.", "/source/graphId"));
300
+ }
301
+ if (typeof source.graphHash !== "string") {
302
+ errors.push(execError("EXECUTABLE_PLAN_SOURCE_GRAPH_HASH_MISSING", "source.graphHash is required.", "/source/graphHash"));
303
+ }
304
+ }
305
+ const runtimeBinding = plan.runtimeBinding;
306
+ if (!isRecord(runtimeBinding) || typeof runtimeBinding.jobId !== "string") {
307
+ errors.push(execError("EXECUTABLE_PLAN_RUNTIME_BINDING_MISSING", "runtimeBinding.jobId is required.", "/runtimeBinding/jobId"));
308
+ }
309
+ else {
310
+ if (typeof runtimeBinding.sourceGraphHash !== "string") {
311
+ errors.push(execError("EXECUTABLE_PLAN_RUNTIME_BINDING_MISSING", "runtimeBinding.sourceGraphHash is required.", "/runtimeBinding/sourceGraphHash"));
312
+ }
313
+ if (typeof runtimeBinding.profileRegistryHash !== "string") {
314
+ errors.push(execError("EXECUTABLE_PLAN_RUNTIME_BINDING_MISSING", "runtimeBinding.profileRegistryHash is required.", "/runtimeBinding/profileRegistryHash"));
315
+ }
316
+ }
317
+ if (!isRecord(plan.runtimeExpectations)) {
318
+ errors.push(execError("EXECUTABLE_PLAN_V2_RUNTIME_EXPECTATIONS_MISSING", "runtimeExpectations is required.", "/runtimeExpectations"));
319
+ }
320
+ else if (!Array.isArray(plan.runtimeExpectations.requiredFields)) {
321
+ errors.push(execError("EXECUTABLE_PLAN_V2_RUNTIME_EXPECTATIONS_MISSING", "runtimeExpectations.requiredFields is required.", "/runtimeExpectations/requiredFields"));
322
+ }
323
+ const profileRegistry = plan.profileRegistry;
324
+ if (!isRecord(profileRegistry)) {
325
+ errors.push(execError("EXECUTABLE_PLAN_V2_PROFILE_REGISTRY_INVALID", "profileRegistry is required.", "/profileRegistry"));
326
+ }
327
+ else {
328
+ if (typeof profileRegistry.version !== "string") {
329
+ errors.push(execError("EXECUTABLE_PLAN_V2_PROFILE_REGISTRY_INVALID", "profileRegistry.version is required.", "/profileRegistry/version"));
330
+ }
331
+ if (typeof profileRegistry.registryHash !== "string") {
332
+ errors.push(execError("EXECUTABLE_PLAN_V2_PROFILE_REGISTRY_INVALID", "profileRegistry.registryHash is required.", "/profileRegistry/registryHash"));
333
+ }
334
+ }
335
+ const normalizedGraph = plan.normalizedGraph;
336
+ let embeddedGraph;
337
+ if (!isRecord(normalizedGraph)) {
338
+ errors.push(execError("EXECUTABLE_PLAN_V2_NORMALIZED_GRAPH_MISSING", "normalizedGraph is required.", "/normalizedGraph"));
339
+ }
340
+ else if (normalizedGraph.mode !== "embedded" &&
341
+ normalizedGraph.mode !== "ref") {
342
+ errors.push(execError("EXECUTABLE_PLAN_V2_NORMALIZED_GRAPH_MISSING", 'normalizedGraph.mode must be "embedded" or "ref".', "/normalizedGraph/mode"));
343
+ }
344
+ else if (typeof normalizedGraph.graphHash !== "string") {
345
+ errors.push(execError("EXECUTABLE_PLAN_V2_NORMALIZED_GRAPH_MISSING", "normalizedGraph.graphHash is required.", "/normalizedGraph/graphHash"));
346
+ }
347
+ else if (normalizedGraph.mode === "embedded") {
348
+ if (!isRecord(normalizedGraph.graph)) {
349
+ errors.push(execError("EXECUTABLE_PLAN_V2_NORMALIZED_GRAPH_MISSING", "normalizedGraph.graph is required for embedded mode.", "/normalizedGraph/graph"));
350
+ }
351
+ else {
352
+ const graphValidation = validateNormalizedExecutableGraph(normalizedGraph.graph);
353
+ if (!graphValidation.valid) {
354
+ errors.push(...graphValidation.errors);
355
+ }
356
+ else {
357
+ embeddedGraph =
358
+ normalizedGraph.graph;
359
+ const profile = getExecutableProfile(embeddedGraph);
360
+ const modelConfig = profile?.modelConfig;
361
+ if (modelConfig?.default !== undefined) {
362
+ errors.push(execError("EXECUTABLE_PLAN_GRAPH_NOT_NORMALIZED", "Embedded graph must not use modelConfig.default shorthand.", `${EXECUTABLE_PROFILE_PATH}/modelConfig/default`));
363
+ }
364
+ }
365
+ }
366
+ }
367
+ else if (normalizedGraph.mode === "ref") {
368
+ if (!isRecord(normalizedGraph.ref) || typeof normalizedGraph.ref.uri !== "string") {
369
+ errors.push(execError("EXECUTABLE_PLAN_V2_NORMALIZED_GRAPH_MISSING", "normalizedGraph.ref.uri is required for ref mode.", "/normalizedGraph/ref/uri"));
370
+ }
371
+ }
372
+ if (!isRecord(plan.schedulingPolicy)) {
373
+ errors.push(execError("EXECUTABLE_PLAN_V2_SCHEDULING_POLICY_MISSING", "schedulingPolicy is required.", "/schedulingPolicy"));
374
+ }
375
+ else {
376
+ const sp = plan.schedulingPolicy;
377
+ if (sp.mode !== "forward" &&
378
+ sp.mode !== "backward" &&
379
+ sp.mode !== "hybrid") {
380
+ errors.push(execError("EXECUTABLE_PLAN_V2_SCHEDULING_POLICY_MISSING", "schedulingPolicy.mode must be forward, backward, or hybrid.", "/schedulingPolicy/mode"));
381
+ }
382
+ if (sp.wavePlanning !== "staticSchedule" &&
383
+ sp.wavePlanning !== "executorEvaluatesDeferredGates") {
384
+ errors.push(execError("EXECUTABLE_PLAN_V2_SCHEDULING_POLICY_MISSING", "schedulingPolicy.wavePlanning is required.", "/schedulingPolicy/wavePlanning"));
385
+ }
386
+ }
387
+ const caseSelection = plan.caseSelection;
388
+ if (!isRecord(caseSelection) || !isRecord(caseSelection.graphModelCase)) {
389
+ errors.push(execError("EXECUTABLE_PLAN_CASE_SELECTION_MISSING", "caseSelection.graphModelCase is required.", "/caseSelection/graphModelCase"));
390
+ }
391
+ else if (typeof caseSelection.graphModelCase.caseId !== "string") {
392
+ errors.push(execError("EXECUTABLE_PLAN_GRAPH_CASE_MISSING", "caseSelection.graphModelCase.caseId is required.", "/caseSelection/graphModelCase/caseId"));
393
+ }
394
+ if (!isRecord(plan.policies)) {
395
+ errors.push(execError("EXECUTABLE_PLAN_V2_POLICIES_MISSING", "policies is required.", "/policies"));
396
+ }
397
+ else {
398
+ const fallbackPolicy = isRecord(plan.policies.fallbackPolicy)
399
+ ? plan.policies.fallbackPolicy
400
+ : undefined;
401
+ if (!fallbackPolicy ||
402
+ (fallbackPolicy.owner !== "executor" &&
403
+ fallbackPolicy.owner !== "invocationLayer")) {
404
+ errors.push(execError("EXECUTABLE_PLAN_V2_FALLBACK_OWNER_MISSING", "policies.fallbackPolicy.owner must be executor or invocationLayer.", "/policies/fallbackPolicy/owner"));
405
+ }
406
+ }
407
+ const directModelPolicy = isRecord(plan.policies) &&
408
+ (plan.policies.directModelPolicy === "forbidden" ||
409
+ plan.policies.directModelPolicy === "breakGlassOnly" ||
410
+ plan.policies.directModelPolicy === "allowed")
411
+ ? plan.policies.directModelPolicy
412
+ : "forbidden";
413
+ const contracts = plan.contracts;
414
+ if (!isRecord(contracts) || !isRecord(contracts.response)) {
415
+ errors.push(execError("EXECUTABLE_PLAN_V2_CONTRACTS_MISSING", "contracts.response is required.", "/contracts/response"));
416
+ }
417
+ else if (!Array.isArray(contracts.response.graphOutputIds)) {
418
+ errors.push(execError("EXECUTABLE_PLAN_V2_CONTRACTS_MISSING", "contracts.response.graphOutputIds is required.", "/contracts/response/graphOutputIds"));
419
+ }
420
+ const compatibility = plan.compatibility;
421
+ if (isRecord(compatibility) && Array.isArray(compatibility.unsupportedAuthoringFields)) {
422
+ for (const [index, field] of compatibility.unsupportedAuthoringFields.entries()) {
423
+ if (isRecord(field) && field.severity === "error") {
424
+ errors.push(execError("EXECUTABLE_PLAN_V2_COMPATIBILITY_ERROR", `Unsupported authoring field at ${field.path}: ${field.reason ?? "not supported"}.`, `/compatibility/unsupportedAuthoringFields/${index}`));
425
+ }
426
+ }
427
+ }
428
+ if (embeddedGraph) {
429
+ validateTopology(plan, embeddedGraph, errors);
430
+ validateDeferredGates(plan, embeddedGraph, errors);
431
+ const nodePlans = plan.nodePlans;
432
+ const finalizerPlans = plan.finalizerPlans;
433
+ if (!isRecord(nodePlans)) {
434
+ errors.push(execError("EXECUTABLE_PLAN_NODE_PLANS_MISSING", "nodePlans is required.", "/nodePlans"));
435
+ }
436
+ else {
437
+ const taskNodeIds = embeddedGraph.graph.nodes
438
+ .filter(isExecutableTaskNode)
439
+ .map((n) => n.id);
440
+ for (const nodeId of taskNodeIds) {
441
+ const nodePlan = nodePlans[nodeId];
442
+ if (!isRecord(nodePlan)) {
443
+ errors.push(execError("EXECUTABLE_PLAN_NODE_PLAN_MISSING", `nodePlans must contain plan for task node ${nodeId}.`, `/nodePlans/${nodeId}`));
444
+ continue;
445
+ }
446
+ const executionClass = String(nodePlan.executionClass ?? "aiTask");
447
+ validateNodeInvokeContract(nodeId, nodePlan, embeddedGraph, errors);
448
+ if (executionClass === "localTask") {
449
+ if (nodePlan.modelSlots !== null) {
450
+ errors.push(execError("EXECUTABLE_PLAN_V2_LOCAL_TASK_REQUIRES_NULL_SLOTS", `Local task node ${nodeId} must have modelSlots = null.`, `/nodePlans/${nodeId}/modelSlots`));
451
+ }
452
+ }
453
+ else if (executionClass === "aiTask") {
454
+ const modelSlots = nodePlan.modelSlots;
455
+ if (!isRecord(modelSlots)) {
456
+ errors.push(execError("EXECUTABLE_PLAN_NODE_SLOTS_MISSING", `nodePlans.${nodeId}.modelSlots must be resolved for AI tasks.`, `/nodePlans/${nodeId}/modelSlots`));
457
+ }
458
+ else {
459
+ for (const slot of ["preActionModel", "skillModel", "postActionModel"]) {
460
+ const slotPlan = modelSlots[slot];
461
+ if (!isRecord(slotPlan) || !isRecord(slotPlan.selection)) {
462
+ errors.push(execError("EXECUTABLE_PLAN_NODE_SLOT_MISSING", `nodePlans.${nodeId}.modelSlots.${slot} must be resolved.`, `/nodePlans/${nodeId}/modelSlots/${slot}`));
463
+ }
464
+ else {
465
+ validateDirectModelSelection(slotPlan.selection, `/nodePlans/${nodeId}/modelSlots/${slot}/selection`, directModelPolicy, errors);
466
+ }
467
+ }
468
+ }
469
+ }
470
+ const executionUnits = nodePlan.executionUnits;
471
+ if (!Array.isArray(executionUnits)) {
472
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNITS_MISSING", `nodePlans.${nodeId}.executionUnits is required.`, `/nodePlans/${nodeId}/executionUnits`));
473
+ }
474
+ else {
475
+ validateExecutionUnitsV2(nodeId, executionUnits, executionClass, directModelPolicy, errors);
476
+ }
477
+ }
478
+ }
479
+ if (!isRecord(finalizerPlans)) {
480
+ errors.push(execError("EXECUTABLE_PLAN_V2_FINALIZER_PLAN_MISSING", "finalizerPlans is required.", "/finalizerPlans"));
481
+ }
482
+ else {
483
+ const finalizerNodeIds = embeddedGraph.graph.nodes
484
+ .filter(isExecutableFinalizerNode)
485
+ .map((n) => n.id);
486
+ for (const nodeId of finalizerNodeIds) {
487
+ const finalizerPlan = finalizerPlans[nodeId];
488
+ if (!isRecord(finalizerPlan)) {
489
+ errors.push(execError("EXECUTABLE_PLAN_V2_FINALIZER_PLAN_MISSING", `finalizerPlans must contain plan for finalizer node ${nodeId}.`, `/finalizerPlans/${nodeId}`));
490
+ continue;
491
+ }
492
+ const finalizerNode = embeddedGraph.graph.nodes.find((n) => n.id === nodeId);
493
+ const finalizerConfig = finalizerNode
494
+ ? getFinalizerNodeConfig(finalizerNode)
495
+ : undefined;
496
+ const finalizerType = String(finalizerPlan.finalizerType ?? finalizerConfig?.finalizerType ?? "");
497
+ const aiFinalizers = new Set(["synthesize"]);
498
+ if (aiFinalizers.has(finalizerType)) {
499
+ const modelSlots = finalizerPlan.modelSlots;
500
+ if (!isRecord(modelSlots) ||
501
+ !isRecord(modelSlots.finalizerModel) ||
502
+ !isRecord(modelSlots.finalizerModel.selection)) {
503
+ errors.push(execError("EXECUTABLE_PLAN_NODE_SLOT_MISSING", `AI finalizer ${nodeId} requires modelSlots.finalizerModel.`, `/finalizerPlans/${nodeId}/modelSlots/finalizerModel`));
504
+ }
505
+ }
506
+ if (!Array.isArray(finalizerPlan.executionUnits) ||
507
+ finalizerPlan.executionUnits.length === 0) {
508
+ errors.push(execError("EXECUTABLE_PLAN_EXECUTION_UNITS_MISSING", `finalizerPlans.${nodeId}.executionUnits is required.`, `/finalizerPlans/${nodeId}/executionUnits`));
509
+ }
510
+ const contractsRecord = isRecord(contracts) ? contracts : undefined;
511
+ const response = isRecord(contractsRecord?.response)
512
+ ? contractsRecord.response
513
+ : undefined;
514
+ if (response &&
515
+ !response.responseShapePath &&
516
+ !finalizerPlan.responseShapePath) {
517
+ // at least one should link response shape — warn via missing field on finalizer
518
+ if (typeof finalizerPlan.responseShapePath !== "string") {
519
+ errors.push(execError("EXECUTABLE_PLAN_V2_CONTRACTS_MISSING", `finalizerPlans.${nodeId} must link to response shape.`, `/finalizerPlans/${nodeId}/responseShapePath`));
520
+ }
521
+ }
522
+ }
523
+ }
524
+ }
525
+ else if (isRecord(plan.nodePlans) && Object.keys(plan.nodePlans).length > 0) {
526
+ if (!isRecord(normalizedGraph)) {
527
+ errors.push(execError("EXECUTABLE_PLAN_V2_NORMALIZED_GRAPH_MISSING", "Plan cannot rely on nodePlans alone; normalizedGraph embed/ref is required.", "/normalizedGraph"));
528
+ }
529
+ }
530
+ validateDataPolicy(plan, errors);
531
+ containsForbiddenFields(plan, "", errors);
532
+ return { valid: errors.length === 0, errors };
533
+ }
534
+ //# sourceMappingURL=validate-executable-plan-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-executable-plan-v2.js","sourceRoot":"","sources":["../../src/validators/validate-executable-plan-v2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ExecutableGraphValidationResult } from "@x12i/graphenix-executable-contracts";
2
+ export declare function validateExecutablePlan(plan: unknown): ExecutableGraphValidationResult;
3
+ export { validateExecutablePlanV2 } from "./validate-executable-plan-v2.js";
4
+ export { validateExecutablePlanV1 } from "./validate-executable-plan-v1.js";
5
+ //# sourceMappingURL=validate-executable-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-executable-plan.d.ts","sourceRoot":"","sources":["../../src/validators/validate-executable-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAO5F,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,GACZ,+BAA+B,CAQjC;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { EXECUTABLE_PLAN_FORMAT } from "@x12i/graphenix-executable-contracts";
2
+ import { EXECUTABLE_PLAN_FORMAT_V2 } from "@x12i/graphenix-executable-contracts";
3
+ import { isRecord } from "@x12i/graphenix-executable-contracts";
4
+ import { validateExecutablePlanV1 } from "./validate-executable-plan-v1.js";
5
+ import { validateExecutablePlanV2 } from "./validate-executable-plan-v2.js";
6
+ export function validateExecutablePlan(plan) {
7
+ if (isRecord(plan) && plan.format === EXECUTABLE_PLAN_FORMAT_V2) {
8
+ return validateExecutablePlanV2(plan);
9
+ }
10
+ if (isRecord(plan) && plan.format === EXECUTABLE_PLAN_FORMAT) {
11
+ return validateExecutablePlanV1(plan);
12
+ }
13
+ return validateExecutablePlanV1(plan);
14
+ }
15
+ export { validateExecutablePlanV2 } from "./validate-executable-plan-v2.js";
16
+ export { validateExecutablePlanV1 } from "./validate-executable-plan-v1.js";
17
+ //# sourceMappingURL=validate-executable-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-executable-plan.js","sourceRoot":"","sources":["../../src/validators/validate-executable-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,UAAU,sBAAsB,CACpC,IAAa;IAEb,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,yBAAyB,EAAE,CAAC;QAChE,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,EAAE,CAAC;QAC7D,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}