@pikku/core 0.11.1 → 0.12.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.
Files changed (363) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/error-handler.js +3 -3
  5. package/dist/errors/errors.d.ts +8 -0
  6. package/dist/errors/errors.js +16 -0
  7. package/dist/errors/index.d.ts +0 -1
  8. package/dist/errors/index.js +0 -1
  9. package/dist/function/function-runner.d.ts +10 -3
  10. package/dist/function/function-runner.js +136 -31
  11. package/dist/function/functions.types.d.ts +35 -12
  12. package/dist/function/functions.types.js +16 -6
  13. package/dist/function/index.d.ts +2 -2
  14. package/dist/function/index.js +1 -2
  15. package/dist/handle-error.js +1 -10
  16. package/dist/index.d.ts +30 -24
  17. package/dist/index.js +19 -27
  18. package/dist/middleware/auth-apikey.d.ts +1 -1
  19. package/dist/middleware/auth-apikey.js +3 -3
  20. package/dist/middleware/auth-bearer.d.ts +1 -1
  21. package/dist/middleware/auth-bearer.js +3 -6
  22. package/dist/middleware/auth-cookie.d.ts +1 -1
  23. package/dist/middleware/auth-cookie.js +6 -8
  24. package/dist/middleware/cors.d.ts +46 -0
  25. package/dist/middleware/cors.js +73 -0
  26. package/dist/middleware/index.d.ts +5 -3
  27. package/dist/middleware/index.js +5 -3
  28. package/dist/middleware/remote-auth.d.ts +5 -0
  29. package/dist/middleware/remote-auth.js +55 -0
  30. package/dist/middleware/timeout.d.ts +1 -1
  31. package/dist/middleware-runner.d.ts +3 -14
  32. package/dist/middleware-runner.js +14 -16
  33. package/dist/permissions.d.ts +3 -86
  34. package/dist/permissions.js +20 -80
  35. package/dist/pikku-state.d.ts +33 -104
  36. package/dist/pikku-state.js +150 -66
  37. package/dist/schema.d.ts +8 -6
  38. package/dist/schema.js +31 -18
  39. package/dist/services/ai-agent-runner-service.d.ts +24 -0
  40. package/dist/services/ai-agent-runner-service.js +1 -0
  41. package/dist/services/ai-run-state-service.d.ts +13 -0
  42. package/dist/services/ai-run-state-service.js +1 -0
  43. package/dist/services/ai-storage-service.d.ts +18 -0
  44. package/dist/services/ai-storage-service.js +1 -0
  45. package/dist/services/deployment-service.d.ts +19 -0
  46. package/dist/services/deployment-service.js +1 -0
  47. package/dist/services/gopass-secrets.d.ts +47 -0
  48. package/dist/services/gopass-secrets.js +94 -0
  49. package/dist/services/in-memory-trigger-service.d.ts +23 -0
  50. package/dist/services/in-memory-trigger-service.js +50 -0
  51. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  52. package/dist/services/in-memory-workflow-service.js +287 -0
  53. package/dist/services/index.d.ts +25 -11
  54. package/dist/services/index.js +10 -13
  55. package/dist/services/local-secrets.d.ts +23 -0
  56. package/dist/services/local-secrets.js +45 -0
  57. package/dist/services/local-variables.d.ts +5 -0
  58. package/dist/services/local-variables.js +18 -0
  59. package/dist/services/scheduler-service.d.ts +21 -1
  60. package/dist/services/scheduler-service.js +14 -0
  61. package/dist/services/schema-service.d.ts +6 -0
  62. package/dist/services/scoped-secret-service.d.ts +16 -0
  63. package/dist/services/scoped-secret-service.js +35 -0
  64. package/dist/services/secret-service.d.ts +25 -4
  65. package/dist/services/trigger-service.d.ts +23 -0
  66. package/dist/services/trigger-service.js +1 -0
  67. package/dist/services/typed-secret-service.d.ts +30 -0
  68. package/dist/services/typed-secret-service.js +40 -0
  69. package/dist/services/typed-variables-service.d.ts +27 -0
  70. package/dist/services/typed-variables-service.js +46 -0
  71. package/dist/services/user-session-service.d.ts +13 -0
  72. package/dist/services/user-session-service.js +17 -0
  73. package/dist/services/variables-service.d.ts +5 -0
  74. package/dist/services/workflow-service.d.ts +43 -0
  75. package/dist/services/workflow-service.js +1 -0
  76. package/dist/types/core.types.d.ts +54 -10
  77. package/dist/types/core.types.js +7 -0
  78. package/dist/types/state.types.d.ts +127 -0
  79. package/dist/types/state.types.js +1 -0
  80. package/dist/utils.d.ts +10 -1
  81. package/dist/utils.js +60 -3
  82. package/dist/version.d.ts +6 -0
  83. package/dist/version.js +19 -0
  84. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  85. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  86. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  87. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  88. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
  89. package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
  90. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  91. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  92. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  93. package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
  94. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
  95. package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
  96. package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
  97. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  98. package/dist/wirings/ai-agent/index.d.ts +5 -0
  99. package/dist/wirings/ai-agent/index.js +4 -0
  100. package/dist/wirings/channel/channel-common.d.ts +7 -4
  101. package/dist/wirings/channel/channel-common.js +15 -8
  102. package/dist/wirings/channel/channel-handler.js +13 -4
  103. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  104. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  105. package/dist/wirings/channel/channel-runner.js +12 -12
  106. package/dist/wirings/channel/channel.types.d.ts +5 -1
  107. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  108. package/dist/wirings/channel/define-channel-routes.js +23 -0
  109. package/dist/wirings/channel/index.d.ts +10 -8
  110. package/dist/wirings/channel/index.js +7 -8
  111. package/dist/wirings/channel/local/index.d.ts +3 -3
  112. package/dist/wirings/channel/local/index.js +3 -3
  113. package/dist/wirings/channel/local/local-channel-runner.js +18 -6
  114. package/dist/wirings/channel/log-channels.js +1 -1
  115. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  116. package/dist/wirings/channel/serverless/index.js +1 -1
  117. package/dist/wirings/channel/serverless/serverless-channel-runner.js +17 -6
  118. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
  119. package/dist/wirings/cli/channel/index.d.ts +1 -1
  120. package/dist/wirings/cli/channel/index.js +1 -1
  121. package/dist/wirings/cli/cli-runner.d.ts +1 -1
  122. package/dist/wirings/cli/cli-runner.js +22 -18
  123. package/dist/wirings/cli/cli.types.d.ts +7 -6
  124. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  125. package/dist/wirings/cli/define-cli-commands.js +20 -0
  126. package/dist/wirings/cli/index.d.ts +2 -3
  127. package/dist/wirings/cli/index.js +1 -3
  128. package/dist/wirings/http/http-routes.d.ts +69 -0
  129. package/dist/wirings/http/http-routes.js +139 -0
  130. package/dist/wirings/http/http-runner.d.ts +2 -2
  131. package/dist/wirings/http/http-runner.js +62 -27
  132. package/dist/wirings/http/http.types.d.ts +77 -24
  133. package/dist/wirings/http/index.d.ts +5 -4
  134. package/dist/wirings/http/index.js +4 -3
  135. package/dist/wirings/http/log-http-routes.js +1 -1
  136. package/dist/wirings/http/routers/path-to-regex.js +2 -2
  137. package/dist/wirings/mcp/index.d.ts +4 -3
  138. package/dist/wirings/mcp/index.js +3 -3
  139. package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
  140. package/dist/wirings/mcp/mcp-runner.js +42 -56
  141. package/dist/wirings/mcp/mcp.types.d.ts +3 -3
  142. package/dist/wirings/node/index.d.ts +2 -0
  143. package/dist/wirings/node/index.js +1 -0
  144. package/dist/wirings/node/node.types.d.ts +20 -0
  145. package/dist/wirings/node/node.types.js +1 -0
  146. package/dist/wirings/oauth2/index.d.ts +3 -0
  147. package/dist/wirings/oauth2/index.js +2 -0
  148. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  149. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  150. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  151. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  152. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  153. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  154. package/dist/wirings/queue/index.d.ts +2 -2
  155. package/dist/wirings/queue/index.js +1 -1
  156. package/dist/wirings/queue/queue-runner.d.ts +7 -0
  157. package/dist/wirings/queue/queue-runner.js +23 -12
  158. package/dist/wirings/queue/queue.types.d.ts +8 -2
  159. package/dist/wirings/rpc/index.d.ts +1 -1
  160. package/dist/wirings/rpc/index.js +1 -1
  161. package/dist/wirings/rpc/rpc-runner.d.ts +40 -13
  162. package/dist/wirings/rpc/rpc-runner.js +191 -25
  163. package/dist/wirings/rpc/rpc-types.d.ts +15 -4
  164. package/dist/wirings/scheduler/index.d.ts +3 -3
  165. package/dist/wirings/scheduler/index.js +2 -3
  166. package/dist/wirings/scheduler/log-schedulers.js +1 -1
  167. package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
  168. package/dist/wirings/scheduler/scheduler-runner.js +28 -10
  169. package/dist/wirings/secret/index.d.ts +3 -0
  170. package/dist/wirings/secret/index.js +2 -0
  171. package/dist/wirings/secret/secret.types.d.ts +27 -0
  172. package/dist/wirings/secret/secret.types.js +1 -0
  173. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  174. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  175. package/dist/wirings/trigger/index.d.ts +3 -0
  176. package/dist/wirings/trigger/index.js +2 -0
  177. package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
  178. package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
  179. package/dist/wirings/trigger/trigger-runner.d.ts +42 -0
  180. package/dist/wirings/trigger/trigger-runner.js +85 -0
  181. package/dist/wirings/trigger/trigger.types.d.ts +130 -0
  182. package/dist/wirings/trigger/trigger.types.js +40 -0
  183. package/dist/wirings/variable/index.d.ts +3 -0
  184. package/dist/wirings/variable/index.js +2 -0
  185. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  186. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  187. package/dist/wirings/variable/variable.types.d.ts +18 -0
  188. package/dist/wirings/variable/variable.types.js +1 -0
  189. package/dist/wirings/workflow/dsl/index.d.ts +5 -0
  190. package/dist/wirings/workflow/dsl/index.js +4 -0
  191. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +292 -0
  192. package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
  193. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
  194. package/dist/wirings/workflow/dsl/workflow-runner.js +23 -0
  195. package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
  196. package/dist/wirings/workflow/graph/graph-node.js +58 -0
  197. package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
  198. package/dist/wirings/workflow/graph/graph-runner.js +540 -0
  199. package/dist/wirings/workflow/graph/index.d.ts +4 -0
  200. package/dist/wirings/workflow/graph/index.js +3 -0
  201. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  202. package/dist/wirings/workflow/graph/template.js +27 -0
  203. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  204. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  205. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +82 -0
  206. package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
  207. package/dist/wirings/workflow/index.d.ts +7 -12
  208. package/dist/wirings/workflow/index.js +8 -11
  209. package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
  210. package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
  211. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  212. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  213. package/dist/wirings/workflow/workflow-utils.d.ts +1 -0
  214. package/dist/wirings/workflow/workflow-utils.js +1 -0
  215. package/dist/wirings/workflow/workflow.types.d.ts +83 -214
  216. package/package.json +13 -6
  217. package/run-tests.sh +4 -1
  218. package/src/crypto-utils.ts +99 -0
  219. package/src/errors/error-handler.ts +3 -3
  220. package/src/errors/errors.ts +17 -0
  221. package/src/errors/index.ts +0 -1
  222. package/src/factory-functions.test.ts +42 -2
  223. package/src/function/function-runner.test.ts +5 -12
  224. package/src/function/function-runner.ts +195 -40
  225. package/src/function/functions.types.ts +66 -14
  226. package/src/function/index.ts +5 -2
  227. package/src/handle-error.ts +2 -10
  228. package/src/index.ts +106 -27
  229. package/src/middleware/auth-apikey.test.ts +15 -12
  230. package/src/middleware/auth-apikey.ts +3 -3
  231. package/src/middleware/auth-bearer.test.ts +17 -14
  232. package/src/middleware/auth-bearer.ts +25 -27
  233. package/src/middleware/auth-cookie.test.ts +16 -13
  234. package/src/middleware/auth-cookie.ts +6 -8
  235. package/src/middleware/cors.ts +96 -0
  236. package/src/middleware/index.ts +5 -3
  237. package/src/middleware/remote-auth.ts +68 -0
  238. package/src/middleware-runner.test.ts +122 -0
  239. package/src/middleware-runner.ts +24 -17
  240. package/src/permissions.test.ts +102 -86
  241. package/src/permissions.ts +32 -93
  242. package/src/pikku-state.ts +168 -201
  243. package/src/run-tests-script.test.ts +49 -0
  244. package/src/schema.ts +50 -18
  245. package/src/services/ai-agent-runner-service.ts +29 -0
  246. package/src/services/ai-run-state-service.ts +20 -0
  247. package/src/services/ai-storage-service.ts +39 -0
  248. package/src/services/deployment-service.ts +22 -0
  249. package/src/services/gopass-secrets.ts +95 -0
  250. package/src/services/in-memory-trigger-service.ts +68 -0
  251. package/src/services/in-memory-workflow-service.ts +395 -0
  252. package/src/services/index.ts +49 -14
  253. package/src/services/local-secrets.ts +51 -0
  254. package/src/services/local-variables.ts +22 -0
  255. package/src/services/scheduler-service.ts +29 -1
  256. package/src/services/schema-service.ts +7 -0
  257. package/src/services/scoped-secret-service.ts +41 -0
  258. package/src/services/secret-service.ts +25 -4
  259. package/src/services/trigger-service.ts +38 -0
  260. package/src/services/typed-secret-service.ts +70 -0
  261. package/src/services/typed-variables-service.ts +81 -0
  262. package/src/services/user-session-service.ts +23 -0
  263. package/src/services/variables-service.ts +5 -0
  264. package/src/services/workflow-service.ts +94 -0
  265. package/src/types/core.types.ts +82 -8
  266. package/src/types/state.types.ts +169 -0
  267. package/src/utils.ts +74 -5
  268. package/src/version.test.ts +80 -0
  269. package/src/version.ts +25 -0
  270. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  271. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  272. package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
  273. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  274. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  275. package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
  276. package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
  277. package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
  278. package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
  279. package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
  280. package/src/wirings/ai-agent/index.ts +28 -0
  281. package/src/wirings/channel/channel-common.ts +32 -19
  282. package/src/wirings/channel/channel-handler.ts +18 -5
  283. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  284. package/src/wirings/channel/channel-runner.ts +14 -15
  285. package/src/wirings/channel/channel.types.ts +17 -1
  286. package/src/wirings/channel/define-channel-routes.ts +25 -0
  287. package/src/wirings/channel/index.ts +23 -8
  288. package/src/wirings/channel/local/index.ts +3 -3
  289. package/src/wirings/channel/local/local-channel-runner.test.ts +47 -2
  290. package/src/wirings/channel/local/local-channel-runner.ts +22 -6
  291. package/src/wirings/channel/log-channels.ts +1 -1
  292. package/src/wirings/channel/serverless/index.ts +5 -1
  293. package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
  294. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
  295. package/src/wirings/cli/channel/index.ts +1 -1
  296. package/src/wirings/cli/cli-runner.test.ts +28 -28
  297. package/src/wirings/cli/cli-runner.ts +27 -19
  298. package/src/wirings/cli/cli.types.ts +12 -11
  299. package/src/wirings/cli/command-parser.test.ts +8 -8
  300. package/src/wirings/cli/define-cli-commands.ts +24 -0
  301. package/src/wirings/cli/index.ts +10 -4
  302. package/src/wirings/http/http-routes.test.ts +322 -0
  303. package/src/wirings/http/http-routes.ts +198 -0
  304. package/src/wirings/http/http-runner.test.ts +5 -5
  305. package/src/wirings/http/http-runner.ts +80 -29
  306. package/src/wirings/http/http.types.ts +121 -23
  307. package/src/wirings/http/index.ts +16 -4
  308. package/src/wirings/http/log-http-routes.ts +1 -1
  309. package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
  310. package/src/wirings/http/routers/path-to-regex.ts +2 -2
  311. package/src/wirings/mcp/index.ts +27 -3
  312. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  313. package/src/wirings/mcp/mcp-runner.ts +56 -67
  314. package/src/wirings/mcp/mcp.types.ts +3 -3
  315. package/src/wirings/node/index.ts +2 -0
  316. package/src/wirings/node/node.types.ts +23 -0
  317. package/src/wirings/oauth2/index.ts +3 -0
  318. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  319. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  320. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  321. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  322. package/src/wirings/queue/index.ts +14 -2
  323. package/src/wirings/queue/queue-runner.test.ts +115 -73
  324. package/src/wirings/queue/queue-runner.ts +39 -13
  325. package/src/wirings/queue/queue.types.ts +12 -2
  326. package/src/wirings/rpc/index.ts +1 -1
  327. package/src/wirings/rpc/rpc-runner.ts +270 -34
  328. package/src/wirings/rpc/rpc-types.ts +21 -4
  329. package/src/wirings/scheduler/index.ts +7 -4
  330. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  331. package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
  332. package/src/wirings/scheduler/scheduler-runner.ts +50 -10
  333. package/src/wirings/secret/index.ts +9 -0
  334. package/src/wirings/secret/secret.types.ts +32 -0
  335. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  336. package/src/wirings/trigger/index.ts +10 -0
  337. package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
  338. package/src/wirings/trigger/trigger-runner.ts +138 -0
  339. package/src/wirings/trigger/trigger.types.ts +178 -0
  340. package/src/wirings/variable/index.ts +8 -0
  341. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  342. package/src/wirings/variable/variable.types.ts +22 -0
  343. package/src/wirings/workflow/dsl/index.ts +31 -0
  344. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
  345. package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
  346. package/src/wirings/workflow/graph/graph-node.ts +222 -0
  347. package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
  348. package/src/wirings/workflow/graph/graph-runner.ts +816 -0
  349. package/src/wirings/workflow/graph/index.ts +14 -0
  350. package/src/wirings/workflow/graph/template.ts +42 -0
  351. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  352. package/src/wirings/workflow/graph/workflow-graph.types.ts +104 -0
  353. package/src/wirings/workflow/index.ts +64 -26
  354. package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
  355. package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
  356. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  357. package/src/wirings/workflow/workflow-utils.ts +0 -0
  358. package/src/wirings/workflow/workflow.types.ts +123 -279
  359. package/tsconfig.tsbuildinfo +1 -1
  360. package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
  361. package/dist/wirings/workflow/workflow-runner.js +0 -65
  362. package/src/function/function-runner.ts.bak +0 -188
  363. package/src/wirings/workflow/workflow-runner.ts +0 -72
