@pikku/core 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/error-handler.js +3 -3
  5. package/dist/errors/errors.d.ts +8 -0
  6. package/dist/errors/errors.js +16 -0
  7. package/dist/errors/index.d.ts +0 -1
  8. package/dist/errors/index.js +0 -1
  9. package/dist/function/function-runner.d.ts +10 -3
  10. package/dist/function/function-runner.js +136 -31
  11. package/dist/function/functions.types.d.ts +35 -12
  12. package/dist/function/functions.types.js +16 -6
  13. package/dist/function/index.d.ts +2 -2
  14. package/dist/function/index.js +1 -2
  15. package/dist/handle-error.js +1 -10
  16. package/dist/index.d.ts +30 -24
  17. package/dist/index.js +19 -27
  18. package/dist/middleware/auth-apikey.d.ts +1 -1
  19. package/dist/middleware/auth-apikey.js +3 -3
  20. package/dist/middleware/auth-bearer.d.ts +1 -1
  21. package/dist/middleware/auth-bearer.js +3 -6
  22. package/dist/middleware/auth-cookie.d.ts +1 -1
  23. package/dist/middleware/auth-cookie.js +6 -8
  24. package/dist/middleware/cors.d.ts +46 -0
  25. package/dist/middleware/cors.js +73 -0
  26. package/dist/middleware/index.d.ts +5 -3
  27. package/dist/middleware/index.js +5 -3
  28. package/dist/middleware/remote-auth.d.ts +5 -0
  29. package/dist/middleware/remote-auth.js +55 -0
  30. package/dist/middleware/timeout.d.ts +1 -1
  31. package/dist/middleware-runner.d.ts +3 -14
  32. package/dist/middleware-runner.js +14 -16
  33. package/dist/permissions.d.ts +3 -86
  34. package/dist/permissions.js +20 -80
  35. package/dist/pikku-state.d.ts +33 -104
  36. package/dist/pikku-state.js +150 -66
  37. package/dist/schema.d.ts +8 -6
  38. package/dist/schema.js +31 -18
  39. package/dist/services/ai-agent-runner-service.d.ts +24 -0
  40. package/dist/services/ai-agent-runner-service.js +1 -0
  41. package/dist/services/ai-run-state-service.d.ts +13 -0
  42. package/dist/services/ai-run-state-service.js +1 -0
  43. package/dist/services/ai-storage-service.d.ts +18 -0
  44. package/dist/services/ai-storage-service.js +1 -0
  45. package/dist/services/deployment-service.d.ts +19 -0
  46. package/dist/services/deployment-service.js +1 -0
  47. package/dist/services/gopass-secrets.d.ts +47 -0
  48. package/dist/services/gopass-secrets.js +94 -0
  49. package/dist/services/in-memory-trigger-service.d.ts +23 -0
  50. package/dist/services/in-memory-trigger-service.js +50 -0
  51. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  52. package/dist/services/in-memory-workflow-service.js +287 -0
  53. package/dist/services/index.d.ts +25 -11
  54. package/dist/services/index.js +10 -13
  55. package/dist/services/local-secrets.d.ts +23 -0
  56. package/dist/services/local-secrets.js +45 -0
  57. package/dist/services/local-variables.d.ts +5 -0
  58. package/dist/services/local-variables.js +18 -0
  59. package/dist/services/scheduler-service.d.ts +21 -1
  60. package/dist/services/scheduler-service.js +14 -0
  61. package/dist/services/schema-service.d.ts +6 -0
  62. package/dist/services/scoped-secret-service.d.ts +16 -0
  63. package/dist/services/scoped-secret-service.js +35 -0
  64. package/dist/services/secret-service.d.ts +25 -4
  65. package/dist/services/trigger-service.d.ts +23 -0
  66. package/dist/services/trigger-service.js +1 -0
  67. package/dist/services/typed-secret-service.d.ts +30 -0
  68. package/dist/services/typed-secret-service.js +40 -0
  69. package/dist/services/typed-variables-service.d.ts +27 -0
  70. package/dist/services/typed-variables-service.js +46 -0
  71. package/dist/services/user-session-service.d.ts +13 -0
  72. package/dist/services/user-session-service.js +17 -0
  73. package/dist/services/variables-service.d.ts +5 -0
  74. package/dist/services/workflow-service.d.ts +43 -0
  75. package/dist/services/workflow-service.js +1 -0
  76. package/dist/types/core.types.d.ts +54 -10
  77. package/dist/types/core.types.js +7 -0
  78. package/dist/types/state.types.d.ts +127 -0
  79. package/dist/types/state.types.js +1 -0
  80. package/dist/utils.d.ts +10 -1
  81. package/dist/utils.js +60 -3
  82. package/dist/version.d.ts +6 -0
  83. package/dist/version.js +19 -0
  84. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  85. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  86. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  87. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  88. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
  89. package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
  90. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  91. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  92. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  93. package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
  94. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
  95. package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
  96. package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
  97. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  98. package/dist/wirings/ai-agent/index.d.ts +5 -0
  99. package/dist/wirings/ai-agent/index.js +4 -0
  100. package/dist/wirings/channel/channel-common.d.ts +7 -4
  101. package/dist/wirings/channel/channel-common.js +15 -8
  102. package/dist/wirings/channel/channel-handler.js +13 -4
  103. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  104. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  105. package/dist/wirings/channel/channel-runner.js +12 -12
  106. package/dist/wirings/channel/channel.types.d.ts +5 -1
  107. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  108. package/dist/wirings/channel/define-channel-routes.js +23 -0
  109. package/dist/wirings/channel/index.d.ts +10 -8
  110. package/dist/wirings/channel/index.js +7 -8
  111. package/dist/wirings/channel/local/index.d.ts +3 -3
  112. package/dist/wirings/channel/local/index.js +3 -3
  113. package/dist/wirings/channel/local/local-channel-runner.js +18 -6
  114. package/dist/wirings/channel/log-channels.js +1 -1
  115. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  116. package/dist/wirings/channel/serverless/index.js +1 -1
  117. package/dist/wirings/channel/serverless/serverless-channel-runner.js +17 -6
  118. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
  119. package/dist/wirings/cli/channel/index.d.ts +1 -1
  120. package/dist/wirings/cli/channel/index.js +1 -1
  121. package/dist/wirings/cli/cli-runner.d.ts +1 -1
  122. package/dist/wirings/cli/cli-runner.js +22 -18
  123. package/dist/wirings/cli/cli.types.d.ts +7 -6
  124. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  125. package/dist/wirings/cli/define-cli-commands.js +20 -0
  126. package/dist/wirings/cli/index.d.ts +2 -3
  127. package/dist/wirings/cli/index.js +1 -3
  128. package/dist/wirings/http/http-routes.d.ts +69 -0
  129. package/dist/wirings/http/http-routes.js +139 -0
  130. package/dist/wirings/http/http-runner.d.ts +2 -2
  131. package/dist/wirings/http/http-runner.js +62 -27
  132. package/dist/wirings/http/http.types.d.ts +77 -24
  133. package/dist/wirings/http/index.d.ts +5 -4
  134. package/dist/wirings/http/index.js +4 -3
  135. package/dist/wirings/http/log-http-routes.js +1 -1
  136. package/dist/wirings/http/routers/path-to-regex.js +2 -2
  137. package/dist/wirings/mcp/index.d.ts +4 -3
  138. package/dist/wirings/mcp/index.js +3 -3
  139. package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
  140. package/dist/wirings/mcp/mcp-runner.js +42 -56
  141. package/dist/wirings/mcp/mcp.types.d.ts +3 -3
  142. package/dist/wirings/node/index.d.ts +2 -0
  143. package/dist/wirings/node/index.js +1 -0
  144. package/dist/wirings/node/node.types.d.ts +20 -0
  145. package/dist/wirings/node/node.types.js +1 -0
  146. package/dist/wirings/oauth2/index.d.ts +3 -0
  147. package/dist/wirings/oauth2/index.js +2 -0
  148. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  149. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  150. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  151. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  152. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  153. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  154. package/dist/wirings/queue/index.d.ts +2 -2
  155. package/dist/wirings/queue/index.js +1 -1
  156. package/dist/wirings/queue/queue-runner.d.ts +7 -0
  157. package/dist/wirings/queue/queue-runner.js +23 -12
  158. package/dist/wirings/queue/queue.types.d.ts +8 -2
  159. package/dist/wirings/rpc/index.d.ts +1 -1
  160. package/dist/wirings/rpc/index.js +1 -1
  161. package/dist/wirings/rpc/rpc-runner.d.ts +40 -13
  162. package/dist/wirings/rpc/rpc-runner.js +191 -25
  163. package/dist/wirings/rpc/rpc-types.d.ts +15 -4
  164. package/dist/wirings/scheduler/index.d.ts +3 -3
  165. package/dist/wirings/scheduler/index.js +2 -3
  166. package/dist/wirings/scheduler/log-schedulers.js +1 -1
  167. package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
  168. package/dist/wirings/scheduler/scheduler-runner.js +28 -10
  169. package/dist/wirings/secret/index.d.ts +3 -0
  170. package/dist/wirings/secret/index.js +2 -0
  171. package/dist/wirings/secret/secret.types.d.ts +27 -0
  172. package/dist/wirings/secret/secret.types.js +1 -0
  173. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  174. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  175. package/dist/wirings/trigger/index.d.ts +3 -0
  176. package/dist/wirings/trigger/index.js +2 -0
  177. package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
  178. package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
  179. package/dist/wirings/trigger/trigger-runner.d.ts +42 -0
  180. package/dist/wirings/trigger/trigger-runner.js +85 -0
  181. package/dist/wirings/trigger/trigger.types.d.ts +130 -0
  182. package/dist/wirings/trigger/trigger.types.js +40 -0
  183. package/dist/wirings/variable/index.d.ts +3 -0
  184. package/dist/wirings/variable/index.js +2 -0
  185. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  186. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  187. package/dist/wirings/variable/variable.types.d.ts +18 -0
  188. package/dist/wirings/variable/variable.types.js +1 -0
  189. package/dist/wirings/workflow/dsl/index.d.ts +5 -0
  190. package/dist/wirings/workflow/dsl/index.js +4 -0
  191. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +292 -0
  192. package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
  193. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
  194. package/dist/wirings/workflow/dsl/workflow-runner.js +23 -0
  195. package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
  196. package/dist/wirings/workflow/graph/graph-node.js +58 -0
  197. package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
  198. package/dist/wirings/workflow/graph/graph-runner.js +540 -0
  199. package/dist/wirings/workflow/graph/index.d.ts +4 -0
  200. package/dist/wirings/workflow/graph/index.js +3 -0
  201. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  202. package/dist/wirings/workflow/graph/template.js +27 -0
  203. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  204. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  205. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +82 -0
  206. package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
  207. package/dist/wirings/workflow/index.d.ts +7 -12
  208. package/dist/wirings/workflow/index.js +8 -11
  209. package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
  210. package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
  211. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  212. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  213. package/dist/wirings/workflow/workflow-utils.d.ts +1 -0
  214. package/dist/wirings/workflow/workflow-utils.js +1 -0
  215. package/dist/wirings/workflow/workflow.types.d.ts +83 -214
  216. package/package.json +13 -6
  217. package/run-tests.sh +4 -1
  218. package/src/crypto-utils.ts +99 -0
  219. package/src/errors/error-handler.ts +3 -3
  220. package/src/errors/errors.ts +17 -0
  221. package/src/errors/index.ts +0 -1
  222. package/src/factory-functions.test.ts +42 -2
  223. package/src/function/function-runner.test.ts +5 -12
  224. package/src/function/function-runner.ts +195 -40
  225. package/src/function/functions.types.ts +66 -14
  226. package/src/function/index.ts +5 -2
  227. package/src/handle-error.ts +2 -10
  228. package/src/index.ts +106 -27
  229. package/src/middleware/auth-apikey.test.ts +15 -12
  230. package/src/middleware/auth-apikey.ts +3 -3
  231. package/src/middleware/auth-bearer.test.ts +17 -14
  232. package/src/middleware/auth-bearer.ts +25 -27
  233. package/src/middleware/auth-cookie.test.ts +16 -13
  234. package/src/middleware/auth-cookie.ts +6 -8
  235. package/src/middleware/cors.ts +96 -0
  236. package/src/middleware/index.ts +5 -3
  237. package/src/middleware/remote-auth.ts +68 -0
  238. package/src/middleware-runner.test.ts +122 -0
  239. package/src/middleware-runner.ts +24 -17
  240. package/src/permissions.test.ts +102 -86
  241. package/src/permissions.ts +32 -93
  242. package/src/pikku-state.ts +168 -201
  243. package/src/run-tests-script.test.ts +49 -0
  244. package/src/schema.ts +50 -18
  245. package/src/services/ai-agent-runner-service.ts +29 -0
  246. package/src/services/ai-run-state-service.ts +20 -0
  247. package/src/services/ai-storage-service.ts +39 -0
  248. package/src/services/deployment-service.ts +22 -0
  249. package/src/services/gopass-secrets.ts +95 -0
  250. package/src/services/in-memory-trigger-service.ts +68 -0
  251. package/src/services/in-memory-workflow-service.ts +395 -0
  252. package/src/services/index.ts +49 -14
  253. package/src/services/local-secrets.ts +51 -0
  254. package/src/services/local-variables.ts +22 -0
  255. package/src/services/scheduler-service.ts +29 -1
  256. package/src/services/schema-service.ts +7 -0
  257. package/src/services/scoped-secret-service.ts +41 -0
  258. package/src/services/secret-service.ts +25 -4
  259. package/src/services/trigger-service.ts +38 -0
  260. package/src/services/typed-secret-service.ts +70 -0
  261. package/src/services/typed-variables-service.ts +81 -0
  262. package/src/services/user-session-service.ts +23 -0
  263. package/src/services/variables-service.ts +5 -0
  264. package/src/services/workflow-service.ts +94 -0
  265. package/src/types/core.types.ts +82 -8
  266. package/src/types/state.types.ts +169 -0
  267. package/src/utils.ts +74 -5
  268. package/src/version.test.ts +80 -0
  269. package/src/version.ts +25 -0
  270. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  271. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  272. package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
  273. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  274. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  275. package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
  276. package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
  277. package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
  278. package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
  279. package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
  280. package/src/wirings/ai-agent/index.ts +28 -0
  281. package/src/wirings/channel/channel-common.ts +32 -19
  282. package/src/wirings/channel/channel-handler.ts +18 -5
  283. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  284. package/src/wirings/channel/channel-runner.ts +14 -15
  285. package/src/wirings/channel/channel.types.ts +17 -1
  286. package/src/wirings/channel/define-channel-routes.ts +25 -0
  287. package/src/wirings/channel/index.ts +23 -8
  288. package/src/wirings/channel/local/index.ts +3 -3
  289. package/src/wirings/channel/local/local-channel-runner.test.ts +47 -2
  290. package/src/wirings/channel/local/local-channel-runner.ts +22 -6
  291. package/src/wirings/channel/log-channels.ts +1 -1
  292. package/src/wirings/channel/serverless/index.ts +5 -1
  293. package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
  294. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
  295. package/src/wirings/cli/channel/index.ts +1 -1
  296. package/src/wirings/cli/cli-runner.test.ts +28 -28
  297. package/src/wirings/cli/cli-runner.ts +27 -19
  298. package/src/wirings/cli/cli.types.ts +12 -11
  299. package/src/wirings/cli/command-parser.test.ts +8 -8
  300. package/src/wirings/cli/define-cli-commands.ts +24 -0
  301. package/src/wirings/cli/index.ts +10 -4
  302. package/src/wirings/http/http-routes.test.ts +322 -0
  303. package/src/wirings/http/http-routes.ts +198 -0
  304. package/src/wirings/http/http-runner.test.ts +5 -5
  305. package/src/wirings/http/http-runner.ts +80 -29
  306. package/src/wirings/http/http.types.ts +121 -23
  307. package/src/wirings/http/index.ts +16 -4
  308. package/src/wirings/http/log-http-routes.ts +1 -1
  309. package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
  310. package/src/wirings/http/routers/path-to-regex.ts +2 -2
  311. package/src/wirings/mcp/index.ts +27 -3
  312. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  313. package/src/wirings/mcp/mcp-runner.ts +56 -67
  314. package/src/wirings/mcp/mcp.types.ts +3 -3
  315. package/src/wirings/node/index.ts +2 -0
  316. package/src/wirings/node/node.types.ts +23 -0
  317. package/src/wirings/oauth2/index.ts +3 -0
  318. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  319. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  320. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  321. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  322. package/src/wirings/queue/index.ts +14 -2
  323. package/src/wirings/queue/queue-runner.test.ts +115 -73
  324. package/src/wirings/queue/queue-runner.ts +39 -13
  325. package/src/wirings/queue/queue.types.ts +12 -2
  326. package/src/wirings/rpc/index.ts +1 -1
  327. package/src/wirings/rpc/rpc-runner.ts +270 -34
  328. package/src/wirings/rpc/rpc-types.ts +21 -4
  329. package/src/wirings/scheduler/index.ts +7 -4
  330. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  331. package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
  332. package/src/wirings/scheduler/scheduler-runner.ts +50 -10
  333. package/src/wirings/secret/index.ts +9 -0
  334. package/src/wirings/secret/secret.types.ts +32 -0
  335. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  336. package/src/wirings/trigger/index.ts +10 -0
  337. package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
  338. package/src/wirings/trigger/trigger-runner.ts +138 -0
  339. package/src/wirings/trigger/trigger.types.ts +178 -0
  340. package/src/wirings/variable/index.ts +8 -0
  341. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  342. package/src/wirings/variable/variable.types.ts +22 -0
  343. package/src/wirings/workflow/dsl/index.ts +31 -0
  344. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
  345. package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
  346. package/src/wirings/workflow/graph/graph-node.ts +222 -0
  347. package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
  348. package/src/wirings/workflow/graph/graph-runner.ts +816 -0
  349. package/src/wirings/workflow/graph/index.ts +14 -0
  350. package/src/wirings/workflow/graph/template.ts +42 -0
  351. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  352. package/src/wirings/workflow/graph/workflow-graph.types.ts +104 -0
  353. package/src/wirings/workflow/index.ts +64 -26
  354. package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
  355. package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
  356. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  357. package/src/wirings/workflow/workflow-utils.ts +0 -0
  358. package/src/wirings/workflow/workflow.types.ts +123 -279
  359. package/tsconfig.tsbuildinfo +1 -1
  360. package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
  361. package/dist/wirings/workflow/workflow-runner.js +0 -65
  362. package/src/function/function-runner.ts.bak +0 -188
  363. package/src/wirings/workflow/workflow-runner.ts +0 -72
