@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
@@ -1,19 +1,66 @@
1
- import { CoreServices, PikkuWire } from '../../types/core.types.js'
1
+ import {
2
+ CoreServices,
3
+ CoreSingletonServices,
4
+ PikkuWire,
5
+ } from '../../types/core.types.js'
6
+ import type { SessionService } from '../../services/user-session-service.js'
7
+ import type { CoreUserSession } from '../../types/core.types.js'
2
8
  import { runPikkuFunc } from '../../function/function-runner.js'
3
9
  import { pikkuState } from '../../pikku-state.js'
4
10
  import { ForbiddenError } from '../../errors/errors.js'
5
- import { PikkuRPC } from './rpc-types.js'
11
+ import { PikkuError } from '../../errors/error-handler.js'
12
+ import { PikkuRPC, ResolvedFunction } from './rpc-types.js'
13
+ import { parseVersionedId } from '../../version.js'
14
+ import { encryptJSON } from '../../crypto-utils.js'
6
15
 
7
- // Type for the RPC service configuration
8
- type RPCServiceConfig = {
9
- coerceDataFromSchema: boolean
16
+ export class RPCNotFoundError extends PikkuError {
17
+ public readonly rpcName: string
18
+ constructor(rpcName: string) {
19
+ super(`RPC function not found: ${rpcName}`)
20
+ this.rpcName = rpcName
21
+ }
22
+ }
23
+ import type { AIAgentInput } from '../ai-agent/ai-agent.types.js'
24
+ import { runAIAgent } from '../ai-agent/ai-agent-runner.js'
25
+
26
+ /**
27
+ * Resolve a namespaced function reference to package and function names
28
+ * Uses pikkuState to look up the namespace -> package mapping
29
+ */
30
+ const resolveNamespace = (
31
+ namespacedFunction: string
32
+ ): ResolvedFunction | null => {
33
+ const colonIndex = namespacedFunction.indexOf(':')
34
+ if (colonIndex === -1) {
35
+ return null
36
+ }
37
+
38
+ const namespace = namespacedFunction.substring(0, colonIndex)
39
+ const functionName = namespacedFunction.substring(colonIndex + 1)
40
+
41
+ const externalPackages = pikkuState(null, 'rpc', 'externalPackages')
42
+ const pkgConfig = externalPackages.get(namespace)
43
+ if (!pkgConfig) {
44
+ return null
45
+ }
46
+
47
+ return {
48
+ package: pkgConfig.package,
49
+ function: functionName,
50
+ }
10
51
  }
11
52
 
12
53
  const getPikkuFunctionName = (rpcName: string): string => {
13
- const rpc = pikkuState('rpc', 'meta')
14
- const rpcMeta = rpc[rpcName]
54
+ const rpc = pikkuState(null, 'rpc', 'meta')
55
+ let rpcMeta = rpc[rpcName]
15
56
  if (!rpcMeta) {
16
- throw new Error(`RPC function not found: ${rpcName}`)
57
+ const { baseName, version } = parseVersionedId(rpcName)
58
+ if (version !== null) {
59
+ rpcMeta = rpc[baseName]
60
+ }
61
+ }
62
+ if (!rpcMeta) {
63
+ throw new RPCNotFoundError(rpcName)
17
64
  }
18
65
  return rpcMeta
19
66
  }
@@ -24,13 +71,23 @@ export class ContextAwareRPCService {
24
71
  private services: CoreServices,
25
72
  private wire: PikkuWire,
26
73
  private options: {
27
- coerceDataFromSchema?: boolean
28
74
  requiresAuth?: boolean
75
+ sessionService?: SessionService<CoreUserSession>
29
76
  }
30
77
  ) {}
31
78
 
32
79
  public async rpcExposed(funcName: string, data: any): Promise<any> {
33
- const functionMeta = pikkuState('function', 'meta')[funcName]
80
+ let functionMeta: any
81
+ if (funcName.includes(':')) {
82
+ const resolved = resolveNamespace(funcName)
83
+ if (resolved) {
84
+ functionMeta = pikkuState(resolved.package, 'function', 'meta')[
85
+ resolved.function
86
+ ]
87
+ }
88
+ } else {
89
+ functionMeta = pikkuState(null, 'function', 'meta')[funcName]
90
+ }
34
91
  if (!functionMeta) {
35
92
  throw new Error(`Function not found: ${funcName}`)
36
93
  }
@@ -55,22 +112,79 @@ export class ContextAwareRPCService {
55
112
  }
56
113
  : undefined,
57
114
  }
115
+
116
+ // Check if it's a namespaced function call (e.g., 'stripe:createCharge')
117
+ if (funcName.includes(':')) {
118
+ return this.invokeExternalPackageFunction<In, Out>(
119
+ funcName,
120
+ data,
121
+ updatedWire
122
+ )
123
+ }
124
+
125
+ // Main package function
58
126
  return runPikkuFunc<In, Out>(
59
127
  'rpc',
60
128
  funcName,
61
129
  getPikkuFunctionName(funcName),
62
130
  {
63
131
  auth: this.options.requiresAuth,
64
- // TODO: this is a hack since services have already been created
65
- // but is valid since we don't want to keep creating new wire services
66
132
  singletonServices: this.services,
67
133
  data: () => data,
68
- coerceDataFromSchema: this.options.coerceDataFromSchema,
69
134
  wire: updatedWire,
70
135
  }
71
136
  )
72
137
  }
