@pikku/core 0.12.2 → 0.12.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/crypto-utils.d.ts +10 -0
- package/dist/crypto-utils.js +62 -0
- package/dist/function/function-runner.js +4 -4
- package/dist/function/functions.types.d.ts +26 -1
- package/dist/function/functions.types.js +16 -0
- package/dist/handle-error.d.ts +1 -1
- package/dist/handle-error.js +7 -3
- package/dist/index.d.ts +14 -2
- package/dist/index.js +1 -1
- package/dist/pikku-state.js +3 -1
- package/dist/schema.js +1 -1
- package/dist/services/in-memory-workflow-service.d.ts +22 -3
- package/dist/services/in-memory-workflow-service.js +77 -1
- package/dist/services/workflow-service.d.ts +8 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +1 -0
- package/dist/testing/service-tests.d.ts +31 -0
- package/dist/testing/service-tests.js +598 -0
- package/dist/types/core.types.d.ts +9 -1
- package/dist/types/state.types.d.ts +4 -2
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.js +23 -0
- package/dist/wirings/ai-agent/agent-dynamic-workflow.d.ts +6 -0
- package/dist/wirings/ai-agent/agent-dynamic-workflow.js +348 -0
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +1 -1
- package/dist/wirings/ai-agent/ai-agent-memory.js +6 -5
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -7
- package/dist/wirings/ai-agent/ai-agent-prepare.js +127 -47
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +4 -0
- package/dist/wirings/ai-agent/ai-agent-runner.js +381 -27
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +7 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +109 -46
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +22 -1
- package/dist/wirings/ai-agent/index.d.ts +1 -2
- package/dist/wirings/ai-agent/index.js +1 -2
- package/dist/wirings/channel/channel-handler.js +5 -1
- package/dist/wirings/channel/channel.types.d.ts +1 -7
- package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-handler.js +5 -3
- package/dist/wirings/channel/local/local-channel-runner.js +14 -4
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +4 -1
- package/dist/wirings/cli/cli-runner.js +10 -2
- package/dist/wirings/cli/cli.types.d.ts +1 -0
- package/dist/wirings/http/http-routes.js +0 -1
- package/dist/wirings/http/http-runner.d.ts +1 -1
- package/dist/wirings/http/http-runner.js +25 -3
- package/dist/wirings/http/http.types.d.ts +3 -11
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +3 -0
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +4 -4
- package/dist/wirings/http/web-request.d.ts +12 -0
- package/dist/wirings/http/web-request.js +85 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.js +1 -1
- package/dist/wirings/mcp/mcp-runner.js +13 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +30 -6
- package/dist/wirings/rpc/rpc-runner.js +36 -14
- package/dist/wirings/rpc/rpc-types.d.ts +6 -1
- package/dist/wirings/rpc/wire-addon.d.ts +1 -0
- package/dist/wirings/rpc/wire-addon.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.js +1 -0
- package/dist/wirings/workflow/graph/graph-validation.d.ts +3 -0
- package/dist/wirings/workflow/graph/graph-validation.js +175 -0
- package/dist/wirings/workflow/graph/index.d.ts +1 -0
- package/dist/wirings/workflow/graph/index.js +1 -0
- package/dist/wirings/workflow/index.d.ts +1 -1
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +8 -2
- package/dist/wirings/workflow/pikku-workflow-service.js +1 -2
- package/dist/wirings/workflow/workflow.types.d.ts +10 -1
- package/lcov.info +18891 -0
- package/package.json +4 -2
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +0 -168
- package/src/crypto-utils.test.ts +0 -116
- package/src/crypto-utils.ts +0 -99
- package/src/errors/error-handler.ts +0 -62
- package/src/errors/error.test.ts +0 -195
- package/src/errors/errors.ts +0 -374
- package/src/errors/index.ts +0 -2
- package/src/factory-functions.test.ts +0 -109
- package/src/function/function-runner.test.ts +0 -536
- package/src/function/function-runner.ts +0 -365
- package/src/function/functions.types.ts +0 -267
- package/src/function/index.ts +0 -5
- package/src/handle-error.test.ts +0 -361
- package/src/handle-error.ts +0 -65
- package/src/index.ts +0 -104
- package/src/internal.ts +0 -6
- package/src/middleware/auth-apikey.test.ts +0 -363
- package/src/middleware/auth-apikey.ts +0 -47
- package/src/middleware/auth-bearer.test.ts +0 -450
- package/src/middleware/auth-bearer.ts +0 -72
- package/src/middleware/auth-cookie.test.ts +0 -528
- package/src/middleware/auth-cookie.ts +0 -80
- package/src/middleware/cors.test.ts +0 -424
- package/src/middleware/cors.ts +0 -104
- package/src/middleware/index.ts +0 -5
- package/src/middleware/remote-auth.test.ts +0 -488
- package/src/middleware/remote-auth.ts +0 -68
- package/src/middleware/timeout.ts +0 -15
- package/src/middleware-runner.test.ts +0 -418
- package/src/middleware-runner.ts +0 -234
- package/src/permissions.test.ts +0 -434
- package/src/permissions.ts +0 -319
- package/src/pikku-request.ts +0 -23
- package/src/pikku-response.ts +0 -5
- package/src/pikku-state.test.ts +0 -224
- package/src/pikku-state.ts +0 -214
- package/src/run-tests-script.test.ts +0 -49
- package/src/schema.test.ts +0 -249
- package/src/schema.ts +0 -151
- package/src/services/ai-agent-runner-service.ts +0 -41
- package/src/services/ai-run-state-service.ts +0 -20
- package/src/services/ai-storage-service.ts +0 -39
- package/src/services/content-service.ts +0 -76
- package/src/services/deployment-service.ts +0 -22
- package/src/services/gateway-service.ts +0 -20
- package/src/services/gopass-secrets.ts +0 -98
- package/src/services/in-memory-ai-run-state-service.ts +0 -73
- package/src/services/in-memory-trigger-service.ts +0 -64
- package/src/services/in-memory-workflow-service.test.ts +0 -351
- package/src/services/in-memory-workflow-service.ts +0 -395
- package/src/services/index.ts +0 -56
- package/src/services/jwt-service.ts +0 -30
- package/src/services/local-content.ts +0 -120
- package/src/services/local-gateway-service.ts +0 -62
- package/src/services/local-secrets.test.ts +0 -80
- package/src/services/local-secrets.ts +0 -94
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -39
- package/src/services/logger-console.test.ts +0 -118
- package/src/services/logger-console.ts +0 -98
- package/src/services/logger.ts +0 -57
- package/src/services/scheduler-service.ts +0 -86
- package/src/services/schema-service.ts +0 -33
- package/src/services/scoped-secret-service.test.ts +0 -74
- package/src/services/scoped-secret-service.ts +0 -41
- package/src/services/secret-service.ts +0 -38
- package/src/services/trigger-service.ts +0 -17
- package/src/services/typed-secret-service.test.ts +0 -93
- package/src/services/typed-secret-service.ts +0 -70
- package/src/services/typed-variables-service.test.ts +0 -73
- package/src/services/typed-variables-service.ts +0 -81
- package/src/services/user-session-service.test.ts +0 -113
- package/src/services/user-session-service.ts +0 -86
- package/src/services/variables-service.ts +0 -11
- package/src/services/workflow-service.ts +0 -84
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -107
- package/src/types/core.types.ts +0 -470
- package/src/types/state.types.ts +0 -186
- package/src/utils.test.ts +0 -350
- package/src/utils.ts +0 -129
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +0 -363
- package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +0 -238
- package/src/wirings/ai-agent/ai-agent-helpers.test.ts +0 -152
- package/src/wirings/ai-agent/ai-agent-helpers.ts +0 -76
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -309
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +0 -115
- package/src/wirings/ai-agent/ai-agent-model-config.ts +0 -43
- package/src/wirings/ai-agent/ai-agent-prepare.ts +0 -522
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +0 -37
- package/src/wirings/ai-agent/ai-agent-registry.ts +0 -82
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +0 -317
- package/src/wirings/ai-agent/ai-agent-runner.ts +0 -251
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +0 -652
- package/src/wirings/ai-agent/ai-agent-stream.ts +0 -1060
- package/src/wirings/ai-agent/ai-agent.types.ts +0 -360
- package/src/wirings/ai-agent/index.ts +0 -41
- package/src/wirings/channel/channel-common.ts +0 -90
- package/src/wirings/channel/channel-handler.ts +0 -241
- package/src/wirings/channel/channel-middleware-runner.ts +0 -120
- package/src/wirings/channel/channel-runner.ts +0 -166
- package/src/wirings/channel/channel-store.ts +0 -29
- package/src/wirings/channel/channel.types.ts +0 -178
- package/src/wirings/channel/define-channel-routes.ts +0 -25
- package/src/wirings/channel/eventhub-service.ts +0 -34
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -24
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -79
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -215
- package/src/wirings/channel/local/local-channel-runner.ts +0 -200
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -95
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -101
- package/src/wirings/channel/log-channels.ts +0 -20
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -54
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -45
- package/src/wirings/channel/serverless/index.ts +0 -5
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -286
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -136
- package/src/wirings/cli/channel/index.ts +0 -1
- package/src/wirings/cli/cli-runner.test.ts +0 -403
- package/src/wirings/cli/cli-runner.ts +0 -519
- package/src/wirings/cli/cli.types.ts +0 -357
- package/src/wirings/cli/command-parser.test.ts +0 -445
- package/src/wirings/cli/command-parser.ts +0 -504
- package/src/wirings/cli/define-cli-commands.ts +0 -24
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/gateway/gateway-runner.test.ts +0 -474
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -149
- package/src/wirings/gateway/index.ts +0 -13
- package/src/wirings/http/http-routes.test.ts +0 -322
- package/src/wirings/http/http-routes.ts +0 -198
- package/src/wirings/http/http-runner.test.ts +0 -144
- package/src/wirings/http/http-runner.ts +0 -563
- package/src/wirings/http/http.types.ts +0 -378
- package/src/wirings/http/index.ts +0 -25
- package/src/wirings/http/log-http-routes.ts +0 -22
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -237
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -166
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -82
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -147
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -319
- package/src/wirings/http/routers/path-to-regex.ts +0 -126
- package/src/wirings/mcp/index.ts +0 -27
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -389
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.ts +0 -305
- package/src/wirings/mcp/mcp.types.ts +0 -216
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -3
- package/src/wirings/oauth2/oauth2-client.test.ts +0 -929
- package/src/wirings/oauth2/oauth2-client.ts +0 -335
- package/src/wirings/oauth2/oauth2.types.ts +0 -69
- package/src/wirings/oauth2/wire-oauth2-credential.ts +0 -23
- package/src/wirings/queue/index.ts +0 -31
- package/src/wirings/queue/queue-runner.test.ts +0 -710
- package/src/wirings/queue/queue-runner.ts +0 -192
- package/src/wirings/queue/queue.types.ts +0 -189
- package/src/wirings/queue/register-queue-helper.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -116
- package/src/wirings/rpc/index.ts +0 -4
- package/src/wirings/rpc/rpc-runner.ts +0 -439
- package/src/wirings/rpc/rpc-types.ts +0 -51
- package/src/wirings/rpc/wire-addon.ts +0 -20
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -20
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -660
- package/src/wirings/scheduler/scheduler-runner.ts +0 -132
- package/src/wirings/scheduler/scheduler.types.ts +0 -53
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -32
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -140
- package/src/wirings/secret/validate-secret-definitions.ts +0 -82
- package/src/wirings/trigger/index.ts +0 -10
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -112
- package/src/wirings/trigger/trigger-runner.test.ts +0 -79
- package/src/wirings/trigger/trigger-runner.ts +0 -135
- package/src/wirings/trigger/trigger.types.ts +0 -178
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -91
- package/src/wirings/variable/validate-variable-definitions.ts +0 -69
- package/src/wirings/variable/variable.types.ts +0 -22
- package/src/wirings/workflow/dsl/index.ts +0 -31
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -320
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -28
- package/src/wirings/workflow/graph/graph-node.ts +0 -222
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -487
- package/src/wirings/workflow/graph/graph-runner.ts +0 -816
- package/src/wirings/workflow/graph/index.ts +0 -14
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -29
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -104
- package/src/wirings/workflow/index.ts +0 -81
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -200
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1165
- package/src/wirings/workflow/workflow-helpers.test.ts +0 -129
- package/src/wirings/workflow/workflow-helpers.ts +0 -79
- package/src/wirings/workflow/workflow.types.ts +0 -266
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { pikkuState } from '../../../pikku-state.js';
|
|
2
|
+
import { resolveNamespace } from '../../rpc/rpc-runner.js';
|
|
3
|
+
function normalizeTargets(value) {
|
|
4
|
+
if (!value)
|
|
5
|
+
return [];
|
|
6
|
+
if (typeof value === 'string')
|
|
7
|
+
return [value];
|
|
8
|
+
if (Array.isArray(value))
|
|
9
|
+
return value.filter((v) => typeof v === 'string');
|
|
10
|
+
if (typeof value === 'object') {
|
|
11
|
+
const targets = [];
|
|
12
|
+
for (const v of Object.values(value)) {
|
|
13
|
+
targets.push(...normalizeTargets(v));
|
|
14
|
+
}
|
|
15
|
+
return targets;
|
|
16
|
+
}
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
function collectRefs(value, refs) {
|
|
20
|
+
if (typeof value === 'object' &&
|
|
21
|
+
value !== null &&
|
|
22
|
+
'$ref' in value &&
|
|
23
|
+
typeof value.$ref === 'string') {
|
|
24
|
+
refs.add(value.$ref);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
for (const item of value)
|
|
29
|
+
collectRefs(item, refs);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (typeof value === 'object' && value !== null) {
|
|
33
|
+
for (const v of Object.values(value))
|
|
34
|
+
collectRefs(v, refs);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function resolveToolMeta(toolName) {
|
|
38
|
+
const resolved = toolName.includes(':') ? resolveNamespace(toolName) : null;
|
|
39
|
+
if (resolved) {
|
|
40
|
+
const fnMeta = pikkuState(resolved.package, 'function', 'meta')[resolved.function];
|
|
41
|
+
const schemas = pikkuState(resolved.package, 'misc', 'schemas');
|
|
42
|
+
return fnMeta ? { fnMeta, schemas } : null;
|
|
43
|
+
}
|
|
44
|
+
const rpcMeta = pikkuState(null, 'rpc', 'meta');
|
|
45
|
+
const pikkuFuncId = rpcMeta[toolName];
|
|
46
|
+
if (!pikkuFuncId)
|
|
47
|
+
return null;
|
|
48
|
+
const fnMeta = pikkuState(null, 'function', 'meta')[pikkuFuncId];
|
|
49
|
+
const schemas = pikkuState(null, 'misc', 'schemas');
|
|
50
|
+
return fnMeta ? { fnMeta, schemas } : null;
|
|
51
|
+
}
|
|
52
|
+
export function computeEntryNodeIds(nodes) {
|
|
53
|
+
const referenced = new Set();
|
|
54
|
+
for (const node of Object.values(nodes)) {
|
|
55
|
+
if (node.next) {
|
|
56
|
+
for (const target of normalizeTargets(node.next)) {
|
|
57
|
+
referenced.add(target);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (node.onError) {
|
|
61
|
+
for (const target of normalizeTargets(node.onError)) {
|
|
62
|
+
referenced.add(target);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return Object.keys(nodes).filter((id) => !referenced.has(id));
|
|
67
|
+
}
|
|
68
|
+
export function validateWorkflowWiring(nodes, toolNames) {
|
|
69
|
+
const errors = [];
|
|
70
|
+
const nodeIds = new Set(Object.keys(nodes));
|
|
71
|
+
const toolSet = new Set(toolNames);
|
|
72
|
+
for (const [nodeId, node] of Object.entries(nodes)) {
|
|
73
|
+
if (!node.rpcName) {
|
|
74
|
+
errors.push(`Node '${nodeId}' is missing 'rpcName'`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!toolSet.has(node.rpcName)) {
|
|
78
|
+
errors.push(`Node '${nodeId}' references unknown tool '${node.rpcName}'. Available tools: ${toolNames.join(', ')}`);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const nextTargets = normalizeTargets(node.next);
|
|
82
|
+
for (const target of nextTargets) {
|
|
83
|
+
if (!nodeIds.has(target)) {
|
|
84
|
+
errors.push(`Node '${nodeId}' routes to unknown node '${target}' in 'next'`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const errorTargets = normalizeTargets(node.onError);
|
|
88
|
+
for (const target of errorTargets) {
|
|
89
|
+
if (!nodeIds.has(target)) {
|
|
90
|
+
errors.push(`Node '${nodeId}' routes to unknown node '${target}' in 'onError'`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (!node.input)
|
|
94
|
+
continue;
|
|
95
|
+
const refs = new Set();
|
|
96
|
+
collectRefs(node.input, refs);
|
|
97
|
+
for (const ref of refs) {
|
|
98
|
+
if (ref === 'trigger' || ref === '$item') {
|
|
99
|
+
const targetMeta = resolveToolMeta(node.rpcName);
|
|
100
|
+
if (targetMeta?.fnMeta?.inputSchemaName) {
|
|
101
|
+
const targetSchema = targetMeta.schemas.get(targetMeta.fnMeta.inputSchemaName);
|
|
102
|
+
if (targetSchema?.properties) {
|
|
103
|
+
for (const [field, fieldValue] of Object.entries(node.input)) {
|
|
104
|
+
if (typeof fieldValue === 'object' &&
|
|
105
|
+
fieldValue !== null &&
|
|
106
|
+
fieldValue.$ref === ref &&
|
|
107
|
+
!fieldValue.path) {
|
|
108
|
+
const targetType = targetSchema.properties[field]?.type;
|
|
109
|
+
if (targetType && targetType !== 'object') {
|
|
110
|
+
errors.push(`Node '${nodeId}' input field '${field}' expects type '${targetType}', but references the whole ${ref} object without a path. Use { $ref: "${ref}", path: "${field}" } to extract the field.`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (!nodeIds.has(ref)) {
|
|
119
|
+
errors.push(`Node '${nodeId}' references unknown node '${ref}' in input`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const sourceNode = nodes[ref];
|
|
123
|
+
if (!sourceNode?.rpcName)
|
|
124
|
+
continue;
|
|
125
|
+
const sourceMeta = resolveToolMeta(sourceNode.rpcName);
|
|
126
|
+
if (!sourceMeta?.fnMeta?.outputSchemaName)
|
|
127
|
+
continue;
|
|
128
|
+
const sourceSchema = sourceMeta.schemas.get(sourceMeta.fnMeta.outputSchemaName);
|
|
129
|
+
if (!sourceSchema?.properties)
|
|
130
|
+
continue;
|
|
131
|
+
for (const [field, fieldValue] of Object.entries(node.input)) {
|
|
132
|
+
if (typeof fieldValue === 'object' &&
|
|
133
|
+
fieldValue !== null &&
|
|
134
|
+
fieldValue.$ref === ref &&
|
|
135
|
+
fieldValue.path) {
|
|
136
|
+
const pathRoot = fieldValue.path.split('.')[0];
|
|
137
|
+
if (sourceSchema.properties &&
|
|
138
|
+
!(pathRoot in sourceSchema.properties)) {
|
|
139
|
+
errors.push(`Node '${nodeId}' input field '${field}' references path '${fieldValue.path}' but node '${ref}' (${sourceNode.rpcName}) output has no property '${pathRoot}'`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const targetMeta = resolveToolMeta(node.rpcName);
|
|
143
|
+
if (!targetMeta?.fnMeta?.inputSchemaName)
|
|
144
|
+
continue;
|
|
145
|
+
const targetSchema = targetMeta.schemas.get(targetMeta.fnMeta.inputSchemaName);
|
|
146
|
+
if (!targetSchema?.properties?.[field])
|
|
147
|
+
continue;
|
|
148
|
+
const sourceType = sourceSchema.properties[pathRoot]?.type;
|
|
149
|
+
const targetType = targetSchema.properties[field].type;
|
|
150
|
+
if (sourceType && targetType && sourceType !== targetType) {
|
|
151
|
+
errors.push(`Node '${nodeId}' input field '${field}' expects type '${targetType}', but node '${ref}' output field '${pathRoot}' is type '${sourceType}'`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return errors;
|
|
158
|
+
}
|
|
159
|
+
export function generateMermaidDiagram(workflowName, nodes, entryNodeIds) {
|
|
160
|
+
const lines = ['graph TD'];
|
|
161
|
+
for (const [nodeId, node] of Object.entries(nodes)) {
|
|
162
|
+
const label = node.rpcName || nodeId;
|
|
163
|
+
const isEntry = entryNodeIds.includes(nodeId);
|
|
164
|
+
lines.push(` ${nodeId}${isEntry ? '([' : '['}${label}${isEntry ? '])' : ']'}`);
|
|
165
|
+
const nextTargets = normalizeTargets(node.next);
|
|
166
|
+
for (const target of nextTargets) {
|
|
167
|
+
lines.push(` ${nodeId} --> ${target}`);
|
|
168
|
+
}
|
|
169
|
+
const errorTargets = normalizeTargets(node.onError);
|
|
170
|
+
for (const target of errorTargets) {
|
|
171
|
+
lines.push(` ${nodeId} -.->|error| ${target}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return lines.join('\n');
|
|
175
|
+
}
|
|
@@ -2,3 +2,4 @@ export { continueGraph, executeGraphStep, onGraphNodeComplete, runFromMeta, runW
|
|
|
2
2
|
export { template } from './template.js';
|
|
3
3
|
export type { TemplateString } from './template.js';
|
|
4
4
|
export { pikkuWorkflowGraph, type PikkuWorkflowGraphConfig, type PikkuWorkflowGraphResult, } from './wire-workflow-graph.js';
|
|
5
|
+
export { validateWorkflowWiring, computeEntryNodeIds, generateMermaidDiagram, } from './graph-validation.js';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { continueGraph, executeGraphStep, onGraphNodeComplete, runFromMeta, runWorkflowGraph, } from './graph-runner.js';
|
|
2
2
|
export { template } from './template.js';
|
|
3
3
|
export { pikkuWorkflowGraph, } from './wire-workflow-graph.js';
|
|
4
|
+
export { validateWorkflowWiring, computeEntryNodeIds, generateMermaidDiagram, } from './graph-validation.js';
|
|
@@ -6,5 +6,5 @@ export { addWorkflow } from './dsl/workflow-runner.js';
|
|
|
6
6
|
export { template, type TemplateString } from './graph/template.js';
|
|
7
7
|
export { pikkuWorkflowGraph, type PikkuWorkflowGraphConfig, type PikkuWorkflowGraphResult, } from './graph/wire-workflow-graph.js';
|
|
8
8
|
export { workflow, workflowStart, workflowStatus, graphStart, } from './workflow-helpers.js';
|
|
9
|
-
export type { WorkflowService, WorkflowServiceConfig, WorkflowRunWire, WorkflowStatus, StepStatus, WorkflowRun, StepState, WorkflowRunService, CoreWorkflow, PikkuWorkflow, ContextVariable, WorkflowContext, WorkflowsMeta, WorkflowRuntimeMeta, WorkflowsRuntimeMeta, WorkflowStepInput, WorkflowOrchestratorInput, WorkflowSleeperInput, } from './workflow.types.js';
|
|
9
|
+
export type { WorkflowService, WorkflowServiceConfig, WorkflowRunWire, WorkflowStatus, WorkflowVersionStatus, StepStatus, WorkflowRun, StepState, WorkflowRunService, CoreWorkflow, PikkuWorkflow, ContextVariable, WorkflowContext, WorkflowsMeta, WorkflowRuntimeMeta, WorkflowsRuntimeMeta, WorkflowStepInput, WorkflowOrchestratorInput, WorkflowSleeperInput, } from './workflow.types.js';
|
|
10
10
|
export type { WorkflowStepOptions, WorkflowWireDoRPC, WorkflowWireDoInline, WorkflowWireSleep, WorkflowWireSuspend, InputSource, OutputBinding, RpcStepMeta, SimpleCondition, Condition, BranchCase, BranchStepMeta, ParallelGroupStepMeta, FanoutStepMeta, ReturnStepMeta, InlineStepMeta, SleepStepMeta, CancelStepMeta, SetStepMeta, SwitchCaseMeta, SwitchStepMeta, FilterStepMeta, ArrayPredicateStepMeta, WorkflowStepMeta, WorkflowStepWire, PikkuWorkflowWire, } from './workflow.types.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SerializedError } from '../../types/core.types.js';
|
|
2
|
-
import type { StepState, WorkflowRun, WorkflowRunWire, WorkflowStatus, WorkflowStepOptions } from './workflow.types.js';
|
|
2
|
+
import type { StepState, WorkflowRun, WorkflowRunWire, WorkflowStatus, WorkflowVersionStatus, WorkflowStepOptions } from './workflow.types.js';
|
|
3
3
|
import type { WorkflowService } from '../../services/workflow-service.js';
|
|
4
4
|
import { PikkuError } from '../../errors/error-handler.js';
|
|
5
5
|
/**
|
|
@@ -197,11 +197,17 @@ export declare abstract class PikkuWorkflowService implements WorkflowService {
|
|
|
197
197
|
* @returns The state object with all variables
|
|
198
198
|
*/
|
|
199
199
|
abstract getRunState(runId: string): Promise<Record<string, unknown>>;
|
|
200
|
-
abstract upsertWorkflowVersion(name: string, graphHash: string, graph: any, source: string): Promise<void>;
|
|
200
|
+
abstract upsertWorkflowVersion(name: string, graphHash: string, graph: any, source: string, status?: WorkflowVersionStatus): Promise<void>;
|
|
201
|
+
abstract updateWorkflowVersionStatus(name: string, graphHash: string, status: WorkflowVersionStatus): Promise<void>;
|
|
201
202
|
abstract getWorkflowVersion(name: string, graphHash: string): Promise<{
|
|
202
203
|
graph: any;
|
|
203
204
|
source: string;
|
|
204
205
|
} | null>;
|
|
206
|
+
abstract getAIGeneratedWorkflows(agentName?: string): Promise<Array<{
|
|
207
|
+
workflowName: string;
|
|
208
|
+
graphHash: string;
|
|
209
|
+
graph: any;
|
|
210
|
+
}>>;
|
|
205
211
|
/**
|
|
206
212
|
* Resume a paused workflow by triggering the orchestrator
|
|
207
213
|
* @param runId - Run ID
|
|
@@ -162,8 +162,7 @@ export class PikkuWorkflowService {
|
|
|
162
162
|
if (!workflowMeta) {
|
|
163
163
|
throw new WorkflowNotFoundError(name);
|
|
164
164
|
}
|
|
165
|
-
|
|
166
|
-
if (workflowMeta.source === 'graph') {
|
|
165
|
+
if (workflowMeta.source === 'graph' || workflowMeta.source === 'ai-agent') {
|
|
167
166
|
const shouldInline = options?.inline || !getSingletonServices()?.queueService;
|
|
168
167
|
return runWorkflowGraph(this, name, input, rpcService, shouldInline, options?.startNode, wire);
|
|
169
168
|
}
|
|
@@ -19,6 +19,10 @@ export interface WorkflowServiceConfig {
|
|
|
19
19
|
* Workflow run status
|
|
20
20
|
*/
|
|
21
21
|
export type WorkflowStatus = 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled';
|
|
22
|
+
/**
|
|
23
|
+
* Workflow version status (for AI-generated workflows)
|
|
24
|
+
*/
|
|
25
|
+
export type WorkflowVersionStatus = 'draft' | 'active' | 'declined';
|
|
22
26
|
/**
|
|
23
27
|
* Workflow step status
|
|
24
28
|
*/
|
|
@@ -102,6 +106,11 @@ export interface WorkflowRunService {
|
|
|
102
106
|
graph: any;
|
|
103
107
|
source: string;
|
|
104
108
|
} | null>;
|
|
109
|
+
getAIGeneratedWorkflows(agentName?: string): Promise<Array<{
|
|
110
|
+
workflowName: string;
|
|
111
|
+
graphHash: string;
|
|
112
|
+
graph: any;
|
|
113
|
+
}>>;
|
|
105
114
|
deleteRun(id: string): Promise<boolean>;
|
|
106
115
|
}
|
|
107
116
|
/**
|
|
@@ -167,7 +176,7 @@ export interface WorkflowRuntimeMeta {
|
|
|
167
176
|
/** Pikku function name (for execution) */
|
|
168
177
|
pikkuFuncId: string;
|
|
169
178
|
/** Source type: 'dsl' (serializable), 'complex' (has inline steps), 'graph' */
|
|
170
|
-
source: 'dsl' | 'complex' | 'graph';
|
|
179
|
+
source: 'dsl' | 'complex' | 'graph' | 'ai-agent';
|
|
171
180
|
/** Optional description */
|
|
172
181
|
description?: string;
|
|
173
182
|
/** Tags for organization */
|