@pikku/core 0.11.2 → 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 (344) hide show
  1. package/CHANGELOG.md +33 -2
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/errors.d.ts +8 -0
  5. package/dist/errors/errors.js +16 -0
  6. package/dist/errors/index.d.ts +0 -1
  7. package/dist/errors/index.js +0 -1
  8. package/dist/function/function-runner.d.ts +7 -1
  9. package/dist/function/function-runner.js +82 -23
  10. package/dist/function/functions.types.d.ts +31 -87
  11. package/dist/function/functions.types.js +16 -46
  12. package/dist/function/index.d.ts +2 -2
  13. package/dist/function/index.js +1 -2
  14. package/dist/handle-error.js +1 -10
  15. package/dist/index.d.ts +28 -26
  16. package/dist/index.js +18 -29
  17. package/dist/middleware/auth-apikey.d.ts +2 -2
  18. package/dist/middleware/auth-apikey.js +3 -3
  19. package/dist/middleware/auth-bearer.d.ts +2 -2
  20. package/dist/middleware/auth-bearer.js +3 -6
  21. package/dist/middleware/auth-cookie.d.ts +2 -2
  22. package/dist/middleware/auth-cookie.js +6 -8
  23. package/dist/middleware/cors.d.ts +46 -0
  24. package/dist/middleware/cors.js +73 -0
  25. package/dist/middleware/index.d.ts +5 -3
  26. package/dist/middleware/index.js +5 -3
  27. package/dist/middleware/remote-auth.d.ts +5 -0
  28. package/dist/middleware/remote-auth.js +55 -0
  29. package/dist/middleware/timeout.d.ts +2 -2
  30. package/dist/middleware-runner.js +8 -10
  31. package/dist/permissions.js +11 -15
  32. package/dist/pikku-state.d.ts +1 -0
  33. package/dist/pikku-state.js +18 -8
  34. package/dist/schema.js +12 -11
  35. package/dist/services/ai-agent-runner-service.d.ts +24 -0
  36. package/dist/services/ai-agent-runner-service.js +1 -0
  37. package/dist/services/ai-run-state-service.d.ts +13 -0
  38. package/dist/services/ai-run-state-service.js +1 -0
  39. package/dist/services/ai-storage-service.d.ts +18 -0
  40. package/dist/services/ai-storage-service.js +1 -0
  41. package/dist/services/deployment-service.d.ts +19 -0
  42. package/dist/services/deployment-service.js +1 -0
  43. package/dist/services/gopass-secrets.d.ts +47 -0
  44. package/dist/services/gopass-secrets.js +94 -0
  45. package/dist/services/in-memory-trigger-service.d.ts +23 -0
  46. package/dist/services/in-memory-trigger-service.js +50 -0
  47. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  48. package/dist/services/in-memory-workflow-service.js +287 -0
  49. package/dist/services/index.d.ts +25 -11
  50. package/dist/services/index.js +10 -13
  51. package/dist/services/local-secrets.d.ts +23 -0
  52. package/dist/services/local-secrets.js +45 -0
  53. package/dist/services/local-variables.d.ts +5 -0
  54. package/dist/services/local-variables.js +18 -0
  55. package/dist/services/scheduler-service.d.ts +21 -1
  56. package/dist/services/scheduler-service.js +14 -0
  57. package/dist/services/schema-service.d.ts +6 -0
  58. package/dist/services/scoped-secret-service.d.ts +16 -0
  59. package/dist/services/scoped-secret-service.js +35 -0
  60. package/dist/services/secret-service.d.ts +25 -4
  61. package/dist/services/trigger-service.d.ts +23 -0
  62. package/dist/services/trigger-service.js +1 -0
  63. package/dist/services/typed-secret-service.d.ts +30 -0
  64. package/dist/services/typed-secret-service.js +40 -0
  65. package/dist/services/typed-variables-service.d.ts +27 -0
  66. package/dist/services/typed-variables-service.js +46 -0
  67. package/dist/services/user-session-service.d.ts +13 -0
  68. package/dist/services/user-session-service.js +17 -0
  69. package/dist/services/variables-service.d.ts +5 -0
  70. package/dist/services/workflow-service.d.ts +9 -4
  71. package/dist/types/core.types.d.ts +48 -12
  72. package/dist/types/core.types.js +8 -1
  73. package/dist/types/state.types.d.ts +43 -51
  74. package/dist/utils.d.ts +3 -2
  75. package/dist/utils.js +15 -3
  76. package/dist/version.d.ts +6 -0
  77. package/dist/version.js +19 -0
  78. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  79. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  80. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  81. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  82. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
  83. package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
  84. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  85. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  86. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  87. package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
  88. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
  89. package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
  90. package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
  91. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  92. package/dist/wirings/ai-agent/index.d.ts +5 -0
  93. package/dist/wirings/ai-agent/index.js +4 -0
  94. package/dist/wirings/channel/channel-common.d.ts +7 -4
  95. package/dist/wirings/channel/channel-common.js +15 -8
  96. package/dist/wirings/channel/channel-handler.js +12 -3
  97. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  98. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  99. package/dist/wirings/channel/channel-runner.js +7 -7
  100. package/dist/wirings/channel/channel.types.d.ts +5 -1
  101. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  102. package/dist/wirings/channel/define-channel-routes.js +23 -0
  103. package/dist/wirings/channel/index.d.ts +10 -8
  104. package/dist/wirings/channel/index.js +7 -8
  105. package/dist/wirings/channel/local/index.d.ts +3 -3
  106. package/dist/wirings/channel/local/index.js +3 -3
  107. package/dist/wirings/channel/local/local-channel-runner.js +18 -6
  108. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  109. package/dist/wirings/channel/serverless/index.js +1 -1
  110. package/dist/wirings/channel/serverless/serverless-channel-runner.js +15 -4
  111. package/dist/wirings/cli/channel/index.d.ts +1 -1
  112. package/dist/wirings/cli/channel/index.js +1 -1
  113. package/dist/wirings/cli/cli-runner.d.ts +1 -1
  114. package/dist/wirings/cli/cli-runner.js +12 -8
  115. package/dist/wirings/cli/cli.types.d.ts +6 -6
  116. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  117. package/dist/wirings/cli/define-cli-commands.js +20 -0
  118. package/dist/wirings/cli/index.d.ts +2 -3
  119. package/dist/wirings/cli/index.js +1 -3
  120. package/dist/wirings/http/http-routes.d.ts +69 -0
  121. package/dist/wirings/http/http-routes.js +139 -0
  122. package/dist/wirings/http/http-runner.js +49 -23
  123. package/dist/wirings/http/http.types.d.ts +78 -38
  124. package/dist/wirings/http/index.d.ts +5 -4
  125. package/dist/wirings/http/index.js +4 -3
  126. package/dist/wirings/mcp/index.d.ts +4 -3
  127. package/dist/wirings/mcp/index.js +3 -3
  128. package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
  129. package/dist/wirings/mcp/mcp-runner.js +25 -39
  130. package/dist/wirings/mcp/mcp.types.d.ts +3 -3
  131. package/dist/wirings/node/index.d.ts +2 -0
  132. package/dist/wirings/node/index.js +1 -0
  133. package/dist/wirings/node/node.types.d.ts +20 -0
  134. package/dist/wirings/node/node.types.js +1 -0
  135. package/dist/wirings/oauth2/index.d.ts +3 -0
  136. package/dist/wirings/oauth2/index.js +2 -0
  137. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  138. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  139. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  140. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  141. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  142. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  143. package/dist/wirings/queue/index.d.ts +2 -2
  144. package/dist/wirings/queue/index.js +1 -1
  145. package/dist/wirings/queue/queue-runner.d.ts +7 -0
  146. package/dist/wirings/queue/queue-runner.js +17 -6
  147. package/dist/wirings/queue/queue.types.d.ts +8 -2
  148. package/dist/wirings/rpc/index.d.ts +1 -1
  149. package/dist/wirings/rpc/index.js +1 -1
  150. package/dist/wirings/rpc/rpc-runner.d.ts +33 -5
  151. package/dist/wirings/rpc/rpc-runner.js +134 -16
  152. package/dist/wirings/rpc/rpc-types.d.ts +8 -4
  153. package/dist/wirings/scheduler/index.d.ts +3 -3
  154. package/dist/wirings/scheduler/index.js +2 -3
  155. package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
  156. package/dist/wirings/scheduler/scheduler-runner.js +23 -5
  157. package/dist/wirings/secret/index.d.ts +3 -0
  158. package/dist/wirings/secret/index.js +2 -0
  159. package/dist/wirings/secret/secret.types.d.ts +27 -0
  160. package/dist/wirings/secret/secret.types.js +1 -0
  161. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  162. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  163. package/dist/wirings/trigger/index.d.ts +3 -2
  164. package/dist/wirings/trigger/index.js +2 -2
  165. package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
  166. package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
  167. package/dist/wirings/trigger/trigger-runner.d.ts +21 -8
  168. package/dist/wirings/trigger/trigger-runner.js +46 -18
  169. package/dist/wirings/trigger/trigger.types.d.ts +99 -11
  170. package/dist/wirings/trigger/trigger.types.js +40 -1
  171. package/dist/wirings/variable/index.d.ts +3 -0
  172. package/dist/wirings/variable/index.js +2 -0
  173. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  174. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  175. package/dist/wirings/variable/variable.types.d.ts +18 -0
  176. package/dist/wirings/variable/variable.types.js +1 -0
  177. package/dist/wirings/workflow/dsl/index.d.ts +1 -1
  178. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
  179. package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
  180. package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
  181. package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
  182. package/dist/wirings/workflow/graph/graph-runner.js +384 -296
  183. package/dist/wirings/workflow/graph/index.d.ts +4 -3
  184. package/dist/wirings/workflow/graph/index.js +3 -3
  185. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  186. package/dist/wirings/workflow/graph/template.js +27 -0
  187. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  188. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  189. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
  190. package/dist/wirings/workflow/index.d.ts +6 -6
  191. package/dist/wirings/workflow/index.js +6 -4
  192. package/dist/wirings/workflow/pikku-workflow-service.d.ts +28 -14
  193. package/dist/wirings/workflow/pikku-workflow-service.js +200 -56
  194. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  195. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  196. package/dist/wirings/workflow/workflow-utils.d.ts +1 -23
  197. package/dist/wirings/workflow/workflow-utils.js +1 -66
  198. package/dist/wirings/workflow/workflow.types.d.ts +40 -93
  199. package/package.json +13 -15
  200. package/run-tests.sh +4 -1
  201. package/src/crypto-utils.ts +99 -0
  202. package/src/errors/errors.ts +17 -0
  203. package/src/errors/index.ts +0 -1
  204. package/src/factory-functions.test.ts +42 -2
  205. package/src/function/function-runner.test.ts +4 -11
  206. package/src/function/function-runner.ts +114 -29
  207. package/src/function/functions.types.ts +62 -132
  208. package/src/function/index.ts +5 -2
  209. package/src/handle-error.ts +2 -10
  210. package/src/index.ts +99 -25
  211. package/src/middleware/auth-apikey.test.ts +15 -12
  212. package/src/middleware/auth-apikey.ts +3 -3
  213. package/src/middleware/auth-bearer.test.ts +17 -14
  214. package/src/middleware/auth-bearer.ts +25 -27
  215. package/src/middleware/auth-cookie.test.ts +16 -13
  216. package/src/middleware/auth-cookie.ts +6 -8
  217. package/src/middleware/cors.ts +96 -0
  218. package/src/middleware/index.ts +5 -3
  219. package/src/middleware/remote-auth.ts +68 -0
  220. package/src/middleware-runner.test.ts +122 -0
  221. package/src/middleware-runner.ts +12 -12
  222. package/src/permissions.test.ts +81 -7
  223. package/src/permissions.ts +15 -17
  224. package/src/pikku-state.ts +20 -8
  225. package/src/run-tests-script.test.ts +49 -0
  226. package/src/schema.ts +18 -15
  227. package/src/services/ai-agent-runner-service.ts +29 -0
  228. package/src/services/ai-run-state-service.ts +20 -0
  229. package/src/services/ai-storage-service.ts +39 -0
  230. package/src/services/deployment-service.ts +22 -0
  231. package/src/services/gopass-secrets.ts +95 -0
  232. package/src/services/in-memory-trigger-service.ts +68 -0
  233. package/src/services/in-memory-workflow-service.ts +395 -0
  234. package/src/services/index.ts +49 -14
  235. package/src/services/local-secrets.ts +51 -0
  236. package/src/services/local-variables.ts +22 -0
  237. package/src/services/scheduler-service.ts +29 -1
  238. package/src/services/schema-service.ts +7 -0
  239. package/src/services/scoped-secret-service.ts +41 -0
  240. package/src/services/secret-service.ts +25 -4
  241. package/src/services/trigger-service.ts +38 -0
  242. package/src/services/typed-secret-service.ts +70 -0
  243. package/src/services/typed-variables-service.ts +81 -0
  244. package/src/services/user-session-service.ts +23 -0
  245. package/src/services/variables-service.ts +5 -0
  246. package/src/services/workflow-service.ts +22 -2
  247. package/src/types/core.types.ts +76 -11
  248. package/src/types/state.types.ts +37 -63
  249. package/src/utils.ts +20 -6
  250. package/src/version.test.ts +80 -0
  251. package/src/version.ts +25 -0
  252. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  253. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  254. package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
  255. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  256. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  257. package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
  258. package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
  259. package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
  260. package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
  261. package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
  262. package/src/wirings/ai-agent/index.ts +28 -0
  263. package/src/wirings/channel/channel-common.ts +32 -19
  264. package/src/wirings/channel/channel-handler.ts +17 -4
  265. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  266. package/src/wirings/channel/channel-runner.ts +9 -10
  267. package/src/wirings/channel/channel.types.ts +17 -1
  268. package/src/wirings/channel/define-channel-routes.ts +25 -0
  269. package/src/wirings/channel/index.ts +23 -8
  270. package/src/wirings/channel/local/index.ts +3 -3
  271. package/src/wirings/channel/local/local-channel-runner.test.ts +44 -1
  272. package/src/wirings/channel/local/local-channel-runner.ts +22 -6
  273. package/src/wirings/channel/serverless/index.ts +5 -1
  274. package/src/wirings/channel/serverless/serverless-channel-runner.ts +20 -4
  275. package/src/wirings/cli/channel/index.ts +1 -1
  276. package/src/wirings/cli/cli-runner.test.ts +9 -9
  277. package/src/wirings/cli/cli-runner.ts +17 -10
  278. package/src/wirings/cli/cli.types.ts +11 -11
  279. package/src/wirings/cli/command-parser.test.ts +8 -8
  280. package/src/wirings/cli/define-cli-commands.ts +24 -0
  281. package/src/wirings/cli/index.ts +10 -4
  282. package/src/wirings/http/http-routes.test.ts +322 -0
  283. package/src/wirings/http/http-routes.ts +198 -0
  284. package/src/wirings/http/http-runner.test.ts +3 -3
  285. package/src/wirings/http/http-runner.ts +63 -29
  286. package/src/wirings/http/http.types.ts +121 -37
  287. package/src/wirings/http/index.ts +16 -4
  288. package/src/wirings/mcp/index.ts +27 -3
  289. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  290. package/src/wirings/mcp/mcp-runner.ts +39 -50
  291. package/src/wirings/mcp/mcp.types.ts +3 -3
  292. package/src/wirings/node/index.ts +2 -0
  293. package/src/wirings/node/node.types.ts +23 -0
  294. package/src/wirings/oauth2/index.ts +3 -0
  295. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  296. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  297. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  298. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  299. package/src/wirings/queue/index.ts +14 -2
  300. package/src/wirings/queue/queue-runner.test.ts +97 -55
  301. package/src/wirings/queue/queue-runner.ts +33 -7
  302. package/src/wirings/queue/queue.types.ts +12 -2
  303. package/src/wirings/rpc/index.ts +1 -1
  304. package/src/wirings/rpc/rpc-runner.ts +187 -17
  305. package/src/wirings/rpc/rpc-types.ts +13 -4
  306. package/src/wirings/scheduler/index.ts +7 -4
  307. package/src/wirings/scheduler/scheduler-runner.test.ts +70 -26
  308. package/src/wirings/scheduler/scheduler-runner.ts +45 -5
  309. package/src/wirings/secret/index.ts +9 -0
  310. package/src/wirings/secret/secret.types.ts +32 -0
  311. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  312. package/src/wirings/trigger/index.ts +10 -2
  313. package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
  314. package/src/wirings/trigger/trigger-runner.ts +80 -38
  315. package/src/wirings/trigger/trigger.types.ts +144 -22
  316. package/src/wirings/variable/index.ts +8 -0
  317. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  318. package/src/wirings/variable/variable.types.ts +22 -0
  319. package/src/wirings/workflow/dsl/index.ts +1 -0
  320. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
  321. package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
  322. package/src/wirings/workflow/graph/graph-node.ts +1 -6
  323. package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
  324. package/src/wirings/workflow/graph/graph-runner.ts +496 -374
  325. package/src/wirings/workflow/graph/index.ts +14 -3
  326. package/src/wirings/workflow/graph/template.ts +42 -0
  327. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  328. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
  329. package/src/wirings/workflow/index.ts +21 -10
  330. package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
  331. package/src/wirings/workflow/pikku-workflow-service.ts +285 -66
  332. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  333. package/src/wirings/workflow/workflow-utils.ts +0 -120
  334. package/src/wirings/workflow/workflow.types.ts +45 -90
  335. package/tsconfig.tsbuildinfo +1 -1
  336. package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
  337. package/dist/wirings/forge-node/forge-node.types.js +0 -38
  338. package/dist/wirings/forge-node/index.d.ts +0 -1
  339. package/dist/wirings/forge-node/index.js +0 -1
  340. package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
  341. package/dist/wirings/workflow/wire-workflow.js +0 -53
  342. package/src/wirings/forge-node/forge-node.types.ts +0 -135
  343. package/src/wirings/forge-node/index.ts +0 -1
  344. package/src/wirings/workflow/wire-workflow.ts +0 -94
