@assemblyline-agents/runtime 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 (331) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/agent-harness.d.ts +108 -0
  4. package/dist/agent-harness.d.ts.map +1 -0
  5. package/dist/agent-harness.js +2 -0
  6. package/dist/agent-harness.js.map +1 -0
  7. package/dist/attachments-legacy.d.ts +17 -0
  8. package/dist/attachments-legacy.d.ts.map +1 -0
  9. package/dist/attachments-legacy.js +273 -0
  10. package/dist/attachments-legacy.js.map +1 -0
  11. package/dist/attachments.d.ts +49 -0
  12. package/dist/attachments.d.ts.map +1 -0
  13. package/dist/attachments.js +832 -0
  14. package/dist/attachments.js.map +1 -0
  15. package/dist/builtin-tool-executors.d.ts +96 -0
  16. package/dist/builtin-tool-executors.d.ts.map +1 -0
  17. package/dist/builtin-tool-executors.js +501 -0
  18. package/dist/builtin-tool-executors.js.map +1 -0
  19. package/dist/builtin-tools.d.ts +30 -0
  20. package/dist/builtin-tools.d.ts.map +1 -0
  21. package/dist/builtin-tools.js +690 -0
  22. package/dist/builtin-tools.js.map +1 -0
  23. package/dist/capability-catalog.d.ts +27 -0
  24. package/dist/capability-catalog.d.ts.map +1 -0
  25. package/dist/capability-catalog.js +193 -0
  26. package/dist/capability-catalog.js.map +1 -0
  27. package/dist/channel-http-util.d.ts +34 -0
  28. package/dist/channel-http-util.d.ts.map +1 -0
  29. package/dist/channel-http-util.js +93 -0
  30. package/dist/channel-http-util.js.map +1 -0
  31. package/dist/channel-ingress.d.ts +56 -0
  32. package/dist/channel-ingress.d.ts.map +1 -0
  33. package/dist/channel-ingress.js +273 -0
  34. package/dist/channel-ingress.js.map +1 -0
  35. package/dist/channel.d.ts +146 -0
  36. package/dist/channel.d.ts.map +1 -0
  37. package/dist/channel.js +2 -0
  38. package/dist/channel.js.map +1 -0
  39. package/dist/checkpoints.d.ts +34 -0
  40. package/dist/checkpoints.d.ts.map +1 -0
  41. package/dist/checkpoints.js +86 -0
  42. package/dist/checkpoints.js.map +1 -0
  43. package/dist/code-mode.d.ts +20 -0
  44. package/dist/code-mode.d.ts.map +1 -0
  45. package/dist/code-mode.js +658 -0
  46. package/dist/code-mode.js.map +1 -0
  47. package/dist/computer-relay-protocol.d.ts +36 -0
  48. package/dist/computer-relay-protocol.d.ts.map +1 -0
  49. package/dist/computer-relay-protocol.js +127 -0
  50. package/dist/computer-relay-protocol.js.map +1 -0
  51. package/dist/concurrency.d.ts +68 -0
  52. package/dist/concurrency.d.ts.map +1 -0
  53. package/dist/concurrency.js +193 -0
  54. package/dist/concurrency.js.map +1 -0
  55. package/dist/connection-auth-util.d.ts +56 -0
  56. package/dist/connection-auth-util.d.ts.map +1 -0
  57. package/dist/connection-auth-util.js +154 -0
  58. package/dist/connection-auth-util.js.map +1 -0
  59. package/dist/connection-clients.d.ts +50 -0
  60. package/dist/connection-clients.d.ts.map +1 -0
  61. package/dist/connection-clients.js +402 -0
  62. package/dist/connection-clients.js.map +1 -0
  63. package/dist/connection-stores.d.ts +108 -0
  64. package/dist/connection-stores.d.ts.map +1 -0
  65. package/dist/connection-stores.js +127 -0
  66. package/dist/connection-stores.js.map +1 -0
  67. package/dist/connection-util.d.ts +27 -0
  68. package/dist/connection-util.d.ts.map +1 -0
  69. package/dist/connection-util.js +118 -0
  70. package/dist/connection-util.js.map +1 -0
  71. package/dist/connections.d.ts +152 -0
  72. package/dist/connections.d.ts.map +1 -0
  73. package/dist/connections.js +838 -0
  74. package/dist/connections.js.map +1 -0
  75. package/dist/content-capture.d.ts +32 -0
  76. package/dist/content-capture.d.ts.map +1 -0
  77. package/dist/content-capture.js +77 -0
  78. package/dist/content-capture.js.map +1 -0
  79. package/dist/context-policy-util.d.ts +45 -0
  80. package/dist/context-policy-util.d.ts.map +1 -0
  81. package/dist/context-policy-util.js +120 -0
  82. package/dist/context-policy-util.js.map +1 -0
  83. package/dist/conversation-context.d.ts +55 -0
  84. package/dist/conversation-context.d.ts.map +1 -0
  85. package/dist/conversation-context.js +179 -0
  86. package/dist/conversation-context.js.map +1 -0
  87. package/dist/conversation-transcript.d.ts +49 -0
  88. package/dist/conversation-transcript.d.ts.map +1 -0
  89. package/dist/conversation-transcript.js +77 -0
  90. package/dist/conversation-transcript.js.map +1 -0
  91. package/dist/conversation-turn-dispatch.d.ts +46 -0
  92. package/dist/conversation-turn-dispatch.d.ts.map +1 -0
  93. package/dist/conversation-turn-dispatch.js +201 -0
  94. package/dist/conversation-turn-dispatch.js.map +1 -0
  95. package/dist/delivery-queue.d.ts +89 -0
  96. package/dist/delivery-queue.d.ts.map +1 -0
  97. package/dist/delivery-queue.js +244 -0
  98. package/dist/delivery-queue.js.map +1 -0
  99. package/dist/delivery-send.d.ts +44 -0
  100. package/dist/delivery-send.d.ts.map +1 -0
  101. package/dist/delivery-send.js +494 -0
  102. package/dist/delivery-send.js.map +1 -0
  103. package/dist/env-config.d.ts +6 -0
  104. package/dist/env-config.d.ts.map +1 -0
  105. package/dist/env-config.js +27 -0
  106. package/dist/env-config.js.map +1 -0
  107. package/dist/eval-run-options.d.ts +37 -0
  108. package/dist/eval-run-options.d.ts.map +1 -0
  109. package/dist/eval-run-options.js +106 -0
  110. package/dist/eval-run-options.js.map +1 -0
  111. package/dist/harness-continuation.d.ts +54 -0
  112. package/dist/harness-continuation.d.ts.map +1 -0
  113. package/dist/harness-continuation.js +58 -0
  114. package/dist/harness-continuation.js.map +1 -0
  115. package/dist/harness-loop.d.ts +110 -0
  116. package/dist/harness-loop.d.ts.map +1 -0
  117. package/dist/harness-loop.js +575 -0
  118. package/dist/harness-loop.js.map +1 -0
  119. package/dist/hook-dispatch.d.ts +19 -0
  120. package/dist/hook-dispatch.d.ts.map +1 -0
  121. package/dist/hook-dispatch.js +37 -0
  122. package/dist/hook-dispatch.js.map +1 -0
  123. package/dist/http.d.ts +26 -0
  124. package/dist/http.d.ts.map +1 -0
  125. package/dist/http.js +114 -0
  126. package/dist/http.js.map +1 -0
  127. package/dist/in-memory-conversation-turn-store.d.ts +29 -0
  128. package/dist/in-memory-conversation-turn-store.d.ts.map +1 -0
  129. package/dist/in-memory-conversation-turn-store.js +166 -0
  130. package/dist/in-memory-conversation-turn-store.js.map +1 -0
  131. package/dist/in-memory-run-store.d.ts +39 -0
  132. package/dist/in-memory-run-store.d.ts.map +1 -0
  133. package/dist/in-memory-run-store.js +332 -0
  134. package/dist/in-memory-run-store.js.map +1 -0
  135. package/dist/in-memory-sandbox-session-store.d.ts +33 -0
  136. package/dist/in-memory-sandbox-session-store.d.ts.map +1 -0
  137. package/dist/in-memory-sandbox-session-store.js +186 -0
  138. package/dist/in-memory-sandbox-session-store.js.map +1 -0
  139. package/dist/in-memory-small-stores.d.ts +117 -0
  140. package/dist/in-memory-small-stores.d.ts.map +1 -0
  141. package/dist/in-memory-small-stores.js +340 -0
  142. package/dist/in-memory-small-stores.js.map +1 -0
  143. package/dist/in-memory-usage-store.d.ts +15 -0
  144. package/dist/in-memory-usage-store.d.ts.map +1 -0
  145. package/dist/in-memory-usage-store.js +49 -0
  146. package/dist/in-memory-usage-store.js.map +1 -0
  147. package/dist/index.d.ts +467 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +2046 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/json-util.d.ts +19 -0
  152. package/dist/json-util.d.ts.map +1 -0
  153. package/dist/json-util.js +59 -0
  154. package/dist/json-util.js.map +1 -0
  155. package/dist/local-sandbox.d.ts +16 -0
  156. package/dist/local-sandbox.d.ts.map +1 -0
  157. package/dist/local-sandbox.js +327 -0
  158. package/dist/local-sandbox.js.map +1 -0
  159. package/dist/logging.d.ts +16 -0
  160. package/dist/logging.d.ts.map +1 -0
  161. package/dist/logging.js +41 -0
  162. package/dist/logging.js.map +1 -0
  163. package/dist/mcp-client.d.ts +27 -0
  164. package/dist/mcp-client.d.ts.map +1 -0
  165. package/dist/mcp-client.js +169 -0
  166. package/dist/mcp-client.js.map +1 -0
  167. package/dist/model-harnesses.d.ts +4 -0
  168. package/dist/model-harnesses.d.ts.map +1 -0
  169. package/dist/model-harnesses.js +6 -0
  170. package/dist/model-harnesses.js.map +1 -0
  171. package/dist/model-media.d.ts +36 -0
  172. package/dist/model-media.d.ts.map +1 -0
  173. package/dist/model-media.js +234 -0
  174. package/dist/model-media.js.map +1 -0
  175. package/dist/operator-controls.d.ts +31 -0
  176. package/dist/operator-controls.d.ts.map +1 -0
  177. package/dist/operator-controls.js +71 -0
  178. package/dist/operator-controls.js.map +1 -0
  179. package/dist/pi-agent-harness.d.ts +40 -0
  180. package/dist/pi-agent-harness.d.ts.map +1 -0
  181. package/dist/pi-agent-harness.js +222 -0
  182. package/dist/pi-agent-harness.js.map +1 -0
  183. package/dist/pi-harness.d.ts +42 -0
  184. package/dist/pi-harness.d.ts.map +1 -0
  185. package/dist/pi-harness.js +142 -0
  186. package/dist/pi-harness.js.map +1 -0
  187. package/dist/relay-mcp-client.d.ts +17 -0
  188. package/dist/relay-mcp-client.d.ts.map +1 -0
  189. package/dist/relay-mcp-client.js +119 -0
  190. package/dist/relay-mcp-client.js.map +1 -0
  191. package/dist/replay-resume.d.ts +107 -0
  192. package/dist/replay-resume.d.ts.map +1 -0
  193. package/dist/replay-resume.js +495 -0
  194. package/dist/replay-resume.js.map +1 -0
  195. package/dist/resource-projection-util.d.ts +58 -0
  196. package/dist/resource-projection-util.d.ts.map +1 -0
  197. package/dist/resource-projection-util.js +298 -0
  198. package/dist/resource-projection-util.js.map +1 -0
  199. package/dist/resource-projection.d.ts +45 -0
  200. package/dist/resource-projection.d.ts.map +1 -0
  201. package/dist/resource-projection.js +481 -0
  202. package/dist/resource-projection.js.map +1 -0
  203. package/dist/run-heartbeat.d.ts +34 -0
  204. package/dist/run-heartbeat.d.ts.map +1 -0
  205. package/dist/run-heartbeat.js +62 -0
  206. package/dist/run-heartbeat.js.map +1 -0
  207. package/dist/run-outcome.d.ts +47 -0
  208. package/dist/run-outcome.d.ts.map +1 -0
  209. package/dist/run-outcome.js +92 -0
  210. package/dist/run-outcome.js.map +1 -0
  211. package/dist/run-recovery.d.ts +117 -0
  212. package/dist/run-recovery.d.ts.map +1 -0
  213. package/dist/run-recovery.js +466 -0
  214. package/dist/run-recovery.js.map +1 -0
  215. package/dist/run-resolver.d.ts +35 -0
  216. package/dist/run-resolver.d.ts.map +1 -0
  217. package/dist/run-resolver.js +84 -0
  218. package/dist/run-resolver.js.map +1 -0
  219. package/dist/run-stream.d.ts +37 -0
  220. package/dist/run-stream.d.ts.map +1 -0
  221. package/dist/run-stream.js +78 -0
  222. package/dist/run-stream.js.map +1 -0
  223. package/dist/runs-query.d.ts +29 -0
  224. package/dist/runs-query.d.ts.map +1 -0
  225. package/dist/runs-query.js +142 -0
  226. package/dist/runs-query.js.map +1 -0
  227. package/dist/runtime-bundle.d.ts +3 -0
  228. package/dist/runtime-bundle.d.ts.map +1 -0
  229. package/dist/runtime-bundle.js +18 -0
  230. package/dist/runtime-bundle.js.map +1 -0
  231. package/dist/runtime-types.d.ts +397 -0
  232. package/dist/runtime-types.d.ts.map +1 -0
  233. package/dist/runtime-types.js +2 -0
  234. package/dist/runtime-types.js.map +1 -0
  235. package/dist/runtime-util.d.ts +45 -0
  236. package/dist/runtime-util.d.ts.map +1 -0
  237. package/dist/runtime-util.js +116 -0
  238. package/dist/runtime-util.js.map +1 -0
  239. package/dist/sandbox-cli-client.d.ts +20 -0
  240. package/dist/sandbox-cli-client.d.ts.map +1 -0
  241. package/dist/sandbox-cli-client.js +97 -0
  242. package/dist/sandbox-cli-client.js.map +1 -0
  243. package/dist/sandbox-fs.d.ts +56 -0
  244. package/dist/sandbox-fs.d.ts.map +1 -0
  245. package/dist/sandbox-fs.js +276 -0
  246. package/dist/sandbox-fs.js.map +1 -0
  247. package/dist/sandbox-session-key.d.ts +8 -0
  248. package/dist/sandbox-session-key.d.ts.map +1 -0
  249. package/dist/sandbox-session-key.js +32 -0
  250. package/dist/sandbox-session-key.js.map +1 -0
  251. package/dist/sandbox-snapshot-policy.d.ts +27 -0
  252. package/dist/sandbox-snapshot-policy.d.ts.map +1 -0
  253. package/dist/sandbox-snapshot-policy.js +94 -0
  254. package/dist/sandbox-snapshot-policy.js.map +1 -0
  255. package/dist/sandbox-sync-worker.d.ts +63 -0
  256. package/dist/sandbox-sync-worker.d.ts.map +1 -0
  257. package/dist/sandbox-sync-worker.js +448 -0
  258. package/dist/sandbox-sync-worker.js.map +1 -0
  259. package/dist/schedule-execution.d.ts +59 -0
  260. package/dist/schedule-execution.d.ts.map +1 -0
  261. package/dist/schedule-execution.js +951 -0
  262. package/dist/schedule-execution.js.map +1 -0
  263. package/dist/scheduler.d.ts +19 -0
  264. package/dist/scheduler.d.ts.map +1 -0
  265. package/dist/scheduler.js +38 -0
  266. package/dist/scheduler.js.map +1 -0
  267. package/dist/security.d.ts +20 -0
  268. package/dist/security.d.ts.map +1 -0
  269. package/dist/security.js +145 -0
  270. package/dist/security.js.map +1 -0
  271. package/dist/self-improvement.d.ts +245 -0
  272. package/dist/self-improvement.d.ts.map +1 -0
  273. package/dist/self-improvement.js +554 -0
  274. package/dist/self-improvement.js.map +1 -0
  275. package/dist/source-loader.d.ts +19 -0
  276. package/dist/source-loader.d.ts.map +1 -0
  277. package/dist/source-loader.js +160 -0
  278. package/dist/source-loader.js.map +1 -0
  279. package/dist/state-store-helpers.d.ts +28 -0
  280. package/dist/state-store-helpers.d.ts.map +1 -0
  281. package/dist/state-store-helpers.js +164 -0
  282. package/dist/state-store-helpers.js.map +1 -0
  283. package/dist/state-stores.d.ts +25 -0
  284. package/dist/state-stores.d.ts.map +1 -0
  285. package/dist/state-stores.js +157 -0
  286. package/dist/state-stores.js.map +1 -0
  287. package/dist/state.d.ts +736 -0
  288. package/dist/state.d.ts.map +1 -0
  289. package/dist/state.js +46 -0
  290. package/dist/state.js.map +1 -0
  291. package/dist/storage.d.ts +188 -0
  292. package/dist/storage.d.ts.map +1 -0
  293. package/dist/storage.js +752 -0
  294. package/dist/storage.js.map +1 -0
  295. package/dist/subagent-execution.d.ts +80 -0
  296. package/dist/subagent-execution.d.ts.map +1 -0
  297. package/dist/subagent-execution.js +135 -0
  298. package/dist/subagent-execution.js.map +1 -0
  299. package/dist/telemetry.d.ts +49 -0
  300. package/dist/telemetry.d.ts.map +1 -0
  301. package/dist/telemetry.js +60 -0
  302. package/dist/telemetry.js.map +1 -0
  303. package/dist/tool-apis.d.ts +22 -0
  304. package/dist/tool-apis.d.ts.map +1 -0
  305. package/dist/tool-apis.js +344 -0
  306. package/dist/tool-apis.js.map +1 -0
  307. package/dist/tool-execution.d.ts +143 -0
  308. package/dist/tool-execution.d.ts.map +1 -0
  309. package/dist/tool-execution.js +573 -0
  310. package/dist/tool-execution.js.map +1 -0
  311. package/dist/trusted-attachments.d.ts +20 -0
  312. package/dist/trusted-attachments.d.ts.map +1 -0
  313. package/dist/trusted-attachments.js +276 -0
  314. package/dist/trusted-attachments.js.map +1 -0
  315. package/dist/usage-accounting.d.ts +37 -0
  316. package/dist/usage-accounting.d.ts.map +1 -0
  317. package/dist/usage-accounting.js +181 -0
  318. package/dist/usage-accounting.js.map +1 -0
  319. package/dist/usage-budget.d.ts +29 -0
  320. package/dist/usage-budget.d.ts.map +1 -0
  321. package/dist/usage-budget.js +145 -0
  322. package/dist/usage-budget.js.map +1 -0
  323. package/dist/usage-reconciliation.d.ts +76 -0
  324. package/dist/usage-reconciliation.d.ts.map +1 -0
  325. package/dist/usage-reconciliation.js +463 -0
  326. package/dist/usage-reconciliation.js.map +1 -0
  327. package/dist/usage-records.d.ts +24 -0
  328. package/dist/usage-records.d.ts.map +1 -0
  329. package/dist/usage-records.js +445 -0
  330. package/dist/usage-records.js.map +1 -0
  331. package/package.json +51 -0