@@ -0,0 +1,395 @@
1
+ import { randomUUID } from 'crypto'
2
+ import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js'
3
+ import type { SerializedError } from '../types/core.types.js'
4
+ import type {
5
+ WorkflowRun,
6
+ WorkflowRunWire,
7
+ StepState,
8
+ WorkflowStatus,
9
+ WorkflowStepOptions,
10
+ } from '../wirings/workflow/workflow.types.js'
11
+
12
+ interface InternalStepData {
13
+ rpcName: string | null
14
+ data: any
15
+ stepName: string
16
+ }
17
+
18
+ /**
19
+ * In-memory implementation of WorkflowService for inline-only execution
20
+ *
21
+ * This is a lightweight workflow service that stores all state in memory.
22
+ * It only supports inline execution (no queue workers) and is ideal for:
23
+ * - CLI tools that need workflow-like step orchestration
24
+ * - Testing and development
25
+ * - Single-process applications without persistence requirements
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const workflowService = new InMemoryWorkflowService()
30
+ * await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
31
+ * ```
32
+ */
33
+ export class InMemoryWorkflowService extends PikkuWorkflowService {
34
+ private runs = new Map<string, WorkflowRun>()
35
+ private steps = new Map<string, StepState>() // keyed by `${runId}:${stepName}`
36
+ private stepData = new Map<string, InternalStepData>() // keyed by stepId
37
+ private stepHistory = new Map<
38
+ string,
39
+ Array<StepState & { stepName: string }>
40
+ >() // keyed by runId
41
+ private runState = new Map<string, Record<string, unknown>>() // keyed by runId
42
+ private branchKeys = new Map<string, string>() // keyed by stepId
43
+ private workflowVersions = new Map<string, { graph: any; source: string }>() // keyed by `${name}:${graphHash}`
44
+
45
+ async createRun(
46
+ workflowName: string,
47
+ input: any,
48
+ inline: boolean,
49
+ graphHash: string,
50
+ wire: WorkflowRunWire
51
+ ): Promise<string> {
52
+ const runId = randomUUID()
53
+ const now = new Date()
54
+
55
+ const run: WorkflowRun = {
56
+ id: runId,
57
+ workflow: workflowName,
58
+ status: 'running',
59
+ input,
60
+ inline,
61
+ graphHash,
62
+ wire,
63
+ createdAt: now,
64
+ updatedAt: now,
65
+ }
66
+
67
+ this.runs.set(runId, run)
68
+ this.stepHistory.set(runId, [])
69
+ this.runState.set(runId, {})
70
+
71
+ if (inline) {
72
+ this.registerInlineRun(runId)
73
+ }
74
+
75
+ return runId
76
+ }
77
+
78
+ async getRun(id: string): Promise<WorkflowRun | null> {
79
+ return this.runs.get(id) || null
80
+ }
81
+
82
+ async getRunHistory(
83
+ runId: string
84
+ ): Promise<Array<StepState & { stepName: string }>> {
85
+ return this.stepHistory.get(runId) || []
86
+ }
87
+
88
+ async updateRunStatus(
89
+ id: string,
90
+ status: WorkflowStatus,
91
+ output?: any,
92
+ error?: SerializedError
93
+ ): Promise<void> {
94
+ const run = this.runs.get(id)
95
+ if (run) {
96
+ run.status = status
97
+ run.updatedAt = new Date()
98
+ if (output !== undefined) run.output = output
99
+ if (error !== undefined) run.error = error
100
+ }
101
+ }
102
+
103
+ async insertStepState(
104
+ runId: string,
105
+ stepName: string,
106
+ rpcName: string | null,
107
+ data: any,
108
+ stepOptions?: WorkflowStepOptions
109
+ ): Promise<StepState> {
110
+ const stepId = randomUUID()
111
+ const now = new Date()
112
+
113
+ const step: StepState = {
114
+ stepId,
115
+ status: 'pending',
116
+ attemptCount: 1,
117
+ retries: stepOptions?.retries,
118
+ retryDelay: stepOptions?.retryDelay,
119
+ createdAt: now,
120
+ updatedAt: now,
121
+ }
122
+
123
+ const key = `${runId}:${stepName}`
124
+ this.steps.set(key, step)
125
+ this.stepData.set(stepId, { rpcName, data, stepName })
126
+
127
+ // Add to history
128
+ const history = this.stepHistory.get(runId) || []
129
+ history.push({ ...step, stepName })
130
+ this.stepHistory.set(runId, history)
131
+
132
+ return step
133
+ }
134
+
135
+ async getStepState(runId: string, stepName: string): Promise<StepState> {
136
+ const key = `${runId}:${stepName}`
137
+ const step = this.steps.get(key)
138
+ if (!step) {
139
+ return {
140
+ stepId: '',
141
+ status: 'pending',
142
+ attemptCount: 0,
143
+ createdAt: new Date(),
144
+ updatedAt: new Date(),
145
+ }
146
+ }
147
+ return step
148
+ }
149
+
150
+ async setStepRunning(stepId: string): Promise<void> {
151
+ for (const step of this.steps.values()) {
152
+ if (step.stepId === stepId) {
153
+ step.status = 'running'
154
+ step.runningAt = new Date()
155
+ step.updatedAt = new Date()
156
+ break
157
+ }
158
+ }
159
+ }
160
+
161
+ async setStepScheduled(stepId: string): Promise<void> {
162
+ for (const step of this.steps.values()) {
163
+ if (step.stepId === stepId) {
164
+ step.status = 'scheduled'
165
+ step.scheduledAt = new Date()
166
+ step.updatedAt = new Date()
167
+ break
168
+ }
169
+ }
170
+ }
171
+
172
+ async setStepResult(stepId: string, result: any): Promise<void> {
173
+ for (const step of this.steps.values()) {
174
+ if (step.stepId === stepId) {
175
+ step.status = 'succeeded'
176
+ step.result = result
177
+ step.succeededAt = new Date()
178
+ step.updatedAt = new Date()
179
+ break
180
+ }
181
+ }
182
+ }
183
+
184
+ async setStepError(stepId: string, error: Error): Promise<void> {
185
+ for (const step of this.steps.values()) {
186
+ if (step.stepId === stepId) {
187
+ step.status = 'failed'
188
+ step.error = {
189
+ name: error.name,
190
+ message: error.message,
191
+ stack: error.stack,
192
+ }
193
+ step.failedAt = new Date()
194
+ step.updatedAt = new Date()
195
+ break
196
+ }
197
+ }
198
+ }
199
+
200
+ async createRetryAttempt(
201
+ failedStepId: string,
202
+ status: 'pending' | 'running'
203
+ ): Promise<StepState> {
204
+ // Find the failed step
205
+ let failedStep: StepState | undefined
206
+ let runId: string | undefined
207
+ let stepName: string | undefined
208
+
209
+ for (const [key, step] of this.steps.entries()) {
210
+ if (step.stepId === failedStepId) {
211
+ failedStep = step
212
+ const parts = key.split(':')
213
+ runId = parts[0]
214
+ stepName = parts.slice(1).join(':')
215
+ break
216
+ }
217
+ }
218
+
219
+ if (!failedStep || !runId || !stepName) {
220
+ throw new Error(`Step not found: ${failedStepId}`)
221
+ }
222
+
223
+ const failedStepData = this.stepData.get(failedStepId)
224
+ const newStepId = randomUUID()
225
+ const now = new Date()
226
+
227
+ const newStep: StepState = {
228
+ stepId: newStepId,
229
+ status,
230
+ attemptCount: failedStep.attemptCount + 1,
231
+ retries: failedStep.retries,
232
+ retryDelay: failedStep.retryDelay,
233
+ createdAt: now,
234
+ updatedAt: now,
235
+ }
236
+
237
+ if (status === 'running') {
238
+ newStep.runningAt = now
239
+ }
240
+
241
+ const key = `${runId}:${stepName}`
242
+ this.steps.set(key, newStep)
243
+
244
+ // Copy step data to new step
245
+ if (failedStepData) {
246
+ this.stepData.set(newStepId, { ...failedStepData })
247
+ }
248
+
249
+ // Add to history
250
+ const history = this.stepHistory.get(runId) || []
251
+ history.push({ ...newStep, stepName })
252
+ this.stepHistory.set(runId, history)
253
+
254
+ return newStep
255
+ }
256
+
257
+ async withRunLock<T>(_id: string, fn: () => Promise<T>): Promise<T> {
258
+ // In-memory service doesn't need locking for inline execution
259
+ return fn()
260
+ }
261
+
262
+ async withStepLock<T>(
263
+ _runId: string,
264
+ _stepName: string,
265
+ fn: () => Promise<T>
266
+ ): Promise<T> {
267
+ // In-memory service doesn't need locking for inline execution
268
+ return fn()
269
+ }
270
+
271
+ async close(): Promise<void> {
272
+ // Clear all in-memory state
273
+ this.runs.clear()
274
+ this.steps.clear()
275
+ this.stepData.clear()
276
+ this.stepHistory.clear()
277
+ this.runState.clear()
278
+ this.branchKeys.clear()
279
+ this.workflowVersions.clear()
280
+ }
281
+
282
+ // Graph workflow methods
283
+
284
+ async getCompletedGraphState(runId: string): Promise<{
285
+ completedNodeIds: string[]
286
+ failedNodeIds: string[]
287
+ branchKeys: Record<string, string>
288
+ }> {
289
+ const completedNodeIds: string[] = []
290
+ const failedNodeIds: string[] = []
291
+ const prefix = `${runId}:`
292
+ for (const [key, step] of this.steps.entries()) {
293
+ if (!key.startsWith(prefix)) continue
294
+ const nodeId = key.substring(prefix.length)
295
+ if (step.status === 'succeeded') {
296
+ completedNodeIds.push(nodeId)
297
+ } else if (step.status === 'failed') {
298
+ const maxAttempts = (step.retries ?? 0) + 1
299
+ if (step.attemptCount >= maxAttempts) {
300
+ failedNodeIds.push(nodeId)
301
+ }
302
+ }
303
+ }
304
+
305
+ const branchKeys: Record<string, string> = {}
306
+ for (const [stepId, branchKey] of this.branchKeys.entries()) {
307
+ const stepData = this.stepData.get(stepId)
308
+ if (stepData) {
309
+ branchKeys[stepData.stepName] = branchKey
310
+ }
311
+ }
312
+
313
+ return { completedNodeIds, failedNodeIds, branchKeys }
314
+ }
315
+
316
+ async getNodesWithoutSteps(
317
+ runId: string,
318
+ nodeIds: string[]
319
+ ): Promise<string[]> {
320
+ const existingSteps = new Set<string>()
321
+ const prefix = `${runId}:`
322
+ for (const [key] of this.steps.entries()) {
323
+ if (key.startsWith(prefix)) {
324
+ existingSteps.add(key.substring(prefix.length))
325
+ }
326
+ }
327
+ return nodeIds.filter((id) => !existingSteps.has(id))
328
+ }
329
+
330
+ async getNodeResults(
331
+ runId: string,
332
+ nodeIds: string[]
333
+ ): Promise<Record<string, any>> {
334
+ const results: Record<string, any> = {}
335
+ for (const nodeId of nodeIds) {
336
+ const key = `${runId}:${nodeId}`
337
+ const step = this.steps.get(key)
338
+ if (step?.result !== undefined) {
339
+ results[nodeId] = step.result
340
+ }
341
+ }
342
+ return results
343
+ }
344
+
345
+ async setBranchKey(
346
+ runId: string,
347
+ nodeId: string,
348
+ branchKey: string
349
+ ): Promise<void> {
350
+ const key = `${runId}:${nodeId}`
351
+ const step = this.steps.get(key)
352
+ if (step) {
353
+ this.branchKeys.set(step.stepId, branchKey)
354
+ }
355
+ }
356
+
357
+ async setBranchTaken(stepId: string, branchKey: string): Promise<void> {
358
+ this.branchKeys.set(stepId, branchKey)
359
+ }
360
+
361
+ async updateRunState(
362
+ runId: string,
363
+ name: string,
364
+ value: unknown
365
+ ): Promise<void> {
366
+ const state = this.runState.get(runId) || {}
367
+ state[name] = value
368
+ this.runState.set(runId, state)
369
+ }
370
+
371
+ async getRunState(runId: string): Promise<Record<string, unknown>> {
372
+ return this.runState.get(runId) || {}
373
+ }
374
+
375
+ async upsertWorkflowVersion(
376
+ name: string,
377
+ graphHash: string,
378
+ graph: any,
379
+ source: string
380
+ ): Promise<void> {
381
+ this.workflowVersions.set(`${name}:${graphHash}`, {
382
+ graph,
383
+ source,
384
+ })
385
+ }
386
+
387
+ async getWorkflowVersion(
388
+ name: string,
389
+ graphHash: string
390
+ ): Promise<{ graph: any; source: string } | null> {
391
+ const version = this.workflowVersions.get(`${name}:${graphHash}`)
392
+ if (!version) return null
393
+ return { graph: version.graph, source: version.source }
394
+ }
395
+ }
@@ -2,17 +2,52 @@
2
2
  * @module @pikku/core
