@pikku/core 0.12.83 → 0.12.84

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 (343) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +1 -1
  3. package/dist/ecosystem/agent-scorer.d.ts +12 -0
  4. package/dist/ecosystem/agent-scorer.js +5 -0
  5. package/dist/ecosystem/agent.d.ts +18 -0
  6. package/dist/ecosystem/agent.js +6 -0
  7. package/dist/ecosystem/ai-agent.d.ts +18 -0
  8. package/dist/ecosystem/ai-agent.js +6 -0
  9. package/dist/ecosystem/ai-scorer.d.ts +12 -0
  10. package/dist/ecosystem/ai-scorer.js +5 -0
  11. package/dist/ecosystem/channel/local.d.ts +1 -0
  12. package/dist/ecosystem/channel/local.js +1 -0
  13. package/dist/ecosystem/channel.d.ts +12 -0
  14. package/dist/ecosystem/channel.js +4 -0
  15. package/dist/ecosystem/cli/channel.d.ts +16 -0
  16. package/dist/ecosystem/cli/channel.js +2 -0
  17. package/dist/ecosystem/cli.d.ts +9 -0
  18. package/dist/ecosystem/cli.js +2 -0
  19. package/dist/ecosystem/credential.d.ts +9 -0
  20. package/dist/ecosystem/credential.js +1 -0
  21. package/dist/ecosystem/dev.d.ts +8 -0
  22. package/dist/ecosystem/dev.js +1 -0
  23. package/dist/ecosystem/function.d.ts +13 -0
  24. package/dist/ecosystem/function.js +2 -0
  25. package/dist/ecosystem/gateway.d.ts +1 -0
  26. package/dist/ecosystem/gateway.js +1 -0
  27. package/dist/ecosystem/hmac.d.ts +1 -0
  28. package/dist/ecosystem/hmac.js +1 -0
  29. package/dist/ecosystem/http.d.ts +11 -0
  30. package/dist/ecosystem/http.js +3 -0
  31. package/dist/ecosystem/mcp.d.ts +3 -0
  32. package/dist/ecosystem/mcp.js +2 -0
  33. package/dist/ecosystem/middleware.d.ts +17 -0
  34. package/dist/ecosystem/middleware.js +6 -0
  35. package/dist/ecosystem/node-host-resolver.d.ts +1 -0
  36. package/dist/ecosystem/node-host-resolver.js +1 -0
  37. package/dist/ecosystem/node.d.ts +1 -0
  38. package/dist/ecosystem/node.js +1 -0
  39. package/dist/ecosystem/oauth2.d.ts +1 -0
  40. package/dist/ecosystem/oauth2.js +1 -0
  41. package/dist/ecosystem/persona.d.ts +15 -0
  42. package/dist/ecosystem/persona.js +4 -0
  43. package/dist/ecosystem/queue.d.ts +11 -0
  44. package/dist/ecosystem/queue.js +2 -0
  45. package/dist/ecosystem/remote.d.ts +8 -0
  46. package/dist/ecosystem/remote.js +1 -0
  47. package/dist/ecosystem/role.d.ts +3 -0
  48. package/dist/ecosystem/role.js +2 -0
  49. package/dist/ecosystem/rpc.d.ts +4 -0
  50. package/dist/ecosystem/rpc.js +2 -0
  51. package/dist/ecosystem/safe-fetch.d.ts +7 -0
  52. package/dist/ecosystem/safe-fetch.js +1 -0
  53. package/dist/ecosystem/scenario.d.ts +15 -0
  54. package/dist/ecosystem/scenario.js +4 -0
  55. package/dist/ecosystem/scheduler.d.ts +2 -0
  56. package/dist/ecosystem/scheduler.js +1 -0
  57. package/dist/ecosystem/schema.d.ts +1 -0
  58. package/dist/ecosystem/schema.js +1 -0
  59. package/dist/ecosystem/scope.d.ts +3 -0
  60. package/dist/ecosystem/scope.js +2 -0
  61. package/dist/ecosystem/secret.d.ts +9 -0
  62. package/dist/ecosystem/secret.js +1 -0
  63. package/dist/ecosystem/services/istanbul-coverage.d.ts +1 -0
  64. package/dist/ecosystem/services/istanbul-coverage.js +1 -0
  65. package/dist/ecosystem/services/local-content-request-handler.d.ts +9 -0
  66. package/dist/ecosystem/services/local-content-request-handler.js +1 -0
  67. package/dist/ecosystem/services/local-content.d.ts +1 -0
  68. package/dist/ecosystem/services/local-content.js +1 -0
  69. package/dist/ecosystem/services/v8-coverage.d.ts +1 -0
  70. package/dist/ecosystem/services/v8-coverage.js +1 -0
  71. package/dist/ecosystem/services.d.ts +28 -0
  72. package/dist/ecosystem/services.js +6 -0
  73. package/dist/ecosystem/testing.d.ts +7 -0
  74. package/dist/ecosystem/testing.js +1 -0
  75. package/dist/ecosystem/trigger.d.ts +1 -0
  76. package/dist/ecosystem/trigger.js +1 -0
  77. package/dist/ecosystem/types.d.ts +9 -0
  78. package/dist/ecosystem/types.js +5 -0
  79. package/dist/ecosystem/variable.d.ts +8 -0
  80. package/dist/ecosystem/variable.js +1 -0
  81. package/dist/ecosystem/virtual-user.d.ts +21 -0
  82. package/dist/ecosystem/virtual-user.js +5 -0
  83. package/dist/ecosystem/workflow.d.ts +18 -0
  84. package/dist/ecosystem/workflow.js +4 -0
  85. package/dist/index.d.ts +8 -8
  86. package/dist/index.js +3 -3
  87. package/dist/middleware/auth-apikey.d.ts +1 -1
  88. package/dist/middleware/auth-bearer.d.ts +1 -1
  89. package/dist/middleware/auth-cookie.d.ts +1 -1
  90. package/dist/middleware/cors.d.ts +1 -1
  91. package/dist/middleware/remote-auth.d.ts +1 -1
  92. package/dist/middleware/telemetry.d.ts +2 -2
  93. package/dist/services/agent-run-state-service.d.ts +29 -0
  94. package/dist/services/agent-run-state-service.js +1 -0
  95. package/dist/services/agent-runner-service.d.ts +220 -0
  96. package/dist/services/agent-runner-service.js +1 -0
  97. package/dist/services/agent-storage-service.d.ts +18 -0
  98. package/dist/services/agent-storage-service.js +1 -0
  99. package/dist/services/http-personas.d.ts +1 -1
  100. package/dist/services/http-personas.js +3 -3
  101. package/dist/services/in-memory-agent-run-state-service.d.ts +19 -0
  102. package/dist/services/in-memory-agent-run-state-service.js +54 -0
  103. package/dist/services/index.d.ts +4 -4
  104. package/dist/services/index.js +1 -1
  105. package/dist/services/meta-service.d.ts +3 -3
  106. package/dist/testing/service-tests/agent-run-service-tests.d.ts +1 -1
  107. package/dist/testing/service-tests/agent-run-service-tests.js +3 -3
  108. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +3 -0
  109. package/dist/testing/service-tests/agent-storage-service-tests.js +302 -0
  110. package/dist/testing/service-tests.d.ts +4 -4
  111. package/dist/testing/service-tests.js +4 -4
  112. package/dist/types/core.types.d.ts +10 -10
  113. package/dist/types/core.types.js +1 -1
  114. package/dist/types/state.types.d.ts +5 -5
  115. package/dist/wirings/actor-flow/run-conversation.d.ts +2 -2
  116. package/dist/wirings/agent/agent-agui.d.ts +79 -0
  117. package/dist/wirings/agent/agent-agui.js +327 -0
  118. package/dist/wirings/agent/agent-finalize.d.ts +58 -0
  119. package/dist/wirings/agent/agent-finalize.js +138 -0
  120. package/dist/wirings/agent/agent-helpers.d.ts +35 -0
  121. package/dist/wirings/agent/agent-helpers.js +47 -0
  122. package/dist/wirings/agent/agent-interrupt.d.ts +153 -0
  123. package/dist/wirings/agent/agent-interrupt.js +257 -0
  124. package/dist/wirings/agent/agent-memory.d.ts +42 -0
  125. package/dist/wirings/agent/agent-memory.js +333 -0
  126. package/dist/wirings/agent/agent-model-config.d.ts +16 -0
  127. package/dist/wirings/agent/agent-model-config.js +51 -0
  128. package/dist/wirings/agent/agent-prepare.d.ts +117 -0
  129. package/dist/wirings/agent/agent-prepare.js +728 -0
  130. package/dist/wirings/agent/agent-registry.d.ts +16 -0
  131. package/dist/wirings/agent/agent-registry.js +51 -0
  132. package/dist/wirings/agent/agent-rpc.d.ts +15 -0
  133. package/dist/wirings/agent/agent-rpc.js +53 -0
  134. package/dist/wirings/agent/agent-runner.d.ts +7 -0
  135. package/dist/wirings/agent/agent-runner.js +580 -0
  136. package/dist/wirings/agent/agent-stream.d.ts +41 -0
  137. package/dist/wirings/agent/agent-stream.js +1029 -0
  138. package/dist/wirings/agent/agent-turn.d.ts +57 -0
  139. package/dist/wirings/agent/agent-turn.js +82 -0
  140. package/dist/wirings/agent/agent-utils.d.ts +1 -0
  141. package/dist/wirings/agent/agent-utils.js +1 -0
  142. package/dist/wirings/agent/agent.types.d.ts +625 -0
  143. package/dist/wirings/agent/agent.types.js +1 -0
  144. package/dist/wirings/agent/index.d.ts +12 -0
  145. package/dist/wirings/agent/index.js +10 -0
  146. package/dist/wirings/agent/voice-input.d.ts +69 -0
  147. package/dist/wirings/agent/voice-input.js +150 -0
  148. package/dist/wirings/agent/voice-output.d.ts +85 -0
  149. package/dist/wirings/agent/voice-output.js +196 -0
  150. package/dist/wirings/agent-scorer/agent-scorer-grade.d.ts +26 -0
  151. package/dist/wirings/agent-scorer/agent-scorer-grade.js +33 -0
  152. package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +17 -0
  153. package/dist/wirings/agent-scorer/agent-scorer-judge.js +92 -0
  154. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +15 -0
  155. package/dist/wirings/agent-scorer/agent-scorer-live.js +38 -0
  156. package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +18 -0
  157. package/dist/wirings/agent-scorer/agent-scorer-registry.js +46 -0
  158. package/dist/wirings/agent-scorer/agent-scorer-sampling.d.ts +8 -0
  159. package/dist/wirings/agent-scorer/agent-scorer-sampling.js +31 -0
  160. package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +10 -0
  161. package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +40 -0
  162. package/dist/wirings/agent-scorer/agent-scorer-worker.d.ts +15 -0
  163. package/dist/wirings/agent-scorer/agent-scorer-worker.js +60 -0
  164. package/dist/wirings/agent-scorer/agent-scorer.d.ts +39 -0
  165. package/dist/wirings/agent-scorer/agent-scorer.js +40 -0
  166. package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +90 -0
  167. package/dist/wirings/agent-scorer/agent-scorer.types.js +4 -0
  168. package/dist/wirings/agent-scorer/index.d.ts +6 -0
  169. package/dist/wirings/agent-scorer/index.js +5 -0
  170. package/dist/wirings/ai-agent/voice-output.d.ts +1 -2
  171. package/dist/wirings/channel/channel-rpc.types.d.ts +2 -2
  172. package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
  173. package/dist/wirings/rpc/rpc-runner.js +2 -2
  174. package/dist/wirings/rpc/rpc-types.d.ts +1 -1
  175. package/dist/wirings/virtual-user/prepare-virtual-user-run.js +1 -1
  176. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +1 -1
  177. package/dist/wirings/workflow/run-timeline.d.ts +1 -2
  178. package/knowledge/decisions/internals/{a-non-streaming-agent-run-registers-with-airunstate-too.md → a-non-streaming-agent-run-registers-with-agentrunstate-too.md} +6 -6
  179. package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +1 -1
  180. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +1 -1
  181. package/knowledge/decisions/internals/{ai-agent-agui-bridge-obeys-the-client-ordering-contract.md → agent-agui-bridge-obeys-the-client-ordering-contract.md} +5 -5
  182. package/knowledge/decisions/internals/{ai-agent-audio-chunks-carry-the-format-the-provider-returned.md → agent-audio-chunks-carry-the-format-the-provider-returned.md} +2 -2
  183. package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +1 -1
  184. package/knowledge/decisions/internals/{ai-agent-credential-suspensions-hide-the-tool-result.md → agent-credential-suspensions-hide-the-tool-result.md} +2 -2
  185. package/knowledge/decisions/internals/{ai-agent-delegate-and-supervise-hide-different-text.md → agent-delegate-and-supervise-hide-different-text.md} +4 -4
  186. package/knowledge/decisions/internals/{ai-agent-llm-tool-arguments-have-nulls-stripped.md → agent-llm-tool-arguments-have-nulls-stripped.md} +3 -3
  187. package/knowledge/decisions/internals/{ai-agent-model-config-stays-a-single-resolution-seam.md → agent-model-config-stays-a-single-resolution-seam.md} +3 -3
  188. package/knowledge/decisions/internals/{ai-agent-onerror-hooks-cannot-change-the-failure.md → agent-onerror-hooks-cannot-change-the-failure.md} +6 -6
  189. package/knowledge/decisions/internals/{ai-agent-runner-methods-must-keep-their-receiver.md → agent-runner-methods-must-keep-their-receiver.md} +4 -4
  190. package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +1 -1
  191. package/knowledge/decisions/internals/{ai-agent-stream-persistence-is-best-effort.md → agent-stream-persistence-is-best-effort.md} +4 -4
  192. package/knowledge/decisions/internals/{ai-agent-sub-agents-inherit-the-parent-context-block.md → agent-sub-agents-inherit-the-parent-context-block.md} +3 -3
  193. package/knowledge/decisions/internals/{ai-agent-tool-execute-failures-are-logged-unconditionally.md → agent-tool-execute-failures-are-logged-unconditionally.md} +3 -3
  194. package/knowledge/decisions/internals/{ai-agent-voice-input-transcribes-audio-parts-in-place.md → agent-voice-input-transcribes-audio-parts-in-place.md} +2 -2
  195. package/knowledge/decisions/internals/{ai-agent-working-memory-is-persisted-only-when-valid.md → agent-working-memory-is-persisted-only-when-valid.md} +2 -2
  196. package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +2 -2
  197. package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +3 -3
  198. package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +2 -2
  199. package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +1 -1
  200. package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +1 -1
  201. package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +1 -1
  202. package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +1 -1
  203. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +1 -1
  204. package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +5 -5
  205. package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +2 -2
  206. package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +2 -2
  207. package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +1 -1
  208. package/knowledge/decisions/security/{ai-agent-approval-forwarding-requires-a-symbol-brand.md → agent-approval-forwarding-requires-a-symbol-brand.md} +3 -3
  209. package/knowledge/decisions/security/{ai-agent-credential-requests-are-symbol-branded.md → agent-credential-requests-are-symbol-branded.md} +4 -4
  210. package/knowledge/decisions/security/{ai-agent-gate-requires-a-session-only-when-auth-is-true.md → agent-gate-requires-a-session-only-when-auth-is-true.md} +3 -3
  211. package/knowledge/decisions/security/{ai-agent-ownership-failures-never-echo-the-resource.md → agent-ownership-failures-never-echo-the-resource.md} +2 -2
  212. package/knowledge/decisions/security/{ai-agent-resume-re-runs-the-authorization-gate.md → agent-resume-re-runs-the-authorization-gate.md} +4 -4
  213. package/knowledge/decisions/security/{ai-agent-sessionless-deployments-have-no-thread-ownership.md → agent-sessionless-deployments-have-no-thread-ownership.md} +5 -5
  214. package/knowledge/decisions/security/{ai-agent-thread-ownership-composes-the-session-principal.md → agent-thread-ownership-composes-the-session-principal.md} +2 -2
  215. package/knowledge/decisions/security/{ai-agent-tool-filtering-reads-the-live-function-config.md → agent-tool-filtering-reads-the-live-function-config.md} +2 -2
  216. package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +3 -3
  217. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +3 -3
  218. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +20 -13
  219. package/knowledge/decisions/security/index.md +1 -2
  220. package/package.json +4 -3
  221. package/scripts/generate-api-report.mts +32 -8
  222. package/src/agent-naming.test.ts +68 -0
  223. package/src/ecosystem/agent-scorer.ts +24 -0
  224. package/src/ecosystem/agent.ts +42 -0
  225. package/src/ecosystem/channel/local.ts +1 -0
  226. package/src/ecosystem/channel.ts +22 -0
  227. package/src/ecosystem/cli/channel.ts +25 -0
  228. package/src/ecosystem/cli.ts +21 -0
  229. package/src/ecosystem/credential.ts +10 -0
  230. package/src/ecosystem/dev.ts +12 -0
  231. package/src/ecosystem/function.ts +28 -0
  232. package/src/ecosystem/gateway.ts +4 -0
  233. package/src/ecosystem/hmac.ts +1 -0
  234. package/src/ecosystem/http.ts +22 -0
  235. package/src/ecosystem/mcp.ts +17 -0
  236. package/src/ecosystem/middleware.ts +27 -0
  237. package/src/ecosystem/node-host-resolver.ts +1 -0
  238. package/src/ecosystem/node.ts +5 -0
  239. package/src/ecosystem/oauth2.ts +4 -0
  240. package/src/ecosystem/persona.ts +30 -0
  241. package/src/ecosystem/queue.ts +23 -0
  242. package/src/ecosystem/remote.ts +9 -0
  243. package/src/ecosystem/role.ts +13 -0
  244. package/src/ecosystem/rpc.ts +7 -0
  245. package/src/ecosystem/safe-fetch.ts +8 -0
  246. package/src/ecosystem/scenario.ts +32 -0
  247. package/src/ecosystem/scheduler.ts +5 -0
  248. package/src/ecosystem/schema.ts +1 -0
  249. package/src/ecosystem/scope.ts +14 -0
  250. package/src/ecosystem/secret.ts +15 -0
  251. package/src/ecosystem/services/istanbul-coverage.ts +1 -0
  252. package/src/ecosystem/services/local-content-request-handler.ts +16 -0
  253. package/src/ecosystem/services/local-content.ts +1 -0
  254. package/src/ecosystem/services/v8-coverage.ts +1 -0
  255. package/src/ecosystem/services.ts +82 -0
  256. package/src/ecosystem/testing.ts +8 -0
  257. package/src/ecosystem/trigger.ts +7 -0
  258. package/src/ecosystem/types.ts +34 -0
  259. package/src/ecosystem/variable.ts +14 -0
  260. package/src/ecosystem/virtual-user.ts +48 -0
  261. package/src/ecosystem/workflow.ts +68 -0
  262. package/src/index.ts +8 -19
  263. package/src/pikku-state.ts +3 -3
  264. package/src/public-surface.json +173 -68
  265. package/src/public-surface.json.README +20 -2
  266. package/src/public-surface.test.ts +31 -3
  267. package/src/services/{ai-run-state-service.ts → agent-run-state-service.ts} +5 -5
  268. package/src/services/{ai-agent-runner-service.ts → agent-runner-service.ts} +18 -18
  269. package/src/services/{ai-storage-service.ts → agent-storage-service.ts} +7 -7
  270. package/src/services/http-personas-converse.test.ts +3 -3
  271. package/src/services/http-personas.ts +4 -4
  272. package/src/services/{in-memory-ai-run-state-service.ts → in-memory-agent-run-state-service.ts} +7 -7
  273. package/src/services/index.ts +9 -9
  274. package/src/services/meta-service.ts +3 -3
  275. package/src/testing/service-tests/agent-run-service-tests.ts +4 -4
  276. package/src/testing/service-tests/{ai-storage-service-tests.ts → agent-storage-service-tests.ts} +8 -8
  277. package/src/testing/service-tests.ts +10 -8
  278. package/src/types/core.types.ts +12 -12
  279. package/src/types/state.types.ts +6 -9
  280. package/src/wirings/actor-flow/run-conversation.test.ts +2 -2
  281. package/src/wirings/actor-flow/run-conversation.ts +7 -9
  282. package/src/wirings/{ai-agent/ai-agent-agui.test.ts → agent/agent-agui.test.ts} +126 -105
  283. package/src/wirings/{ai-agent/ai-agent-agui.ts → agent/agent-agui.ts} +7 -7
  284. package/src/wirings/{ai-agent/ai-agent-authorization.test.ts → agent/agent-authorization.test.ts} +6 -6
  285. package/src/wirings/{ai-agent/ai-agent-finalize.test.ts → agent/agent-finalize.test.ts} +17 -16
  286. package/src/wirings/{ai-agent/ai-agent-finalize.ts → agent/agent-finalize.ts} +22 -22
  287. package/src/wirings/{ai-agent/ai-agent-helpers.test.ts → agent/agent-helpers.test.ts} +1 -1
  288. package/src/wirings/{ai-agent/ai-agent-helpers.ts → agent/agent-helpers.ts} +1 -1
  289. package/src/wirings/{ai-agent/ai-agent-interrupt.test.ts → agent/agent-interrupt.test.ts} +67 -77
  290. package/src/wirings/{ai-agent/ai-agent-interrupt.ts → agent/agent-interrupt.ts} +5 -5
  291. package/src/wirings/{ai-agent/ai-agent-memory.test.ts → agent/agent-memory.test.ts} +12 -12
  292. package/src/wirings/{ai-agent/ai-agent-memory.ts → agent/agent-memory.ts} +36 -36
  293. package/src/wirings/{ai-agent/ai-agent-model-config.test.ts → agent/agent-model-config.test.ts} +2 -5
  294. package/src/wirings/{ai-agent/ai-agent-model-config.ts → agent/agent-model-config.ts} +1 -1
  295. package/src/wirings/{ai-agent/ai-agent-prepare.test.ts → agent/agent-prepare.test.ts} +18 -18
  296. package/src/wirings/{ai-agent/ai-agent-prepare.ts → agent/agent-prepare.ts} +52 -51
  297. package/src/wirings/{ai-agent/ai-agent-registry.test.ts → agent/agent-registry.test.ts} +49 -43
  298. package/src/wirings/{ai-agent/ai-agent-registry.ts → agent/agent-registry.ts} +14 -14
  299. package/src/wirings/{ai-agent/ai-agent-resume-authorization.test.ts → agent/agent-resume-authorization.test.ts} +18 -18
  300. package/src/wirings/{ai-agent → agent}/agent-rpc.ts +16 -20
  301. package/src/wirings/{ai-agent/ai-agent-runner.test.ts → agent/agent-runner.test.ts} +105 -106
  302. package/src/wirings/{ai-agent/ai-agent-runner.ts → agent/agent-runner.ts} +90 -80
  303. package/src/wirings/{ai-agent/ai-agent-stream-output-hooks.test.ts → agent/agent-stream-output-hooks.test.ts} +25 -25
  304. package/src/wirings/{ai-agent/ai-agent-stream.test.ts → agent/agent-stream.test.ts} +147 -143
  305. package/src/wirings/{ai-agent/ai-agent-stream.ts → agent/agent-stream.ts} +147 -146
  306. package/src/wirings/{ai-agent/ai-agent-thread-ownership.test.ts → agent/agent-thread-ownership.test.ts} +24 -28
  307. package/src/wirings/{ai-agent/ai-agent-turn.test.ts → agent/agent-turn.test.ts} +3 -5
  308. package/src/wirings/{ai-agent/ai-agent-turn.ts → agent/agent-turn.ts} +7 -7
  309. package/src/wirings/{ai-agent/ai-agent.types.ts → agent/agent.types.ts} +51 -48
  310. package/src/wirings/agent/index.ts +56 -0
  311. package/src/wirings/{ai-agent → agent}/voice-input.test.ts +15 -15
  312. package/src/wirings/{ai-agent → agent}/voice-input.ts +11 -11
  313. package/src/wirings/{ai-agent → agent}/voice-output.test.ts +23 -23
  314. package/src/wirings/{ai-agent → agent}/voice-output.ts +11 -11
  315. package/src/wirings/{ai-scorer/ai-scorer-grade.test.ts → agent-scorer/agent-scorer-grade.test.ts} +8 -8
  316. package/src/wirings/{ai-scorer/ai-scorer-grade.ts → agent-scorer/agent-scorer-grade.ts} +9 -9
  317. package/src/wirings/{ai-scorer/ai-scorer-judge.test.ts → agent-scorer/agent-scorer-judge.test.ts} +11 -14
  318. package/src/wirings/{ai-scorer/ai-scorer-judge.ts → agent-scorer/agent-scorer-judge.ts} +11 -11
  319. package/src/wirings/{ai-scorer/ai-scorer-live.test.ts → agent-scorer/agent-scorer-live.test.ts} +11 -11
  320. package/src/wirings/{ai-scorer/ai-scorer-live.ts → agent-scorer/agent-scorer-live.ts} +3 -3
  321. package/src/wirings/{ai-scorer/ai-scorer-registry.ts → agent-scorer/agent-scorer-registry.ts} +11 -8
  322. package/src/wirings/{ai-scorer/ai-scorer-sampling.test.ts → agent-scorer/agent-scorer-sampling.test.ts} +1 -1
  323. package/src/wirings/{ai-scorer/ai-scorer-snapshots.test.ts → agent-scorer/agent-scorer-snapshots.test.ts} +2 -2
  324. package/src/wirings/{ai-scorer/ai-scorer-snapshots.ts → agent-scorer/agent-scorer-snapshots.ts} +1 -1
  325. package/src/wirings/{ai-scorer/ai-scorer-worker.test.ts → agent-scorer/agent-scorer-worker.test.ts} +15 -15
  326. package/src/wirings/{ai-scorer/ai-scorer-worker.ts → agent-scorer/agent-scorer-worker.ts} +9 -7
  327. package/src/wirings/{ai-scorer/ai-scorer.ts → agent-scorer/agent-scorer.ts} +7 -7
  328. package/src/wirings/{ai-scorer/ai-scorer.types.ts → agent-scorer/agent-scorer.types.ts} +6 -6
  329. package/src/wirings/agent-scorer/index.ts +22 -0
  330. package/src/wirings/channel/channel-rpc.types.ts +2 -2
  331. package/src/wirings/rpc/rpc-runner.ts +2 -2
  332. package/src/wirings/rpc/rpc-types.ts +1 -1
  333. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +1 -1
  334. package/src/wirings/virtual-user/run-virtual-user.test.ts +2 -2
  335. package/src/wirings/virtual-user/run-virtual-user.ts +3 -3
  336. package/src/wirings/virtual-user/virtual-user-agents.ts +1 -1
  337. package/src/wirings/workflow/run-timeline.ts +1 -1
  338. package/src/wirings-stay-decoupled.test.ts +3 -3
  339. package/tsconfig.tsbuildinfo +1 -1
  340. package/src/wirings/ai-agent/index.ts +0 -65
  341. package/src/wirings/ai-scorer/index.ts +0 -24
  342. /package/src/wirings/{ai-agent/ai-agent-utils.ts → agent/agent-utils.ts} +0 -0
  343. /package/src/wirings/{ai-scorer/ai-scorer-sampling.ts → agent-scorer/agent-scorer-sampling.ts} +0 -0
