@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
@@ -14,4 +14,26 @@ export class LocalVariablesService implements VariablesService {
14
14
  public get(name: string): Promise<string | undefined> | string | undefined {
15
15
  return this.variables[name]
16
16
  }
17
+
18
+ public getJSON<T = unknown>(name: string): T | undefined {
19
+ const value = this.variables[name]
20
+ if (value === undefined) return undefined
21
+ return JSON.parse(value)
22
+ }
23
+
24
+ public set(name: string, value: string): void {
25
+ this.variables[name] = value
26
+ }
27
+
28
+ public setJSON(name: string, value: unknown): void {
29
+ this.variables[name] = JSON.stringify(value)
30
+ }
31
+
32
+ public has(name: string): boolean {
33
+ return name in this.variables && this.variables[name] !== undefined
34
+ }
35
+
36
+ public delete(name: string): void {
37
+ delete this.variables[name]
38
+ }
17
39
  }
@@ -1,4 +1,5 @@
1
- import { CoreUserSession } from '../types/core.types.js'
1
+ import type { CoreUserSession } from '../types/core.types.js'
2
+ import type { Logger } from './logger.js'
2
3
 
3
4
  /**
4
5
  * Minimal metadata for listing scheduled tasks
@@ -24,6 +25,16 @@ export interface ScheduledTaskInfo extends ScheduledTaskSummary {
24
25
  status?: 'scheduled' | 'active' | 'completed' | 'failed'
25
26
  }
26
27
 
28
+ export interface SchedulerRuntimeHandlers {
29
+ logger: Logger
30
+ invokeRPC: (
31
+ rpcName: string,
32
+ data?: any,
33
+ session?: CoreUserSession
34
+ ) => Promise<void>
35
+ runScheduledTask: (name: string) => Promise<void>
36
+ }
37
+
27
38
  /**
28
39
  * Abstract scheduler service for persistent scheduled task management
29
40
  * Implementations use queue backends (pg-boss, BullMQ) for distributed scheduling
@@ -73,4 +84,21 @@ export abstract class SchedulerService {
73
84
  * Close any open connections
74
85
  */
75
86
  abstract close(): Promise<void>
87
+
88
+ /**
89
+ * Set services needed for processing recurring tasks.
90
+ * Called after construction since the scheduler is created before
91
+ * singletonServices are fully assembled.
92
+ */
93
+ setServices(_handlers: SchedulerRuntimeHandlers): void {}
94
+
95
+ /**
96
+ * Start recurring scheduled tasks
97
+ */
98
+ async start(): Promise<void> {}
99
+
100
+ /**
101
+ * Stop recurring scheduled tasks
102
+ */
103
+ async stop(): Promise<void> {}
76
104
  }
@@ -23,4 +23,11 @@ export interface SchemaService {
23
23
  * @returns {Set<string>} A set containing the names of all available schemas.
24
24
  */
25
25
  getSchemaNames: () => Set<string>
26
+
27
+ /**
28
+ * Retrieves the property keys from a compiled JSON schema.
29
+ * @param {string} schemaName - The name of the schema.
30
+ * @returns {string[]} An array of property keys, or empty array if schema not found.
31
+ */
32
+ getSchemaKeys: (schemaName: string) => string[]
26
33
  }
@@ -0,0 +1,41 @@
1
+ import { SecretService } from './secret-service.js'
2
+
3
+ /**
4
+ * A read-only wrapper around SecretService that restricts access
5
+ * to only a defined set of allowed secret keys.
6
+ */
7
+ export class ScopedSecretService implements SecretService {
8
+ constructor(
9
+ private secrets: SecretService,
10
+ private allowedKeys: Set<string>
11
+ ) {}
12
+
13
+ private assertAllowed(key: string): void {
14
+ if (!this.allowedKeys.has(key)) {
15
+ throw new Error(`Access denied to secret key: ${key}`)
16
+ }
17
+ }
18
+
19
+ async getSecret(key: string): Promise<string> {
20
+ this.assertAllowed(key)
21
+ return this.secrets.getSecret(key)
22
+ }
23
+
24
+ async getSecretJSON<T = {}>(key: string): Promise<T> {
25
+ this.assertAllowed(key)
26
+ return this.secrets.getSecretJSON<T>(key)
27
+ }
28
+
29
+ async hasSecret(key: string): Promise<boolean> {
30
+ this.assertAllowed(key)
31
+ return this.secrets.hasSecret(key)
32
+ }
33
+
34
+ async setSecretJSON(_key: string, _value: unknown): Promise<void> {
35
+ throw new Error('setSecretJSON is not allowed in scoped secret service')
36
+ }
37
+
38
+ async deleteSecret(_key: string): Promise<void> {
39
+ throw new Error('deleteSecret is not allowed in scoped secret service')
40
+ }
41
+ }
@@ -1,17 +1,38 @@
1
1
  /**
2
- * Interface for retrieving secrets.
2
+ * Interface for retrieving and managing secrets.
3
3
  */