73
138
 
139
+ /**
140
+ * Invoke a function from an external package
141
+ * External packages register their functions in pikkuState under their package name.
142
+ * The function is executed using the parent services (shared singleton services).
143
+ * @private
144
+ */
145
+ private async invokeExternalPackageFunction<In = any, Out = any>(
146
+ namespacedFunction: string,
147
+ data: In,
148
+ wire: PikkuWire
149
+ ): Promise<Out> {
150
+ // Resolve namespace to package name
151
+ const resolved = resolveNamespace(namespacedFunction)
152
+ if (!resolved) {
153
+ throw new Error(
154
+ `Unknown namespace in function reference: ${namespacedFunction}. ` +
155
+ `Make sure the package is registered in externalPackages config.`
156
+ )
157
+ }
158
+
159
+ // Get the function meta from the external package
160
+ // External packages use function meta, not RPC meta
161
+ const externalFunctionMeta = pikkuState(
162
+ resolved.package,
163
+ 'function',
164
+ 'meta'
165
+ )
166
+ const funcMeta = externalFunctionMeta[resolved.function]
167
+ if (!funcMeta) {
168
+ throw new Error(
169
+ `Function '${resolved.function}' not found in package '${resolved.package}'. ` +
170
+ `Available functions: ${Object.keys(externalFunctionMeta).join(', ') || '(none)'}`
171
+ )
172
+ }
173
+ const funcName = funcMeta.pikkuFuncId || resolved.function
174
+
175
+ // Execute the function using runPikkuFunc with the external package's state
176
+ // We use the parent services (this.services) since external packages share services
177
+ // Pass the function's tags so tag-based middleware/permissions are applied
178
+ return runPikkuFunc<In, Out>('rpc', namespacedFunction, funcName, {
179
+ auth: this.options.requiresAuth,
180
+ singletonServices: this.services,
181
+ data: () => data,
182
+ wire,
183
+ packageName: resolved.package,
184
+ tags: funcMeta.tags,
185
+ })
186
+ }
187
+
74
188
  public async rpcWithWire<In = any, Out = any>(
75
189
  rpcName: string,
76
190
  data: In,
@@ -96,7 +210,6 @@ export class ContextAwareRPCService {
96
210
  auth: this.options.requiresAuth,
97
211
  singletonServices: this.services,
98
212
  data: () => data,
99
- coerceDataFromSchema: this.options.coerceDataFromSchema,
100
213
  wire: mergedWire,
101
214
  }
102
215
  )