3
3
  */
4
4
 
5
- // Interfaces
6
- export * from './content-service.js'
7
- export * from './jwt-service.js'
8
- export * from './logger.js'
9
- export * from './secret-service.js'
10
- export * from './variables-service.js'
11
- export * from './schema-service.js'
12
- export * from './user-session-service.js'
13
- export * from './scheduler-service.js'
14
-
15
- // Local implementations
16
- export * from './local-secrets.js'
17
- export * from './local-variables.js'
18
- export * from './logger-console.js'
5
+ export { LogLevel } from './logger.js'
6
+ export { ScopedSecretService } from './scoped-secret-service.js'
7
+ export {
8
+ PikkuSessionService,
9
+ createMiddlewareSessionWireProps,
10
+ createFunctionSessionWireProps,
11
+ } from './user-session-service.js'
12
+ export { TypedSecretService } from './typed-secret-service.js'
13
+ export { TypedVariablesService } from './typed-variables-service.js'
14
+ export { LocalSecretService } from './local-secrets.js'
15
+ export { LocalVariablesService } from './local-variables.js'
16
+ export { ConsoleLogger } from './logger-console.js'
17
+ export { InMemoryWorkflowService } from './in-memory-workflow-service.js'
18
+ export { InMemoryTriggerService } from './in-memory-trigger-service.js'
19
+ export type { ContentService } from './content-service.js'
20
+ export type { JWTService } from './jwt-service.js'
21
+ export type { Logger } from './logger.js'
22
+ export type { SecretService } from './secret-service.js'
23
+ export type { VariablesService } from './variables-service.js'
24
+ export type { SchemaService } from './schema-service.js'
25
+ export type { SessionService } from './user-session-service.js'
26
+ export type {
27
+ ScheduledTaskSummary,
28
+ ScheduledTaskInfo,
29
+ SchedulerRuntimeHandlers,
30
+ SchedulerService,
31
+ } from './scheduler-service.js'
32
+ export type { TriggerService } from './trigger-service.js'
33
+ export type {
34
+ DeploymentService,
35
+ DeploymentConfig,
36
+ DeploymentInfo,
37
+ DeploymentServiceConfig,
38
+ } from './deployment-service.js'
39
+ export type { AIStorageService } from './ai-storage-service.js'
40
+ export type {
41
+ AIAgentRunnerParams,
42
+ AIAgentRunnerResult,
43
+ AIAgentRunnerService,
44
+ } from './ai-agent-runner-service.js'
45
+ export type {
46
+ CreateRunInput,
47
+ AIRunStateService,
48
+ } from './ai-run-state-service.js'
49
+ export type {
50
+ CredentialStatus,
51
+ CredentialMeta,
52
+ } from './typed-secret-service.js'
53
+ export type { VariableStatus, VariableMeta } from './typed-variables-service.js'
@@ -4,8 +4,11 @@ import { VariablesService } from './variables-service.js'
4
4
 
