@adonis-agora/agent 0.1.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 (314) hide show
  1. package/LICENSE +21 -0
  2. package/dist/configure.d.ts +18 -0
  3. package/dist/configure.d.ts.map +1 -0
  4. package/dist/configure.js +29 -0
  5. package/dist/configure.js.map +1 -0
  6. package/dist/providers/agent_provider.d.ts +25 -0
  7. package/dist/providers/agent_provider.d.ts.map +1 -0
  8. package/dist/providers/agent_provider.js +511 -0
  9. package/dist/providers/agent_provider.js.map +1 -0
  10. package/dist/src/actor-resolver.d.ts +41 -0
  11. package/dist/src/actor-resolver.d.ts.map +1 -0
  12. package/dist/src/agent-deps-factory.d.ts +59 -0
  13. package/dist/src/agent-deps-factory.d.ts.map +1 -0
  14. package/dist/src/agent-deps-factory.js +111 -0
  15. package/dist/src/agent-deps-factory.js.map +1 -0
  16. package/dist/src/agent-deps.d.ts +42 -0
  17. package/dist/src/agent-deps.d.ts.map +1 -0
  18. package/dist/src/agent-deps.js +5 -0
  19. package/dist/src/agent-deps.js.map +1 -0
  20. package/dist/src/agent-loop.d.ts +101 -0
  21. package/dist/src/agent-loop.d.ts.map +1 -0
  22. package/dist/src/agent-loop.js +396 -0
  23. package/dist/src/agent-loop.js.map +1 -0
  24. package/dist/src/agent-registry.d.ts +10 -0
  25. package/dist/src/agent-registry.d.ts.map +1 -0
  26. package/dist/src/agent-service.d.ts +50 -0
  27. package/dist/src/agent-service.d.ts.map +1 -0
  28. package/dist/src/agent-service.js +82 -0
  29. package/dist/src/agent-service.js.map +1 -0
  30. package/dist/src/ai-sdk/ai-sdk-model.d.ts +17 -0
  31. package/dist/src/ai-sdk/ai-sdk-model.d.ts.map +1 -0
  32. package/dist/src/ai-sdk/ai-sdk-model.js +263 -0
  33. package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -0
  34. package/dist/src/ai-sdk/index.d.ts +2 -0
  35. package/dist/src/ai-sdk/index.d.ts.map +1 -0
  36. package/dist/src/ai-tool-ref.d.ts +79 -0
  37. package/dist/src/ai-tool-ref.d.ts.map +1 -0
  38. package/dist/src/ai-tool-ref.js +81 -0
  39. package/dist/src/ai-tool-ref.js.map +1 -0
  40. package/dist/src/authorizer.d.ts +18 -0
  41. package/dist/src/authorizer.d.ts.map +1 -0
  42. package/dist/src/authz/authz-tool-authorizer.d.ts +85 -0
  43. package/dist/src/authz/authz-tool-authorizer.d.ts.map +1 -0
  44. package/dist/src/authz/authz-tool-authorizer.js +63 -0
  45. package/dist/src/authz/authz-tool-authorizer.js.map +1 -0
  46. package/dist/src/authz/index.d.ts +3 -0
  47. package/dist/src/authz/index.d.ts.map +1 -0
  48. package/dist/src/authz/index.js +2 -0
  49. package/dist/src/authz/index.js.map +1 -0
  50. package/dist/src/data/data-tool.d.ts +64 -0
  51. package/dist/src/data/data-tool.d.ts.map +1 -0
  52. package/dist/src/data/data-tool.js +146 -0
  53. package/dist/src/data/data-tool.js.map +1 -0
  54. package/dist/src/data/index.d.ts +7 -0
  55. package/dist/src/data/index.d.ts.map +1 -0
  56. package/dist/src/data/index.js +7 -0
  57. package/dist/src/data/index.js.map +1 -0
  58. package/dist/src/data/limit.d.ts +12 -0
  59. package/dist/src/data/limit.d.ts.map +1 -0
  60. package/dist/src/data/limit.js +29 -0
  61. package/dist/src/data/limit.js.map +1 -0
  62. package/dist/src/data/parser.d.ts +27 -0
  63. package/dist/src/data/parser.d.ts.map +1 -0
  64. package/dist/src/data/parser.js +18 -0
  65. package/dist/src/data/parser.js.map +1 -0
  66. package/dist/src/data/sql-validator.d.ts +37 -0
  67. package/dist/src/data/sql-validator.d.ts.map +1 -0
  68. package/dist/src/data/sql-validator.js +92 -0
  69. package/dist/src/data/sql-validator.js.map +1 -0
  70. package/dist/src/data/table-access.d.ts +40 -0
  71. package/dist/src/data/table-access.d.ts.map +1 -0
  72. package/dist/src/data/table-access.js +41 -0
  73. package/dist/src/data/table-access.js.map +1 -0
  74. package/dist/src/data/tenant-scope.d.ts +39 -0
  75. package/dist/src/data/tenant-scope.d.ts.map +1 -0
  76. package/dist/src/data/tenant-scope.js +126 -0
  77. package/dist/src/data/tenant-scope.js.map +1 -0
  78. package/dist/src/define_config.d.ts +153 -0
  79. package/dist/src/define_config.d.ts.map +1 -0
  80. package/dist/src/define_config.js +7 -0
  81. package/dist/src/define_config.js.map +1 -0
  82. package/dist/src/diagnostics.d.ts +82 -0
  83. package/dist/src/diagnostics.d.ts.map +1 -0
  84. package/dist/src/diagnostics.js +50 -0
  85. package/dist/src/diagnostics.js.map +1 -0
  86. package/dist/src/durable/agent-run-context.d.ts +24 -0
  87. package/dist/src/durable/agent-run-context.d.ts.map +1 -0
  88. package/dist/src/durable/agent-run-context.js +17 -0
  89. package/dist/src/durable/agent-run-context.js.map +1 -0
  90. package/dist/src/durable/agent-run-workflow.d.ts +37 -0
  91. package/dist/src/durable/agent-run-workflow.d.ts.map +1 -0
  92. package/dist/src/durable/agent-run-workflow.js +128 -0
  93. package/dist/src/durable/agent-run-workflow.js.map +1 -0
  94. package/dist/src/durable/durable-agent-runner.d.ts +25 -0
  95. package/dist/src/durable/durable-agent-runner.d.ts.map +1 -0
  96. package/dist/src/durable/durable-agent-runner.js +59 -0
  97. package/dist/src/durable/durable-agent-runner.js.map +1 -0
  98. package/dist/src/durable/index.d.ts +17 -0
  99. package/dist/src/durable/index.d.ts.map +1 -0
  100. package/dist/src/durable/index.js +20 -0
  101. package/dist/src/durable/index.js.map +1 -0
  102. package/dist/src/index.d.ts +55 -0
  103. package/dist/src/index.d.ts.map +1 -0
  104. package/dist/src/index.js +45 -0
  105. package/dist/src/index.js.map +1 -0
  106. package/dist/src/personas.d.ts +7 -0
  107. package/dist/src/personas.d.ts.map +1 -0
  108. package/dist/src/rag/chunk.d.ts +14 -0
  109. package/dist/src/rag/chunk.d.ts.map +1 -0
  110. package/dist/src/rag/chunk.js +42 -0
  111. package/dist/src/rag/chunk.js.map +1 -0
  112. package/dist/src/rag/embedding-retriever.d.ts +15 -0
  113. package/dist/src/rag/embedding-retriever.d.ts.map +1 -0
  114. package/dist/src/rag/embedding-retriever.js +24 -0
  115. package/dist/src/rag/embedding-retriever.js.map +1 -0
  116. package/dist/src/rag/filter.d.ts +6 -0
  117. package/dist/src/rag/filter.d.ts.map +1 -0
  118. package/dist/src/rag/filter.js +11 -0
  119. package/dist/src/rag/filter.js.map +1 -0
  120. package/dist/src/rag/index.d.ts +8 -0
  121. package/dist/src/rag/index.d.ts.map +1 -0
  122. package/dist/src/rag/index.js +8 -0
  123. package/dist/src/rag/index.js.map +1 -0
  124. package/dist/src/rag/ingest.d.ts +33 -0
  125. package/dist/src/rag/ingest.d.ts.map +1 -0
  126. package/dist/src/rag/ingest.js +37 -0
  127. package/dist/src/rag/ingest.js.map +1 -0
  128. package/dist/src/rag/memory-vector-store.d.ts +16 -0
  129. package/dist/src/rag/memory-vector-store.d.ts.map +1 -0
  130. package/dist/src/rag/memory-vector-store.js +70 -0
  131. package/dist/src/rag/memory-vector-store.js.map +1 -0
  132. package/dist/src/rag/pg-vector-store.d.ts +84 -0
  133. package/dist/src/rag/pg-vector-store.d.ts.map +1 -0
  134. package/dist/src/rag/pg-vector-store.js +220 -0
  135. package/dist/src/rag/pg-vector-store.js.map +1 -0
  136. package/dist/src/rag/vector-store.d.ts +47 -0
  137. package/dist/src/rag/vector-store.d.ts.map +1 -0
  138. package/dist/src/rag/vector-store.js +5 -0
  139. package/dist/src/rag/vector-store.js.map +1 -0
  140. package/dist/src/rag-media/diagnostics.d.ts +43 -0
  141. package/dist/src/rag-media/diagnostics.d.ts.map +1 -0
  142. package/dist/src/rag-media/diagnostics.js +36 -0
  143. package/dist/src/rag-media/diagnostics.js.map +1 -0
  144. package/dist/src/rag-media/index.d.ts +5 -0
  145. package/dist/src/rag-media/index.d.ts.map +1 -0
  146. package/dist/src/rag-media/index.js +5 -0
  147. package/dist/src/rag-media/index.js.map +1 -0
  148. package/dist/src/rag-media/media-events.d.ts +23 -0
  149. package/dist/src/rag-media/media-events.d.ts.map +1 -0
  150. package/dist/src/rag-media/media-events.js +28 -0
  151. package/dist/src/rag-media/media-events.js.map +1 -0
  152. package/dist/src/rag-media/media-rag-ingestion.d.ts +155 -0
  153. package/dist/src/rag-media/media-rag-ingestion.d.ts.map +1 -0
  154. package/dist/src/rag-media/media-rag-ingestion.js +204 -0
  155. package/dist/src/rag-media/media-rag-ingestion.js.map +1 -0
  156. package/dist/src/rag-media/text-extractor.d.ts +46 -0
  157. package/dist/src/rag-media/text-extractor.d.ts.map +1 -0
  158. package/dist/src/rag-media/text-extractor.js +92 -0
  159. package/dist/src/rag-media/text-extractor.js.map +1 -0
  160. package/dist/src/redis-stream-client.d.ts +29 -0
  161. package/dist/src/redis-stream-client.d.ts.map +1 -0
  162. package/dist/src/redis-stream-client.js +2 -0
  163. package/dist/src/redis-stream-client.js.map +1 -0
  164. package/dist/src/redis-token-stream-sink.d.ts +36 -0
  165. package/dist/src/redis-token-stream-sink.d.ts.map +1 -0
  166. package/dist/src/redis-token-stream-sink.js +94 -0
  167. package/dist/src/redis-token-stream-sink.js.map +1 -0
  168. package/dist/src/runners/inline-agent-runner.d.ts +26 -0
  169. package/dist/src/runners/inline-agent-runner.d.ts.map +1 -0
  170. package/dist/src/runners/inline-agent-runner.js +85 -0
  171. package/dist/src/runners/inline-agent-runner.js.map +1 -0
  172. package/dist/src/spi/actor-directory.d.ts +23 -0
  173. package/dist/src/spi/actor-directory.d.ts.map +1 -0
  174. package/dist/src/spi/actor-directory.js +2 -0
  175. package/dist/src/spi/actor-directory.js.map +1 -0
  176. package/dist/src/spi/actor-resolver.d.ts +18 -0
  177. package/dist/src/spi/actor-resolver.d.ts.map +1 -0
  178. package/dist/src/spi/agent-runner.d.ts +20 -0
  179. package/dist/src/spi/agent-runner.d.ts.map +1 -0
  180. package/dist/src/spi/agent-store.d.ts +104 -0
  181. package/dist/src/spi/agent-store.d.ts.map +1 -0
  182. package/dist/src/spi/agent-store.js +2 -0
  183. package/dist/src/spi/agent-store.js.map +1 -0
  184. package/dist/src/spi/attachment-staging.d.ts +27 -0
  185. package/dist/src/spi/attachment-staging.d.ts.map +1 -0
  186. package/dist/src/spi/attachment-staging.js +2 -0
  187. package/dist/src/spi/attachment-staging.js.map +1 -0
  188. package/dist/src/spi/embedding-provider.d.ts +12 -0
  189. package/dist/src/spi/embedding-provider.d.ts.map +1 -0
  190. package/dist/src/spi/embedding-provider.js +2 -0
  191. package/dist/src/spi/embedding-provider.js.map +1 -0
  192. package/dist/src/spi/governance-queries.d.ts +215 -0
  193. package/dist/src/spi/governance-queries.d.ts.map +1 -0
  194. package/dist/src/spi/governance-queries.js +15 -0
  195. package/dist/src/spi/governance-queries.js.map +1 -0
  196. package/dist/src/spi/model-provider.d.ts +41 -0
  197. package/dist/src/spi/model-provider.d.ts.map +1 -0
  198. package/dist/src/spi/pricing-store.d.ts +45 -0
  199. package/dist/src/spi/pricing-store.d.ts.map +1 -0
  200. package/dist/src/spi/pricing-store.js +24 -0
  201. package/dist/src/spi/pricing-store.js.map +1 -0
  202. package/dist/src/spi/quota-store.d.ts +7 -0
  203. package/dist/src/spi/quota-store.d.ts.map +1 -0
  204. package/dist/src/spi/reranker.d.ts +17 -0
  205. package/dist/src/spi/reranker.d.ts.map +1 -0
  206. package/dist/src/spi/reranker.js +2 -0
  207. package/dist/src/spi/reranker.js.map +1 -0
  208. package/dist/src/spi/retriever.d.ts +28 -0
  209. package/dist/src/spi/retriever.d.ts.map +1 -0
  210. package/dist/src/spi/retriever.js +11 -0
  211. package/dist/src/spi/retriever.js.map +1 -0
  212. package/dist/src/spi/roles-policy.d.ts +11 -0
  213. package/dist/src/spi/roles-policy.d.ts.map +1 -0
  214. package/dist/src/spi/tool.d.ts +21 -0
  215. package/dist/src/spi/tool.d.ts.map +1 -0
  216. package/dist/src/stores/factory.d.ts +363 -0
  217. package/dist/src/stores/factory.d.ts.map +1 -0
  218. package/dist/src/stores/factory.js +341 -0
  219. package/dist/src/stores/factory.js.map +1 -0
  220. package/dist/src/stores/ledger-quota.d.ts +23 -0
  221. package/dist/src/stores/ledger-quota.d.ts.map +1 -0
  222. package/dist/src/stores/ledger-quota.js +32 -0
  223. package/dist/src/stores/ledger-quota.js.map +1 -0
  224. package/dist/src/stores/lucid-governance-queries.d.ts +73 -0
  225. package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -0
  226. package/dist/src/stores/lucid-governance-queries.js +510 -0
  227. package/dist/src/stores/lucid-governance-queries.js.map +1 -0
  228. package/dist/src/stores/lucid-pricing.d.ts +20 -0
  229. package/dist/src/stores/lucid-pricing.d.ts.map +1 -0
  230. package/dist/src/stores/lucid-pricing.js +67 -0
  231. package/dist/src/stores/lucid-pricing.js.map +1 -0
  232. package/dist/src/stores/lucid-schema.d.ts +37 -0
  233. package/dist/src/stores/lucid-schema.d.ts.map +1 -0
  234. package/dist/src/stores/lucid-schema.js +139 -0
  235. package/dist/src/stores/lucid-schema.js.map +1 -0
  236. package/dist/src/stores/lucid.d.ts +73 -0
  237. package/dist/src/stores/lucid.d.ts.map +1 -0
  238. package/dist/src/stores/lucid.js +400 -0
  239. package/dist/src/stores/lucid.js.map +1 -0
  240. package/dist/src/telescope/dashboard.d.ts +21 -0
  241. package/dist/src/telescope/dashboard.d.ts.map +1 -0
  242. package/dist/src/telescope/dashboard.js +140 -0
  243. package/dist/src/telescope/dashboard.js.map +1 -0
  244. package/dist/src/telescope/data-providers.d.ts +39 -0
  245. package/dist/src/telescope/data-providers.d.ts.map +1 -0
  246. package/dist/src/telescope/data-providers.js +345 -0
  247. package/dist/src/telescope/data-providers.js.map +1 -0
  248. package/dist/src/telescope/extension.d.ts +27 -0
  249. package/dist/src/telescope/extension.d.ts.map +1 -0
  250. package/dist/src/telescope/extension.js +45 -0
  251. package/dist/src/telescope/extension.js.map +1 -0
  252. package/dist/src/telescope/index.d.ts +5 -0
  253. package/dist/src/telescope/index.d.ts.map +1 -0
  254. package/dist/src/telescope/index.js +4 -0
  255. package/dist/src/telescope/index.js.map +1 -0
  256. package/dist/src/telescope/telescope-sdk.d.ts +126 -0
  257. package/dist/src/telescope/telescope-sdk.d.ts.map +1 -0
  258. package/dist/src/telescope/telescope-sdk.js +15 -0
  259. package/dist/src/telescope/telescope-sdk.js.map +1 -0
  260. package/dist/src/testing/fake-embedding-provider.d.ts +37 -0
  261. package/dist/src/testing/fake-embedding-provider.d.ts.map +1 -0
  262. package/dist/src/testing/fake-embedding-provider.js +67 -0
  263. package/dist/src/testing/fake-embedding-provider.js.map +1 -0
  264. package/dist/src/testing/fake-media.d.ts +44 -0
  265. package/dist/src/testing/fake-media.d.ts.map +1 -0
  266. package/dist/src/testing/fake-media.js +69 -0
  267. package/dist/src/testing/fake-media.js.map +1 -0
  268. package/dist/src/testing/fake-model-provider.d.ts +29 -0
  269. package/dist/src/testing/fake-model-provider.d.ts.map +1 -0
  270. package/dist/src/testing/in-memory-actor-directory.d.ts +14 -0
  271. package/dist/src/testing/in-memory-actor-directory.d.ts.map +1 -0
  272. package/dist/src/testing/in-memory-actor-directory.js +27 -0
  273. package/dist/src/testing/in-memory-actor-directory.js.map +1 -0
  274. package/dist/src/testing/in-memory-attachment-staging.d.ts +22 -0
  275. package/dist/src/testing/in-memory-attachment-staging.d.ts.map +1 -0
  276. package/dist/src/testing/in-memory-attachment-staging.js +28 -0
  277. package/dist/src/testing/in-memory-attachment-staging.js.map +1 -0
  278. package/dist/src/testing/in-memory-governance-queries.d.ts +34 -0
  279. package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -0
  280. package/dist/src/testing/in-memory-governance-queries.js +373 -0
  281. package/dist/src/testing/in-memory-governance-queries.js.map +1 -0
  282. package/dist/src/testing/in-memory-pricing.d.ts +13 -0
  283. package/dist/src/testing/in-memory-pricing.d.ts.map +1 -0
  284. package/dist/src/testing/in-memory-pricing.js +27 -0
  285. package/dist/src/testing/in-memory-pricing.js.map +1 -0
  286. package/dist/src/testing/in-memory-quota.d.ts +11 -0
  287. package/dist/src/testing/in-memory-quota.d.ts.map +1 -0
  288. package/dist/src/testing/in-memory-sink.d.ts +14 -0
  289. package/dist/src/testing/in-memory-sink.d.ts.map +1 -0
  290. package/dist/src/testing/in-memory-store.d.ts +119 -0
  291. package/dist/src/testing/in-memory-store.d.ts.map +1 -0
  292. package/dist/src/testing/in-memory-store.js +317 -0
  293. package/dist/src/testing/in-memory-store.js.map +1 -0
  294. package/dist/src/testing/index.d.ts +11 -0
  295. package/dist/src/testing/index.d.ts.map +1 -0
  296. package/dist/src/testing/index.js +11 -0
  297. package/dist/src/testing/index.js.map +1 -0
  298. package/dist/src/tool-discovery.d.ts +35 -0
  299. package/dist/src/tool-discovery.d.ts.map +1 -0
  300. package/dist/src/tool-registry.d.ts +45 -0
  301. package/dist/src/tool-registry.d.ts.map +1 -0
  302. package/dist/src/tool-retry.d.ts +56 -0
  303. package/dist/src/tool-retry.d.ts.map +1 -0
  304. package/dist/src/tool-retry.js +95 -0
  305. package/dist/src/tool-retry.js.map +1 -0
  306. package/dist/src/types.d.ts +222 -0
  307. package/dist/src/types.d.ts.map +1 -0
  308. package/dist/src/types.js +2 -0
  309. package/dist/src/types.js.map +1 -0
  310. package/dist/stubs/config/agent.stub +55 -0
  311. package/dist/stubs/database/migrations/create_agent_rag_chunks.stub +41 -0
  312. package/dist/stubs/database/migrations/create_agent_run_tracking.stub +80 -0
  313. package/dist/stubs/database/migrations/create_agent_tables.stub +113 -0
  314. package/package.json +174 -0