@@ -104,17 +217,142 @@ export class ContextAwareRPCService {
104
217
 
105
218
  public async startWorkflow<In = any>(
106
219
  workflowName: string,
107
- input: In
220
+ input: In,
221
+ options?: {
222
+ startNode?: string
223
+ wire?: { type: string; id?: string; parentRunId?: string }
224
+ }
108
225
  ): Promise<{ runId: string }> {
109
226
  if (!this.services.workflowService) {
110
227
  throw new Error('WorkflowService service not available')
111
228
  }
229
+ const parentRunId = this.wire.workflowStep?.runId ?? this.wire.graph?.runId
230
+ const wire = options?.wire ?? {
231
+ type: this.wire.wireType ?? 'unknown',
232
+ id: this.wire.wireId,
233
+ ...(parentRunId ? { parentRunId } : {}),
234
+ }
112
235
  return this.services.workflowService.startWorkflow(
113
236
  workflowName,
114
237
  input,
115
- this
238
+ wire,
239
+ this,
240
+ options
116
241
  )
117
242
  }
243
+
244
+ public async agent(
245
+ agentName: string,
246
+ input: AIAgentInput
247
+ ): Promise<{
248
+ runId: string
249
+ result: unknown
250
+ usage: { inputTokens: number; outputTokens: number }
251
+ }> {
252
+ const result = await runAIAgent(agentName, input, {
253
+ singletonServices: this.services as CoreSingletonServices,
254
+ sessionService: this.options.sessionService,
255
+ })
256
+ return {
257
+ runId: result.runId,
258
+ result: result.object ?? result.text,
259
+ usage: result.usage,
260
+ }
261
+ }
262
+
263
+ public async remote<In = any, Out = any>(
264
+ funcName: string,
265
+ data: In
266
+ ): Promise<Out> {
267
+ let endpoint: string | undefined
268
+ const headers: Record<string, string> = {
269
+ 'Content-Type': 'application/json',
270
+ }
271
+
272
+ const colonIndex = funcName.indexOf(':')
273
+ if (colonIndex !== -1) {
274
+ const namespace = funcName.substring(0, colonIndex)
275
+ const externalPackages = pikkuState(null, 'rpc', 'externalPackages')
276
+ const pkgConfig = externalPackages.get(namespace)
277
+ endpoint = pkgConfig?.rpcEndpoint
278
+ }
279
+
280
+ if (!endpoint && this.services.deploymentService) {
281
+ const deployments =
282
+ await this.services.deploymentService.findFunction(funcName)
283
+ if (deployments.length > 0) {
284
+ endpoint = deployments[0].endpoint
285
+ }
286
+ }
287
+
288
+ if (!endpoint) {
289
+ throw new Error(
290
+ `No endpoint configured for remote RPC: ${funcName}. ` +
291
+ `Configure rpcEndpoint in externalPackages config or set up a DeploymentService.`
292
+ )
293
+ }
294
+
295
+ let secret: string | undefined
296
+ if (this.services.secrets) {
297
+ try {
298
+ secret = await this.services.secrets.getSecret('PIKKU_REMOTE_SECRET')
299
+ } catch {}
300
+ }
301
+ if (secret) {
302
+ if (!this.services.jwt) {
303
+ throw new Error(
304
+ 'PIKKU_REMOTE_SECRET is set but JWT service is not available'
305
+ )
306
+ }
307
+ const session =
308
+ this.wire.getSession && typeof this.wire.getSession === 'function'
309
+ ? await this.wire.getSession()
310
+ : (this.wire as any).session
311
+ const sessionEnc = session
312
+ ? await encryptJSON(secret, { session })
313
+ : undefined
314
+ const token = await this.services.jwt.encode(
315
+ { value: 5, unit: 'minute' },
316
+ {
317
+ aud: 'pikku-remote',
318
+ fn: funcName,
319
+ iat: Date.now(),
320
+ session: sessionEnc,
321
+ }
322
+ )
323
+ headers.Authorization = `Bearer ${token}`
324
+ }
325
+
326
+ const url = `${endpoint}/rpc/${encodeURIComponent(funcName)}`
327
+ const timeoutMs = 30_000
328
+ const response = await fetch(url, {
329
+ method: 'POST',
330
+ headers,
331
+ body: JSON.stringify({ data }),
332
+ signal: AbortSignal.timeout(timeoutMs),
333
+ })
334
+
335
+ if (!response.ok) {
336
+ let errorBody: string
337
+ try {
338
+ errorBody = JSON.stringify(await response.json())
339
+ } catch {
340
+ errorBody = await response.text()
341
+ }
342
+ throw new Error(
343
+ `Remote RPC call failed: ${response.status} ${response.statusText}. ${errorBody}`
344
+ )
345
+ }
346
+
347
+ try {
348
+ return (await response.json()) as Out
349
+ } catch {
350
+ const text = await response.text()
351
+ throw new Error(
352
+ `Remote RPC call returned non-JSON response: ${response.status} ${response.statusText}. ${text}`
353
+ )
354
+ }
355
+ }
118
356
  }
119
357
 
120
358
  // RPC Service class for the global interface
@@ -122,30 +360,33 @@ export class PikkuRPCService<
122
360
  Services extends CoreServices,
123
361
  TypedRPC = PikkuRPC,
