@pikku/core 0.11.2 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/CHANGELOG.md +33 -2
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/errors.d.ts +8 -0
  5. package/dist/errors/errors.js +16 -0
  6. package/dist/errors/index.d.ts +0 -1
  7. package/dist/errors/index.js +0 -1
  8. package/dist/function/function-runner.d.ts +7 -1
  9. package/dist/function/function-runner.js +82 -23
  10. package/dist/function/functions.types.d.ts +31 -87
  11. package/dist/function/functions.types.js +16 -46
  12. package/dist/function/index.d.ts +2 -2
  13. package/dist/function/index.js +1 -2
  14. package/dist/handle-error.js +1 -10
  15. package/dist/index.d.ts +28 -26
  16. package/dist/index.js +18 -29
  17. package/dist/middleware/auth-apikey.d.ts +2 -2
  18. package/dist/middleware/auth-apikey.js +3 -3
  19. package/dist/middleware/auth-bearer.d.ts +2 -2
  20. package/dist/middleware/auth-bearer.js +3 -6
  21. package/dist/middleware/auth-cookie.d.ts +2 -2
  22. package/dist/middleware/auth-cookie.js +6 -8
  23. package/dist/middleware/cors.d.ts +46 -0
  24. package/dist/middleware/cors.js +73 -0
  25. package/dist/middleware/index.d.ts +5 -3
  26. package/dist/middleware/index.js +5 -3
  27. package/dist/middleware/remote-auth.d.ts +5 -0
  28. package/dist/middleware/remote-auth.js +55 -0
  29. package/dist/middleware/timeout.d.ts +2 -2
  30. package/dist/middleware-runner.js +8 -10
  31. package/dist/permissions.js +11 -15
  32. package/dist/pikku-state.d.ts +1 -0
  33. package/dist/pikku-state.js +18 -8
  34. package/dist/schema.js +12 -11
  35. package/dist/services/ai-agent-runner-service.d.ts +24 -0
  36. package/dist/services/ai-agent-runner-service.js +1 -0
  37. package/dist/services/ai-run-state-service.d.ts +13 -0
  38. package/dist/services/ai-run-state-service.js +1 -0
  39. package/dist/services/ai-storage-service.d.ts +18 -0
  40. package/dist/services/ai-storage-service.js +1 -0
  41. package/dist/services/deployment-service.d.ts +19 -0
  42. package/dist/services/deployment-service.js +1 -0
  43. package/dist/services/gopass-secrets.d.ts +47 -0
  44. package/dist/services/gopass-secrets.js +94 -0
  45. package/dist/services/in-memory-trigger-service.d.ts +23 -0
  46. package/dist/services/in-memory-trigger-service.js +50 -0
  47. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  48. package/dist/services/in-memory-workflow-service.js +287 -0
  49. package/dist/services/index.d.ts +25 -11
  50. package/dist/services/index.js +10 -13
  51. package/dist/services/local-secrets.d.ts +23 -0
  52. package/dist/services/local-secrets.js +45 -0
  53. package/dist/services/local-variables.d.ts +5 -0
  54. package/dist/services/local-variables.js +18 -0
  55. package/dist/services/scheduler-service.d.ts +21 -1
  56. package/dist/services/scheduler-service.js +14 -0
  57. package/dist/services/schema-service.d.ts +6 -0
  58. package/dist/services/scoped-secret-service.d.ts +16 -0
  59. package/dist/services/scoped-secret-service.js +35 -0
  60. package/dist/services/secret-service.d.ts +25 -4
  61. package/dist/services/trigger-service.d.ts +23 -0
  62. package/dist/services/trigger-service.js +1 -0
  63. package/dist/services/typed-secret-service.d.ts +30 -0
  64. package/dist/services/typed-secret-service.js +40 -0
  65. package/dist/services/typed-variables-service.d.ts +27 -0
  66. package/dist/services/typed-variables-service.js +46 -0
  67. package/dist/services/user-session-service.d.ts +13 -0
  68. package/dist/services/user-session-service.js +17 -0
  69. package/dist/services/variables-service.d.ts +5 -0
  70. package/dist/services/workflow-service.d.ts +9 -4
  71. package/dist/types/core.types.d.ts +48 -12
  72. package/dist/types/core.types.js +8 -1
  73. package/dist/types/state.types.d.ts +43 -51
  74. package/dist/utils.d.ts +3 -2
  75. package/dist/utils.js +15 -3
  76. package/dist/version.d.ts +6 -0
  77. package/dist/version.js +19 -0
  78. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  79. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  80. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  81. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  82. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
  83. package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
  84. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  85. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  86. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  87. package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
  88. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
  89. package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
  90. package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
  91. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  92. package/dist/wirings/ai-agent/index.d.ts +5 -0
  93. package/dist/wirings/ai-agent/index.js +4 -0
  94. package/dist/wirings/channel/channel-common.d.ts +7 -4
  95. package/dist/wirings/channel/channel-common.js +15 -8
  96. package/dist/wirings/channel/channel-handler.js +12 -3
  97. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  98. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  99. package/dist/wirings/channel/channel-runner.js +7 -7
  100. package/dist/wirings/channel/channel.types.d.ts +5 -1
  101. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  102. package/dist/wirings/channel/define-channel-routes.js +23 -0
  103. package/dist/wirings/channel/index.d.ts +10 -8
  104. package/dist/wirings/channel/index.js +7 -8
  105. package/dist/wirings/channel/local/index.d.ts +3 -3
  106. package/dist/wirings/channel/local/index.js +3 -3
  107. package/dist/wirings/channel/local/local-channel-runner.js +18 -6
  108. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  109. package/dist/wirings/channel/serverless/index.js +1 -1
  110. package/dist/wirings/channel/serverless/serverless-channel-runner.js +15 -4
  111. package/dist/wirings/cli/channel/index.d.ts +1 -1
  112. package/dist/wirings/cli/channel/index.js +1 -1
  113. package/dist/wirings/cli/cli-runner.d.ts +1 -1
  114. package/dist/wirings/cli/cli-runner.js +12 -8
  115. package/dist/wirings/cli/cli.types.d.ts +6 -6
  116. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  117. package/dist/wirings/cli/define-cli-commands.js +20 -0
  118. package/dist/wirings/cli/index.d.ts +2 -3
  119. package/dist/wirings/cli/index.js +1 -3
  120. package/dist/wirings/http/http-routes.d.ts +69 -0
  121. package/dist/wirings/http/http-routes.js +139 -0
  122. package/dist/wirings/http/http-runner.js +49 -23
  123. package/dist/wirings/http/http.types.d.ts +78 -38
  124. package/dist/wirings/http/index.d.ts +5 -4
  125. package/dist/wirings/http/index.js +4 -3
  126. package/dist/wirings/mcp/index.d.ts +4 -3
  127. package/dist/wirings/mcp/index.js +3 -3
  128. package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
  129. package/dist/wirings/mcp/mcp-runner.js +25 -39
  130. package/dist/wirings/mcp/mcp.types.d.ts +3 -3
  131. package/dist/wirings/node/index.d.ts +2 -0
  132. package/dist/wirings/node/index.js +1 -0
  133. package/dist/wirings/node/node.types.d.ts +20 -0
  134. package/dist/wirings/node/node.types.js +1 -0
  135. package/dist/wirings/oauth2/index.d.ts +3 -0
  136. package/dist/wirings/oauth2/index.js +2 -0
  137. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  138. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  139. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  140. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  141. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  142. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  143. package/dist/wirings/queue/index.d.ts +2 -2
  144. package/dist/wirings/queue/index.js +1 -1
  145. package/dist/wirings/queue/queue-runner.d.ts +7 -0
  146. package/dist/wirings/queue/queue-runner.js +17 -6
  147. package/dist/wirings/queue/queue.types.d.ts +8 -2
  148. package/dist/wirings/rpc/index.d.ts +1 -1
  149. package/dist/wirings/rpc/index.js +1 -1
  150. package/dist/wirings/rpc/rpc-runner.d.ts +33 -5
  151. package/dist/wirings/rpc/rpc-runner.js +134 -16
  152. package/dist/wirings/rpc/rpc-types.d.ts +8 -4
  153. package/dist/wirings/scheduler/index.d.ts +3 -3
  154. package/dist/wirings/scheduler/index.js +2 -3
  155. package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
  156. package/dist/wirings/scheduler/scheduler-runner.js +23 -5
  157. package/dist/wirings/secret/index.d.ts +3 -0
  158. package/dist/wirings/secret/index.js +2 -0
  159. package/dist/wirings/secret/secret.types.d.ts +27 -0
  160. package/dist/wirings/secret/secret.types.js +1 -0
  161. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  162. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  163. package/dist/wirings/trigger/index.d.ts +3 -2
  164. package/dist/wirings/trigger/index.js +2 -2
  165. package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
  166. package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
  167. package/dist/wirings/trigger/trigger-runner.d.ts +21 -8
  168. package/dist/wirings/trigger/trigger-runner.js +46 -18
  169. package/dist/wirings/trigger/trigger.types.d.ts +99 -11
  170. package/dist/wirings/trigger/trigger.types.js +40 -1
  171. package/dist/wirings/variable/index.d.ts +3 -0
  172. package/dist/wirings/variable/index.js +2 -0
  173. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  174. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  175. package/dist/wirings/variable/variable.types.d.ts +18 -0
  176. package/dist/wirings/variable/variable.types.js +1 -0
  177. package/dist/wirings/workflow/dsl/index.d.ts +1 -1
  178. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
  179. package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
  180. package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
  181. package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
  182. package/dist/wirings/workflow/graph/graph-runner.js +384 -296
  183. package/dist/wirings/workflow/graph/index.d.ts +4 -3
  184. package/dist/wirings/workflow/graph/index.js +3 -3
  185. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  186. package/dist/wirings/workflow/graph/template.js +27 -0
  187. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  188. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  189. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
  190. package/dist/wirings/workflow/index.d.ts +6 -6
  191. package/dist/wirings/workflow/index.js +6 -4
  192. package/dist/wirings/workflow/pikku-workflow-service.d.ts +28 -14
  193. package/dist/wirings/workflow/pikku-workflow-service.js +200 -56
  194. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  195. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  196. package/dist/wirings/workflow/workflow-utils.d.ts +1 -23
  197. package/dist/wirings/workflow/workflow-utils.js +1 -66
  198. package/dist/wirings/workflow/workflow.types.d.ts +40 -93
  199. package/package.json +13 -15
  200. package/run-tests.sh +4 -1
  201. package/src/crypto-utils.ts +99 -0
  202. package/src/errors/errors.ts +17 -0
  203. package/src/errors/index.ts +0 -1
  204. package/src/factory-functions.test.ts +42 -2
  205. package/src/function/function-runner.test.ts +4 -11
  206. package/src/function/function-runner.ts +114 -29
  207. package/src/function/functions.types.ts +62 -132
  208. package/src/function/index.ts +5 -2
  209. package/src/handle-error.ts +2 -10
  210. package/src/index.ts +99 -25
  211. package/src/middleware/auth-apikey.test.ts +15 -12
  212. package/src/middleware/auth-apikey.ts +3 -3
  213. package/src/middleware/auth-bearer.test.ts +17 -14
  214. package/src/middleware/auth-bearer.ts +25 -27
  215. package/src/middleware/auth-cookie.test.ts +16 -13
  216. package/src/middleware/auth-cookie.ts +6 -8
  217. package/src/middleware/cors.ts +96 -0
  218. package/src/middleware/index.ts +5 -3
  219. package/src/middleware/remote-auth.ts +68 -0
  220. package/src/middleware-runner.test.ts +122 -0
  221. package/src/middleware-runner.ts +12 -12
  222. package/src/permissions.test.ts +81 -7
  223. package/src/permissions.ts +15 -17
  224. package/src/pikku-state.ts +20 -8
  225. package/src/run-tests-script.test.ts +49 -0
  226. package/src/schema.ts +18 -15
  227. package/src/services/ai-agent-runner-service.ts +29 -0
  228. package/src/services/ai-run-state-service.ts +20 -0
  229. package/src/services/ai-storage-service.ts +39 -0
  230. package/src/services/deployment-service.ts +22 -0
  231. package/src/services/gopass-secrets.ts +95 -0
  232. package/src/services/in-memory-trigger-service.ts +68 -0
  233. package/src/services/in-memory-workflow-service.ts +395 -0
  234. package/src/services/index.ts +49 -14
  235. package/src/services/local-secrets.ts +51 -0
  236. package/src/services/local-variables.ts +22 -0
  237. package/src/services/scheduler-service.ts +29 -1
  238. package/src/services/schema-service.ts +7 -0
  239. package/src/services/scoped-secret-service.ts +41 -0
  240. package/src/services/secret-service.ts +25 -4
  241. package/src/services/trigger-service.ts +38 -0
  242. package/src/services/typed-secret-service.ts +70 -0
  243. package/src/services/typed-variables-service.ts +81 -0
  244. package/src/services/user-session-service.ts +23 -0
  245. package/src/services/variables-service.ts +5 -0
  246. package/src/services/workflow-service.ts +22 -2
  247. package/src/types/core.types.ts +76 -11
  248. package/src/types/state.types.ts +37 -63
  249. package/src/utils.ts +20 -6
  250. package/src/version.test.ts +80 -0
  251. package/src/version.ts +25 -0
  252. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  253. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  254. package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
  255. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  256. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  257. package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
  258. package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
  259. package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
  260. package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
  261. package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
  262. package/src/wirings/ai-agent/index.ts +28 -0
  263. package/src/wirings/channel/channel-common.ts +32 -19
  264. package/src/wirings/channel/channel-handler.ts +17 -4
  265. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  266. package/src/wirings/channel/channel-runner.ts +9 -10
  267. package/src/wirings/channel/channel.types.ts +17 -1
  268. package/src/wirings/channel/define-channel-routes.ts +25 -0
  269. package/src/wirings/channel/index.ts +23 -8
  270. package/src/wirings/channel/local/index.ts +3 -3
  271. package/src/wirings/channel/local/local-channel-runner.test.ts +44 -1
  272. package/src/wirings/channel/local/local-channel-runner.ts +22 -6
  273. package/src/wirings/channel/serverless/index.ts +5 -1
  274. package/src/wirings/channel/serverless/serverless-channel-runner.ts +20 -4
  275. package/src/wirings/cli/channel/index.ts +1 -1
  276. package/src/wirings/cli/cli-runner.test.ts +9 -9
  277. package/src/wirings/cli/cli-runner.ts +17 -10
  278. package/src/wirings/cli/cli.types.ts +11 -11
  279. package/src/wirings/cli/command-parser.test.ts +8 -8
  280. package/src/wirings/cli/define-cli-commands.ts +24 -0
  281. package/src/wirings/cli/index.ts +10 -4
  282. package/src/wirings/http/http-routes.test.ts +322 -0
  283. package/src/wirings/http/http-routes.ts +198 -0
  284. package/src/wirings/http/http-runner.test.ts +3 -3
  285. package/src/wirings/http/http-runner.ts +63 -29
  286. package/src/wirings/http/http.types.ts +121 -37
  287. package/src/wirings/http/index.ts +16 -4
  288. package/src/wirings/mcp/index.ts +27 -3
  289. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  290. package/src/wirings/mcp/mcp-runner.ts +39 -50
  291. package/src/wirings/mcp/mcp.types.ts +3 -3
  292. package/src/wirings/node/index.ts +2 -0
  293. package/src/wirings/node/node.types.ts +23 -0
  294. package/src/wirings/oauth2/index.ts +3 -0
  295. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  296. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  297. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  298. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  299. package/src/wirings/queue/index.ts +14 -2
  300. package/src/wirings/queue/queue-runner.test.ts +97 -55
  301. package/src/wirings/queue/queue-runner.ts +33 -7
  302. package/src/wirings/queue/queue.types.ts +12 -2
  303. package/src/wirings/rpc/index.ts +1 -1
  304. package/src/wirings/rpc/rpc-runner.ts +187 -17
  305. package/src/wirings/rpc/rpc-types.ts +13 -4
  306. package/src/wirings/scheduler/index.ts +7 -4
  307. package/src/wirings/scheduler/scheduler-runner.test.ts +70 -26
  308. package/src/wirings/scheduler/scheduler-runner.ts +45 -5
  309. package/src/wirings/secret/index.ts +9 -0
  310. package/src/wirings/secret/secret.types.ts +32 -0
  311. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  312. package/src/wirings/trigger/index.ts +10 -2
  313. package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
  314. package/src/wirings/trigger/trigger-runner.ts +80 -38
  315. package/src/wirings/trigger/trigger.types.ts +144 -22
  316. package/src/wirings/variable/index.ts +8 -0
  317. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  318. package/src/wirings/variable/variable.types.ts +22 -0
  319. package/src/wirings/workflow/dsl/index.ts +1 -0
  320. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
  321. package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
  322. package/src/wirings/workflow/graph/graph-node.ts +1 -6
  323. package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
  324. package/src/wirings/workflow/graph/graph-runner.ts +496 -374
  325. package/src/wirings/workflow/graph/index.ts +14 -3
  326. package/src/wirings/workflow/graph/template.ts +42 -0
  327. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  328. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
  329. package/src/wirings/workflow/index.ts +21 -10
  330. package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
  331. package/src/wirings/workflow/pikku-workflow-service.ts +285 -66
  332. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  333. package/src/wirings/workflow/workflow-utils.ts +0 -120
  334. package/src/wirings/workflow/workflow.types.ts +45 -90
  335. package/tsconfig.tsbuildinfo +1 -1
  336. package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
  337. package/dist/wirings/forge-node/forge-node.types.js +0 -38
  338. package/dist/wirings/forge-node/index.d.ts +0 -1
  339. package/dist/wirings/forge-node/index.js +0 -1
  340. package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
  341. package/dist/wirings/workflow/wire-workflow.js +0 -53
  342. package/src/wirings/forge-node/forge-node.types.ts +0 -135
  343. package/src/wirings/forge-node/index.ts +0 -1
  344. package/src/wirings/workflow/wire-workflow.ts +0 -94
