@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
@@ -0,0 +1,6 @@
1
+ export declare function formatVersionedId(baseName: string, version: number): string;
2
+ export declare function parseVersionedId(id: string): {
3
+ baseName: string;
4
+ version: number | null;
5
+ };
6
+ export declare function isVersionedId(id: string): boolean;
@@ -0,0 +1,19 @@
1
+ const VERSION_SEPARATOR = '@v';
2
+ export function formatVersionedId(baseName, version) {
3
+ return `${baseName}${VERSION_SEPARATOR}${version}`;
4
+ }
5
+ export function parseVersionedId(id) {
6
+ const idx = id.lastIndexOf(VERSION_SEPARATOR);
7
+ if (idx === -1) {
8
+ return { baseName: id, version: null };
9
+ }
10
+ const versionStr = id.slice(idx + VERSION_SEPARATOR.length);
11
+ const version = Number(versionStr);
12
+ if (!Number.isInteger(version) || version < 1) {
13
+ return { baseName: id, version: null };
14
+ }
15
+ return { baseName: id.slice(0, idx), version };
16
+ }
17
+ export function isVersionedId(id) {
18
+ return parseVersionedId(id).version !== null;
19
+ }
@@ -0,0 +1,29 @@
1
+ import type { CoreSingletonServices } from '../../types/core.types.js';
2
+ import type { CoreAIAgent, AIAgentMemoryConfig, AIAgentInput, AIMessage } from './ai-agent.types.js';
3
+ import type { AIStorageService } from '../../services/ai-storage-service.js';
4
+ import type { Logger } from '../../services/logger.js';
5
+ import type { SchemaService } from '../../services/schema-service.js';
6
+ export declare function resolveMemoryServices(agent: CoreAIAgent, singletonServices: CoreSingletonServices): {
7
+ storage: AIStorageService | undefined;
8
+ };
9
+ export declare function deepMergeWorkingMemory(existing: Record<string, unknown>, updates: Record<string, unknown>): Record<string, unknown>;
10
+ export declare function buildWorkingMemoryPrompt(currentState: Record<string, unknown> | null, jsonSchema?: Record<string, unknown>): string;
11
+ export declare function loadContextMessages(memoryConfig: AIAgentMemoryConfig | undefined, storage: AIStorageService | undefined, input: AIAgentInput, workingMemoryJsonSchema?: Record<string, unknown>): Promise<AIMessage[]>;
12
+ export declare function saveMessages(storage: AIStorageService | undefined, threadId: string, resourceId: string, memoryConfig: AIAgentMemoryConfig | undefined, userMessage: AIMessage, result: {
13
+ text: string;
14
+ steps: {
15
+ toolCalls?: {
16
+ name: string;
17
+ args: Record<string, unknown>;
18
+ result: string;
19
+ }[];
20
+ }[];
21
+ }, options?: {
22
+ workingMemoryJsonSchema?: Record<string, unknown>;
23
+ workingMemorySchemaName?: string | null;
24
+ logger?: Logger;
25
+ schemaService?: SchemaService;
26
+ }): Promise<string>;
27
+ export declare function trimMessages(messages: AIMessage[], maxTokenBudget?: number): AIMessage[];
28
+ export declare function parseWorkingMemory(text: string): Record<string, unknown> | null;
29
+ export declare function stripWorkingMemoryTags(text: string): string;
@@ -0,0 +1,199 @@
1
+ import { randomUUID } from 'crypto';
2
+ export function resolveMemoryServices(agent, singletonServices) {
3
+ const memoryConfig = agent.memory;
4
+ const storage = memoryConfig?.storage
5
+ ? singletonServices[memoryConfig.storage]
6
+ : singletonServices.aiStorage;
7
+ return { storage };
8
+ }
9
+ export function deepMergeWorkingMemory(existing, updates) {
10
+ const result = { ...existing };
11
+ for (const key of Object.keys(updates)) {
12
+ const value = updates[key];
13
+ if (value === null) {
14
+ delete result[key];
15
+ }
16
+ else if (typeof value === 'object' &&
17
+ !Array.isArray(value) &&
18
+ typeof result[key] === 'object' &&
19
+ result[key] !== null &&
20
+ !Array.isArray(result[key])) {
21
+ result[key] = deepMergeWorkingMemory(result[key], value);
22
+ }
23
+ else {
24
+ result[key] = value;
25
+ }
26
+ }
27
+ return result;
28
+ }
29
+ export function buildWorkingMemoryPrompt(currentState, jsonSchema) {
30
+ const parts = [];
31
+ if (jsonSchema?.properties) {
32
+ const props = jsonSchema.properties;
33
+ const fieldLines = Object.entries(props).map(([name, def]) => {
34
+ const type = def.type ?? 'unknown';
35
+ const desc = def.description ? ` - ${def.description}` : '';
36
+ return ` - ${name} (${type})${desc}`;
37
+ });
38
+ if (fieldLines.length > 0) {
39
+ parts.push(`Working memory fields:\n${fieldLines.join('\n')}`);
40
+ }
41
+ }
42
+ if (currentState && Object.keys(currentState).length > 0) {
43
+ parts.push(`Current working memory:\n${JSON.stringify(currentState)}`);
44
+ }
45
+ else {
46
+ parts.push('Current working memory: (empty)');
47
+ }
48
+ parts.push('When you learn new information, output a partial JSON update in <working_memory> tags. ' +
49
+ 'Only include changed fields. Set a field to null to delete it.');
50
+ return parts.join('\n\n');
51
+ }
52
+ export async function loadContextMessages(memoryConfig, storage, input, workingMemoryJsonSchema) {
53
+ const contextMessages = [];
54
+ if (memoryConfig?.workingMemory && storage) {
55
+ const workingMem = await storage.getWorkingMemory(input.threadId, 'thread');
56
+ const prompt = buildWorkingMemoryPrompt(workingMem, workingMemoryJsonSchema);
57
+ contextMessages.push({
58
+ id: `wm-${randomUUID()}`,
59
+ role: 'system',
60
+ content: prompt,
61
+ createdAt: new Date(),
62
+ });
63
+ }
64
+ return contextMessages;
65
+ }
66
+ export async function saveMessages(storage, threadId, resourceId, memoryConfig, userMessage, result, options) {
67
+ let responseText = result.text;
68
+ if (storage) {
69
+ const newMessages = [userMessage];
70
+ for (const step of result.steps) {
71
+ if (step.toolCalls?.length) {
72
+ newMessages.push({
73
+ id: randomUUID(),
74
+ role: 'assistant',
75
+ toolCalls: step.toolCalls.map((tc) => ({
76
+ id: randomUUID(),
77
+ name: tc.name,
78
+ args: tc.args,
79
+ })),
80
+ createdAt: new Date(),
81
+ });
82
+ newMessages.push({
83
+ id: randomUUID(),
84
+ role: 'tool',
85
+ toolResults: step.toolCalls.map((tc) => ({
86
+ id: randomUUID(),
87
+ name: tc.name,
88
+ result: tc.result,
89
+ })),
90
+ createdAt: new Date(),
91
+ });
92
+ }
93
+ }
94
+ newMessages.push({
95
+ id: randomUUID(),
96
+ role: 'assistant',
97
+ content: responseText,
98
+ createdAt: new Date(),
99
+ });
100
+ await storage.saveMessages(threadId, newMessages);
101
+ if (memoryConfig?.workingMemory) {
102
+ const parsed = parseWorkingMemory(responseText);
103
+ if (parsed) {
104
+ const existing = (await storage.getWorkingMemory(threadId, 'thread')) ?? {};
105
+ const merged = deepMergeWorkingMemory(existing, parsed);
106
+ if (options?.schemaService && options?.workingMemorySchemaName) {
107
+ try {
108
+ await options.schemaService.validateSchema(options.workingMemorySchemaName, merged);
109
+ }
110
+ catch (err) {
111
+ options.logger?.warn(`Working memory validation failed: ${err instanceof Error ? err.message : String(err)}`);
112
+ }
113
+ }
114
+ await storage.saveWorkingMemory(threadId, 'thread', merged);
115
+ responseText = stripWorkingMemoryTags(responseText);
116
+ }
117
+ }
118
+ }
119
+ return responseText;
120
+ }
121
+ export function trimMessages(messages, maxTokenBudget = 100000) {
122
+ const sanitized = sanitizeToolMessages(messages);
123
+ let estimatedTokens = 0;
124
+ const result = [];
125
+ for (let i = sanitized.length - 1; i >= 0; i--) {
126
+ const msg = sanitized[i];
127
+ const msgTokens = estimateTokens(msg);
128
+ if (estimatedTokens + msgTokens > maxTokenBudget && result.length > 0) {
129
+ break;
130
+ }
131
+ estimatedTokens += msgTokens;
132
+ result.unshift(msg);
133
+ }
134
+ if (result.length > 0 &&
135
+ result[0].role !== 'user' &&
136
+ result[0].role !== 'system') {
137
+ const firstUserIdx = result.findIndex((m) => m.role === 'user' || m.role === 'system');
138
+ if (firstUserIdx > 0) {
139
+ return result.slice(firstUserIdx);
140
+ }
141
+ }
142
+ return result;
143
+ }
144
+ function sanitizeToolMessages(messages) {
145
+ const result = [];
146
+ for (let i = 0; i < messages.length; i++) {
147
+ const msg = messages[i];
148
+ if (msg.role === 'assistant' && msg.toolCalls?.length) {
149
+ const next = messages[i + 1];
150
+ if (!next || next.role !== 'tool' || !next.toolResults?.length) {
151
+ if (msg.content) {
152
+ result.push({ ...msg, toolCalls: undefined });
153
+ }
154
+ continue;
155
+ }
156
+ const toolCallIds = new Set(msg.toolCalls.map((tc) => tc.id));
157
+ const resultIds = new Set(next.toolResults.map((tr) => tr.id));
158
+ const allMatched = [...toolCallIds].every((id) => resultIds.has(id));
159
+ if (!allMatched) {
160
+ if (msg.content) {
161
+ result.push({ ...msg, toolCalls: undefined });
162
+ }
163
+ result.push({
164
+ ...next,
165
+ toolResults: next.toolResults.filter((tr) => !toolCallIds.has(tr.id)) ||
166
+ undefined,
167
+ });
168
+ i++;
169
+ continue;
170
+ }
171
+ }
172
+ result.push(msg);
173
+ }
174
+ return result.filter((m) => m.role !== 'tool' || (m.toolResults && m.toolResults.length > 0));
175
+ }
176
+ function estimateTokens(msg) {
177
+ let chars = 0;
178
+ if (msg.content)
179
+ chars += msg.content.length;
180
+ if (msg.toolCalls)
181
+ chars += JSON.stringify(msg.toolCalls).length;
182
+ if (msg.toolResults)
183
+ chars += JSON.stringify(msg.toolResults).length;
184
+ return Math.ceil(chars / 4);
185
+ }
186
+ export function parseWorkingMemory(text) {
187
+ const match = text.match(/<working_memory>([\s\S]*?)<\/working_memory>/);
188
+ if (!match)
189
+ return null;
190
+ try {
191
+ return JSON.parse(match[1].trim());
192
+ }
193
+ catch {
194
+ return null;
195
+ }
196
+ }
197
+ export function stripWorkingMemoryTags(text) {
198
+ return text.replace(/<working_memory>[\s\S]*?<\/working_memory>/g, '').trim();
199
+ }
@@ -0,0 +1,9 @@
1
+ export declare function resolveModelConfig(agentName: string, agent: {
2
+ model: string;
3
+ temperature?: number;
4
+ maxSteps?: number;
5
+ }): {
6
+ model: string;
7
+ temperature?: number;
8
+ maxSteps?: number;
9
+ };
@@ -0,0 +1,36 @@
1
+ import { pikkuState } from '../../pikku-state.js';
2
+ export function resolveModelConfig(agentName, agent) {
3
+ let config = {};
4
+ try {
5
+ config = pikkuState(null, 'models', 'config') ?? {};
6
+ }
7
+ catch { }
8
+ const models = config.models ?? {};
9
+ const defaults = config.agentDefaults;
10
+ const agentOverride = config.agentOverrides?.[agentName];
11
+ let rawModel = agentOverride?.model ?? agent.model;
12
+ let aliasTemperature;
13
+ let aliasMaxSteps;
14
+ if (!rawModel.includes('/')) {
15
+ const entry = models[rawModel];
16
+ if (!entry)
17
+ throw new Error(`Unknown model alias '${rawModel}'.`);
18
+ if (typeof entry === 'string') {
19
+ rawModel = entry;
20
+ }
21
+ else {
22
+ rawModel = entry.model;
23
+ aliasTemperature = entry.temperature;
24
+ aliasMaxSteps = entry.maxSteps;
25
+ }
26
+ }
27
+ const temperature = agentOverride?.temperature ??
28
+ aliasTemperature ??
29
+ defaults?.temperature ??
30
+ agent.temperature;
31
+ const maxSteps = agentOverride?.maxSteps ??
32
+ aliasMaxSteps ??
33
+ defaults?.maxSteps ??
34
+ agent.maxSteps;
35
+ return { model: rawModel, temperature, maxSteps };
36
+ }
@@ -0,0 +1,60 @@
1
+ import { type CoreSingletonServices, type CoreServices, type CoreUserSession, type CreateWireServices } from '../../types/core.types.js';
2
+ import type { CoreAIAgent, AIAgentInput, AIAgentToolDef, AIMessage, AIStreamChannel } from './ai-agent.types.js';
3
+ import type { AIAgentRunnerParams } from '../../services/ai-agent-runner-service.js';
4
+ import { PikkuError } from '../../errors/error-handler.js';
5
+ import type { SessionService } from '../../services/user-session-service.js';
6
+ export type RunAIAgentParams = {
7
+ singletonServices: CoreSingletonServices;
8
+ sessionService?: SessionService<CoreUserSession>;
9
+ createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
10
+ };
11
+ export type StreamAIAgentOptions = {
12
+ requiresToolApproval?: 'all' | 'explicit' | false;
13
+ };
14
+ export declare class ToolApprovalRequired extends PikkuError {
15
+ readonly toolCallId: string;
16
+ readonly toolName: string;
17
+ readonly args: unknown;
18
+ readonly reason?: string;
19
+ readonly displayToolName?: string;
20
+ readonly displayArgs?: unknown;
21
+ readonly agentRunId?: string;
22
+ constructor(toolCallId: string, toolName: string, args: unknown, reason?: string, displayToolName?: string, displayArgs?: unknown, agentRunId?: string);
23
+ }
24
+ export type StreamContext = {
25
+ channel: AIStreamChannel;
26
+ options?: StreamAIAgentOptions;
27
+ };
28
+ export declare const resolveAgent: (agentName: string) => {
29
+ agent: CoreAIAgent;
30
+ packageName: string | null;
31
+ resolvedName: string;
32
+ };
33
+ export declare function buildInstructions(agentName: string, packageName: string | null): string;
34
+ export type ScopedChannel = AIStreamChannel & {
35
+ approval: {
36
+ toolCallId: string;
37
+ toolName: string;
38
+ args: unknown;
39
+ runId: string;
40
+ } | null;
41
+ };
42
+ export declare function createScopedChannel(parent: AIStreamChannel, agentName: string, session: string): ScopedChannel;
43
+ export declare function buildToolDefs(singletonServices: CoreSingletonServices, params: RunAIAgentParams, agentSessionMap: Map<string, string>, resourceId: string, agentName: string, packageName: string | null, streamContext?: StreamContext): {
44
+ tools: AIAgentToolDef[];
45
+ missingRpcs: string[];
46
+ };
47
+ export declare function prepareAgentRun(agentName: string, input: AIAgentInput, params: RunAIAgentParams, agentSessionMap: Map<string, string>, streamContext?: StreamContext): Promise<{
48
+ agent: CoreAIAgent;
49
+ packageName: string | null;
50
+ resolvedName: string;
51
+ agentRunner: import("../../services/ai-agent-runner-service.js").AIAgentRunnerService;
52
+ storage: import("../../services/ai-storage-service.js").AIStorageService | undefined;
53
+ memoryConfig: import("./ai-agent.types.js").AIAgentMemoryConfig | undefined;
54
+ threadId: string;
55
+ userMessage: AIMessage;
56
+ runnerParams: AIAgentRunnerParams;
57
+ missingRpcs: string[];
58
+ workingMemoryJsonSchema: any;
59
+ workingMemorySchemaName: string | null;
60
+ }>;
@@ -0,0 +1,312 @@
1
+ import { PikkuError } from '../../errors/error-handler.js';
2
+ import { pikkuState } from '../../pikku-state.js';
3
+ import { runPikkuFunc } from '../../function/function-runner.js';
4
+ import { createMiddlewareSessionWireProps } from '../../services/user-session-service.js';
5
+ import { randomUUID } from 'crypto';
6
+ import { resolveMemoryServices, loadContextMessages, trimMessages, } from './ai-agent-memory.js';
7
+ import { resolveModelConfig } from './ai-agent-model-config.js';
8
+ export class ToolApprovalRequired extends PikkuError {
9
+ toolCallId;
10
+ toolName;
11
+ args;
12
+ reason;
13
+ displayToolName;
14
+ displayArgs;
15
+ agentRunId;
16
+ constructor(toolCallId, toolName, args, reason, displayToolName, displayArgs, agentRunId) {
17
+ super(`Tool '${displayToolName ?? toolName}' requires approval`);
18
+ this.toolCallId = toolCallId;
19
+ this.toolName = toolName;
20
+ this.args = args;
21
+ this.reason = reason;
22
+ this.displayToolName = displayToolName;
23
+ this.displayArgs = displayArgs;
24
+ this.agentRunId = agentRunId;
25
+ }
26
+ }
27
+ export const resolveAgent = (agentName) => {
28
+ const mainAgent = pikkuState(null, 'agent', 'agents').get(agentName);
29
+ if (mainAgent) {
30
+ return { agent: mainAgent, packageName: null, resolvedName: agentName };
31
+ }
32
+ const colonIndex = agentName.indexOf(':');
33
+ if (colonIndex !== -1) {
34
+ const namespace = agentName.substring(0, colonIndex);
35
+ const localName = agentName.substring(colonIndex + 1);
36
+ const externalPackages = pikkuState(null, 'rpc', 'externalPackages');
37
+ const pkgConfig = externalPackages.get(namespace);
38
+ if (pkgConfig) {
39
+ const extAgent = pikkuState(pkgConfig.package, 'agent', 'agents').get(localName);
40
+ if (extAgent) {
41
+ return {
42
+ agent: extAgent,
43
+ packageName: pkgConfig.package,
44
+ resolvedName: localName,
45
+ };
46
+ }
47
+ }
48
+ }
49
+ throw new Error(`AI agent not found: ${agentName}`);
50
+ };
51
+ export function buildInstructions(agentName, packageName) {
52
+ const meta = pikkuState(packageName, 'agent', 'agentsMeta')[agentName];
53
+ const instructions = meta?.instructions ?? '';
54
+ const baseInstructions = Array.isArray(instructions)
55
+ ? instructions.join('\n')
56
+ : instructions;
57
+ return meta?.agents?.length
58
+ ? baseInstructions +
59
+ '\n\nWhen calling a sub-agent, provide a short session name that describes the task. ' +
60
+ 'Use the same session name to continue a previous conversation with that agent. ' +
61
+ 'Use a new session name for a new independent task.'
62
+ : baseInstructions;
63
+ }
64
+ export function createScopedChannel(parent, agentName, session) {
65
+ let capturedApproval = null;
66
+ return {
67
+ channelId: `${parent.channelId}:${agentName}:${session}`,
68
+ openingData: parent.openingData,
69
+ get state() {
70
+ return parent.state;
71
+ },
72
+ get approval() {
73
+ return capturedApproval;
74
+ },
75
+ close: () => { },
76
+ send: (event) => {
77
+ if (event.type === 'done')
78
+ return;
79
+ if (event.type === 'approval-request') {
80
+ capturedApproval = {
81
+ toolCallId: event.toolCallId,
82
+ toolName: event.toolName,
83
+ args: event.args,
84
+ runId: event.runId,
85
+ };
86
+ return;
87
+ }
88
+ if (event.type === 'text-delta' ||
89
+ event.type === 'reasoning-delta' ||
90
+ event.type === 'tool-call' ||
91
+ event.type === 'tool-result' ||
92
+ event.type === 'usage' ||
93
+ event.type === 'error') {
94
+ parent.send({ ...event, agent: agentName, session });
95
+ }
96
+ else {
97
+ parent.send(event);
98
+ }
99
+ },
100
+ };
101
+ }
102
+ export function buildToolDefs(singletonServices, params, agentSessionMap, resourceId, agentName, packageName, streamContext) {
103
+ const tools = [];
104
+ const missingRpcs = [];
105
+ const approvalPolicy = streamContext?.options?.requiresToolApproval ?? 'explicit';
106
+ const meta = pikkuState(packageName, 'agent', 'agentsMeta')[agentName];
107
+ if (!meta)
108
+ return { tools, missingRpcs };
109
+ const metaTools = meta.tools;
110
+ const metaAgents = meta.agents;
111
+ if (metaTools?.length) {
112
+ const functionMeta = pikkuState(null, 'function', 'meta');
113
+ const schemas = pikkuState(null, 'misc', 'schemas');
114
+ for (const toolName of metaTools) {
115
+ const rpcMeta = pikkuState(null, 'rpc', 'meta');
116
+ const pikkuFuncId = rpcMeta[toolName];
117
+ if (!pikkuFuncId) {
118
+ missingRpcs.push(toolName);
119
+ continue;
120
+ }
121
+ const fnMeta = functionMeta[pikkuFuncId];
122
+ const inputSchemaName = fnMeta?.inputSchemaName;
123
+ let inputSchema = inputSchemaName
124
+ ? schemas.get(inputSchemaName)
125
+ : undefined;
126
+ if (!inputSchema ||
127
+ (typeof inputSchema === 'object' &&
128
+ inputSchema.type === 'object' &&
129
+ !inputSchema.properties)) {
130
+ inputSchema = { type: 'object', properties: {} };
131
+ }
132
+ const needsApproval = approvalPolicy === 'all' ||
133
+ (approvalPolicy === 'explicit' && fnMeta?.requiresApproval);
134
+ if (needsApproval) {
135
+ inputSchema = {
136
+ ...inputSchema,
137
+ properties: {
138
+ ...(inputSchema.properties || {}),
139
+ toolApprovalReason: {
140
+ type: 'string',
141
+ description: 'Brief explanation of why this action is needed',
142
+ },
143
+ },
144
+ };
145
+ }
146
+ tools.push({
147
+ name: pikkuFuncId,
148
+ description: fnMeta?.description || fnMeta?.title || toolName,
149
+ inputSchema,
150
+ execute: async (toolInput) => {
151
+ if (needsApproval) {
152
+ const { toolApprovalReason, ...cleanArgs } = toolInput;
153
+ return {
154
+ __approvalRequired: true,
155
+ toolName: pikkuFuncId,
156
+ args: cleanArgs,
157
+ reason: toolApprovalReason,
158
+ };
159
+ }
160
+ const wire = params.sessionService
161
+ ? { ...createMiddlewareSessionWireProps(params.sessionService) }
162
+ : {};
163
+ return runPikkuFunc('agent', `tool:${pikkuFuncId}`, pikkuFuncId, {
164
+ singletonServices,
165
+ createWireServices: params.createWireServices,
166
+ data: () => toolInput,
167
+ wire,
168
+ sessionService: params.sessionService,
169
+ });
170
+ },
171
+ });
172
+ }
173
+ }
174
+ if (metaAgents?.length) {
175
+ const allAgentsMeta = pikkuState(null, 'agent', 'agentsMeta');
176
+ for (const subAgentName of metaAgents) {
177
+ const subMeta = allAgentsMeta[subAgentName];
178
+ if (!subMeta) {
179
+ singletonServices.logger.warn(`Sub-agent '${subAgentName}' not found in agent registry`);
180
+ continue;
181
+ }
182
+ tools.push({
183
+ name: subAgentName,
184
+ description: subMeta.description,
185
+ inputSchema: {
186
+ type: 'object',
187
+ properties: {
188
+ message: { type: 'string' },
189
+ session: {
190
+ type: 'string',
191
+ description: 'Short session label for thread continuity',
192
+ },
193
+ },
194
+ required: ['message', 'session'],
195
+ },
196
+ execute: async (toolInput) => {
197
+ const { message, session } = toolInput;
198
+ const sessionKey = `${subAgentName}::${session}`;
199
+ let threadId = agentSessionMap.get(sessionKey);
200
+ if (!threadId) {
201
+ threadId = `${subAgentName}-${session}-${Date.now()}`;
202
+ agentSessionMap.set(sessionKey, threadId);
203
+ }
204
+ if (streamContext) {
205
+ const { streamAIAgent } = await import('./ai-agent-stream.js');
206
+ const { channel } = streamContext;
207
+ channel.send({
208
+ type: 'agent-call',
209
+ agentName: subAgentName,
210
+ session,
211
+ input: message,
212
+ });
213
+ const subChannel = createScopedChannel(channel, subAgentName, session);
214
+ await streamAIAgent(subAgentName, { message, threadId, resourceId }, subChannel, params, agentSessionMap, streamContext.options);
215
+ if (subChannel.approval) {
216
+ return {
217
+ __approvalRequired: true,
218
+ toolName: subAgentName,
219
+ args: toolInput,
220
+ displayToolName: subChannel.approval.toolName,
221
+ displayArgs: subChannel.approval.args,
222
+ agentRunId: subChannel.approval.runId,
223
+ };
224
+ }
225
+ channel.send({
226
+ type: 'agent-result',
227
+ agentName: subAgentName,
228
+ session,
229
+ result: null,
230
+ });
231
+ return null;
232
+ }
233
+ const { runAIAgent } = await import('./ai-agent-runner.js');
234
+ const result = await runAIAgent(subAgentName, { message, threadId, resourceId }, params, agentSessionMap);
235
+ return result.object ?? result.text;
236
+ },
237
+ });
238
+ }
239
+ }
240
+ return { tools, missingRpcs };
241
+ }
242
+ export async function prepareAgentRun(agentName, input, params, agentSessionMap, streamContext) {
243
+ const { singletonServices } = params;
244
+ const { agent, packageName, resolvedName } = resolveAgent(agentName);
245
+ const agentRunner = singletonServices.aiAgentRunner;
246
+ if (!agentRunner) {
247
+ throw new Error('AIAgentRunnerService not available in singletonServices');
248
+ }
249
+ const { storage } = resolveMemoryServices(agent, singletonServices);
250
+ const memoryConfig = agent.memory;
251
+ const threadId = input.threadId;
252
+ const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta');
253
+ const meta = agentsMeta[resolvedName];
254
+ const outputSchemaName = meta?.outputSchema;
255
+ const outputSchema = outputSchemaName
256
+ ? pikkuState(packageName, 'misc', 'schemas').get(outputSchemaName)
257
+ : undefined;
258
+ const workingMemorySchemaName = meta?.workingMemorySchema ?? null;
259
+ const workingMemoryJsonSchema = workingMemorySchemaName
260
+ ? pikkuState(packageName, 'misc', 'schemas').get(workingMemorySchemaName)
261
+ : undefined;
262
+ if (storage) {
263
+ try {
264
+ await storage.getThread(threadId);
265
+ }
266
+ catch {
267
+ await storage.createThread(input.resourceId, { threadId });
268
+ }
269
+ }
270
+ let messages = [];
271
+ if (storage) {
272
+ messages = await storage.getMessages(threadId, {
273
+ lastN: memoryConfig?.lastMessages ?? 20,
274
+ });
275
+ }
276
+ const contextMessages = await loadContextMessages(memoryConfig, storage, input, workingMemoryJsonSchema);
277
+ const userMessage = {
278
+ id: randomUUID(),
279
+ role: 'user',
280
+ content: input.message,
281
+ createdAt: new Date(),
282
+ };
283
+ const allMessages = [...contextMessages, ...messages, userMessage];
284
+ const trimmedMessages = trimMessages(allMessages);
285
+ const { tools, missingRpcs } = buildToolDefs(singletonServices, params, agentSessionMap, input.resourceId, resolvedName, packageName, streamContext);
286
+ const instructions = buildInstructions(resolvedName, packageName);
287
+ const resolved = resolveModelConfig(resolvedName, agent);
288
+ const runnerParams = {
289
+ model: resolved.model,
290
+ temperature: resolved.temperature,
291
+ instructions,
292
+ messages: trimmedMessages,
293
+ tools,
294
+ maxSteps: resolved.maxSteps ?? 10,
295
+ toolChoice: agent.toolChoice ?? 'auto',
296
+ outputSchema,
297
+ };
298
+ return {
299
+ agent,
300
+ packageName,
301
+ resolvedName,
302
+ agentRunner,
303
+ storage,
304
+ memoryConfig,
305
+ threadId,
306
+ userMessage,
307
+ runnerParams,
308
+ missingRpcs,
309
+ workingMemoryJsonSchema,
310
+ workingMemorySchemaName,
311
+ };
312
+ }