@retinue/agentkit 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 (405) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +310 -0
  3. package/dist/adapters/bullmq/consumer.d.ts +33 -0
  4. package/dist/adapters/bullmq/consumer.js +41 -0
  5. package/dist/adapters/bullmq/dispatcher.d.ts +74 -0
  6. package/dist/adapters/bullmq/dispatcher.js +160 -0
  7. package/dist/adapters/bullmq/export.d.ts +31 -0
  8. package/dist/adapters/bullmq/export.js +53 -0
  9. package/dist/adapters/bullmq/extraction.d.ts +42 -0
  10. package/dist/adapters/bullmq/extraction.js +63 -0
  11. package/dist/adapters/bullmq/index.d.ts +13 -0
  12. package/dist/adapters/bullmq/index.js +13 -0
  13. package/dist/adapters/bullmq/lock.d.ts +77 -0
  14. package/dist/adapters/bullmq/lock.js +126 -0
  15. package/dist/adapters/bullmq/queue.d.ts +50 -0
  16. package/dist/adapters/bullmq/queue.js +81 -0
  17. package/dist/adapters/memory/artifact-exports.d.ts +11 -0
  18. package/dist/adapters/memory/artifact-exports.js +102 -0
  19. package/dist/adapters/memory/artifacts.d.ts +15 -0
  20. package/dist/adapters/memory/artifacts.js +134 -0
  21. package/dist/adapters/memory/blobs.d.ts +7 -0
  22. package/dist/adapters/memory/blobs.js +27 -0
  23. package/dist/adapters/memory/evaluation.d.ts +18 -0
  24. package/dist/adapters/memory/evaluation.js +148 -0
  25. package/dist/adapters/memory/files.d.ts +27 -0
  26. package/dist/adapters/memory/files.js +0 -0
  27. package/dist/adapters/memory/flows.d.ts +16 -0
  28. package/dist/adapters/memory/flows.js +117 -0
  29. package/dist/adapters/memory/hitl.d.ts +9 -0
  30. package/dist/adapters/memory/hitl.js +130 -0
  31. package/dist/adapters/memory/idempotency.d.ts +13 -0
  32. package/dist/adapters/memory/idempotency.js +32 -0
  33. package/dist/adapters/memory/index.d.ts +39 -0
  34. package/dist/adapters/memory/index.js +107 -0
  35. package/dist/adapters/memory/knowledge.d.ts +43 -0
  36. package/dist/adapters/memory/knowledge.js +248 -0
  37. package/dist/adapters/memory/mcp.d.ts +9 -0
  38. package/dist/adapters/memory/mcp.js +37 -0
  39. package/dist/adapters/memory/message-store.d.ts +17 -0
  40. package/dist/adapters/memory/message-store.js +70 -0
  41. package/dist/adapters/memory/principal-memory.d.ts +7 -0
  42. package/dist/adapters/memory/principal-memory.js +83 -0
  43. package/dist/adapters/memory/runtime.d.ts +29 -0
  44. package/dist/adapters/memory/runtime.js +0 -0
  45. package/dist/adapters/memory/sessions.d.ts +29 -0
  46. package/dist/adapters/memory/sessions.js +0 -0
  47. package/dist/adapters/memory/skills.d.ts +10 -0
  48. package/dist/adapters/memory/skills.js +41 -0
  49. package/dist/adapters/memory/thread-summary.d.ts +7 -0
  50. package/dist/adapters/memory/thread-summary.js +29 -0
  51. package/dist/adapters/memory/usage-limits.d.ts +13 -0
  52. package/dist/adapters/memory/usage-limits.js +72 -0
  53. package/dist/adapters/memory/usage.d.ts +16 -0
  54. package/dist/adapters/memory/usage.js +279 -0
  55. package/dist/adapters/otel/index.d.ts +111 -0
  56. package/dist/adapters/otel/index.js +133 -0
  57. package/dist/adapters/postgres/artifact-exports.d.ts +12 -0
  58. package/dist/adapters/postgres/artifact-exports.js +117 -0
  59. package/dist/adapters/postgres/artifacts.d.ts +16 -0
  60. package/dist/adapters/postgres/artifacts.js +172 -0
  61. package/dist/adapters/postgres/checkpoint-store.d.ts +16 -0
  62. package/dist/adapters/postgres/checkpoint-store.js +34 -0
  63. package/dist/adapters/postgres/config.d.ts +15 -0
  64. package/dist/adapters/postgres/config.js +187 -0
  65. package/dist/adapters/postgres/conversation-store.d.ts +4 -0
  66. package/dist/adapters/postgres/conversation-store.js +82 -0
  67. package/dist/adapters/postgres/evaluation.d.ts +17 -0
  68. package/dist/adapters/postgres/evaluation.js +193 -0
  69. package/dist/adapters/postgres/file-content.d.ts +30 -0
  70. package/dist/adapters/postgres/file-content.js +111 -0
  71. package/dist/adapters/postgres/files.d.ts +19 -0
  72. package/dist/adapters/postgres/files.js +209 -0
  73. package/dist/adapters/postgres/flows.d.ts +20 -0
  74. package/dist/adapters/postgres/flows.js +206 -0
  75. package/dist/adapters/postgres/hitl.d.ts +5 -0
  76. package/dist/adapters/postgres/hitl.js +247 -0
  77. package/dist/adapters/postgres/index.d.ts +35 -0
  78. package/dist/adapters/postgres/index.js +35 -0
  79. package/dist/adapters/postgres/knowledge.d.ts +48 -0
  80. package/dist/adapters/postgres/knowledge.js +255 -0
  81. package/dist/adapters/postgres/memory.d.ts +14 -0
  82. package/dist/adapters/postgres/memory.js +194 -0
  83. package/dist/adapters/postgres/message-store.d.ts +11 -0
  84. package/dist/adapters/postgres/message-store.js +145 -0
  85. package/dist/adapters/postgres/migrations.d.ts +69 -0
  86. package/dist/adapters/postgres/migrations.js +1594 -0
  87. package/dist/adapters/postgres/pg-executor.d.ts +19 -0
  88. package/dist/adapters/postgres/pg-executor.js +32 -0
  89. package/dist/adapters/postgres/retention.d.ts +26 -0
  90. package/dist/adapters/postgres/retention.js +59 -0
  91. package/dist/adapters/postgres/rollups.d.ts +17 -0
  92. package/dist/adapters/postgres/rollups.js +267 -0
  93. package/dist/adapters/postgres/run-coordinator.d.ts +5 -0
  94. package/dist/adapters/postgres/run-coordinator.js +98 -0
  95. package/dist/adapters/postgres/run-event-log.d.ts +26 -0
  96. package/dist/adapters/postgres/run-event-log.js +30 -0
  97. package/dist/adapters/postgres/run-store.d.ts +4 -0
  98. package/dist/adapters/postgres/run-store.js +199 -0
  99. package/dist/adapters/postgres/schema.d.ts +39 -0
  100. package/dist/adapters/postgres/schema.js +70 -0
  101. package/dist/adapters/postgres/session-state.d.ts +7 -0
  102. package/dist/adapters/postgres/session-state.js +99 -0
  103. package/dist/adapters/postgres/sql.d.ts +8 -0
  104. package/dist/adapters/postgres/sql.js +2 -0
  105. package/dist/adapters/postgres/transaction.d.ts +37 -0
  106. package/dist/adapters/postgres/transaction.js +93 -0
  107. package/dist/adapters/postgres/unit-of-work.d.ts +18 -0
  108. package/dist/adapters/postgres/unit-of-work.js +8 -0
  109. package/dist/adapters/postgres/usage-limits.d.ts +15 -0
  110. package/dist/adapters/postgres/usage-limits.js +136 -0
  111. package/dist/adapters/postgres/usage.d.ts +15 -0
  112. package/dist/adapters/postgres/usage.js +226 -0
  113. package/dist/adapters/redis/index.d.ts +9 -0
  114. package/dist/adapters/redis/index.js +9 -0
  115. package/dist/adapters/redis/realtime.d.ts +74 -0
  116. package/dist/adapters/redis/realtime.js +112 -0
  117. package/dist/adapters/supabase/index.d.ts +88 -0
  118. package/dist/adapters/supabase/index.js +84 -0
  119. package/dist/adapters/supabase/realtime.d.ts +30 -0
  120. package/dist/adapters/supabase/realtime.js +53 -0
  121. package/dist/adapters/supabase/rls.d.ts +99 -0
  122. package/dist/adapters/supabase/rls.js +216 -0
  123. package/dist/adapters/supabase/storage.d.ts +50 -0
  124. package/dist/adapters/supabase/storage.js +207 -0
  125. package/dist/agents/agent.d.ts +66 -0
  126. package/dist/agents/agent.js +209 -0
  127. package/dist/agents/define.d.ts +21 -0
  128. package/dist/agents/define.js +63 -0
  129. package/dist/agents/engine.d.ts +98 -0
  130. package/dist/agents/engine.js +462 -0
  131. package/dist/agents/index.d.ts +50 -0
  132. package/dist/agents/index.js +17 -0
  133. package/dist/artifacts/index.d.ts +114 -0
  134. package/dist/artifacts/index.js +219 -0
  135. package/dist/authorization/index.d.ts +76 -0
  136. package/dist/authorization/index.js +76 -0
  137. package/dist/capabilities/index.d.ts +120 -0
  138. package/dist/capabilities/index.js +167 -0
  139. package/dist/capabilities/runtime.d.ts +89 -0
  140. package/dist/capabilities/runtime.js +84 -0
  141. package/dist/citations/index.d.ts +161 -0
  142. package/dist/citations/index.js +182 -0
  143. package/dist/context/assembler.d.ts +82 -0
  144. package/dist/context/assembler.js +129 -0
  145. package/dist/context/compaction.d.ts +45 -0
  146. package/dist/context/compaction.js +55 -0
  147. package/dist/context/index.d.ts +75 -0
  148. package/dist/context/index.js +17 -0
  149. package/dist/core/content-parts.d.ts +194 -0
  150. package/dist/core/content-parts.js +23 -0
  151. package/dist/core/context.d.ts +51 -0
  152. package/dist/core/context.js +9 -0
  153. package/dist/core/env.d.ts +25 -0
  154. package/dist/core/env.js +41 -0
  155. package/dist/core/errors.d.ts +30 -0
  156. package/dist/core/errors.js +65 -0
  157. package/dist/core/events.d.ts +139 -0
  158. package/dist/core/events.js +99 -0
  159. package/dist/core/ids.d.ts +52 -0
  160. package/dist/core/ids.js +13 -0
  161. package/dist/core/index.d.ts +9 -0
  162. package/dist/core/index.js +9 -0
  163. package/dist/core/tokens.d.ts +22 -0
  164. package/dist/core/tokens.js +22 -0
  165. package/dist/core/validation.d.ts +34 -0
  166. package/dist/core/validation.js +176 -0
  167. package/dist/documents/extraction.d.ts +121 -0
  168. package/dist/documents/extraction.js +293 -0
  169. package/dist/documents/index.d.ts +199 -0
  170. package/dist/documents/index.js +65 -0
  171. package/dist/documents/parsers/pdf.d.ts +47 -0
  172. package/dist/documents/parsers/pdf.js +508 -0
  173. package/dist/documents/parsers/text.d.ts +59 -0
  174. package/dist/documents/parsers/text.js +325 -0
  175. package/dist/documents/read-tool.d.ts +52 -0
  176. package/dist/documents/read-tool.js +109 -0
  177. package/dist/documents/render.d.ts +29 -0
  178. package/dist/documents/render.js +59 -0
  179. package/dist/documents/vision.d.ts +159 -0
  180. package/dist/documents/vision.js +214 -0
  181. package/dist/entries/adapters-bullmq.d.ts +8 -0
  182. package/dist/entries/adapters-bullmq.js +8 -0
  183. package/dist/entries/adapters-otel.d.ts +13 -0
  184. package/dist/entries/adapters-otel.js +13 -0
  185. package/dist/entries/adapters-postgres.d.ts +10 -0
  186. package/dist/entries/adapters-postgres.js +10 -0
  187. package/dist/entries/adapters-redis.d.ts +3 -0
  188. package/dist/entries/adapters-redis.js +3 -0
  189. package/dist/entries/context.d.ts +20 -0
  190. package/dist/entries/context.js +20 -0
  191. package/dist/entries/flows.d.ts +15 -0
  192. package/dist/entries/flows.js +15 -0
  193. package/dist/entries/hitl.d.ts +10 -0
  194. package/dist/entries/hitl.js +10 -0
  195. package/dist/entries/knowledge.d.ts +18 -0
  196. package/dist/entries/knowledge.js +19 -0
  197. package/dist/entries/mcp.d.ts +10 -0
  198. package/dist/entries/mcp.js +10 -0
  199. package/dist/entries/observability.d.ts +14 -0
  200. package/dist/entries/observability.js +16 -0
  201. package/dist/entries/persistence.d.ts +11 -0
  202. package/dist/entries/persistence.js +11 -0
  203. package/dist/entries/providers.d.ts +14 -0
  204. package/dist/entries/providers.js +14 -0
  205. package/dist/entries/runtime.d.ts +13 -0
  206. package/dist/entries/runtime.js +13 -0
  207. package/dist/entries/server.d.ts +24 -0
  208. package/dist/entries/server.js +24 -0
  209. package/dist/entries/tools.d.ts +21 -0
  210. package/dist/entries/tools.js +21 -0
  211. package/dist/entries/usage.d.ts +10 -0
  212. package/dist/entries/usage.js +10 -0
  213. package/dist/evaluation/gate.d.ts +168 -0
  214. package/dist/evaluation/gate.js +180 -0
  215. package/dist/evaluation/graders.d.ts +125 -0
  216. package/dist/evaluation/graders.js +203 -0
  217. package/dist/evaluation/index.d.ts +120 -0
  218. package/dist/evaluation/index.js +183 -0
  219. package/dist/evaluation/judge.d.ts +75 -0
  220. package/dist/evaluation/judge.js +111 -0
  221. package/dist/export/index.d.ts +162 -0
  222. package/dist/export/index.js +363 -0
  223. package/dist/export/markdown.d.ts +19 -0
  224. package/dist/export/markdown.js +29 -0
  225. package/dist/export/pdf.d.ts +73 -0
  226. package/dist/export/pdf.js +407 -0
  227. package/dist/files/context.d.ts +97 -0
  228. package/dist/files/context.js +185 -0
  229. package/dist/files/index.d.ts +210 -0
  230. package/dist/files/index.js +338 -0
  231. package/dist/files/read-tool.d.ts +81 -0
  232. package/dist/files/read-tool.js +163 -0
  233. package/dist/files/turn-parts.d.ts +96 -0
  234. package/dist/files/turn-parts.js +171 -0
  235. package/dist/flows/index.d.ts +270 -0
  236. package/dist/flows/index.js +62 -0
  237. package/dist/flows/interpreter.d.ts +146 -0
  238. package/dist/flows/interpreter.js +426 -0
  239. package/dist/flows/runner.d.ts +145 -0
  240. package/dist/flows/runner.js +270 -0
  241. package/dist/graphql/index.d.ts +8 -0
  242. package/dist/graphql/index.js +8 -0
  243. package/dist/graphql/resolvers.d.ts +237 -0
  244. package/dist/graphql/resolvers.js +253 -0
  245. package/dist/graphql/schema.d.ts +11 -0
  246. package/dist/graphql/schema.js +258 -0
  247. package/dist/graphql/sse.d.ts +77 -0
  248. package/dist/graphql/sse.js +100 -0
  249. package/dist/hitl/approved-execution.d.ts +127 -0
  250. package/dist/hitl/approved-execution.js +177 -0
  251. package/dist/hitl/index.d.ts +79 -0
  252. package/dist/hitl/index.js +12 -0
  253. package/dist/hitl/service.d.ts +221 -0
  254. package/dist/hitl/service.js +268 -0
  255. package/dist/idempotency/index.d.ts +70 -0
  256. package/dist/idempotency/index.js +59 -0
  257. package/dist/index.d.ts +103 -0
  258. package/dist/index.js +60 -0
  259. package/dist/knowledge/chunking.d.ts +57 -0
  260. package/dist/knowledge/chunking.js +158 -0
  261. package/dist/knowledge/index.d.ts +119 -0
  262. package/dist/knowledge/index.js +166 -0
  263. package/dist/knowledge/retrieval.d.ts +146 -0
  264. package/dist/knowledge/retrieval.js +170 -0
  265. package/dist/loadtest/harness.d.ts +168 -0
  266. package/dist/loadtest/harness.js +507 -0
  267. package/dist/loadtest/index.d.ts +13 -0
  268. package/dist/loadtest/index.js +13 -0
  269. package/dist/loadtest/injection.d.ts +89 -0
  270. package/dist/loadtest/injection.js +147 -0
  271. package/dist/loadtest/metrics.d.ts +197 -0
  272. package/dist/loadtest/metrics.js +160 -0
  273. package/dist/loadtest/runbooks.d.ts +28 -0
  274. package/dist/loadtest/runbooks.js +159 -0
  275. package/dist/loadtest/scenario.d.ts +104 -0
  276. package/dist/loadtest/scenario.js +208 -0
  277. package/dist/mcp/egress.d.ts +53 -0
  278. package/dist/mcp/egress.js +115 -0
  279. package/dist/mcp/index.d.ts +93 -0
  280. package/dist/mcp/index.js +33 -0
  281. package/dist/mcp/provider.d.ts +62 -0
  282. package/dist/mcp/provider.js +0 -0
  283. package/dist/models/index.d.ts +98 -0
  284. package/dist/models/index.js +74 -0
  285. package/dist/models/pricing.d.ts +24 -0
  286. package/dist/models/pricing.js +37 -0
  287. package/dist/models/provider-factory.d.ts +31 -0
  288. package/dist/models/provider-factory.js +67 -0
  289. package/dist/models/streaming.d.ts +145 -0
  290. package/dist/models/streaming.js +272 -0
  291. package/dist/models/vision.d.ts +38 -0
  292. package/dist/models/vision.js +62 -0
  293. package/dist/persistence/index.d.ts +1654 -0
  294. package/dist/persistence/index.js +226 -0
  295. package/dist/principal-memory/index.d.ts +106 -0
  296. package/dist/principal-memory/index.js +89 -0
  297. package/dist/retention/index.d.ts +89 -0
  298. package/dist/retention/index.js +70 -0
  299. package/dist/runtime/checkpoint.d.ts +37 -0
  300. package/dist/runtime/checkpoint.js +22 -0
  301. package/dist/runtime/index.d.ts +118 -0
  302. package/dist/runtime/index.js +69 -0
  303. package/dist/runtime/retry.d.ts +95 -0
  304. package/dist/runtime/retry.js +126 -0
  305. package/dist/runtime/serialization.d.ts +85 -0
  306. package/dist/runtime/serialization.js +95 -0
  307. package/dist/runtime/streaming.d.ts +54 -0
  308. package/dist/runtime/streaming.js +115 -0
  309. package/dist/runtime/worker.d.ts +130 -0
  310. package/dist/runtime/worker.js +405 -0
  311. package/dist/security/checklist.d.ts +53 -0
  312. package/dist/security/checklist.js +204 -0
  313. package/dist/security/findings.d.ts +56 -0
  314. package/dist/security/findings.js +168 -0
  315. package/dist/security/index.d.ts +14 -0
  316. package/dist/security/index.js +14 -0
  317. package/dist/security/prompt-safety.d.ts +100 -0
  318. package/dist/security/prompt-safety.js +133 -0
  319. package/dist/server/boot.d.ts +32 -0
  320. package/dist/server/boot.js +36 -0
  321. package/dist/server/cli-worker.d.ts +37 -0
  322. package/dist/server/cli-worker.js +151 -0
  323. package/dist/server/cli.d.ts +27 -0
  324. package/dist/server/cli.js +74 -0
  325. package/dist/server/config.d.ts +42 -0
  326. package/dist/server/config.js +127 -0
  327. package/dist/server/health.d.ts +59 -0
  328. package/dist/server/health.js +90 -0
  329. package/dist/server/host.d.ts +39 -0
  330. package/dist/server/host.js +124 -0
  331. package/dist/server/index.d.ts +15 -0
  332. package/dist/server/index.js +15 -0
  333. package/dist/server/main.d.ts +16 -0
  334. package/dist/server/main.js +31 -0
  335. package/dist/server/sse-route.d.ts +21 -0
  336. package/dist/server/sse-route.js +282 -0
  337. package/dist/skills/index.d.ts +67 -0
  338. package/dist/skills/index.js +31 -0
  339. package/dist/skills/resolver.d.ts +54 -0
  340. package/dist/skills/resolver.js +121 -0
  341. package/dist/teams/index.d.ts +93 -0
  342. package/dist/teams/index.js +207 -0
  343. package/dist/telemetry/index.d.ts +157 -0
  344. package/dist/telemetry/index.js +71 -0
  345. package/dist/telemetry/instrument.d.ts +108 -0
  346. package/dist/telemetry/instrument.js +232 -0
  347. package/dist/telemetry/log-events.d.ts +17 -0
  348. package/dist/telemetry/log-events.js +58 -0
  349. package/dist/telemetry/metrics.d.ts +123 -0
  350. package/dist/telemetry/metrics.js +135 -0
  351. package/dist/telemetry/noop.d.ts +39 -0
  352. package/dist/telemetry/noop.js +143 -0
  353. package/dist/telemetry/redaction.d.ts +64 -0
  354. package/dist/telemetry/redaction.js +153 -0
  355. package/dist/telemetry/spans.d.ts +56 -0
  356. package/dist/telemetry/spans.js +78 -0
  357. package/dist/telemetry/trace-context.d.ts +55 -0
  358. package/dist/telemetry/trace-context.js +60 -0
  359. package/dist/toolkit/compute.d.ts +53 -0
  360. package/dist/toolkit/compute.js +152 -0
  361. package/dist/toolkit/data.d.ts +98 -0
  362. package/dist/toolkit/data.js +235 -0
  363. package/dist/toolkit/http.d.ts +113 -0
  364. package/dist/toolkit/http.js +205 -0
  365. package/dist/toolkit/index.d.ts +21 -0
  366. package/dist/toolkit/index.js +17 -0
  367. package/dist/toolkit/web.d.ts +107 -0
  368. package/dist/toolkit/web.js +147 -0
  369. package/dist/tools/define.d.ts +25 -0
  370. package/dist/tools/define.js +45 -0
  371. package/dist/tools/delegating.d.ts +132 -0
  372. package/dist/tools/delegating.js +211 -0
  373. package/dist/tools/index.d.ts +129 -0
  374. package/dist/tools/index.js +33 -0
  375. package/dist/tools/library/compute.d.ts +11 -0
  376. package/dist/tools/library/compute.js +46 -0
  377. package/dist/tools/library/data.d.ts +16 -0
  378. package/dist/tools/library/data.js +92 -0
  379. package/dist/tools/library/http.d.ts +28 -0
  380. package/dist/tools/library/http.js +71 -0
  381. package/dist/tools/library/index.d.ts +97 -0
  382. package/dist/tools/library/index.js +134 -0
  383. package/dist/tools/library/knowledge.d.ts +39 -0
  384. package/dist/tools/library/knowledge.js +58 -0
  385. package/dist/tools/library/web.d.ts +19 -0
  386. package/dist/tools/library/web.js +65 -0
  387. package/dist/tools/meta-tools.d.ts +19 -0
  388. package/dist/tools/meta-tools.js +36 -0
  389. package/dist/tools/registry.d.ts +146 -0
  390. package/dist/tools/registry.js +291 -0
  391. package/dist/usage/index.d.ts +105 -0
  392. package/dist/usage/index.js +20 -0
  393. package/dist/usage/quota.d.ts +258 -0
  394. package/dist/usage/quota.js +510 -0
  395. package/dist/usage/recorder.d.ts +29 -0
  396. package/dist/usage/recorder.js +96 -0
  397. package/dist/usage/rollups.d.ts +121 -0
  398. package/dist/usage/rollups.js +157 -0
  399. package/dist/worker/export.d.ts +57 -0
  400. package/dist/worker/export.js +81 -0
  401. package/dist/worker/extraction.d.ts +57 -0
  402. package/dist/worker/extraction.js +84 -0
  403. package/dist/worker/main.d.ts +103 -0
  404. package/dist/worker/main.js +159 -0
  405. package/package.json +187 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * In-memory `ArtifactExportStore` — the reference implementation (#134).
3
+ *
4
+ * The only interesting behaviour is `claim`, and it is interesting for one reason: **it must be a claim, not
5
+ * an insert.** Two requests for the same PDF must produce one render, and the second must be told so rather
6
+ * than starting a duplicate. A blind insert would render the same document twice and leave two rows pointing
7
+ * at two identical files.
8
+ */
9
+ import { AgentPlatformError } from "../../core/errors.js";
10
+ const tenantMap = (outer, tenantId) => {
11
+ let inner = outer.get(tenantId);
12
+ if (!inner)
13
+ outer.set(tenantId, (inner = new Map()));
14
+ return inner;
15
+ };
16
+ /** The uniqueness the store enforces: one export per version per format. */
17
+ const slotKey = (artifactId, version, format) => `${artifactId} ${version} ${format}`;
18
+ const assertTimestamp = (at, field) => {
19
+ if (Number.isNaN(Date.parse(at)))
20
+ throw new AgentPlatformError({
21
+ code: "invalid_input",
22
+ message: `${field} must be an ISO timestamp, got ${JSON.stringify(at)}`,
23
+ retryable: false,
24
+ });
25
+ };
26
+ /** Keyset on `(createdAt, id)`, matching the Postgres adapter's encoding so the conformance suite exercises
27
+ * the real contract rather than a simpler one the reference adapter happened to have. */
28
+ const encodeCursor = (createdAt, id) => Buffer.from(`${createdAt} ${id}`, "utf8").toString("base64url");
29
+ const decodeCursor = (cursor) => {
30
+ const [createdAt, id] = Buffer.from(cursor, "base64url").toString("utf8").split(" ");
31
+ return createdAt === undefined || id === undefined ? null : { createdAt, id };
32
+ };
33
+ const paginate = (rows, limit, cursor) => {
34
+ const sorted = [...rows].sort((a, b) => a.createdAt === b.createdAt ? a.id.localeCompare(b.id) : a.createdAt.localeCompare(b.createdAt));
35
+ const after = cursor === undefined ? null : decodeCursor(cursor);
36
+ const start = after === null
37
+ ? 0
38
+ : sorted.findIndex((r) => r.createdAt > after.createdAt || (r.createdAt === after.createdAt && r.id > after.id));
39
+ const from = start < 0 ? sorted.length : start;
40
+ const items = sorted.slice(from, from + limit);
41
+ const last = items[items.length - 1];
42
+ return from + limit < sorted.length && last !== undefined
43
+ ? { items, nextCursor: encodeCursor(last.createdAt, last.id) }
44
+ : { items };
45
+ };
46
+ export const createMemoryArtifactExportStore = () => {
47
+ const byTenant = new Map();
48
+ const slots = new Map();
49
+ return {
50
+ async claim({ tenantId, export: requested }) {
51
+ assertTimestamp(requested.createdAt, "createdAt");
52
+ const rows = tenantMap(byTenant, tenantId);
53
+ const slotIndex = tenantMap(slots, tenantId);
54
+ const key = slotKey(requested.artifactId, requested.version, requested.format);
55
+ const existingId = slotIndex.get(key);
56
+ if (existingId !== undefined) {
57
+ const existing = rows.get(existingId);
58
+ // The slot is taken. Returned rather than refused, because the caller's next move is the same either
59
+ // way: read this row. `claimed: false` is what stops it *rendering*.
60
+ if (existing !== undefined)
61
+ return { claimed: false, export: existing };
62
+ }
63
+ const created = { ...requested, state: "pending" };
64
+ rows.set(created.id, created);
65
+ slotIndex.set(key, created.id);
66
+ return { claimed: true, export: created };
67
+ },
68
+ async complete({ tenantId, id, state, fileId, byteSize, checksum, failureReason, failureMessage, at }) {
69
+ assertTimestamp(at, "at");
70
+ const rows = tenantMap(byTenant, tenantId);
71
+ const existing = rows.get(id);
72
+ // Absent means the export was removed under the worker. Reported rather than thrown: an ordinary race,
73
+ // and a worker that threw would retry a row that no longer exists.
74
+ if (existing === undefined)
75
+ return { recorded: false };
76
+ rows.set(id, {
77
+ ...existing,
78
+ state,
79
+ ...(fileId === undefined ? {} : { fileId }),
80
+ ...(byteSize === undefined ? {} : { byteSize }),
81
+ ...(checksum === undefined ? {} : { checksum }),
82
+ ...(failureReason === undefined ? {} : { failureReason }),
83
+ ...(failureMessage === undefined ? {} : { failureMessage }),
84
+ renderedAt: at,
85
+ });
86
+ return { recorded: true };
87
+ },
88
+ async get({ tenantId, id }) {
89
+ // Absent from *this tenant's* map, so a foreign id is null without a comparison anyone could get wrong.
90
+ return tenantMap(byTenant, tenantId).get(id) ?? null;
91
+ },
92
+ async find({ tenantId, artifactId, version, format }) {
93
+ const id = tenantMap(slots, tenantId).get(slotKey(artifactId, version, format));
94
+ return id === undefined ? null : (tenantMap(byTenant, tenantId).get(id) ?? null);
95
+ },
96
+ async listByArtifact({ tenantId, artifactId, limit, cursor }) {
97
+ const rows = [...tenantMap(byTenant, tenantId).values()].filter((e) => e.artifactId === artifactId);
98
+ return paginate(rows, limit, cursor);
99
+ },
100
+ };
101
+ };
102
+ //# sourceMappingURL=artifact-exports.js.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * In-memory `ArtifactStore` — the reference implementation (#133).
3
+ *
4
+ * Two things it takes as seriously as the Postgres adapter will, because the conformance suite measures the
5
+ * others against this one and a laxer reference makes a production failure a passing test (the lesson #129
6
+ * learned when a placeholder timestamp sailed through here and was rejected by Postgres):
7
+ *
8
+ * - **Tenant partitioning is by outer map, not a filter.** An artifact id from one tenant cannot resolve
9
+ * another's row because it is not in that tenant's map at all.
10
+ * - **`addVersion` is a compare-and-set.** A blind append would let two concurrent regenerations both become
11
+ * version 2, and one would silently replace the other — which breaks the one property AC-2 asks for.
12
+ */
13
+ import type { ArtifactStore } from "../../persistence/index.js";
14
+ export declare const createMemoryArtifactStore: () => ArtifactStore;
15
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1,134 @@
1
+ /**
2
+ * In-memory `ArtifactStore` — the reference implementation (#133).
3
+ *
4
+ * Two things it takes as seriously as the Postgres adapter will, because the conformance suite measures the
5
+ * others against this one and a laxer reference makes a production failure a passing test (the lesson #129
6
+ * learned when a placeholder timestamp sailed through here and was rejected by Postgres):
7
+ *
8
+ * - **Tenant partitioning is by outer map, not a filter.** An artifact id from one tenant cannot resolve
9
+ * another's row because it is not in that tenant's map at all.
10
+ * - **`addVersion` is a compare-and-set.** A blind append would let two concurrent regenerations both become
11
+ * version 2, and one would silently replace the other — which breaks the one property AC-2 asks for.
12
+ */
13
+ import { AgentPlatformError } from "../../core/errors.js";
14
+ const tenantMap = (outer, tenantId) => {
15
+ let inner = outer.get(tenantId);
16
+ if (!inner)
17
+ outer.set(tenantId, (inner = new Map()));
18
+ return inner;
19
+ };
20
+ /** Keyset cursor on `(createdAt, id)` — the same encoding the other stores use, for the same reason. */
21
+ const encodeCursor = (createdAt, id) => Buffer.from(`${createdAt} ${id}`, "utf8").toString("base64url");
22
+ const decodeCursor = (cursor) => {
23
+ const [createdAt, id] = Buffer.from(cursor, "base64url").toString("utf8").split(" ");
24
+ return createdAt === undefined || id === undefined ? null : { createdAt, id };
25
+ };
26
+ const paginate = (rows, limit, cursor) => {
27
+ const sorted = [...rows].sort((a, b) => a.createdAt === b.createdAt ? a.id.localeCompare(b.id) : a.createdAt.localeCompare(b.createdAt));
28
+ const after = cursor === undefined ? null : decodeCursor(cursor);
29
+ const start = after === null
30
+ ? 0
31
+ : sorted.findIndex((r) => r.createdAt > after.createdAt || (r.createdAt === after.createdAt && r.id > after.id));
32
+ const from = start < 0 ? sorted.length : start;
33
+ const items = sorted.slice(from, from + limit);
34
+ const last = items[items.length - 1];
35
+ return from + limit < sorted.length && last !== undefined
36
+ ? { items, nextCursor: encodeCursor(last.createdAt, last.id) }
37
+ : { items };
38
+ };
39
+ /** Versions page on the contiguous version number, which is an exact cursor rather than an approximate one. */
40
+ const paginateVersions = (versions, limit, cursor) => {
41
+ const after = cursor === undefined ? 0 : Number.parseInt(cursor, 10);
42
+ const from = Number.isSafeInteger(after) && after > 0 ? after : 0;
43
+ const sorted = [...versions].sort((a, b) => a.version - b.version);
44
+ const items = sorted.filter((v) => v.version > from).slice(0, limit);
45
+ const last = items[items.length - 1];
46
+ return last !== undefined && sorted.some((v) => v.version > last.version)
47
+ ? { items, nextCursor: String(last.version) }
48
+ : { items };
49
+ };
50
+ const assertTimestamp = (at, field) => {
51
+ if (Number.isNaN(Date.parse(at)))
52
+ throw new AgentPlatformError({
53
+ code: "invalid_input",
54
+ message: `${field} must be an ISO timestamp, got ${JSON.stringify(at)}`,
55
+ retryable: false,
56
+ });
57
+ };
58
+ export const createMemoryArtifactStore = () => {
59
+ const byTenant = new Map();
60
+ return {
61
+ async create({ tenantId, artifact, version }) {
62
+ const entries = tenantMap(byTenant, tenantId);
63
+ if (entries.has(artifact.id))
64
+ throw new AgentPlatformError({
65
+ code: "conflict",
66
+ message: `artifact ${artifact.id} already exists`,
67
+ retryable: false,
68
+ });
69
+ assertTimestamp(artifact.createdAt, "createdAt");
70
+ const created = { ...artifact, latestVersion: 1, updatedAt: artifact.createdAt };
71
+ entries.set(artifact.id, {
72
+ artifact: created,
73
+ // Version 1 is created with the artifact: an artifact with no version is not a thing a reader can
74
+ // resolve, and allowing the state would mean every reader handling it.
75
+ versions: [{ ...version, artifactId: artifact.id, version: 1 }],
76
+ });
77
+ return created;
78
+ },
79
+ async addVersion({ tenantId, id, expectedLatestVersion, version }) {
80
+ const entry = tenantMap(byTenant, tenantId).get(id);
81
+ // The compare. Two concurrent regenerations both hold `expectedLatestVersion: 1`; exactly one wins,
82
+ // and the loser is told so rather than silently overwriting the winner's version 2.
83
+ if (entry === undefined || entry.artifact.latestVersion !== expectedLatestVersion)
84
+ return { added: false };
85
+ if (entry.artifact.deletedAt !== undefined)
86
+ return { added: false };
87
+ assertTimestamp(version.createdAt, "version.createdAt");
88
+ const next = expectedLatestVersion + 1;
89
+ entry.versions.push({ ...version, artifactId: id, version: next });
90
+ entry.artifact = { ...entry.artifact, latestVersion: next, updatedAt: version.createdAt };
91
+ return { added: true, version: next };
92
+ },
93
+ async get({ tenantId, id }) {
94
+ // Absent from *this tenant's* map, so a foreign id is null without a comparison anyone could get wrong.
95
+ return tenantMap(byTenant, tenantId).get(id)?.artifact ?? null;
96
+ },
97
+ async getVersion({ tenantId, id, version }) {
98
+ const entry = tenantMap(byTenant, tenantId).get(id);
99
+ if (entry === undefined)
100
+ return null;
101
+ // The latest by default. A reader who does not ask for a version wants the current one, and an earlier
102
+ // version stays resolvable by asking — which is AC-2 from the reading side.
103
+ const wanted = version ?? entry.artifact.latestVersion;
104
+ return entry.versions.find((v) => v.version === wanted) ?? null;
105
+ },
106
+ async listByConversation({ tenantId, conversationId, limit, cursor }) {
107
+ const rows = [...tenantMap(byTenant, tenantId).values()]
108
+ .map((e) => e.artifact)
109
+ // Live only: a deleted artifact reappearing in a conversation is a deleted document coming back.
110
+ .filter((a) => a.conversationId === conversationId && a.deletedAt === undefined);
111
+ return paginate(rows, limit, cursor);
112
+ },
113
+ async listVersions({ tenantId, id, limit, cursor }) {
114
+ const entry = tenantMap(byTenant, tenantId).get(id);
115
+ if (entry === undefined)
116
+ return { items: [] };
117
+ // Paged on the version *number*, not on `(createdAt, id)` like every other listing here. Versions are
118
+ // 1-based and contiguous, so the number is an exact cursor — and two versions created in the same
119
+ // millisecond would tie under a timestamp keyset, which for a history is the one place order must not
120
+ // be approximate.
121
+ return paginateVersions(entry.versions, limit, cursor);
122
+ },
123
+ async softDelete({ tenantId, id, at }) {
124
+ assertTimestamp(at, "at");
125
+ const entry = tenantMap(byTenant, tenantId).get(id);
126
+ if (entry === undefined)
127
+ return { deleted: false };
128
+ // Idempotent: deleting twice is the same as deleting once, which a retried request depends on.
129
+ entry.artifact = { ...entry.artifact, deletedAt: entry.artifact.deletedAt ?? at, updatedAt: at };
130
+ return { deleted: true };
131
+ },
132
+ };
133
+ };
134
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * In-memory blob store — `docs/03` → Tool results. Holds spilled tool output for read-back via
3
+ * `read_tool_output`. Tenant-partitioned so a `BlobRef` never resolves another tenant's bytes.
4
+ */
5
+ import type { BlobStore } from "../../persistence/index.js";
6
+ export declare const createMemoryBlobStore: () => BlobStore;
7
+ //# sourceMappingURL=blobs.d.ts.map
@@ -0,0 +1,27 @@
1
+ /**
2
+ * In-memory blob store — `docs/03` → Tool results. Holds spilled tool output for read-back via
3
+ * `read_tool_output`. Tenant-partitioned so a `BlobRef` never resolves another tenant's bytes.
4
+ */
5
+ import { asId } from "../../core/ids.js";
6
+ export const createMemoryBlobStore = () => {
7
+ const byTenant = new Map();
8
+ let counter = 0;
9
+ const tenant = (t) => {
10
+ let m = byTenant.get(t);
11
+ if (!m)
12
+ byTenant.set(t, (m = new Map()));
13
+ return m;
14
+ };
15
+ return {
16
+ async put({ tenantId, value }) {
17
+ const ref = `blob:${tenantId}:${(counter += 1)}`;
18
+ tenant(tenantId).set(ref, value);
19
+ return asId(ref);
20
+ },
21
+ async get({ tenantId, ref }) {
22
+ const store = tenant(tenantId);
23
+ return store.has(ref) ? store.get(ref) : null;
24
+ },
25
+ };
26
+ };
27
+ //# sourceMappingURL=blobs.js.map
@@ -0,0 +1,18 @@
1
+ /**
2
+ * In-memory `EvaluationStore` — the reference implementation (#141).
3
+ *
4
+ * The interesting behaviour is `completeRun`: aggregates are computed from the recorded cases at completion,
5
+ * not accumulated as they arrive. A run whose totals were accumulated could disagree with its own case rows
6
+ * after a re-record, and the number that gates a release must be derivable from the evidence behind it.
7
+ */
8
+ import type { EvalCaseResult, EvalDimensionSummary, EvaluationStore } from "../../persistence/index.js";
9
+ /** Aggregates from the case rows. One function, so the two adapters cannot disagree about what a mean is. */
10
+ export declare const summarise: (cases: readonly EvalCaseResult[]) => {
11
+ total: number;
12
+ passed: number;
13
+ meanScore: number;
14
+ byDimension: readonly EvalDimensionSummary[];
15
+ costMinorUnits: number;
16
+ };
17
+ export declare const createMemoryEvaluationStore: () => EvaluationStore;
18
+ //# sourceMappingURL=evaluation.d.ts.map
@@ -0,0 +1,148 @@
1
+ /**
2
+ * In-memory `EvaluationStore` — the reference implementation (#141).
3
+ *
4
+ * The interesting behaviour is `completeRun`: aggregates are computed from the recorded cases at completion,
5
+ * not accumulated as they arrive. A run whose totals were accumulated could disagree with its own case rows
6
+ * after a re-record, and the number that gates a release must be derivable from the evidence behind it.
7
+ */
8
+ import { AgentPlatformError } from "../../core/errors.js";
9
+ const tenantMap = (outer, tenantId) => {
10
+ let inner = outer.get(tenantId);
11
+ if (!inner)
12
+ outer.set(tenantId, (inner = new Map()));
13
+ return inner;
14
+ };
15
+ /** Aggregates from the case rows. One function, so the two adapters cannot disagree about what a mean is. */
16
+ export const summarise = (cases) => {
17
+ const byDimension = new Map();
18
+ let passed = 0;
19
+ let score = 0;
20
+ let cost = 0;
21
+ for (const result of cases) {
22
+ if (result.verdict.pass)
23
+ passed += 1;
24
+ score += result.verdict.score;
25
+ cost += result.costMinorUnits;
26
+ const entry = byDimension.get(result.dimension) ?? { total: 0, passed: 0, score: 0 };
27
+ entry.total += 1;
28
+ if (result.verdict.pass)
29
+ entry.passed += 1;
30
+ entry.score += result.verdict.score;
31
+ byDimension.set(result.dimension, entry);
32
+ }
33
+ return {
34
+ total: cases.length,
35
+ passed,
36
+ // Zero for an empty run rather than NaN: a run that scored nothing has a mean of zero, and NaN would
37
+ // propagate into every comparison that touched it.
38
+ meanScore: cases.length === 0 ? 0 : score / cases.length,
39
+ byDimension: [...byDimension.entries()]
40
+ // Sorted by name so two runs' breakdowns line up in a diff.
41
+ .sort(([a], [b]) => a.localeCompare(b))
42
+ .map(([dimension, e]) => ({
43
+ dimension,
44
+ total: e.total,
45
+ passed: e.passed,
46
+ meanScore: e.total === 0 ? 0 : e.score / e.total,
47
+ })),
48
+ costMinorUnits: cost,
49
+ };
50
+ };
51
+ export const createMemoryEvaluationStore = () => {
52
+ const byTenant = new Map();
53
+ return {
54
+ async startRun({ tenantId, id, release, startedAt }) {
55
+ const runs = tenantMap(byTenant, tenantId);
56
+ if (runs.has(id))
57
+ throw new AgentPlatformError({
58
+ code: "conflict",
59
+ message: `evaluation run ${id} already exists`,
60
+ retryable: false,
61
+ });
62
+ const run = {
63
+ id,
64
+ release,
65
+ startedAt,
66
+ total: 0,
67
+ passed: 0,
68
+ meanScore: 0,
69
+ byDimension: [],
70
+ costMinorUnits: 0,
71
+ graderVersions: {},
72
+ };
73
+ runs.set(id, { run, cases: new Map() });
74
+ return run;
75
+ },
76
+ async recordCase({ tenantId, runId, result }) {
77
+ const stored = tenantMap(byTenant, tenantId).get(runId);
78
+ // Absent means the run is gone — reported rather than thrown, because a resumed harness losing a race is
79
+ // ordinary and a thrown error would abandon the whole run.
80
+ if (stored === undefined)
81
+ return { recorded: false };
82
+ // Idempotent on the case id: a resumed run must not double-count a case it already scored.
83
+ stored.cases.set(result.caseId, result);
84
+ return { recorded: true };
85
+ },
86
+ async completeRun({ tenantId, runId, finishedAt, graderVersions }) {
87
+ const stored = tenantMap(byTenant, tenantId).get(runId);
88
+ if (stored === undefined)
89
+ throw new AgentPlatformError({
90
+ code: "not_found",
91
+ message: `no such evaluation run ${runId}`,
92
+ retryable: false,
93
+ });
94
+ const summary = summarise([...stored.cases.values()]);
95
+ stored.run = { ...stored.run, finishedAt, graderVersions, ...summary };
96
+ return stored.run;
97
+ },
98
+ async get({ tenantId, runId }) {
99
+ // Absent from *this tenant's* map, so a foreign run id is null without a comparison anyone could get
100
+ // wrong — one tenant's quality gate is not another's business.
101
+ return tenantMap(byTenant, tenantId).get(runId)?.run ?? null;
102
+ },
103
+ async latest({ tenantId, release }) {
104
+ const runs = [...tenantMap(byTenant, tenantId).values()]
105
+ .map((s) => s.run)
106
+ // Completed only: an in-flight run has partial totals, and comparing against one would report every
107
+ // case it has not reached yet as a regression.
108
+ .filter((r) => r.finishedAt !== undefined && (release === undefined || r.release === release))
109
+ // Tie-broken by start then id, because two runs can finish in the same instant — a fixed clock in a
110
+ // test, or simply a fast pair — and "the latest run" must not depend on insertion order. An unstable
111
+ // answer here is a gate comparing against an arbitrary one of two runs.
112
+ .sort((a, b) => {
113
+ const byFinish = (b.finishedAt ?? "").localeCompare(a.finishedAt ?? "");
114
+ if (byFinish !== 0)
115
+ return byFinish;
116
+ const byStart = b.startedAt.localeCompare(a.startedAt);
117
+ return byStart !== 0 ? byStart : b.id.localeCompare(a.id);
118
+ });
119
+ return runs[0] ?? null;
120
+ },
121
+ async list({ tenantId, limit, cursor }) {
122
+ const runs = [...tenantMap(byTenant, tenantId).values()]
123
+ .map((s) => s.run)
124
+ // Newest first, which is the order a release history is read in.
125
+ .sort((a, b) => (b.startedAt !== a.startedAt ? b.startedAt.localeCompare(a.startedAt) : a.id.localeCompare(b.id)));
126
+ const start = cursor === undefined ? 0 : runs.findIndex((r) => r.id === cursor) + 1;
127
+ const items = runs.slice(start, start + limit);
128
+ const last = items[items.length - 1];
129
+ return start + limit < runs.length && last !== undefined
130
+ ? { items, nextCursor: last.id }
131
+ : { items };
132
+ },
133
+ async listCaseResults({ tenantId, runId, limit, cursor }) {
134
+ const stored = tenantMap(byTenant, tenantId).get(runId);
135
+ if (stored === undefined)
136
+ return { items: [] };
137
+ const cases = [...stored.cases.values()].sort((a, b) => a.caseId.localeCompare(b.caseId));
138
+ const start = cursor === undefined ? 0 : cases.findIndex((c) => c.caseId > cursor);
139
+ const at = start < 0 ? cases.length : start;
140
+ const items = cases.slice(at, at + limit);
141
+ const last = items[items.length - 1];
142
+ return at + limit < cases.length && last !== undefined
143
+ ? { items, nextCursor: last.caseId }
144
+ : { items };
145
+ },
146
+ };
147
+ };
148
+ //# sourceMappingURL=evaluation.js.map
@@ -0,0 +1,27 @@
1
+ /**
2
+ * In-memory file metadata and content — the reference implementations (#129).
3
+ *
4
+ * The reference adapter is the baseline the conformance matrix measures the others against, so it
5
+ * implements every method rather than the convenient ones. Two things it takes seriously despite being
6
+ * in-memory:
7
+ *
8
+ * - **Tenant partitioning is by outer map, not by a filter.** A `contentKey` from one tenant cannot resolve
9
+ * another's bytes because it is not in that tenant's map at all. #91 found an `AgentStore` that accepted
10
+ * `TenantScope` and quietly ignored it, which is why this is structural rather than a `where` clause.
11
+ * - **`transition` is a compare-and-set.** A blind write would let a delete racing an upload leave a file
12
+ * `stored` after its bytes were scheduled for removal, and the in-memory adapter is where that bug would
13
+ * be invisible.
14
+ */
15
+ import type { FileContentStore, FileMetadataStore, FileState } from "../../persistence/index.js";
16
+ export declare const createMemoryFileMetadataStore: () => FileMetadataStore;
17
+ /**
18
+ * In-memory bytes.
19
+ *
20
+ * `signedUrl` returns `null` rather than inventing a URL: this adapter has no signing mechanism, and the
21
+ * port says `null` means "proxy the read instead". A fabricated URL would be a URL that does not work, which
22
+ * is worse than an honest absence — and it would let a caller believe AC-6's mediated access was exercised
23
+ * when it was not.
24
+ */
25
+ export declare const createMemoryFileContentStore: () => FileContentStore;
26
+ export declare const FILE_STATES_FOR_TEST: readonly FileState[];
27
+ //# sourceMappingURL=files.d.ts.map
Binary file
@@ -0,0 +1,16 @@
1
+ /**
2
+ * In-memory flow definitions and executions — the reference implementations (#187, #186).
3
+ *
4
+ * Two properties this takes seriously despite being in-memory, because both are the kind that an in-memory
5
+ * adapter is where the bug would be invisible:
6
+ *
7
+ * - **Tenant partitioning is by outer map, not a filter.** An execution id from one tenant cannot resolve
8
+ * another's document because it is not in that tenant's map at all.
9
+ * - **`save` is monotonic on `steps`.** A save carrying fewer completed steps than the stored one is ignored. Two
10
+ * workers holding the same execution would otherwise let the slower one move it backwards, and a flow that goes
11
+ * backwards re-performs external writes — the failure this whole module exists to prevent.
12
+ */
13
+ import type { FlowDefinitionStore, FlowExecutionStore } from "../../persistence/index.js";
14
+ export declare const createMemoryFlowDefinitionStore: () => FlowDefinitionStore;
15
+ export declare const createMemoryFlowExecutionStore: () => FlowExecutionStore;
16
+ //# sourceMappingURL=flows.d.ts.map
@@ -0,0 +1,117 @@
1
+ /**
2
+ * In-memory flow definitions and executions — the reference implementations (#187, #186).
3
+ *
4
+ * Two properties this takes seriously despite being in-memory, because both are the kind that an in-memory
5
+ * adapter is where the bug would be invisible:
6
+ *
7
+ * - **Tenant partitioning is by outer map, not a filter.** An execution id from one tenant cannot resolve
8
+ * another's document because it is not in that tenant's map at all.
9
+ * - **`save` is monotonic on `steps`.** A save carrying fewer completed steps than the stored one is ignored. Two
10
+ * workers holding the same execution would otherwise let the slower one move it backwards, and a flow that goes
11
+ * backwards re-performs external writes — the failure this whole module exists to prevent.
12
+ */
13
+ import { AgentPlatformError } from "../../core/errors.js";
14
+ const tenantMap = (byTenant, tenantId) => {
15
+ const existing = byTenant.get(tenantId);
16
+ if (existing !== undefined)
17
+ return existing;
18
+ const created = new Map();
19
+ byTenant.set(tenantId, created);
20
+ return created;
21
+ };
22
+ const page = (items, request, key) => {
23
+ const take = Math.max(1, Math.min(request.limit ?? 50, 500));
24
+ const after = request.cursor;
25
+ const eligible = after === undefined ? items : items.filter((item) => key(item) > after);
26
+ const slice = eligible.slice(0, take);
27
+ return {
28
+ items: slice,
29
+ ...(eligible.length > take && slice.length > 0 ? { nextCursor: key(slice[slice.length - 1]) } : {}),
30
+ };
31
+ };
32
+ export const createMemoryFlowDefinitionStore = () => {
33
+ // Keyed `flowId@version`, because a version is part of a definition's identity rather than a column on it.
34
+ const byTenant = new Map();
35
+ return {
36
+ async put({ tenantId, definition }) {
37
+ const store = tenantMap(byTenant, String(tenantId));
38
+ const key = `${definition.flowId}@${definition.version}`;
39
+ if (store.has(key)) {
40
+ // A version that changed is not a version. Refusing here is what lets an execution pin one and trust it.
41
+ throw new AgentPlatformError({
42
+ code: "conflict",
43
+ message: `${definition.flowId} version ${definition.version} already exists — publish a new version instead`,
44
+ retryable: false,
45
+ });
46
+ }
47
+ store.set(key, definition);
48
+ },
49
+ async get({ tenantId, flowId, version }) {
50
+ return tenantMap(byTenant, String(tenantId)).get(`${flowId}@${version}`) ?? null;
51
+ },
52
+ async latest({ tenantId, flowId }) {
53
+ const versions = [...tenantMap(byTenant, String(tenantId)).values()]
54
+ .filter((definition) => definition.flowId === flowId)
55
+ .sort((a, b) => b.version - a.version);
56
+ return versions[0] ?? null;
57
+ },
58
+ async list({ tenantId, ...request }) {
59
+ // Latest version per flow: a list of every version of every flow is a list nobody wants, and the caller
60
+ // asking "what flows are there" means distinct flows.
61
+ const latest = new Map();
62
+ for (const definition of tenantMap(byTenant, String(tenantId)).values()) {
63
+ const current = latest.get(definition.flowId);
64
+ if (current === undefined || definition.version > current.version)
65
+ latest.set(definition.flowId, definition);
66
+ }
67
+ const sorted = [...latest.values()].sort((a, b) => a.flowId.localeCompare(b.flowId));
68
+ return page(sorted, request, (definition) => definition.flowId);
69
+ },
70
+ };
71
+ };
72
+ export const createMemoryFlowExecutionStore = () => {
73
+ const byTenant = new Map();
74
+ return {
75
+ async create({ tenantId, execution }) {
76
+ const store = tenantMap(byTenant, String(tenantId));
77
+ if (store.has(execution.id)) {
78
+ throw new AgentPlatformError({
79
+ code: "conflict",
80
+ message: `flow execution ${execution.id} already exists`,
81
+ retryable: false,
82
+ });
83
+ }
84
+ store.set(execution.id, execution);
85
+ },
86
+ async save({ tenantId, execution }) {
87
+ const store = tenantMap(byTenant, String(tenantId));
88
+ const stored = store.get(execution.id);
89
+ // Monotonic. A slower worker's stale document must not move the execution backwards.
90
+ if (stored !== undefined && execution.steps < stored.steps)
91
+ return;
92
+ store.set(execution.id, execution);
93
+ },
94
+ async get({ tenantId, executionId }) {
95
+ return tenantMap(byTenant, String(tenantId)).get(executionId) ?? null;
96
+ },
97
+ async waitingOnSignal({ tenantId, signal, limit }) {
98
+ return [...tenantMap(byTenant, String(tenantId)).values()]
99
+ .filter((execution) => execution.status === "waiting" && execution.waitingSignal === signal)
100
+ .sort((a, b) => a.startedAt.localeCompare(b.startedAt))
101
+ .slice(0, Math.max(1, Math.min(limit ?? 50, 500)));
102
+ },
103
+ async waitingOnRun({ tenantId, runId }) {
104
+ // `status === "waiting"` as well as the id: a stale `waitingRunId` on a running execution must not be
105
+ // resumed by a run finishing, because it is not waiting for one.
106
+ return ([...tenantMap(byTenant, String(tenantId)).values()].find((execution) => execution.status === "waiting" && execution.waitingRunId === runId) ?? null);
107
+ },
108
+ async listByFlow({ tenantId, flowId, ...request }) {
109
+ const matching = [...tenantMap(byTenant, String(tenantId)).values()]
110
+ .filter((execution) => execution.flowId === flowId)
111
+ // Newest first: the inspector's question is "what happened just now".
112
+ .sort((a, b) => b.startedAt.localeCompare(a.startedAt) || a.id.localeCompare(b.id));
113
+ return page(matching, request, (execution) => execution.id);
114
+ },
115
+ };
116
+ };
117
+ //# sourceMappingURL=flows.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * In-memory HITL adapters — `docs/04` → Questions & Approvals. Durable pending questions/approvals
3
+ * and standing approval grants for tests/dev. `answerQuestion`/`decideApproval` are idempotent so a
4
+ * continuation is queued exactly once; grants respect revocation and expiry.
5
+ */
6
+ import type { ApprovalGrantStore, InteractionStore } from "../../persistence/index.js";
7
+ export declare const createMemoryInteractionStore: () => InteractionStore;
8
+ export declare const createMemoryApprovalGrantStore: () => ApprovalGrantStore;
9
+ //# sourceMappingURL=hitl.d.ts.map