4
4
  export interface SecretService {
5
5
  /**
6
- * Retrieves a secret by key.
6
+ * Retrieves a secret by key and parses it as JSON.
7
7
  * @param key - The key of the secret to retrieve.
8
- * @returns A promise that resolves to the secret value.
8
+ * @returns A promise that resolves to the parsed secret value.
9
+ * @throws If the secret is not found.
9
10
  */
10
11
  getSecretJSON<Return = {}>(key: string): Promise<Return>
11
12
  /**
12
- * Retrieves a secret by key.
13
+ * Retrieves a secret by key as a string.
13
14
  * @param key - The key of the secret to retrieve.
14
15
  * @returns A promise that resolves to the secret value.
16
+ * @throws If the secret is not found.
15
17
  */
16
18
  getSecret(key: string): Promise<string>
19
+ /**
20
+ * Checks if a secret exists without throwing.
21
+ * @param key - The key of the secret to check.
22
+ * @returns A promise that resolves to true if the secret exists, false otherwise.
23
+ */
24
+ hasSecret(key: string): Promise<boolean>
25
+ /**
26
+ * Stores a JSON value as a secret.
27
+ * @param key - The key to store the secret under.
28
+ * @param value - The JSON value to store.
29
+ * @returns A promise that resolves when the secret is stored.
30
+ */
31
+ setSecretJSON(key: string, value: unknown): Promise<void>
32
+ /**
33
+ * Deletes a secret by key.
34
+ * @param key - The key of the secret to delete.
35
+ * @returns A promise that resolves when the secret is deleted.
36
+ */
37
+ deleteSecret(key: string): Promise<void>
17
38
  }
