@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,27 @@
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'
11
+ import { PikkuError } from '../../errors/error-handler.js'
5
12
  import { PikkuRPC, ResolvedFunction } from './rpc-types.js'
13
+ import { parseVersionedId } from '../../version.js'
14
+ import { encryptJSON } from '../../crypto-utils.js'
15
+
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'
6
25
 
7
26
  /**
8
27
  * Resolve a namespaced function reference to package and function names
@@ -20,22 +39,28 @@ const resolveNamespace = (
20
39
  const functionName = namespacedFunction.substring(colonIndex + 1)
21
40
 
22
41
  const externalPackages = pikkuState(null, 'rpc', 'externalPackages')
23
- const packageName = externalPackages.get(namespace)
24
- if (!packageName) {
42
+ const pkgConfig = externalPackages.get(namespace)
43
+ if (!pkgConfig) {
25
44
  return null
26
45
  }
27
46
 
28
47
  return {
29
- package: packageName,
48
+ package: pkgConfig.package,
30
49
  function: functionName,
31
50
  }
32
51
  }
33
52
 
34
53
  const getPikkuFunctionName = (rpcName: string): string => {
35
54
  const rpc = pikkuState(null, 'rpc', 'meta')
36
- const rpcMeta = rpc[rpcName]
55
+ let rpcMeta = rpc[rpcName]
37
56
  if (!rpcMeta) {
38
- 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)
39
64
  }
40
65
  return rpcMeta
41
66
  }
@@ -47,11 +72,22 @@ export class ContextAwareRPCService {
47
72
  private wire: PikkuWire,
48
73
  private options: {
49
74
  requiresAuth?: boolean
75
+ sessionService?: SessionService<CoreUserSession>
50
76
  }
51
77
  ) {}
52
78
 
53
79
  public async rpcExposed(funcName: string, data: any): Promise<any> {
54
- const functionMeta = pikkuState(null, '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
+ }
55
91
  if (!functionMeta) {
56
92
  throw new Error(`Function not found: ${funcName}`)
57
93
  }
@@ -93,8 +129,6 @@ export class ContextAwareRPCService {
93
129
  getPikkuFunctionName(funcName),
94
130
  {
95
131
  auth: this.options.requiresAuth,
96
- // TODO: this is a hack since services have already been created
97
- // but is valid since we don't want to keep creating new wire services
98
132
  singletonServices: this.services,
99
133
  data: () => data,
100
134
  wire: updatedWire,
@@ -136,7 +170,7 @@ export class ContextAwareRPCService {
136
170
  `Available functions: ${Object.keys(externalFunctionMeta).join(', ') || '(none)'}`
137
171
  )
138
172
  }
139
- const funcName = funcMeta.pikkuFuncName || resolved.function
173
+ const funcName = funcMeta.pikkuFuncId || resolved.function
140
174
 
141
175
  // Execute the function using runPikkuFunc with the external package's state
142
176
  // We use the parent services (this.services) since external packages share services
@@ -183,17 +217,142 @@ export class ContextAwareRPCService {
183
217
 
184
218
  public async startWorkflow<In = any>(
185
219
  workflowName: string,
186
- input: In
220
+ input: In,
221
+ options?: {
222
+ startNode?: string
223
+ wire?: { type: string; id?: string; parentRunId?: string }
224
+ }
187
225
  ): Promise<{ runId: string }> {
188
226
  if (!this.services.workflowService) {
189
227
  throw new Error('WorkflowService service not available')
190
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
+ }
191
235
  return this.services.workflowService.startWorkflow(
192
236
  workflowName,
193
237
  input,
194
- this
238
+ wire,
239
+ this,
240
+ options
195
241
  )
196
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
+ }
197
356
  }
198
357
 
199
358
  // RPC Service class for the global interface
@@ -205,18 +364,29 @@ export class PikkuRPCService<
205
364
  getContextRPCService(
206
365
  services: Services,
207
366
  wire: PikkuWire,
208
- requiresAuth?: boolean | undefined,
367
+ requiresAuthOrOptions?:
368
+ | boolean
369
+ | {
370
+ requiresAuth?: boolean
371
+ sessionService?: SessionService<CoreUserSession>
372
+ }
373
+ | undefined,
209
374
  depth: number = 0
210
375
  ): TypedRPC {
211
- const serviceRPC = new ContextAwareRPCService(services, wire, {
212
- requiresAuth,
213
- })
376
+ const options =
377
+ typeof requiresAuthOrOptions === 'object' &&
378
+ requiresAuthOrOptions !== null
379
+ ? requiresAuthOrOptions
380
+ : { requiresAuth: requiresAuthOrOptions }
381
+ const serviceRPC = new ContextAwareRPCService(services, wire, options)
214
382
  return {
215
383
  depth,
216
384
  global: false,
217
385
  invoke: serviceRPC.rpc.bind(serviceRPC),
218
- invokeExposed: serviceRPC.rpc.bind(serviceRPC),
386
+ remote: serviceRPC.remote.bind(serviceRPC),
387
+ exposed: serviceRPC.rpcExposed.bind(serviceRPC),
219
388
  startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
389
+ agent: serviceRPC.agent.bind(serviceRPC),
220
390
  rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
221
391
  } as any
222
392
  }
@@ -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
  /**
@@ -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'
@@ -4,6 +4,7 @@ import {
4
4
  wireScheduler,
5
5
  runScheduledTask,
6
6
  getScheduledTasks,
7
+ createSchedulerRuntimeHandlers,
7
8
  } from './scheduler-runner.js'
8
9
  import { resetPikkuState, pikkuState } from '../../pikku-state.js'
9
10
  import { CoreScheduledTask } from './scheduler.types.js'
@@ -38,7 +39,7 @@ describe('wireScheduler', () => {
38
39
 
39
40
  // Set up metadata first
40
41
  pikkuState(null, 'scheduler', 'meta')['test-task'] = {
41
- pikkuFuncName: 'scheduler_test-task',
42
+ pikkuFuncId: 'scheduler_test-task',
42
43
  name: 'test-task',
43
44
  schedule: '0 0 * * *',
44
45
  }
@@ -63,7 +64,10 @@ describe('wireScheduler', () => {
63
64
  assert.throws(
64
65
  () => wireScheduler(mockTask),
65
66
  (error: any) => {
66
- assert.equal(error.message, 'Task metadata not found')
67
+ assert.equal(
68
+ error.message,
69
+ "Missing generated metadata for scheduled task 'missing-meta-task'"
70
+ )
67
71
  return true
68
72
  }
69
73
  )
@@ -81,7 +85,7 @@ describe('wireScheduler', () => {
81
85
 
82
86
  // Set up metadata
83
87
  pikkuState(null, 'scheduler', 'meta')['duplicate-task'] = {
84
- pikkuFuncName: 'scheduler_duplicate-task',
88
+ pikkuFuncId: 'scheduler_duplicate-task',
85
89
  name: 'duplicate-task',
86
90
  schedule: '0 0 * * *',
87
91
  }
@@ -121,7 +125,7 @@ describe('wireScheduler', () => {
121
125
  }
122
126
 
123
127
  pikkuState(null, 'scheduler', 'meta')['task-with-middleware'] = {
124
- pikkuFuncName: 'scheduler_task-with-middleware',
128
+ pikkuFuncId: 'scheduler_task-with-middleware',
125
129
  name: 'task-with-middleware',
126
130
  schedule: '0 0 * * *',
127
131
  }
@@ -152,12 +156,12 @@ describe('runScheduledTask', () => {
152
156
 
153
157
  // Set up metadata and task
154
158
  pikkuState(null, 'scheduler', 'meta')['simple-task'] = {
155
- pikkuFuncName: 'scheduler_simple-task',
159
+ pikkuFuncId: 'scheduler_simple-task',
156
160
  name: 'simple-task',
157
161
  schedule: '0 0 * * *',
158
162
  }
159
163
  pikkuState(null, 'function', 'meta')['scheduler_simple-task'] = {
160
- pikkuFuncName: 'scheduler_simple-task',
164
+ pikkuFuncId: 'scheduler_simple-task',
161
165
  inputSchemaName: null,
162
166
  outputSchemaName: null,
163
167
  }
@@ -185,19 +189,19 @@ describe('runScheduledTask', () => {
185
189
  schedule: '0 0 * * *',
186
190
  func: {
187
191
  func: async (services: any, data: any, wire: any) => {
188
- receivedSession = await wire.session.get()
192
+ receivedSession = await wire.getSession()
189
193
  },
190
194
  auth: false,
191
195
  },
192
196
  }
193
197
 
194
198
  pikkuState(null, 'scheduler', 'meta')['task-with-session'] = {
195
- pikkuFuncName: 'scheduler_task-with-session',
199
+ pikkuFuncId: 'scheduler_task-with-session',
196
200
  name: 'task-with-session',
197
201
  schedule: '0 0 * * *',
198
202
  }
199
203
  pikkuState(null, 'function', 'meta')['scheduler_task-with-session'] = {
200
- pikkuFuncName: 'scheduler_task-with-session',
204
+ pikkuFuncId: 'scheduler_task-with-session',
201
205
  inputSchemaName: null,
202
206
  outputSchemaName: null,
203
207
  }
@@ -274,12 +278,12 @@ describe('runScheduledTask', () => {
274
278
  }
275
279
 
276
280
  pikkuState(null, 'scheduler', 'meta')['skipped-task'] = {
277
- pikkuFuncName: 'scheduler_skipped-task',
281
+ pikkuFuncId: 'scheduler_skipped-task',
278
282
  name: 'skipped-task',
279
283
  schedule: '0 0 * * *',
280
284
  }
281
285
  pikkuState(null, 'function', 'meta')['scheduler_skipped-task'] = {
282
- pikkuFuncName: 'scheduler_skipped-task',
286
+ pikkuFuncId: 'scheduler_skipped-task',
283
287
  inputSchemaName: null,
284
288
  outputSchemaName: null,
285
289
  }
@@ -317,12 +321,12 @@ describe('runScheduledTask', () => {
317
321
  }
318
322
 
319
323
  pikkuState(null, 'scheduler', 'meta')['skipped-task-no-reason'] = {
320
- pikkuFuncName: 'scheduler_skipped-task-no-reason',
324
+ pikkuFuncId: 'scheduler_skipped-task-no-reason',
321
325
  name: 'skipped-task-no-reason',
322
326
  schedule: '0 0 * * *',
323
327
  }
324
328
  pikkuState(null, 'function', 'meta')['scheduler_skipped-task-no-reason'] = {
325
- pikkuFuncName: 'scheduler_skipped-task-no-reason',
329
+ pikkuFuncId: 'scheduler_skipped-task-no-reason',
326
330
  inputSchemaName: null,
327
331
  outputSchemaName: null,
328
332
  }
@@ -363,12 +367,12 @@ describe('runScheduledTask', () => {
363
367
  }
364
368
 
365
369
  pikkuState(null, 'scheduler', 'meta')['wire-task'] = {
366
- pikkuFuncName: 'scheduler_wire-task',
370
+ pikkuFuncId: 'scheduler_wire-task',
367
371
  name: 'wire-task',
368
372
  schedule: '*/5 * * * *',