124
362
  > {
125
- private config?: RPCServiceConfig
126
-
127
- // Initialize the RPC service with configuration
128
- initialize(config: RPCServiceConfig) {
129
- this.config = config
130
- }
131
-
132
363
  // Convenience function for initializing
133
364
  getContextRPCService(
134
365
  services: Services,
135
366
  wire: PikkuWire,
136
- requiresAuth?: boolean | undefined,
367
+ requiresAuthOrOptions?:
368
+ | boolean
369
+ | {
370
+ requiresAuth?: boolean
371
+ sessionService?: SessionService<CoreUserSession>
372
+ }
373
+ | undefined,
137
374
  depth: number = 0
138
375
  ): TypedRPC {
139
- const serviceRPC = new ContextAwareRPCService(services, wire, {
140
- coerceDataFromSchema: this.config?.coerceDataFromSchema,
141
- requiresAuth,
142
- })
376
+ const options =
377
+ typeof requiresAuthOrOptions === 'object' &&
378
+ requiresAuthOrOptions !== null
379
+ ? requiresAuthOrOptions
380
+ : { requiresAuth: requiresAuthOrOptions }
381
+ const serviceRPC = new ContextAwareRPCService(services, wire, options)
143
382
  return {
144
383
  depth,
145
384
  global: false,
146
385
  invoke: serviceRPC.rpc.bind(serviceRPC),
147
- invokeExposed: serviceRPC.rpc.bind(serviceRPC),
386
+ remote: serviceRPC.remote.bind(serviceRPC),
387
+ exposed: serviceRPC.rpcExposed.bind(serviceRPC),
148
388
  startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
389
+ agent: serviceRPC.agent.bind(serviceRPC),
149
390
  rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
150
391
  } as any
151
392
  }
@@ -153,8 +394,3 @@ export class PikkuRPCService<
153
394
 
154
395
  // Create a singleton instance
155
396
  export const rpcService = new PikkuRPCService()
156
-
157
- // Convenience function for initializing
158
- export const initialize = (config: RPCServiceConfig) => {
159
- rpcService.initialize(config)
160
- }
@@ -1,13 +1,22 @@
1
- export type PikkuRPC<invoke extends Function = any> = {
1
+ export type PikkuRPC<
2
+ Invoke extends Function = any,
3
+ Remote extends Function = any,
4
+ startWorkflow extends Function = any,
5
+ Agent extends Function = any,
6
+ > = {
2
7
  depth: number
3
8
  global: boolean
4
- invoke: invoke
9
+ invoke: Invoke
10
+ remote: Remote
11
+ exposed: (name: string, data: any) => Promise<any>
12
+ startWorkflow: startWorkflow
13
+ agent: Agent
5
14
  }
6
15
 
7
16
  export type RPCMeta = {
8
- pikkuFuncName: string
17
+ pikkuFuncId: string
9
18
  expose: boolean
10
- internal?: boolean
19
+ remote?: boolean
11
20
  }
12
21
 
13
22
  /**
@@ -17,3 +26,11 @@ export interface RPCHandler<Input, Output> {
17
26
  input: Input
18
27
  output: Output
19
28
  }
29
+
30
+ /**
31
+ * Resolved function reference from namespace
32
+ */
33
+ export interface ResolvedFunction {
34
+ package: string
35
+ function: string
36
+ }
@@ -1,9 +1,12 @@
1
- export * from './scheduler.types.js'
2
-
3
1
  export {
4
2
  runScheduledTask,
3
+ createSchedulerRuntimeHandlers,
5
4
  wireScheduler,
6
5
  getScheduledTasks,
7
6
  } from './scheduler-runner.js'
8
-
9
- export * from './log-schedulers.js'
7
+ export { logSchedulers } from './log-schedulers.js'
8
+ export type {
9
+ CoreScheduledTask,
10
+ ScheduledTasksMeta,
11
+ PikkuScheduledTask,
12
+ } from './scheduler.types.js'
@@ -6,7 +6,7 @@ import { Logger } from '../../services/index.js'
6
6
  * @param logger - A logger for logging information.
7
7
  */
8
8
  export const logSchedulers = (logger: Logger) => {
9
- const scheduledTasks = pikkuState('scheduler', 'tasks')
9
+ const scheduledTasks = pikkuState(null, 'scheduler', 'tasks')
10
10
  if (scheduledTasks.size === 0) {
11
11
  logger.info('No scheduled tasks added')
12
12
  return