@@ -0,0 +1,38 @@
1
+ import {
2
+ CoreSingletonServices,
3
+ CreateWireServices,
4
+ CoreServices,
5
+ CoreUserSession,
6
+ } from '../types/core.types.js'
7
+
8
+ /**
9
+ * Abstract TriggerService interface.
10
+ *
11
+ * Implementations manage trigger subscriptions — listening to external events
12
+ * and dispatching to RPC targets or workflow starts.
13
+ */
14
+ export interface TriggerService {
15
+ /**
16
+ * Set services needed for processing triggers.
17
+ * Called after construction since the trigger service is created before
18
+ * singletonServices are fully assembled.
19
+ */
20
+ setServices(
21
+ _singletonServices: CoreSingletonServices,
22
+ _createWireServices?: CreateWireServices<
23
+ CoreSingletonServices,
24
+ CoreServices,
25
+ CoreUserSession
26
+ >
27
+ ): void
28
+
29
+ /**
30
+ * Start all triggers
31
+ */
32
+ start(): Promise<void>
33
+
34
+ /**
35
+ * Stop all triggers
36
+ */
37
+ stop(): Promise<void>
38
+ }
@@ -0,0 +1,70 @@
1
+ import type { SecretService } from './secret-service.js'
2
+
3
+ export interface CredentialStatus {
4
+ secretId: string
5
+ name: string
6
+ displayName: string
7
+ isConfigured: boolean
8
+ oauth2?: { tokenSecretId: string }
9
+ }
10
+
11
+ export type CredentialMeta = {
12
+ name: string
13
+ displayName: string
14
+ oauth2?: { tokenSecretId: string }
15
+ }
16
+
17
+ export class TypedSecretService<TMap = Record<string, unknown>>
18
+ implements SecretService
19
+ {
20
+ constructor(
21
+ private secrets: SecretService,
22
+ private credentialsMeta: Record<string, CredentialMeta>
23
+ ) {}
24
+
25
+ async getSecretJSON<K extends keyof TMap & string>(key: K): Promise<TMap[K]>
26
+ async getSecretJSON<T = unknown>(key: string): Promise<T>
27
+ async getSecretJSON(key: string): Promise<unknown> {
28
+ return this.secrets.getSecretJSON(key)
29
+ }
30
+
31
+ async getSecret(key: string): Promise<string> {
32
+ return this.secrets.getSecret(key)
33
+ }
34
+
35
+ async hasSecret(key: string): Promise<boolean> {
36
+ return this.secrets.hasSecret(key)
37
+ }
38
+
39
+ async setSecretJSON<K extends string>(
40
+ key: K,
41
+ value: K extends keyof TMap ? TMap[K] : unknown
42
+ ): Promise<void> {
43
+ return this.secrets.setSecretJSON(key, value)
44
+ }
45
+
46
+ async deleteSecret(key: string): Promise<void> {
47
+ return this.secrets.deleteSecret(key)
48
+ }
49
+
50
+ async getAllStatus(): Promise<CredentialStatus[]> {
51
+ const results: CredentialStatus[] = []
52
+
53
+ for (const [secretId, meta] of Object.entries(this.credentialsMeta)) {
54
+ results.push({
55
+ secretId,
56
+ name: meta.name,
57
+ displayName: meta.displayName,
58
+ isConfigured: await this.secrets.hasSecret(secretId),
59
+ oauth2: meta.oauth2,
60
+ })
61
+ }
62
+
63
+ return results
64
+ }
65
+
66
+ async getMissing(): Promise<CredentialStatus[]> {
67
+ const all = await this.getAllStatus()
68
+ return all.filter((c) => !c.isConfigured)
69
+ }
70
+ }
@@ -0,0 +1,81 @@
1
+ import type { VariablesService } from './variables-service.js'
2
+
3
+ export interface VariableStatus {
4
+ variableId: string
5
+ name: string
6
+ displayName: string
7
+ isConfigured: boolean
8
+ }
9
+
10
+ export type VariableMeta = {
11
+ name: string
12
+ displayName: string
13
+ }
14
+
15
+ export class TypedVariablesService<TMap = Record<string, unknown>>
16
+ implements VariablesService
17
+ {
18
+ constructor(
19
+ private variables: VariablesService,
20
+ private variablesMeta: Record<string, VariableMeta>
21
+ ) {}
22
+
23
+ get(
24
+ name: keyof TMap & string
25
+ ): Promise<string | undefined> | string | undefined
26
+ get(name: string): Promise<string | undefined> | string | undefined
27
+ get(name: string): Promise<string | undefined> | string | undefined {
28
+ return this.variables.get(name)
29
+ }
30
+
31
+ getJSON<K extends keyof TMap & string>(
32
+ name: K
33
+ ): Promise<TMap[K] | undefined> | TMap[K] | undefined
34
+ getJSON<T = unknown>(name: string): Promise<T | undefined> | T | undefined
35
+ getJSON(name: string): Promise<unknown> | unknown {
36
+ return this.variables.getJSON(name)
37
+ }
38
+
39
+ getAll():
40
+ | Promise<Record<string, string | undefined>>
41
+ | Record<string, string | undefined> {
42
+ return this.variables.getAll()
43
+ }
44
+
45
+ set(name: string, value: string): Promise<void> | void {
46
+ return this.variables.set(name, value)
47
+ }
48
+
49
+ setJSON(name: string, value: unknown): Promise<void> | void {
50
+ return this.variables.setJSON(name, value)
51
+ }
52
+
53
+ has(name: string): Promise<boolean> | boolean {
54
+ return this.variables.has(name)
55
+ }
56
+
57
+ delete(name: string): Promise<void> | void {
58
+ return this.variables.delete(name)
59
+ }
60
+
61
+ async getAllStatus(): Promise<VariableStatus[]> {
62
+ const results: VariableStatus[] = []
63
+ const all = await this.variables.getAll()
64
+
65
+ for (const [variableId, meta] of Object.entries(this.variablesMeta)) {
66
+ results.push({
67
+ variableId,
68
+ name: meta.name,
69
+ displayName: meta.displayName,
70
+ isConfigured: all[variableId] !== undefined,
71
+ })
72
+ }
73
+
74
+ return results
75
+ }
76
+
77
+ async getMissing(): Promise<VariableStatus[]> {
78
+ const all = await this.getAllStatus()
79
+ return all.filter((v) => !v.isConfigured)
80
+ }
81
+ }
@@ -61,3 +61,26 @@ export class PikkuSessionService<UserSession extends CoreUserSession>
61
61
  return this.session