369
373
  }
370
374
  pikkuState(null, 'function', 'meta')['scheduler_wire-task'] = {
371
- pikkuFuncName: 'scheduler_wire-task',
375
+ pikkuFuncId: 'scheduler_wire-task',
372
376
  inputSchemaName: null,
373
377
  outputSchemaName: null,
374
378
  }
@@ -401,12 +405,12 @@ describe('runScheduledTask', () => {
401
405
  }
402
406
 
403
407
  pikkuState(null, 'scheduler', 'meta')['session-services-task'] = {
404
- pikkuFuncName: 'scheduler_session-services-task',
408
+ pikkuFuncId: 'scheduler_session-services-task',
405
409
  name: 'session-services-task',
406
410
  schedule: '0 0 * * *',
407
411
  }
408
412
  pikkuState(null, 'function', 'meta')['scheduler_session-services-task'] = {
409
- pikkuFuncName: 'scheduler_session-services-task',
413
+ pikkuFuncId: 'scheduler_session-services-task',
410
414
  inputSchemaName: null,
411
415
  outputSchemaName: null,
412
416
  }
@@ -446,12 +450,12 @@ describe('runScheduledTask', () => {
446
450
  }
447
451
 
448
452
  pikkuState(null, 'scheduler', 'meta')['cleanup-task'] = {
449
- pikkuFuncName: 'scheduler_cleanup-task',
453
+ pikkuFuncId: 'scheduler_cleanup-task',
450
454
  name: 'cleanup-task',
451
455
  schedule: '0 0 * * *',
452
456
  }
453
457
  pikkuState(null, 'function', 'meta')['scheduler_cleanup-task'] = {
454
- pikkuFuncName: 'scheduler_cleanup-task',
458
+ pikkuFuncId: 'scheduler_cleanup-task',
455
459
  inputSchemaName: null,
456
460
  outputSchemaName: null,
457
461
  }
@@ -490,12 +494,12 @@ describe('runScheduledTask', () => {
490
494
  }
491
495
 
492
496
  pikkuState(null, 'scheduler', 'meta')['error-cleanup-task'] = {
493
- pikkuFuncName: 'scheduler_error-cleanup-task',
497
+ pikkuFuncId: 'scheduler_error-cleanup-task',
494
498
  name: 'error-cleanup-task',
495
499
  schedule: '0 0 * * *',
496
500
  }
497
501
  pikkuState(null, 'function', 'meta')['scheduler_error-cleanup-task'] = {
498
- pikkuFuncName: 'scheduler_error-cleanup-task',
502
+ pikkuFuncId: 'scheduler_error-cleanup-task',
499
503
  inputSchemaName: null,
500
504
  outputSchemaName: null,
501
505
  }
@@ -527,12 +531,12 @@ describe('runScheduledTask', () => {
527
531
  }
528
532
 
529
533
  pikkuState(null, 'scheduler', 'meta')['error-task'] = {
530
- pikkuFuncName: 'scheduler_error-task',
534
+ pikkuFuncId: 'scheduler_error-task',
531
535
  name: 'error-task',
532
536
  schedule: '0 0 * * *',
533
537
  }
534
538
  pikkuState(null, 'function', 'meta')['scheduler_error-task'] = {
535
- pikkuFuncName: 'scheduler_error-task',
539
+ pikkuFuncId: 'scheduler_error-task',
536
540
  inputSchemaName: null,
537
541
  outputSchemaName: null,
538
542
  }
@@ -574,12 +578,12 @@ describe('runScheduledTask', () => {
574
578
  }
575
579
 
576
580
  pikkuState(null, 'scheduler', 'meta')['middleware-task'] = {
577
- pikkuFuncName: 'scheduler_middleware-task',
581
+ pikkuFuncId: 'scheduler_middleware-task',
578
582
  name: 'middleware-task',
579
583
  schedule: '0 0 * * *',
580
584
  }
581
585
  pikkuState(null, 'function', 'meta')['scheduler_middleware-task'] = {
582
- pikkuFuncName: 'scheduler_middleware-task',
586
+ pikkuFuncId: 'scheduler_middleware-task',
583
587
  inputSchemaName: null,
584
588
  outputSchemaName: null,
585
589
  }
@@ -608,7 +612,7 @@ describe('getScheduledTasks', () => {
608
612
  }
609
613
 
610
614
  pikkuState(null, 'scheduler', 'meta')['test-task'] = {
611
- pikkuFuncName: 'scheduler_test-task',
615
+ pikkuFuncId: 'scheduler_test-task',
612
616
  name: 'test-task',
613
617
  schedule: '0 0 * * *',
614
618
  }
@@ -625,3 +629,43 @@ describe('getScheduledTasks', () => {
625
629
  assert.equal(tasks.size, 0)
626
630
  })
627
631
  })
632
+
633
+ describe('createSchedulerRuntimeHandlers', () => {
634
+ test('invokes RPC with optional session and runs scheduled task callback', async () => {
635
+ const calls: Array<{ type: string; value: any }> = []
636
+ const logger = createMockLogger()
637
+ const singletonServices = { logger } as any
638
+
639
+ const handlers = createSchedulerRuntimeHandlers({
640
+ singletonServices,
641
+ })
642
+
643
+ const originalGetContextRPCService = (await import('../rpc/rpc-runner.js'))
644
+ .rpcService.getContextRPCService
645
+ ;(await import('../rpc/rpc-runner.js')).rpcService.getContextRPCService = ((
646
+ _services: any,
647
+ wire: any
648
+ ) => {
649
+ calls.push({ type: 'wire', value: wire })
650
+ return {
651
+ invoke: async (rpcName: string, data: any) => {
652
+ calls.push({ type: 'invoke', value: { rpcName, data } })
653
+ },
654
+ } as any
655
+ }) as any
656
+
657
+ try {
658
+ await handlers.invokeRPC('testRpc', { value: 1 }, { userId: 'u1' } as any)
659
+ } finally {
660
+ ;(await import('../rpc/rpc-runner.js')).rpcService.getContextRPCService =
661
+ originalGetContextRPCService
662
+ }
663
+
664
+ assert.equal(calls[0]?.type, 'wire')
665
+ assert.deepEqual(calls[0]?.value, { session: { userId: 'u1' } })
666
+ assert.deepEqual(calls[1]?.value, {
667
+ rpcName: 'testRpc',
668
+ data: { value: 1 },
669
+ })
670
+ })
671
+ })
@@ -7,14 +7,20 @@ import {
7
7
  } from '../../types/core.types.js'
8
8
  import type { CoreScheduledTask } from './scheduler.types.js'
9
9
  import { getErrorResponse, PikkuError } from '../../errors/error-handler.js'
10
+ import { PikkuMissingMetaError } from '../../errors/errors.js'
10
11
  import { closeWireServices } from '../../utils.js'
11
12
  import { pikkuState } from '../../pikku-state.js'
12
13
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
13
- import { PikkuSessionService } from '../../services/user-session-service.js'
14
+ import {
15
+ PikkuSessionService,
16
+ createMiddlewareSessionWireProps,
17
+ } from '../../services/user-session-service.js'
14
18
  import {
15
19
  CorePikkuFunctionConfig,
16
20
  CorePikkuFunctionSessionless,
17
21
  } from '../../function/functions.types.js'
22
+ import { rpcService } from '../rpc/rpc-runner.js'
23
+ import { SchedulerRuntimeHandlers } from '../../services/scheduler-service.js'
18
24
 
19
25
  export type RunScheduledTasksParams = {
20
26
  name: string
@@ -37,9 +43,11 @@ export const wireScheduler = <
37
43
  const meta = pikkuState(null, 'scheduler', 'meta')
38
44
  const taskMeta = meta[scheduledTask.name]
39
45
  if (!taskMeta) {
40
- throw new Error('Task metadata not found')
46
+ throw new PikkuMissingMetaError(
47
+ `Missing generated metadata for scheduled task '${scheduledTask.name}'`
48
+ )
41
49
  }
42
- addFunction(taskMeta.pikkuFuncName, {
50
+ addFunction(taskMeta.pikkuFuncId, {
43
51
  func: scheduledTask.func.func,
44
52
  auth: scheduledTask.func.auth,
45
53
  permissions: scheduledTask.func.permissions,
@@ -103,7 +111,7 @@ export async function runScheduledTask({
103
111
  throw new ScheduledTaskSkippedError(name, reason)
104
112
  },
105
113
  },
106
- session: userSession,
114
+ ...createMiddlewareSessionWireProps(userSession),
107
115
  }
108
116
 
109
117
  try {
@@ -111,7 +119,7 @@ export async function runScheduledTask({
111
119
  `Running schedule task: ${name} | schedule: ${task.schedule}`
112
120
  )
113
121
 
114
- await runPikkuFunc('scheduler', meta.name, meta.pikkuFuncName, {
122
+ await runPikkuFunc('scheduler', meta.name, meta.pikkuFuncId, {
115
123
  singletonServices,
116
124
  createWireServices,
117
125
  auth: false,
@@ -120,6 +128,7 @@ export async function runScheduledTask({
120
128
  wireMiddleware: task.middleware,
121
129
  tags: task.tags,
122
130
  wire,
131
+ sessionService: userSession,
123
132
  })
124
133
  } catch (e: any) {
125
134
  const errorResponse = getErrorResponse(e)
@@ -137,3 +146,34 @@ export async function runScheduledTask({
137
146
  export const getScheduledTasks = () => {
138
147
  return pikkuState(null, 'scheduler', 'tasks')
139
148
  }
149
+
150
+ export const createSchedulerRuntimeHandlers = ({
151
+ singletonServices,
152
+ createWireServices,
153
+ }: {
154
+ singletonServices: CoreSingletonServices
155
+ createWireServices?: CreateWireServices<
156
+ CoreSingletonServices,
157
+ CoreServices<CoreSingletonServices>,
158
+ CoreUserSession
159
+ >
160
+ }): SchedulerRuntimeHandlers => {
161
+ return {
162
+ logger: singletonServices.logger,
163
+ invokeRPC: async (
164
+ rpcName: string,
165
+ data?: any,
166
+ session?: CoreUserSession
167
+ ) => {
168
+ const wire = session ? ({ session } as PikkuWire) : ({} as PikkuWire)
169
+ const rpc = rpcService.getContextRPCService(singletonServices, wire)
170
+ await rpc.invoke(rpcName, data)
171
+ },
172
+ runScheduledTask: async (name: string) =>
173
+ runScheduledTask({
174
+ name,
175
+ singletonServices,
176
+ createWireServices,
177
+ }),
178
+ }
179
+ }
@@ -0,0 +1,9 @@
1
+ export { wireSecret } from './secret.types.js'
2
+ export type {
3
+ CoreSecret,
4
+ OAuth2CredentialConfig,
5
+ SecretDefinitionMeta,
6
+ SecretDefinitionsMeta,
7
+ SecretDefinitions,
8
+ } from './secret.types.js'
9
+ export { validateAndBuildSecretDefinitionsMeta } from './validate-secret-definitions.js'