@@ -0,0 +1,37 @@
1
+ export function createHookDispatcher(options) {
2
+ let loaded;
3
+ const load = async () => {
4
+ const hooks = [];
5
+ for (const hook of options.hooks) {
6
+ try {
7
+ const module = await options.loadModule(hook.source);
8
+ const events = module.default?.events;
9
+ if (!events || typeof events !== "object") {
10
+ options.logger.warn("hook.invalid", { hook: hook.name, detail: "default export must declare an events map" });
11
+ continue;
12
+ }
13
+ hooks.push({ name: hook.name, events });
14
+ }
15
+ catch (error) {
16
+ options.logger.warn("hook.load_failed", { hook: hook.name, error: String(error) });
17
+ }
18
+ }
19
+ return hooks;
20
+ };
21
+ return async (runId, event) => {
22
+ loaded ??= load();
23
+ const hooks = await loaded;
24
+ for (const hook of hooks) {
25
+ const handlers = [hook.events[event.type], hook.events["*"]].filter((handler) => typeof handler === "function");
26
+ for (const handler of handlers) {
27
+ try {
28
+ await handler({ type: event.type, timestamp: event.timestamp, data: event.data, ...(event.sequence !== undefined ? { sequence: event.sequence } : {}) }, { runId, agent: { name: options.agentName } });
29
+ }
30
+ catch (error) {
31
+ options.logger.warn("hook.failed", { hook: hook.name, eventType: event.type, error: String(error) });
32
+ }
33
+ }
34
+ }
35
+ };
36
+ }
37
+ //# sourceMappingURL=hook-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-dispatch.js","sourceRoot":"","sources":["../src/hook-dispatch.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,IAAI,MAAyC,CAAC;IAE9C,MAAM,IAAI,GAAG,KAAK,IAA2B,EAAE;QAC7C,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAA+B,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;gBACtC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC1C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC,CAAC;oBAC9G,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CACjE,CAAC,OAAO,EAA+B,EAAE,CAAC,OAAO,OAAO,KAAK,UAAU,CACxE,CAAC;YACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,OAAO,CACX,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EACzI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAC9C,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import type { JsonObject } from "@assemblyline-agents/core";
2
+ export interface HttpRequestPolicy {
3
+ timeoutMs?: number;
4
+ maxAttempts?: number;
5
+ minDelayMs?: number;
6
+ maxDelayMs?: number;
7
+ maxResponseBytes?: number;
8
+ retryOn?: (response: Response) => boolean;
9
+ /** Override the retry delay for a response-based retry (e.g. Telegram's parameters.retry_after in the body). */
10
+ retryDelayMsFor?: (response: Response, attempt: number) => number | undefined;
11
+ }
12
+ export interface HttpJsonResult {
13
+ response: Response;
14
+ status: number;
15
+ ok: boolean;
16
+ json: JsonObject;
17
+ text: string;
18
+ }
19
+ export declare class HttpResponseTooLargeError extends Error {
20
+ constructor(limitBytes: number);
21
+ }
22
+ export declare function retryAfterMs(response: Response, fallbackMs: number, capMs: number): number;
23
+ export declare function fetchWithPolicy(fetchImpl: typeof fetch, url: string, init?: RequestInit, policy?: HttpRequestPolicy): Promise<Response>;
24
+ export declare function readBodyCapped(response: Response, maxBytes?: number): Promise<string>;
25
+ export declare function fetchJson(fetchImpl: typeof fetch, url: string, init?: RequestInit, policy?: HttpRequestPolicy): Promise<HttpJsonResult>;
26
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAQ5D,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC;IAC1C,gHAAgH;IAChH,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,UAAU,EAAE,MAAM;CAI/B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS1F;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,OAAO,KAAK,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,WAAgB,EACtB,MAAM,GAAE,iBAAsB,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAqCnB;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAE,MAAmC,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBvH;AAED,wBAAsB,SAAS,CAC7B,SAAS,EAAE,OAAO,KAAK,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,WAAgB,EACtB,MAAM,GAAE,iBAAsB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAazB"}
package/dist/http.js ADDED
@@ -0,0 +1,114 @@
1
+ const DEFAULT_TIMEOUT_MS = 15_000;
2
+ const DEFAULT_MAX_ATTEMPTS = 3;
3
+ const DEFAULT_MIN_DELAY_MS = 250;
4
+ const DEFAULT_MAX_DELAY_MS = 30_000;
5
+ const DEFAULT_MAX_RESPONSE_BYTES = 512 * 1024;
6
+ export class HttpResponseTooLargeError extends Error {
7
+ constructor(limitBytes) {
8
+ super(`HTTP response exceeded the ${limitBytes}-byte limit.`);
9
+ this.name = "HttpResponseTooLargeError";
10
+ }
11
+ }
12
+ export function retryAfterMs(response, fallbackMs, capMs) {
13
+ const header = response.headers.get("retry-after");
14
+ if (header) {
15
+ const seconds = Number(header);
16
+ if (Number.isFinite(seconds) && seconds >= 0)
17
+ return Math.min(seconds * 1000, capMs);
18
+ const dateMs = Date.parse(header);
19
+ if (Number.isFinite(dateMs))
20
+ return Math.min(Math.max(dateMs - Date.now(), 0), capMs);
21
+ }
22
+ return Math.min(fallbackMs, capMs);
23
+ }
24
+ export async function fetchWithPolicy(fetchImpl, url, init = {}, policy = {}) {
25
+ const timeoutMs = policy.timeoutMs ?? DEFAULT_TIMEOUT_MS;
26
+ const maxAttempts = Math.max(1, policy.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);
27
+ const minDelayMs = policy.minDelayMs ?? DEFAULT_MIN_DELAY_MS;
28
+ const maxDelayMs = policy.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
29
+ const shouldRetry = policy.retryOn ?? ((response) => response.status === 429 || response.status >= 500);
30
+ let lastError;
31
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
32
+ const controller = new AbortController();
33
+ const timer = setTimeout(() => controller.abort(new Error(`HTTP request timed out after ${timeoutMs}ms.`)), timeoutMs);
34
+ const upstreamAbort = init.signal;
35
+ const onUpstreamAbort = () => controller.abort(upstreamAbort?.reason);
36
+ if (upstreamAbort) {
37
+ if (upstreamAbort.aborted)
38
+ controller.abort(upstreamAbort.reason);
39
+ else
40
+ upstreamAbort.addEventListener("abort", onUpstreamAbort, { once: true });
41
+ }
42
+ try {
43
+ const response = await fetchImpl(url, { ...init, signal: controller.signal });
44
+ if (!shouldRetry(response) || attempt >= maxAttempts)
45
+ return response;
46
+ const overrideDelay = policy.retryDelayMsFor?.(response, attempt);
47
+ const delayMs = overrideDelay !== undefined
48
+ ? Math.min(overrideDelay, maxDelayMs)
49
+ : retryAfterMs(response, backoffDelayMs(attempt, minDelayMs, maxDelayMs), maxDelayMs);
50
+ await response.body?.cancel().catch(() => undefined);
51
+ await sleep(delayMs);
52
+ }
53
+ catch (error) {
54
+ if (upstreamAbort?.aborted)
55
+ throw error;
56
+ lastError = error;
57
+ if (attempt >= maxAttempts)
58
+ throw error;
59
+ await sleep(backoffDelayMs(attempt, minDelayMs, maxDelayMs));
60
+ }
61
+ finally {
62
+ clearTimeout(timer);
63
+ if (upstreamAbort)
64
+ upstreamAbort.removeEventListener("abort", onUpstreamAbort);
65
+ }
66
+ }
67
+ throw lastError instanceof Error ? lastError : new Error("HTTP request failed.");
68
+ }
69
+ export async function readBodyCapped(response, maxBytes = DEFAULT_MAX_RESPONSE_BYTES) {
70
+ const body = response.body;
71
+ if (!body)
72
+ return "";
73
+ const reader = body.getReader();
74
+ const chunks = [];
75
+ let total = 0;
76
+ for (;;) {
77
+ const { done, value } = await reader.read();
78
+ if (done)
79
+ break;
80
+ if (value) {
81
+ total += value.byteLength;
82
+ if (total > maxBytes) {
83
+ await reader.cancel().catch(() => undefined);
84
+ throw new HttpResponseTooLargeError(maxBytes);
85
+ }
86
+ chunks.push(value);
87
+ }
88
+ }
89
+ return Buffer.concat(chunks).toString("utf8");
90
+ }
91
+ export async function fetchJson(fetchImpl, url, init = {}, policy = {}) {
92
+ const response = await fetchWithPolicy(fetchImpl, url, init, policy);
93
+ const text = await readBodyCapped(response, policy.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES);
94
+ let json = {};
95
+ if (text.length > 0) {
96
+ try {
97
+ const parsed = JSON.parse(text);
98
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
99
+ json = parsed;
100
+ }
101
+ catch {
102
+ // Non-JSON bodies are surfaced through `text`; callers decide how strict to be.
103
+ }
104
+ }
105
+ return { response, status: response.status, ok: response.ok, json, text };
106
+ }
107
+ function backoffDelayMs(attempt, minDelayMs, maxDelayMs) {
108
+ const exponential = Math.min(minDelayMs * 2 ** (attempt - 1), maxDelayMs);
109
+ return Math.floor(exponential / 2 + Math.random() * (exponential / 2));
110
+ }
111
+ function sleep(ms) {
112
+ return new Promise((resolve) => setTimeout(resolve, ms));
113
+ }
114
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ConversationTurnRecord, ConversationTurnStatus, ConversationTurnStore } from "./state.js";
2
+ export declare class InMemoryConversationTurnStore implements ConversationTurnStore {
3
+ private readonly persist;
4
+ turns: Map<string, ConversationTurnRecord>;
5
+ constructor(persist?: () => Promise<void>);
6
+ enqueueConversationTurn(input: Parameters<ConversationTurnStore["enqueueConversationTurn"]>[0]): Promise<{
7
+ turn: ConversationTurnRecord;
8
+ inserted: boolean;
9
+ }>;
10
+ leaseNextConversationTurn(options: Parameters<ConversationTurnStore["leaseNextConversationTurn"]>[0]): Promise<ConversationTurnRecord | undefined>;
11
+ attachConversationTurnRun(id: string, leaseToken: string, runId: string): Promise<ConversationTurnRecord>;
12
+ settleConversationTurn(id: string, leaseToken: string, status: "blocked" | "completed" | "failed" | "cancelled", options?: {
13
+ runId?: string;
14
+ error?: string;
15
+ }): Promise<ConversationTurnRecord>;
16
+ settleConversationTurnByRunId(runId: string, status: "blocked" | "completed" | "failed" | "cancelled", options?: {
17
+ error?: string;
18
+ }): Promise<ConversationTurnRecord | undefined>;
19
+ retryConversationTurn(id: string, leaseToken: string, error: string): Promise<ConversationTurnRecord>;
20
+ recoverExpiredConversationTurns(now?: Date): Promise<ConversationTurnRecord[]>;
21
+ listConversationTurns(options?: {
22
+ agentScope?: string;
23
+ conversationId?: string;
24
+ status?: ConversationTurnStatus;
25
+ }): Promise<ConversationTurnRecord[]>;
26
+ private requireLease;
27
+ private settle;
28
+ }
29
+ //# sourceMappingURL=in-memory-conversation-turn-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-conversation-turn-store.d.ts","sourceRoot":"","sources":["../src/in-memory-conversation-turn-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAapB,qBAAa,6BAA8B,YAAW,qBAAqB;IAG7D,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,KAAK,sCAA6C;gBAErB,OAAO,GAAE,MAAM,OAAO,CAAC,IAAI,CAAa;IAE/D,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;;;;IA6B9F,yBAAyB,CAC7B,OAAO,EAAE,UAAU,CAAC,qBAAqB,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,GACzE,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAiCxC,yBAAyB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAQzG,sBAAsB,CAC1B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,EACxD,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/C,OAAO,CAAC,sBAAsB,CAAC;IAK5B,6BAA6B,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,EACxD,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/B,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAQxC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoBrG,+BAA+B,CAAC,GAAG,OAAa,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAyBpF,qBAAqB,CAAC,OAAO,GAAE;QACnC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,MAAM,CAAC,EAAE,sBAAsB,CAAC;KAC5B,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAS1C,OAAO,CAAC,YAAY;YASN,MAAM;CAkBrB"}
@@ -0,0 +1,166 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { noPersist, timestamp } from "./state-store-helpers.js";
3
+ const ACTIVE_STATUSES = new Set(["running", "blocked"]);
4
+ function clone(record) {
5
+ return structuredClone(record);
6
+ }
7
+ function retryDelayMs(attemptCount) {
8
+ return Math.min(60_000, 1_000 * (2 ** Math.max(0, attemptCount - 1)));
9
+ }
10
+ export class InMemoryConversationTurnStore {
11
+ persist;
12
+ turns = new Map();
13
+ constructor(persist = noPersist) {
14
+ this.persist = persist;
15
+ }
16
+ async enqueueConversationTurn(input) {
17
+ const existing = [...this.turns.values()].find((turn) => turn.agentScope === input.agentScope &&
18
+ turn.idempotencyScope === input.idempotencyScope &&
19
+ turn.idempotencyKey === input.idempotencyKey);
20
+ if (existing)
21
+ return { turn: clone(existing), inserted: false };
22
+ const now = timestamp();
23
+ const turn = {
24
+ id: randomUUID(),
25
+ agentScope: input.agentScope,
26
+ conversationId: input.conversationId,
27
+ channel: input.channel,
28
+ eventId: input.eventId,
29
+ payload: structuredClone(input.payload),
30
+ idempotencyScope: input.idempotencyScope,
31
+ idempotencyKey: input.idempotencyKey,
32
+ status: "pending",
33
+ attemptCount: 0,
34
+ maxAttempts: Math.max(1, Math.floor(input.maxAttempts ?? 5)),
35
+ nextAttemptAt: now,
36
+ createdAt: now,
37
+ updatedAt: now
38
+ };
39
+ this.turns.set(turn.id, turn);
40
+ await this.persist();
41
+ return { turn: clone(turn), inserted: true };
42
+ }
43
+ async leaseNextConversationTurn(options) {
44
+ const now = options.now ?? new Date();
45
+ const nowIso = now.toISOString();
46
+ const activeConversations = new Set([...this.turns.values()]
47
+ .filter((turn) => turn.agentScope === options.agentScope && ACTIVE_STATUSES.has(turn.status))
48
+ .map((turn) => turn.conversationId));
49
+ const candidate = [...this.turns.values()]
50
+ .filter((turn) => turn.agentScope === options.agentScope &&
51
+ turn.status === "pending" &&
52
+ turn.nextAttemptAt <= nowIso &&
53
+ !activeConversations.has(turn.conversationId))
54
+ // Map iteration and modern Array#sort are stable, preserving insertion
55
+ // order when multiple events arrive in the same clock millisecond.
56
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt))[0];
57
+ if (!candidate)
58
+ return undefined;
59
+ const leaseToken = randomUUID();
60
+ const updated = {
61
+ ...candidate,
62
+ status: "running",
63
+ attemptCount: candidate.attemptCount + 1,
64
+ leaseToken,
65
+ leaseExpiresAt: new Date(now.getTime() + Math.max(1, options.leaseForMs)).toISOString(),
66
+ updatedAt: nowIso
67
+ };
68
+ this.turns.set(updated.id, updated);
69
+ await this.persist();
70
+ return clone(updated);
71
+ }
72
+ async attachConversationTurnRun(id, leaseToken, runId) {
73
+ const current = this.requireLease(id, leaseToken);
74
+ const updated = { ...current, runId, updatedAt: timestamp() };
75
+ this.turns.set(id, updated);
76
+ await this.persist();
77
+ return clone(updated);
78
+ }
79
+ async settleConversationTurn(id, leaseToken, status, options = {}) {
80
+ const current = this.requireLease(id, leaseToken);
81
+ return this.settle(current, status, options);
82
+ }
83
+ async settleConversationTurnByRunId(runId, status, options = {}) {
84
+ const current = [...this.turns.values()].find((turn) => turn.runId === runId && ACTIVE_STATUSES.has(turn.status));
85
+ if (!current)
86
+ return undefined;
87
+ return this.settle(current, status, options);
88
+ }
89
+ async retryConversationTurn(id, leaseToken, error) {
90
+ const current = this.requireLease(id, leaseToken);
91
+ const now = new Date();
92
+ const exhausted = current.attemptCount >= current.maxAttempts;
93
+ const updated = {
94
+ ...current,
95
+ status: exhausted ? "failed" : "pending",
96
+ nextAttemptAt: exhausted
97
+ ? now.toISOString()
98
+ : new Date(now.getTime() + retryDelayMs(current.attemptCount)).toISOString(),
99
+ lastError: error,
100
+ updatedAt: now.toISOString()
101
+ };
102
+ delete updated.leaseToken;
103
+ delete updated.leaseExpiresAt;
104
+ this.turns.set(id, updated);
105
+ await this.persist();
106
+ return clone(updated);
107
+ }
108
+ async recoverExpiredConversationTurns(now = new Date()) {
109
+ const recovered = [];
110
+ for (const current of this.turns.values()) {
111
+ if (current.status !== "running" ||
112
+ !current.leaseExpiresAt ||
113
+ current.leaseExpiresAt > now.toISOString() ||
114
+ current.runId)
115
+ continue;
116
+ const updated = {
117
+ ...current,
118
+ status: current.attemptCount >= current.maxAttempts ? "failed" : "pending",
119
+ nextAttemptAt: now.toISOString(),
120
+ updatedAt: now.toISOString(),
121
+ lastError: current.lastError ?? "Conversation turn lease expired before a run was attached."
122
+ };
123
+ delete updated.leaseToken;
124
+ delete updated.leaseExpiresAt;
125
+ this.turns.set(updated.id, updated);
126
+ recovered.push(clone(updated));
127
+ }
128
+ if (recovered.length > 0)
129
+ await this.persist();
130
+ return recovered;
131
+ }
132
+ async listConversationTurns(options = {}) {
133
+ return [...this.turns.values()]
134
+ .filter((turn) => !options.agentScope || turn.agentScope === options.agentScope)
135
+ .filter((turn) => !options.conversationId || turn.conversationId === options.conversationId)
136
+ .filter((turn) => !options.status || turn.status === options.status)
137
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt))
138
+ .map(clone);
139
+ }
140
+ requireLease(id, leaseToken) {
141
+ const current = this.turns.get(id);
142
+ if (!current)
143
+ throw new Error(`Conversation turn not found: ${id}`);
144
+ if (current.status !== "running" || current.leaseToken !== leaseToken) {
145
+ throw new Error(`Conversation turn lease mismatch: ${id}`);
146
+ }
147
+ return current;
148
+ }
149
+ async settle(current, status, options) {
150
+ const updated = {
151
+ ...current,
152
+ status,
153
+ updatedAt: timestamp()
154
+ };
155
+ if (options.runId)
156
+ updated.runId = options.runId;
157
+ if (options.error)
158
+ updated.lastError = options.error;
159
+ delete updated.leaseToken;
160
+ delete updated.leaseExpiresAt;
161
+ this.turns.set(updated.id, updated);
162
+ await this.persist();
163
+ return clone(updated);
164
+ }
165
+ }
166
+ //# sourceMappingURL=in-memory-conversation-turn-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-conversation-turn-store.js","sourceRoot":"","sources":["../src/in-memory-conversation-turn-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { JsonObject } from "@assemblyline-agents/core";
2
+ import { type DeliveryFailureInput, type DeliveryLeaseOptions, type DeliveryObligationInput, type DeliveryObligationPatch } from "./delivery-queue.js";
3
+ import type { CheckpointRecord, CheckpointRetentionOptions, CheckpointRetentionResult, DeliveryObligation, RunEvent, RunEventType, RunRecord, RunControlIntent, RunStore, ToolCallRecord } from "./state.js";
4
+ export declare class InMemoryRunStore implements RunStore {
5
+ private readonly persist;
6
+ runs: Map<string, RunRecord>;
7
+ events: RunEvent[];
8
+ toolCalls: Map<string, ToolCallRecord>;
9
+ checkpoints: CheckpointRecord[];
10
+ deliveries: Map<string, DeliveryObligation>;
11
+ idempotency: Set<string>;
12
+ constructor(persist?: () => Promise<void>);
13
+ createRun(input: Omit<RunRecord, "id" | "createdAt" | "updatedAt">): Promise<RunRecord>;
14
+ updateRun(id: string, patch: Partial<Omit<RunRecord, "id" | "createdAt">>): Promise<RunRecord>;
15
+ touchRun(id: string): Promise<void>;
16
+ requestRunControl(id: string, intent: RunControlIntent): Promise<RunRecord>;
17
+ settleRunControl(id: string): Promise<RunRecord>;
18
+ getRun(id: string): Promise<RunRecord | undefined>;
19
+ listRuns(): Promise<RunRecord[]>;
20
+ appendEvent(runId: string, type: RunEventType, data?: JsonObject): Promise<RunEvent>;
21
+ listEvents(runId: string): Promise<RunEvent[]>;
22
+ createToolCall(input: Omit<ToolCallRecord, "id" | "createdAt" | "updatedAt">): Promise<ToolCallRecord>;
23
+ updateToolCall(id: string, patch: Partial<Omit<ToolCallRecord, "id" | "createdAt">>): Promise<ToolCallRecord>;
24
+ listToolCalls(runId: string): Promise<ToolCallRecord[]>;
25
+ createCheckpoint(input: Omit<CheckpointRecord, "id" | "createdAt">): Promise<CheckpointRecord>;
26
+ listCheckpoints(runId: string): Promise<CheckpointRecord[]>;
27
+ compactCheckpoints(options?: CheckpointRetentionOptions): Promise<CheckpointRetentionResult>;
28
+ createDelivery(input: DeliveryObligationInput): Promise<DeliveryObligation>;
29
+ updateDelivery(id: string, patch: DeliveryObligationPatch): Promise<DeliveryObligation>;
30
+ listDeliveries(runId: string): Promise<DeliveryObligation[]>;
31
+ leaseDueDeliveries(options?: DeliveryLeaseOptions): Promise<DeliveryObligation[]>;
32
+ completeDeliverySend(id: string, leaseToken: string, patch?: {
33
+ payload?: JsonObject;
34
+ }): Promise<DeliveryObligation>;
35
+ failDeliverySend(id: string, leaseToken: string, failure: DeliveryFailureInput): Promise<DeliveryObligation>;
36
+ recoverExpiredDeliveries(now?: Date): Promise<DeliveryObligation[]>;
37
+ reserveIdempotencyKey(scope: string, key: string, _ownerId?: string): Promise<boolean>;
38
+ }
39
+ //# sourceMappingURL=in-memory-run-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-run-store.d.ts","sourceRoot":"","sources":["../src/in-memory-run-store.ts"],"names":[],"mappings":"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"}