@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
@@ -0,0 +1,287 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
3
+ /**
4
+ * In-memory implementation of WorkflowService for inline-only execution
5
+ *
6
+ * This is a lightweight workflow service that stores all state in memory.
7
+ * It only supports inline execution (no queue workers) and is ideal for:
8
+ * - CLI tools that need workflow-like step orchestration
9
+ * - Testing and development
10
+ * - Single-process applications without persistence requirements
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const workflowService = new InMemoryWorkflowService()
15
+ * await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
16
+ * ```
17
+ */
18
+ export class InMemoryWorkflowService extends PikkuWorkflowService {
19
+ runs = new Map();
20
+ steps = new Map(); // keyed by `${runId}:${stepName}`
21
+ stepData = new Map(); // keyed by stepId
22
+ stepHistory = new Map(); // keyed by runId
23
+ runState = new Map(); // keyed by runId
24
+ branchKeys = new Map(); // keyed by stepId
25
+ workflowVersions = new Map(); // keyed by `${name}:${graphHash}`
26
+ async createRun(workflowName, input, inline, graphHash, wire) {
27
+ const runId = randomUUID();
28
+ const now = new Date();
29
+ const run = {
30
+ id: runId,
31
+ workflow: workflowName,
32
+ status: 'running',
33
+ input,
34
+ inline,
35
+ graphHash,
36
+ wire,
37
+ createdAt: now,
38
+ updatedAt: now,
39
+ };
40
+ this.runs.set(runId, run);
41
+ this.stepHistory.set(runId, []);
42
+ this.runState.set(runId, {});
43
+ if (inline) {
44
+ this.registerInlineRun(runId);
45
+ }
46
+ return runId;
47
+ }
48
+ async getRun(id) {
49
+ return this.runs.get(id) || null;
50
+ }
51
+ async getRunHistory(runId) {
52
+ return this.stepHistory.get(runId) || [];
53
+ }
54
+ async updateRunStatus(id, status, output, error) {
55
+ const run = this.runs.get(id);
56
+ if (run) {
57
+ run.status = status;
58
+ run.updatedAt = new Date();
59
+ if (output !== undefined)
60
+ run.output = output;
61
+ if (error !== undefined)
62
+ run.error = error;
63
+ }
64
+ }
65
+ async insertStepState(runId, stepName, rpcName, data, stepOptions) {
66
+ const stepId = randomUUID();
67
+ const now = new Date();
68
+ const step = {
69
+ stepId,
70
+ status: 'pending',
71
+ attemptCount: 1,
72
+ retries: stepOptions?.retries,
73
+ retryDelay: stepOptions?.retryDelay,
74
+ createdAt: now,
75
+ updatedAt: now,
76
+ };
77
+ const key = `${runId}:${stepName}`;
78
+ this.steps.set(key, step);
79
+ this.stepData.set(stepId, { rpcName, data, stepName });
80
+ // Add to history
81
+ const history = this.stepHistory.get(runId) || [];
82
+ history.push({ ...step, stepName });
83
+ this.stepHistory.set(runId, history);
84
+ return step;
85
+ }
86
+ async getStepState(runId, stepName) {
87
+ const key = `${runId}:${stepName}`;
88
+ const step = this.steps.get(key);
89
+ if (!step) {
90
+ return {
91
+ stepId: '',
92
+ status: 'pending',
93
+ attemptCount: 0,
94
+ createdAt: new Date(),
95
+ updatedAt: new Date(),
96
+ };
97
+ }
98
+ return step;
99
+ }
100
+ async setStepRunning(stepId) {
101
+ for (const step of this.steps.values()) {
102
+ if (step.stepId === stepId) {
103
+ step.status = 'running';
104
+ step.runningAt = new Date();
105
+ step.updatedAt = new Date();
106
+ break;
107
+ }
108
+ }
109
+ }
110
+ async setStepScheduled(stepId) {
111
+ for (const step of this.steps.values()) {
112
+ if (step.stepId === stepId) {
113
+ step.status = 'scheduled';
114
+ step.scheduledAt = new Date();
115
+ step.updatedAt = new Date();
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ async setStepResult(stepId, result) {
121
+ for (const step of this.steps.values()) {
122
+ if (step.stepId === stepId) {
123
+ step.status = 'succeeded';
124
+ step.result = result;
125
+ step.succeededAt = new Date();
126
+ step.updatedAt = new Date();
127
+ break;
128
+ }
129
+ }
130
+ }
131
+ async setStepError(stepId, error) {
132
+ for (const step of this.steps.values()) {
133
+ if (step.stepId === stepId) {
134
+ step.status = 'failed';
135
+ step.error = {
136
+ name: error.name,
137
+ message: error.message,
138
+ stack: error.stack,
139
+ };
140
+ step.failedAt = new Date();
141
+ step.updatedAt = new Date();
142
+ break;
143
+ }
144
+ }
145
+ }
146
+ async createRetryAttempt(failedStepId, status) {
147
+ // Find the failed step
148
+ let failedStep;
149
+ let runId;
150
+ let stepName;
151
+ for (const [key, step] of this.steps.entries()) {
152
+ if (step.stepId === failedStepId) {
153
+ failedStep = step;
154
+ const parts = key.split(':');
155
+ runId = parts[0];
156
+ stepName = parts.slice(1).join(':');
157
+ break;
158
+ }
159
+ }
160
+ if (!failedStep || !runId || !stepName) {
161
+ throw new Error(`Step not found: ${failedStepId}`);
162
+ }
163
+ const failedStepData = this.stepData.get(failedStepId);
164
+ const newStepId = randomUUID();
165
+ const now = new Date();
166
+ const newStep = {
167
+ stepId: newStepId,
168
+ status,
169
+ attemptCount: failedStep.attemptCount + 1,
170
+ retries: failedStep.retries,
171
+ retryDelay: failedStep.retryDelay,
172
+ createdAt: now,
173
+ updatedAt: now,
174
+ };
175
+ if (status === 'running') {
176
+ newStep.runningAt = now;
177
+ }
178
+ const key = `${runId}:${stepName}`;
179
+ this.steps.set(key, newStep);
180
+ // Copy step data to new step
181
+ if (failedStepData) {
182
+ this.stepData.set(newStepId, { ...failedStepData });
183
+ }
184
+ // Add to history
185
+ const history = this.stepHistory.get(runId) || [];
186
+ history.push({ ...newStep, stepName });
187
+ this.stepHistory.set(runId, history);
188
+ return newStep;
189
+ }
190
+ async withRunLock(_id, fn) {
191
+ // In-memory service doesn't need locking for inline execution
192
+ return fn();
193
+ }
194
+ async withStepLock(_runId, _stepName, fn) {
195
+ // In-memory service doesn't need locking for inline execution
196
+ return fn();
197
+ }
198
+ async close() {
199
+ // Clear all in-memory state
200
+ this.runs.clear();
201
+ this.steps.clear();
202
+ this.stepData.clear();
203
+ this.stepHistory.clear();
204
+ this.runState.clear();
205
+ this.branchKeys.clear();
206
+ this.workflowVersions.clear();
207
+ }
208
+ // Graph workflow methods
209
+ async getCompletedGraphState(runId) {
210
+ const completedNodeIds = [];
211
+ const failedNodeIds = [];
212
+ const prefix = `${runId}:`;
213
+ for (const [key, step] of this.steps.entries()) {
214
+ if (!key.startsWith(prefix))
215
+ continue;
216
+ const nodeId = key.substring(prefix.length);
217
+ if (step.status === 'succeeded') {
218
+ completedNodeIds.push(nodeId);
219
+ }
220
+ else if (step.status === 'failed') {
221
+ const maxAttempts = (step.retries ?? 0) + 1;
222
+ if (step.attemptCount >= maxAttempts) {
223
+ failedNodeIds.push(nodeId);
224
+ }
225
+ }
226
+ }
227
+ const branchKeys = {};
228
+ for (const [stepId, branchKey] of this.branchKeys.entries()) {
229
+ const stepData = this.stepData.get(stepId);
230
+ if (stepData) {
231
+ branchKeys[stepData.stepName] = branchKey;
232
+ }
233
+ }
234
+ return { completedNodeIds, failedNodeIds, branchKeys };
235
+ }
236
+ async getNodesWithoutSteps(runId, nodeIds) {
237
+ const existingSteps = new Set();
238
+ const prefix = `${runId}:`;
239
+ for (const [key] of this.steps.entries()) {
240
+ if (key.startsWith(prefix)) {
241
+ existingSteps.add(key.substring(prefix.length));
242
+ }
243
+ }
244
+ return nodeIds.filter((id) => !existingSteps.has(id));
245
+ }
246
+ async getNodeResults(runId, nodeIds) {
247
+ const results = {};
248
+ for (const nodeId of nodeIds) {
249
+ const key = `${runId}:${nodeId}`;
250
+ const step = this.steps.get(key);
251
+ if (step?.result !== undefined) {
252
+ results[nodeId] = step.result;
253
+ }
254
+ }
255
+ return results;
256
+ }
257
+ async setBranchKey(runId, nodeId, branchKey) {
258
+ const key = `${runId}:${nodeId}`;
259
+ const step = this.steps.get(key);
260
+ if (step) {
261
+ this.branchKeys.set(step.stepId, branchKey);
262
+ }
263
+ }
264
+ async setBranchTaken(stepId, branchKey) {
265
+ this.branchKeys.set(stepId, branchKey);
266
+ }
267
+ async updateRunState(runId, name, value) {
268
+ const state = this.runState.get(runId) || {};
269
+ state[name] = value;
270
+ this.runState.set(runId, state);
271
+ }
272
+ async getRunState(runId) {
273
+ return this.runState.get(runId) || {};
274
+ }
275
+ async upsertWorkflowVersion(name, graphHash, graph, source) {
276
+ this.workflowVersions.set(`${name}:${graphHash}`, {
277
+ graph,
278
+ source,
279
+ });
280
+ }
281
+ async getWorkflowVersion(name, graphHash) {
282
+ const version = this.workflowVersions.get(`${name}:${graphHash}`);
283
+ if (!version)
284
+ return null;
285
+ return { graph: version.graph, source: version.source };
286
+ }
287
+ }
@@ -1,14 +1,29 @@
1
1
  /**
2
2
  * @module @pikku/core
3
3
  */
4
- export * from './content-service.js';
5
- export * from './jwt-service.js';
6
- export * from './logger.js';
7
- export * from './secret-service.js';
8
- export * from './variables-service.js';
9
- export * from './schema-service.js';
10
- export * from './user-session-service.js';
11
- export * from './scheduler-service.js';
12
- export * from './local-secrets.js';
13
- export * from './local-variables.js';
14
- export * from './logger-console.js';
4
+ export { LogLevel } from './logger.js';
5
+ export { ScopedSecretService } from './scoped-secret-service.js';
6
+ export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
7
+ export { TypedSecretService } from './typed-secret-service.js';
8
+ export { TypedVariablesService } from './typed-variables-service.js';
9
+ export { LocalSecretService } from './local-secrets.js';
10
+ export { LocalVariablesService } from './local-variables.js';
11
+ export { ConsoleLogger } from './logger-console.js';
12
+ export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
13
+ export { InMemoryTriggerService } from './in-memory-trigger-service.js';
14
+ export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
15
+ export type { ContentService } from './content-service.js';
16
+ export type { JWTService } from './jwt-service.js';
17
+ export type { Logger } from './logger.js';
18
+ export type { SecretService } from './secret-service.js';
19
+ export type { VariablesService } from './variables-service.js';
20
+ export type { SchemaService } from './schema-service.js';
21
+ export type { SessionService } from './user-session-service.js';
22
+ export type { ScheduledTaskSummary, ScheduledTaskInfo, SchedulerService, } from './scheduler-service.js';
23
+ export type { TriggerService } from './trigger-service.js';
24
+ export type { DeploymentService, DeploymentConfig, DeploymentInfo, DeploymentServiceConfig, } from './deployment-service.js';
25
+ export type { AIStorageService } from './ai-storage-service.js';
26
+ export type { AIAgentRunnerParams, AIAgentRunnerResult, AIAgentStepResult, AIAgentRunnerService, } from './ai-agent-runner-service.js';
27
+ export type { CreateRunInput, AIRunStateService, } from './ai-run-state-service.js';
28
+ export type { CredentialStatus, CredentialMeta, } from './typed-secret-service.js';
29
+ export type { VariableStatus, VariableMeta } from './typed-variables-service.js';
@@ -1,16 +1,14 @@
1
1
  /**
2
2
  * @module @pikku/core
3
3
  */
4
- // Interfaces
5
- export * from './content-service.js';
6
- export * from './jwt-service.js';
7
- export * from './logger.js';
8
- export * from './secret-service.js';
9
- export * from './variables-service.js';
10
- export * from './schema-service.js';
11
- export * from './user-session-service.js';
12
- export * from './scheduler-service.js';
13
- // Local implementations
14
- export * from './local-secrets.js';
15
- export * from './local-variables.js';
16
- export * from './logger-console.js';
4
+ export { LogLevel } from './logger.js';
5
+ export { ScopedSecretService } from './scoped-secret-service.js';
6
+ export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
7
+ export { TypedSecretService } from './typed-secret-service.js';
8
+ export { TypedVariablesService } from './typed-variables-service.js';
9
+ export { LocalSecretService } from './local-secrets.js';
10
+ export { LocalVariablesService } from './local-variables.js';
11
+ export { ConsoleLogger } from './logger-console.js';
12
+ export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
13
+ export { InMemoryTriggerService } from './in-memory-trigger-service.js';
14
+ export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
@@ -1,4 +1,4 @@
1
- import { ContentService, Logger } from '@pikku/core/services';
1
+ import type { ContentService, Logger } from '@pikku/core/services';
2
2
  export interface LocalContentConfig {
3
3
  localFileUploadPath: string;
4
4
  uploadUrlPrefix: string;
@@ -20,6 +20,7 @@ export declare class LocalContent implements ContentService {
20
20
  writeFile(assetKey: string, stream: ReadableStream | NodeJS.ReadableStream): Promise<boolean>;
21
21
  copyFile(assetKey: string, fromAbsolutePath: string): Promise<boolean>;
22
22
  readFile(assetKey: string): Promise<ReadableStream | NodeJS.ReadableStream>;
23
+ readFileAsBuffer(assetKey: string): Promise<Buffer>;
23
24
  deleteFile(assetKey: string): Promise<boolean>;
24
25
  private createDirectoryForFile;
25
26
  }
@@ -1,5 +1,5 @@
1
1
  import { createReadStream, createWriteStream, promises } from 'fs';
2
- import { mkdir } from 'fs/promises';
2
+ import { mkdir, readFile } from 'fs/promises';
3
3
  import { pipeline } from 'stream/promises';
4
4
  export class LocalContent {
5
5
  config;
@@ -69,6 +69,11 @@ export class LocalContent {
69
69
  throw e;
70
70
  }
71
71
  }
72
+ async readFileAsBuffer(assetKey) {
73
+ const filePath = `${this.config.localFileUploadPath}/${assetKey}`;
74
+ this.logger.debug(`Reading file as buffer: ${assetKey}`);
75
+ return readFile(filePath);
76
+ }
72
77
  async deleteFile(assetKey) {
73
78
  this.logger.debug(`deleting key: ${assetKey}`);
74
79
  try {
@@ -1,16 +1,19 @@
1
- import { SecretService } from './secret-service.js';
2
- import { VariablesService } from './variables-service.js';
1
+ import type { SecretService } from './secret-service.js';
2
+ import type { VariablesService } from './variables-service.js';
3
3
  /**
4
4
  * Service for retrieving secrets from environment variables.
5
+ * Supports storing secrets locally in memory for CLI operations.
5
6
  */
6
7
  export declare class LocalSecretService implements SecretService {
7
8
  private variables;
9
+ private localSecrets;
8
10
  /**
9
11
  * Creates an instance of LocalSecretService.
10
12
  */
11
13
  constructor(variables?: VariablesService);
12
14
  /**
13
15
  * Retrieves a secret by key.
16
+ * Checks local storage first, then falls back to environment variables.
14
17
  * @param key - The key of the secret to retrieve.
15
18
  * @returns A promise that resolves to the secret value.
16
19
  * @throws {Error} If the secret is not found.
@@ -18,9 +21,29 @@ export declare class LocalSecretService implements SecretService {
18
21
  getSecretJSON<R>(key: string): Promise<R>;
19
22
  /**
20
23
  * Retrieves a secret by key.
24
+ * Checks local storage first, then falls back to environment variables.
21
25
  * @param key - The key of the secret to retrieve.
22
26
  * @returns A promise that resolves to the secret value.
23
27
  * @throws {Error} If the secret is not found.
24
28
  */
25
29
  getSecret(key: string): Promise<string>;
30
+ /**
31
+ * Stores a JSON value as a secret in local storage.
32
+ * @param key - The key to store the secret under.
33
+ * @param value - The JSON value to store.
34
+ * @returns A promise that resolves when the secret is stored.
35
+ */
36
+ setSecretJSON(key: string, value: unknown): Promise<void>;
37
+ /**
38
+ * Checks if a secret exists without throwing.
39
+ * @param key - The key of the secret to check.
40
+ * @returns A promise that resolves to true if the secret exists.
41
+ */
42
+ hasSecret(key: string): Promise<boolean>;
43
+ /**
44
+ * Deletes a secret from local storage.
45
+ * @param key - The key of the secret to delete.
46
+ * @returns A promise that resolves when the secret is deleted.
47
+ */
48
+ deleteSecret(key: string): Promise<void>;
26
49
  }
@@ -1,9 +1,11 @@
1
1
  import { LocalVariablesService } from './local-variables.js';
2
2
  /**
3
3
  * Service for retrieving secrets from environment variables.
4
+ * Supports storing secrets locally in memory for CLI operations.
4
5
  */
5
6
  export class LocalSecretService {
6
7
  variables;
8
+ localSecrets = new Map();
7
9
  /**
8
10
  * Creates an instance of LocalSecretService.
9
11
  */
@@ -12,11 +14,18 @@ export class LocalSecretService {
12
14
  }
13
15
  /**
14
16
  * Retrieves a secret by key.
17
+ * Checks local storage first, then falls back to environment variables.
15
18
  * @param key - The key of the secret to retrieve.
16
19
  * @returns A promise that resolves to the secret value.
17
20
  * @throws {Error} If the secret is not found.
18
21
  */
19
22
  async getSecretJSON(key) {
23
+ // Check local storage first
24
+ const localValue = this.localSecrets.get(key);
25
+ if (localValue) {
26
+ return JSON.parse(localValue);
27
+ }
28
+ // Fall back to environment variables
20
29
  const value = await this.variables.get(key);
21
30
  if (value) {
22
31
  return JSON.parse(value);
@@ -25,15 +34,51 @@ export class LocalSecretService {
25
34
  }
26
35
  /**
27
36
  * Retrieves a secret by key.
37
+ * Checks local storage first, then falls back to environment variables.
28
38
  * @param key - The key of the secret to retrieve.
29
39
  * @returns A promise that resolves to the secret value.
30
40
  * @throws {Error} If the secret is not found.
31
41
  */
32
42
  async getSecret(key) {
43
+ // Check local storage first
44
+ const localValue = this.localSecrets.get(key);
45
+ if (localValue) {
46
+ return localValue;
47
+ }
48
+ // Fall back to environment variables
33
49
  const value = await this.variables.get(key);
34
50
  if (value) {
35
51
  return value;
36
52
  }
37
53
  throw new Error(`Secret Not Found: ${key}`);
38
54
  }
55
+ /**
56
+ * Stores a JSON value as a secret in local storage.
57
+ * @param key - The key to store the secret under.
58
+ * @param value - The JSON value to store.
59
+ * @returns A promise that resolves when the secret is stored.
60
+ */
61
+ async setSecretJSON(key, value) {
62
+ this.localSecrets.set(key, JSON.stringify(value));
63
+ }
64
+ /**
65
+ * Checks if a secret exists without throwing.
66
+ * @param key - The key of the secret to check.
67
+ * @returns A promise that resolves to true if the secret exists.
68
+ */
69
+ async hasSecret(key) {
70
+ if (this.localSecrets.has(key)) {
71
+ return true;
72
+ }
73
+ const value = await this.variables.get(key);
74
+ return value !== undefined && value !== null && value !== '';
75
+ }
76
+ /**
77
+ * Deletes a secret from local storage.
78
+ * @param key - The key of the secret to delete.
79
+ * @returns A promise that resolves when the secret is deleted.
80
+ */
81
+ async deleteSecret(key) {
82
+ this.localSecrets.delete(key);
83
+ }
39
84
  }
@@ -1,7 +1,12 @@
1
- import { VariablesService } from './variables-service.js';
1
+ import type { VariablesService } from './variables-service.js';
2
2
  export declare class LocalVariablesService implements VariablesService {
3
3
  private variables;
4
4
  constructor(variables?: Record<string, string | undefined>);
5
5
  getAll(): Promise<Record<string, string | undefined>> | Record<string, string | undefined>;
6
6
  get(name: string): Promise<string | undefined> | string | undefined;
7
+ getJSON<T = unknown>(name: string): T | undefined;
8
+ set(name: string, value: string): void;
9
+ setJSON(name: string, value: unknown): void;
10
+ has(name: string): boolean;
11
+ delete(name: string): void;
7
12
  }
@@ -9,4 +9,22 @@ export class LocalVariablesService {
9
9
  get(name) {
10
10
  return this.variables[name];
11
11
  }
12
+ getJSON(name) {
13
+ const value = this.variables[name];
14
+ if (value === undefined)
15
+ return undefined;
16
+ return JSON.parse(value);
17
+ }
18
+ set(name, value) {
19
+ this.variables[name] = value;
20
+ }
21
+ setJSON(name, value) {
22
+ this.variables[name] = JSON.stringify(value);
23
+ }
24
+ has(name) {
25
+ return name in this.variables && this.variables[name] !== undefined;
26
+ }
27
+ delete(name) {
28
+ delete this.variables[name];
29
+ }
12
30
  }
@@ -1,4 +1,5 @@
1
- import { Logger, LogLevel } from './logger.js';
1
+ import type { Logger } from './logger.js';
2
+ import { LogLevel } from './logger.js';
2
3
  /**
3
4
  * A logger implementation that logs messages to the console.
4
5
  */
@@ -1,4 +1,4 @@
1
- import { CoreUserSession } from '../types/core.types.js';
1
+ import type { CoreUserSession } from '../types/core.types.js';
2
2
  /**
3
3
  * Minimal metadata for listing scheduled tasks
4
4
  */
@@ -60,4 +60,12 @@ export declare abstract class SchedulerService {
60
60
  * Close any open connections
61
61
  */
62
62
  abstract close(): Promise<void>;
63
+ /**
64
+ * Start recurring scheduled tasks
65
+ */
66
+ start(): Promise<void>;
67
+ /**
68
+ * Stop recurring scheduled tasks
69
+ */
70
+ stop(): Promise<void>;
63
71
  }
@@ -3,4 +3,12 @@
3
3
  * Implementations use queue backends (pg-boss, BullMQ) for distributed scheduling
4
4
  */
5
5
  export class SchedulerService {
6
+ /**
7
+ * Start recurring scheduled tasks
8
+ */
9
+ async start() { }
10
+ /**
11
+ * Stop recurring scheduled tasks
12
+ */
13
+ async stop() { }
6
14
  }
@@ -21,4 +21,10 @@ export interface SchemaService {
21
21
  * @returns {Set<string>} A set containing the names of all available schemas.
22
22
  */
23
23
  getSchemaNames: () => Set<string>;
24
+ /**
25
+ * Retrieves the property keys from a compiled JSON schema.
26
+ * @param {string} schemaName - The name of the schema.
27
+ * @returns {string[]} An array of property keys, or empty array if schema not found.
28
+ */
29
+ getSchemaKeys: (schemaName: string) => string[];
24
30
  }
@@ -0,0 +1,16 @@
1
+ import type { SecretService } from './secret-service.js';
2
+ /**
3
+ * A read-only wrapper around SecretService that restricts access
4
+ * to only a defined set of allowed secret keys.
5
+ */
6
+ export declare class ScopedSecretService implements SecretService {
7
+ private secrets;
8
+ private allowedKeys;
9
+ constructor(secrets: SecretService, allowedKeys: Set<string>);
10
+ private assertAllowed;
11
+ getSecret(key: string): Promise<string>;
12
+ getSecretJSON<T = {}>(key: string): Promise<T>;
13
+ hasSecret(key: string): Promise<boolean>;
14
+ setSecretJSON(_key: string, _value: unknown): Promise<void>;
15
+ deleteSecret(_key: string): Promise<void>;
16
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * A read-only wrapper around SecretService that restricts access
3
+ * to only a defined set of allowed secret keys.
4
+ */
5
+ export class ScopedSecretService {
6
+ secrets;
7
+ allowedKeys;
8
+ constructor(secrets, allowedKeys) {
9
+ this.secrets = secrets;
10
+ this.allowedKeys = allowedKeys;
11
+ }
12
+ assertAllowed(key) {
13
+ if (!this.allowedKeys.has(key)) {
14
+ throw new Error(`Access denied to secret key: ${key}`);
15
+ }
16
+ }
17
+ async getSecret(key) {
18
+ this.assertAllowed(key);
19
+ return this.secrets.getSecret(key);
20
+ }
21
+ async getSecretJSON(key) {
22
+ this.assertAllowed(key);
23
+ return this.secrets.getSecretJSON(key);
24
+ }
25
+ async hasSecret(key) {
26
+ this.assertAllowed(key);
27
+ return this.secrets.hasSecret(key);
28
+ }
29
+ async setSecretJSON(_key, _value) {
30
+ throw new Error('setSecretJSON is not allowed in scoped secret service');
31
+ }
32
+ async deleteSecret(_key) {
33
+ throw new Error('deleteSecret is not allowed in scoped secret service');
34
+ }
35
+ }