@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
package/src/schema.ts CHANGED
@@ -1,28 +1,41 @@
1
1
  import { Logger } from './services/logger.js'
2
2
  import { SchemaService } from './services/schema-service.js'
3
- import { UnprocessableContentError } from './errors/errors.js'
3
+ import {
4
+ MissingSchemaError,
5
+ UnprocessableContentError,
6
+ } from './errors/errors.js'
4
7
  import { pikkuState } from './pikku-state.js'
5
8
 
9
+ const schemaKey = (name: string, packageName: string | null): string =>
10
+ packageName ? `${packageName}:${name}` : name
11
+
6
12
  /**
7
- * Adds a schema to the global schemas map.
13
+ * Adds a schema to the schemas map for a specific package.
8
14
  * @param name - The name of the schema.
9
15
  * @param value - The schema value.
16
+ * @param packageName - The package name (null for main package, '@scope/package' for external packages).
10
17
  * @ignore
11
18
  */
12
- export const addSchema = (name: string, value: any) => {
13
- pikkuState('misc', 'schemas').set(name, value)
19
+ export const addSchema = (
20
+ name: string,
21
+ value: any,
22
+ packageName: string | null = null
23
+ ) => {
24
+ pikkuState(packageName, 'misc', 'schemas').set(name, value)
14
25
  }
15
26
 
16
27
  /**
17
- * Retrieves a schema from the global schemas map.
28
+ * Retrieves a schema from the schemas map for a specific package.
18
29
  * @param name - The name of the schema.
30
+ * @param packageName - The package name (null for main package, '@scope/package' for external packages).
19
31
  * @returns The schema value or undefined if not found.
20
32
  * @ignore
21
33
  */
22
34
  export const getSchema = (
23
- name: string
35
+ name: string,
36
+ packageName: string | null = null
24
37
  ): Record<string, unknown> | undefined => {
25
- return pikkuState('misc', 'schemas').get(name)
38
+ return pikkuState(packageName, 'misc', 'schemas').get(name)
26
39
  }
27
40
 
28
41
  /**
@@ -36,9 +49,11 @@ export const compileAllSchemas = (
36
49
  if (!schemaService) {
37
50
  throw new Error('SchemaService needs to be defined to load schemas')
38
51
  }
39
- const schemas = pikkuState('misc', 'schemas')
40
- for (const [name, schema] of schemas) {
41
- schemaService.compileSchema(name, schema)
52
+ for (const [pkgName, packageState] of globalThis.pikkuState!) {
53
+ const resolvedPkgName = pkgName === '__main__' ? null : pkgName
54
+ for (const [name, schema] of packageState.misc.schemas) {
55
+ schemaService.compileSchema(schemaKey(name, resolvedPkgName), schema)
56
+ }
42
57
  }
43
58
  validateAllSchemasLoaded(logger, schemaService)
44
59
  }
@@ -47,14 +62,15 @@ const validateAllSchemasLoaded = (
47
62
  logger: Logger,
48
63
  schemaService: SchemaService
49
64
  ) => {
50
- const routesMeta = pikkuState('http', 'meta')
65
+ const routesMeta = pikkuState(null, 'http', 'meta')
51
66
  const validators = schemaService.getSchemaNames()
52
67
 
53
68
  const missingSchemas: string[] = []
54
69
 
55
70
  for (const routePaths of Object.values(routesMeta)) {
56
71
  for (const meta of Object.values(routePaths)) {
57
- const inputs = pikkuState('function', 'meta')[meta.pikkuFuncName]?.inputs
72
+ const inputs = pikkuState(null, 'function', 'meta')[meta.pikkuFuncId]
73
+ ?.inputs
58
74
  const input = inputs?.[0]
59
75
  if (!input || validators.has(input)) {
60
76
  continue
@@ -74,8 +90,12 @@ const validateAllSchemasLoaded = (
74
90
  }
75
91
  }
76
92
 
77
- export const coerceTopLevelDataFromSchema = (schemaName: string, data: any) => {
78
- const schema = pikkuState('misc', 'schemas').get(schemaName)
93
+ export const coerceTopLevelDataFromSchema = (
94
+ schemaName: string,
95
+ data: any,
96
+ packageName: string | null = null
97
+ ) => {
98
+ const schema = pikkuState(packageName, 'misc', 'schemas').get(schemaName)
79
99
  for (const key in schema.properties) {
80
100
  const property = schema.properties[key]
81
101
  if (typeof property === 'boolean') {
@@ -97,7 +117,8 @@ export const validateSchema = async (
97
117
  logger: Logger,
98
118
  schemaService: SchemaService | undefined,
99
119
  schemaName: string | undefined | null,
100
- data: any
120
+ data: any,
121
+ packageName: string | null = null
101
122
  ) => {
102
123
  if (schemaService) {
103
124
  if (!schemaName) {
@@ -108,8 +129,19 @@ export const validateSchema = async (
108
129
  return
109
130
  }
110
131
  }
111
- const schema = pikkuState('misc', 'schemas').get(schemaName)
112
- await schemaService.compileSchema(schemaName, schema)
113
- await schemaService.validateSchema(schemaName, data)
132
+ const key = schemaKey(schemaName, packageName)
133
+ const schemas = pikkuState(packageName, 'misc', 'schemas')
134
+ const schema = schemas.get(schemaName)
135
+ if (schema === undefined) {
136
+ const availableSchemas = Array.from(schemas.keys())
137
+ logger.error(
138
+ `Schema '${schemaName}' not found for package '${packageName ?? 'main'}'. Available schemas: ${availableSchemas.join(', ') || '(none)'}`
139
+ )
140
+ throw new MissingSchemaError(
141
+ `Schema '${schemaName}' not found. Ensure schema generation has been run.`
142
+ )
143
+ }
144
+ await schemaService.compileSchema(key, schema)
145
+ await schemaService.validateSchema(key, data)
114
146
  }
115
147
  }
@@ -0,0 +1,29 @@
1
+ import {
2
+ AIMessage,
3
+ AIAgentStep,
4
+ AIAgentToolDef,
5
+ AIStreamChannel,
6
+ } from '../wirings/ai-agent/ai-agent.types.js'
7
+
8
+ export type AIAgentRunnerParams = {
9
+ model: string
10
+ temperature?: number
11
+ instructions: string
12
+ messages: AIMessage[]
13
+ tools: AIAgentToolDef[]
14
+ maxSteps: number
15
+ toolChoice: 'auto' | 'required' | 'none'
16
+ outputSchema?: Record<string, unknown>
17
+ }
18
+
19
+ export type AIAgentRunnerResult = {
20
+ text: string
21
+ object?: unknown
22
+ steps: AIAgentStep[]
23
+ usage: { inputTokens: number; outputTokens: number }
24
+ }
25
+
26
+ export interface AIAgentRunnerService {
27
+ stream(params: AIAgentRunnerParams, channel: AIStreamChannel): Promise<void>
28
+ run(params: AIAgentRunnerParams): Promise<AIAgentRunnerResult>
29
+ }
@@ -0,0 +1,20 @@
1
+ import {
2
+ AgentRunState,
3
+ PendingApproval,
4
+ } from '../wirings/ai-agent/ai-agent.types.js'
5
+
6
+ export type CreateRunInput = Omit<AgentRunState, 'runId'>
7
+
8
+ export interface AIRunStateService {
9
+ createRun(run: CreateRunInput): Promise<string>
10
+ updateRun(runId: string, updates: Partial<AgentRunState>): Promise<void>
11
+ getRun(runId: string): Promise<AgentRunState | null>
12
+ getRunsByThread(threadId: string): Promise<AgentRunState[]>
13
+ resolveApproval(
14
+ toolCallId: string,
15
+ status: 'approved' | 'denied'
16
+ ): Promise<void>
17
+ findRunByToolCallId(
18
+ toolCallId: string
19
+ ): Promise<{ run: AgentRunState; approval: PendingApproval } | null>
20
+ }
@@ -0,0 +1,39 @@
1
+ import { AIThread, AIMessage } from '../wirings/ai-agent/ai-agent.types.js'
2
+
3
+ export interface AIStorageService {
4
+ createThread(
5
+ resourceId: string,
6
+ options?: {
7
+ threadId?: string
8
+ title?: string
9
+ metadata?: Record<string, unknown>
10
+ }
11
+ ): Promise<AIThread>
12
+
13
+ getThread(threadId: string): Promise<AIThread>
14
+
15
+ getThreads(resourceId: string): Promise<AIThread[]>
16
+
17
+ deleteThread(threadId: string): Promise<void>
18
+
19
+ getMessages(
20
+ threadId: string,
21
+ options?: {
22
+ lastN?: number
23
+ cursor?: string
24
+ }
25
+ ): Promise<AIMessage[]>
26
+
27
+ saveMessages(threadId: string, messages: AIMessage[]): Promise<void>
28
+
29
+ getWorkingMemory(
30
+ id: string,
31
+ scope: 'resource' | 'thread'
32
+ ): Promise<Record<string, unknown> | null>
33
+
34
+ saveWorkingMemory(
35
+ id: string,
36
+ scope: 'resource' | 'thread',
37
+ data: Record<string, unknown>
38
+ ): Promise<void>
39
+ }
@@ -0,0 +1,22 @@
1
+ export interface DeploymentServiceConfig {
2
+ heartbeatInterval?: number
3
+ heartbeatTtl?: number
4
+ }
5
+
6
+ export interface DeploymentConfig {
7
+ deploymentId: string
8
+ endpoint: string
9
+ functions?: string[]
10
+ }
11
+
12
+ export interface DeploymentInfo {
13
+ deploymentId: string
14
+ endpoint: string
15
+ }
16
+
17
+ export interface DeploymentService {
18
+ init(): Promise<void>
19
+ start(config: DeploymentConfig): Promise<void>
20
+ stop(): Promise<void>
21
+ findFunction(name: string): Promise<DeploymentInfo[]>
22
+ }
@@ -0,0 +1,95 @@
1
+ import { execFileSync } from 'child_process'
2
+ import { SecretService } from './secret-service.js'
3
+
4
+ /**
5
+ * Service for retrieving secrets from gopass.
6
+ * Requires gopass to be installed and configured on the system.
7
+ */
8
+ export class GopassSecretService implements SecretService {
9
+ /**
10
+ * Creates an instance of GopassSecretService.
11
+ * @param prefix - Optional prefix for all secret keys (e.g., 'pikku/' will look up 'pikku/mykey' for key 'mykey')
12
+ */
13
+ constructor(private prefix: string = '') {}
14
+
15
+ private getFullKey(key: string): string {
16
+ return this.prefix ? `${this.prefix}${key}` : key
17
+ }
18
+
19
+ /**
20
+ * Retrieves a secret by key and parses it as JSON.
21
+ * @param key - The key of the secret to retrieve.
22
+ * @returns A promise that resolves to the parsed secret value.
23
+ * @throws {Error} If the secret is not found or gopass fails.
24
+ */
25
+ public async getSecretJSON<R>(key: string): Promise<R> {
26
+ const value = await this.getSecret(key)
27
+ return JSON.parse(value)
28
+ }
29
+
30
+ /**
31
+ * Retrieves a secret by key as a string.
32
+ * @param key - The key of the secret to retrieve.
33
+ * @returns A promise that resolves to the secret value.
34
+ * @throws {Error} If the secret is not found or gopass fails.
35
+ */
36
+ public async getSecret(key: string): Promise<string> {
37
+ const fullKey = this.getFullKey(key)
38
+ try {
39
+ return execFileSync('gopass', ['show', '-o', fullKey], {
40
+ encoding: 'utf8',
41
+ }).trim()
42
+ } catch (error: any) {
43
+ throw new Error(`Secret Not Found: ${key}`, { cause: error })
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Checks if a secret exists without throwing.
49
+ * @param key - The key of the secret to check.
50
+ * @returns A promise that resolves to true if the secret exists.
51
+ */
52
+ public async hasSecret(key: string): Promise<boolean> {
53
+ const fullKey = this.getFullKey(key)
54
+ try {
55
+ execFileSync('gopass', ['show', '-o', fullKey], { encoding: 'utf8' })
56
+ return true
57
+ } catch {
58
+ return false
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Stores a JSON value as a secret in gopass.
64
+ * @param key - The key to store the secret under.
65
+ * @param value - The JSON value to store.
66
+ * @returns A promise that resolves when the secret is stored.
67
+ */
68
+ public async setSecretJSON(key: string, value: unknown): Promise<void> {
69
+ const fullKey = this.getFullKey(key)
70
+ const jsonValue = JSON.stringify(value)
71
+ try {
72
+ execFileSync('gopass', ['insert', '-f', fullKey], {
73
+ encoding: 'utf8',
74
+ input: jsonValue,
75
+ stdio: ['pipe', 'pipe', 'pipe'],
76
+ })
77
+ } catch (error: any) {
78
+ throw new Error(`Failed to set secret: ${key}`, { cause: error })
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Deletes a secret from gopass.
84
+ * @param key - The key of the secret to delete.
85
+ * @returns A promise that resolves when the secret is deleted.
86
+ */
87
+ public async deleteSecret(key: string): Promise<void> {
88
+ const fullKey = this.getFullKey(key)
89
+ try {
90
+ execFileSync('gopass', ['rm', '-f', fullKey], { encoding: 'utf8' })
91
+ } catch {
92
+ // Ignore errors if secret doesn't exist
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,68 @@
1
+ import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js'
2
+
3
+ /**
4
+ * In-memory TriggerService implementation.
5
+ *
6
+ * Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
7
+ * from pikkuState. Only starts triggers that have both a declaration and a source.
8
+ * On fire, invokes target via `ContextAwareRPCService`.
9
+ *
10
+ * Single owner — one process runs triggers, no distributed claiming.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const triggerService = new InMemoryTriggerService()
15
+ * triggerService.setServices(singletonServices, createWireServices)
16
+ * await triggerService.start()
17
+ *
18
+ * // On shutdown
19
+ * await triggerService.stop()
20
+ * ```
21
+ */
22
+ export class InMemoryTriggerService extends PikkuTriggerService {
23
+ async start(): Promise<void> {
24
+ if (!this.singletonServices) {
25
+ throw new Error(
26
+ 'InMemoryTriggerService requires singletonServices to start triggers'
27
+ )
28
+ }
29
+
30
+ const triggerTargets = this.getTriggerTargets()
31
+ const triggerSources = this.getTriggerSources()
32
+
33
+ for (const [name, source] of triggerSources) {
34
+ if (this.activeTriggers.has(name)) {
35
+ continue
36
+ }
37
+
38
+ const targets = triggerTargets.get(name)
39
+ if (!targets || targets.length === 0) {
40
+ this.singletonServices.logger.info(
41
+ `Trigger source '${name}' has no targets, skipping`
42
+ )
43
+ continue
44
+ }
45
+
46
+ try {
47
+ const triggerInstance = await this.setupTriggerInstance(
48
+ name,
49
+ source.input,
50
+ (data) => this.onTriggerFire(name, targets, data)
51
+ )
52
+
53
+ this.activeTriggers.set(name, triggerInstance)
54
+ this.singletonServices.logger.info(`Started trigger: ${name}`)
55
+ } catch (error) {
56
+ this.singletonServices.logger.error(
57
+ `Failed to start trigger ${name}: ${error}`
58
+ )
59
+ }
60
+ }
61
+
62
+ if (this.activeTriggers.size === 0) {
63
+ this.singletonServices.logger.info(
64
+ 'No triggers started (no matching sources and targets found)'
65
+ )
66
+ }
67
+ }
68
+ }