@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,466 @@
1
+ import { assistantTextFromContinuation } from "@assemblyline-agents/pi";
2
+ import { finalDeliveryIdempotencyKey } from "./delivery-queue.js";
3
+ import { storedHarnessContinuation } from "./harness-continuation.js";
4
+ import { failRun } from "./run-outcome.js";
5
+ const ORPHAN_CANDIDATE_STATUSES = new Set(["created", "running"]);
6
+ // Suspended runs are intentionally excluded: only an explicit operator resume may reactivate them.
7
+ function errorMessage(error) {
8
+ return error instanceof Error ? error.message : String(error);
9
+ }
10
+ export function defaultRunStaleAfterMs(runHeartbeatMs) {
11
+ return Math.max(5 * 60_000, 4 * runHeartbeatMs);
12
+ }
13
+ export async function recoverIncompleteRunsImpl(host, options = {}) {
14
+ const { state } = host;
15
+ const now = options.now ?? host.now();
16
+ await recoverSandboxSyncState(host, now);
17
+ const staleAfterMs = options.staleAfterMs ?? defaultRunStaleAfterMs(host.runHeartbeatMs);
18
+ const cutoff = now.getTime() - staleAfterMs;
19
+ const cutoffIso = new Date(cutoff).toISOString();
20
+ const candidates = state.listRunsByStatus
21
+ ? await state.listRunsByStatus(["created", "running"], { updatedBefore: cutoffIso })
22
+ : await state.listRuns();
23
+ const recovered = [];
24
+ const maxResumeAttempts = options.maxResumeAttempts ?? 1;
25
+ for (const run of candidates) {
26
+ if (!ORPHAN_CANDIDATE_STATUSES.has(run.status))
27
+ continue;
28
+ if (Date.parse(run.updatedAt) > cutoff)
29
+ continue;
30
+ // Multi-replica claim: exactly one sweeper acts on this (run, updatedAt) generation.
31
+ const claimed = await state.reserveIdempotencyKey("run:recovery", `${run.id}:${run.updatedAt}`, run.id);
32
+ if (!claimed)
33
+ continue;
34
+ try {
35
+ // Open the next claim generation immediately: if THIS sweeper crashes
36
+ // mid-recovery, a later sweep computes a fresh `${id}:${updatedAt}` key
37
+ // instead of skipping the run forever on the burned claim.
38
+ await state.touchRun?.(run.id);
39
+ const outcome = await recoverOrphanedRun(host, run, maxResumeAttempts);
40
+ if (outcome)
41
+ recovered.push(outcome);
42
+ }
43
+ catch (error) {
44
+ // One bad run must not abort the sweep for the remaining candidates.
45
+ host.logger.warn("run recovery failed for run", {
46
+ runId: run.id,
47
+ error: error instanceof Error ? error.message : String(error)
48
+ });
49
+ }
50
+ }
51
+ return recovered;
52
+ }
53
+ async function recoverOrphanedRun(host, run, maxResumeAttempts) {
54
+ const { state } = host;
55
+ const events = await state.listEvents(run.id);
56
+ const eventTypes = new Set(events.map((event) => event.type));
57
+ await state.appendEvent(run.id, "run.recovery_started", {
58
+ previousStatus: run.status,
59
+ staleSince: run.updatedAt
60
+ });
61
+ await recoverOutstandingUsageObservations(host, run, events);
62
+ if (eventTypes.has("delivery.sent")) {
63
+ const completed = await state.updateRun(run.id, { status: "completed" });
64
+ await state.appendEvent(run.id, "run.recovered", {
65
+ strategy: "delivery-already-sent",
66
+ duplicatedDelivery: false
67
+ });
68
+ return completed;
69
+ }
70
+ if (eventTypes.has("tool.call_requested") && !eventTypes.has("tool.execution_started")) {
71
+ for (const toolCall of await state.listToolCalls(run.id)) {
72
+ if (toolCall.status === "requested") {
73
+ await state.updateToolCall(toolCall.id, { status: "cancelled" });
74
+ }
75
+ }
76
+ const cancelled = await state.updateRun(run.id, { status: "cancelled" });
77
+ await state.appendEvent(run.id, "run.recovered", {
78
+ strategy: "cancel-before-tool-side-effect",
79
+ duplicatedSideEffect: false
80
+ });
81
+ return cancelled;
82
+ }
83
+ // Tools that started but never settled were mid-execution at crash time.
84
+ // Their external side effects may or may not have happened, so mark them
85
+ // failed-as-interrupted and tell the resume path rather than silently
86
+ // re-driving the model into re-executing them.
87
+ const interruptedTools = await markInterruptedToolCalls(host, run, events);
88
+ const resumeAttempts = events.filter((event) => event.type === "run.recovery_resume_attempted").length;
89
+ if (resumeAttempts < maxResumeAttempts) {
90
+ try {
91
+ const resumed = await host.resumeRunFromContinuation(run, interruptedTools.length > 0 ? { interruptedTools } : undefined);
92
+ if (resumed) {
93
+ await state.appendEvent(resumed.id, "run.recovered", {
94
+ strategy: "resume-from-continuation",
95
+ status: resumed.status
96
+ });
97
+ return resumed;
98
+ }
99
+ }
100
+ catch (error) {
101
+ await state.appendEvent(run.id, "run.recovery_resume_failed", { error: errorMessage(error) });
102
+ host.logger.warn("orphaned run continuation resume failed", { runId: run.id, error: errorMessage(error) });
103
+ }
104
+ }
105
+ if (eventTypes.has("model.response_completed")) {
106
+ // Dedup against the original attempt: creation precedes send in the
107
+ // completion path, so an existing obligation (any status) means delivery
108
+ // is either already settled or already owned by the durable queue —
109
+ // creating a second one here would double-send. The real response text
110
+ // rides on that already-created obligation, so this path is always safe.
111
+ const existing = await state.listDeliveries(run.id);
112
+ if (existing.length > 0) {
113
+ const completed = await state.updateRun(run.id, { status: "completed" });
114
+ await state.appendEvent(run.id, "run.recovered", {
115
+ strategy: "deliver-after-model-response",
116
+ deliveryId: existing[existing.length - 1]?.id ?? null,
117
+ existingObligation: true
118
+ });
119
+ return completed;
120
+ }
121
+ // No obligation was durably recorded. Only synthesize a fallback delivery
122
+ // when the model's last recorded iteration was a final answer; if it ended
123
+ // requesting tools, the run crashed mid-loop with no answer to deliver, so
124
+ // fall through to the failed branch instead of pushing a recovery notice as
125
+ // if it were the response.
126
+ if (lastModelResponseWasFinal(events)) {
127
+ const channel = typeof run.input.channel === "string" ? run.input.channel : "local";
128
+ // The final answer usually still exists in the newest continuation
129
+ // checkpoint (pi checkpoints on the final turn too, and a transcript
130
+ // ending in an assistant message cannot be resumed — but it CAN be
131
+ // read). Deliver the real text when present; the explicit recovery
132
+ // notice is only for genuinely missing checkpoints.
133
+ const recoveredText = await recoverFinalResponseText(host, run.id);
134
+ const delivery = await state.createDelivery({
135
+ runId: run.id,
136
+ channel,
137
+ payload: recoveredDeliveryPayload(run, recoveredText),
138
+ // Same idempotency key the original completion path would have used, so
139
+ // channel-side dedup stays consistent across crash recovery.
140
+ idempotencyKey: finalDeliveryIdempotencyKey(run, channel),
141
+ status: "pending",
142
+ maxAttempts: host.deliveryQueueMaxAttempts,
143
+ nextAttemptAt: host.now().toISOString()
144
+ });
145
+ await state.appendEvent(run.id, "delivery.obligation_created", { deliveryId: delivery.id, recovered: true });
146
+ const completed = await state.updateRun(run.id, { status: "completed" });
147
+ await state.appendEvent(run.id, "run.recovered", {
148
+ strategy: "deliver-after-model-response",
149
+ deliveryId: delivery.id,
150
+ contentRecovered: recoveredText !== undefined
151
+ });
152
+ return completed;
153
+ }
154
+ }
155
+ const failed = await failRun({ state }, run.id, {
156
+ reason: "run.orphaned",
157
+ error: "Run orphaned: the runtime stopped before this run made durable progress.",
158
+ data: { recovered: true }
159
+ });
160
+ await state.appendEvent(run.id, "run.recovered", { strategy: "orphaned-marked-failed" });
161
+ return failed;
162
+ }
163
+ /**
164
+ * Preserve observational completeness for requests interrupted by a crash.
165
+ * No token or cash values are inferred: a request without a recorded response
166
+ * is stored with explicitly unavailable measurements.
167
+ */
168
+ async function recoverOutstandingUsageObservations(host, run, events) {
169
+ const { state } = host;
170
+ const pending = new Map();
171
+ for (const event of [...events].sort((a, b) => a.sequence - b.sequence)) {
172
+ const iteration = event.data.iteration;
173
+ if (typeof iteration !== "number")
174
+ continue;
175
+ if (event.type === "model.request_started" && typeof event.data.requestId === "string") {
176
+ pending.set(iteration, event);
177
+ }
178
+ else if (event.type === "model.response_completed") {
179
+ pending.delete(iteration);
180
+ }
181
+ }
182
+ const recorded = await state.listUsage(run.id);
183
+ for (const [iteration, event] of pending) {
184
+ if (recorded.some((usage) => usage.recordKind === "transaction" && usage.iteration === iteration))
185
+ continue;
186
+ try {
187
+ await state.recordUsage({
188
+ idempotencyKey: String(event.data.requestId),
189
+ runId: run.id,
190
+ agentId: typeof event.data.agentId === "string" ? event.data.agentId : run.agentRevision,
191
+ agentRevision: run.agentRevision,
192
+ iteration,
193
+ provider: typeof event.data.provider === "string" ? event.data.provider : "unknown",
194
+ model: typeof event.data.model === "string" ? event.data.model : "unknown",
195
+ billingMode: typeof event.data.billingMode === "string"
196
+ ? event.data.billingMode
197
+ : "unknown",
198
+ recordKind: "transaction",
199
+ tokenSource: "unavailable",
200
+ costSource: "unavailable",
201
+ ...(typeof event.data.parentRunId === "string" ? { parentRunId: event.data.parentRunId } : {}),
202
+ ...(typeof event.data.subagent === "string" ? { subagent: event.data.subagent } : {}),
203
+ metadata: {
204
+ accountingStatus: "response_unobserved_after_recovery",
205
+ recoveredAt: host.now().toISOString()
206
+ }
207
+ });
208
+ }
209
+ catch (error) {
210
+ host.logger.warn("orphaned request usage observation failed", {
211
+ runId: run.id,
212
+ iteration,
213
+ error: errorMessage(error)
214
+ });
215
+ }
216
+ }
217
+ }
218
+ /**
219
+ * Find tool calls with `tool.execution_started` but no settle event
220
+ * (`tool.execution_completed`/`tool.execution_failed`), mark them failed as
221
+ * interrupted, and return them so the resume can surface the interruption.
222
+ */
223
+ async function markInterruptedToolCalls(host, run, events) {
224
+ const started = new Map();
225
+ for (const event of events) {
226
+ const toolCallId = typeof event.data.toolCallId === "string" ? event.data.toolCallId : undefined;
227
+ if (!toolCallId)
228
+ continue;
229
+ if (event.type === "tool.execution_started") {
230
+ started.set(toolCallId, typeof event.data.toolName === "string" ? event.data.toolName : "");
231
+ }
232
+ else if (event.type === "tool.execution_completed" || event.type === "tool.execution_failed") {
233
+ started.delete(toolCallId);
234
+ }
235
+ }
236
+ const interrupted = [];
237
+ for (const [toolCallId, toolName] of started) {
238
+ interrupted.push({ toolCallId, toolName });
239
+ await host.state.updateToolCall(toolCallId, {
240
+ status: "failed",
241
+ error: "Interrupted: the runtime stopped while this tool was executing; its side effects may or may not have happened."
242
+ }).catch((error) => {
243
+ host.logger.warn("interrupted tool call update failed during recovery", {
244
+ runId: run.id,
245
+ toolCallId,
246
+ error: errorMessage(error)
247
+ });
248
+ });
249
+ await host.state.appendEvent(run.id, "tool.execution_interrupted", { toolCallId, toolName });
250
+ }
251
+ return interrupted;
252
+ }
253
+ const CRASH_REPORT_OUTPUT_MAX_CHARS = 2_000;
254
+ /**
255
+ * Build the crash-resume follow-up message for a run whose iteration was
256
+ * interrupted mid-tool-batch. The restored continuation predates these tool
257
+ * calls, so without this the model would blindly re-request (and re-execute)
258
+ * tools whose side effects already happened. A faithful transcript splice is
259
+ * impossible by design — persisted tool inputs are intentionally redacted —
260
+ * so the durable OUTPUTS are surfaced as an explicit report instead.
261
+ * Returns undefined when nothing post-checkpoint needs surfacing.
262
+ */
263
+ export function crashResumeReport(toolCalls, checkpointCreatedAt, interruptedTools) {
264
+ const completedAfter = checkpointCreatedAt
265
+ ? toolCalls.filter((call) => call.status === "completed" && call.updatedAt > checkpointCreatedAt)
266
+ : [];
267
+ if (completedAfter.length === 0 && interruptedTools.length === 0)
268
+ return undefined;
269
+ const lines = [
270
+ "[OpenEve crash recovery] A runtime restart interrupted the previous model iteration after some tool calls had already executed. Their durable results are below — do not re-run completed side-effecting tools."
271
+ ];
272
+ for (const call of completedAfter) {
273
+ let output;
274
+ try {
275
+ output = JSON.stringify(call.modelOutput ?? null);
276
+ }
277
+ catch {
278
+ output = String(call.modelOutput);
279
+ }
280
+ if (output.length > CRASH_REPORT_OUTPUT_MAX_CHARS) {
281
+ output = `${output.slice(0, CRASH_REPORT_OUTPUT_MAX_CHARS)}… (truncated)`;
282
+ }
283
+ lines.push(`- ${call.toolName}: completed with result ${output}`);
284
+ }
285
+ for (const tool of interruptedTools) {
286
+ lines.push(`- ${tool.toolName}: INTERRUPTED — side effects may or may not have happened; verify before re-running.`);
287
+ }
288
+ lines.push("Continue the task from this state.");
289
+ return lines.join("\n");
290
+ }
291
+ /**
292
+ * True when the model's most recent recorded iteration produced a final answer
293
+ * (no pending tool calls). A synthetic/legacy event without `toolCallCount` is
294
+ * treated as final for backward compatibility.
295
+ */
296
+ function lastModelResponseWasFinal(events) {
297
+ for (let index = events.length - 1; index >= 0; index -= 1) {
298
+ const event = events[index];
299
+ if (event?.type !== "model.response_completed")
300
+ continue;
301
+ const toolCallCount = event.data.toolCallCount;
302
+ return typeof toolCallCount !== "number" || toolCallCount === 0;
303
+ }
304
+ return false;
305
+ }
306
+ /**
307
+ * Read the trailing assistant text from the newest continuation checkpoint.
308
+ * Engine extractors decide whether a continuation is theirs; unknown shapes
309
+ * yield undefined and the caller falls back to the recovery notice.
310
+ */
311
+ async function recoverFinalResponseText(host, runId) {
312
+ try {
313
+ const checkpoints = await host.listHydratedCheckpoints(runId);
314
+ for (let index = checkpoints.length - 1; index >= 0; index -= 1) {
315
+ const checkpoint = checkpoints[index];
316
+ if (!checkpoint || checkpoint.name !== "harness.continuation")
317
+ continue;
318
+ const restored = storedHarnessContinuation(checkpoint.data);
319
+ if (!restored)
320
+ continue;
321
+ return assistantTextFromContinuation(restored.continuation);
322
+ }
323
+ }
324
+ catch (error) {
325
+ host.logger.warn("final response recovery read failed", {
326
+ runId,
327
+ error: error instanceof Error ? error.message : String(error)
328
+ });
329
+ }
330
+ return undefined;
331
+ }
332
+ function recoveredDeliveryPayload(run, recoveredText) {
333
+ // The final response text does not live in the durable event log (only in
334
+ // the harness continuation). When the continuation checkpoint is readable,
335
+ // the real answer is delivered; the explicit notice is the last resort for
336
+ // runs whose checkpoints are genuinely missing or unreadable.
337
+ return {
338
+ response: recoveredText ??
339
+ "⚠️ The previous response was interrupted by a restart before it could be delivered and could not be recovered. Please re-send your request.",
340
+ eventId: typeof run.input.eventId === "string" ? run.input.eventId : null,
341
+ conversationId: typeof run.input.conversationId === "string" ? run.input.conversationId : null,
342
+ delivery: run.input.delivery ?? null,
343
+ recovered: true,
344
+ contentRecovered: recoveredText !== undefined
345
+ };
346
+ }
347
+ /** Requeue expired sandbox-sync leases and re-enqueue jobs for dirty sessions that lost theirs. */
348
+ async function recoverSandboxSyncState(host, now) {
349
+ const { state } = host;
350
+ const recoveredSyncJobs = await state.recoverExpiredSandboxSyncJobs(now);
351
+ for (const job of recoveredSyncJobs) {
352
+ await state.appendEvent(job.runId, "sandbox.sync_retrying", {
353
+ jobId: job.id,
354
+ sandboxId: job.sandboxId,
355
+ reason: "recover-expired-lease",
356
+ attemptCount: job.attemptCount,
357
+ maxAttempts: job.maxAttempts,
358
+ nextAttemptAt: job.nextAttemptAt
359
+ });
360
+ }
361
+ const dirtySessions = await state.listSandboxSessions?.({ dirty: true }) ?? [];
362
+ for (const session of dirtySessions) {
363
+ if (!session.runId)
364
+ continue;
365
+ const jobs = await state.listSandboxSyncJobs(session.runId);
366
+ const hasActiveJob = jobs.some((job) => job.sandboxId === session.sandboxId &&
367
+ (job.id === session.syncJobId || job.status === "pending" || job.status === "running" || job.status === "failed" || job.status === "blocked_requires_operator"));
368
+ if (hasActiveJob)
369
+ continue;
370
+ const job = await state.enqueueSandboxSyncJob({
371
+ runId: session.runId,
372
+ sandboxId: session.sandboxId,
373
+ status: "pending",
374
+ idempotencyKey: `sandbox-sync:${session.runId}:${session.sandboxId}`,
375
+ reason: "dirty-session-recovery",
376
+ maxAttempts: host.sandboxSyncMaxAttempts,
377
+ manifest: {
378
+ ...session.manifest,
379
+ sessionKey: session.sessionKey
380
+ }
381
+ });
382
+ await state.updateSandboxSession(session.sessionKey, {
383
+ state: "dirty",
384
+ dirty: true,
385
+ syncJobId: job.id,
386
+ lastSeenAt: new Date().toISOString()
387
+ }).catch((error) => {
388
+ host.logger.warn("sandbox session update failed during dirty-session recovery", {
389
+ sessionKey: session.sessionKey,
390
+ syncJobId: job.id,
391
+ error: errorMessage(error)
392
+ });
393
+ });
394
+ await state.appendEvent(session.runId, "sandbox.sync_retrying", {
395
+ jobId: job.id,
396
+ sandboxId: session.sandboxId,
397
+ reason: "dirty-session-recovery",
398
+ attemptCount: job.attemptCount,
399
+ maxAttempts: job.maxAttempts,
400
+ nextAttemptAt: job.nextAttemptAt
401
+ });
402
+ }
403
+ }
404
+ function workerEnabled(option, envValue) {
405
+ if (option === false)
406
+ return false;
407
+ if (envValue === "false" || envValue === "0")
408
+ return false;
409
+ return true;
410
+ }
411
+ function workerOptions(option) {
412
+ return typeof option === "object" && option !== null ? option : {};
413
+ }
414
+ /**
415
+ * Start every durability worker with a per-worker env kill-switch:
416
+ * `OPENEVE_DELIVERY_WORKER`, `OPENEVE_SANDBOX_SYNC_WORKER`,
417
+ * `OPENEVE_CONVERSATION_TURN_WORKER`, `OPENEVE_RUN_RECOVERY`.
418
+ */
419
+ export function startBackgroundWorkersImpl(host, options = {}) {
420
+ const started = [];
421
+ const stops = [];
422
+ if (workerEnabled(options.deliveryWorker, host.env.OPENEVE_DELIVERY_WORKER)) {
423
+ const worker = host.startDeliveryWorker(workerOptions(options.deliveryWorker));
424
+ if (worker) {
425
+ started.push("delivery");
426
+ stops.push(() => worker.stop());
427
+ }
428
+ }
429
+ if (workerEnabled(options.sandboxSyncWorker, host.env.OPENEVE_SANDBOX_SYNC_WORKER)) {
430
+ const worker = host.startSandboxSyncWorker(workerOptions(options.sandboxSyncWorker));
431
+ if (worker) {
432
+ started.push("sandbox-sync");
433
+ stops.push(() => worker.stop());
434
+ }
435
+ }
436
+ if (workerEnabled(options.conversationTurnWorker, host.env.OPENEVE_CONVERSATION_TURN_WORKER)) {
437
+ const worker = host.startConversationTurnWorker(workerOptions(options.conversationTurnWorker));
438
+ started.push("conversation-turn");
439
+ stops.push(() => worker.stop());
440
+ }
441
+ if (workerEnabled(options.runRecovery, host.env.OPENEVE_RUN_RECOVERY)) {
442
+ const recovery = workerOptions(options.runRecovery);
443
+ const intervalMs = typeof recovery.intervalMs === "number" && recovery.intervalMs > 0
444
+ ? Math.floor(recovery.intervalMs)
445
+ : host.runRecoveryIntervalMs;
446
+ const sweepOptions = {};
447
+ if (recovery.staleAfterMs !== undefined)
448
+ sweepOptions.staleAfterMs = recovery.staleAfterMs;
449
+ const timer = setInterval(() => {
450
+ void host.agentEnabled().then((enabled) => enabled ? host.recoverIncompleteRuns(sweepOptions) : []).catch((error) => {
451
+ host.logger.warn("run recovery sweep failed", { error: errorMessage(error) });
452
+ });
453
+ }, intervalMs);
454
+ timer.unref?.();
455
+ started.push("run-recovery");
456
+ stops.push(() => clearInterval(timer));
457
+ }
458
+ return {
459
+ started,
460
+ stop() {
461
+ for (const stop of stops)
462
+ stop();
463
+ }
464
+ };
465
+ }
466
+ //# sourceMappingURL=run-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-recovery.js","sourceRoot":"","sources":["../src/run-recovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAwC3C,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAClE,mGAAmG;AAEnG,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,cAAsB;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAqB,EAAE,UAA8B,EAAE;IACrG,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,KAAK,CAAC,gBAAgB;QACvC,CAAC,CAAC,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;QACpF,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,CAAC,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QACzD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,MAAM;YAAE,SAAS;QACjD,qFAAqF;QACrF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,cAAc,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxG,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,sEAAsE;YACtE,wEAAwE;YACxE,2DAA2D;YAC3D,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACvE,IAAI,OAAO;gBAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qEAAqE;YACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC9C,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAqB,EAAE,GAAc,EAAE,iBAAyB;IAChG,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,sBAAsB,EAAE;QACtD,cAAc,EAAE,GAAG,CAAC,MAAM;QAC1B,UAAU,EAAE,GAAG,CAAC,SAAS;KAC1B,CAAC,CAAC;IACH,MAAM,mCAAmC,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAE7D,IAAI,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE;YAC/C,QAAQ,EAAE,uBAAuB;YACjC,kBAAkB,EAAE,KAAK;SAC1B,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACvF,KAAK,MAAM,QAAQ,IAAI,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACpC,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE;YAC/C,QAAQ,EAAE,gCAAgC;YAC1C,oBAAoB,EAAE,KAAK;SAC5B,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,yEAAyE;IACzE,yEAAyE;IACzE,sEAAsE;IACtE,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,MAAM,CAAC;IACvG,IAAI,cAAc,GAAG,iBAAiB,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAClD,GAAG,EACH,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAC/D,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE;oBACnD,QAAQ,EAAE,0BAA0B;oBACpC,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;gBACH,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,4BAA4B,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAC/C,oEAAoE;QACpE,yEAAyE;QACzE,oEAAoE;QACpE,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACzE,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE;gBAC/C,QAAQ,EAAE,8BAA8B;gBACxC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI;gBACrD,kBAAkB,EAAE,IAAI;aACzB,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,2BAA2B;QAC3B,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YACpF,mEAAmE;YACnE,qEAAqE;YACrE,mEAAmE;YACnE,mEAAmE;YACnE,oDAAoD;YACpD,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC;gBAC1C,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,OAAO;gBACP,OAAO,EAAE,wBAAwB,CAAC,GAAG,EAAE,aAAa,CAAC;gBACrD,wEAAwE;gBACxE,6DAA6D;gBAC7D,cAAc,EAAE,2BAA2B,CAAC,GAAG,EAAE,OAAO,CAAC;gBACzD,MAAM,EAAE,SAAS;gBACjB,WAAW,EAAE,IAAI,CAAC,wBAAwB;gBAC1C,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;aACxC,CAAC,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,6BAA6B,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7G,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACzE,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE;gBAC/C,QAAQ,EAAE,8BAA8B;gBACxC,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,gBAAgB,EAAE,aAAa,KAAK,SAAS;aAC9C,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;QAC9C,MAAM,EAAE,cAAc;QACtB,KAAK,EAAE,0EAA0E;QACjF,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;KAC1B,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,mCAAmC,CAChD,IAAqB,EACrB,GAAc,EACd,MAAkB;IAElB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,SAAS;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YACrD,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,aAAa,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;YAAE,SAAS;QAC5G,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,CAAC;gBACtB,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC5C,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,OAAO,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa;gBACxF,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,SAAS;gBACT,QAAQ,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;gBACnF,KAAK,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAC1E,WAAW,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ;oBACrD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAA0E;oBACvF,CAAC,CAAC,SAAS;gBACb,UAAU,EAAE,aAAa;gBACzB,WAAW,EAAE,aAAa;gBAC1B,UAAU,EAAE,aAAa;gBACzB,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,QAAQ,EAAE;oBACR,gBAAgB,EAAE,oCAAoC;oBACtD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;iBACtC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;gBAC5D,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,SAAS;gBACT,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,wBAAwB,CACrC,IAAqB,EACrB,GAAc,EACd,MAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QACjG,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YAC/F,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAoD,EAAE,CAAC;IACxE,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7C,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE;YAC1C,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,gHAAgH;SACxH,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,EAAE;gBACtE,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,UAAU;gBACV,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,4BAA4B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAgG,EAChG,mBAAuC,EACvC,gBAAiE;IAEjE,MAAM,cAAc,GAAG,mBAAmB;QACxC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC;QACjG,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACnF,MAAM,KAAK,GAAG;QACZ,iNAAiN;KAClN,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,6BAA6B,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,6BAA6B,CAAC,eAAe,CAAC;QAC5E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,2BAA2B,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,sFAAsF,CAAC,CAAC;IACvH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CAAC,MAAkB;IACnD,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,EAAE,IAAI,KAAK,0BAA0B;YAAE,SAAS;QACzD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;QAC/C,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,wBAAwB,CAAC,IAAqB,EAAE,KAAa;IAC1E,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC9D,KAAK,IAAI,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAChE,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,sBAAsB;gBAAE,SAAS;YACxE,MAAM,QAAQ,GAAG,yBAAyB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,OAAO,6BAA6B,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;YACtD,KAAK;YACL,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAc,EAAE,aAAsB;IACtE,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,8DAA8D;IAC9D,OAAO;QACL,QAAQ,EAAE,aAAa;YACrB,6IAA6I;QAC/I,OAAO,EAAE,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACzE,cAAc,EAAE,OAAO,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI;QAC9F,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI;QACpC,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,aAAa,KAAK,SAAS;KAC9C,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,KAAK,UAAU,uBAAuB,CAAC,IAAqB,EAAE,GAAS;IACrE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACzE,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,uBAAuB,EAAE;YAC1D,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,uBAAuB;YAC/B,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,mBAAmB,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/E,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,SAAS;QAC7B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACrC,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;YACnC,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,2BAA2B,CAAC,CAChK,CAAC;QACF,IAAI,YAAY;YAAE,SAAS;QAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC;YAC5C,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,SAAS;YACjB,cAAc,EAAE,gBAAgB,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE;YACpE,MAAM,EAAE,wBAAwB;YAChC,WAAW,EAAE,IAAI,CAAC,sBAAsB;YACxC,QAAQ,EAAE;gBACR,GAAG,OAAO,CAAC,QAAQ;gBACnB,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B;SACF,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE;YACnD,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6DAA6D,EAAE;gBAC9E,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,uBAAuB,EAAE;YAC9D,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,wBAAwB;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AA2BD,SAAS,aAAa,CAAC,MAAoC,EAAE,QAA4B;IACvF,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAmB,MAA+B;IACtE,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,EAAQ,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAA0B,EAAE,UAAmC,EAAE;IAC1G,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,aAAa,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/E,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,IAAI,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,IAAI,aAAa,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAE,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,aAAa,CAAiD,OAAO,CAAC,WAAW,CAAC,CAAC;QACpG,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC;YACnF,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAC/B,MAAM,YAAY,GAAuB,EAAE,CAAC;QAC5C,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YAAE,YAAY,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC3F,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAClH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO;QACL,OAAO;QACP,IAAI;YACF,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { AgentManifest, JsonObject, RunResolution, SourceReference } from "@assemblyline-agents/core";
2
+ /**
3
+ * Per-run capability resolution: `resolvers.ts` returns a declaration (model,
4
+ * appended instructions, default tool set) that the runtime records as a
5
+ * `run.capabilities_resolved` event BEFORE applying it, so eval traces and
6
+ * replay always show what a run actually resolved to. Resolver errors fail the
7
+ * run — unlike observe-only hooks, a resolver is load-bearing configuration.
8
+ */
9
+ export interface RunResolverHost {
10
+ manifest: AgentManifest;
11
+ env: Record<string, string | undefined>;
12
+ loadModule<T>(source: SourceReference): Promise<T>;
13
+ appendEvent(runId: string, type: string, data: JsonObject): Promise<unknown>;
14
+ }
15
+ export interface RunResolverInput {
16
+ runId: string;
17
+ message: string;
18
+ channel?: string;
19
+ conversationId?: string;
20
+ metadata?: JsonObject;
21
+ }
22
+ export declare function resolveRunCapabilitiesImpl(host: RunResolverHost, input: RunResolverInput): Promise<RunResolution | undefined>;
23
+ /** Append a triggered target skill's instructions to the run's base instructions. */
24
+ export declare function instructionsForRunTargetImpl(host: {
25
+ appendEvent(runId: string, type: string, data: JsonObject): Promise<unknown>;
26
+ skillLoadDetails(skillName: string): Promise<{
27
+ name: string;
28
+ origin: string;
29
+ path: string;
30
+ instructions: string;
31
+ }>;
32
+ }, run: {
33
+ id: string;
34
+ }, target: unknown, baseInstructions: string): Promise<string>;
35
+ //# sourceMappingURL=run-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-resolver.d.ts","sourceRoot":"","sources":["../src/run-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,aAAa,EAEb,eAAe,EAChB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACnD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAoBpC;AAwCD,qFAAqF;AACrF,wBAAsB,4BAA4B,CAChD,IAAI,EAAE;IACJ,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpH,EACD,GAAG,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACnB,MAAM,EAAE,OAAO,EACf,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -0,0 +1,84 @@
1
+ export async function resolveRunCapabilitiesImpl(host, input) {
2
+ const source = host.manifest.resolver;
3
+ if (!source)
4
+ return undefined;
5
+ const module = await host.loadModule(source);
6
+ if (typeof module.default !== "function") {
7
+ throw new Error("resolvers.ts must default-export a run resolver function.");
8
+ }
9
+ const raw = await module.default({
10
+ runId: input.runId,
11
+ agent: { name: host.manifest.agent.name ?? host.manifest.agent.id ?? "agent" },
12
+ message: input.message,
13
+ ...(input.channel !== undefined ? { channel: input.channel } : {}),
14
+ ...(input.conversationId !== undefined ? { conversationId: input.conversationId } : {}),
15
+ ...(input.metadata !== undefined ? { metadata: input.metadata } : {}),
16
+ env: host.env
17
+ });
18
+ if (raw === null || raw === undefined)
19
+ return undefined;
20
+ const resolution = normalizeRunResolution(raw);
21
+ await host.appendEvent(input.runId, "run.capabilities_resolved", resolutionEventData(resolution));
22
+ return resolution;
23
+ }
24
+ function normalizeRunResolution(raw) {
25
+ if (typeof raw !== "object" || Array.isArray(raw)) {
26
+ throw new Error("Run resolver must return a declaration object or null.");
27
+ }
28
+ const resolution = {};
29
+ if (raw.model !== undefined) {
30
+ if (typeof raw.model !== "string" || !raw.model.includes("/")) {
31
+ throw new Error("Run resolver model must be a provider/model string.");
32
+ }
33
+ resolution.model = raw.model;
34
+ }
35
+ if (raw.instructions !== undefined) {
36
+ if (typeof raw.instructions !== "string") {
37
+ throw new Error("Run resolver instructions must be a string.");
38
+ }
39
+ resolution.instructions = raw.instructions;
40
+ }
41
+ if (raw.defaultTools !== undefined) {
42
+ if (!Array.isArray(raw.defaultTools) || raw.defaultTools.some((name) => typeof name !== "string" || !name)) {
43
+ throw new Error("Run resolver defaultTools must be an array of tool names.");
44
+ }
45
+ resolution.defaultTools = [...raw.defaultTools];
46
+ }
47
+ return resolution;
48
+ }
49
+ function resolutionEventData(resolution) {
50
+ const data = {};
51
+ if (resolution.model !== undefined)
52
+ data.model = resolution.model;
53
+ // Record length + content so traces stay readable while diffs stay exact.
54
+ if (resolution.instructions !== undefined) {
55
+ data.instructions = resolution.instructions;
56
+ data.instructionsChars = resolution.instructions.length;
57
+ }
58
+ if (resolution.defaultTools !== undefined)
59
+ data.defaultTools = [...resolution.defaultTools];
60
+ return data;
61
+ }
62
+ /** Append a triggered target skill's instructions to the run's base instructions. */
63
+ export async function instructionsForRunTargetImpl(host, run, target, baseInstructions) {
64
+ if (!target || typeof target !== "object")
65
+ return baseInstructions;
66
+ const typedTarget = target;
67
+ await host.appendEvent(run.id, "target.invocation_prepared", JSON.parse(JSON.stringify(target)));
68
+ if (typedTarget.type !== "skill" || typeof typedTarget.name !== "string")
69
+ return baseInstructions;
70
+ const loaded = await host.skillLoadDetails(typedTarget.name);
71
+ await host.appendEvent(run.id, "skill.loaded", {
72
+ skill: loaded.name,
73
+ origin: loaded.origin,
74
+ path: loaded.path,
75
+ hostDriven: true
76
+ });
77
+ return [
78
+ baseInstructions,
79
+ "",
80
+ `OpenEve triggered target skill: ${loaded.name}`,
81
+ loaded.instructions
82
+ ].join("\n");
83
+ }
84
+ //# sourceMappingURL=run-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-resolver.js","sourceRoot":"","sources":["../src/run-resolver.ts"],"names":[],"mappings":"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"}