@pikku/core 0.11.2 → 0.12.1

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 (436) hide show
  1. package/CHANGELOG.md +57 -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 +14 -0
  5. package/dist/errors/errors.js +26 -0
  6. package/dist/errors/index.d.ts +1 -1
  7. package/dist/errors/index.js +1 -1
  8. package/dist/function/function-runner.d.ts +10 -4
  9. package/dist/function/function-runner.js +126 -45
  10. package/dist/function/functions.types.d.ts +32 -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.d.ts +2 -2
  15. package/dist/handle-error.js +3 -12
  16. package/dist/index.d.ts +30 -26
  17. package/dist/index.js +19 -29
  18. package/dist/internal.d.ts +3 -0
  19. package/dist/internal.js +2 -0
  20. package/dist/middleware/auth-apikey.d.ts +2 -2
  21. package/dist/middleware/auth-apikey.js +3 -3
  22. package/dist/middleware/auth-bearer.d.ts +3 -3
  23. package/dist/middleware/auth-bearer.js +4 -7
  24. package/dist/middleware/auth-cookie.d.ts +4 -4
  25. package/dist/middleware/auth-cookie.js +7 -9
  26. package/dist/middleware/cors.d.ts +46 -0
  27. package/dist/middleware/cors.js +81 -0
  28. package/dist/middleware/index.d.ts +5 -3
  29. package/dist/middleware/index.js +5 -3
  30. package/dist/middleware/remote-auth.d.ts +5 -0
  31. package/dist/middleware/remote-auth.js +55 -0
  32. package/dist/middleware/timeout.d.ts +2 -2
  33. package/dist/middleware-runner.d.ts +1 -1
  34. package/dist/middleware-runner.js +8 -10
  35. package/dist/permissions.d.ts +2 -2
  36. package/dist/permissions.js +11 -15
  37. package/dist/pikku-state.d.ts +10 -8
  38. package/dist/pikku-state.js +48 -25
  39. package/dist/schema.d.ts +4 -4
  40. package/dist/schema.js +20 -15
  41. package/dist/services/ai-agent-runner-service.d.ts +43 -0
  42. package/dist/services/ai-agent-runner-service.js +1 -0
  43. package/dist/services/ai-run-state-service.d.ts +13 -0
  44. package/dist/services/ai-run-state-service.js +1 -0
  45. package/dist/services/ai-storage-service.d.ts +18 -0
  46. package/dist/services/ai-storage-service.js +1 -0
  47. package/dist/services/content-service.d.ts +6 -0
  48. package/dist/services/deployment-service.d.ts +19 -0
  49. package/dist/services/deployment-service.js +1 -0
  50. package/dist/services/gopass-secrets.d.ts +47 -0
  51. package/dist/services/gopass-secrets.js +97 -0
  52. package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
  53. package/dist/services/in-memory-ai-run-state-service.js +44 -0
  54. package/dist/services/in-memory-trigger-service.d.ts +22 -0
  55. package/dist/services/in-memory-trigger-service.js +48 -0
  56. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  57. package/dist/services/in-memory-workflow-service.js +287 -0
  58. package/dist/services/index.d.ts +26 -11
  59. package/dist/services/index.js +11 -13
  60. package/dist/services/local-content.d.ts +2 -1
  61. package/dist/services/local-content.js +6 -1
  62. package/dist/services/local-secrets.d.ts +25 -2
  63. package/dist/services/local-secrets.js +45 -0
  64. package/dist/services/local-variables.d.ts +6 -1
  65. package/dist/services/local-variables.js +18 -0
  66. package/dist/services/logger-console.d.ts +2 -1
  67. package/dist/services/scheduler-service.d.ts +9 -1
  68. package/dist/services/scheduler-service.js +8 -0
  69. package/dist/services/schema-service.d.ts +6 -0
  70. package/dist/services/scoped-secret-service.d.ts +16 -0
  71. package/dist/services/scoped-secret-service.js +35 -0
  72. package/dist/services/secret-service.d.ts +25 -4
  73. package/dist/services/trigger-service.d.ts +16 -0
  74. package/dist/services/trigger-service.js +1 -0
  75. package/dist/services/typed-secret-service.d.ts +30 -0
  76. package/dist/services/typed-secret-service.js +40 -0
  77. package/dist/services/typed-variables-service.d.ts +27 -0
  78. package/dist/services/typed-variables-service.js +46 -0
  79. package/dist/services/user-session-service.d.ts +15 -2
  80. package/dist/services/user-session-service.js +17 -0
  81. package/dist/services/variables-service.d.ts +5 -0
  82. package/dist/services/workflow-service.d.ts +9 -5
  83. package/dist/types/core.types.d.ts +67 -25
  84. package/dist/types/core.types.js +8 -1
  85. package/dist/types/state.types.d.ts +53 -59
  86. package/dist/utils.d.ts +7 -6
  87. package/dist/utils.js +27 -12
  88. package/dist/version.d.ts +6 -0
  89. package/dist/version.js +19 -0
  90. package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
  91. package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +146 -0
  92. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
  93. package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -0
  94. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  95. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  96. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  97. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  98. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +59 -0
  99. package/dist/wirings/ai-agent/ai-agent-prepare.js +348 -0
  100. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  101. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  102. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  103. package/dist/wirings/ai-agent/ai-agent-runner.js +195 -0
  104. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +12 -0
  105. package/dist/wirings/ai-agent/ai-agent-stream.js +662 -0
  106. package/dist/wirings/ai-agent/ai-agent.types.d.ts +313 -0
  107. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  108. package/dist/wirings/ai-agent/index.d.ts +7 -0
  109. package/dist/wirings/ai-agent/index.js +6 -0
  110. package/dist/wirings/channel/channel-common.d.ts +8 -5
  111. package/dist/wirings/channel/channel-common.js +15 -8
  112. package/dist/wirings/channel/channel-handler.d.ts +3 -3
  113. package/dist/wirings/channel/channel-handler.js +15 -6
  114. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  115. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  116. package/dist/wirings/channel/channel-runner.d.ts +5 -5
  117. package/dist/wirings/channel/channel-runner.js +10 -9
  118. package/dist/wirings/channel/channel-store.d.ts +1 -1
  119. package/dist/wirings/channel/channel.types.d.ts +9 -7
  120. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  121. package/dist/wirings/channel/define-channel-routes.js +23 -0
  122. package/dist/wirings/channel/index.d.ts +10 -8
  123. package/dist/wirings/channel/index.js +7 -8
  124. package/dist/wirings/channel/local/index.d.ts +3 -3
  125. package/dist/wirings/channel/local/index.js +3 -3
  126. package/dist/wirings/channel/local/local-channel-runner.d.ts +7 -2
  127. package/dist/wirings/channel/local/local-channel-runner.js +22 -9
  128. package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
  129. package/dist/wirings/channel/log-channels.d.ts +1 -1
  130. package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +1 -1
  131. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  132. package/dist/wirings/channel/serverless/index.js +1 -1
  133. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +4 -4
  134. package/dist/wirings/channel/serverless/serverless-channel-runner.js +40 -23
  135. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
  136. package/dist/wirings/cli/channel/index.d.ts +1 -1
  137. package/dist/wirings/cli/channel/index.js +1 -1
  138. package/dist/wirings/cli/cli-runner.d.ts +3 -3
  139. package/dist/wirings/cli/cli-runner.js +12 -8
  140. package/dist/wirings/cli/cli.types.d.ts +9 -9
  141. package/dist/wirings/cli/command-parser.d.ts +1 -1
  142. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  143. package/dist/wirings/cli/define-cli-commands.js +20 -0
  144. package/dist/wirings/cli/index.d.ts +2 -3
  145. package/dist/wirings/cli/index.js +1 -3
  146. package/dist/wirings/http/http-routes.d.ts +69 -0
  147. package/dist/wirings/http/http-routes.js +139 -0
  148. package/dist/wirings/http/http-runner.d.ts +9 -9
  149. package/dist/wirings/http/http-runner.js +79 -34
  150. package/dist/wirings/http/http.types.d.ts +77 -41
  151. package/dist/wirings/http/index.d.ts +5 -4
  152. package/dist/wirings/http/index.js +4 -3
  153. package/dist/wirings/http/log-http-routes.d.ts +1 -1
  154. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
  155. package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
  156. package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
  157. package/dist/wirings/http/routers/http-router.d.ts +1 -1
  158. package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
  159. package/dist/wirings/mcp/index.d.ts +4 -3
  160. package/dist/wirings/mcp/index.js +3 -3
  161. package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
  162. package/dist/wirings/mcp/mcp-runner.d.ts +1 -6
  163. package/dist/wirings/mcp/mcp-runner.js +28 -40
  164. package/dist/wirings/mcp/mcp.types.d.ts +5 -5
  165. package/dist/wirings/node/index.d.ts +2 -0
  166. package/dist/wirings/node/index.js +1 -0
  167. package/dist/wirings/node/node.types.d.ts +20 -0
  168. package/dist/wirings/node/node.types.js +1 -0
  169. package/dist/wirings/oauth2/index.d.ts +3 -0
  170. package/dist/wirings/oauth2/index.js +2 -0
  171. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  172. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  173. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  174. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  175. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  176. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  177. package/dist/wirings/queue/index.d.ts +1 -1
  178. package/dist/wirings/queue/queue-runner.d.ts +1 -5
  179. package/dist/wirings/queue/queue-runner.js +11 -8
  180. package/dist/wirings/queue/queue.types.d.ts +5 -5
  181. package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
  182. package/dist/wirings/queue/register-queue-helper.js +1 -1
  183. package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
  184. package/dist/wirings/rpc/index.d.ts +3 -1
  185. package/dist/wirings/rpc/index.js +2 -1
  186. package/dist/wirings/rpc/rpc-runner.d.ts +58 -8
  187. package/dist/wirings/rpc/rpc-runner.js +177 -31
  188. package/dist/wirings/rpc/rpc-types.d.ts +20 -4
  189. package/dist/wirings/rpc/wire-addon.d.ts +10 -0
  190. package/dist/wirings/rpc/wire-addon.js +9 -0
  191. package/dist/wirings/scheduler/index.d.ts +2 -2
  192. package/dist/wirings/scheduler/index.js +1 -2
  193. package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
  194. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -5
  195. package/dist/wirings/scheduler/scheduler-runner.js +11 -14
  196. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
  197. package/dist/wirings/secret/index.d.ts +3 -0
  198. package/dist/wirings/secret/index.js +2 -0
  199. package/dist/wirings/secret/secret.types.d.ts +27 -0
  200. package/dist/wirings/secret/secret.types.js +1 -0
  201. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  202. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  203. package/dist/wirings/trigger/index.d.ts +3 -2
  204. package/dist/wirings/trigger/index.js +2 -2
  205. package/dist/wirings/trigger/pikku-trigger-service.d.ts +22 -0
  206. package/dist/wirings/trigger/pikku-trigger-service.js +70 -0
  207. package/dist/wirings/trigger/trigger-runner.d.ts +18 -9
  208. package/dist/wirings/trigger/trigger-runner.js +48 -19
  209. package/dist/wirings/trigger/trigger.types.d.ts +99 -11
  210. package/dist/wirings/trigger/trigger.types.js +40 -1
  211. package/dist/wirings/variable/index.d.ts +3 -0
  212. package/dist/wirings/variable/index.js +2 -0
  213. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  214. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  215. package/dist/wirings/variable/variable.types.d.ts +18 -0
  216. package/dist/wirings/variable/variable.types.js +1 -0
  217. package/dist/wirings/workflow/dsl/index.d.ts +1 -1
  218. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
  219. package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
  220. package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
  221. package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
  222. package/dist/wirings/workflow/graph/graph-runner.js +384 -296
  223. package/dist/wirings/workflow/graph/index.d.ts +4 -3
  224. package/dist/wirings/workflow/graph/index.js +3 -3
  225. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  226. package/dist/wirings/workflow/graph/template.js +27 -0
  227. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  228. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  229. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
  230. package/dist/wirings/workflow/index.d.ts +6 -6
  231. package/dist/wirings/workflow/index.js +6 -4
  232. package/dist/wirings/workflow/pikku-workflow-service.d.ts +29 -19
  233. package/dist/wirings/workflow/pikku-workflow-service.js +217 -82
  234. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  235. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  236. package/dist/wirings/workflow/workflow.types.d.ts +42 -95
  237. package/package.json +14 -15
  238. package/run-tests.sh +4 -1
  239. package/src/crypto-utils.test.ts +116 -0
  240. package/src/crypto-utils.ts +99 -0
  241. package/src/errors/error.test.ts +143 -2
  242. package/src/errors/errors.ts +27 -0
  243. package/src/errors/index.ts +1 -1
  244. package/src/factory-functions.test.ts +42 -2
  245. package/src/function/function-runner.test.ts +6 -13
  246. package/src/function/function-runner.ts +161 -53
  247. package/src/function/functions.types.ts +63 -132
  248. package/src/function/index.ts +5 -2
  249. package/src/handle-error.test.ts +361 -0
  250. package/src/handle-error.ts +6 -14
  251. package/src/index.ts +97 -30
  252. package/src/internal.ts +6 -0
  253. package/src/middleware/auth-apikey.test.ts +16 -13
  254. package/src/middleware/auth-apikey.ts +3 -3
  255. package/src/middleware/auth-bearer.test.ts +18 -15
  256. package/src/middleware/auth-bearer.ts +27 -32
  257. package/src/middleware/auth-cookie.test.ts +17 -14
  258. package/src/middleware/auth-cookie.ts +9 -13
  259. package/src/middleware/cors.test.ts +424 -0
  260. package/src/middleware/cors.ts +104 -0
  261. package/src/middleware/index.ts +5 -3
  262. package/src/middleware/remote-auth.test.ts +488 -0
  263. package/src/middleware/remote-auth.ts +68 -0
  264. package/src/middleware-runner.test.ts +123 -1
  265. package/src/middleware-runner.ts +13 -13
  266. package/src/permissions.test.ts +83 -9
  267. package/src/permissions.ts +17 -19
  268. package/src/pikku-state.test.ts +224 -0
  269. package/src/pikku-state.ts +59 -35
  270. package/src/run-tests-script.test.ts +49 -0
  271. package/src/schema.test.ts +198 -6
  272. package/src/schema.ts +28 -21
  273. package/src/services/ai-agent-runner-service.ts +41 -0
  274. package/src/services/ai-run-state-service.ts +20 -0
  275. package/src/services/ai-storage-service.ts +39 -0
  276. package/src/services/content-service.ts +7 -0
  277. package/src/services/deployment-service.ts +22 -0
  278. package/src/services/gopass-secrets.ts +98 -0
  279. package/src/services/in-memory-ai-run-state-service.ts +73 -0
  280. package/src/services/in-memory-trigger-service.ts +64 -0
  281. package/src/services/in-memory-workflow-service.test.ts +351 -0
  282. package/src/services/in-memory-workflow-service.ts +395 -0
  283. package/src/services/index.ts +50 -14
  284. package/src/services/local-content.ts +9 -3
  285. package/src/services/local-secrets.test.ts +80 -0
  286. package/src/services/local-secrets.ts +53 -2
  287. package/src/services/local-variables.test.ts +61 -0
  288. package/src/services/local-variables.ts +23 -1
  289. package/src/services/logger-console.test.ts +118 -0
  290. package/src/services/logger-console.ts +2 -1
  291. package/src/services/scheduler-service.ts +11 -1
  292. package/src/services/schema-service.ts +7 -0
  293. package/src/services/scoped-secret-service.test.ts +74 -0
  294. package/src/services/scoped-secret-service.ts +41 -0
  295. package/src/services/secret-service.ts +25 -4
  296. package/src/services/trigger-service.ts +17 -0
  297. package/src/services/typed-secret-service.test.ts +93 -0
  298. package/src/services/typed-secret-service.ts +70 -0
  299. package/src/services/typed-variables-service.test.ts +73 -0
  300. package/src/services/typed-variables-service.ts +81 -0
  301. package/src/services/user-session-service.test.ts +113 -0
  302. package/src/services/user-session-service.ts +25 -2
  303. package/src/services/variables-service.ts +5 -0
  304. package/src/services/workflow-service.ts +23 -13
  305. package/src/time-utils.test.ts +1 -1
  306. package/src/types/core.types.ts +95 -24
  307. package/src/types/state.types.ts +56 -73
  308. package/src/utils.test.ts +350 -0
  309. package/src/utils.ts +33 -18
  310. package/src/version.test.ts +80 -0
  311. package/src/version.ts +25 -0
  312. package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
  313. package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +214 -0
  314. package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
  315. package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
  316. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  317. package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
  318. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  319. package/src/wirings/ai-agent/ai-agent-prepare.ts +504 -0
  320. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  321. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  322. package/src/wirings/ai-agent/ai-agent-runner.test.ts +317 -0
  323. package/src/wirings/ai-agent/ai-agent-runner.ts +251 -0
  324. package/src/wirings/ai-agent/ai-agent-stream.test.ts +652 -0
  325. package/src/wirings/ai-agent/ai-agent-stream.ts +1049 -0
  326. package/src/wirings/ai-agent/ai-agent.types.ts +328 -0
  327. package/src/wirings/ai-agent/index.ts +39 -0
  328. package/src/wirings/channel/channel-common.ts +33 -20
  329. package/src/wirings/channel/channel-handler.ts +26 -9
  330. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  331. package/src/wirings/channel/channel-runner.ts +15 -16
  332. package/src/wirings/channel/channel-store.ts +1 -1
  333. package/src/wirings/channel/channel.types.ts +21 -9
  334. package/src/wirings/channel/define-channel-routes.ts +25 -0
  335. package/src/wirings/channel/index.ts +23 -8
  336. package/src/wirings/channel/local/index.ts +3 -3
  337. package/src/wirings/channel/local/local-channel-runner.test.ts +57 -7
  338. package/src/wirings/channel/local/local-channel-runner.ts +40 -19
  339. package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
  340. package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
  341. package/src/wirings/channel/log-channels.ts +1 -1
  342. package/src/wirings/channel/pikku-abstract-channel-handler.ts +1 -1
  343. package/src/wirings/channel/serverless/index.ts +5 -1
  344. package/src/wirings/channel/serverless/serverless-channel-runner.ts +57 -36
  345. package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
  346. package/src/wirings/cli/channel/index.ts +1 -1
  347. package/src/wirings/cli/cli-runner.test.ts +10 -10
  348. package/src/wirings/cli/cli-runner.ts +28 -14
  349. package/src/wirings/cli/cli.types.ts +14 -14
  350. package/src/wirings/cli/command-parser.test.ts +9 -9
  351. package/src/wirings/cli/command-parser.ts +1 -1
  352. package/src/wirings/cli/define-cli-commands.ts +24 -0
  353. package/src/wirings/cli/index.ts +10 -4
  354. package/src/wirings/http/http-routes.test.ts +322 -0
  355. package/src/wirings/http/http-routes.ts +198 -0
  356. package/src/wirings/http/http-runner.test.ts +12 -20
  357. package/src/wirings/http/http-runner.ts +101 -51
  358. package/src/wirings/http/http.types.ts +119 -48
  359. package/src/wirings/http/index.ts +16 -4
  360. package/src/wirings/http/log-http-routes.ts +1 -1
  361. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  362. package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
  363. package/src/wirings/http/routers/http-router.ts +1 -1
  364. package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
  365. package/src/wirings/http/routers/path-to-regex.ts +4 -3
  366. package/src/wirings/mcp/index.ts +27 -3
  367. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  368. package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
  369. package/src/wirings/mcp/mcp-runner.ts +48 -65
  370. package/src/wirings/mcp/mcp.types.ts +5 -5
  371. package/src/wirings/node/index.ts +2 -0
  372. package/src/wirings/node/node.types.ts +23 -0
  373. package/src/wirings/oauth2/index.ts +3 -0
  374. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  375. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  376. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  377. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  378. package/src/wirings/queue/index.ts +13 -2
  379. package/src/wirings/queue/queue-runner.test.ts +142 -73
  380. package/src/wirings/queue/queue-runner.ts +18 -14
  381. package/src/wirings/queue/queue.types.ts +5 -5
  382. package/src/wirings/queue/register-queue-helper.ts +3 -5
  383. package/src/wirings/queue/validate-worker-config.test.ts +108 -0
  384. package/src/wirings/queue/validate-worker-config.ts +4 -1
  385. package/src/wirings/rpc/index.ts +3 -1
  386. package/src/wirings/rpc/rpc-runner.ts +254 -41
  387. package/src/wirings/rpc/rpc-types.ts +28 -4
  388. package/src/wirings/rpc/wire-addon.ts +20 -0
  389. package/src/wirings/scheduler/index.ts +6 -4
  390. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  391. package/src/wirings/scheduler/scheduler-runner.test.ts +78 -45
  392. package/src/wirings/scheduler/scheduler-runner.ts +20 -27
  393. package/src/wirings/scheduler/scheduler.types.ts +2 -2
  394. package/src/wirings/secret/index.ts +9 -0
  395. package/src/wirings/secret/secret.types.ts +32 -0
  396. package/src/wirings/secret/validate-secret-definitions.test.ts +140 -0
  397. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  398. package/src/wirings/trigger/index.ts +10 -2
  399. package/src/wirings/trigger/pikku-trigger-service.ts +112 -0
  400. package/src/wirings/trigger/trigger-runner.test.ts +79 -0
  401. package/src/wirings/trigger/trigger-runner.ts +80 -41
  402. package/src/wirings/trigger/trigger.types.ts +144 -22
  403. package/src/wirings/variable/index.ts +8 -0
  404. package/src/wirings/variable/validate-variable-definitions.test.ts +91 -0
  405. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  406. package/src/wirings/variable/variable.types.ts +22 -0
  407. package/src/wirings/workflow/dsl/index.ts +1 -0
  408. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
  409. package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
  410. package/src/wirings/workflow/graph/graph-node.ts +1 -6
  411. package/src/wirings/workflow/graph/graph-runner.test.ts +487 -0
  412. package/src/wirings/workflow/graph/graph-runner.ts +496 -374
  413. package/src/wirings/workflow/graph/index.ts +14 -3
  414. package/src/wirings/workflow/graph/template.test.ts +49 -0
  415. package/src/wirings/workflow/graph/template.ts +42 -0
  416. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  417. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
  418. package/src/wirings/workflow/index.ts +21 -10
  419. package/src/wirings/workflow/pikku-workflow-service.test.ts +200 -0
  420. package/src/wirings/workflow/pikku-workflow-service.ts +308 -105
  421. package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
  422. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  423. package/src/wirings/workflow/workflow.types.ts +47 -92
  424. package/tsconfig.tsbuildinfo +1 -1
  425. package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
  426. package/dist/wirings/forge-node/forge-node.types.js +0 -38
  427. package/dist/wirings/forge-node/index.d.ts +0 -1
  428. package/dist/wirings/forge-node/index.js +0 -1
  429. package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
  430. package/dist/wirings/workflow/wire-workflow.js +0 -53
  431. package/dist/wirings/workflow/workflow-utils.d.ts +0 -23
  432. package/dist/wirings/workflow/workflow-utils.js +0 -66
  433. package/src/wirings/forge-node/forge-node.types.ts +0 -135
  434. package/src/wirings/forge-node/index.ts +0 -1
  435. package/src/wirings/workflow/wire-workflow.ts +0 -94
  436. package/src/wirings/workflow/workflow-utils.ts +0 -120