62
62
  }
63
63
  }
64
+
65
+ export function createMiddlewareSessionWireProps<
66
+ UserSession extends CoreUserSession,
67
+ >(session: SessionService<UserSession>) {
68
+ return {
69
+ session: session.get(),
70
+ setSession: (s: UserSession) => session.setInitial(s),
71
+ getSession: () => session.get(),
72
+ hasSessionChanged: () => session.sessionChanged,
73
+ }
74
+ }
75
+
76
+ export function createFunctionSessionWireProps<
77
+ UserSession extends CoreUserSession,
78
+ >(session: SessionService<UserSession>) {
79
+ return {
80
+ session: session.freezeInitial(),
81
+ setSession: (s: UserSession) => session.set(s),
82
+ clearSession: () => session.clear(),
83
+ getSession: () => session.get(),
84
+ hasSessionChanged: () => session.sessionChanged,
85
+ }
86
+ }
@@ -1,6 +1,11 @@
1
1
  export interface VariablesService {
2
2
  get: (name: string) => Promise<string | undefined> | string | undefined
3
+ getJSON: <T = unknown>(name: string) => Promise<T | undefined> | T | undefined
3
4
  getAll: () =>
4
5
  | Promise<Record<string, string | undefined>>
5
6
  | Record<string, string | undefined>
7
+ set: (name: string, value: string) => Promise<void> | void
8
+ setJSON: (name: string, value: unknown) => Promise<void> | void
9
+ has: (name: string) => Promise<boolean> | boolean
10
+ delete: (name: string) => Promise<void> | void
6
11
  }
@@ -6,6 +6,7 @@ import {
6
6
  } from '../types/core.types.js'
7
7
  import {
8
8
  WorkflowRun,
9
+ WorkflowRunWire,
9
10
  StepState,
10
11
  WorkflowStatus,
11
12
  } from '../wirings/workflow/workflow.types.js'