@@ -0,0 +1,54 @@
1
+ export class InMemoryAgentRunStateService {
2
+ runs = new Map();
3
+ scores = new Map();
4
+ counter = 0;
5
+ async createRun(run) {
6
+ const runId = `run-${++this.counter}-${Date.now()}`;
7
+ this.runs.set(runId, { ...run, runId });
8
+ return runId;
9
+ }
10
+ async updateRun(runId, updates) {
11
+ const run = this.runs.get(runId);
12
+ if (run) {
13
+ Object.assign(run, updates, { updatedAt: new Date() });
14
+ }
15
+ }
16
+ async getRun(runId) {
17
+ return this.runs.get(runId) ?? null;
18
+ }
19
+ async getRunsByThread(threadId) {
20
+ return [...this.runs.values()].filter((r) => r.threadId === threadId);
21
+ }
22
+ async resolveApproval(toolCallId, status) {
23
+ for (const run of this.runs.values()) {
24
+ if (run.pendingApprovals) {
25
+ const approval = run.pendingApprovals.find((a) => a.toolCallId === toolCallId);
26
+ if (approval) {
27
+ run.pendingApprovals = run.pendingApprovals.filter((a) => a.toolCallId !== toolCallId);
28
+ run.updatedAt = new Date();
29
+ return true;
30
+ }
31
+ }
32
+ }
33
+ return false;
34
+ }
35
+ async findRunByToolCallId(toolCallId) {
36
+ for (const run of this.runs.values()) {
37
+ if (run.pendingApprovals) {
38
+ const approval = run.pendingApprovals.find((a) => a.toolCallId === toolCallId);
39
+ if (approval) {
40
+ return { run, approval };
41
+ }
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ async saveScore(score) {
47
+ const existing = this.scores.get(score.runId) ?? [];
48
+ existing.push({ ...score, createdAt: new Date() });
49
+ this.scores.set(score.runId, existing);
50
+ }
51
+ async getScores(runId) {
52
+ return [...(this.scores.get(runId) ?? [])];
53
+ }
54
+ }
@@ -14,7 +14,7 @@ export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
14
14
  export { QueueWebhookService, pikkuWebhookWorkerFunc, } from './queue-webhook-service.js';
15
15
  export { InMemoryQueueService } from './in-memory-queue-service.js';
16
16
  export { InMemoryTriggerService } from './in-memory-trigger-service.js';
17
- export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
17
+ export { InMemoryAgentRunStateService } from './in-memory-agent-run-state-service.js';
18
18
  export { LocalGatewayService } from './local-gateway-service.js';
19
19
  export type { ContentService, SignContentKeyArgs, SignURLArgs, GetUploadURLArgs, UploadURLResult, BucketKeyArgs, WriteFileArgs, CopyFileArgs, } from './content-service.js';
20
20
  export type { ScenarioPersona, ResolvedPersona, ScenarioPersonas, } from './personas-service.js';
@@ -30,10 +30,10 @@ export type { ScheduledTaskSummary, ScheduledTaskInfo, SchedulerService, } from
30
30
  export type { TriggerService } from './trigger-service.js';
31
31
  export type { GatewayService } from './gateway-service.js';
32
32
  export type { DeploymentService, DeploymentConfig, DeploymentInfo, DeploymentServiceConfig, } from './deployment-service.js';
33
- export type { AIStorageService } from './ai-storage-service.js';
34
- export type { AIAgentRunnerParams, AIAgentRunnerResult, AIAgentStepResult, AIAgentRunnerService, } from './ai-agent-runner-service.js';
33
+ export type { AgentStorageService } from './agent-storage-service.js';
34
+ export type { AgentRunnerParams, AgentRunnerResult, AgentStepResult, AgentRunnerService, } from './agent-runner-service.js';
35
35
  export type { AIEmbeddingService } from './ai-embedding-service.js';
36
- export type { CreateRunInput, SaveScoreInput, AIRunStateService, } from './ai-run-state-service.js';
36
+ export type { CreateRunInput, SaveScoreInput, AgentRunStateService, } from './agent-run-state-service.js';
37
37
  export type { CredentialMeta } from './typed-secret-service.js';
38
38
  export type { CredentialService } from './credential-service.js';
39
39
  export { TypedCredentialService } from './typed-credential-service.js';
@@ -14,7 +14,7 @@ export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
14
14
  export { QueueWebhookService, pikkuWebhookWorkerFunc, } from './queue-webhook-service.js';
15
15
  export { InMemoryQueueService } from './in-memory-queue-service.js';
16
16
  export { InMemoryTriggerService } from './in-memory-trigger-service.js';
17
- export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
17
+ export { InMemoryAgentRunStateService } from './in-memory-agent-run-state-service.js';
18
18
  export { LocalGatewayService } from './local-gateway-service.js';
19
19
  export { DEFAULT_WEBHOOK_RETRIES, PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME, WebhookService, } from './webhook-service.js';
20
20
  export { TypedCredentialService } from './typed-credential-service.js';
@@ -14,11 +14,11 @@ import type { SecretDefinitionsMeta } from '../wirings/secret/secret.types.js';
14
14
  import type { CredentialDefinitionsMeta } from '../wirings/credential/credential.types.js';
15
15
  import type { VariableDefinitionsMeta } from '../wirings/variable/variable.types.js';
16
16
  import type { FunctionMeta, FunctionsMeta, MiddlewareMetadata, PermissionMetadata } from '../types/core.types.js';
17
- import type { AIAgentMeta } from '../wirings/ai-agent/ai-agent.types.js';
17
+ import type { AgentsMeta } from '../wirings/agent/agent.types.js';
18
18
  import type { GatewaysMeta } from '../wirings/gateway/gateway.types.js';
19
19
  export type { FunctionMeta, FunctionsMeta, MiddlewareMetadata as MiddlewareMeta, PermissionMetadata as PermissionMeta, };
20
- export type AgentsMeta = AIAgentMeta;
21
- export type AgentMeta = AIAgentMeta[string];
20
+ export type { AgentsMeta };
21
+ export type AgentMeta = AgentsMeta[string];
22
22
  export interface MCPMeta {
23
23
  resources: MCPResourceMeta;
24
24
  tools: MCPToolMeta;
@@ -7,4 +7,4 @@ export declare const defineAgentRunServiceTests: (name: string, agentRunService:
7
7
  * only runs when a backend supplies both. Passed explicitly rather than
8
8
  * closed over, so the dependency is visible in the signature.
9
9
  */
10
- aiStorageService?: ServiceTestConfig["services"]["aiStorageService"]) => void;
10
+ agentStorageService?: ServiceTestConfig["services"]["agentStorageService"]) => void;
@@ -8,7 +8,7 @@ export const defineAgentRunServiceTests = (name, agentRunService,
8
8
  * only runs when a backend supplies both. Passed explicitly rather than
9
9
  * closed over, so the dependency is visible in the signature.
10
10
  */
11
- aiStorageService) => {
11
+ agentStorageService) => {
12
12
  const factory = agentRunService;
13
13
  describe(`AgentRunService [${name}]`, () => {
14
14
  let agentService;
@@ -19,8 +19,8 @@ aiStorageService) => {
19
19
  const threads = await agentService.listThreads();
20
20
  assert.ok(Array.isArray(threads));
21
21
  });
22
- if (aiStorageService) {
23
- const storageFactory = aiStorageService;
22
+ if (agentStorageService) {
23
+ const storageFactory = agentStorageService;
24
24
  // The `owners` constraint is what keeps the generated thread-management
25
25
  // functions from leaking across tenants: a caller may only list threads
26
26
  // owned by one of their session principals, matching the
@@ -0,0 +1,3 @@
1
+ import type { ServiceTestConfig } from '../service-tests.js';
2
+ /** Conformance suite for `agentStorageService`. Runs only when a backend supplies one. */
3
+ export declare const defineAiStorageServiceTests: (name: string, agentStorageService: NonNullable<ServiceTestConfig["services"]["agentStorageService"]>) => void;
@@ -0,0 +1,302 @@
1
+ import { describe, test, before } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ /** Conformance suite for `agentStorageService`. Runs only when a backend supplies one. */
4
+ export const defineAiStorageServiceTests = (name, agentStorageService) => {
5
+ const factory = agentStorageService;
6
+ describe(`AgentStorageService [${name}]`, () => {
7
+ let storage;
8
+ before(async () => {
9
+ storage = await factory();
10
+ });
11
+ test('createThread and getThread', async () => {
12
+ const thread = await storage.createThread('resource-1', {
13
+ title: 'Test Thread',
14
+ metadata: { key: 'val' },
15
+ });
16
+ assert.ok(thread.id);
17
+ assert.equal(thread.resourceId, 'resource-1');
18
+ assert.equal(thread.title, 'Test Thread');
19
+ assert.deepEqual(thread.metadata, { key: 'val' });
20
+ const fetched = await storage.getThread(thread.id);
21
+ assert.equal(fetched.id, thread.id);
22
+ assert.equal(fetched.title, 'Test Thread');
23
+ });
24
+ test('getThreads', async () => {
25
+ const threads = await storage.getThreads('resource-1');
26
+ assert.ok(threads.length >= 1);
27
+ assert.ok(threads.every((t) => t.resourceId === 'resource-1'));
28
+ });
29
+ test('getThread throws for missing', async () => {
30
+ await assert.rejects(() => storage.getThread('missing-thread'));
31
+ });
32
+ test('saveMessages and getMessages', async () => {
33
+ const thread = await storage.createThread('resource-2');
34
+ const now = new Date();
35
+ await storage.saveMessages(thread.id, [
36
+ { id: 'msg-1', role: 'user', content: 'Hello', createdAt: now },
37
+ {
38
+ id: 'msg-2',
39
+ role: 'assistant',
40
+ content: 'Hi there',
41
+ createdAt: new Date(now.getTime() + 1000),
42
+ },
43
+ ]);
44
+ const messages = await storage.getMessages(thread.id);
45
+ assert.equal(messages.length, 2);
46
+ assert.equal(messages[0].role, 'user');
47
+ assert.equal(messages[0].content, 'Hello');
48
+ assert.equal(messages[1].role, 'assistant');
49
+ assert.equal(messages[1].content, 'Hi there');
50
+ });
51
+ test('saveMessages with tool calls and results', async () => {
52
+ const thread = await storage.createThread('resource-3');
53
+ const now = new Date();
54
+ await storage.saveMessages(thread.id, [
55
+ {
56
+ id: 'msg-tc',
57
+ role: 'assistant',
58
+ content: 'Let me call a tool',
59
+ toolCalls: [{ id: 'tc-1', name: 'search', args: { query: 'test' } }],
60
+ createdAt: now,
61
+ },
62
+ ]);
63
+ await storage.saveMessages(thread.id, [
64
+ {
65
+ id: 'tool-results-msg-tc',
66
+ role: 'tool',
67
+ toolResults: [{ id: 'tc-1', name: 'search', result: 'found it' }],
68
+ createdAt: new Date(now.getTime() + 1000),
69
+ },
70
+ ]);
71
+ const messages = await storage.getMessages(thread.id);
72
+ assert.equal(messages.length, 2);
73
+ const assistantMsg = messages[0];
74
+ assert.equal(assistantMsg.role, 'assistant');
75
+ assert.ok(assistantMsg.toolCalls);
76
+ assert.equal(assistantMsg.toolCalls[0].name, 'search');
77
+ const toolMsg = messages[1];
78
+ assert.equal(toolMsg.role, 'tool');
79
+ assert.ok(toolMsg.toolResults);
80
+ assert.equal(toolMsg.toolResults[0].result, 'found it');
81
+ });
82
+ test('getMessages with lastN', async () => {
83
+ const thread = await storage.createThread('resource-4');
84
+ const base = Date.now();
85
+ await storage.saveMessages(thread.id, Array.from({ length: 5 }, (_, i) => ({
86
+ id: `bulk-msg-${i}`,
87
+ role: 'user',
88
+ content: `Message ${i}`,
89
+ createdAt: new Date(base + i * 1000),
90
+ })));
91
+ const messages = await storage.getMessages(thread.id, { lastN: 2 });
92
+ assert.equal(messages.length, 2);
93
+ assert.equal(messages[0].content, 'Message 3');
94
+ assert.equal(messages[1].content, 'Message 4');
95
+ });
96
+ test('working memory: save and get', async () => {
97
+ await storage.saveWorkingMemory('res-1', 'resource', {
98
+ key: 'value',
99
+ });
100
+ const mem = await storage.getWorkingMemory('res-1', 'resource');
101
+ assert.deepEqual(mem, { key: 'value' });
102
+ });
103
+ test('working memory: upsert overwrites', async () => {
104
+ await storage.saveWorkingMemory('res-1', 'resource', {
105
+ key: 'updated',
106
+ });
107
+ const mem = await storage.getWorkingMemory('res-1', 'resource');
108
+ assert.deepEqual(mem, { key: 'updated' });
109
+ });
110
+ test('working memory: returns null for missing', async () => {
111
+ const mem = await storage.getWorkingMemory('missing', 'thread');
112
+ assert.equal(mem, null);
113
+ });
114
+ test('createRun and getRun', async () => {
115
+ const thread = await storage.createThread('resource-5');
116
+ const now = new Date();
117
+ const runId = await storage.createRun({
118
+ agentName: 'test-agent',
119
+ threadId: thread.id,
120
+ resourceId: 'resource-5',
121
+ status: 'running',
122
+ usage: { inputTokens: 100, outputTokens: 50, model: 'test-model' },
123
+ createdAt: now,
124
+ updatedAt: now,
125
+ });
126
+ assert.ok(runId);
127
+ const run = await storage.getRun(runId);
128
+ assert.ok(run);
129
+ assert.equal(run.agentName, 'test-agent');
130
+ assert.equal(run.status, 'running');
131
+ assert.equal(run.usage.inputTokens, 100);
132
+ });
133
+ test('updateRun', async () => {
134
+ const thread = await storage.createThread('resource-6');
135
+ const now = new Date();
136
+ const runId = await storage.createRun({
137
+ agentName: 'update-agent',
138
+ threadId: thread.id,
139
+ resourceId: 'resource-6',
140
+ status: 'running',
141
+ usage: { inputTokens: 0, outputTokens: 0, model: 'test' },
142
+ createdAt: now,
143
+ updatedAt: now,
144
+ });
145
+ await storage.updateRun(runId, {
146
+ status: 'completed',
147
+ usage: { inputTokens: 200, outputTokens: 100, model: 'test-v2' },
148
+ });
149
+ const run = await storage.getRun(runId);
150
+ assert.ok(run);
151
+ assert.equal(run.status, 'completed');
152
+ assert.equal(run.usage.inputTokens, 200);
153
+ assert.equal(run.usage.model, 'test-v2');
154
+ });
155
+ test('getRunsByThread', async () => {
156
+ const thread = await storage.createThread('resource-7');
157
+ const now = new Date();
158
+ await storage.createRun({
159
+ agentName: 'multi-agent',
160
+ threadId: thread.id,
161
+ resourceId: 'resource-7',
162
+ status: 'completed',
163
+ usage: { inputTokens: 10, outputTokens: 5, model: 'test' },
164
+ createdAt: now,
165
+ updatedAt: now,
166
+ });
167
+ const runs = await storage.getRunsByThread(thread.id);
168
+ assert.ok(runs.length >= 1);
169
+ assert.ok(runs.every((r) => r.threadId === thread.id));
170
+ });
171
+ test('saveScore and getScores', async () => {
172
+ const thread = await storage.createThread('resource-score');
173
+ const now = new Date();
174
+ const runId = await storage.createRun({
175
+ agentName: 'scored-agent',
176
+ threadId: thread.id,
177
+ resourceId: 'resource-score',
178
+ status: 'completed',
179
+ usage: { inputTokens: 10, outputTokens: 5, model: 'test' },
180
+ createdAt: now,
181
+ updatedAt: now,
182
+ });
183
+ await storage.saveScore({
184
+ runId,
185
+ scorerName: 'tool-error-rate',
186
+ score: 1,
187
+ });
188
+ await storage.saveScore({
189
+ runId,
190
+ scorerName: 'helpfulness',
191
+ score: 0.75,
192
+ reason: 'answered the question but skipped the fee',
193
+ metadata: { subScores: { accuracy: 0.9 }, judgeTokens: 412 },
194
+ });
195
+ const scores = await storage.getScores(runId);
196
+ assert.equal(scores.length, 2);
197
+ const byName = new Map(scores.map((s) => [s.scorerName, s]));
198
+ const clean = byName.get('tool-error-rate');
199
+ assert.ok(clean);
200
+ assert.equal(clean.score, 1);
201
+ assert.equal(clean.reason, undefined);
202
+ assert.equal(clean.metadata, undefined);
203
+ const helpful = byName.get('helpfulness');
204
+ assert.ok(helpful);
205
+ // A fractional score has to survive the round trip: an integer column
206
+ // would quietly turn every grade into 0 or 1.
207
+ assert.equal(helpful.score, 0.75);
208
+ assert.equal(helpful.reason, 'answered the question but skipped the fee');
209
+ assert.deepEqual(helpful.metadata, {
210
+ subScores: { accuracy: 0.9 },
211
+ judgeTokens: 412,
212
+ });
213
+ assert.ok(helpful.createdAt instanceof Date);
214
+ });
215
+ test('a re-grade appends rather than replacing the grade that was acted on', async () => {
216
+ const thread = await storage.createThread('resource-regrade');
217
+ const now = new Date();
218
+ const runId = await storage.createRun({
219
+ agentName: 'regraded-agent',
220
+ threadId: thread.id,
221
+ resourceId: 'resource-regrade',
222
+ status: 'completed',
223
+ usage: { inputTokens: 1, outputTokens: 1, model: 'test' },
224
+ createdAt: now,
225
+ updatedAt: now,
226
+ });
227
+ await storage.saveScore({ runId, scorerName: 'helpfulness', score: 0.2 });
228
+ await storage.saveScore({ runId, scorerName: 'helpfulness', score: 0.8 });
229
+ const scores = await storage.getScores(runId);
230
+ assert.equal(scores.length, 2);
231
+ assert.deepEqual(scores.map((s) => s.score), [0.2, 0.8]);
232
+ });
233
+ test('getScores is empty for a run nothing graded', async () => {
234
+ const thread = await storage.createThread('resource-ungraded');
235
+ const now = new Date();
236
+ const runId = await storage.createRun({
237
+ agentName: 'ungraded-agent',
238
+ threadId: thread.id,
239
+ resourceId: 'resource-ungraded',
240
+ status: 'completed',
241
+ usage: { inputTokens: 1, outputTokens: 1, model: 'test' },
242
+ createdAt: now,
243
+ updatedAt: now,
244
+ });
245
+ assert.deepEqual(await storage.getScores(runId), []);
246
+ });
247
+ test('resolveApproval', async () => {
248
+ const thread = await storage.createThread('resource-8');
249
+ const now = new Date();
250
+ await storage.saveMessages(thread.id, [
251
+ {
252
+ id: 'approval-msg',
253
+ role: 'assistant',
254
+ toolCalls: [{ id: 'approval-tc', name: 'dangerous-tool', args: {} }],
255
+ createdAt: now,
256
+ },
257
+ ]);
258
+ const runId = await storage.createRun({
259
+ agentName: 'approval-agent',
260
+ threadId: thread.id,
261
+ resourceId: 'resource-8',
262
+ status: 'suspended',
263
+ suspendReason: 'approval',
264
+ pendingApprovals: [
265
+ {
266
+ type: 'tool-call',
267
+ toolCallId: 'approval-tc',
268
+ toolName: 'dangerous-tool',
269
+ args: {},
270
+ },
271
+ ],
272
+ usage: { inputTokens: 0, outputTokens: 0, model: 'test' },
273
+ createdAt: now,
274
+ updatedAt: now,
275
+ });
276
+ let run = await storage.getRun(runId);
277
+ assert.ok(run);
278
+ assert.ok(run.pendingApprovals);
279
+ assert.equal(run.pendingApprovals.length, 1);
280
+ const claimed = await storage.resolveApproval('approval-tc', 'approved');
281
+ assert.equal(claimed, true, 'the first approver claims the approval');
282
+ run = await storage.getRun(runId);
283
+ assert.ok(run);
284
+ assert.equal(run.pendingApprovals, undefined);
285
+ const second = await storage.resolveApproval('approval-tc', 'approved');
286
+ assert.equal(second, false, 'a second approver of the same tool call claims nothing');
287
+ });
288
+ test('deleteThread cascades', async () => {
289
+ const thread = await storage.createThread('resource-del');
290
+ await storage.saveMessages(thread.id, [
291
+ {
292
+ id: 'del-msg',
293
+ role: 'user',
294
+ content: 'goodbye',
295
+ createdAt: new Date(),
296
+ },
297
+ ]);
298
+ await storage.deleteThread(thread.id);
299
+ await assert.rejects(() => storage.getThread(thread.id));
300
+ });
301
+ });
302
+ };
@@ -3,11 +3,11 @@ import type { EventHubStore } from '../wirings/channel/eventhub-store.js';
3
3
  import type { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
4
4
  import type { WorkflowRunService } from '../wirings/workflow/workflow.types.js';
5
5
  import type { DeploymentService } from '../services/deployment-service.js';
6
- import type { AIStorageService } from '../services/ai-storage-service.js';
7
- import type { AIRunStateService } from '../services/ai-run-state-service.js';
6
+ import type { AgentStorageService } from '../services/agent-storage-service.js';
7
+ import type { AgentRunStateService } from '../services/agent-run-state-service.js';
8
8
  import type { SecretService } from '../services/secret-service.js';
9
9
  import type { CredentialService } from '../services/credential-service.js';
10
- import type { AgentRunService } from '../wirings/ai-agent/ai-agent.types.js';
10
+ import type { AgentRunService } from '../wirings/agent/agent.types.js';
11
11
  import type { SessionStore } from '../services/session-store.js';
12
12
  export interface ServiceTestConfig {
13
13
  name: string;
@@ -19,7 +19,7 @@ export interface ServiceTestConfig {
19
19
  deploymentService?: () => Promise<DeploymentService & {
20
20
  stop(): Promise<void>;
21
21
  }>;
22
- aiStorageService?: () => Promise<AIStorageService & AIRunStateService>;
22
+ agentStorageService?: () => Promise<AgentStorageService & AgentRunStateService>;
23
23
  agentRunService?: () => Promise<AgentRunService>;
24
24
  secretService?: (config: {
25
25
  key: string;
@@ -2,7 +2,7 @@ import { defineChannelStoreTests } from './service-tests/channel-store-tests.js'
2
2
  import { defineEventHubStoreTests } from './service-tests/event-hub-store-tests.js';
3
3
  import { defineWorkflowServiceTests } from './service-tests/workflow-service-tests.js';
4
4
  import { defineWorkflowRunServiceTests } from './service-tests/workflow-run-service-tests.js';
5
- import { defineAiStorageServiceTests } from './service-tests/ai-storage-service-tests.js';
5
+ import { defineAiStorageServiceTests } from './service-tests/agent-storage-service-tests.js';
6
6
  import { defineDeploymentServiceTests } from './service-tests/deployment-service-tests.js';
7
7
  import { defineSecretServiceTests } from './service-tests/secret-service-tests.js';
8
8
  import { defineCredentialServiceTests } from './service-tests/credential-service-tests.js';
@@ -28,8 +28,8 @@ export function defineServiceTests(config) {
28
28
  if (services.workflowRunService) {
29
29
  defineWorkflowRunServiceTests(name, services.workflowRunService);
30
30
  }
31
- if (services.aiStorageService) {
32
- defineAiStorageServiceTests(name, services.aiStorageService);
31
+ if (services.agentStorageService) {
32
+ defineAiStorageServiceTests(name, services.agentStorageService);
33
33
  }
34
34
  if (services.deploymentService) {
35
35
  defineDeploymentServiceTests(name, services.deploymentService);
@@ -41,7 +41,7 @@ export function defineServiceTests(config) {
41
41
  defineCredentialServiceTests(name, services.credentialService);
42
42
  }
43
43
  if (services.agentRunService) {
44
- defineAgentRunServiceTests(name, services.agentRunService, services.aiStorageService);
44
+ defineAgentRunServiceTests(name, services.agentRunService, services.agentStorageService);
45
45
  }
46
46
  if (services.sessionStore) {
47
47
  defineSessionStoreTests(name, services.sessionStore);
@@ -19,15 +19,15 @@ import type { PikkuTrigger } from '../wirings/trigger/trigger.types.js';
19
19
  import type { PikkuGateway } from '../wirings/gateway/gateway.types.js';
20
20
  import type { SchedulerService } from '../services/scheduler-service.js';
21
21
  import type { DeploymentService } from '../services/deployment-service.js';
22
- import type { AIStorageService } from '../services/ai-storage-service.js';
22
+ import type { AgentStorageService } from '../services/agent-storage-service.js';
23
23
  import type { ContentService } from '../services/content-service.js';
24
24
  import type { ScenarioPersonaOf, ScenarioPersonas } from '../services/personas-service.js';
25
- import type { AIAgentRunnerService } from '../services/ai-agent-runner-service.js';
25
+ import type { AgentRunnerService } from '../services/agent-runner-service.js';
26
26
  import type { AIEmbeddingService } from '../services/ai-embedding-service.js';
27
- import type { AIRunStateService } from '../services/ai-run-state-service.js';
28
- import type { AgentRunService } from '../wirings/ai-agent/ai-agent.types.js';
27
+ import type { AgentRunStateService } from '../services/agent-run-state-service.js';
28
+ import type { AgentRunService } from '../wirings/agent/agent.types.js';
29
29
  import type { VirtualUserRunStore } from '../wirings/virtual-user/virtual-user-run-store.js';
30
- import type { PikkuAIMiddlewareHooks } from '../wirings/ai-agent/ai-agent.types.js';
30
+ import type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js';
31
31
  import type { WorkflowRunService } from '../wirings/workflow/workflow.types.js';
32
32
  import type { CredentialService } from '../services/credential-service.js';
33
33
  import type { EmailService } from '../services/email-service.js';
@@ -259,11 +259,11 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
259
259
  eventHub?: EventHubService<Record<string, any>>;
260
260
  schedulerService?: SchedulerService;
261
261
  deploymentService?: DeploymentService;
262
- aiStorage?: AIStorageService;
262
+ agentStorage?: AgentStorageService;
263
263
  content?: ContentService;
264
- aiAgentRunner?: AIAgentRunnerService;
264
+ agentRunner?: AgentRunnerService;
265
265
  aiEmbedding?: AIEmbeddingService;
266
- aiRunState?: AIRunStateService;
266
+ agentRunState?: AgentRunStateService;
267
267
  agentRunService?: AgentRunService;
268
268
  workflowRunService?: WorkflowRunService;
269
269
  credentialService?: CredentialService;
@@ -387,8 +387,8 @@ export declare const pikkuMiddleware: <SingletonServices extends CoreSingletonSe
387
387
  export declare const pikkuMiddlewareFactory: <In = any>(factory: CorePikkuMiddlewareFactory<In>) => CorePikkuMiddlewareFactory<In>;
388
388
  export declare const pikkuChannelMiddleware: <SingletonServices extends CoreSingletonServices = CoreSingletonServices, Event = unknown>(middleware: CorePikkuChannelMiddleware<SingletonServices, Event>) => CorePikkuChannelMiddleware<SingletonServices, Event>;
389
389
  export declare const pikkuChannelMiddlewareFactory: <In = any>(factory: CorePikkuChannelMiddlewareFactory<In>) => CorePikkuChannelMiddlewareFactory<In>;
390
- export type { PikkuAIMiddlewareHooks } from '../wirings/ai-agent/ai-agent.types.js';
391
- export declare const pikkuAIMiddleware: <State extends Record<string, unknown> = Record<string, unknown>, SingletonServices extends CoreSingletonServices = CoreSingletonServices>(hooks: PikkuAIMiddlewareHooks<State, SingletonServices>) => PikkuAIMiddlewareHooks<State, SingletonServices>;
390
+ export type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js';
391
+ export declare const pikkuAgentMiddleware: <State extends Record<string, unknown> = Record<string, unknown>, SingletonServices extends CoreSingletonServices = CoreSingletonServices>(hooks: PikkuAgentMiddlewareHooks<State, SingletonServices>) => PikkuAgentMiddlewareHooks<State, SingletonServices>;
392
392
  export type CoreServices<SingletonServices = CoreSingletonServices> = SingletonServices;
393
393
  /** Strips `secrets` from a services type. */
394
394
  export type SecretlessServices<Services> = Omit<Services, 'secrets'>;
@@ -16,4 +16,4 @@ export const pikkuChannelMiddleware = (middleware) => {
16
16
  export const pikkuChannelMiddlewareFactory = (factory) => {
17
17
  return factory;
18
18
  };
19
- export const pikkuAIMiddleware = (hooks) => hooks;
19
+ export const pikkuAgentMiddleware = (hooks) => hooks;
@@ -5,8 +5,8 @@ import type { CoreChannel, ChannelsMeta } from '../wirings/channel/channel.types
5
5
  import type { CLIMeta, CLIProgramState } from '../wirings/cli/cli.types.js';
6
6
  import type { HTTPMethod, CoreHTTPFunctionWiring, HTTPWiringsMeta } from '../wirings/http/http.types.js';
7
7
  import type { CoreMCPResource, MCPResourceMeta, MCPToolMeta, CoreMCPPrompt, MCPPromptMeta } from '../wirings/mcp/mcp.types.js';
8
- import type { CoreAIAgent, AIAgentMeta } from '../wirings/ai-agent/ai-agent.types.js';
9
- import type { PikkuAIScorer, ScorerMeta } from '../wirings/ai-scorer/ai-scorer.types.js';
8
+ import type { CoreAgent, AgentsMeta } from '../wirings/agent/agent.types.js';
9
+ import type { PikkuAgentScorer, ScorerMeta } from '../wirings/agent-scorer/agent-scorer.types.js';
10
10
  import type { CoreGateway, GatewaysMeta } from '../wirings/gateway/gateway.types.js';
11
11
  import type { CoreQueueWorker, QueueWorkersMeta } from '../wirings/queue/queue.types.js';
12
12
  import type { CoreScheduledTask, ScheduledTasksMeta } from '../wirings/scheduler/scheduler.types.js';
@@ -105,9 +105,9 @@ export interface PikkuPackageState {
105
105
  promptsMeta: MCPPromptMeta;
106
106
  };
107
107
  agent: {
108
- agents: Map<string, CoreAIAgent>;
109
- agentsMeta: AIAgentMeta;
110
- scorers: Map<string, PikkuAIScorer>;
108
+ agents: Map<string, CoreAgent>;
109
+ agentsMeta: AgentsMeta;
110
+ scorers: Map<string, PikkuAgentScorer>;
111
111
  scorersMeta: ScorerMeta;
112
112
  /** Alias -> `provider/model`, from the `models` table in pikku.config.json. */
113
113
  modelAliases: Record<string, string>;
@@ -1,8 +1,8 @@
1
1
  import type { ActorFlowApprovalPolicy, ActorFlowVerdict, TargetAgentDriver } from './actor-flow.types.js';
2
2
  import type { ResolvedPersona } from '../../services/personas-service.js';
3
- import type { AIAgentRunnerParams, AIAgentStepResult } from '../../services/ai-agent-runner-service.js';
3
+ import type { AgentRunnerParams, AgentStepResult } from '../../services/agent-runner-service.js';
4
4
  /** The LLM call the actor uses for its own turns/decisions/evaluation. */
5
- export type ActorLLM = (params: AIAgentRunnerParams) => Promise<AIAgentStepResult>;
5
+ export type ActorLLM = (params: AgentRunnerParams) => Promise<AgentStepResult>;
6
6
  export interface RunConversationParams {
7
7
  /** The person being played — name, job title, personality. */
8
8
  persona: ResolvedPersona;