@@ -0,0 +1,317 @@
1
+ /** A fully in-memory `AgentStore` for tests and the offline demo. */
2
+ export class InMemoryAgentStore {
3
+ threads = new Map();
4
+ toolCalls = new Map();
5
+ usage = [];
6
+ runs = new Map();
7
+ /** messageId → runId, so run-detail can gather a run's messages without mutating `StoredMessage`. */
8
+ messageRunIds = new Map();
9
+ now() {
10
+ return new Date().toISOString();
11
+ }
12
+ async createThread(input) {
13
+ const id = crypto.randomUUID();
14
+ const ts = this.now();
15
+ const row = {
16
+ id,
17
+ actorRef: input.actor.id,
18
+ title: input.title ?? 'New chat',
19
+ persona: input.persona,
20
+ transient: input.transient ?? false,
21
+ createdAt: ts,
22
+ updatedAt: ts,
23
+ messages: [],
24
+ };
25
+ this.threads.set(id, row);
26
+ return this.toSummary(row);
27
+ }
28
+ async getThread(threadId) {
29
+ const row = this.threads.get(threadId);
30
+ if (row === undefined) {
31
+ return null;
32
+ }
33
+ return {
34
+ ...this.toSummary(row),
35
+ messages: row.messages,
36
+ ...(row.activeStreamId !== undefined ? { activeStreamId: row.activeStreamId } : {}),
37
+ };
38
+ }
39
+ async listThreads(actorRef, limit = 50) {
40
+ return [...this.threads.values()]
41
+ .filter((row) => row.actorRef === actorRef && !row.transient)
42
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))
43
+ .slice(0, limit)
44
+ .map((row) => this.toSummary(row));
45
+ }
46
+ async softDeleteThread(threadId) {
47
+ this.threads.delete(threadId);
48
+ }
49
+ async forkThread(threadId, fromMessageId) {
50
+ const source = this.threads.get(threadId);
51
+ if (source === undefined) {
52
+ throw new Error(`thread ${threadId} not found`);
53
+ }
54
+ const cutoff = source.messages.findIndex((message) => message.id === fromMessageId);
55
+ const kept = cutoff >= 0 ? source.messages.slice(0, cutoff + 1) : [...source.messages];
56
+ const id = crypto.randomUUID();
57
+ const ts = this.now();
58
+ const row = {
59
+ id,
60
+ actorRef: source.actorRef,
61
+ title: source.title,
62
+ persona: source.persona,
63
+ transient: false,
64
+ createdAt: ts,
65
+ updatedAt: ts,
66
+ messages: kept.map((message) => ({ ...message })),
67
+ };
68
+ this.threads.set(id, row);
69
+ return this.toSummary(row);
70
+ }
71
+ async setTitle(threadId, title) {
72
+ const row = this.threads.get(threadId);
73
+ if (row !== undefined) {
74
+ row.title = title;
75
+ row.updatedAt = this.now();
76
+ }
77
+ }
78
+ async setActiveStream(threadId, runId) {
79
+ const row = this.threads.get(threadId);
80
+ if (row !== undefined) {
81
+ if (runId === null) {
82
+ // biome-ignore lint/performance/noDelete: exactOptionalPropertyTypes forbids assigning undefined to an optional prop
83
+ delete row.activeStreamId;
84
+ }
85
+ else {
86
+ row.activeStreamId = runId;
87
+ }
88
+ }
89
+ }
90
+ async appendMessage(input) {
91
+ const row = this.threads.get(input.threadId);
92
+ if (row === undefined) {
93
+ throw new Error(`thread ${input.threadId} not found`);
94
+ }
95
+ const message = {
96
+ id: crypto.randomUUID(),
97
+ role: input.role,
98
+ content: input.content,
99
+ createdAt: this.now(),
100
+ ...(input.toolCalls !== undefined ? { toolCalls: input.toolCalls } : {}),
101
+ ...(input.toolResults !== undefined ? { toolResults: input.toolResults } : {}),
102
+ ...(input.attachments !== undefined ? { attachments: input.attachments } : {}),
103
+ ...(input.followUps !== undefined ? { followUps: input.followUps } : {}),
104
+ ...(input.usage !== undefined ? { usage: input.usage } : {}),
105
+ };
106
+ row.messages.push(message);
107
+ row.updatedAt = message.createdAt;
108
+ if (input.runId !== undefined) {
109
+ this.messageRunIds.set(message.id, input.runId);
110
+ }
111
+ return message;
112
+ }
113
+ async truncateFrom(threadId, messageId) {
114
+ const row = this.threads.get(threadId);
115
+ if (row === undefined) {
116
+ return;
117
+ }
118
+ const cutoff = row.messages.findIndex((message) => message.id === messageId);
119
+ if (cutoff >= 0) {
120
+ row.messages = row.messages.slice(0, cutoff);
121
+ }
122
+ }
123
+ async recordToolCall(input) {
124
+ this.toolCalls.set(input.toolCallId, {
125
+ toolCallId: input.toolCallId,
126
+ messageId: input.messageId,
127
+ threadId: this.threadIdForMessage(input.messageId) ?? '',
128
+ toolName: input.toolName,
129
+ toolType: input.toolType,
130
+ input: input.input,
131
+ status: input.status,
132
+ createdAt: this.now(),
133
+ ...(input.runId !== undefined ? { runId: input.runId } : {}),
134
+ });
135
+ }
136
+ async updateToolCall(input) {
137
+ const row = this.toolCalls.get(input.toolCallId);
138
+ if (row === undefined) {
139
+ return;
140
+ }
141
+ row.status = input.status;
142
+ if (input.output !== undefined) {
143
+ row.output = input.output;
144
+ }
145
+ if (input.error !== undefined) {
146
+ row.error = input.error;
147
+ }
148
+ if (input.executionMs !== undefined) {
149
+ row.executionMs = input.executionMs;
150
+ }
151
+ }
152
+ async recordUsage(input) {
153
+ const createdAt = this.now();
154
+ this.usage.push({
155
+ actorRef: input.actorRef,
156
+ threadId: input.threadId,
157
+ modelId: input.modelId,
158
+ purpose: input.purpose,
159
+ inputTokens: input.usage.inputTokens,
160
+ outputTokens: input.usage.outputTokens,
161
+ day: createdAt.slice(0, 10),
162
+ createdAt,
163
+ ...(input.runId !== undefined ? { runId: input.runId } : {}),
164
+ ...(input.usage.cacheWriteTokens !== undefined
165
+ ? { cacheWriteTokens: input.usage.cacheWriteTokens }
166
+ : {}),
167
+ ...(input.usage.cacheReadTokens !== undefined
168
+ ? { cacheReadTokens: input.usage.cacheReadTokens }
169
+ : {}),
170
+ ...(input.costUsd !== undefined ? { costUsd: input.costUsd } : {}),
171
+ });
172
+ }
173
+ async recordRunStart(input) {
174
+ this.runs.set(input.runId, {
175
+ runId: input.runId,
176
+ threadId: input.threadId,
177
+ actorRef: input.actor.id,
178
+ status: 'running',
179
+ startedAt: this.now(),
180
+ stepCount: 0,
181
+ inputTokens: 0,
182
+ outputTokens: 0,
183
+ durable: input.durable ?? false,
184
+ ...(input.actor.tenantRef !== undefined ? { tenantRef: input.actor.tenantRef } : {}),
185
+ ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
186
+ });
187
+ }
188
+ async recordRunEnd(input) {
189
+ const row = this.runs.get(input.runId);
190
+ // First terminal wins: a no-op when the run is unknown or already settled (mirrors the Lucid twin).
191
+ if (row === undefined || row.status !== 'running') {
192
+ return;
193
+ }
194
+ row.status = input.status;
195
+ row.finishedAt =
196
+ input.finishedAt !== undefined ? new Date(input.finishedAt).toISOString() : this.now();
197
+ if (input.stepCount !== undefined)
198
+ row.stepCount = input.stepCount;
199
+ if (input.inputTokens !== undefined)
200
+ row.inputTokens = input.inputTokens;
201
+ if (input.outputTokens !== undefined)
202
+ row.outputTokens = input.outputTokens;
203
+ if (input.costUsd !== undefined)
204
+ row.costUsd = input.costUsd;
205
+ if (input.error !== undefined)
206
+ row.error = input.error;
207
+ }
208
+ async quotaToday(actorRef, day) {
209
+ const usedTokens = this.usage
210
+ .filter((row) => row.actorRef === actorRef && row.day === day)
211
+ .reduce((sum, row) => sum + row.inputTokens + row.outputTokens, 0);
212
+ return { usedTokens };
213
+ }
214
+ /** Test helper: read the recorded usage rows (modelId + token totals). */
215
+ usageRows() {
216
+ return this.usage.map((row) => ({
217
+ actorRef: row.actorRef,
218
+ tokens: row.inputTokens + row.outputTokens,
219
+ modelId: row.modelId,
220
+ }));
221
+ }
222
+ /** Governance read-model feed: recorded usage rows with the input/output split + thread/day. */
223
+ governanceUsage() {
224
+ return this.usage.map((row) => ({
225
+ actorRef: row.actorRef,
226
+ threadId: row.threadId,
227
+ modelId: row.modelId,
228
+ purpose: row.purpose,
229
+ inputTokens: row.inputTokens,
230
+ outputTokens: row.outputTokens,
231
+ day: row.day,
232
+ createdAt: row.createdAt,
233
+ ...(row.runId !== undefined ? { runId: row.runId } : {}),
234
+ ...(row.cacheWriteTokens !== undefined ? { cacheWriteTokens: row.cacheWriteTokens } : {}),
235
+ ...(row.cacheReadTokens !== undefined ? { cacheReadTokens: row.cacheReadTokens } : {}),
236
+ ...(row.costUsd !== undefined ? { costUsd: row.costUsd } : {}),
237
+ }));
238
+ }
239
+ /** Governance read-model feed: recorded tool calls with the resolved thread + timestamp. */
240
+ governanceToolCalls() {
241
+ return [...this.toolCalls.values()].map((row) => ({
242
+ toolCallId: row.toolCallId,
243
+ toolName: row.toolName,
244
+ toolType: row.toolType,
245
+ status: row.status,
246
+ threadId: row.threadId,
247
+ input: row.input,
248
+ createdAt: row.createdAt,
249
+ ...(row.runId !== undefined ? { runId: row.runId } : {}),
250
+ ...(row.output !== undefined ? { output: row.output } : {}),
251
+ ...(row.error !== undefined ? { error: row.error } : {}),
252
+ ...(row.executionMs !== undefined ? { executionMs: row.executionMs } : {}),
253
+ }));
254
+ }
255
+ /** Governance read-model feed: recorded runs (full lifecycle + rollups). */
256
+ governanceRuns() {
257
+ return [...this.runs.values()].map((row) => ({ ...row }));
258
+ }
259
+ /** Governance read-model feed: recorded messages with their thread + run correlation. */
260
+ governanceMessages() {
261
+ const rows = [];
262
+ for (const thread of this.threads.values()) {
263
+ for (const message of thread.messages) {
264
+ const runId = this.messageRunIds.get(message.id);
265
+ rows.push({
266
+ id: message.id,
267
+ threadId: thread.id,
268
+ role: message.role,
269
+ content: message.content,
270
+ createdAt: message.createdAt,
271
+ ...(runId !== undefined ? { runId } : {}),
272
+ });
273
+ }
274
+ }
275
+ return rows;
276
+ }
277
+ /** Governance read-model feed: thread metadata (title/actor/message count/last activity). */
278
+ governanceThreads() {
279
+ return [...this.threads.values()].map((row) => ({
280
+ threadId: row.id,
281
+ title: row.title,
282
+ actorRef: row.actorRef,
283
+ messageCount: row.messages.length,
284
+ updatedAt: row.updatedAt,
285
+ }));
286
+ }
287
+ threadIdForMessage(messageId) {
288
+ for (const [threadId, row] of this.threads) {
289
+ if (row.messages.some((message) => message.id === messageId)) {
290
+ return threadId;
291
+ }
292
+ }
293
+ return undefined;
294
+ }
295
+ /** Test helper: read the recorded tool-call rows. */
296
+ toolCallRows() {
297
+ return [...this.toolCalls.values()].map((row) => ({
298
+ toolName: row.toolName,
299
+ status: row.status,
300
+ ...(row.output !== undefined ? { output: row.output } : {}),
301
+ }));
302
+ }
303
+ toSummary(row) {
304
+ const last = row.messages[row.messages.length - 1];
305
+ return {
306
+ id: row.id,
307
+ title: row.title,
308
+ persona: row.persona,
309
+ transient: row.transient,
310
+ createdAt: row.createdAt,
311
+ updatedAt: row.updatedAt,
312
+ ...(row.pinnedAt !== undefined ? { pinnedAt: row.pinnedAt } : {}),
313
+ ...(last !== undefined ? { lastMessagePreview: last.content.slice(0, 120) } : {}),
314
+ };
315
+ }
316
+ }
317
+ //# sourceMappingURL=in-memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../../../src/testing/in-memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { FakeModelProvider, echoScript, type FakeTurn, type FakeScript, } from './fake-model-provider.js';
2
+ export { InMemoryAgentStore, type GovernanceUsageRow, type GovernanceToolCallRow, type GovernanceThreadRow, type GovernanceRunRow, type GovernanceMessageRow, } from './in-memory-store.js';
3
+ export { InMemoryGovernanceQueries, type InMemoryModelPrice, } from './in-memory-governance-queries.js';
4
+ export { InMemoryTokenStreamSink } from './in-memory-sink.js';
5
+ export { InMemoryActorDirectory } from './in-memory-actor-directory.js';
6
+ export { InMemoryQuotaStore } from './in-memory-quota.js';
7
+ export { InMemoryPricingStore } from './in-memory-pricing.js';
8
+ export { FakeEmbeddingProvider, FakeReranker, inMemoryRetriever, } from './fake-embedding-provider.js';
9
+ export { InMemoryAttachmentStagingStore, type StagedRecord, } from './in-memory-attachment-staging.js';
10
+ export { FakeMediaManager, fakePdfExtractor, inMemoryMediaRagIngestion, } from './fake-media.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,KAAK,kBAAkB,GACxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,8BAA8B,EAC9B,KAAK,YAAY,GAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { FakeModelProvider, echoScript, } from './fake-model-provider.js';
2
+ export { InMemoryAgentStore, } from './in-memory-store.js';
3
+ export { InMemoryGovernanceQueries, } from './in-memory-governance-queries.js';
4
+ export { InMemoryTokenStreamSink } from './in-memory-sink.js';
5
+ export { InMemoryActorDirectory } from './in-memory-actor-directory.js';
6
+ export { InMemoryQuotaStore } from './in-memory-quota.js';
7
+ export { InMemoryPricingStore } from './in-memory-pricing.js';
8
+ export { FakeEmbeddingProvider, FakeReranker, inMemoryRetriever, } from './fake-embedding-provider.js';
9
+ export { InMemoryAttachmentStagingStore, } from './in-memory-attachment-staging.js';
10
+ export { FakeMediaManager, fakePdfExtractor, inMemoryMediaRagIngestion, } from './fake-media.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,UAAU,GAGX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,GAMnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,GAE1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,8BAA8B,GAE/B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type FunctionalTool } from './ai-tool-ref.js';
2
+ import type { ToolRegistry } from './tool-registry.js';
3
+ /** A tool registered at boot, echoed back so the provider can log what it wired. */
4
+ export interface RegisteredTool {
5
+ name: string;
6
+ source: 'class' | 'functional';
7
+ }
8
+ /**
9
+ * Register one module export into the registry if it is an `@AiTool` class or a `defineTool(...)`
10
+ * functional tool; ignore anything else. A name already present is skipped (first wins). Returns the
11
+ * registered descriptor, or `null` when the export was not a tool / duplicated a registered name.
12
+ */
13
+ export declare function registerToolExport(registry: ToolRegistry, exported: unknown, defaultRoles: string[]): RegisteredTool | null;
14
+ /** Register a `defineTool` functional tool, applying `defaultRoles` when it declares none. */
15
+ export declare function registerFunctionalTool(registry: ToolRegistry, tool: FunctionalTool, defaultRoles: string[]): RegisteredTool | null;
16
+ /**
17
+ * Scan `dir` RECURSIVELY for modules and register every exported `@AiTool` class / `defineTool`
18
+ * tool into `registry` — the `app/agent_tools` convention. Only the environment-appropriate extension
19
+ * is imported and each export is visited once (deduped), so a built `.js` and a dev `.ts` of the same
20
+ * module never both register. Missing directory → no-op (the convention is opt-in). `defaultRoles`
21
+ * fills a tool that declares no `roles` (ADMIN-only by default).
22
+ */
23
+ export declare function discoverTools(registry: ToolRegistry, dir: string, defaultRoles: string[]): Promise<RegisteredTool[]>;
24
+ /**
25
+ * The build-time barrel shape the Assembler `init` hook generates for `app/agent_tools`
26
+ * (key → lazy module import), mirroring durable's steps/workflows barrels.
27
+ */
28
+ export type ToolsBarrel = Record<string, () => Promise<Record<string, unknown>>>;
29
+ /**
30
+ * Register every `@AiTool` / `defineTool` reachable from a generated {@link ToolsBarrel} — the
31
+ * build-time equivalent of {@link discoverTools} with no runtime `readdir`. Each module is imported
32
+ * once and each export registered once (deduped).
33
+ */
34
+ export declare function registerToolsFromBarrel(registry: ToolRegistry, barrel: ToolsBarrel, defaultRoles: string[]): Promise<RegisteredTool[]>;
35
+ //# sourceMappingURL=tool-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-discovery.d.ts","sourceRoot":"","sources":["../../src/tool-discovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,cAAc,GAAG,IAAI,CAqBvB;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,cAAc,EACpB,YAAY,EAAE,MAAM,EAAE,GACrB,cAAc,GAAG,IAAI,CAQvB;AA4BD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,cAAc,EAAE,CAAC,CA6B3B;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjF;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,cAAc,EAAE,CAAC,CAiB3B"}
@@ -0,0 +1,45 @@
1
+ import type { StandardSchemaV1 } from '@standard-schema/spec';
2
+ import type { RolesPolicy } from './spi/roles-policy.js';
3
+ import type { AiToolCtx, ToolHandler } from './spi/tool.js';
4
+ import type { Actor, ToolDefinition, ToolSpec } from './types.js';
5
+ /** Thrown when an actor invokes a tool their role is not allowed. */
6
+ export declare class ToolForbiddenError extends Error {
7
+ readonly toolName: string;
8
+ constructor(toolName: string);
9
+ }
10
+ /** Thrown when a tool is invoked that was never registered. */
11
+ export declare class ToolNotFoundError extends Error {
12
+ readonly toolName: string;
13
+ constructor(toolName: string);
14
+ }
15
+ /** Thrown when a tool's input fails its Standard Schema validation. */
16
+ export declare class ToolInputInvalidError extends Error {
17
+ readonly toolName: string;
18
+ readonly issues: readonly StandardSchemaV1.Issue[];
19
+ constructor(toolName: string, issues: readonly StandardSchemaV1.Issue[]);
20
+ }
21
+ /**
22
+ * Holds every registered tool and gates invocation.
23
+ *
24
+ * Note: `definitionsFor` returns NEUTRAL definitions (no `execute`). The agent loop runs
25
+ * each tool itself as a (durable) step — so even read tools are not auto-executed by the
26
+ * model. `action` tools additionally require HITL approval before the loop runs them.
27
+ */
28
+ export declare class ToolRegistry {
29
+ private readonly entries;
30
+ register(spec: ToolSpec, handler: ToolHandler): void;
31
+ has(name: string): boolean;
32
+ spec(name: string): ToolSpec | undefined;
33
+ allSpecs(): ToolSpec[];
34
+ /** The tools to offer the model for this actor+persona, after the two filter layers. */
35
+ definitionsFor(actor: Actor, policy: RolesPolicy, allowedTools?: string[]): Promise<ToolDefinition[]>;
36
+ /** Run a tool. Re-checks the role (defense-in-depth) and re-parses the input via Zod. */
37
+ invoke(name: string, input: unknown, ctx: AiToolCtx, policy: RolesPolicy): Promise<unknown>;
38
+ }
39
+ /** Default gate: one of the actor's roles must be in spec.roles (defaulting to ADMIN-only). */
40
+ export declare class DefaultRolesPolicy implements RolesPolicy {
41
+ private readonly defaultRoles;
42
+ constructor(defaultRoles?: string[]);
43
+ can(actor: Actor, tool: ToolSpec): boolean;
44
+ }
45
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAElE,qEAAqE;AACrE,qBAAa,kBAAmB,SAAQ,KAAK;aACf,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAI7C;AAED,+DAA+D;AAC/D,qBAAa,iBAAkB,SAAQ,KAAK;aACd,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAI7C;AAED,uEAAuE;AACvE,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE;gBADzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE;CAO5D;AAOD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAIpD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIxC,QAAQ,IAAI,QAAQ,EAAE;IAItB,wFAAwF;IAClF,cAAc,CAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC;IAW5B,yFAAyF;IACnF,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC;CAcpB;AAED,+FAA+F;AAC/F,qBAAa,kBAAmB,YAAW,WAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,GAAE,MAAM,EAAc;IAE/D,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;CAI3C"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Transient tool-error classification + the retry loop that wraps a tool's own invocation. A
3
+ * classified-transient error (a DB deadlock, a lock-wait timeout, a serialization failure) means the
4
+ * server rolled the tool's work back — retrying THAT class is safe, unlike a tool's general business
5
+ * failure, which stays a one-shot outcome (no durable step retries: a tool may not be idempotent).
6
+ *
7
+ * `runAgentLoop` wraps `registry.invoke(...)` with {@link invokeWithTransientRetry} INSIDE the
8
+ * `tool:<call.id>` step body — so under durable replay the whole step is memoized on its successful
9
+ * result and a retry never becomes a new checkpoint; history still shows exactly one step per tool
10
+ * call and side effects run once.
11
+ */
12
+ /**
13
+ * Default transient-tool-error classifier: true for a recognized MySQL/Postgres/SQLite
14
+ * lock-contention shape (by driver `code`/`errno`/`sqlState`, or a matching message), checked on the
15
+ * error itself and one level of `cause` (drivers commonly wrap the original error). A plain `Error`
16
+ * with none of these markers — any other business failure — is `false`.
17
+ */
18
+ export declare function isTransientToolError(error: unknown): boolean;
19
+ /** Total attempts (initial try + retries) when `toolTransientRetry` doesn't set `attempts`. */
20
+ export declare const DEFAULT_TOOL_TRANSIENT_RETRY_ATTEMPTS = 2;
21
+ /** Backoff base in ms — the wait between attempt N and N+1 is `backoffMs * N`. */
22
+ export declare const DEFAULT_TOOL_TRANSIENT_RETRY_BACKOFF_MS = 150;
23
+ /** The host-configurable policy — everything, including the (in-process) `classify` fn. */
24
+ export interface ToolTransientRetryOptions {
25
+ /** Total attempts (initial try + retries). Defaults to {@link DEFAULT_TOOL_TRANSIENT_RETRY_ATTEMPTS}. */
26
+ attempts?: number;
27
+ /** Backoff base in ms. Defaults to {@link DEFAULT_TOOL_TRANSIENT_RETRY_BACKOFF_MS}. */
28
+ backoffMs?: number;
29
+ /** Overrides the default classifier — widen or narrow which errors are treated as transient. */
30
+ classify?: (error: unknown) => boolean;
31
+ }
32
+ /** `false` disables transient retry entirely — a tool's own thrown error surfaces immediately. */
33
+ export type ToolTransientRetrySetting = ToolTransientRetryOptions | false;
34
+ export interface InvokeWithTransientRetryOptions {
35
+ /**
36
+ * Recognizes the runner's control-flow signals (durable suspend / continue-as-new) so a retry
37
+ * never swallows one — same rule the loop's tool catch already applies. Undefined for a call site
38
+ * with no such notion (e.g. the inline runner, which has no workflow ctx to suspend on).
39
+ */
40
+ isControlFlowError?: (error: unknown) => boolean;
41
+ /**
42
+ * Called before each wait-and-retry, with the 1-based ordinal of the attempt that just failed and
43
+ * the error it threw. The call site uses this to emit the `tool.retry` diagnostics event —
44
+ * `invokeWithTransientRetry` itself carries no tool identity (name/callId), only the thunk.
45
+ */
46
+ onRetry?: (attempt: number, error: unknown) => void;
47
+ }
48
+ /**
49
+ * Retries `fn` in place — never a new durable step/checkpoint, just repeated attempts inside
50
+ * whichever step body already wraps this call. `setting: false` runs `fn` once, unwrapped (no
51
+ * classify/backoff bookkeeping at all). Otherwise: try; on a thrown error, rethrow immediately if
52
+ * it's a recognized control-flow signal, else if the (possibly custom) classifier calls it transient
53
+ * AND attempts remain, wait `backoffMs * attemptNumber` and retry; otherwise rethrow the error as-is.
54
+ */
55
+ export declare function invokeWithTransientRetry<T>(fn: () => Promise<T>, setting: ToolTransientRetrySetting, options?: InvokeWithTransientRetryOptions): Promise<T>;
56
+ //# sourceMappingURL=tool-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-retry.d.ts","sourceRoot":"","sources":["../../src/tool-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA4BH;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAED,+FAA+F;AAC/F,eAAO,MAAM,qCAAqC,IAAI,CAAC;AACvD,kFAAkF;AAClF,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAE3D,2FAA2F;AAC3F,MAAM,WAAW,yBAAyB;IACxC,yGAAyG;IACzG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CACxC;AAED,kGAAkG;AAClG,MAAM,MAAM,yBAAyB,GAAG,yBAAyB,GAAG,KAAK,CAAC;AAE1E,MAAM,WAAW,+BAA+B;IAC9C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACjD;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAQD;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,EAAE,yBAAyB,EAClC,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Transient tool-error classification + the retry loop that wraps a tool's own invocation. A
3
+ * classified-transient error (a DB deadlock, a lock-wait timeout, a serialization failure) means the
4
+ * server rolled the tool's work back — retrying THAT class is safe, unlike a tool's general business
5
+ * failure, which stays a one-shot outcome (no durable step retries: a tool may not be idempotent).
6
+ *
7
+ * `runAgentLoop` wraps `registry.invoke(...)` with {@link invokeWithTransientRetry} INSIDE the
8
+ * `tool:<call.id>` step body — so under durable replay the whole step is memoized on its successful
9
+ * result and a retry never becomes a new checkpoint; history still shows exactly one step per tool
10
+ * call and side effects run once.
11
+ */
12
+ /** Narrow, structural check for a MySQL/Postgres/SQLite transient error shape — no casts. */
13
+ function hasTransientShape(error) {
14
+ if (typeof error !== 'object' || error === null) {
15
+ return false;
16
+ }
17
+ const code = 'code' in error ? error.code : undefined;
18
+ const errno = 'errno' in error ? error.errno : undefined;
19
+ const sqlState = 'sqlState' in error ? error.sqlState : undefined;
20
+ if (code === 1213 || code === 1205 || errno === 1213 || errno === 1205) {
21
+ return true; // MySQL ER_LOCK_DEADLOCK / ER_LOCK_WAIT_TIMEOUT numeric codes
22
+ }
23
+ if (code === 'ER_LOCK_DEADLOCK' || code === 'ER_LOCK_WAIT_TIMEOUT') {
24
+ return true; // MySQL driver string codes
25
+ }
26
+ if (code === '40001' || code === '40P01' || sqlState === '40001' || sqlState === '40P01') {
27
+ return true; // Postgres serialization_failure / deadlock_detected SQLSTATEs
28
+ }
29
+ if (code === 'SQLITE_BUSY') {
30
+ return true;
31
+ }
32
+ const message = 'message' in error ? error.message : undefined;
33
+ return (typeof message === 'string' && /deadlock|lock wait timeout|serialization failure/i.test(message));
34
+ }
35
+ /**
36
+ * Default transient-tool-error classifier: true for a recognized MySQL/Postgres/SQLite
37
+ * lock-contention shape (by driver `code`/`errno`/`sqlState`, or a matching message), checked on the
38
+ * error itself and one level of `cause` (drivers commonly wrap the original error). A plain `Error`
39
+ * with none of these markers — any other business failure — is `false`.
40
+ */
41
+ export function isTransientToolError(error) {
42
+ if (hasTransientShape(error)) {
43
+ return true;
44
+ }
45
+ if (typeof error === 'object' && error !== null && 'cause' in error) {
46
+ const cause = error.cause;
47
+ if (cause !== undefined && cause !== error && hasTransientShape(cause)) {
48
+ return true;
49
+ }
50
+ }
51
+ return false;
52
+ }
53
+ /** Total attempts (initial try + retries) when `toolTransientRetry` doesn't set `attempts`. */
54
+ export const DEFAULT_TOOL_TRANSIENT_RETRY_ATTEMPTS = 2;
55
+ /** Backoff base in ms — the wait between attempt N and N+1 is `backoffMs * N`. */
56
+ export const DEFAULT_TOOL_TRANSIENT_RETRY_BACKOFF_MS = 150;
57
+ function delay(ms) {
58
+ return new Promise((resolve) => {
59
+ setTimeout(resolve, ms);
60
+ });
61
+ }
62
+ /**
63
+ * Retries `fn` in place — never a new durable step/checkpoint, just repeated attempts inside
64
+ * whichever step body already wraps this call. `setting: false` runs `fn` once, unwrapped (no
65
+ * classify/backoff bookkeeping at all). Otherwise: try; on a thrown error, rethrow immediately if
66
+ * it's a recognized control-flow signal, else if the (possibly custom) classifier calls it transient
67
+ * AND attempts remain, wait `backoffMs * attemptNumber` and retry; otherwise rethrow the error as-is.
68
+ */
69
+ export async function invokeWithTransientRetry(fn, setting, options) {
70
+ if (setting === false) {
71
+ return fn();
72
+ }
73
+ const attempts = setting.attempts ?? DEFAULT_TOOL_TRANSIENT_RETRY_ATTEMPTS;
74
+ const backoffMs = setting.backoffMs ?? DEFAULT_TOOL_TRANSIENT_RETRY_BACKOFF_MS;
75
+ const classify = setting.classify ?? isTransientToolError;
76
+ let attempt = 1;
77
+ for (;;) {
78
+ try {
79
+ return await fn();
80
+ }
81
+ catch (error) {
82
+ if (options?.isControlFlowError?.(error) === true) {
83
+ throw error;
84
+ }
85
+ const attemptsRemain = attempt < attempts;
86
+ if (!attemptsRemain || !classify(error)) {
87
+ throw error;
88
+ }
89
+ options?.onRetry?.(attempt, error);
90
+ await delay(backoffMs * attempt);
91
+ attempt += 1;
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=tool-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-retry.js","sourceRoot":"","sources":["../../src/tool-retry.ts"],"names":[],"mappings":"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"}