@@ -0,0 +1,14 @@
1
+ export {
2
+ continueGraph,
3
+ executeGraphStep,
4
+ onGraphNodeComplete,
5
+ runFromMeta,
6
+ runWorkflowGraph,
7
+ } from './graph-runner.js'
8
+ export { template } from './template.js'
9
+ export type { TemplateString } from './template.js'
10
+ export {
11
+ pikkuWorkflowGraph,
12
+ type PikkuWorkflowGraphConfig,
13
+ type PikkuWorkflowGraphResult,
14
+ } from './wire-workflow-graph.js'
@@ -0,0 +1,42 @@
1
+ export type TemplateString = {
2
+ $template: {
3
+ parts: string[]
4
+ expressions: Array<{ $ref: string; path?: string }>
5
+ }
6
+ } & { __brand: 'TemplateString' }
7
+
8
+ export function template(
9
+ templateStr: string,
10
+ refs: Array<{ $ref: string; path?: string }>
11
+ ): TemplateString {
12
+ const parts: string[] = []
13
+ const expressions: Array<{ $ref: string; path?: string }> = []
14
+
15
+ const regex = /\$(\d+)/g
16
+ let lastIndex = 0
17
+ let match
18
+
19
+ while ((match = regex.exec(templateStr)) !== null) {
20
+ parts.push(templateStr.slice(lastIndex, match.index))
21
+
22
+ const refIndex = parseInt(match[1]!, 10)
23
+ const refValue = refs[refIndex]
24
+ if (refValue) {
25
+ const expr: { $ref: string; path?: string } = { $ref: refValue.$ref }
26
+ if (refValue.path) {
27
+ expr.path = refValue.path
28
+ }
29
+ expressions.push(expr)
30
+ } else {
31
+ expressions.push({ $ref: 'unknown' })
32
+ }
33
+
34
+ lastIndex = regex.lastIndex
35
+ }
36
+
37
+ parts.push(templateStr.slice(lastIndex))
38
+
39
+ return {
40
+ $template: { parts, expressions },
41
+ } as TemplateString
42
+ }
@@ -0,0 +1,29 @@
1
+ export interface PikkuWorkflowGraphConfig<
2
+ FuncMap extends Record<string, string>,
3
+ T,
4
+ > {
5
+ disabled?: true
6
+ name?: string
7
+ description?: string
8
+ tags?: string[]
9
+ nodes: FuncMap
10
+ config?: T
11
+ }
12
+
13
+ export interface PikkuWorkflowGraphResult {
14
+ __type: 'pikkuWorkflowGraph'
15
+ name?: string
16
+ description?: string
17
+ tags?: string[]
18
+ }
19
+
20
+ export function pikkuWorkflowGraph<
21
+ const FuncMap extends Record<string, string>,
22
+ >(config: PikkuWorkflowGraphConfig<FuncMap, any>): PikkuWorkflowGraphResult {
23
+ return {
24
+ __type: 'pikkuWorkflowGraph',
25
+ name: config.name,
26
+ description: config.description,
27
+ tags: config.tags,
28
+ }
29
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Ref value - internal representation after input callback is evaluated
3
+ */
4
+ export interface RefValue {
5
+ __isRef: true
6
+ nodeId: string
7
+ path?: string
8
+ }
9
+
10
+ /**
11
+ * Helper to create a ref value
12
+ */
13
+ export const createRef = (nodeId: string, path?: string): RefValue => ({
14
+ __isRef: true,
15
+ nodeId,
16
+ path,
17
+ })
18
+
19
+ /**
20
+ * Check if a value is a ref
21
+ */
22
+ export const isRef = (value: unknown): value is RefValue =>
23
+ typeof value === 'object' &&
24
+ value !== null &&
25
+ '__isRef' in value &&
26
+ (value as RefValue).__isRef === true
27
+
28
+ /**
29
+ * Input reference for fetching step results
30
+ */
31
+ export interface InputRef {
32
+ nodeId: string
33
+ path?: string
34
+ }
35
+
36
+ /**
37
+ * Ref function type - provides type-safe references to other nodes' outputs
38
+ * The actual typing is done at the pikkuWorkflowGraph level
39
+ */
40
+ export type RefFn<NodeIds extends string = string> = (
41
+ nodeId: NodeIds,
42
+ path?: string
43
+ ) => RefValue
44
+
45
+ /**
46
+ * Next node configuration - fully serializable
47
+ * - string: single next node
48
+ * - string[]: parallel execution (all run concurrently)
49
+ * - Record<string, string | string[]>: branching (function calls graph.branch('key'))
50
+ */
51
+ export type NextConfig<NodeIds extends string = string> =
52
+ | NodeIds
53
+ | NodeIds[]
54
+ | Record<string, NodeIds | NodeIds[]>
55
+
56
+ /**
57
+ * Graph node configuration - references functions by RPC name
58
+ */
59
+ export interface GraphNodeConfig<NodeIds extends string = string> {
60
+ /** RPC function name */
61
+ func: string
62
+ /** Input mapping callback - receives ref function, returns input object */
63
+ input?: (ref: RefFn<NodeIds>) => Record<string, unknown>
64
+ /** Next nodes - string, array, or record for branching */
65
+ next?: NextConfig<NodeIds>
66
+ /** Error routing - node(s) to execute on error */
67
+ onError?: NodeIds | NodeIds[]
68
+ }
69
+
70
+ /**
71
+ * Graph wire context - available to functions running in a workflow graph
72
+ */
73
+ export interface PikkuGraphWire {
74
+ /** Workflow run ID */
75
+ runId: string
76
+ /** Graph name */
77
+ graphName: string
78
+ /** Current node ID */
79
+ nodeId: string
80
+ /**
81
+ * Select which branch to take for Record-based next config.
82
+ * Must be called if the node has a Record `next` configuration.
83
+ * @param key - The branch key to take (must match a key in the next Record)
84
+ */
85
+ branch: (key: string) => void
86
+ /**
87
+ * Set a state variable value.
88
+ * @param name - Variable name
89
+ * @param value - Value to store
90
+ */
91
+ setState: (name: string, value: unknown) => Promise<void>
92
+ /**
93
+ * Get the entire state object.
94
+ * @returns The state object with all variables
95
+ */
96
+ getState: () => Promise<Record<string, unknown>>
97
+ }
98
+
99
+ /**
100
+ * Internal mutable state for graph wire (used by runner to capture branch)
101
+ */
102
+ export interface GraphWireState {
103
+ branchKey?: string
104
+ }
@@ -1,13 +1,68 @@
1
1
  /**
2
2
  * Workflow module exports
3
3
  */
4
+ export {
5
+ PikkuWorkflowService,
6
+ WorkflowCancelledException,
7
+ WorkflowSuspendedException,
8
+ WorkflowNotFoundError,
9
+ WorkflowRunNotFoundError,
10
+ } from './pikku-workflow-service.js'
4
11
 
5
- // Types
12
+ // Internal registration functions (used by generated code)
13
+ export { addWorkflow } from './dsl/workflow-runner.js'
14
+
15
+ // Graph helpers (template, pikkuWorkflowGraph)
16
+ export { template, type TemplateString } from './graph/template.js'
17
+ export {
18
+ pikkuWorkflowGraph,
19
+ type PikkuWorkflowGraphConfig,
20
+ type PikkuWorkflowGraphResult,
21
+ } from './graph/wire-workflow-graph.js'
22
+
23
+ // Workflow helpers (runtime factories for HTTP handlers)
24
+ export {
25
+ workflow,
26
+ workflowStart,
27
+ workflowStatus,
28
+ graphStart,
29
+ } from './workflow-helpers.js'
30
+
31
+ // Re-export all types from workflow.types
6
32
  export type {
33
+ WorkflowService,
34
+ WorkflowServiceConfig,
35
+ WorkflowRunWire,
36
+ WorkflowStatus,
37
+ StepStatus,
38
+ WorkflowRun,
39
+ StepState,
40
+ WorkflowRunService,
7
41
  CoreWorkflow,
42
+ PikkuWorkflow,
43
+ ContextVariable,
44
+ WorkflowContext,
45
+ WorkflowsMeta,
46
+ WorkflowRuntimeMeta,
47
+ WorkflowsRuntimeMeta,
48
+ WorkflowStepInput,
49
+ WorkflowOrchestratorInput,
50
+ WorkflowSleeperInput,
51
+ } from './workflow.types.js'
52
+
53
+ // Re-export DSL types
54
+ export type {
8
55
  WorkflowStepOptions,
9
- WorkflowStepMeta,
56
+ WorkflowWireDoRPC,
57
+ WorkflowWireDoInline,
58
+ WorkflowWireSleep,
59
+ WorkflowWireSuspend,
60
+ InputSource,
61
+ OutputBinding,
10
62
  RpcStepMeta,
63
+ SimpleCondition,
64
+ Condition,
65
+ BranchCase,
11
66
  BranchStepMeta,
12
67
  ParallelGroupStepMeta,
13
68
  FanoutStepMeta,
@@ -15,29 +70,12 @@ export type {
15
70
  InlineStepMeta,
16
71
  SleepStepMeta,
17
72
  CancelStepMeta,
18
- InputSource,
19
- OutputBinding,
73
+ SetStepMeta,
74
+ SwitchCaseMeta,
75
+ SwitchStepMeta,
76
+ FilterStepMeta,
77
+ ArrayPredicateStepMeta,
78
+ WorkflowStepMeta,
79
+ WorkflowStepWire,
20
80
  PikkuWorkflowWire,
21
- PikkuWorkflow,
22
- WorkflowsMeta,
23
- WorkflowRun,
24
- StepState,
25
- WorkflowStatus,
26
- StepStatus,
27
81
  } from './workflow.types.js'
28
-
29
- export { PikkuWorkflowService } from './pikku-workflow-service.js'
30
-
31
- // Internal registration function (used by generated code)
32
- export { addWorkflow } from './workflow-runner.js'
33
-
34
- /**
35
- * @deprecated This function is no longer used and will be removed in a future release.
36
- * It exists only for backwards compatibility with generated code.
37
- * TODO: Remove this export in a future release after updating code generation
38
- */
39
- export const wireWorkflow = <T extends { name: string; func: any }>(
40
- workflow: T
41
- ): void => {
42
- // Empty function - no longer used, kept for backwards compatibility
43
- }
@@ -0,0 +1,212 @@
1
+ import { describe, test } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+
4
+ import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
5
+ import { pikkuState } from '../../pikku-state.js'
6
+ import { addWorkflow } from './dsl/workflow-runner.js'
7
+ import {
8
+ WorkflowSuspendedException,
9
+ type PikkuWorkflowWire,
10
+ } from './pikku-workflow-service.js'
11
+
12
+ describe('pikku-workflow-service version mismatch fallback', () => {
13
+ test('should fall back to stored graph for dsl workflow version mismatch', async () => {
14
+ const ws = new InMemoryWorkflowService()
15
+ const workflowName = 'testDslVersionMismatch'
16
+ const oldHash = 'old-hash'
17
+ const newHash = 'new-hash'
18
+
19
+ ws.setServices(
20
+ {
21
+ queueService: {
22
+ add: async () => {},
23
+ },
24
+ } as any,
25
+ (() => ({})) as any,
26
+ {} as any
27
+ )
28
+
29
+ const metaState = pikkuState(null, 'workflows', 'meta')
30
+ metaState[workflowName] = {
31
+ name: workflowName,
32
+ pikkuFuncId: workflowName,
33
+ source: 'dsl',
34
+ graphHash: newHash,
35
+ }
36
+
37
+ await ws.upsertWorkflowVersion(
38
+ workflowName,
39
+ oldHash,
40
+ {
41
+ name: workflowName,
42
+ pikkuFuncId: workflowName,
43
+ source: 'dsl',
44
+ graphHash: oldHash,
45
+ nodes: {
46
+ nodeA: { nodeId: 'nodeA', rpcName: 'doA' },
47
+ },
48
+ entryNodeIds: ['nodeA'],
49
+ },
50
+ 'dsl'
51
+ )
52
+ const runId = await ws.createRun(workflowName, {}, false, oldHash, {
53
+ type: 'test',
54
+ })
55
+
56
+ await ws.runWorkflowJob(runId, {})
57
+
58
+ const step = await ws.getStepState(runId, 'nodeA')
59
+ const run = await ws.getRun(runId)
60
+ assert.notEqual(step.stepId, '')
61
+ assert.equal(step.status, 'pending')
62
+ assert.equal(run?.status, 'running')
63
+
64
+ delete metaState[workflowName]
65
+ })
66
+
67
+ test('should continue from stored graph version when hashes mismatch', async () => {
68
+ const ws = new InMemoryWorkflowService()
69
+ const workflowName = 'testGraphVersionMismatch'
70
+ const oldHash = 'old-graph-hash'
71
+ const newHash = 'new-graph-hash'
72
+
73
+ const metaState = pikkuState(null, 'workflows', 'meta')
74
+ metaState[workflowName] = {
75
+ name: workflowName,
76
+ pikkuFuncId: workflowName,
77
+ source: 'graph',
78
+ graphHash: newHash,
79
+ nodes: {
80
+ changedNode: { nodeId: 'changedNode', rpcName: 'changedRpc' },
81
+ },
82
+ entryNodeIds: ['changedNode'],
83
+ }
84
+
85
+ await ws.upsertWorkflowVersion(
86
+ workflowName,
87
+ oldHash,
88
+ {
89
+ name: workflowName,
90
+ pikkuFuncId: workflowName,
91
+ source: 'graph',
92
+ graphHash: oldHash,
93
+ nodes: {},
94
+ entryNodeIds: [],
95
+ },
96
+ 'graph'
97
+ )
98
+
99
+ const runId = await ws.createRun(workflowName, {}, false, oldHash, {
100
+ type: 'test',
101
+ })
102
+ await ws.runWorkflowJob(runId, {})
103
+
104
+ const run = await ws.getRun(runId)
105
+ assert.equal(run?.status, 'completed')
106
+
107
+ delete metaState[workflowName]
108
+ })
109
+ })
110
+
111
+ describe('pikku-workflow-service executeWorkflowStep', () => {
112
+ test('should set pending step to running before succeeding', async () => {
113
+ const ws = new InMemoryWorkflowService()
114
+ ws.setServices(
115
+ {
116
+ queueService: {
117
+ add: async () => {},
118
+ },
119
+ } as any,
120
+ (() => ({})) as any,
121
+ {} as any
122
+ )
123
+
124
+ const runId = await ws.createRun(
125
+ 'pending-step-running',
126
+ {},
127
+ false,
128
+ 'hash',
129
+ { type: 'test' }
130
+ )
131
+ await ws.insertStepState(runId, 'stepA', 'doStepA', { a: 1 })
132
+
133
+ await ws.executeWorkflowStep(
134
+ runId,
135
+ 'stepA',
136
+ 'doStepA',
137
+ { a: 1 },
138
+ {
139
+ rpcWithWire: async () => ({ ok: true }),
140
+ }
141
+ )
142
+
143
+ const step = await ws.getStepState(runId, 'stepA')
144
+ assert.equal(step.status, 'succeeded')
145
+ assert.ok(step.runningAt instanceof Date)
146
+ })
147
+ })
148
+
149
+ describe('pikku-workflow-service suspend', () => {
150
+ test('should set run status to suspended when workflow.suspend is called', async () => {
151
+ const ws = new InMemoryWorkflowService()
152
+ ws.setServices(
153
+ {
154
+ queueService: {
155
+ add: async () => {},
156
+ },
157
+ } as any,
158
+ (() => ({})) as any,
159
+ {} as any
160
+ )
161
+
162
+ const workflowName = 'testSuspendWorkflow'
163
+ const graphHash = 'suspend-hash'
164
+ const metaState = pikkuState(null, 'workflows', 'meta')
165
+ metaState[workflowName] = {
166
+ name: workflowName,
167
+ pikkuFuncId: workflowName,
168
+ source: 'dsl',
169
+ graphHash,
170
+ }
171
+ const functionMetaState = pikkuState(null, 'function', 'meta')
172
+ functionMetaState[workflowName] = {
173
+ name: workflowName,
174
+ sessionless: true,
175
+ permissions: [],
176
+ } as any
177
+
178
+ addWorkflow(workflowName, {
179
+ func: async (
180
+ _services: any,
181
+ _data: any,
182
+ { workflow }: { workflow: PikkuWorkflowWire }
183
+ ) => {
184
+ await workflow.suspend('Needs approval')
185
+ return { ok: true }
186
+ },
187
+ })
188
+
189
+ const runId = await ws.createRun(workflowName, {}, false, graphHash, {
190
+ type: 'test',
191
+ })
192
+ await assert.rejects(
193
+ ws.runWorkflowJob(runId, {}),
194
+ (error: unknown) => error instanceof WorkflowSuspendedException
195
+ )
196
+
197
+ const run = await ws.getRun(runId)
198
+ assert.equal(run?.status, 'suspended')
199
+ assert.equal(run?.error?.code, 'WORKFLOW_SUSPENDED')
200
+ assert.equal(run?.error?.message, 'Needs approval')
201
+
202
+ await ws.resumeWorkflow(runId)
203
+ await ws.runWorkflowJob(runId, {})
204
+ const resumedRun = await ws.getRun(runId)
205
+ assert.equal(resumedRun?.status, 'completed')
206
+ assert.deepEqual(resumedRun?.output, { ok: true })
207
+
208
+ delete metaState[workflowName]
209
+ delete functionMetaState[workflowName]
210
+ pikkuState(null, 'workflows', 'registrations').delete(workflowName)
211
+ })
212
+ })