@@ -4,6 +4,7 @@ import {
4
4
  CorePermissionGroup,
5
5
  CorePikkuPermission,
6
6
  } from '../function/functions.types.js'
7
+ import { CorePikkuTriggerFunctionConfig } from '../wirings/trigger/trigger.types.js'
7
8
  import { CoreChannel, ChannelsMeta } from '../wirings/channel/channel.types.js'
8
9
  import { CLIMeta, CLIProgramState } from '../wirings/cli/cli.types.js'
9
10
  import {
@@ -14,11 +15,11 @@ import {
14
15
  import {
15
16
  CoreMCPResource,
16
17
  MCPResourceMeta,
17
- CoreMCPTool,
18
18
  MCPToolMeta,
19
19
  CoreMCPPrompt,
20
20
  MCPPromptMeta,
21
21
  } from '../wirings/mcp/mcp.types.js'
22
+ import { CoreAIAgent, AIAgentMeta } from '../wirings/ai-agent/ai-agent.types.js'
22
23
  import {
23
24
  CoreQueueWorker,
24
25
  QueueWorkersMeta,
@@ -30,18 +31,17 @@ import {
30
31
  import {
31
32
  CoreWorkflow,
32
33
  WorkflowsRuntimeMeta,
33
- WorkflowWires,
34
34
  } from '../wirings/workflow/workflow.types.js'
35
- import type {
36
- WorkflowGraphDefinition,
37
- GraphNodeConfig,
38
- } from '../wirings/workflow/graph/workflow-graph.types.js'
39
- import { CoreTrigger, TriggerMeta } from '../wirings/trigger/trigger.types.js'
35
+ import {
36
+ CoreTrigger,
37
+ CoreTriggerSource,
38
+ TriggerMeta,
39
+ TriggerSourceMeta,
40
+ } from '../wirings/trigger/trigger.types.js'
40
41
  import {
41
42
  FunctionsMeta,
42
43
  CorePikkuMiddleware,
43
44
  CorePikkuMiddlewareGroup,
44
- FunctionServicesMeta,
45
45
  CreateConfig,
46
46
  CreateSingletonServices,
47
47
  CreateWireServices,
@@ -50,6 +50,7 @@ import {
50
50
  CoreServices,
51
51
  CoreUserSession,
52
52
  } from './core.types.js'
53
+ import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js'
53
54
 
54
55
  /**
55
56
  * State structure for an individual package
@@ -68,8 +69,8 @@ export interface PikkuPackageState {
68
69
  path: string
69
70
  }
70
71
  >
71
- /** Maps namespace aliases to package names (e.g., 'ext' -> '@pikku/templates-function-external') */
72
- externalPackages: Map<string, string>
72
+ /** Maps namespace aliases to package config (e.g., 'ext' -> { package: '@pikku/...', rpcEndpoint: '...' }) */
73
+ externalPackages: Map<string, { package: string; rpcEndpoint?: string }>
73
74
  }
74
75
  http: {
75
76
  middleware: Map<string, CorePikkuMiddleware<any, any>[]>
@@ -91,28 +92,26 @@ export interface PikkuPackageState {
91
92
  }
92
93
  workflows: {
93
94
  registrations: Map<string, CoreWorkflow>
94
- graphRegistrations: Map<string, WorkflowGraphDefinition<any>>
95
- /** DSL workflow wirings (from wireWorkflow({ func: ... })) */
96
- wirings: Map<any, { wires: WorkflowWires; func: any }>
97
- /** Graph workflow wirings (from wireWorkflow({ graph: ... })) */
98
- graphWirings: Map<
99
- any,
100
- { wires: WorkflowWires; graph: Record<string, GraphNodeConfig<string>> }
101
- >
102
95
  meta: WorkflowsRuntimeMeta
103
96
  }
104
97
  trigger: {
98
+ functions: Map<string, CorePikkuTriggerFunctionConfig<any, any>>
105
99
  triggers: Map<string, CoreTrigger>
100
+ triggerSources: Map<string, CoreTriggerSource>
106
101
  meta: TriggerMeta
102
+ sourceMeta: TriggerSourceMeta
107
103
  }
108
104
  mcp: {
109
105
  resources: Map<string, CoreMCPResource>
110
106
  resourcesMeta: MCPResourceMeta
111
- tools: Map<string, CoreMCPTool>
112
107
  toolsMeta: MCPToolMeta
113
108
  prompts: Map<string, CoreMCPPrompt>
114
109
  promptsMeta: MCPPromptMeta
115
110
  }
111
+ agent: {
112
+ agents: Map<string, CoreAIAgent>
113
+ agentsMeta: AIAgentMeta
114
+ }
116
115
  cli: {
117
116
  meta: CLIMeta | Record<string, any> // Backward compatible with old published CLI format
118
117
  programs: Record<string, CLIProgramState>
@@ -120,61 +119,34 @@ export interface PikkuPackageState {
120
119
  middleware: {
121
120
  tagGroup: Record<string, CorePikkuMiddlewareGroup>
122
121
  httpGroup: Record<string, CorePikkuMiddlewareGroup>
123
- tagGroupMeta: Record<
124
- string,
125
- {
126
- exportName: string | null
127
- sourceFile: string
128
- position: number
129
- services: FunctionServicesMeta
130
- middlewareCount: number
131
- isFactory: boolean
132
- }
133
- >
134
- httpGroupMeta: Record<
135
- string,
136
- {
137
- exportName: string | null
138
- sourceFile: string
139
- position: number
140
- services: FunctionServicesMeta
141
- middlewareCount: number
142
- isFactory: boolean
143
- }
144
- >
122
+ }
123
+ channelMiddleware: {
124
+ tagGroup: Record<string, CorePikkuChannelMiddleware[]>
145
125
  }
146
126
  permissions: {
147
127
  tagGroup: Record<string, CorePermissionGroup | CorePikkuPermission[]>
148
128
  httpGroup: Record<string, CorePermissionGroup | CorePikkuPermission[]>
149
- tagGroupMeta: Record<
150
- string,
151
- {
152
- exportName: string | null
153
- sourceFile: string
154
- position: number
155
- services: FunctionServicesMeta
156
- permissionCount: number
157
- isFactory: boolean
158
- }
159
- >
160
- httpGroupMeta: Record<
161
- string,
162
- {
163
- exportName: string | null
164
- sourceFile: string
165
- position: number
166
- services: FunctionServicesMeta
167
- permissionCount: number
168
- isFactory: boolean
169
- }
170
- >
171
129
  }
172
130
  misc: {
173
131
  errors: Map<PikkuError, ErrorDetails>
174
132
  schemas: Map<string, any>
175
133
  middleware: Record<string, CorePikkuMiddleware[]>
134
+ channelMiddleware: Record<string, CorePikkuChannelMiddleware[]>
176
135
  permissions: Record<string, CorePermissionGroup | CorePikkuPermission[]>
177
136
  }
137
+ models: {
138
+ config: {
139
+ models?: Record<
140
+ string,
141
+ string | { model: string; temperature?: number; maxSteps?: number }
142
+ >
143
+ agentDefaults?: { temperature?: number; maxSteps?: number }
144
+ agentOverrides?: Record<
145
+ string,
146
+ { model?: string; temperature?: number; maxSteps?: number }
147
+ >
148
+ } | null
149
+ }
178
150
  package: {
179
151
  /** Service factory functions for external packages */
180
152
  factories: {
@@ -191,5 +163,7 @@ export interface PikkuPackageState {
191
163
  } | null
192
164
  /** Cached singleton services for this package */
193
165
  singletonServices: CoreSingletonServices | null
166
+ /** Absolute path to this package's .pikku directory */
167
+ metaDir: string | null
194
168
  }
195
169
  }
package/src/utils.ts CHANGED
@@ -1,15 +1,12 @@
1
1
  import { Logger } from './services/logger.js'
2
- import { CoreSingletonServices } from './types/core.types.js'
2
+ import { CoreSingletonServices, WireServices } from './types/core.types.js'
3
3
 
4
- // TODO: WireServices probably needs it's own type
5
- // but is an issue for the future and will be tackled
6
- // with dependency injection
7
4
  export const closeWireServices = async (
8
5
  logger: Logger,
9
- wireServices: Record<string, any>
6
+ wireServices: WireServices
10
7
  ) => {
11
8
  await Promise.all(
12
- Object.values(wireServices).map(async (service) => {
9
+ Object.values(wireServices).map(async (service: any) => {
13
10
  if (service?.close) {
14
11
  try {
15
12
  await service.close()
@@ -40,6 +37,23 @@ export const isSerializable = (data: any): boolean => {
40
37
  )
41
38
  }
42
39
 
40
+ export const getTagGroups = <T>(
41
+ tagGroups: Record<string, T>,
42
+ tag: string
43
+ ): T[] => {
44
+ const results: T[] = []
45
+ const exact = tagGroups[tag]
46
+ if (exact) results.push(exact)
47
+ let colonIdx = tag.lastIndexOf(':')
48
+ while (colonIdx !== -1) {
49
+ const parent = tag.slice(0, colonIdx)
50
+ const group = tagGroups[parent]
51
+ if (group) results.push(group)
52
+ colonIdx = parent.lastIndexOf(':')
53
+ }
54
+ return results
55
+ }
56
+
43
57
  const EMPTY_ARRAY = Object.freeze([])
44
58
 
45
59
  export const freezeDedupe = <T>(
@@ -0,0 +1,80 @@
1
+ import { strict as assert } from 'assert'
2
+ import { describe, test } from 'node:test'
3
+ import {
4
+ formatVersionedId,
5
+ parseVersionedId,
6
+ isVersionedId,
7
+ } from './version.js'
8
+
9
+ describe('formatVersionedId', () => {
10
+ test('formats base name with version', () => {
11
+ assert.strictEqual(formatVersionedId('createUser', 1), 'createUser@v1')
12
+ assert.strictEqual(formatVersionedId('createUser', 2), 'createUser@v2')
13
+ assert.strictEqual(formatVersionedId('createUser', 10), 'createUser@v10')
14
+ })
15
+
16
+ test('handles namespaced base names', () => {
17
+ assert.strictEqual(
18
+ formatVersionedId('pkg:createUser', 3),
19
+ 'pkg:createUser@v3'
20
+ )
21
+ })
22
+ })
23
+
24
+ describe('parseVersionedId', () => {
25
+ test('parses versioned IDs', () => {
26
+ assert.deepStrictEqual(parseVersionedId('createUser@v1'), {
27
+ baseName: 'createUser',
28
+ version: 1,
29
+ })
30
+ assert.deepStrictEqual(parseVersionedId('createUser@v2'), {
31
+ baseName: 'createUser',
32
+ version: 2,
33
+ })
34
+ assert.deepStrictEqual(parseVersionedId('createUser@v10'), {
35
+ baseName: 'createUser',
36
+ version: 10,
37
+ })
38
+ })
39
+
40
+ test('returns null version for unversioned IDs', () => {
41
+ assert.deepStrictEqual(parseVersionedId('createUser'), {
42
+ baseName: 'createUser',
43
+ version: null,
44
+ })
45
+ })
46
+
47
+ test('returns null version for invalid version suffix', () => {
48
+ assert.deepStrictEqual(parseVersionedId('createUser@vx'), {
49
+ baseName: 'createUser@vx',
50
+ version: null,
51
+ })
52
+ assert.deepStrictEqual(parseVersionedId('createUser@v0'), {
53
+ baseName: 'createUser@v0',
54
+ version: null,
55
+ })
56
+ assert.deepStrictEqual(parseVersionedId('createUser@v-1'), {
57
+ baseName: 'createUser@v-1',
58
+ version: null,
59
+ })
60
+ })
61
+
62
+ test('handles namespaced versioned IDs', () => {
63
+ assert.deepStrictEqual(parseVersionedId('pkg:createUser@v3'), {
64
+ baseName: 'pkg:createUser',
65
+ version: 3,
66
+ })
67
+ })
68
+ })
69
+
70
+ describe('isVersionedId', () => {
71
+ test('returns true for versioned IDs', () => {
72
+ assert.strictEqual(isVersionedId('createUser@v1'), true)
73
+ assert.strictEqual(isVersionedId('createUser@v99'), true)
74
+ })
75
+
76
+ test('returns false for unversioned IDs', () => {
77
+ assert.strictEqual(isVersionedId('createUser'), false)
78
+ assert.strictEqual(isVersionedId('createUser@vx'), false)
79
+ })
80
+ })
package/src/version.ts ADDED
@@ -0,0 +1,25 @@
1
+ const VERSION_SEPARATOR = '@v'
2
+
3
+ export function formatVersionedId(baseName: string, version: number): string {
4
+ return `${baseName}${VERSION_SEPARATOR}${version}`
5
+ }
6
+
7
+ export function parseVersionedId(id: string): {
8
+ baseName: string
9
+ version: number | null
10
+ } {
11
+ const idx = id.lastIndexOf(VERSION_SEPARATOR)
12
+ if (idx === -1) {
13
+ return { baseName: id, version: null }
14
+ }
15
+ const versionStr = id.slice(idx + VERSION_SEPARATOR.length)
16
+ const version = Number(versionStr)
17
+ if (!Number.isInteger(version) || version < 1) {
18
+ return { baseName: id, version: null }
19
+ }
20
+ return { baseName: id.slice(0, idx), version }
21
+ }
22
+
23
+ export function isVersionedId(id: string): boolean {
24
+ return parseVersionedId(id).version !== null
25
+ }
@@ -0,0 +1,300 @@
1
+ import { randomUUID } from 'crypto'
2
+ import type { CoreSingletonServices } from '../../types/core.types.js'
3
+ import type {
4
+ CoreAIAgent,
5
+ AIAgentMemoryConfig,
6
+ AIAgentInput,
7
+ AIMessage,
8
+ } from './ai-agent.types.js'
9
+ import type { AIStorageService } from '../../services/ai-storage-service.js'
10
+ import type { Logger } from '../../services/logger.js'
11
+ import type { SchemaService } from '../../services/schema-service.js'
12
+
13
+ export function resolveMemoryServices(
14
+ agent: CoreAIAgent,
15
+ singletonServices: CoreSingletonServices
16
+ ): {
17
+ storage: AIStorageService | undefined
18
+ } {
19
+ const memoryConfig = agent.memory
20
+ const storage = memoryConfig?.storage
21
+ ? (singletonServices as any)[memoryConfig.storage]
22
+ : singletonServices.aiStorage
23
+ return { storage }
24
+ }
25
+
26
+ export function deepMergeWorkingMemory(
27
+ existing: Record<string, unknown>,
28
+ updates: Record<string, unknown>
29
+ ): Record<string, unknown> {
30
+ const result = { ...existing }
31
+ for (const key of Object.keys(updates)) {
32
+ const value = updates[key]
33
+ if (value === null) {
34
+ delete result[key]
35
+ } else if (
36
+ typeof value === 'object' &&
37
+ !Array.isArray(value) &&
38
+ typeof result[key] === 'object' &&
39
+ result[key] !== null &&
40
+ !Array.isArray(result[key])
41
+ ) {
42
+ result[key] = deepMergeWorkingMemory(
43
+ result[key] as Record<string, unknown>,
44
+ value as Record<string, unknown>
45
+ )
46
+ } else {
47
+ result[key] = value
48
+ }
49
+ }
50
+ return result
51
+ }
52
+
53
+ export function buildWorkingMemoryPrompt(
54
+ currentState: Record<string, unknown> | null,
55
+ jsonSchema?: Record<string, unknown>
56
+ ): string {
57
+ const parts: string[] = []
58
+
59
+ if (jsonSchema?.properties) {
60
+ const props = jsonSchema.properties as Record<
61
+ string,
62
+ { type?: string; description?: string }
63
+ >
64
+ const fieldLines = Object.entries(props).map(([name, def]) => {
65
+ const type = def.type ?? 'unknown'
66
+ const desc = def.description ? ` - ${def.description}` : ''
67
+ return ` - ${name} (${type})${desc}`
68
+ })
69
+ if (fieldLines.length > 0) {
70
+ parts.push(`Working memory fields:\n${fieldLines.join('\n')}`)
71
+ }
72
+ }
73
+
74
+ if (currentState && Object.keys(currentState).length > 0) {
75
+ parts.push(`Current working memory:\n${JSON.stringify(currentState)}`)
76
+ } else {
77
+ parts.push('Current working memory: (empty)')
78
+ }
79
+
80
+ parts.push(
81
+ 'When you learn new information, output a partial JSON update in <working_memory> tags. ' +
82
+ 'Only include changed fields. Set a field to null to delete it.'
83
+ )
84
+
85
+ return parts.join('\n\n')
86
+ }
87
+
88
+ export async function loadContextMessages(
89
+ memoryConfig: AIAgentMemoryConfig | undefined,
90
+ storage: AIStorageService | undefined,
91
+ input: AIAgentInput,
92
+ workingMemoryJsonSchema?: Record<string, unknown>
93
+ ): Promise<AIMessage[]> {
94
+ const contextMessages: AIMessage[] = []
95
+
96
+ if (memoryConfig?.workingMemory && storage) {
97
+ const workingMem = await storage.getWorkingMemory(input.threadId, 'thread')
98
+ const prompt = buildWorkingMemoryPrompt(workingMem, workingMemoryJsonSchema)
99
+ contextMessages.push({
100
+ id: `wm-${randomUUID()}`,
101
+ role: 'system',
102
+ content: prompt,
103
+ createdAt: new Date(),
104
+ })
105
+ }
106
+
107
+ return contextMessages
108
+ }
109
+
110
+ export async function saveMessages(
111
+ storage: AIStorageService | undefined,
112
+ threadId: string,
113
+ resourceId: string,
114
+ memoryConfig: AIAgentMemoryConfig | undefined,
115
+ userMessage: AIMessage,
116
+ result: {
117
+ text: string
118
+ steps: {
119
+ toolCalls?: {
120
+ name: string
121
+ args: Record<string, unknown>
122
+ result: string
123
+ }[]
124
+ }[]
125
+ },
126
+ options?: {
127
+ workingMemoryJsonSchema?: Record<string, unknown>
128
+ workingMemorySchemaName?: string | null
129
+ logger?: Logger
130
+ schemaService?: SchemaService
131
+ }
132
+ ): Promise<string> {
133
+ let responseText = result.text
134
+
135
+ if (storage) {
136
+ const newMessages: AIMessage[] = [userMessage]
137
+
138
+ for (const step of result.steps) {
139
+ if (step.toolCalls?.length) {
140
+ newMessages.push({
141
+ id: randomUUID(),
142
+ role: 'assistant',
143
+ toolCalls: step.toolCalls.map((tc) => ({
144
+ id: randomUUID(),
145
+ name: tc.name,
146
+ args: tc.args,
147
+ })),
148
+ createdAt: new Date(),
149
+ })
150
+ newMessages.push({
151
+ id: randomUUID(),
152
+ role: 'tool',
153
+ toolResults: step.toolCalls.map((tc) => ({
154
+ id: randomUUID(),
155
+ name: tc.name,
156
+ result: tc.result,
157
+ })),
158
+ createdAt: new Date(),
159
+ })
160
+ }
161
+ }
162
+
163
+ newMessages.push({
164
+ id: randomUUID(),
165
+ role: 'assistant',
166
+ content: responseText,
167
+ createdAt: new Date(),
168
+ })
169
+
170
+ await storage.saveMessages(threadId, newMessages)
171
+
172
+ if (memoryConfig?.workingMemory) {
173
+ const parsed = parseWorkingMemory(responseText)
174
+ if (parsed) {
175
+ const existing =
176
+ (await storage.getWorkingMemory(threadId, 'thread')) ?? {}
177
+ const merged = deepMergeWorkingMemory(existing, parsed)
178
+
179
+ if (options?.schemaService && options?.workingMemorySchemaName) {
180
+ try {
181
+ await options.schemaService.validateSchema(
182
+ options.workingMemorySchemaName,
183
+ merged
184
+ )
185
+ } catch (err) {
186
+ options.logger?.warn(
187
+ `Working memory validation failed: ${err instanceof Error ? err.message : String(err)}`
188
+ )
189
+ }
190
+ }
191
+
192
+ await storage.saveWorkingMemory(threadId, 'thread', merged)
193
+ responseText = stripWorkingMemoryTags(responseText)
194
+ }
195
+ }
196
+ }
197
+
198
+ return responseText
199
+ }
200
+
201
+ export function trimMessages(
202
+ messages: AIMessage[],
203
+ maxTokenBudget: number = 100000
204
+ ): AIMessage[] {
205
+ const sanitized = sanitizeToolMessages(messages)
206
+
207
+ let estimatedTokens = 0
208
+ const result: AIMessage[] = []
209
+
210
+ for (let i = sanitized.length - 1; i >= 0; i--) {
211
+ const msg = sanitized[i]
212
+ const msgTokens = estimateTokens(msg)
213
+ if (estimatedTokens + msgTokens > maxTokenBudget && result.length > 0) {
214
+ break
215
+ }
216
+ estimatedTokens += msgTokens
217
+ result.unshift(msg)
218
+ }
219
+
220
+ if (
221
+ result.length > 0 &&
222
+ result[0].role !== 'user' &&
223
+ result[0].role !== 'system'
224
+ ) {
225
+ const firstUserIdx = result.findIndex(
226
+ (m) => m.role === 'user' || m.role === 'system'
227
+ )
228
+ if (firstUserIdx > 0) {
229
+ return result.slice(firstUserIdx)
230
+ }
231
+ }
232
+
233
+ return result
234
+ }
235
+
236
+ function sanitizeToolMessages(messages: AIMessage[]): AIMessage[] {
237
+ const result: AIMessage[] = []
238
+
239
+ for (let i = 0; i < messages.length; i++) {
240
+ const msg = messages[i]
241
+
242
+ if (msg.role === 'assistant' && msg.toolCalls?.length) {
243
+ const next = messages[i + 1]
244
+ if (!next || next.role !== 'tool' || !next.toolResults?.length) {
245
+ if (msg.content) {
246
+ result.push({ ...msg, toolCalls: undefined })
247
+ }
248
+ continue
249
+ }
250
+
251
+ const toolCallIds = new Set(msg.toolCalls.map((tc) => tc.id))
252
+ const resultIds = new Set(next.toolResults.map((tr) => tr.id))
253
+ const allMatched = [...toolCallIds].every((id) => resultIds.has(id))
254
+
255
+ if (!allMatched) {
256
+ if (msg.content) {
257
+ result.push({ ...msg, toolCalls: undefined })
258
+ }
259
+ result.push({
260
+ ...next,
261
+ toolResults:
262
+ next.toolResults.filter((tr) => !toolCallIds.has(tr.id)) ||
263
+ undefined,
264
+ })
265
+ i++
266
+ continue
267
+ }
268
+ }
269
+
270
+ result.push(msg)
271
+ }
272
+
273
+ return result.filter(
274
+ (m) => m.role !== 'tool' || (m.toolResults && m.toolResults.length > 0)
275
+ )
276
+ }
277
+
278
+ function estimateTokens(msg: AIMessage): number {
279
+ let chars = 0
280
+ if (msg.content) chars += msg.content.length
281
+ if (msg.toolCalls) chars += JSON.stringify(msg.toolCalls).length
282
+ if (msg.toolResults) chars += JSON.stringify(msg.toolResults).length
283
+ return Math.ceil(chars / 4)
284
+ }
285
+
286
+ export function parseWorkingMemory(
287
+ text: string
288
+ ): Record<string, unknown> | null {
289
+ const match = text.match(/<working_memory>([\s\S]*?)<\/working_memory>/)
290
+ if (!match) return null
291
+ try {
292
+ return JSON.parse(match[1].trim())
293
+ } catch {
294
+ return null
295
+ }
296
+ }
297
+
298
+ export function stripWorkingMemoryTags(text: string): string {
299
+ return text.replace(/<working_memory>[\s\S]*?<\/working_memory>/g, '').trim()
300
+ }
@@ -0,0 +1,43 @@
1
+ import { pikkuState } from '../../pikku-state.js'
2
+
3
+ export function resolveModelConfig(
4
+ agentName: string,
5
+ agent: { model: string; temperature?: number; maxSteps?: number }
6
+ ): { model: string; temperature?: number; maxSteps?: number } {
7
+ let config: any = {}
8
+ try {
9
+ config = pikkuState(null, 'models', 'config') ?? {}
10
+ } catch {}
11
+ const models = config.models ?? {}
12
+ const defaults = config.agentDefaults
13
+ const agentOverride = config.agentOverrides?.[agentName]
14
+
15
+ let rawModel = agentOverride?.model ?? agent.model
16
+
17
+ let aliasTemperature: number | undefined
18
+ let aliasMaxSteps: number | undefined
19
+ if (!rawModel.includes('/')) {
20
+ const entry = models[rawModel]
21
+ if (!entry) throw new Error(`Unknown model alias '${rawModel}'.`)
22
+ if (typeof entry === 'string') {
23
+ rawModel = entry
24
+ } else {
25
+ rawModel = entry.model
26
+ aliasTemperature = entry.temperature
27
+ aliasMaxSteps = entry.maxSteps
28
+ }
29
+ }
30
+
31
+ const temperature =
32
+ agentOverride?.temperature ??
33
+ aliasTemperature ??
34
+ defaults?.temperature ??
35
+ agent.temperature
36
+ const maxSteps =
37
+ agentOverride?.maxSteps ??
38
+ aliasMaxSteps ??
39
+ defaults?.maxSteps ??
40
+ agent.maxSteps
41
+
42
+ return { model: rawModel, temperature, maxSteps }
43
+ }