@pasko70/pibo 3.2.7 → 3.4.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/dist/agent-runtime/capabilities.js +5 -0
- package/dist/agent-runtime/contract.js +2 -0
- package/dist/agent-runtime/routed-session.js +68 -11
- package/dist/agent-runtimes/codex-native/adapter.js +4 -1
- package/dist/agent-runtimes/codex-native/process.js +1 -1
- package/dist/agent-runtimes/codex-native/protocol-version.js +6 -6
- package/dist/agent-runtimes/codex-native/thread.js +26 -4
- package/dist/agent-runtimes/omp/adapter.js +1 -0
- package/dist/agent-runtimes/omp/process.js +23 -3
- package/dist/agent-runtimes/omp/protocol-version.js +2 -0
- package/dist/agent-runtimes/pi/adapter.js +5 -1
- package/dist/agent-runtimes/pi/model-catalog.js +2 -2
- package/dist/agent-runtimes/pi/routed-session.js +53 -5
- package/dist/agent-runtimes/pi/runtime.js +6 -3
- package/dist/apps/chat/chat-api-routes.js +12 -38
- package/dist/apps/chat/chat-request-normalizers.js +15 -50
- package/dist/apps/chat/data/legacy-project-migration.js +492 -0
- package/dist/apps/chat/data/room-service.js +2 -2
- package/dist/apps/chat/data/workflow-session-model.js +1 -0
- package/dist/apps/chat/data/workflow-session-service.js +352 -0
- package/dist/apps/chat/rooms.js +1 -1
- package/dist/apps/chat/session-metadata.js +30 -0
- package/dist/apps/chat/trace.js +15 -2
- package/dist/apps/chat/types/rooms.js +30 -0
- package/dist/apps/chat/web-app.js +355 -651
- package/dist/apps/chat/workflow-catalog.js +18 -18
- package/dist/apps/chat/{project-workflow-human-actions.js → workflow-human-actions.js} +14 -14
- package/dist/apps/chat/workflow-manual-trigger-runtime.js +5 -1
- package/dist/apps/chat/workflow-persistence.js +20 -28
- package/dist/apps/chat/{project-workflow-sessions.js → workflow-sessions.js} +18 -17
- package/dist/apps/chat-ui/assets/{dist-ENXYFYda.js → dist-AhtdAETR.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CGgUuVB6.js → dist-Bk_L1qbJ.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DG6T1maU.js → dist-Dyp6sLQn.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CFtZTGHa.js → dist-jVaiGXFD.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BikaGikn.js → dist-t25moyJS.js} +1 -1
- package/dist/apps/chat-ui/assets/index-CZjNw-aK.js +228 -0
- package/dist/apps/chat-ui/assets/index-CcEjFITM.css +1 -0
- package/dist/apps/chat-ui/index.html +2 -2
- package/dist/apps/chat-vscode-web/assets/index-Spj6M0tn.js +43 -0
- package/dist/apps/chat-vscode-web/index.html +1 -1
- package/dist/compute/pool/cli.js +1 -1
- package/dist/compute/pool/seeds.js +2 -3
- package/dist/config/config.js +1 -1
- package/dist/core/session-router.js +19 -10
- package/dist/debug/agents.js +9 -3
- package/dist/plugins/builtin.js +2 -0
- package/dist/plugins/registry.js +1 -0
- package/dist/previews/cli.js +154 -79
- package/dist/previews/compute-worker.js +37 -0
- package/dist/previews/config.js +2 -1
- package/dist/previews/migrations/session-ownership.js +7 -0
- package/dist/previews/proxy.js +4 -2
- package/dist/previews/public-setup.js +108 -0
- package/dist/previews/store.js +20 -13
- package/dist/previews/web-app.js +12 -2
- package/dist/providers/openai-gpt56.js +41 -3
- package/dist/sessions/workflow-session-kind.js +0 -3
- package/dist/subagents/context.js +2 -2
- package/dist/subagents/observation-query.js +49 -6
- package/dist/subagents/observation-text-regex.js +124 -0
- package/dist/subagents/tool.js +3 -2
- package/dist/tools/hashline.js +64 -0
- package/npm-shrinkwrap.json +786 -284
- package/package.json +11 -6
- package/packages/workflows/README.md +21 -0
- package/packages/workflows/dist/api/index.d.ts +48 -0
- package/packages/workflows/dist/api/index.d.ts.map +1 -0
- package/packages/workflows/dist/api/index.js +96 -0
- package/packages/workflows/dist/api/index.js.map +1 -0
- package/packages/workflows/dist/definition-hash.d.ts +4 -0
- package/packages/workflows/dist/definition-hash.d.ts.map +1 -0
- package/packages/workflows/dist/definition-hash.js +27 -0
- package/packages/workflows/dist/definition-hash.js.map +1 -0
- package/packages/workflows/dist/fixtures/index.d.ts +39 -0
- package/packages/workflows/dist/fixtures/index.d.ts.map +1 -0
- package/packages/workflows/dist/fixtures/index.js +608 -0
- package/packages/workflows/dist/fixtures/index.js.map +1 -0
- package/packages/workflows/dist/index.d.ts +16 -0
- package/packages/workflows/dist/index.d.ts.map +1 -0
- package/packages/workflows/dist/index.js +10 -0
- package/packages/workflows/dist/index.js.map +1 -0
- package/packages/workflows/dist/inspection/index.d.ts +47 -0
- package/packages/workflows/dist/inspection/index.d.ts.map +1 -0
- package/packages/workflows/dist/inspection/index.js +131 -0
- package/packages/workflows/dist/inspection/index.js.map +1 -0
- package/packages/workflows/dist/registry/index.d.ts +30 -0
- package/packages/workflows/dist/registry/index.d.ts.map +1 -0
- package/packages/workflows/dist/registry/index.js +161 -0
- package/packages/workflows/dist/registry/index.js.map +1 -0
- package/packages/workflows/dist/runtime/adapter-node.d.ts +28 -0
- package/packages/workflows/dist/runtime/adapter-node.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/adapter-node.js +172 -0
- package/packages/workflows/dist/runtime/adapter-node.js.map +1 -0
- package/packages/workflows/dist/runtime/agent-node.d.ts +32 -0
- package/packages/workflows/dist/runtime/agent-node.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/agent-node.js +231 -0
- package/packages/workflows/dist/runtime/agent-node.js.map +1 -0
- package/packages/workflows/dist/runtime/agent-runtime.d.ts +25 -0
- package/packages/workflows/dist/runtime/agent-runtime.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/agent-runtime.js +111 -0
- package/packages/workflows/dist/runtime/agent-runtime.js.map +1 -0
- package/packages/workflows/dist/runtime/code-node.d.ts +31 -0
- package/packages/workflows/dist/runtime/code-node.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/code-node.js +223 -0
- package/packages/workflows/dist/runtime/code-node.js.map +1 -0
- package/packages/workflows/dist/runtime/dispatch-failures.d.ts +36 -0
- package/packages/workflows/dist/runtime/dispatch-failures.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/dispatch-failures.js +80 -0
- package/packages/workflows/dist/runtime/dispatch-failures.js.map +1 -0
- package/packages/workflows/dist/runtime/edge-payloads.d.ts +3 -0
- package/packages/workflows/dist/runtime/edge-payloads.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/edge-payloads.js +11 -0
- package/packages/workflows/dist/runtime/edge-payloads.js.map +1 -0
- package/packages/workflows/dist/runtime/edge-transfer.d.ts +39 -0
- package/packages/workflows/dist/runtime/edge-transfer.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/edge-transfer.js +356 -0
- package/packages/workflows/dist/runtime/edge-transfer.js.map +1 -0
- package/packages/workflows/dist/runtime/human-action.d.ts +43 -0
- package/packages/workflows/dist/runtime/human-action.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/human-action.js +231 -0
- package/packages/workflows/dist/runtime/human-action.js.map +1 -0
- package/packages/workflows/dist/runtime/human-node.d.ts +27 -0
- package/packages/workflows/dist/runtime/human-node.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/human-node.js +126 -0
- package/packages/workflows/dist/runtime/human-node.js.map +1 -0
- package/packages/workflows/dist/runtime/ids.d.ts +2 -0
- package/packages/workflows/dist/runtime/ids.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/ids.js +4 -0
- package/packages/workflows/dist/runtime/ids.js.map +1 -0
- package/packages/workflows/dist/runtime/index.d.ts +23 -0
- package/packages/workflows/dist/runtime/index.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/index.js +12 -0
- package/packages/workflows/dist/runtime/index.js.map +1 -0
- package/packages/workflows/dist/runtime/manual-trigger.d.ts +51 -0
- package/packages/workflows/dist/runtime/manual-trigger.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/manual-trigger.js +403 -0
- package/packages/workflows/dist/runtime/manual-trigger.js.map +1 -0
- package/packages/workflows/dist/runtime/nested-workflow-node.d.ts +48 -0
- package/packages/workflows/dist/runtime/nested-workflow-node.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/nested-workflow-node.js +246 -0
- package/packages/workflows/dist/runtime/nested-workflow-node.js.map +1 -0
- package/packages/workflows/dist/runtime/one-node-agent.d.ts +34 -0
- package/packages/workflows/dist/runtime/one-node-agent.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/one-node-agent.js +334 -0
- package/packages/workflows/dist/runtime/one-node-agent.js.map +1 -0
- package/packages/workflows/dist/runtime/persistence.d.ts +9 -0
- package/packages/workflows/dist/runtime/persistence.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/persistence.js +67 -0
- package/packages/workflows/dist/runtime/persistence.js.map +1 -0
- package/packages/workflows/dist/runtime/pibo-routing.d.ts +126 -0
- package/packages/workflows/dist/runtime/pibo-routing.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/pibo-routing.js +96 -0
- package/packages/workflows/dist/runtime/pibo-routing.js.map +1 -0
- package/packages/workflows/dist/runtime/prompts.d.ts +20 -0
- package/packages/workflows/dist/runtime/prompts.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/prompts.js +235 -0
- package/packages/workflows/dist/runtime/prompts.js.map +1 -0
- package/packages/workflows/dist/runtime/retry.d.ts +35 -0
- package/packages/workflows/dist/runtime/retry.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/retry.js +80 -0
- package/packages/workflows/dist/runtime/retry.js.map +1 -0
- package/packages/workflows/dist/runtime/state.d.ts +14 -0
- package/packages/workflows/dist/runtime/state.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/state.js +139 -0
- package/packages/workflows/dist/runtime/state.js.map +1 -0
- package/packages/workflows/dist/runtime/time.d.ts +6 -0
- package/packages/workflows/dist/runtime/time.d.ts.map +1 -0
- package/packages/workflows/dist/runtime/time.js +42 -0
- package/packages/workflows/dist/runtime/time.js.map +1 -0
- package/packages/workflows/dist/store/catalog-records.d.ts +18 -0
- package/packages/workflows/dist/store/catalog-records.d.ts.map +1 -0
- package/packages/workflows/dist/store/catalog-records.js +59 -0
- package/packages/workflows/dist/store/catalog-records.js.map +1 -0
- package/packages/workflows/dist/store/contracts.d.ts +149 -0
- package/packages/workflows/dist/store/contracts.d.ts.map +1 -0
- package/packages/workflows/dist/store/contracts.js +2 -0
- package/packages/workflows/dist/store/contracts.js.map +1 -0
- package/packages/workflows/dist/store/draft-writes.d.ts +7 -0
- package/packages/workflows/dist/store/draft-writes.d.ts.map +1 -0
- package/packages/workflows/dist/store/draft-writes.js +18 -0
- package/packages/workflows/dist/store/draft-writes.js.map +1 -0
- package/packages/workflows/dist/store/index.d.ts +55 -0
- package/packages/workflows/dist/store/index.d.ts.map +1 -0
- package/packages/workflows/dist/store/index.js +650 -0
- package/packages/workflows/dist/store/index.js.map +1 -0
- package/packages/workflows/dist/store/list-query.d.ts +13 -0
- package/packages/workflows/dist/store/list-query.d.ts.map +1 -0
- package/packages/workflows/dist/store/list-query.js +20 -0
- package/packages/workflows/dist/store/list-query.js.map +1 -0
- package/packages/workflows/dist/store/row-mappers.d.ts +206 -0
- package/packages/workflows/dist/store/row-mappers.d.ts.map +1 -0
- package/packages/workflows/dist/store/row-mappers.js +262 -0
- package/packages/workflows/dist/store/row-mappers.js.map +1 -0
- package/packages/workflows/dist/store/schema.d.ts +13 -0
- package/packages/workflows/dist/store/schema.d.ts.map +1 -0
- package/packages/workflows/dist/store/schema.js +458 -0
- package/packages/workflows/dist/store/schema.js.map +1 -0
- package/packages/workflows/dist/store/write-values.d.ts +18 -0
- package/packages/workflows/dist/store/write-values.d.ts.map +1 -0
- package/packages/workflows/dist/store/write-values.js +227 -0
- package/packages/workflows/dist/store/write-values.js.map +1 -0
- package/packages/workflows/dist/types/index.d.ts +1202 -0
- package/packages/workflows/dist/types/index.d.ts.map +1 -0
- package/packages/workflows/dist/types/index.js +8 -0
- package/packages/workflows/dist/types/index.js.map +1 -0
- package/packages/workflows/dist/validation/diagnostics.d.ts +27 -0
- package/packages/workflows/dist/validation/diagnostics.d.ts.map +1 -0
- package/packages/workflows/dist/validation/diagnostics.js +104 -0
- package/packages/workflows/dist/validation/diagnostics.js.map +1 -0
- package/packages/workflows/dist/validation/graph-cycles.d.ts +4 -0
- package/packages/workflows/dist/validation/graph-cycles.d.ts.map +1 -0
- package/packages/workflows/dist/validation/graph-cycles.js +130 -0
- package/packages/workflows/dist/validation/graph-cycles.js.map +1 -0
- package/packages/workflows/dist/validation/graph-edges.d.ts +5 -0
- package/packages/workflows/dist/validation/graph-edges.d.ts.map +1 -0
- package/packages/workflows/dist/validation/graph-edges.js +48 -0
- package/packages/workflows/dist/validation/graph-edges.js.map +1 -0
- package/packages/workflows/dist/validation/graph-ports.d.ts +5 -0
- package/packages/workflows/dist/validation/graph-ports.d.ts.map +1 -0
- package/packages/workflows/dist/validation/graph-ports.js +55 -0
- package/packages/workflows/dist/validation/graph-ports.js.map +1 -0
- package/packages/workflows/dist/validation/index.d.ts +18 -0
- package/packages/workflows/dist/validation/index.d.ts.map +1 -0
- package/packages/workflows/dist/validation/index.js +175 -0
- package/packages/workflows/dist/validation/index.js.map +1 -0
- package/packages/workflows/dist/validation/json-schema.d.ts +12 -0
- package/packages/workflows/dist/validation/json-schema.d.ts.map +1 -0
- package/packages/workflows/dist/validation/json-schema.js +556 -0
- package/packages/workflows/dist/validation/json-schema.js.map +1 -0
- package/packages/workflows/dist/validation/registry-refs.d.ts +21 -0
- package/packages/workflows/dist/validation/registry-refs.d.ts.map +1 -0
- package/packages/workflows/dist/validation/registry-refs.js +283 -0
- package/packages/workflows/dist/validation/registry-refs.js.map +1 -0
- package/packages/workflows/dist/validation/retry-policy.d.ts +3 -0
- package/packages/workflows/dist/validation/retry-policy.d.ts.map +1 -0
- package/packages/workflows/dist/validation/retry-policy.js +114 -0
- package/packages/workflows/dist/validation/retry-policy.js.map +1 -0
- package/packages/workflows/dist/validation/schema-declarations.d.ts +5 -0
- package/packages/workflows/dist/validation/schema-declarations.d.ts.map +1 -0
- package/packages/workflows/dist/validation/schema-declarations.js +36 -0
- package/packages/workflows/dist/validation/schema-declarations.js.map +1 -0
- package/packages/workflows/dist/validation/state-access.d.ts +4 -0
- package/packages/workflows/dist/validation/state-access.d.ts.map +1 -0
- package/packages/workflows/dist/validation/state-access.js +121 -0
- package/packages/workflows/dist/validation/state-access.js.map +1 -0
- package/packages/workflows/dist/xstate/index.d.ts +73 -0
- package/packages/workflows/dist/xstate/index.d.ts.map +1 -0
- package/packages/workflows/dist/xstate/index.js +728 -0
- package/packages/workflows/dist/xstate/index.js.map +1 -0
- package/packages/workflows/package.json +23 -0
- package/dist/apps/chat/data/project-service.js +0 -1029
- package/dist/apps/chat-ui/assets/index-BwT5grLv.css +0 -1
- package/dist/apps/chat-ui/assets/index-PTJanD3E.js +0 -228
- package/dist/apps/chat-vscode-web/assets/index-D1bpAUkR.js +0 -43
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
export function isValidGuardRef(guard) {
|
|
2
|
+
return isRecord(guard) && typeof guard.handler === "string" && guard.handler.length > 0;
|
|
3
|
+
}
|
|
4
|
+
export function validateWorkflowEdgeGuardRef(edgeId, edge, diagnostics, options) {
|
|
5
|
+
if (!edge.guard) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
validateWorkflowGuardRef(edge.guard, diagnostics, options, {
|
|
9
|
+
edgeId,
|
|
10
|
+
path: `$.edges.${edgeId}.guard.handler`,
|
|
11
|
+
diagnosticLabel: `Workflow edge '${edgeId}'`,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function validateWorkflowGuardRef(guard, diagnostics, options, target) {
|
|
15
|
+
if (!isRecord(guard) || typeof guard.handler !== "string" || guard.handler.length === 0) {
|
|
16
|
+
diagnostics.push({
|
|
17
|
+
code: "WorkflowGraphError.invalidGuardRef",
|
|
18
|
+
message: `${target.diagnosticLabel} must use a registered guard handler ref.`,
|
|
19
|
+
severity: "error",
|
|
20
|
+
edgeId: target.edgeId,
|
|
21
|
+
path: target.path,
|
|
22
|
+
hint: "Use guard: { handler: 'guard.id' } with a non-empty registered guard id.",
|
|
23
|
+
});
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (guard.priority !== undefined && (!Number.isInteger(guard.priority) || guard.priority < 0)) {
|
|
27
|
+
diagnostics.push({
|
|
28
|
+
code: "WorkflowGraphError.invalidGuardPriority",
|
|
29
|
+
message: `${target.diagnosticLabel} guard priority must be a non-negative integer when declared.`,
|
|
30
|
+
severity: "error",
|
|
31
|
+
edgeId: target.edgeId,
|
|
32
|
+
path: target.path.replace(/\.handler$/, ".priority"),
|
|
33
|
+
hint: "Use priority to make multiple guarded outgoing edges deterministic.",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (!options.registry?.guards || options.registry.guards.has(guard.handler)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
diagnostics.push({
|
|
40
|
+
code: "WorkflowGraphError.unknownGuardRef",
|
|
41
|
+
message: `${target.diagnosticLabel} references guard '${guard.handler}', but it is not registered in the Workflow Registry.`,
|
|
42
|
+
severity: "error",
|
|
43
|
+
edgeId: target.edgeId,
|
|
44
|
+
path: target.path,
|
|
45
|
+
registryRef: guard.handler,
|
|
46
|
+
hint: "Register the guard with registerWorkflowGuard/createWorkflowRegistry before validating or executing this workflow, or update the workflow to use a registered guard id.",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function validateWorkflowAgentNodeRuntimeSelection(nodeId, node, diagnostics, options) {
|
|
50
|
+
if (node.kind !== "agent") {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const rawNode = node;
|
|
54
|
+
if (rawNode.runtime !== "pibo") {
|
|
55
|
+
diagnostics.push({
|
|
56
|
+
code: "WorkflowGraphError.invalidAgentRuntimeSelection",
|
|
57
|
+
message: `Workflow agent node '${nodeId}' must select the Pibo Runtime in V1.`,
|
|
58
|
+
severity: "error",
|
|
59
|
+
nodeId,
|
|
60
|
+
path: `$.nodes.${nodeId}.runtime`,
|
|
61
|
+
hint: "Set runtime: 'pibo'. V1 workflow agent nodes cannot select alternate runtimes.",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const profile = rawNode.profile;
|
|
65
|
+
const profileId = isRecord(profile) && profile.kind === "fixed" && typeof profile.id === "string" && profile.id.length > 0
|
|
66
|
+
? profile.id
|
|
67
|
+
: undefined;
|
|
68
|
+
if (!profileId) {
|
|
69
|
+
diagnostics.push({
|
|
70
|
+
code: "WorkflowGraphError.invalidAgentProfileSelection",
|
|
71
|
+
message: `Workflow agent node '${nodeId}' must select a fixed Agent Designer profile in V1.`,
|
|
72
|
+
severity: "error",
|
|
73
|
+
nodeId,
|
|
74
|
+
path: `$.nodes.${nodeId}.profile`,
|
|
75
|
+
hint: "Use fixedProfile('pibo-agent') or { kind: 'fixed', id: 'profile-id' }. Dynamic profile selection is not supported in V1.",
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!options.registry?.profiles) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const registeredProfile = options.registry.profiles.get(profileId);
|
|
83
|
+
if (!registeredProfile) {
|
|
84
|
+
diagnostics.push({
|
|
85
|
+
code: "WorkflowGraphError.unknownAgentProfileRef",
|
|
86
|
+
message: `Workflow agent node '${nodeId}' references Agent Designer profile '${profileId}', but it is not registered in the Workflow Registry.`,
|
|
87
|
+
severity: "error",
|
|
88
|
+
nodeId,
|
|
89
|
+
path: `$.nodes.${nodeId}.profile.id`,
|
|
90
|
+
registryRef: profileId,
|
|
91
|
+
hint: "Register the Agent Designer profile with registerWorkflowAgentProfile/createWorkflowRegistry before validating or executing this workflow, or update the node to use a registered fixed profile id.",
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (isArchivedAgentProfileDefinition(registeredProfile.value)) {
|
|
96
|
+
diagnostics.push({
|
|
97
|
+
code: "WorkflowGraphError.archivedAgentProfileRef",
|
|
98
|
+
message: `Workflow agent node '${nodeId}' references archived Agent Designer profile '${profileId}'.`,
|
|
99
|
+
severity: "error",
|
|
100
|
+
nodeId,
|
|
101
|
+
path: `$.nodes.${nodeId}.profile.id`,
|
|
102
|
+
registryRef: profileId,
|
|
103
|
+
hint: "Restore the Agent Designer profile or update the node to select a non-archived fixed profile id before publishing or running this workflow.",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function isArchivedAgentProfileDefinition(profile) {
|
|
108
|
+
if (profile.status === "archived" || typeof profile.archivedAt === "string") {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
if (!isRecord(profile.metadata)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return profile.metadata.archived === true || typeof profile.metadata.archivedAt === "string";
|
|
115
|
+
}
|
|
116
|
+
export function validateWorkflowAgentNodePromptBuilderRef(nodeId, node, diagnostics, options) {
|
|
117
|
+
if (node.kind !== "agent") {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (node.promptTemplate !== undefined && node.promptBuilder !== undefined) {
|
|
121
|
+
diagnostics.push({
|
|
122
|
+
code: "WorkflowGraphError.ambiguousAgentPromptSource",
|
|
123
|
+
message: `Workflow agent node '${nodeId}' declares both promptTemplate and promptBuilder.`,
|
|
124
|
+
severity: "error",
|
|
125
|
+
nodeId,
|
|
126
|
+
path: `$.nodes.${nodeId}`,
|
|
127
|
+
hint: "Declare exactly one prompt source for variable prompts: use promptTemplate for fixed templates or promptBuilder for a registered TypeScript prompt builder.",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (node.promptBuilder === undefined) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const builderId = getPromptBuilderRefId(node.promptBuilder);
|
|
134
|
+
if (!builderId) {
|
|
135
|
+
diagnostics.push({
|
|
136
|
+
code: "WorkflowGraphError.invalidPromptBuilderRef",
|
|
137
|
+
message: `Workflow agent node '${nodeId}' must use a registered TypeScript prompt builder ref when promptBuilder is declared.`,
|
|
138
|
+
severity: "error",
|
|
139
|
+
nodeId,
|
|
140
|
+
path: `$.nodes.${nodeId}.promptBuilder`,
|
|
141
|
+
hint: "Use promptBuilderRef('prompt.builder.id') or a non-empty registered prompt builder id.",
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (!options.registry?.promptBuilders || options.registry.promptBuilders.has(builderId)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
diagnostics.push({
|
|
149
|
+
code: "WorkflowGraphError.unknownPromptBuilderRef",
|
|
150
|
+
message: `Workflow agent node '${nodeId}' references prompt builder '${builderId}', but it is not registered in the Workflow Registry.`,
|
|
151
|
+
severity: "error",
|
|
152
|
+
nodeId,
|
|
153
|
+
path: getPromptBuilderRefPath(node.promptBuilder, nodeId),
|
|
154
|
+
registryRef: builderId,
|
|
155
|
+
hint: "Register the prompt builder with registerWorkflowPromptBuilder/createWorkflowRegistry before validating or executing this workflow, or update the node to use a registered prompt builder id.",
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function getPromptBuilderRefId(ref) {
|
|
159
|
+
if (typeof ref === "string") {
|
|
160
|
+
return ref.length > 0 ? ref : undefined;
|
|
161
|
+
}
|
|
162
|
+
if (!isRecord(ref)) {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
const id = ref.id;
|
|
166
|
+
return ref.kind === "promptBuilder" && ref.language === "typescript" && typeof id === "string" && id.length > 0
|
|
167
|
+
? id
|
|
168
|
+
: undefined;
|
|
169
|
+
}
|
|
170
|
+
function getPromptBuilderRefPath(ref, nodeId) {
|
|
171
|
+
return typeof ref === "string" ? `$.nodes.${nodeId}.promptBuilder` : `$.nodes.${nodeId}.promptBuilder.id`;
|
|
172
|
+
}
|
|
173
|
+
export function validateWorkflowCodeNodeRef(nodeId, node, diagnostics, options) {
|
|
174
|
+
if (node.kind !== "code") {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!options.registry?.handlers || options.registry.handlers.has(node.handler)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
diagnostics.push({
|
|
181
|
+
code: "WorkflowGraphError.unknownHandlerRef",
|
|
182
|
+
message: `Workflow code node '${nodeId}' references handler '${node.handler}', but it is not registered in the Workflow Registry.`,
|
|
183
|
+
severity: "error",
|
|
184
|
+
nodeId,
|
|
185
|
+
path: `$.nodes.${nodeId}.handler`,
|
|
186
|
+
registryRef: node.handler,
|
|
187
|
+
hint: "Register the handler with registerWorkflowHandler/createWorkflowRegistry before validating or executing this workflow, or update the workflow to use a registered handler id.",
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
export function validateWorkflowAdapterNodeRef(nodeId, node, diagnostics, options) {
|
|
191
|
+
if (node.kind !== "adapter") {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (!isRegisteredAdapterRef(node.handler)) {
|
|
195
|
+
diagnostics.push({
|
|
196
|
+
code: "WorkflowGraphError.invalidAdapterRef",
|
|
197
|
+
message: `Workflow adapter node '${nodeId}' must use a registered TypeScript adapter ref for its handler.`,
|
|
198
|
+
severity: "error",
|
|
199
|
+
nodeId,
|
|
200
|
+
path: `$.nodes.${nodeId}.handler`,
|
|
201
|
+
hint: "Create adapter nodes with handler: adapterRef('adapter.id') so persisted workflow IR stores an explicit adapter ref instead of an inline or raw handler value.",
|
|
202
|
+
});
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
validateRegisteredAdapterExists(node.handler, diagnostics, options, {
|
|
206
|
+
nodeId,
|
|
207
|
+
path: `$.nodes.${nodeId}.handler.id`,
|
|
208
|
+
diagnosticLabel: `Workflow adapter node '${nodeId}'`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
export function validateWorkflowHumanActionRefs(nodeId, node, diagnostics, options) {
|
|
212
|
+
if (node.kind !== "human" || !node.actions) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
node.actions.forEach((action, index) => {
|
|
216
|
+
const path = `$.nodes.${nodeId}.actions.${index}`;
|
|
217
|
+
const actionId = getHumanActionRefId(action);
|
|
218
|
+
if (!actionId) {
|
|
219
|
+
diagnostics.push({
|
|
220
|
+
code: "WorkflowGraphError.invalidHumanActionRef",
|
|
221
|
+
message: `Workflow human node '${nodeId}' declares an invalid human action ref at index ${index}.`,
|
|
222
|
+
severity: "error",
|
|
223
|
+
nodeId,
|
|
224
|
+
path,
|
|
225
|
+
hint: "Human action refs must contain a non-empty registry action id.",
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const registered = options.registry?.humanActions?.get(actionId);
|
|
230
|
+
if (options.registry?.humanActions && !registered) {
|
|
231
|
+
diagnostics.push({
|
|
232
|
+
code: "WorkflowGraphError.unknownHumanActionRef",
|
|
233
|
+
message: `Workflow human node '${nodeId}' references human action '${actionId}', but it is not registered in the Workflow Registry.`,
|
|
234
|
+
severity: "error",
|
|
235
|
+
nodeId,
|
|
236
|
+
path: `${path}.id`,
|
|
237
|
+
registryRef: actionId,
|
|
238
|
+
hint: "Register approve/reject/resume/cancel or custom actions with registerWorkflowHumanAction/createWorkflowRegistry before validating the workflow.",
|
|
239
|
+
});
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (registered && action.kind && registered.kind !== action.kind) {
|
|
243
|
+
diagnostics.push({
|
|
244
|
+
code: "WorkflowGraphError.humanActionKindMismatch",
|
|
245
|
+
message: `Workflow human node '${nodeId}' action '${actionId}' declares kind '${action.kind}', but the registry defines kind '${registered.kind}'.`,
|
|
246
|
+
severity: "error",
|
|
247
|
+
nodeId,
|
|
248
|
+
path: `${path}.kind`,
|
|
249
|
+
registryRef: actionId,
|
|
250
|
+
hint: "Keep wait-token action refs aligned with their registered action definitions.",
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
function getHumanActionRefId(ref) {
|
|
256
|
+
return ref && typeof ref.id === "string" && ref.id.length > 0 ? ref.id : undefined;
|
|
257
|
+
}
|
|
258
|
+
export function validateRegisteredAdapterExists(ref, diagnostics, options, target) {
|
|
259
|
+
if (!options.registry?.adapters || options.registry.adapters.has(ref.id)) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
diagnostics.push({
|
|
263
|
+
code: "WorkflowGraphError.unknownAdapterRef",
|
|
264
|
+
message: `${target.diagnosticLabel} references adapter '${ref.id}', but it is not registered in the Workflow Registry.`,
|
|
265
|
+
severity: "error",
|
|
266
|
+
nodeId: target.nodeId,
|
|
267
|
+
edgeId: target.edgeId,
|
|
268
|
+
path: target.path,
|
|
269
|
+
registryRef: ref.id,
|
|
270
|
+
hint: "Register the adapter with registerWorkflowAdapter/createWorkflowRegistry before validating or executing this workflow, or update the workflow to use a registered adapter id.",
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
export function isRegisteredAdapterRef(value) {
|
|
274
|
+
return (isRecord(value) &&
|
|
275
|
+
value.kind === "adapter" &&
|
|
276
|
+
value.language === "typescript" &&
|
|
277
|
+
typeof value.id === "string" &&
|
|
278
|
+
value.id.length > 0);
|
|
279
|
+
}
|
|
280
|
+
function isRecord(value) {
|
|
281
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=registry-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-refs.js","sourceRoot":"","sources":["../../src/validation/registry-refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { RetryPolicy, WorkflowDiagnostic } from "../types/index.js";
|
|
2
|
+
export declare function validateWorkflowRetryPolicy(policy: RetryPolicy | undefined, path: string, diagnostics: WorkflowDiagnostic[], target?: Pick<WorkflowDiagnostic, "nodeId" | "edgeId">): void;
|
|
3
|
+
//# sourceMappingURL=retry-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy.d.ts","sourceRoot":"","sources":["../../src/validation/retry-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,kBAAkB,EAAE,EACjC,MAAM,GAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,QAAQ,CAAM,GACzD,IAAI,CA8CN"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export function validateWorkflowRetryPolicy(policy, path, diagnostics, target = {}) {
|
|
2
|
+
if (policy === undefined) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
if (!Number.isInteger(policy.maxAttempts) || policy.maxAttempts < 1) {
|
|
6
|
+
diagnostics.push({
|
|
7
|
+
code: "WorkflowRetryError.invalidMaxAttempts",
|
|
8
|
+
message: "Workflow retry policies must declare maxAttempts as a positive integer.",
|
|
9
|
+
severity: "error",
|
|
10
|
+
...target,
|
|
11
|
+
path: `${path}.maxAttempts`,
|
|
12
|
+
hint: "Set maxAttempts to the total number of attempts allowed, for example maxAttempts: 3.",
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (policy.backoff !== undefined) {
|
|
16
|
+
validateWorkflowRetryBackoffPolicy(policy.backoff, `${path}.backoff`, diagnostics, target);
|
|
17
|
+
}
|
|
18
|
+
if (policy.retryOn !== undefined) {
|
|
19
|
+
if (!Array.isArray(policy.retryOn)) {
|
|
20
|
+
diagnostics.push({
|
|
21
|
+
code: "WorkflowRetryError.invalidRetryOn",
|
|
22
|
+
message: "Workflow retry policy retryOn must be an array of non-empty error code strings.",
|
|
23
|
+
severity: "error",
|
|
24
|
+
...target,
|
|
25
|
+
path: `${path}.retryOn`,
|
|
26
|
+
hint: "Use retryOn: ['WorkflowRuntimeError.transient'] or omit retryOn to retry all retryable errors until maxAttempts.",
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
policy.retryOn.forEach((code, index) => {
|
|
31
|
+
if (typeof code !== "string" || code.length === 0) {
|
|
32
|
+
diagnostics.push({
|
|
33
|
+
code: "WorkflowRetryError.invalidRetryOn",
|
|
34
|
+
message: "Workflow retry policy retryOn entries must be non-empty error code strings.",
|
|
35
|
+
severity: "error",
|
|
36
|
+
...target,
|
|
37
|
+
path: `${path}.retryOn.${index}`,
|
|
38
|
+
hint: "Use stable error codes such as 'WorkflowRuntimeError.timeout'.",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function validateWorkflowRetryBackoffPolicy(backoff, path, diagnostics, target) {
|
|
45
|
+
if (!isRecord(backoff)) {
|
|
46
|
+
diagnostics.push({
|
|
47
|
+
code: "WorkflowRetryError.invalidBackoffPolicy",
|
|
48
|
+
message: "Workflow retry backoff policy must be an object.",
|
|
49
|
+
severity: "error",
|
|
50
|
+
...target,
|
|
51
|
+
path,
|
|
52
|
+
hint: "Use { kind: 'none' }, { kind: 'fixed', delayMs }, { kind: 'linear', initialMs, stepMs }, or { kind: 'exponential', initialMs }.",
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
switch (backoff.kind) {
|
|
57
|
+
case "none":
|
|
58
|
+
return;
|
|
59
|
+
case "fixed":
|
|
60
|
+
validateNonNegativeNumber(backoff.delayMs, `${path}.delayMs`, "delayMs", diagnostics, target);
|
|
61
|
+
return;
|
|
62
|
+
case "linear":
|
|
63
|
+
validateNonNegativeNumber(backoff.initialMs, `${path}.initialMs`, "initialMs", diagnostics, target);
|
|
64
|
+
validateNonNegativeNumber(backoff.stepMs, `${path}.stepMs`, "stepMs", diagnostics, target);
|
|
65
|
+
validateOptionalNonNegativeNumber(backoff.maxMs, `${path}.maxMs`, "maxMs", diagnostics, target);
|
|
66
|
+
return;
|
|
67
|
+
case "exponential":
|
|
68
|
+
validateNonNegativeNumber(backoff.initialMs, `${path}.initialMs`, "initialMs", diagnostics, target);
|
|
69
|
+
if (backoff.factor !== undefined && (typeof backoff.factor !== "number" || backoff.factor <= 1)) {
|
|
70
|
+
diagnostics.push({
|
|
71
|
+
code: "WorkflowRetryError.invalidBackoffPolicy",
|
|
72
|
+
message: "Workflow exponential retry backoff factor must be greater than 1 when declared.",
|
|
73
|
+
severity: "error",
|
|
74
|
+
...target,
|
|
75
|
+
path: `${path}.factor`,
|
|
76
|
+
hint: "Omit factor to use the runtime default, or set factor to a number greater than 1.",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
validateOptionalNonNegativeNumber(backoff.maxMs, `${path}.maxMs`, "maxMs", diagnostics, target);
|
|
80
|
+
return;
|
|
81
|
+
default:
|
|
82
|
+
diagnostics.push({
|
|
83
|
+
code: "WorkflowRetryError.invalidBackoffPolicy",
|
|
84
|
+
message: "Workflow retry backoff policy kind is not supported.",
|
|
85
|
+
severity: "error",
|
|
86
|
+
...target,
|
|
87
|
+
path: `${path}.kind`,
|
|
88
|
+
hint: "Use backoff kind 'none', 'fixed', 'linear', or 'exponential'.",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function validateNonNegativeNumber(value, path, field, diagnostics, target) {
|
|
93
|
+
if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
diagnostics.push({
|
|
97
|
+
code: "WorkflowRetryError.invalidBackoffPolicy",
|
|
98
|
+
message: `Workflow retry backoff ${field} must be a non-negative number.`,
|
|
99
|
+
severity: "error",
|
|
100
|
+
...target,
|
|
101
|
+
path,
|
|
102
|
+
hint: "Use millisecond delays greater than or equal to 0.",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function validateOptionalNonNegativeNumber(value, path, field, diagnostics, target) {
|
|
106
|
+
if (value === undefined) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
validateNonNegativeNumber(value, path, field, diagnostics, target);
|
|
110
|
+
}
|
|
111
|
+
function isRecord(value) {
|
|
112
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=retry-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../../src/validation/retry-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { WorkflowDefinition, WorkflowDiagnostic, WorkflowNodeDefinition, WorkflowPort } from "../types/index.js";
|
|
2
|
+
export declare function validateWorkflowPort(port: WorkflowPort, path: string, diagnostics: WorkflowDiagnostic[], target?: Pick<WorkflowDiagnostic, "nodeId" | "edgeId">): void;
|
|
3
|
+
export declare function validateWorkflowNodeSchemaDeclarations(nodeId: string, node: WorkflowNodeDefinition, diagnostics: WorkflowDiagnostic[]): void;
|
|
4
|
+
export declare function validateWorkflowGlobalStateSchemaDeclarations(definition: Pick<WorkflowDefinition, "state">, diagnostics: WorkflowDiagnostic[]): void;
|
|
5
|
+
//# sourceMappingURL=schema-declarations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-declarations.d.ts","sourceRoot":"","sources":["../../src/validation/schema-declarations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,kBAAkB,EAAE,EACjC,MAAM,GAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,QAAQ,CAAM,GACzD,IAAI,CAWN;AAED,wBAAgB,sCAAsC,CACpD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,sBAAsB,EAC5B,WAAW,EAAE,kBAAkB,EAAE,GAChC,IAAI,CAiBN;AAED,wBAAgB,6CAA6C,CAC3D,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAC7C,WAAW,EAAE,kBAAkB,EAAE,GAChC,IAAI,CAaN"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { validateJsonSchemaSubset } from "./json-schema.js";
|
|
2
|
+
export function validateWorkflowPort(port, path, diagnostics, target = {}) {
|
|
3
|
+
if (port.kind !== "json") {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
diagnostics.push(...validateJsonSchemaSubset(port.schema, {
|
|
7
|
+
path: `${path}.schema`,
|
|
8
|
+
requireObjectRoot: true,
|
|
9
|
+
}).map((diagnostic) => ({ ...diagnostic, ...target })));
|
|
10
|
+
}
|
|
11
|
+
export function validateWorkflowNodeSchemaDeclarations(nodeId, node, diagnostics) {
|
|
12
|
+
if (node.input) {
|
|
13
|
+
validateWorkflowPort(node.input, `$.nodes.${nodeId}.input`, diagnostics, { nodeId });
|
|
14
|
+
}
|
|
15
|
+
if (node.output) {
|
|
16
|
+
validateWorkflowPort(node.output, `$.nodes.${nodeId}.output`, diagnostics, { nodeId });
|
|
17
|
+
}
|
|
18
|
+
if (node.kind === "human" && node.schema) {
|
|
19
|
+
diagnostics.push(...validateJsonSchemaSubset(node.schema, {
|
|
20
|
+
path: `$.nodes.${nodeId}.schema`,
|
|
21
|
+
requireObjectRoot: true,
|
|
22
|
+
}).map((diagnostic) => ({ ...diagnostic, nodeId })));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function validateWorkflowGlobalStateSchemaDeclarations(definition, diagnostics) {
|
|
26
|
+
if (!definition.state?.global) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const [path, field] of Object.entries(definition.state.global)) {
|
|
30
|
+
diagnostics.push(...validateJsonSchemaSubset(field.schema, {
|
|
31
|
+
path: `$.state.global.${path}.schema`,
|
|
32
|
+
requireObjectRoot: false,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=schema-declarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-declarations.js","sourceRoot":"","sources":["../../src/validation/schema-declarations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAS5D,MAAM,UAAU,oBAAoB,CAClC,IAAkB,EAClB,IAAY,EACZ,WAAiC,EACjC,SAAwD,EAAE;IAE1D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,WAAW,CAAC,IAAI,CACd,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE;QACvC,IAAI,EAAE,GAAG,IAAI,SAAS;QACtB,iBAAiB,EAAE,IAAI;KACxB,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,MAAc,EACd,IAA4B,EAC5B,WAAiC;IAEjC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,MAAM,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,MAAM,SAAS,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACzC,WAAW,CAAC,IAAI,CACd,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE;YACvC,IAAI,EAAE,WAAW,MAAM,SAAS;YAChC,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CACpD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6CAA6C,CAC3D,UAA6C,EAC7C,WAAiC;IAEjC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,WAAW,CAAC,IAAI,CACd,GAAG,wBAAwB,CAAC,KAAK,CAAC,MAAM,EAAE;YACxC,IAAI,EAAE,kBAAkB,IAAI,SAAS;YACrC,iBAAiB,EAAE,KAAK;SACzB,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkflowDefinition, WorkflowDiagnostic, WorkflowNodeDefinition } from "../types/index.js";
|
|
2
|
+
export declare function validateWorkflowNodeStateAccess(definition: Pick<WorkflowDefinition, "state">, nodeId: string, node: WorkflowNodeDefinition, diagnostics: WorkflowDiagnostic[]): void;
|
|
3
|
+
export declare function validateWorkflowGlobalStateWriteConflicts(definition: Pick<WorkflowDefinition, "nodes" | "state">, diagnostics: WorkflowDiagnostic[]): void;
|
|
4
|
+
//# sourceMappingURL=state-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-access.d.ts","sourceRoot":"","sources":["../../src/validation/state-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAC7C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,sBAAsB,EAC5B,WAAW,EAAE,kBAAkB,EAAE,GAChC,IAAI,CAON;AAED,wBAAgB,yCAAyC,CACvD,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,EACvD,WAAW,EAAE,kBAAkB,EAAE,GAChC,IAAI,CAqCN"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export function validateWorkflowNodeStateAccess(definition, nodeId, node, diagnostics) {
|
|
2
|
+
if (node.state === undefined) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
validateNodeStateAccessList(definition, nodeId, node.state.reads, "reads", diagnostics);
|
|
6
|
+
validateNodeStateAccessList(definition, nodeId, node.state.writes, "writes", diagnostics);
|
|
7
|
+
}
|
|
8
|
+
export function validateWorkflowGlobalStateWriteConflicts(definition, diagnostics) {
|
|
9
|
+
const writersByPath = new Map();
|
|
10
|
+
for (const [nodeId, node] of Object.entries(definition.nodes)) {
|
|
11
|
+
for (const writePath of node.state?.writes ?? []) {
|
|
12
|
+
if (typeof writePath !== "string") {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const scopedPath = parseScopedStatePath(writePath);
|
|
16
|
+
if (scopedPath?.scope !== "global" || !definition.state?.global?.[scopedPath.path]) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const writers = writersByPath.get(scopedPath.path) ?? new Set();
|
|
20
|
+
writers.add(nodeId);
|
|
21
|
+
writersByPath.set(scopedPath.path, writers);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
for (const [statePath, writers] of writersByPath) {
|
|
25
|
+
const field = definition.state?.global?.[statePath];
|
|
26
|
+
if (!field || field.merge || writers.size <= 1) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
diagnostics.push({
|
|
30
|
+
code: "WorkflowStateError.ambiguousConcurrentGlobalStateWrite",
|
|
31
|
+
message: `Workflow global state path '${statePath}' is written by multiple nodes without an explicit merge policy.`,
|
|
32
|
+
severity: "error",
|
|
33
|
+
path: `$.state.global.${statePath}`,
|
|
34
|
+
statePath,
|
|
35
|
+
hint: `Declare state.global['${statePath}'].merge, or ensure only one node writes '${statePath}'. Writers: ${[
|
|
36
|
+
...writers,
|
|
37
|
+
].join(", ")}.`,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function validateNodeStateAccessList(definition, nodeId, values, direction, diagnostics) {
|
|
42
|
+
if (values === undefined) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!Array.isArray(values)) {
|
|
46
|
+
diagnostics.push({
|
|
47
|
+
code: "WorkflowStateError.invalidStateAccessDeclaration",
|
|
48
|
+
message: `Workflow node '${nodeId}' state.${direction} must be an array of scoped state paths.`,
|
|
49
|
+
severity: "error",
|
|
50
|
+
nodeId,
|
|
51
|
+
path: `$.nodes.${nodeId}.state.${direction}`,
|
|
52
|
+
hint: "Declare state access as strings such as 'global.projectGoal', 'local.draft', or 'edge.previous'.",
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
values.forEach((value, index) => {
|
|
57
|
+
const path = `$.nodes.${nodeId}.state.${direction}.${index}`;
|
|
58
|
+
if (typeof value !== "string") {
|
|
59
|
+
diagnostics.push({
|
|
60
|
+
code: "WorkflowStateError.invalidStateAccessDeclaration",
|
|
61
|
+
message: `Workflow node '${nodeId}' state.${direction} entry must be a scoped state path string.`,
|
|
62
|
+
severity: "error",
|
|
63
|
+
nodeId,
|
|
64
|
+
path,
|
|
65
|
+
hint: "Use scoped paths like 'global.projectGoal', 'local.draft', or 'edge.previous'.",
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const scopedPath = parseScopedStatePath(value);
|
|
70
|
+
if (!scopedPath) {
|
|
71
|
+
diagnostics.push({
|
|
72
|
+
code: "WorkflowStateError.invalidStatePath",
|
|
73
|
+
message: `Workflow node '${nodeId}' declares invalid ${direction} state path '${value}'.`,
|
|
74
|
+
severity: "error",
|
|
75
|
+
nodeId,
|
|
76
|
+
path,
|
|
77
|
+
statePath: value,
|
|
78
|
+
hint: "State paths must be scoped as 'global.<path>', 'local.<path>', or 'edge.<path>' with a non-empty path.",
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (direction === "writes" && scopedPath.scope === "edge") {
|
|
83
|
+
diagnostics.push({
|
|
84
|
+
code: "WorkflowStateError.edgeStateWriteNotAllowed",
|
|
85
|
+
message: `Workflow node '${nodeId}' declares a write to immutable edge payload path '${value}'.`,
|
|
86
|
+
severity: "error",
|
|
87
|
+
nodeId,
|
|
88
|
+
path,
|
|
89
|
+
statePath: value,
|
|
90
|
+
hint: "Edge payloads are immutable after transfer; write to 'global.<path>' or current-node 'local.<path>' instead.",
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (scopedPath.scope === "global" && !definition.state?.global?.[scopedPath.path]) {
|
|
94
|
+
diagnostics.push({
|
|
95
|
+
code: "WorkflowStateError.unknownGlobalStatePath",
|
|
96
|
+
message: `Workflow node '${nodeId}' declares ${direction} access to unknown global state path '${scopedPath.path}'.`,
|
|
97
|
+
severity: "error",
|
|
98
|
+
nodeId,
|
|
99
|
+
path,
|
|
100
|
+
statePath: value,
|
|
101
|
+
hint: `Declare state.global['${scopedPath.path}'] with a schema before a node can read or write it.`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function parseScopedStatePath(value) {
|
|
107
|
+
const separatorIndex = value.indexOf(".");
|
|
108
|
+
if (separatorIndex <= 0 || separatorIndex === value.length - 1) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
const scope = value.slice(0, separatorIndex);
|
|
112
|
+
const path = value.slice(separatorIndex + 1);
|
|
113
|
+
if (scope !== "global" && scope !== "local" && scope !== "edge") {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
if (path.split(".").some((segment) => segment.length === 0)) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
return { scope, path };
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=state-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-access.js","sourceRoot":"","sources":["../../src/validation/state-access.ts"],"names":[],"mappings":"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"}
|