@@ -1,10 +1,8 @@
1
1
  import type { ConfigValidationResult, CoreQueueWorker } from './queue.types.js'
2
2
  import { getQueueWorkers } from './queue-runner.js'
3
- import {
4
- QueueConfigMapping,
5
- validateWorkerConfig,
6
- } from './validate-worker-config.js'
7
- import { Logger } from '../../services/logger.js'
3
+ import type { QueueConfigMapping } from './validate-worker-config.js'
4
+ import { validateWorkerConfig } from './validate-worker-config.js'
5
+ import type { Logger } from '../../services/logger.js'
8
6
 
9
7
  /**
10
8
  * Queue processor registration callback
@@ -0,0 +1,108 @@
1
+ import { describe, test } from 'node:test'
2
+ import assert from 'node:assert'
3
+ import { validateWorkerConfig } from './validate-worker-config.js'
4
+ import type { QueueConfigMapping } from './validate-worker-config.js'
5
+
6
+ const createTestMapping = (): QueueConfigMapping => ({
7
+ supported: {
8
+ concurrency: {
9
+ queueProperty: 'concurrency',
10
+ description: 'Number of concurrent workers',
11
+ },
12
+ maxRetries: {
13
+ queueProperty: 'maxRetries',
14
+ description: 'Maximum retry attempts',
15
+ },
16
+ },
17
+ unsupported: {
18
+ rateLimitMax: {
19
+ reason: 'Not supported',
20
+ explanation: 'This queue does not support rate limiting',
21
+ },
22
+ },
23
+ fallbacks: {
24
+ retryDelay: {
25
+ reason: 'Partial support',
26
+ explanation: 'Uses fixed delay instead of exponential',
27
+ fallbackValue: '1000ms fixed',
28
+ },
29
+ },
30
+ })
31
+
32
+ describe('validateWorkerConfig', () => {
33
+ test('should return empty results for empty config', () => {
34
+ const mapping = createTestMapping()
35
+ const result = validateWorkerConfig(mapping, {})
36
+ assert.deepStrictEqual(result.applied, {})
37
+ assert.deepStrictEqual(result.ignored, {})
38
+ assert.deepStrictEqual(result.warnings, [])
39
+ assert.deepStrictEqual(result.fallbacks, {})
40
+ })
41
+
42
+ test('should return empty results for undefined config', () => {
43
+ const mapping = createTestMapping()
44
+ const result = validateWorkerConfig(mapping)
45
+ assert.deepStrictEqual(result.applied, {})
46
+ assert.deepStrictEqual(result.ignored, {})
47
+ })
48
+
49
+ test('should apply supported configurations', () => {
50
+ const mapping = createTestMapping()
51
+ const result = validateWorkerConfig(mapping, { concurrency: 5 } as any)
52
+ assert.deepStrictEqual(result.applied, { concurrency: 5 })
53
+ assert.deepStrictEqual(result.ignored, {})
54
+ assert.strictEqual(result.warnings.length, 0)
55
+ })
56
+
57
+ test('should ignore unsupported configurations with warning', () => {
58
+ const mapping = createTestMapping()
59
+ const result = validateWorkerConfig(mapping, { rateLimitMax: 100 } as any)
60
+ assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
61
+ assert.strictEqual(result.warnings.length, 1)
62
+ assert.ok(result.warnings[0].includes('Not supported'))
63
+ })
64
+
65
+ test('should handle fallback configurations', () => {
66
+ const mapping = createTestMapping()
67
+ const result = validateWorkerConfig(mapping, { retryDelay: 2000 } as any)
68
+ assert.deepStrictEqual(result.applied, { retryDelay: 2000 })
69
+ assert.deepStrictEqual(result.fallbacks, { retryDelay: '1000ms fixed' })
70
+ assert.strictEqual(result.warnings.length, 1)
71
+ assert.ok(result.warnings[0].includes('Partial support'))
72
+ })
73
+
74
+ test('should warn about unknown configurations', () => {
75
+ const mapping = createTestMapping()
76
+ const result = validateWorkerConfig(mapping, {
77
+ unknownOption: 'val',
78
+ } as any)
79
+ assert.deepStrictEqual(result.ignored, { unknownOption: 'val' })
80
+ assert.strictEqual(result.warnings.length, 1)
81
+ assert.ok(result.warnings[0].includes('Unknown configuration'))
82
+ })
83
+
84
+ test('should skip undefined values', () => {
85
+ const mapping = createTestMapping()
86
+ const result = validateWorkerConfig(mapping, {
87
+ concurrency: undefined,
88
+ } as any)
89
+ assert.deepStrictEqual(result.applied, {})
90
+ })
91
+
92
+ test('should handle mixed supported and unsupported configs', () => {
93
+ const mapping = createTestMapping()
94
+ const result = validateWorkerConfig(mapping, {
95
+ concurrency: 3,
96
+ maxRetries: 5,
97
+ rateLimitMax: 100,
98
+ retryDelay: 1000,
99
+ } as any)
100
+ assert.deepStrictEqual(result.applied, {
101
+ concurrency: 3,
102
+ maxRetries: 5,
103
+ retryDelay: 1000,
104
+ })
105
+ assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
106
+ assert.strictEqual(result.warnings.length, 2)
107
+ })
108
+ })
@@ -1,4 +1,7 @@
1
- import { PikkuWorkerConfig, ConfigValidationResult } from './queue.types.js'
1
+ import type {
2
+ PikkuWorkerConfig,
3
+ ConfigValidationResult,
4
+ } from './queue.types.js'
2
5
 
3
6
  /**
4
7
  * Configuration mapping structure for queue implementations
@@ -1,2 +1,4 @@
1
- export { PikkuRPCService, rpcService } from './rpc-runner.js'
1
+ export { PikkuRPCService, rpcService, RPCNotFoundError } from './rpc-runner.js'
2
2
  export type { PikkuRPC, RPCMeta } from './rpc-types.js'
3
+ export { wireAddon } from './wire-addon.js'
4
+ export type { WireAddonConfig } from './wire-addon.js'
@@ -1,8 +1,27 @@
1
- import { CoreServices, PikkuWire } from '../../types/core.types.js'
1
+ import type { CoreServices, PikkuWire } from '../../types/core.types.js'
2
+ import type { SessionService } from '../../services/user-session-service.js'
3
+ import type { CoreUserSession } from '../../types/core.types.js'
2
4
  import { runPikkuFunc } from '../../function/function-runner.js'
3
5
  import { pikkuState } from '../../pikku-state.js'
4
6
  import { ForbiddenError } from '../../errors/errors.js'
5
- import { PikkuRPC, ResolvedFunction } from './rpc-types.js'
7
+ import { PikkuError } from '../../errors/error-handler.js'
8
+ import type { PikkuRPC, ResolvedFunction } from './rpc-types.js'
9
+ import { parseVersionedId } from '../../version.js'
10
+ import { encryptJSON } from '../../crypto-utils.js'
11
+
12
+ export class RPCNotFoundError extends PikkuError {
13
+ public readonly rpcName: string
14
+ constructor(rpcName: string) {
15
+ super(`RPC function not found: ${rpcName}`)
16
+ this.rpcName = rpcName
17
+ }
18
+ }
19
+ import type { AIAgentInput } from '../ai-agent/ai-agent.types.js'
20
+ import type { AIStreamChannel } from '../ai-agent/ai-agent.types.js'
21
+ import type { StreamAIAgentOptions } from '../ai-agent/ai-agent-prepare.js'
22
+ import { runAIAgent } from '../ai-agent/ai-agent-runner.js'
23
+ import { streamAIAgent, resumeAIAgent } from '../ai-agent/ai-agent-stream.js'
24
+ import { approveAIAgent } from '../ai-agent/ai-agent-registry.js'
6
25
 
7
26
  /**
8
27
  * Resolve a namespaced function reference to package and function names
@@ -19,23 +38,30 @@ const resolveNamespace = (
19
38
  const namespace = namespacedFunction.substring(0, colonIndex)
20
39
  const functionName = namespacedFunction.substring(colonIndex + 1)
21
40
 
22
- const externalPackages = pikkuState(null, 'rpc', 'externalPackages')
23
- const packageName = externalPackages.get(namespace)
24
- if (!packageName) {
41
+ const addons = pikkuState(null, 'rpc', 'addons')
42
+ const pkgConfig = addons.get(namespace)
43
+ if (!pkgConfig) {
25
44
  return null
26
45
  }
27
46
 
28
47
  return {
29
- package: packageName,
48
+ namespace,
49
+ package: pkgConfig.package,
30
50
  function: functionName,
31
51
  }
32
52
  }
33
53
 
34
54
  const getPikkuFunctionName = (rpcName: string): string => {
35
55
  const rpc = pikkuState(null, 'rpc', 'meta')
36
- const rpcMeta = rpc[rpcName]
56
+ let rpcMeta = rpc[rpcName]
37
57
  if (!rpcMeta) {
38
- throw new Error(`RPC function not found: ${rpcName}`)
58
+ const { baseName, version } = parseVersionedId(rpcName)
59
+ if (version !== null) {
60
+ rpcMeta = rpc[baseName]
61
+ }
62
+ }
63
+ if (!rpcMeta) {
64
+ throw new RPCNotFoundError(rpcName)
39
65
  }
40
66
  return rpcMeta
41
67
  }
@@ -47,11 +73,22 @@ export class ContextAwareRPCService {
47
73
  private wire: PikkuWire,
48
74
  private options: {
49
75
  requiresAuth?: boolean
76
+ sessionService?: SessionService<CoreUserSession>
50
77
  }
51
78
  ) {}
52
79
 
53
80
  public async rpcExposed(funcName: string, data: any): Promise<any> {
54
- const functionMeta = pikkuState(null, 'function', 'meta')[funcName]
81
+ let functionMeta: any
82
+ if (funcName.includes(':')) {
83
+ const resolved = resolveNamespace(funcName)
84
+ if (resolved) {
85
+ functionMeta = pikkuState(resolved.package, 'function', 'meta')[
86
+ resolved.function
87
+ ]
88
+ }
89
+ } else {
90
+ functionMeta = pikkuState(null, 'function', 'meta')[funcName]
91
+ }
55
92
  if (!functionMeta) {
56
93
  throw new Error(`Function not found: ${funcName}`)
57
94
  }
@@ -79,11 +116,7 @@ export class ContextAwareRPCService {
79
116
 
80
117
  // Check if it's a namespaced function call (e.g., 'stripe:createCharge')
81
118
  if (funcName.includes(':')) {
82
- return this.invokeExternalPackageFunction<In, Out>(
83
- funcName,
84
- data,
85
- updatedWire
86
- )
119
+ return this.invokeAddonFunction<In, Out>(funcName, data, updatedWire)
87
120
  }
88
121
 
89
122
  // Main package function
@@ -93,8 +126,6 @@ export class ContextAwareRPCService {
93
126
  getPikkuFunctionName(funcName),
94
127
  {
95
128
  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
129
  singletonServices: this.services,
99
130
  data: () => data,
100
131
  wire: updatedWire,
@@ -103,12 +134,12 @@ export class ContextAwareRPCService {
103
134
  }
104
135
 
105
136
  /**
106
- * Invoke a function from an external package
107
- * External packages register their functions in pikkuState under their package name.
137
+ * Invoke a function from an addon package
138
+ * Addon packages register their functions in pikkuState under their package name.
108
139
  * The function is executed using the parent services (shared singleton services).
109
140
  * @private
110
141
  */
