@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.
Files changed (282) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/crypto-utils.d.ts +10 -0
  3. package/dist/crypto-utils.js +62 -0
  4. package/dist/function/function-runner.js +4 -4
  5. package/dist/function/functions.types.d.ts +26 -1
  6. package/dist/function/functions.types.js +16 -0
  7. package/dist/handle-error.d.ts +1 -1
  8. package/dist/handle-error.js +7 -3
  9. package/dist/index.d.ts +14 -2
  10. package/dist/index.js +1 -1
  11. package/dist/pikku-state.js +3 -1
  12. package/dist/schema.js +1 -1
  13. package/dist/services/in-memory-workflow-service.d.ts +22 -3
  14. package/dist/services/in-memory-workflow-service.js +77 -1
  15. package/dist/services/workflow-service.d.ts +8 -2
  16. package/dist/testing/index.d.ts +2 -0
  17. package/dist/testing/index.js +1 -0
  18. package/dist/testing/service-tests.d.ts +31 -0
  19. package/dist/testing/service-tests.js +598 -0
  20. package/dist/types/core.types.d.ts +9 -1
  21. package/dist/types/state.types.d.ts +4 -2
  22. package/dist/utils/hash.d.ts +2 -0
  23. package/dist/utils/hash.js +23 -0
  24. package/dist/wirings/ai-agent/agent-dynamic-workflow.d.ts +6 -0
  25. package/dist/wirings/ai-agent/agent-dynamic-workflow.js +348 -0
  26. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +1 -1
  27. package/dist/wirings/ai-agent/ai-agent-memory.js +6 -5
  28. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -7
  29. package/dist/wirings/ai-agent/ai-agent-prepare.js +127 -47
  30. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +4 -0
  31. package/dist/wirings/ai-agent/ai-agent-runner.js +381 -27
  32. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +7 -2
  33. package/dist/wirings/ai-agent/ai-agent-stream.js +109 -46
  34. package/dist/wirings/ai-agent/ai-agent.types.d.ts +22 -1
  35. package/dist/wirings/ai-agent/index.d.ts +1 -2
  36. package/dist/wirings/ai-agent/index.js +1 -2
  37. package/dist/wirings/channel/channel-handler.js +5 -1
  38. package/dist/wirings/channel/channel.types.d.ts +1 -7
  39. package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -1
  40. package/dist/wirings/channel/local/local-channel-handler.js +5 -3
  41. package/dist/wirings/channel/local/local-channel-runner.js +14 -4
  42. package/dist/wirings/channel/serverless/serverless-channel-runner.js +4 -1
  43. package/dist/wirings/cli/cli-runner.js +10 -2
  44. package/dist/wirings/cli/cli.types.d.ts +1 -0
  45. package/dist/wirings/http/http-routes.js +0 -1
  46. package/dist/wirings/http/http-runner.d.ts +1 -1
  47. package/dist/wirings/http/http-runner.js +25 -3
  48. package/dist/wirings/http/http.types.d.ts +3 -11
  49. package/dist/wirings/http/index.d.ts +2 -1
  50. package/dist/wirings/http/index.js +1 -0
  51. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
  52. package/dist/wirings/http/pikku-fetch-http-request.js +3 -0
  53. package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
  54. package/dist/wirings/http/pikku-fetch-http-response.js +4 -4
  55. package/dist/wirings/http/web-request.d.ts +12 -0
  56. package/dist/wirings/http/web-request.js +85 -0
  57. package/dist/wirings/mcp/mcp-endpoint-registry.js +1 -1
  58. package/dist/wirings/mcp/mcp-runner.js +13 -1
  59. package/dist/wirings/rpc/rpc-runner.d.ts +30 -6
  60. package/dist/wirings/rpc/rpc-runner.js +36 -14
  61. package/dist/wirings/rpc/rpc-types.d.ts +6 -1
  62. package/dist/wirings/rpc/wire-addon.d.ts +1 -0
  63. package/dist/wirings/rpc/wire-addon.js +1 -1
  64. package/dist/wirings/scheduler/scheduler-runner.js +1 -0
  65. package/dist/wirings/workflow/graph/graph-validation.d.ts +3 -0
  66. package/dist/wirings/workflow/graph/graph-validation.js +175 -0
  67. package/dist/wirings/workflow/graph/index.d.ts +1 -0
  68. package/dist/wirings/workflow/graph/index.js +1 -0
  69. package/dist/wirings/workflow/index.d.ts +1 -1
  70. package/dist/wirings/workflow/pikku-workflow-service.d.ts +8 -2
  71. package/dist/wirings/workflow/pikku-workflow-service.js +1 -2
  72. package/dist/wirings/workflow/workflow.types.d.ts +10 -1
  73. package/lcov.info +18891 -0
  74. package/package.json +4 -2
  75. package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +0 -5
  76. package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +0 -168
  77. package/src/crypto-utils.test.ts +0 -116
  78. package/src/crypto-utils.ts +0 -99
  79. package/src/errors/error-handler.ts +0 -62
  80. package/src/errors/error.test.ts +0 -195
  81. package/src/errors/errors.ts +0 -374
  82. package/src/errors/index.ts +0 -2
  83. package/src/factory-functions.test.ts +0 -109
  84. package/src/function/function-runner.test.ts +0 -536
  85. package/src/function/function-runner.ts +0 -365
  86. package/src/function/functions.types.ts +0 -267
  87. package/src/function/index.ts +0 -5
  88. package/src/handle-error.test.ts +0 -361
  89. package/src/handle-error.ts +0 -65
  90. package/src/index.ts +0 -104
  91. package/src/internal.ts +0 -6
  92. package/src/middleware/auth-apikey.test.ts +0 -363
  93. package/src/middleware/auth-apikey.ts +0 -47
  94. package/src/middleware/auth-bearer.test.ts +0 -450
  95. package/src/middleware/auth-bearer.ts +0 -72
  96. package/src/middleware/auth-cookie.test.ts +0 -528
  97. package/src/middleware/auth-cookie.ts +0 -80
  98. package/src/middleware/cors.test.ts +0 -424
  99. package/src/middleware/cors.ts +0 -104
  100. package/src/middleware/index.ts +0 -5
  101. package/src/middleware/remote-auth.test.ts +0 -488
  102. package/src/middleware/remote-auth.ts +0 -68
  103. package/src/middleware/timeout.ts +0 -15
  104. package/src/middleware-runner.test.ts +0 -418
  105. package/src/middleware-runner.ts +0 -234
  106. package/src/permissions.test.ts +0 -434
  107. package/src/permissions.ts +0 -319
  108. package/src/pikku-request.ts +0 -23
  109. package/src/pikku-response.ts +0 -5
  110. package/src/pikku-state.test.ts +0 -224
  111. package/src/pikku-state.ts +0 -214
  112. package/src/run-tests-script.test.ts +0 -49
  113. package/src/schema.test.ts +0 -249
  114. package/src/schema.ts +0 -151
  115. package/src/services/ai-agent-runner-service.ts +0 -41
  116. package/src/services/ai-run-state-service.ts +0 -20
  117. package/src/services/ai-storage-service.ts +0 -39
  118. package/src/services/content-service.ts +0 -76
  119. package/src/services/deployment-service.ts +0 -22
  120. package/src/services/gateway-service.ts +0 -20
  121. package/src/services/gopass-secrets.ts +0 -98
  122. package/src/services/in-memory-ai-run-state-service.ts +0 -73
  123. package/src/services/in-memory-trigger-service.ts +0 -64
  124. package/src/services/in-memory-workflow-service.test.ts +0 -351
  125. package/src/services/in-memory-workflow-service.ts +0 -395
  126. package/src/services/index.ts +0 -56
  127. package/src/services/jwt-service.ts +0 -30
  128. package/src/services/local-content.ts +0 -120
  129. package/src/services/local-gateway-service.ts +0 -62
  130. package/src/services/local-secrets.test.ts +0 -80
  131. package/src/services/local-secrets.ts +0 -94
  132. package/src/services/local-variables.test.ts +0 -61
  133. package/src/services/local-variables.ts +0 -39
  134. package/src/services/logger-console.test.ts +0 -118
  135. package/src/services/logger-console.ts +0 -98
  136. package/src/services/logger.ts +0 -57
  137. package/src/services/scheduler-service.ts +0 -86
  138. package/src/services/schema-service.ts +0 -33
  139. package/src/services/scoped-secret-service.test.ts +0 -74
  140. package/src/services/scoped-secret-service.ts +0 -41
  141. package/src/services/secret-service.ts +0 -38
  142. package/src/services/trigger-service.ts +0 -17
  143. package/src/services/typed-secret-service.test.ts +0 -93
  144. package/src/services/typed-secret-service.ts +0 -70
  145. package/src/services/typed-variables-service.test.ts +0 -73
  146. package/src/services/typed-variables-service.ts +0 -81
  147. package/src/services/user-session-service.test.ts +0 -113
  148. package/src/services/user-session-service.ts +0 -86
  149. package/src/services/variables-service.ts +0 -11
  150. package/src/services/workflow-service.ts +0 -84
  151. package/src/time-utils.test.ts +0 -56
  152. package/src/time-utils.ts +0 -107
  153. package/src/types/core.types.ts +0 -470
  154. package/src/types/state.types.ts +0 -186
  155. package/src/utils.test.ts +0 -350
  156. package/src/utils.ts +0 -129
  157. package/src/version.test.ts +0 -80
  158. package/src/version.ts +0 -25
  159. package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +0 -363
  160. package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +0 -238
  161. package/src/wirings/ai-agent/ai-agent-helpers.test.ts +0 -152
  162. package/src/wirings/ai-agent/ai-agent-helpers.ts +0 -76
  163. package/src/wirings/ai-agent/ai-agent-memory.ts +0 -309
  164. package/src/wirings/ai-agent/ai-agent-model-config.test.ts +0 -115
  165. package/src/wirings/ai-agent/ai-agent-model-config.ts +0 -43
  166. package/src/wirings/ai-agent/ai-agent-prepare.ts +0 -522
  167. package/src/wirings/ai-agent/ai-agent-registry.test.ts +0 -37
  168. package/src/wirings/ai-agent/ai-agent-registry.ts +0 -82
  169. package/src/wirings/ai-agent/ai-agent-runner.test.ts +0 -317
  170. package/src/wirings/ai-agent/ai-agent-runner.ts +0 -251
  171. package/src/wirings/ai-agent/ai-agent-stream.test.ts +0 -652
  172. package/src/wirings/ai-agent/ai-agent-stream.ts +0 -1060
  173. package/src/wirings/ai-agent/ai-agent.types.ts +0 -360
  174. package/src/wirings/ai-agent/index.ts +0 -41
  175. package/src/wirings/channel/channel-common.ts +0 -90
  176. package/src/wirings/channel/channel-handler.ts +0 -241
  177. package/src/wirings/channel/channel-middleware-runner.ts +0 -120
  178. package/src/wirings/channel/channel-runner.ts +0 -166
  179. package/src/wirings/channel/channel-store.ts +0 -29
  180. package/src/wirings/channel/channel.types.ts +0 -178
  181. package/src/wirings/channel/define-channel-routes.ts +0 -25
  182. package/src/wirings/channel/eventhub-service.ts +0 -34
  183. package/src/wirings/channel/eventhub-store.ts +0 -13
  184. package/src/wirings/channel/index.ts +0 -24
  185. package/src/wirings/channel/local/index.ts +0 -3
  186. package/src/wirings/channel/local/local-channel-handler.ts +0 -79
  187. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -215
  188. package/src/wirings/channel/local/local-channel-runner.ts +0 -200
  189. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -95
  190. package/src/wirings/channel/local/local-eventhub-service.ts +0 -101
  191. package/src/wirings/channel/log-channels.ts +0 -20
  192. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -54
  193. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -45
  194. package/src/wirings/channel/serverless/index.ts +0 -5
  195. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -286
  196. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -136
  197. package/src/wirings/cli/channel/index.ts +0 -1
  198. package/src/wirings/cli/cli-runner.test.ts +0 -403
  199. package/src/wirings/cli/cli-runner.ts +0 -519
  200. package/src/wirings/cli/cli.types.ts +0 -357
  201. package/src/wirings/cli/command-parser.test.ts +0 -445
  202. package/src/wirings/cli/command-parser.ts +0 -504
  203. package/src/wirings/cli/define-cli-commands.ts +0 -24
  204. package/src/wirings/cli/index.ts +0 -19
  205. package/src/wirings/gateway/gateway-runner.test.ts +0 -474
  206. package/src/wirings/gateway/gateway-runner.ts +0 -411
  207. package/src/wirings/gateway/gateway.types.ts +0 -149
  208. package/src/wirings/gateway/index.ts +0 -13
  209. package/src/wirings/http/http-routes.test.ts +0 -322
  210. package/src/wirings/http/http-routes.ts +0 -198
  211. package/src/wirings/http/http-runner.test.ts +0 -144
  212. package/src/wirings/http/http-runner.ts +0 -563
  213. package/src/wirings/http/http.types.ts +0 -378
  214. package/src/wirings/http/index.ts +0 -25
  215. package/src/wirings/http/log-http-routes.ts +0 -22
  216. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -237
  217. package/src/wirings/http/pikku-fetch-http-request.ts +0 -166
  218. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -82
  219. package/src/wirings/http/pikku-fetch-http-response.ts +0 -147
  220. package/src/wirings/http/routers/http-router.ts +0 -13
  221. package/src/wirings/http/routers/path-to-regex.test.ts +0 -319
  222. package/src/wirings/http/routers/path-to-regex.ts +0 -126
  223. package/src/wirings/mcp/index.ts +0 -27
  224. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -389
  225. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  226. package/src/wirings/mcp/mcp-runner.ts +0 -305
  227. package/src/wirings/mcp/mcp.types.ts +0 -216
  228. package/src/wirings/node/index.ts +0 -2
  229. package/src/wirings/node/node.types.ts +0 -23
  230. package/src/wirings/oauth2/index.ts +0 -3
  231. package/src/wirings/oauth2/oauth2-client.test.ts +0 -929
  232. package/src/wirings/oauth2/oauth2-client.ts +0 -335
  233. package/src/wirings/oauth2/oauth2.types.ts +0 -69
  234. package/src/wirings/oauth2/wire-oauth2-credential.ts +0 -23
  235. package/src/wirings/queue/index.ts +0 -31
  236. package/src/wirings/queue/queue-runner.test.ts +0 -710
  237. package/src/wirings/queue/queue-runner.ts +0 -192
  238. package/src/wirings/queue/queue.types.ts +0 -189
  239. package/src/wirings/queue/register-queue-helper.ts +0 -60
  240. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  241. package/src/wirings/queue/validate-worker-config.ts +0 -116
  242. package/src/wirings/rpc/index.ts +0 -4
  243. package/src/wirings/rpc/rpc-runner.ts +0 -439
  244. package/src/wirings/rpc/rpc-types.ts +0 -51
  245. package/src/wirings/rpc/wire-addon.ts +0 -20
  246. package/src/wirings/scheduler/index.ts +0 -11
  247. package/src/wirings/scheduler/log-schedulers.ts +0 -20
  248. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -660
  249. package/src/wirings/scheduler/scheduler-runner.ts +0 -132
  250. package/src/wirings/scheduler/scheduler.types.ts +0 -53
  251. package/src/wirings/secret/index.ts +0 -9
  252. package/src/wirings/secret/secret.types.ts +0 -32
  253. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -140
  254. package/src/wirings/secret/validate-secret-definitions.ts +0 -82
  255. package/src/wirings/trigger/index.ts +0 -10
  256. package/src/wirings/trigger/pikku-trigger-service.ts +0 -112
  257. package/src/wirings/trigger/trigger-runner.test.ts +0 -79
  258. package/src/wirings/trigger/trigger-runner.ts +0 -135
  259. package/src/wirings/trigger/trigger.types.ts +0 -178
  260. package/src/wirings/variable/index.ts +0 -8
  261. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -91
  262. package/src/wirings/variable/validate-variable-definitions.ts +0 -69
  263. package/src/wirings/variable/variable.types.ts +0 -22
  264. package/src/wirings/workflow/dsl/index.ts +0 -31
  265. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -320
  266. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -28
  267. package/src/wirings/workflow/graph/graph-node.ts +0 -222
  268. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -487
  269. package/src/wirings/workflow/graph/graph-runner.ts +0 -816
  270. package/src/wirings/workflow/graph/index.ts +0 -14
  271. package/src/wirings/workflow/graph/template.test.ts +0 -49
  272. package/src/wirings/workflow/graph/template.ts +0 -42
  273. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -29
  274. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -104
  275. package/src/wirings/workflow/index.ts +0 -81
  276. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -200
  277. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1165
  278. package/src/wirings/workflow/workflow-helpers.test.ts +0 -129
  279. package/src/wirings/workflow/workflow-helpers.ts +0 -79
  280. package/src/wirings/workflow/workflow.types.ts +0 -266
  281. package/tsconfig.json +0 -14
  282. 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
- // Check if this is a graph workflow (source === 'graph')
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 */