@@ -1,8 +1,13 @@
1
1
  import { SerializedError, CommonWireMeta } from '../../types/core.types.js';
2
2
  import { CorePikkuFunctionConfig } from '../../function/functions.types.js';
3
3
  export type { WorkflowService } from '../../services/workflow-service.js';
4
- export type { WorkflowStepOptions, WorkflowWireDoRPC, WorkflowWireDoInline, WorkflowWireSleep, InputSource, OutputBinding, RpcStepMeta, SimpleCondition, Condition, BranchCase, BranchStepMeta, ParallelGroupStepMeta, FanoutStepMeta, ReturnStepMeta, InlineStepMeta, SleepStepMeta, CancelStepMeta, SetStepMeta, SwitchCaseMeta, SwitchStepMeta, FilterStepMeta, ArrayPredicateStepMeta, WorkflowStepMeta, WorkflowStepWire, PikkuWorkflowWire, } from './dsl/workflow-dsl.types.js';
4
+ 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 './dsl/workflow-dsl.types.js';
5
5
  import type { WorkflowStepMeta } from './dsl/workflow-dsl.types.js';
6
+ export interface WorkflowRunWire {
7
+ type: string;
8
+ id?: string;
9
+ parentRunId?: string;
10
+ }
6
11
  export interface WorkflowServiceConfig {
7
12
  retries: number;
8
13
  retryDelay: number;
@@ -10,99 +15,14 @@ export interface WorkflowServiceConfig {
10
15
  stepWorkerQueueName: string;
11
16
  sleeperRPCName: string;
12
17
  }
13
- /**
14
- * HTTP wire configuration for workflows
15
- */
16
- export interface WorkflowHTTPWire {
17
- route: string;
18
- method: 'get' | 'post' | 'put' | 'patch' | 'delete';
19
- startNode: string;
20
- }
21
- /**
22
- * Channel wire configuration for workflows
23
- */
24
- export interface WorkflowChannelWire {
25
- name: string;
26
- onConnect?: string;
27
- onDisconnect?: string;
28
- onMessage?: string;
29
- }
30
- /**
31
- * Queue wire configuration for workflows
32
- */
33
- export interface WorkflowQueueWire {
34
- name: string;
35
- startNode: string;
36
- }
37
- /**
38
- * CLI wire configuration for workflows
39
- */
40
- export interface WorkflowCliWire {
41
- command: string;
42
- startNode: string;
43
- }
44
- /**
45
- * MCP wire configurations for workflows
46
- */
47
- export interface WorkflowMcpWires {
48
- tool?: Array<{
49
- name: string;
50
- startNode: string;
51
- }>;
52
- prompt?: Array<{
53
- name: string;
54
- startNode: string;
55
- }>;
56
- resource?: Array<{
57
- uri: string;
58
- startNode: string;
59
- }>;
60
- }
61
- /**
62
- * Schedule wire configuration for workflows
63
- */
64
- export interface WorkflowScheduleWire {
65
- cron?: string;
66
- interval?: string;
67
- startNode: string;
68
- }
69
- /**
70
- * Trigger wire configuration for workflows
71
- */
72
- export interface WorkflowTriggerWire {
73
- name: string;
74
- startNode: string;
75
- }
76
- /**
77
- * Wire configuration for workflows
78
- * Defines how a workflow can be triggered
79
- */
80
- export interface WorkflowWires {
81
- /** API entry point - node ID for startWorkflow() calls */
82
- api?: string;
83
- /** HTTP triggers */
84
- http?: WorkflowHTTPWire[];
85
- /** Channel triggers */
86
- channel?: WorkflowChannelWire[];
87
- /** Queue triggers */
88
- queue?: WorkflowQueueWire[];
89
- /** CLI triggers */
90
- cli?: WorkflowCliWire[];
91
- /** MCP triggers (tool, prompt, resource) */
92
- mcp?: WorkflowMcpWires;
93
- /** Schedule triggers */
94
- schedule?: WorkflowScheduleWire[];
95
- /** Named trigger wires */
96
- trigger?: WorkflowTriggerWire[];
97
- }
98
18
  /**
99
19
  * Workflow run status
100
20
  */
101
- export type WorkflowStatus = 'running' | 'completed' | 'failed' | 'cancelled';
21
+ export type WorkflowStatus = 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled';
102
22
  /**
103
23
  * Workflow step status
104
24
  */
105
- export type StepStatus = 'pending' | 'running' | 'scheduled' | 'succeeded' | 'failed';
25
+ export type StepStatus = 'pending' | 'running' | 'scheduled' | 'succeeded' | 'failed' | 'suspended';
106
26
  /**
107
27
  * Workflow run representation
108
28
  */
@@ -121,6 +41,10 @@ export interface WorkflowRun {
121
41
  error?: SerializedError;
122
42
  /** If true, workflow executes inline without queues */
123
43
  inline?: boolean;
44
+ /** Graph hash of the workflow definition at run creation time */
45
+ graphHash?: string;
46
+ /** Wire origin info (how this run was started) */
47
+ wire: WorkflowRunWire;
124
48
  /** Creation timestamp */
125
49
  createdAt: Date;
126
50
  /** Last update timestamp */
@@ -157,6 +81,29 @@ export interface StepState {
157
81
  /** Timestamp when step failed */
158
82
  failedAt?: Date;
159
83
  }
84
+ export interface WorkflowRunService {
85
+ listRuns(options?: {
86
+ workflowName?: string;
87
+ status?: string;
88
+ limit?: number;
89
+ offset?: number;
90
+ }): Promise<WorkflowRun[]>;
91
+ getRun(id: string): Promise<WorkflowRun | null>;
92
+ getRunSteps(runId: string): Promise<Array<StepState & {
93
+ stepName: string;
94
+ rpcName?: string;
95
+ data?: any;
96
+ }>>;
97
+ getRunHistory(runId: string): Promise<Array<StepState & {
98
+ stepName: string;
99
+ }>>;
100
+ getDistinctWorkflowNames(): Promise<string[]>;
101
+ getWorkflowVersion(name: string, graphHash: string): Promise<{
102
+ graph: any;
103
+ source: string;
104
+ } | null>;
105
+ deleteRun(id: string): Promise<boolean>;
106
+ }
160
107
  /**
161
108
  * Core workflow definition
162
109
  */
@@ -204,7 +151,7 @@ export type WorkflowContext = Record<string, ContextVariable>;
204
151
  * Workflows metadata for inspector/CLI (DSL step-based format)
205
152
  */
206
153
  export type WorkflowsMeta = Record<string, CommonWireMeta & {
207
- workflowName: string;
154
+ name: string;
208
155
  steps: WorkflowStepMeta[];
209
156
  context?: WorkflowContext;
210
157
  dsl?: boolean;
@@ -218,19 +165,19 @@ export interface WorkflowRuntimeMeta {
218
165
  /** Workflow name (used as key in registrations) */
219
166
  name: string;
220
167
  /** Pikku function name (for execution) */
221
- pikkuFuncName: string;
168
+ pikkuFuncId: string;
222
169
  /** Source type: 'dsl' (serializable), 'complex' (has inline steps), 'graph' */
223
- source?: 'dsl' | 'complex' | 'graph';
170
+ source: 'dsl' | 'complex' | 'graph';
224
171
  /** Optional description */
225
172
  description?: string;
226
173
  /** Tags for organization */
227
174
  tags?: string[];
228
- /** Wires - how the workflow is triggered */
229
- wires?: WorkflowWires;
230
175
  /** Serialized nodes */
231
176
  nodes?: Record<string, any>;
232
177
  /** Entry node IDs for graph workflows (computed at build time) */
233
178
  entryNodeIds?: string[];
179
+ /** Hash of graph topology (nodes, edges, input mappings) */
180
+ graphHash?: string;
234
181
  }
235
182
  /**
236
183
  * Unified workflow runtime metadata map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pikku/core",
3
- "version": "0.11.2",
3
+ "version": "0.12.0",
4
4
  "author": "yasser.fadl@gmail.com",
5
5
  "license": "MIT",
6
6
  "module": "dist/index.js",
@@ -26,35 +26,33 @@
26
26
  "./http": "./dist/wirings/http/index.js",
27
27
  "./queue": "./dist/wirings/queue/index.js",
28
28
  "./scheduler": "./dist/wirings/scheduler/index.js",
29
+ "./trigger": "./dist/wirings/trigger/index.js",
29
30
  "./rpc": "./dist/wirings/rpc/index.js",
30
31
  "./mcp": "./dist/wirings/mcp/index.js",
32
+ "./ai-agent": "./dist/wirings/ai-agent/index.js",
31
33
  "./cli": "./dist/wirings/cli/index.js",
32
34
  "./cli/channel": "./dist/wirings/cli/channel/index.js",
33
- "./forge-node": "./dist/wirings/forge-node/index.js",
35
+ "./node": "./dist/wirings/node/index.js",
36
+ "./secret": "./dist/wirings/secret/index.js",
37
+ "./variable": "./dist/wirings/variable/index.js",
38
+ "./oauth2": "./dist/wirings/oauth2/index.js",
34
39
  "./errors": "./dist/errors/index.js",
35
40
  "./services": "./dist/services/index.js",
36
41
  "./services/local-content": "./dist/services/local-content.js",
37
- "./schema": "./dist/schema.js",
38
- "./types": "./dist/types/index.d.ts"
42
+ "./services/gopass-secrets": "./dist/services/gopass-secrets.js",
43
+ "./schema": "./dist/schema.js"
39
44
  },
40
45
  "dependencies": {
41
- "cookie": "^1.0.2",
46
+ "@standard-schema/spec": "^1.1.0",
47
+ "cookie": "^1.1.1",
42
48
  "path-to-regexp": "^8.3.0",
43
49
  "picoquery": "^2.5.0"
44
50
  },
45
51
  "devDependencies": {
46
- "@types/node": "^24.10.1",
47
- "tsx": "^4.20.6",
52
+ "@types/node": "^24.10.12",
53
+ "tsx": "^4.21.0",
48
54
  "typescript": "^5.9"
49
55
  },
50
- "peerDependencies": {
51
- "zod": "^4.0.0"
52
- },
53
- "peerDependenciesMeta": {
54
- "zod": {
55
- "optional": true
56
- }
57
- },
58
56
  "engines": {
59
57
  "node": ">=18"
60
58
  }
package/run-tests.sh CHANGED
@@ -34,6 +34,9 @@ files=($(find src -type f -name "*.test.ts"))
34
34
  # Check if any files matched the pattern
35
35
  if [ ${#files[@]} -eq 0 ]; then
36
36
  echo "No test files found matching pattern: $pattern"
37
+ if [ "${STRICT_TEST_DISCOVERY}" = "1" ] || [ "${CI}" = "true" ]; then
38
+ exit 1
39
+ fi
37
40
  exit 0
38
41
  fi
39
42
 
@@ -50,4 +53,4 @@ if [ "$coverage_mode" = true ]; then
50
53
  fi
51
54
 
52
55
  # Execute the node command with the expanded list of files
53
- $node_cmd "${files[@]}"
56
+ $node_cmd "${files[@]}"
@@ -0,0 +1,99 @@
1
+ const encoder = new TextEncoder()
2
+ const decoder = new TextDecoder()
3
+
4
+ const getSubtle = () => {
5
+ const crypto = globalThis.crypto
6
+ if (!crypto?.subtle) {
7
+ throw new Error('WebCrypto not available')
8
+ }
9
+ return crypto.subtle
10
+ }
11
+
12
+ const base64Encode = (bytes: Uint8Array): string => {
13
+ if (typeof Buffer !== 'undefined') {
14
+ return Buffer.from(bytes).toString('base64')
15
+ }
16
+ let binary = ''
17
+ for (let i = 0; i < bytes.length; i++) {
18
+ binary += String.fromCharCode(bytes[i]!)
19
+ }
20
+ return btoa(binary)
21
+ }
22
+
23
+ const base64Decode = (input: string): Uint8Array => {
24
+ if (typeof Buffer !== 'undefined') {
25
+ return new Uint8Array(Buffer.from(input, 'base64'))
26
+ }
27
+ const binary = atob(input)
28
+ const bytes = new Uint8Array(binary.length)
29
+ for (let i = 0; i < binary.length; i++) {
30
+ bytes[i] = binary.charCodeAt(i)
31
+ }
32
+ return bytes
33
+ }
34
+
35
+ const toBase64Url = (bytes: Uint8Array): string => {
36
+ return base64Encode(bytes)
37
+ .replace(/\+/g, '-')
38
+ .replace(/\//g, '_')
39
+ .replace(/=+$/g, '')
40
+ }
41
+
42
+ const fromBase64Url = (input: string): Uint8Array => {
43
+ let base64 = input.replace(/-/g, '+').replace(/_/g, '/')
44
+ while (base64.length % 4 !== 0) base64 += '='
45
+ return base64Decode(base64)
46
+ }
47
+
48
+ const deriveKey = async (secret: string): Promise<CryptoKey> => {
49
+ const subtle = getSubtle()
50
+ const hash = await subtle.digest('SHA-256', encoder.encode(secret))
51
+ return subtle.importKey('raw', hash, { name: 'AES-GCM' }, false, [
52
+ 'encrypt',
53
+ 'decrypt',
54
+ ])
55
+ }
56
+
57
+ export const encryptJSON = async (
58
+ secret: string,
59
+ value: unknown
60
+ ): Promise<string> => {
61
+ const crypto = globalThis.crypto
62
+ if (!crypto?.getRandomValues) {
63
+ throw new Error('WebCrypto not available')
64
+ }
65
+ const subtle = getSubtle()
66
+ const iv = crypto.getRandomValues(new Uint8Array(12))
67
+ const key = await deriveKey(secret)
68
+ const plaintext = encoder.encode(JSON.stringify(value))
69
+ const encrypted = await subtle.encrypt(
70
+ { name: 'AES-GCM', iv },
71
+ key,
72
+ plaintext
73
+ )
74
+ const cipherBytes = new Uint8Array(encrypted)
75
+ const out = new Uint8Array(iv.length + cipherBytes.length)
76
+ out.set(iv, 0)
77
+ out.set(cipherBytes, iv.length)
78
+ return toBase64Url(out)
79
+ }
80
+
81
+ export const decryptJSON = async <T>(
82
+ secret: string,
83
+ token: string
84
+ ): Promise<T> => {
85
+ const subtle = getSubtle()
86
+ const data = fromBase64Url(token)
87
+ if (data.length < 13) {
88
+ throw new Error('Invalid encrypted payload')
89
+ }
90
+ const iv = data.slice(0, 12)
91
+ const ciphertext = data.slice(12)
92
+ const key = await deriveKey(secret)
93
+ const decrypted = await subtle.decrypt(
94
+ { name: 'AES-GCM', iv },
95
+ key,
96
+ ciphertext
97
+ )
98
+ return JSON.parse(decoder.decode(new Uint8Array(decrypted))) as T
99
+ }
@@ -9,6 +9,12 @@ addError(InvalidMiddlewareWireError, {
9
9
  message: 'The middleware wire is invalid for the current wiring type.',
10
10
  })
11
11
 
12
+ export class PikkuMissingMetaError extends PikkuError {}
13
+ addError(PikkuMissingMetaError, {
14
+ status: 500,
15
+ message: 'Required metadata is missing',
16
+ })
17
+
12
18
  /**
13
19
  * The server cannot or will not process the request due to client error (e.g., malformed request syntax).
14
20
  * @group Error
@@ -345,3 +351,14 @@ addError(MaxComputeTimeReachedError, {
345
351
  message:
346
352
  'The server took too long to complete the request, reaching the maximum compute time allowed.',
347
353
  })
354
+
355
+ /**
356
+ * A required schema was not found during validation.
357
+ * @group Error
358
+ */
359
+ export class MissingSchemaError extends PikkuError {}
360
+ addError(MissingSchemaError, {
361
+ status: 500,
362
+ message:
363
+ 'A required schema was not found. Ensure schema generation has been run.',
364
+ })
@@ -1,2 +1 @@
1
- export * from './error-handler.js'
2
1
  export * from './errors.js'
@@ -1,6 +1,7 @@
1
1
  import { test } from 'node:test'
2
2
  import assert from 'node:assert'
3
3
  import {
4
+ pikkuAuth,
4
5
  pikkuPermission,
5
6
  pikkuMiddleware,
6
7
  pikkuPermissionFactory,
@@ -21,8 +22,8 @@ test('pikkuMiddleware returns the same function', async () => {
21
22
 
22
23
  test('pikkuPermissionFactory creates a factory function', async () => {
23
24
  const factory = pikkuPermissionFactory<{ role: string }>(({ role }) => {
24
- return pikkuPermission(async ({ logger }, data, { initialSession }) => {
25
- return (initialSession as any)?.role === role
25
+ return pikkuPermission(async ({ logger }, data, { session }) => {
26
+ return (session as any)?.role === role
26
27
  })
27
28
  })
28
29
 
@@ -67,3 +68,42 @@ test('pikkuMiddlewareFactory returns the same factory', async () => {
67
68
  const wrappedFactory = pikkuMiddlewareFactory(originalFactory)
68
69
  assert.strictEqual(wrappedFactory, originalFactory)
69
70
  })
71
+
72
+ test('pikkuAuth returns a 3-arg wrapper function', async () => {
73
+ const authFn = async (_services, session) => !!session
74
+ const wrapped = pikkuAuth(authFn)
75
+ assert.strictEqual(typeof wrapped, 'function')
76
+ assert.strictEqual(wrapped.length, 3)
77
+ })
78
+
79
+ test('pikkuAuth wrapper extracts session from wire and calls auth function', async () => {
80
+ let receivedSession = null
81
+ const authFn = async (_services, session) => {
82
+ receivedSession = session
83
+ return session.role === 'admin'
84
+ }
85
+ const wrapped = pikkuAuth(authFn)
86
+ const result = await wrapped({}, null, { session: { role: 'admin' } })
87
+ assert.strictEqual(result, true)
88
+ assert.deepStrictEqual(receivedSession, { role: 'admin' })
89
+ })
90
+
91
+ test('pikkuAuth wrapper returns false when no session', async () => {
92
+ const authFn = async (_services, session) => !!session
93
+ const wrapped = pikkuAuth(authFn)
94
+ const result = await wrapped({}, null, { session: null })
95
+ assert.strictEqual(result, false)
96
+ })
97
+
98
+ test('pikkuAuth config object syntax works', async () => {
99
+ const authFn = async (_services, session) => !!session
100
+ const wrapped = pikkuAuth({
101
+ func: authFn,
102
+ name: 'Is Authenticated',
103
+ description: 'Checks if user has a session',
104
+ })
105
+ assert.strictEqual(typeof wrapped, 'function')
106
+ assert.strictEqual(wrapped.length, 3)
107
+ const result = await wrapped({}, null, { session: { id: '1' } })
108
+ assert.strictEqual(result, true)
109
+ })
@@ -22,7 +22,7 @@ const addTestFunction = (funcName: string, funcConfig: any) => {
22
22
  ? funcConfig.tags.map((tag: string) => ({ type: 'tag' as const, tag }))
23
23
  : undefined
24
24
  pikkuState(null, 'function', 'meta')[funcName] = {
25
- pikkuFuncName: funcName,
25
+ pikkuFuncId: funcName,
26
26
  inputSchemaName: null,
27
27
  outputSchemaName: null,
28
28
  middleware,
@@ -152,14 +152,8 @@ describe('runPikkuFunc - Integration Tests', () => {
152
152
  )
153
153
 
154
154
  assert.equal(result, 'success')
155
- // Order: wiringTags → wiringPermissions funcTags funcPermissions
156
- assert.deepEqual(executionOrder, [
157
- 'wiringTag',
158
- 'wiringPermission',
159
- 'funcTag',
160
- 'funcPermission',
161
- 'main',
162
- ])
155
+ // Order: wiringTags → main (short-circuit on first passing group)
156
+ assert.deepEqual(executionOrder, ['wiringTag', 'main'])
163
157
  })
164
158
 
165
159
  test('should throw specific error for wiring tag permission failures', async () => {
@@ -340,11 +334,10 @@ describe('runPikkuFunc - Integration Tests', () => {
340
334
  )
341
335
 
342
336
  assert.equal(result, 'success')
343
- // Should execute tag permissions first, then function permissions
337
+ // Should execute tag permissions and short-circuit before function permissions
344
338
  assert.deepEqual(executionOrder, [
345
339
  'arrayPermission1',
346
340
  'arrayPermission2',
347
- 'objectPermission',
348
341
  'main',
349
342
  ])
350
343
  })