5
5
  /**
6
6
  * Service for retrieving secrets from environment variables.
7
+ * Supports storing secrets locally in memory for CLI operations.
7
8
  */
8
9
  export class LocalSecretService implements SecretService {
10
+ private localSecrets: Map<string, string> = new Map()
11
+
9
12
  /**
10
13
  * Creates an instance of LocalSecretService.
11
14
  */
@@ -15,11 +18,19 @@ export class LocalSecretService implements SecretService {
15
18
 
16
19
  /**
17
20
  * Retrieves a secret by key.
21
+ * Checks local storage first, then falls back to environment variables.
18
22
  * @param key - The key of the secret to retrieve.
19
23
  * @returns A promise that resolves to the secret value.
20
24
  * @throws {Error} If the secret is not found.
21
25
  */
22
26
  public async getSecretJSON<R>(key: string): Promise<R> {
27
+ // Check local storage first
28
+ const localValue = this.localSecrets.get(key)
29
+ if (localValue) {
30
+ return JSON.parse(localValue)
31
+ }
32
+
33
+ // Fall back to environment variables
23
34
  const value = await this.variables.get(key)
24
35
  if (value) {
25
36
  return JSON.parse(value)
@@ -29,15 +40,55 @@ export class LocalSecretService implements SecretService {
29
40
 
30
41
  /**
31
42
  * Retrieves a secret by key.
43
+ * Checks local storage first, then falls back to environment variables.
32
44
  * @param key - The key of the secret to retrieve.
33
45
  * @returns A promise that resolves to the secret value.
34
46
  * @throws {Error} If the secret is not found.
35
47
  */
36
48
  public async getSecret(key: string): Promise<string> {
49
+ // Check local storage first
50
+ const localValue = this.localSecrets.get(key)
51
+ if (localValue) {
52
+ return localValue
53
+ }
54
+
55
+ // Fall back to environment variables
37
56
  const value = await this.variables.get(key)
38
57
  if (value) {
39
58
  return value
40
59
  }
41
60
  throw new Error(`Secret Not Found: ${key}`)
42
61
  }
62
+
63
+ /**
64
+ * Stores a JSON value as a secret in local storage.
65
+ * @param key - The key to store the secret under.
66
+ * @param value - The JSON value to store.
67
+ * @returns A promise that resolves when the secret is stored.
68
+ */
69
+ public async setSecretJSON(key: string, value: unknown): Promise<void> {
70
+ this.localSecrets.set(key, JSON.stringify(value))
71
+ }
72
+
73
+ /**
74
+ * Checks if a secret exists without throwing.
75
+ * @param key - The key of the secret to check.
76
+ * @returns A promise that resolves to true if the secret exists.
77
+ */
78
+ public async hasSecret(key: string): Promise<boolean> {
79
+ if (this.localSecrets.has(key)) {
80
+ return true
81
+ }
82
+ const value = await this.variables.get(key)
83
+ return value !== undefined && value !== null && value !== ''
84
+ }
85
+
86
+ /**
87
+ * Deletes a secret from local storage.
88
+ * @param key - The key of the secret to delete.
89
+ * @returns A promise that resolves when the secret is deleted.
90
+ */
91
+ public async deleteSecret(key: string): Promise<void> {
92
+ this.localSecrets.delete(key)
93
+ }
43
94
  }
@@ -14,4 +14,26 @@ export class LocalVariablesService implements VariablesService {
14
14
  public get(name: string): Promise<string | undefined> | string | undefined {
15
15
  return this.variables[name]
16
16
  }
17
+
18
+ public getJSON<T = unknown>(name: string): T | undefined {
19
+ const value = this.variables[name]
20
+ if (value === undefined) return undefined
21
+ return JSON.parse(value)
22
+ }
23
+
24
+ public set(name: string, value: string): void {
25
+ this.variables[name] = value
26
+ }
27
+
28
+ public setJSON(name: string, value: unknown): void {
29
+ this.variables[name] = JSON.stringify(value)
30
+ }
31
+
32
+ public has(name: string): boolean {
33
+ return name in this.variables && this.variables[name] !== undefined
34
+ }
35
+
36
+ public delete(name: string): void {
37
+ delete this.variables[name]
38
+ }
17
39
  }
@@ -1,4 +1,5 @@
1
- import { CoreUserSession } from '../types/core.types.js'
1
+ import type { CoreUserSession } from '../types/core.types.js'
2
+ import type { Logger } from './logger.js'
2
3
 
3
4
  /**
4
5
  * Minimal metadata for listing scheduled tasks
@@ -24,6 +25,16 @@ export interface ScheduledTaskInfo extends ScheduledTaskSummary {
24
25
  status?: 'scheduled' | 'active' | 'completed' | 'failed'
25
26
  }
26
27
 
28
+ export interface SchedulerRuntimeHandlers {
29
+ logger: Logger
30
+ invokeRPC: (
31
+ rpcName: string,
32
+ data?: any,
33
+ session?: CoreUserSession
34
+ ) => Promise<void>
35
+ runScheduledTask: (name: string) => Promise<void>
36
+ }
37
+
27
38
  /**
28
39
  * Abstract scheduler service for persistent scheduled task management
29
40
  * Implementations use queue backends (pg-boss, BullMQ) for distributed scheduling
@@ -73,4 +84,21 @@ export abstract class SchedulerService {
73
84
  * Close any open connections
74
85
  */
75
86
  abstract close(): Promise<void>
87
+
88
+ /**
89
+ * Set services needed for processing recurring tasks.
90
+ * Called after construction since the scheduler is created before
91
+ * singletonServices are fully assembled.
92
+ */
93
+ setServices(_handlers: SchedulerRuntimeHandlers): void {}
94
+
95
+ /**
96
+ * Start recurring scheduled tasks
97
+ */
98
+ async start(): Promise<void> {}
99
+
100
+ /**
101
+ * Stop recurring scheduled tasks
102
+ */
103
+ async stop(): Promise<void> {}
76
104
  }
@@ -23,4 +23,11 @@ export interface SchemaService {
23
23
  * @returns {Set<string>} A set containing the names of all available schemas.
24
24
  */
25
25
  getSchemaNames: () => Set<string>
26
+
27
+ /**
28
+ * Retrieves the property keys from a compiled JSON schema.
29
+ * @param {string} schemaName - The name of the schema.
30
+ * @returns {string[]} An array of property keys, or empty array if schema not found.
31
+ */
32
+ getSchemaKeys: (schemaName: string) => string[]
26
33
  }
@@ -0,0 +1,41 @@
1
+ import { SecretService } from './secret-service.js'
2
+
3
+ /**
4
+ * A read-only wrapper around SecretService that restricts access
5
+ * to only a defined set of allowed secret keys.
6
+ */
7
+ export class ScopedSecretService implements SecretService {
8
+ constructor(
9
+ private secrets: SecretService,
10
+ private allowedKeys: Set<string>
11
+ ) {}
12
+
13
+ private assertAllowed(key: string): void {
14
+ if (!this.allowedKeys.has(key)) {
15
+ throw new Error(`Access denied to secret key: ${key}`)
16
+ }
17
+ }
18
+
19
+ async getSecret(key: string): Promise<string> {
20
+ this.assertAllowed(key)
21
+ return this.secrets.getSecret(key)
22
+ }
23
+
24
+ async getSecretJSON<T = {}>(key: string): Promise<T> {
25
+ this.assertAllowed(key)
26
+ return this.secrets.getSecretJSON<T>(key)
27
+ }
28
+
29
+ async hasSecret(key: string): Promise<boolean> {
30
+ this.assertAllowed(key)
31
+ return this.secrets.hasSecret(key)
32
+ }
33
+
34
+ async setSecretJSON(_key: string, _value: unknown): Promise<void> {
35
+ throw new Error('setSecretJSON is not allowed in scoped secret service')
36
+ }
37
+
38
+ async deleteSecret(_key: string): Promise<void> {
39
+ throw new Error('deleteSecret is not allowed in scoped secret service')
40
+ }
41
+ }