@@ -16,7 +17,13 @@ import {
16
17
  */
17
18
  export interface WorkflowService {
18
19
  // Run-level state operations
19
- createRun(workflowName: string, input: any, inline?: boolean): Promise<string>
20
+ createRun(
21
+ workflowName: string,
22
+ input: any,
23
+ inline: boolean,
24
+ graphHash: string,
25
+ wire: WorkflowRunWire
26
+ ): Promise<string>
20
27
  getRun(id: string): Promise<WorkflowRun | null>
21
28
  getRunHistory(runId: string): Promise<Array<StepState & { stepName: string }>>
22
29
  updateRunStatus(
@@ -32,12 +39,13 @@ export interface WorkflowService {
32
39
  resumeWorkflow(runId: string): Promise<void>
33
40
  setServices(
34
41
  singletonServices: CoreSingletonServices,
35
- createWireServices: CreateWireServices,
42
+ createWireServices: CreateWireServices | undefined,
36
43
  config: CoreConfig
37
44
  ): void
38
45
  startWorkflow<I>(
39
46
  name: string,
40
47
  input: I,
48
+ wire: WorkflowRunWire,
41
49
  rpcService: any,
42
50
  options?: { inline?: boolean; startNode?: string }
43
51
  ): Promise<{ runId: string }>
@@ -71,4 +79,16 @@ export interface WorkflowService {
71
79
  data: any,
72
80
  rpcService: any
73
81
  ): Promise<void>
82
+
83
+ // Version operations
84
+ upsertWorkflowVersion(
85
+ name: string,
86
+ graphHash: string,
87
+ graph: any,
88
+ source: string
89
+ ): Promise<void>
90
+ getWorkflowVersion(
91
+ name: string,
92
+ graphHash: string
93
+ ): Promise<{ graph: any; source: string } | null>
74
94
  }
@@ -4,8 +4,11 @@ import { SecretService } from '../services/secret-service.js'
4
4
  import { SchemaService } from '../services/schema-service.js'
5
5
  import { JWTService } from '../services/jwt-service.js'
6
6
  import { PikkuHTTP } from '../wirings/http/http.types.js'
7
- import { SessionService } from '../services/user-session-service.js'
8
- import { PikkuChannel } from '../wirings/channel/channel.types.js'
7
+ import {
8
+ PikkuChannel,
9
+ CorePikkuChannelMiddleware,
10
+ CorePikkuChannelMiddlewareFactory,
11
+ } from '../wirings/channel/channel.types.js'
9
12
  import { PikkuRPC } from '../wirings/rpc/rpc-types.js'
10
13
  import { PikkuMCP } from '../wirings/mcp/mcp.types.js'
11
14
  import { PikkuScheduledTask } from '../wirings/scheduler/scheduler.types.js'
@@ -20,22 +23,35 @@ import {
20
23
  import type { PikkuGraphWire } from '../wirings/workflow/graph/workflow-graph.types.js'
21
24
  import { PikkuTrigger } from '../wirings/trigger/trigger.types.js'
22
25
  import { SchedulerService } from '../services/scheduler-service.js'
26
+ import { DeploymentService } from '../services/deployment-service.js'
27
+ import { AIStorageService } from '../services/ai-storage-service.js'
28
+
29
+ import { AIAgentRunnerService } from '../services/ai-agent-runner-service.js'
30
+ import { AIRunStateService } from '../services/ai-run-state-service.js'
31
+ import type { PikkuAIMiddlewareHooks } from '../wirings/ai-agent/ai-agent.types.js'
23
32
 
24
33
  export type PikkuWiringTypes =
25
34
  | 'http'
26
35
  | 'scheduler'
36
+ | 'trigger'
27
37
  | 'channel'
28
38
  | 'rpc'
29
39
  | 'queue'
30
40
  | 'mcp'
31
41
  | 'cli'
32
42
  | 'workflow'
43
+ | 'agent'
33
44
 
34
45
  export interface FunctionServicesMeta {
35
46
  optimized: boolean
36
47
  services: string[]
37
48
  }
38
49
 
50
+ export interface FunctionWiresMeta {
51
+ optimized: boolean
52
+ wires: string[]
53
+ }
54
+
39
55
  /**
40
56
  * Metadata for middleware at any level
41
57
  * - type: 'http' = HTTP route middleware group (references httpGroup in pikkuState)
@@ -79,19 +95,26 @@ export type PermissionMetadata =
79
95
  }
80
96
 
81
97
  export type FunctionRuntimeMeta = {
82
- pikkuFuncName: string
98
+ pikkuFuncId: string
83
99
  inputSchemaName: string | null
84
100
  outputSchemaName: string | null
85
101
  expose?: boolean
86
- internal?: boolean
102
+ remote?: boolean
103
+ mcp?: boolean
104
+ sessionless?: boolean
105
+ version?: number
106
+ requiresApproval?: boolean
107
+ contractHash?: string
87
108
  }
88
109
 
89
110
  export type FunctionMeta = FunctionRuntimeMeta &
90
111
  Partial<
91
112
  {
92
113
  name: string
114
+ functionType: 'user' | 'inline' | 'helper'
115
+ funcWrapper: string
93
116
  services: FunctionServicesMeta
94
- usedWires: string[]
117
+ wires: FunctionWiresMeta
95
118
  inputs: string[] | null
96
119
  outputs: string[] | null
97
120
  middleware: MiddlewareMetadata[]
@@ -180,6 +203,15 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
180
203
  queueService?: QueueService
181
204
  /** The scheduler service */
182
205
  schedulerService?: SchedulerService
206
+ /** The deployment service for service discovery */
207
+ deploymentService?: DeploymentService
208
+ /** AI agent storage service (threads, messages, working memory) */
209
+ aiStorage?: AIStorageService
210
+
211
+ /** AI agent runner service (model calls + tool loop) */
212
+ aiAgentRunner?: AIAgentRunnerService
213
+ /** AI run state service (run lifecycle + approval persistence) */
214
+ aiRunState?: AIRunStateService
183
215
  }
184
216
 
185
217
  /**
@@ -196,6 +228,8 @@ export type PikkuWire<
196
228
  TypedWorkflow extends PikkuWorkflowWire | never = PikkuWorkflowWire,
197
229
  TriggerOutput = unknown,
198
230
  > = Partial<{
231
+ wireType: PikkuWiringTypes
232
+ wireId: string
199
233
  http: PikkuHTTP<In>
200
234
  mcp: PikkuMCP<MCPTools>
201
235
  rpc: TypedRPC
@@ -209,10 +243,17 @@ export type PikkuWire<
209
243
  workflowStep: WorkflowStepWire
210
244
  graph: PikkuGraphWire
211
245
  trigger: PikkuTrigger<TriggerOutput>
212
- initialSession: HasInitialSession extends true
246
+ session: HasInitialSession extends true
213
247
  ? UserSession
214
248
  : UserSession | undefined
215
- session: SessionService<UserSession>
249
+ /** Update and persist the current session */
250
+ setSession: (session: CoreUserSession) => Promise<void> | void
251
+ /** Clear and persist the current session */
252
+ clearSession: () => Promise<void> | void
253
+ /** Fetch the latest session (may read from backing store) */
254
+ getSession: () => Promise<UserSession> | UserSession | undefined
255
+ /** Whether the session was modified during this run */
256
+ hasSessionChanged: () => boolean
216
257
  }>
217
258
 
218
259
  /**
@@ -239,8 +280,8 @@ export type CorePikkuMiddlewareConfig<
239
280
  > = {
240
281
  /** The middleware function */
241
282
  func: CorePikkuMiddleware<SingletonServices, UserSession>
242
- /** Optional human-readable title for the middleware */
243
- title?: string
283
+ /** Optional human-readable name for the middleware */
284
+ name?: string
244
285
  /** Optional description of what the middleware does */
245
286
  description?: string
246
287
  }
@@ -283,7 +324,7 @@ export type CorePikkuMiddlewareGroup<
283
324
  *
284
325
  * // Configuration object syntax with metadata
285
326
  * export const logMiddleware = pikkuMiddleware({
286
- * title: 'Request Logger',
327
+ * name: 'Request Logger',
287
328
  * description: 'Logs request information',
288
329
  * func: async ({ logger }, next) => {
289
330
  * logger.info('Request started')
@@ -326,6 +367,30 @@ export const pikkuMiddlewareFactory = <In = any>(
326
367
  return factory
327
368
  }
328
369
 
370
+ export const pikkuChannelMiddleware = <
371
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
372
+ Event = unknown,
373
+ >(
374
+ middleware: CorePikkuChannelMiddleware<SingletonServices, Event>
375
+ ): CorePikkuChannelMiddleware<SingletonServices, Event> => {
376
+ return middleware
377
+ }
378
+
379
+ export const pikkuChannelMiddlewareFactory = <In = any>(
380
+ factory: CorePikkuChannelMiddlewareFactory<In>
381
+ ): CorePikkuChannelMiddlewareFactory<In> => {
382
+ return factory
383
+ }
384
+
385
+ export type { PikkuAIMiddlewareHooks } from '../wirings/ai-agent/ai-agent.types.js'
386
+
387
+ export const pikkuAIMiddleware = <
388
+ State extends Record<string, unknown> = Record<string, unknown>,
389
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
390
+ >(
391
+ hooks: PikkuAIMiddlewareHooks<State, SingletonServices>
392
+ ): PikkuAIMiddlewareHooks<State, SingletonServices> => hooks
393
+
329
394
  /**
330
395
  * Represents the core services used by Pikku, including singleton services.
331
396
  */
@@ -373,7 +438,7 @@ export type CreateConfig<
373
438
  * Represents the documentation for a route, including summary, description, tags, and errors.
374
439
  */
375
440
  export type CommonWireMeta = {
376
- pikkuFuncName: string
441
+ pikkuFuncId: string
377
442
 
378
443
  title?: string
379
444
  tags?: string[]