111
- private async invokeExternalPackageFunction<In = any, Out = any>(
142
+ private async invokeAddonFunction<In = any, Out = any>(
112
143
  namespacedFunction: string,
113
144
  data: In,
114
145
  wire: PikkuWire
@@ -118,36 +149,38 @@ export class ContextAwareRPCService {
118
149
  if (!resolved) {
119
150
  throw new Error(
120
151
  `Unknown namespace in function reference: ${namespacedFunction}. ` +
121
- `Make sure the package is registered in externalPackages config.`
152
+ `Make sure the package is registered in addons config.`
122
153
  )
123
154
  }
124
155
 
125
- // Get the function meta from the external package
126
- // External packages use function meta, not RPC meta
127
- const externalFunctionMeta = pikkuState(
128
- resolved.package,
129
- 'function',
130
- 'meta'
131
- )
132
- const funcMeta = externalFunctionMeta[resolved.function]
156
+ // Get the function meta from the addon package
157
+ // Addon packages use function meta, not RPC meta
158
+ const addonFunctionMeta = pikkuState(resolved.package, 'function', 'meta')
159
+ const funcMeta = addonFunctionMeta[resolved.function]
133
160
  if (!funcMeta) {
134
161
  throw new Error(
135
162
  `Function '${resolved.function}' not found in package '${resolved.package}'. ` +
136
- `Available functions: ${Object.keys(externalFunctionMeta).join(', ') || '(none)'}`
163
+ `Available functions: ${Object.keys(addonFunctionMeta).join(', ') || '(none)'}`
137
164
  )
138
165
  }
139
- const funcName = funcMeta.pikkuFuncName || resolved.function
166
+ const funcName = funcMeta.pikkuFuncId || resolved.function
167
+
168
+ const addonConfig = pikkuState(null, 'rpc', 'addons').get(
169
+ resolved.namespace
170
+ )
171
+ const auth = addonConfig?.auth ?? this.options.requiresAuth
172
+ const tags = [...(addonConfig?.tags ?? []), ...(funcMeta.tags ?? [])]
140
173
 
141
- // Execute the function using runPikkuFunc with the external package's state
142
- // We use the parent services (this.services) since external packages share services
174
+ // Execute the function using runPikkuFunc with the addon package's state
175
+ // We use the parent services (this.services) since addon packages share services
143
176
  // Pass the function's tags so tag-based middleware/permissions are applied
144
177
  return runPikkuFunc<In, Out>('rpc', namespacedFunction, funcName, {
145
- auth: this.options.requiresAuth,
178
+ auth,
146
179
  singletonServices: this.services,
147
180
  data: () => data,
148
181
  wire,
149
182
  packageName: resolved.package,
150
- tags: funcMeta.tags,
183
+ tags,
151
184
  })
152
185
  }
153
186
 
@@ -183,17 +216,184 @@ export class ContextAwareRPCService {
183
216
 
184
217
  public async startWorkflow<In = any>(
185
218
  workflowName: string,
186
- input: In
219
+ input: In,
220
+ options?: {
221
+ startNode?: string
222
+ wire?: { type: string; id?: string; parentRunId?: string }
223
+ }
187
224
  ): Promise<{ runId: string }> {
188
225
  if (!this.services.workflowService) {
189
226
  throw new Error('WorkflowService service not available')
190
227
  }
228
+ const parentRunId = this.wire.workflowStep?.runId ?? this.wire.graph?.runId
229
+ const wire = options?.wire ?? {
230
+ type: this.wire.wireType ?? 'unknown',
231
+ id: this.wire.wireId,
232
+ ...(parentRunId ? { parentRunId } : {}),
233
+ }
191
234
  return this.services.workflowService.startWorkflow(
192
235
  workflowName,
193
236
  input,
194
- this
237
+ wire,
238
+ this,
239
+ options
195
240
  )
196
241
  }
242
+
243
+ public get agent() {
244
+ return {
245
+ run: async (agentName: string, input: AIAgentInput) => {
246
+ const result = await runAIAgent(agentName, input, {
247
+ sessionService: this.options.sessionService,
248
+ })
249
+ return {
250
+ runId: result.runId,
251
+ result: result.object ?? result.text,
252
+ usage: result.usage,
253
+ }
254
+ },
255
+ stream: async (
256
+ agentName: string,
257
+ input:
258
+ | { message: string; threadId: string; resourceId: string }
259
+ | Record<string, unknown>,
260
+ options?: StreamAIAgentOptions
261
+ ) => {
262
+ const channel = this.wire.channel as unknown as AIStreamChannel
263
+ if (!channel) throw new Error('No channel available for streaming')
264
+ await streamAIAgent(
265
+ agentName,
266
+ input,
267
+ channel,
268
+ { sessionService: this.options.sessionService },
269
+ undefined,
270
+ options
271
+ )
272
+ },
273
+ resume: async (
274
+ runId: string,
275
+ input: { toolCallId: string; approved: boolean },
276
+ options?: StreamAIAgentOptions
277
+ ) => {
278
+ const channel = this.wire.channel as unknown as AIStreamChannel
279
+ if (!channel) throw new Error('No channel available for streaming')
280
+ await resumeAIAgent(
281
+ { runId, ...input },
282
+ channel,
283
+ { sessionService: this.options.sessionService },
284
+ options
285
+ )
286
+ },
287
+ approve: async (
288
+ runId: string,
289
+ approvals: { toolCallId: string; approved: boolean }[],
290
+ expectedAgentName?: string
291
+ ) => {
292
+ if (!this.services.aiRunState)
293
+ throw new Error('AIRunStateService not available')
294
+ return approveAIAgent(
295
+ this.services.aiRunState,
296
+ runId,
297
+ approvals,
298
+ expectedAgentName
299
+ )
300
+ },
301
+ }
302
+ }
303
+
304
+ public async remote<In = any, Out = any>(
305
+ funcName: string,
306
+ data: In
307
+ ): Promise<Out> {
308
+ let endpoint: string | undefined
309
+ const headers: Record<string, string> = {
310
+ 'Content-Type': 'application/json',
311
+ }
312
+
313
+ const colonIndex = funcName.indexOf(':')
314
+ if (colonIndex !== -1) {
315
+ const namespace = funcName.substring(0, colonIndex)
316
+ const addons = pikkuState(null, 'rpc', 'addons')
317
+ const pkgConfig = addons.get(namespace)
318
+ endpoint = pkgConfig?.rpcEndpoint
319
+ }
320
+
321
+ if (!endpoint && this.services.deploymentService) {
322
+ const deployments =
323
+ await this.services.deploymentService.findFunction(funcName)
324
+ if (deployments.length > 0) {
325
+ endpoint = deployments[0].endpoint
326
+ }
327
+ }
328
+
329
+ if (!endpoint) {
330
+ throw new Error(
331
+ `No endpoint configured for remote RPC: ${funcName}. ` +
332
+ `Configure rpcEndpoint in addons config or set up a DeploymentService.`
333
+ )
334
+ }
335
+
336
+ let secret: string | undefined
337
+ if (this.services.secrets) {
338
+ try {
339
+ secret = await this.services.secrets.getSecret('PIKKU_REMOTE_SECRET')
340
+ } catch {}
341
+ }
342
+ if (secret) {
343
+ if (!this.services.jwt) {
344
+ throw new Error(
345
+ 'PIKKU_REMOTE_SECRET is set but JWT service is not available'
346
+ )
347
+ }
348
+ const session =
349
+ this.wire.getSession && typeof this.wire.getSession === 'function'
350
+ ? await this.wire.getSession()
351
+ : (this.wire as any).session
352
+ const sessionEnc = session
353
+ ? await encryptJSON(secret, { session })
354
+ : undefined
355
+ const token = await this.services.jwt.encode(
356
+ { value: 5, unit: 'minute' },
357
+ {
358
+ aud: 'pikku-remote',
359
+ fn: funcName,
360
+ iat: Date.now(),
361
+ session: sessionEnc,
362
+ }
363
+ )
364
+ headers.Authorization = `Bearer ${token}`
365
+ }
366
+
367
+ const url = `${endpoint}/rpc/${encodeURIComponent(funcName)}`
368
+ const timeoutMs = 30_000
369
+ const response = await fetch(url, {
370
+ method: 'POST',
371
+ headers,
372
+ body: JSON.stringify({ data }),
373
+ signal: AbortSignal.timeout(timeoutMs),
374
+ })
375
+
376
+ if (!response.ok) {
377
+ let errorBody: string
378
+ try {
379
+ errorBody = JSON.stringify(await response.json())
380
+ } catch {
381
+ errorBody = await response.text()
382
+ }
383
+ throw new Error(
384
+ `Remote RPC call failed: ${response.status} ${response.statusText}. ${errorBody}`
385
+ )
386
+ }
387
+
388
+ try {
389
+ return (await response.json()) as Out
390
+ } catch {
391
+ const text = await response.text()
392
+ throw new Error(
393
+ `Remote RPC call returned non-JSON response: ${response.status} ${response.statusText}. ${text}`
394
+ )
395
+ }
396
+ }
197
397
  }
198
398
 
199
399
  // RPC Service class for the global interface
@@ -205,18 +405,31 @@ export class PikkuRPCService<
205
405
  getContextRPCService(
206
406
  services: Services,
207
407
  wire: PikkuWire,
208
- requiresAuth?: boolean | undefined,
408
+ requiresAuthOrOptions?:
409
+ | boolean
410
+ | {
411
+ requiresAuth?: boolean
412
+ sessionService?: SessionService<CoreUserSession>
413
+ }
414
+ | undefined,
209
415
  depth: number = 0
210
416
  ): TypedRPC {
211
- const serviceRPC = new ContextAwareRPCService(services, wire, {
212
- requiresAuth,
213
- })
417
+ const options =
418
+ typeof requiresAuthOrOptions === 'object' &&
419
+ requiresAuthOrOptions !== null
420
+ ? requiresAuthOrOptions
421
+ : { requiresAuth: requiresAuthOrOptions }
422
+ const serviceRPC = new ContextAwareRPCService(services, wire, options)
214
423
  return {
215
424
  depth,
216
425
  global: false,
217
426
  invoke: serviceRPC.rpc.bind(serviceRPC),
218
- invokeExposed: serviceRPC.rpc.bind(serviceRPC),
427
+ remote: serviceRPC.remote.bind(serviceRPC),
428
+ exposed: serviceRPC.rpcExposed.bind(serviceRPC),
219
429
  startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
430
+ get agent() {
431
+ return serviceRPC.agent
432
+ },
220
433
  rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
221
434
  } as any
222
435
  }
@@ -1,13 +1,36 @@
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
+ AgentRun extends Function = any,
6
+ AgentStream extends Function = any,
7
+ > = {
2
8
  depth: number
3
9
  global: boolean
4
- invoke: invoke
10
+ invoke: Invoke
11
+ remote: Remote
12
+ exposed: (name: string, data: any) => Promise<any>
13
+ startWorkflow: startWorkflow
14
+ agent: {
15
+ run: AgentRun
16
+ stream: AgentStream
17
+ resume: (
18
+ runId: string,
19
+ input: { toolCallId: string; approved: boolean },
20
+ options?: any
21
+ ) => Promise<void>
22
+ approve: (
23
+ runId: string,
24
+ approvals: { toolCallId: string; approved: boolean }[],
25
+ expectedAgentName?: string
26
+ ) => Promise<any>
27
+ }
5
28
  }
6
29
 
7
30
  export type RPCMeta = {
8
- pikkuFuncName: string
31
+ pikkuFuncId: string
9
32
  expose: boolean
10
- internal?: boolean
33
+ remote?: boolean
11
34
  }
12
35
 
13
36
  /**
@@ -22,6 +45,7 @@ export interface RPCHandler<Input, Output> {
22
45
  * Resolved function reference from namespace
23
46
  */
24
47
  export interface ResolvedFunction {
48
+ namespace: string
25
49
  package: string
26
50
  function: string
27
51
  }
@@ -0,0 +1,20 @@
1
+ import { pikkuState } from '../../pikku-state.js'
2
+
3
+ export type WireAddonConfig = {
4
+ name: string
5
+ package: string
6
+ rpcEndpoint?: string
7
+ auth?: boolean
8
+ tags?: string[]
9
+ secretOverrides?: Record<string, string>
10
+ variableOverrides?: Record<string, string>
11
+ }
12
+
13
+ export const wireAddon = (config: WireAddonConfig): void => {
14
+ pikkuState(null, 'rpc', 'addons').set(config.name, {
15
+ package: config.package,
16
+ rpcEndpoint: config.rpcEndpoint,
17
+ auth: config.auth,
18
+ tags: config.tags,
19
+ })
20
+ }
@@ -1,9 +1,11 @@
1
- export * from './scheduler.types.js'
2
-
3
1
  export {
4
2
  runScheduledTask,
5
3
  wireScheduler,
6
4
  getScheduledTasks,
7
5
  } from './scheduler-runner.js'
8
-
9
- export * from './log-schedulers.js'
6
+ export { logSchedulers } from './log-schedulers.js'
7
+ export type {
8
+ CoreScheduledTask,
9
+ ScheduledTasksMeta,
10
+ PikkuScheduledTask,
11
+ } from './scheduler.types.js'
@@ -1,5 +1,5 @@
1
1
  import { pikkuState } from '../../pikku-state.js'
2
- import { Logger } from '../../services/index.js'
2
+ import type { Logger } from '../../services/index.js'
3
3
 
4
4
  /**
5
5
  * Logs all the loaded scheduled tasks.