@assemblyline-agents/runtime 1.0.0 → 3.0.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.
- package/LICENSE +1 -1
- package/dist/a2a-client.d.ts +22 -0
- package/dist/a2a-client.d.ts.map +1 -0
- package/dist/a2a-client.js +211 -0
- package/dist/a2a-client.js.map +1 -0
- package/dist/agent-capability-snapshot.d.ts +32 -0
- package/dist/agent-capability-snapshot.d.ts.map +1 -0
- package/dist/agent-capability-snapshot.js +77 -0
- package/dist/agent-capability-snapshot.js.map +1 -0
- package/dist/agent-event-handlers.d.ts +21 -0
- package/dist/agent-event-handlers.d.ts.map +1 -0
- package/dist/agent-event-handlers.js +64 -0
- package/dist/agent-event-handlers.js.map +1 -0
- package/dist/agent-hook-context.d.ts +8 -0
- package/dist/agent-hook-context.d.ts.map +1 -0
- package/dist/agent-hook-context.js +29 -0
- package/dist/agent-hook-context.js.map +1 -0
- package/dist/agent-hook-evaluation.d.ts +61 -0
- package/dist/agent-hook-evaluation.d.ts.map +1 -0
- package/dist/agent-hook-evaluation.js +197 -0
- package/dist/agent-hook-evaluation.js.map +1 -0
- package/dist/agent-hook-run-lifecycle.d.ts +44 -0
- package/dist/agent-hook-run-lifecycle.d.ts.map +1 -0
- package/dist/agent-hook-run-lifecycle.js +76 -0
- package/dist/agent-hook-run-lifecycle.js.map +1 -0
- package/dist/agent-state.d.ts +31 -0
- package/dist/agent-state.d.ts.map +1 -0
- package/dist/agent-state.js +80 -0
- package/dist/agent-state.js.map +1 -0
- package/dist/agent-surface.d.ts +32 -0
- package/dist/agent-surface.d.ts.map +1 -0
- package/dist/agent-surface.js +85 -0
- package/dist/agent-surface.js.map +1 -0
- package/dist/attachments.d.ts +5 -1
- package/dist/attachments.d.ts.map +1 -1
- package/dist/attachments.js +58 -32
- package/dist/attachments.js.map +1 -1
- package/dist/audience.d.ts +30 -0
- package/dist/audience.d.ts.map +1 -0
- package/dist/audience.js +68 -0
- package/dist/audience.js.map +1 -0
- package/dist/authored-hooks.d.ts +6 -0
- package/dist/authored-hooks.d.ts.map +1 -0
- package/dist/authored-hooks.js +17 -0
- package/dist/authored-hooks.js.map +1 -0
- package/dist/automation-event-match.d.ts +8 -0
- package/dist/automation-event-match.d.ts.map +1 -0
- package/dist/automation-event-match.js +25 -0
- package/dist/automation-event-match.js.map +1 -0
- package/dist/background-review-trigger.d.ts +9 -0
- package/dist/background-review-trigger.d.ts.map +1 -0
- package/dist/background-review-trigger.js +72 -0
- package/dist/background-review-trigger.js.map +1 -0
- package/dist/background-review-types.d.ts +60 -0
- package/dist/background-review-types.d.ts.map +1 -0
- package/dist/background-review-types.js +2 -0
- package/dist/background-review-types.js.map +1 -0
- package/dist/background-review-worker.d.ts +14 -0
- package/dist/background-review-worker.d.ts.map +1 -0
- package/dist/background-review-worker.js +61 -0
- package/dist/background-review-worker.js.map +1 -0
- package/dist/background-review.d.ts +5 -0
- package/dist/background-review.d.ts.map +1 -0
- package/dist/background-review.js +332 -0
- package/dist/background-review.js.map +1 -0
- package/dist/builtin-tool-executors.d.ts +50 -27
- package/dist/builtin-tool-executors.d.ts.map +1 -1
- package/dist/builtin-tool-executors.js +332 -124
- package/dist/builtin-tool-executors.js.map +1 -1
- package/dist/builtin-tools.d.ts +16 -9
- package/dist/builtin-tools.d.ts.map +1 -1
- package/dist/builtin-tools.js +308 -116
- package/dist/builtin-tools.js.map +1 -1
- package/dist/capability-catalog.d.ts +3 -2
- package/dist/capability-catalog.d.ts.map +1 -1
- package/dist/capability-catalog.js +12 -7
- package/dist/capability-catalog.js.map +1 -1
- package/dist/capability-inspection.d.ts +31 -0
- package/dist/capability-inspection.d.ts.map +1 -0
- package/dist/capability-inspection.js +58 -0
- package/dist/capability-inspection.js.map +1 -0
- package/dist/channel-http-util.d.ts.map +1 -1
- package/dist/channel-http-util.js +6 -5
- package/dist/channel-http-util.js.map +1 -1
- package/dist/channel-ingress.d.ts +16 -1
- package/dist/channel-ingress.d.ts.map +1 -1
- package/dist/channel-ingress.js +152 -14
- package/dist/channel-ingress.js.map +1 -1
- package/dist/channel.d.ts +73 -3
- package/dist/channel.d.ts.map +1 -1
- package/dist/checkpoints.d.ts +1 -1
- package/dist/checkpoints.d.ts.map +1 -1
- package/dist/checkpoints.js +6 -6
- package/dist/checkpoints.js.map +1 -1
- package/dist/child-process-env.d.ts +7 -0
- package/dist/child-process-env.d.ts.map +1 -0
- package/dist/child-process-env.js +41 -0
- package/dist/child-process-env.js.map +1 -0
- package/dist/computer-relay-protocol.d.ts.map +1 -1
- package/dist/computer-relay-protocol.js +4 -4
- package/dist/computer-relay-protocol.js.map +1 -1
- package/dist/concurrency.d.ts +1 -1
- package/dist/concurrency.js +1 -1
- package/dist/connection-auth-util.d.ts +1 -0
- package/dist/connection-auth-util.d.ts.map +1 -1
- package/dist/connection-auth-util.js +3 -1
- package/dist/connection-auth-util.js.map +1 -1
- package/dist/connection-clients.d.ts +11 -3
- package/dist/connection-clients.d.ts.map +1 -1
- package/dist/connection-clients.js +71 -8
- package/dist/connection-clients.js.map +1 -1
- package/dist/connection-event-store.d.ts +98 -0
- package/dist/connection-event-store.d.ts.map +1 -0
- package/dist/connection-event-store.js +162 -0
- package/dist/connection-event-store.js.map +1 -0
- package/dist/connection-events.d.ts +51 -0
- package/dist/connection-events.d.ts.map +1 -0
- package/dist/connection-events.js +343 -0
- package/dist/connection-events.js.map +1 -0
- package/dist/connection-stores.d.ts +6 -0
- package/dist/connection-stores.d.ts.map +1 -1
- package/dist/connection-stores.js +20 -1
- package/dist/connection-stores.js.map +1 -1
- package/dist/connection-util.d.ts +3 -2
- package/dist/connection-util.d.ts.map +1 -1
- package/dist/connection-util.js +18 -1
- package/dist/connection-util.js.map +1 -1
- package/dist/connections.d.ts +60 -5
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +390 -57
- package/dist/connections.js.map +1 -1
- package/dist/context-policy-util.d.ts.map +1 -1
- package/dist/context-policy-util.js +1 -3
- package/dist/context-policy-util.js.map +1 -1
- package/dist/conversation-context.d.ts +9 -4
- package/dist/conversation-context.d.ts.map +1 -1
- package/dist/conversation-context.js +65 -19
- package/dist/conversation-context.js.map +1 -1
- package/dist/conversation-transcript.d.ts +8 -5
- package/dist/conversation-transcript.d.ts.map +1 -1
- package/dist/conversation-transcript.js +24 -5
- package/dist/conversation-transcript.js.map +1 -1
- package/dist/conversation-turn-coalescing.d.ts +22 -0
- package/dist/conversation-turn-coalescing.d.ts.map +1 -0
- package/dist/conversation-turn-coalescing.js +121 -0
- package/dist/conversation-turn-coalescing.js.map +1 -0
- package/dist/conversation-turn-dispatch.d.ts +5 -2
- package/dist/conversation-turn-dispatch.d.ts.map +1 -1
- package/dist/conversation-turn-dispatch.js +59 -22
- package/dist/conversation-turn-dispatch.js.map +1 -1
- package/dist/default-outbound-route.d.ts +29 -0
- package/dist/default-outbound-route.d.ts.map +1 -0
- package/dist/default-outbound-route.js +105 -0
- package/dist/default-outbound-route.js.map +1 -0
- package/dist/delivery-artifacts.d.ts +2 -0
- package/dist/delivery-artifacts.d.ts.map +1 -0
- package/dist/delivery-artifacts.js +34 -0
- package/dist/delivery-artifacts.js.map +1 -0
- package/dist/delivery-files.d.ts +5 -0
- package/dist/delivery-files.d.ts.map +1 -0
- package/dist/delivery-files.js +33 -0
- package/dist/delivery-files.js.map +1 -0
- package/dist/delivery-queue.d.ts +21 -1
- package/dist/delivery-queue.d.ts.map +1 -1
- package/dist/delivery-queue.js +144 -1
- package/dist/delivery-queue.js.map +1 -1
- package/dist/delivery-send.d.ts +2 -2
- package/dist/delivery-send.d.ts.map +1 -1
- package/dist/delivery-send.js +256 -100
- package/dist/delivery-send.js.map +1 -1
- package/dist/durable-files.d.ts +37 -0
- package/dist/durable-files.d.ts.map +1 -0
- package/dist/durable-files.js +63 -0
- package/dist/durable-files.js.map +1 -0
- package/dist/harness-loop.d.ts +18 -9
- package/dist/harness-loop.d.ts.map +1 -1
- package/dist/harness-loop.js +245 -50
- package/dist/harness-loop.js.map +1 -1
- package/dist/heic-transcode-worker.d.ts +2 -0
- package/dist/heic-transcode-worker.d.ts.map +1 -0
- package/dist/heic-transcode-worker.js +59 -0
- package/dist/heic-transcode-worker.js.map +1 -0
- package/dist/heic-transcode.d.ts +18 -0
- package/dist/heic-transcode.d.ts.map +1 -0
- package/dist/heic-transcode.js +99 -0
- package/dist/heic-transcode.js.map +1 -0
- package/dist/human-input-routing.d.ts +22 -0
- package/dist/human-input-routing.d.ts.map +1 -0
- package/dist/human-input-routing.js +26 -0
- package/dist/human-input-routing.js.map +1 -0
- package/dist/in-memory-agent-state-store.d.ts +21 -0
- package/dist/in-memory-agent-state-store.d.ts.map +1 -0
- package/dist/in-memory-agent-state-store.js +97 -0
- package/dist/in-memory-agent-state-store.js.map +1 -0
- package/dist/in-memory-conversation-turn-store.d.ts +3 -1
- package/dist/in-memory-conversation-turn-store.d.ts.map +1 -1
- package/dist/in-memory-conversation-turn-store.js +41 -2
- package/dist/in-memory-conversation-turn-store.js.map +1 -1
- package/dist/in-memory-run-store.d.ts +8 -0
- package/dist/in-memory-run-store.d.ts.map +1 -1
- package/dist/in-memory-run-store.js +28 -5
- package/dist/in-memory-run-store.js.map +1 -1
- package/dist/in-memory-sandbox-session-store.d.ts +2 -1
- package/dist/in-memory-sandbox-session-store.d.ts.map +1 -1
- package/dist/in-memory-sandbox-session-store.js +65 -1
- package/dist/in-memory-sandbox-session-store.js.map +1 -1
- package/dist/in-memory-small-stores.d.ts +18 -1
- package/dist/in-memory-small-stores.d.ts.map +1 -1
- package/dist/in-memory-small-stores.js +107 -1
- package/dist/in-memory-small-stores.js.map +1 -1
- package/dist/in-memory-workspace-store.d.ts +40 -0
- package/dist/in-memory-workspace-store.d.ts.map +1 -0
- package/dist/in-memory-workspace-store.js +370 -0
- package/dist/in-memory-workspace-store.js.map +1 -0
- package/dist/index.d.ts +116 -45
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +637 -566
- package/dist/index.js.map +1 -1
- package/dist/json-util.d.ts +8 -0
- package/dist/json-util.d.ts.map +1 -1
- package/dist/json-util.js +8 -0
- package/dist/json-util.js.map +1 -1
- package/dist/learning-store.d.ts +111 -0
- package/dist/learning-store.d.ts.map +1 -0
- package/dist/learning-store.js +193 -0
- package/dist/learning-store.js.map +1 -0
- package/dist/local-sandbox.d.ts +3 -2
- package/dist/local-sandbox.d.ts.map +1 -1
- package/dist/local-sandbox.js +69 -25
- package/dist/local-sandbox.js.map +1 -1
- package/dist/mcp-client.d.ts.map +1 -1
- package/dist/mcp-client.js +3 -2
- package/dist/mcp-client.js.map +1 -1
- package/dist/media-processor.d.ts +42 -0
- package/dist/media-processor.d.ts.map +1 -0
- package/dist/media-processor.js +2 -0
- package/dist/media-processor.js.map +1 -0
- package/dist/model-media.d.ts +13 -1
- package/dist/model-media.d.ts.map +1 -1
- package/dist/model-media.js +81 -18
- package/dist/model-media.js.map +1 -1
- package/dist/model-visible-interrupts.d.ts +10 -0
- package/dist/model-visible-interrupts.d.ts.map +1 -0
- package/dist/model-visible-interrupts.js +41 -0
- package/dist/model-visible-interrupts.js.map +1 -0
- package/dist/operator-controls.d.ts.map +1 -1
- package/dist/operator-controls.js +16 -3
- package/dist/operator-controls.js.map +1 -1
- package/dist/outbound-http-policy.d.ts +7 -0
- package/dist/outbound-http-policy.d.ts.map +1 -0
- package/dist/outbound-http-policy.js +155 -0
- package/dist/outbound-http-policy.js.map +1 -0
- package/dist/principals.d.ts +18 -0
- package/dist/principals.d.ts.map +1 -0
- package/dist/principals.js +90 -0
- package/dist/principals.js.map +1 -0
- package/dist/public-api.d.ts +21 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +19 -0
- package/dist/public-api.js.map +1 -0
- package/dist/replay-resume.d.ts +15 -3
- package/dist/replay-resume.d.ts.map +1 -1
- package/dist/replay-resume.js +256 -24
- package/dist/replay-resume.js.map +1 -1
- package/dist/resource-projection-util.d.ts +1 -1
- package/dist/resource-projection-util.d.ts.map +1 -1
- package/dist/resource-projection-util.js +21 -10
- package/dist/resource-projection-util.js.map +1 -1
- package/dist/resource-projection.d.ts +8 -1
- package/dist/resource-projection.d.ts.map +1 -1
- package/dist/resource-projection.js +230 -26
- package/dist/resource-projection.js.map +1 -1
- package/dist/run-heartbeat.d.ts +12 -2
- package/dist/run-heartbeat.d.ts.map +1 -1
- package/dist/run-heartbeat.js +31 -4
- package/dist/run-heartbeat.js.map +1 -1
- package/dist/run-outcome.d.ts +9 -5
- package/dist/run-outcome.d.ts.map +1 -1
- package/dist/run-outcome.js +16 -5
- package/dist/run-outcome.js.map +1 -1
- package/dist/run-recovery.d.ts +31 -2
- package/dist/run-recovery.d.ts.map +1 -1
- package/dist/run-recovery.js +211 -32
- package/dist/run-recovery.js.map +1 -1
- package/dist/run-replay.d.ts +35 -0
- package/dist/run-replay.d.ts.map +1 -0
- package/dist/run-replay.js +193 -0
- package/dist/run-replay.js.map +1 -0
- package/dist/run-result.d.ts +4 -0
- package/dist/run-result.d.ts.map +1 -0
- package/dist/run-result.js +18 -0
- package/dist/run-result.js.map +1 -0
- package/dist/run-timeline-query.d.ts +38 -0
- package/dist/run-timeline-query.d.ts.map +1 -0
- package/dist/run-timeline-query.js +99 -0
- package/dist/run-timeline-query.js.map +1 -0
- package/dist/runs-query.d.ts.map +1 -1
- package/dist/runs-query.js +12 -4
- package/dist/runs-query.js.map +1 -1
- package/dist/runtime-bundle.d.ts.map +1 -1
- package/dist/runtime-bundle.js +2 -0
- package/dist/runtime-bundle.js.map +1 -1
- package/dist/runtime-learning.d.ts +88 -0
- package/dist/runtime-learning.d.ts.map +1 -0
- package/dist/runtime-learning.js +260 -0
- package/dist/runtime-learning.js.map +1 -0
- package/dist/runtime-types.d.ts +79 -10
- package/dist/runtime-types.d.ts.map +1 -1
- package/dist/sandbox-fs.d.ts +9 -5
- package/dist/sandbox-fs.d.ts.map +1 -1
- package/dist/sandbox-fs.js +50 -33
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-handle.d.ts +25 -0
- package/dist/sandbox-handle.d.ts.map +1 -0
- package/dist/sandbox-handle.js +120 -0
- package/dist/sandbox-handle.js.map +1 -0
- package/dist/sandbox-session-identity.d.ts +14 -0
- package/dist/sandbox-session-identity.d.ts.map +1 -0
- package/dist/sandbox-session-identity.js +33 -0
- package/dist/sandbox-session-identity.js.map +1 -0
- package/dist/sandbox-session-key.d.ts.map +1 -1
- package/dist/sandbox-session-key.js +14 -10
- package/dist/sandbox-session-key.js.map +1 -1
- package/dist/sandbox-session-lifecycle.d.ts +12 -0
- package/dist/sandbox-session-lifecycle.d.ts.map +1 -0
- package/dist/sandbox-session-lifecycle.js +261 -0
- package/dist/sandbox-session-lifecycle.js.map +1 -0
- package/dist/sandbox-snapshot-policy.js +3 -3
- package/dist/sandbox-snapshot-policy.js.map +1 -1
- package/dist/sandbox-state-sync.d.ts +22 -0
- package/dist/sandbox-state-sync.d.ts.map +1 -0
- package/dist/sandbox-state-sync.js +147 -0
- package/dist/sandbox-state-sync.js.map +1 -0
- package/dist/sandbox-sync-worker.d.ts +11 -2
- package/dist/sandbox-sync-worker.d.ts.map +1 -1
- package/dist/sandbox-sync-worker.js +143 -31
- package/dist/sandbox-sync-worker.js.map +1 -1
- package/dist/schedule-execution.d.ts.map +1 -1
- package/dist/schedule-execution.js +187 -57
- package/dist/schedule-execution.js.map +1 -1
- package/dist/sdk-api-client.d.ts +17 -0
- package/dist/sdk-api-client.d.ts.map +1 -0
- package/dist/sdk-api-client.js +55 -0
- package/dist/sdk-api-client.js.map +1 -0
- package/dist/security.js +2 -2
- package/dist/security.js.map +1 -1
- package/dist/self-improvement.d.ts +34 -6
- package/dist/self-improvement.d.ts.map +1 -1
- package/dist/self-improvement.js +140 -34
- package/dist/self-improvement.js.map +1 -1
- package/dist/skill-bundles.d.ts +55 -0
- package/dist/skill-bundles.d.ts.map +1 -0
- package/dist/skill-bundles.js +134 -0
- package/dist/skill-bundles.js.map +1 -0
- package/dist/source-loader.d.ts +8 -0
- package/dist/source-loader.d.ts.map +1 -1
- package/dist/source-loader.js +41 -10
- package/dist/source-loader.js.map +1 -1
- package/dist/state-store-helpers.d.ts +2 -0
- package/dist/state-store-helpers.d.ts.map +1 -1
- package/dist/state-store-helpers.js +11 -1
- package/dist/state-store-helpers.js.map +1 -1
- package/dist/state-stores.d.ts +2 -0
- package/dist/state-stores.d.ts.map +1 -1
- package/dist/state-stores.js +40 -7
- package/dist/state-stores.js.map +1 -1
- package/dist/state.d.ts +344 -5
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +44 -2
- package/dist/state.js.map +1 -1
- package/dist/storage.d.ts +59 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +183 -6
- package/dist/storage.js.map +1 -1
- package/dist/subagent-execution.d.ts +7 -6
- package/dist/subagent-execution.d.ts.map +1 -1
- package/dist/subagent-execution.js +58 -19
- package/dist/subagent-execution.js.map +1 -1
- package/dist/target-instructions.d.ts +14 -0
- package/dist/target-instructions.d.ts.map +1 -0
- package/dist/target-instructions.js +18 -0
- package/dist/target-instructions.js.map +1 -0
- package/dist/tool-apis.d.ts.map +1 -1
- package/dist/tool-apis.js +55 -10
- package/dist/tool-apis.js.map +1 -1
- package/dist/tool-execution.d.ts +26 -13
- package/dist/tool-execution.d.ts.map +1 -1
- package/dist/tool-execution.js +368 -239
- package/dist/tool-execution.js.map +1 -1
- package/dist/turn-media.d.ts +29 -0
- package/dist/turn-media.d.ts.map +1 -0
- package/dist/turn-media.js +233 -0
- package/dist/turn-media.js.map +1 -0
- package/dist/usage-reconciliation.d.ts +1 -1
- package/dist/usage-reconciliation.js +1 -1
- package/dist/workspace-id.d.ts +10 -0
- package/dist/workspace-id.d.ts.map +1 -0
- package/dist/workspace-id.js +55 -0
- package/dist/workspace-id.js.map +1 -0
- package/dist/workspace-manifest.d.ts +24 -0
- package/dist/workspace-manifest.d.ts.map +1 -0
- package/dist/workspace-manifest.js +111 -0
- package/dist/workspace-manifest.js.map +1 -0
- package/dist/workspace-operation-limiter.d.ts +16 -0
- package/dist/workspace-operation-limiter.d.ts.map +1 -0
- package/dist/workspace-operation-limiter.js +31 -0
- package/dist/workspace-operation-limiter.js.map +1 -0
- package/dist/workspace-operations.d.ts +145 -0
- package/dist/workspace-operations.d.ts.map +1 -0
- package/dist/workspace-operations.js +420 -0
- package/dist/workspace-operations.js.map +1 -0
- package/dist/workspace-runtime.d.ts +110 -0
- package/dist/workspace-runtime.d.ts.map +1 -0
- package/dist/workspace-runtime.js +240 -0
- package/dist/workspace-runtime.js.map +1 -0
- package/dist/workspace-search.d.ts +55 -0
- package/dist/workspace-search.d.ts.map +1 -0
- package/dist/workspace-search.js +262 -0
- package/dist/workspace-search.js.map +1 -0
- package/dist/workspace-service.d.ts +173 -0
- package/dist/workspace-service.d.ts.map +1 -0
- package/dist/workspace-service.js +619 -0
- package/dist/workspace-service.js.map +1 -0
- package/dist/workspace.d.ts +7 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +7 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +7 -4
- package/dist/agent-harness.d.ts +0 -108
- package/dist/agent-harness.d.ts.map +0 -1
- package/dist/agent-harness.js +0 -2
- package/dist/agent-harness.js.map +0 -1
- package/dist/attachments-legacy.d.ts +0 -17
- package/dist/attachments-legacy.d.ts.map +0 -1
- package/dist/attachments-legacy.js +0 -273
- package/dist/attachments-legacy.js.map +0 -1
- package/dist/code-mode.d.ts +0 -20
- package/dist/code-mode.d.ts.map +0 -1
- package/dist/code-mode.js +0 -658
- package/dist/code-mode.js.map +0 -1
- package/dist/hook-dispatch.d.ts +0 -19
- package/dist/hook-dispatch.d.ts.map +0 -1
- package/dist/hook-dispatch.js +0 -37
- package/dist/hook-dispatch.js.map +0 -1
- package/dist/pi-agent-harness.d.ts +0 -40
- package/dist/pi-agent-harness.d.ts.map +0 -1
- package/dist/pi-agent-harness.js +0 -222
- package/dist/pi-agent-harness.js.map +0 -1
- package/dist/pi-harness.d.ts +0 -42
- package/dist/pi-harness.d.ts.map +0 -1
- package/dist/pi-harness.js +0 -142
- package/dist/pi-harness.js.map +0 -1
- package/dist/run-resolver.d.ts +0 -35
- package/dist/run-resolver.d.ts.map +0 -1
- package/dist/run-resolver.js +0 -84
- package/dist/run-resolver.js.map +0 -1
- package/dist/usage-budget.d.ts +0 -29
- package/dist/usage-budget.d.ts.map +0 -1
- package/dist/usage-budget.js +0 -145
- package/dist/usage-budget.js.map +0 -1
package/dist/run-heartbeat.js
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* fired the controller is aborted immediately; otherwise the heartbeat aborts
|
|
4
4
|
* it when the deadline fires. Returns the unregister function.
|
|
5
5
|
*/
|
|
6
|
-
export function registerRunAbortController(controllers, deadlines, runId, controller) {
|
|
6
|
+
export function registerRunAbortController(controllers, deadlines, runId, controller, controls) {
|
|
7
7
|
let set = controllers.get(runId);
|
|
8
8
|
if (!set) {
|
|
9
9
|
set = new Set();
|
|
10
10
|
controllers.set(runId, set);
|
|
11
11
|
}
|
|
12
12
|
set.add(controller);
|
|
13
|
-
if (deadlines.has(runId))
|
|
13
|
+
if (deadlines.has(runId) || controls?.get(runId) === "cancel")
|
|
14
14
|
controller.abort();
|
|
15
15
|
return () => {
|
|
16
16
|
set.delete(controller);
|
|
@@ -18,6 +18,27 @@ export function registerRunAbortController(controllers, deadlines, runId, contro
|
|
|
18
18
|
controllers.delete(runId);
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
|
+
/** Track an execution around the heartbeat lifecycle without bloating the runtime orchestrator. */
|
|
22
|
+
export function trackActiveRunHeartbeat(activeRuns, runId, heartbeat) {
|
|
23
|
+
activeRuns.add(runId);
|
|
24
|
+
return {
|
|
25
|
+
stop: () => {
|
|
26
|
+
heartbeat.stop();
|
|
27
|
+
activeRuns.delete(runId);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Route a control to locally active execution and hard-abort cancellation. */
|
|
32
|
+
export function cacheRunControlSignal(intents, activeRuns, controllers, runId, intent) {
|
|
33
|
+
if (intent && activeRuns.has(runId))
|
|
34
|
+
intents.set(runId, intent);
|
|
35
|
+
else
|
|
36
|
+
intents.delete(runId);
|
|
37
|
+
if (intent === "cancel") {
|
|
38
|
+
for (const controller of controllers.get(runId) ?? [])
|
|
39
|
+
controller.abort();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
21
42
|
export function startRunHeartbeatImpl(host, runId) {
|
|
22
43
|
const startedAtMs = Date.now();
|
|
23
44
|
let deadlineFired = false;
|
|
@@ -33,10 +54,16 @@ export function startRunHeartbeatImpl(host, runId) {
|
|
|
33
54
|
host.abortRunControllers(runId);
|
|
34
55
|
}
|
|
35
56
|
const current = await host.state.getRun(runId);
|
|
36
|
-
if (current?.controlIntent)
|
|
57
|
+
if (current?.status === "cancelled" || current?.controlIntent === "cancel") {
|
|
58
|
+
host.runControlIntents.set(runId, "cancel");
|
|
59
|
+
host.abortRunControllers(runId);
|
|
60
|
+
}
|
|
61
|
+
else if (current?.controlIntent) {
|
|
37
62
|
host.runControlIntents.set(runId, current.controlIntent);
|
|
38
|
-
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
39
65
|
host.runControlIntents.delete(runId);
|
|
66
|
+
}
|
|
40
67
|
if (host.state.touchRun) {
|
|
41
68
|
await host.state.touchRun(runId);
|
|
42
69
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-heartbeat.js","sourceRoot":"","sources":["../src/run-heartbeat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-heartbeat.js","sourceRoot":"","sources":["../src/run-heartbeat.ts"],"names":[],"mappings":"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"}
|
package/dist/run-outcome.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { RunControlIntent, RunRecord, StateAdapter } from "./state.js";
|
|
|
6
6
|
* failure carries a machine-readable reason on both the run record
|
|
7
7
|
* (`terminalReason`/`terminalError`) and the `run.failed` event payload.
|
|
8
8
|
*/
|
|
9
|
-
export type RunFailureReason = "model.request_failed" | "run.max_iterations_exceeded" | "run.max_duration_exceeded" | "output.validation_exhausted" | "run.suspend_failed" | "run.control_failed" | "tool.execution_failed" | "connection.tool_failed" | "trigger.prepare_failed" | "trigger.model_failed" | "trigger.finalize_failed" | "run.orphaned";
|
|
9
|
+
export type RunFailureReason = "agent.hook_evaluation_failed" | "connection.unavailable" | "run.capability_violation" | "model.request_failed" | "run.max_iterations_exceeded" | "run.max_duration_exceeded" | "output.validation_exhausted" | "run.suspend_failed" | "run.control_failed" | "tool.execution_failed" | "connection.tool_failed" | "trigger.prepare_failed" | "trigger.model_failed" | "trigger.finalize_failed" | "delivery.preparation_failed" | "run.orphaned" | "run.execution_failed";
|
|
10
10
|
export interface RunFailureInput {
|
|
11
11
|
reason: RunFailureReason;
|
|
12
12
|
error: string;
|
|
@@ -35,13 +35,17 @@ export declare function logTerminalRunEvent(logger: RuntimeLogger, runId: string
|
|
|
35
35
|
}): void;
|
|
36
36
|
/**
|
|
37
37
|
* Handle an error escaping run execution. Fatal model errors (bad key,
|
|
38
|
-
* invalid request — classified by the harness) terminalize
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
38
|
+
* invalid request, exhausted quota — classified by the harness) terminalize
|
|
39
|
+
* immediately and enqueue a user-visible failure notice, since async channels
|
|
40
|
+
* would otherwise never learn the outcome; everything else stays `running` so
|
|
41
|
+
* the recovery sweep can resume from the latest continuation — but is durably
|
|
42
|
+
* evented and logged first. Callers rethrow to preserve their existing
|
|
43
|
+
* failure contract.
|
|
42
44
|
*/
|
|
43
45
|
export declare function handleRunExecutionError(deps: {
|
|
44
46
|
state: StateAdapter;
|
|
45
47
|
logger: RuntimeLogger;
|
|
48
|
+
deliveryQueueMaxAttempts: number;
|
|
49
|
+
now(): Date;
|
|
46
50
|
}, runId: string, error: unknown): Promise<void>;
|
|
47
51
|
//# sourceMappingURL=run-outcome.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-outcome.d.ts","sourceRoot":"","sources":["../src/run-outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"run-outcome.d.ts","sourceRoot":"","sources":["../src/run-outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5E;;;;GAIG;AAEH,MAAM,MAAM,gBAAgB,GACxB,8BAA8B,GAC9B,wBAAwB,GACxB,0BAA0B,GAC1B,sBAAsB,GACtB,6BAA6B,GAC7B,2BAA2B,GAC3B,6BAA6B,GAC7B,oBAAoB,GACpB,oBAAoB,GACpB,uBAAuB,GACvB,wBAAwB,GACxB,wBAAwB,GACxB,sBAAsB,GACtB,yBAAyB,GACzB,6BAA6B,GAC7B,cAAc,GACd,sBAAsB,CAAC;AAE3B,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,iFAAiF;AACjF,wBAAsB,OAAO,CAC3B,IAAI,EAAE;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,EAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,SAAS,CAAC,CAcpB;AAED,6EAA6E;AAC7E,wBAAsB,mCAAmC,CACvD,IAAI,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CAAE,EAC/E,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA0BhC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACxC,IAAI,CASN;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAC;IAAC,GAAG,IAAI,IAAI,CAAA;CAAE,EACnG,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
package/dist/run-outcome.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { modelErrorClassification } from "@assemblyline-agents/core";
|
|
2
|
+
import { enqueueRunFailureNotice } from "./delivery-queue.js";
|
|
2
3
|
/** Mark a run failed with a durable reason and append the `run.failed` event. */
|
|
3
4
|
export async function failRun(deps, runId, input) {
|
|
4
5
|
const patch = {
|
|
@@ -21,6 +22,11 @@ export async function settleCompletionBoundaryControlImpl(deps, run) {
|
|
|
21
22
|
const current = await deps.state.getRun(run.id);
|
|
22
23
|
if (!current?.controlIntent)
|
|
23
24
|
return undefined;
|
|
25
|
+
if (current.status === "cancelled") {
|
|
26
|
+
const cleared = await deps.state.updateRun(run.id, { controlIntent: undefined });
|
|
27
|
+
deps.runControlIntents.delete(run.id);
|
|
28
|
+
return cleared;
|
|
29
|
+
}
|
|
24
30
|
if (!deps.state.settleRunControl) {
|
|
25
31
|
throw new Error("The configured state adapter does not support atomic run controls.");
|
|
26
32
|
}
|
|
@@ -58,16 +64,21 @@ export function logTerminalRunEvent(logger, runId, event) {
|
|
|
58
64
|
}
|
|
59
65
|
/**
|
|
60
66
|
* Handle an error escaping run execution. Fatal model errors (bad key,
|
|
61
|
-
* invalid request — classified by the harness) terminalize
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
67
|
+
* invalid request, exhausted quota — classified by the harness) terminalize
|
|
68
|
+
* immediately and enqueue a user-visible failure notice, since async channels
|
|
69
|
+
* would otherwise never learn the outcome; everything else stays `running` so
|
|
70
|
+
* the recovery sweep can resume from the latest continuation — but is durably
|
|
71
|
+
* evented and logged first. Callers rethrow to preserve their existing
|
|
72
|
+
* failure contract.
|
|
65
73
|
*/
|
|
66
74
|
export async function handleRunExecutionError(deps, runId, error) {
|
|
67
75
|
const message = error instanceof Error ? error.message : String(error);
|
|
76
|
+
if (error instanceof Error && (error.name === "AgentHookEvaluationError" || error.name === "AgentCapabilityViolationError"))
|
|
77
|
+
return;
|
|
68
78
|
if (modelErrorClassification(error) === "fatal") {
|
|
69
79
|
try {
|
|
70
|
-
await failRun(deps, runId, { reason: "model.request_failed", error: message });
|
|
80
|
+
const failed = await failRun(deps, runId, { reason: "model.request_failed", error: message });
|
|
81
|
+
await enqueueRunFailureNotice(deps, failed, message);
|
|
71
82
|
}
|
|
72
83
|
catch (failure) {
|
|
73
84
|
deps.logger.error("run terminalization failed", {
|
package/dist/run-outcome.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-outcome.js","sourceRoot":"","sources":["../src/run-outcome.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"run-outcome.js","sourceRoot":"","sources":["../src/run-outcome.ts"],"names":[],"mappings":"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"}
|
package/dist/run-recovery.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { RunRecord, StateAdapter } from "./index.js";
|
|
2
2
|
import type { RuntimeLogger } from "./logging.js";
|
|
3
3
|
import type { CheckpointRecord } from "./state.js";
|
|
4
|
+
import type { ConnectionAuthorizationSessionStore } from "./connections.js";
|
|
4
5
|
/**
|
|
5
6
|
* Orphaned-run recovery: a staleness-guarded sweep that repairs runs left in
|
|
6
7
|
* `created`/`running` after a crash. Live runs are protected by a heartbeat
|
|
@@ -21,6 +22,9 @@ export interface RunRecoveryHost {
|
|
|
21
22
|
runHeartbeatMs: number;
|
|
22
23
|
sandboxSyncMaxAttempts: number;
|
|
23
24
|
deliveryQueueMaxAttempts: number;
|
|
25
|
+
connectionAuthorizationSessionStore: ConnectionAuthorizationSessionStore;
|
|
26
|
+
/** Required declaration connections from `selected` with no injected client. */
|
|
27
|
+
missingRequiredConnections(selected: readonly string[]): string[];
|
|
24
28
|
/**
|
|
25
29
|
* Resume the run from its latest persisted harness continuation checkpoint.
|
|
26
30
|
* Returns undefined when no usable continuation exists (caller degrades to
|
|
@@ -75,6 +79,16 @@ export interface BackgroundWorkerOptions {
|
|
|
75
79
|
intervalMs?: number;
|
|
76
80
|
staleAfterMs?: number;
|
|
77
81
|
};
|
|
82
|
+
backgroundReviewWorker?: boolean | {
|
|
83
|
+
intervalMs?: number;
|
|
84
|
+
limit?: number;
|
|
85
|
+
leaseForMs?: number;
|
|
86
|
+
};
|
|
87
|
+
connectionEventWorker?: boolean | {
|
|
88
|
+
intervalMs?: number;
|
|
89
|
+
batchSize?: number;
|
|
90
|
+
leaseForMs?: number;
|
|
91
|
+
};
|
|
78
92
|
}
|
|
79
93
|
export interface BackgroundWorkersController {
|
|
80
94
|
/** Names of the workers that actually started. */
|
|
@@ -105,13 +119,28 @@ export interface BackgroundWorkerHost {
|
|
|
105
119
|
}): {
|
|
106
120
|
stop(): void;
|
|
107
121
|
};
|
|
122
|
+
startBackgroundReviewWorker(options?: {
|
|
123
|
+
intervalMs?: number;
|
|
124
|
+
limit?: number;
|
|
125
|
+
leaseForMs?: number;
|
|
126
|
+
}): {
|
|
127
|
+
stop(): void;
|
|
128
|
+
} | undefined;
|
|
129
|
+
startConnectionEventWorker(options?: {
|
|
130
|
+
intervalMs?: number;
|
|
131
|
+
batchSize?: number;
|
|
132
|
+
leaseForMs?: number;
|
|
133
|
+
}): {
|
|
134
|
+
stop(): void;
|
|
135
|
+
};
|
|
108
136
|
recoverIncompleteRuns(options?: RunRecoveryOptions): Promise<RunRecord[]>;
|
|
109
137
|
agentEnabled(): Promise<boolean>;
|
|
110
138
|
}
|
|
111
139
|
/**
|
|
112
140
|
* Start every durability worker with a per-worker env kill-switch:
|
|
113
|
-
* `
|
|
114
|
-
* `
|
|
141
|
+
* `ASSEMBLY_LINE_DELIVERY_WORKER`, `ASSEMBLY_LINE_SANDBOX_SYNC_WORKER`,
|
|
142
|
+
* `ASSEMBLY_LINE_CONVERSATION_TURN_WORKER`, `ASSEMBLY_LINE_BACKGROUND_REVIEW_WORKER`,
|
|
143
|
+
* `ASSEMBLY_LINE_RUN_RECOVERY`.
|
|
115
144
|
*/
|
|
116
145
|
export declare function startBackgroundWorkersImpl(host: BackgroundWorkerHost, options?: BackgroundWorkerOptions): BackgroundWorkersController;
|
|
117
146
|
//# sourceMappingURL=run-recovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-recovery.d.ts","sourceRoot":"","sources":["../src/run-recovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run-recovery.d.ts","sourceRoot":"","sources":["../src/run-recovery.ts"],"names":[],"mappings":"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"}
|
package/dist/run-recovery.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { assistantTextFromContinuation } from "@assemblyline-agents/pi";
|
|
2
|
-
import { finalDeliveryIdempotencyKey } from "./delivery-queue.js";
|
|
2
|
+
import { enqueueRunFailureNotice, finalDeliveryIdempotencyKey } from "./delivery-queue.js";
|
|
3
3
|
import { storedHarnessContinuation } from "./harness-continuation.js";
|
|
4
4
|
import { failRun } from "./run-outcome.js";
|
|
5
|
+
import { reportRecoveredSandboxSyncJob } from "./sandbox-sync-worker.js";
|
|
5
6
|
const ORPHAN_CANDIDATE_STATUSES = new Set(["created", "running"]);
|
|
6
7
|
// Suspended runs are intentionally excluded: only an explicit operator resume may reactivate them.
|
|
7
8
|
function errorMessage(error) {
|
|
@@ -32,11 +33,20 @@ export async function recoverIncompleteRunsImpl(host, options = {}) {
|
|
|
32
33
|
if (!claimed)
|
|
33
34
|
continue;
|
|
34
35
|
try {
|
|
36
|
+
// The listing is a snapshot: a run that came alive or terminalized
|
|
37
|
+
// between the listing and the claim must not be recovered.
|
|
38
|
+
const current = await state.getRun(run.id);
|
|
39
|
+
if (!current || !ORPHAN_CANDIDATE_STATUSES.has(current.status) || Date.parse(current.updatedAt) > cutoff)
|
|
40
|
+
continue;
|
|
35
41
|
// Open the next claim generation immediately: if THIS sweeper crashes
|
|
36
42
|
// mid-recovery, a later sweep computes a fresh `${id}:${updatedAt}` key
|
|
37
|
-
// instead of skipping the run forever on the burned claim.
|
|
38
|
-
|
|
39
|
-
|
|
43
|
+
// instead of skipping the run forever on the burned claim. Adapters
|
|
44
|
+
// without touchRun fall back to an empty update so the bump still lands.
|
|
45
|
+
if (state.touchRun)
|
|
46
|
+
await state.touchRun(run.id);
|
|
47
|
+
else
|
|
48
|
+
await state.updateRun(run.id, {});
|
|
49
|
+
const outcome = await recoverOrphanedRun(host, current, maxResumeAttempts);
|
|
40
50
|
if (outcome)
|
|
41
51
|
recovered.push(outcome);
|
|
42
52
|
}
|
|
@@ -48,8 +58,135 @@ export async function recoverIncompleteRunsImpl(host, options = {}) {
|
|
|
48
58
|
});
|
|
49
59
|
}
|
|
50
60
|
}
|
|
61
|
+
await recoverStuckConnectionWaits(host, cutoff, now, recovered);
|
|
51
62
|
return recovered;
|
|
52
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Older deployments may have left required-connection or authorization waits
|
|
66
|
+
* parked. Reconcile those records so an expired/missing callback session can
|
|
67
|
+
* never retain a conversation forever. If a non-OAuth connection became
|
|
68
|
+
* available, resume its continuation; otherwise terminalize the legacy wait.
|
|
69
|
+
*/
|
|
70
|
+
async function recoverStuckConnectionWaits(host, cutoff, recoveryNow, recovered) {
|
|
71
|
+
const { state } = host;
|
|
72
|
+
const cutoffIso = new Date(cutoff).toISOString();
|
|
73
|
+
const candidates = state.listRunsByStatus
|
|
74
|
+
? await state.listRunsByStatus(["waiting_for_connection"], { updatedBefore: cutoffIso })
|
|
75
|
+
: (await state.listRuns()).filter((run) => run.status === "waiting_for_connection");
|
|
76
|
+
for (const run of candidates) {
|
|
77
|
+
if (run.status !== "waiting_for_connection" || Date.parse(run.updatedAt) > cutoff)
|
|
78
|
+
continue;
|
|
79
|
+
try {
|
|
80
|
+
let current = await state.getRun(run.id);
|
|
81
|
+
if (!current || current.status !== "waiting_for_connection" || Date.parse(current.updatedAt) > cutoff)
|
|
82
|
+
continue;
|
|
83
|
+
const events = await state.listEvents(run.id);
|
|
84
|
+
// A live OAuth session has a callback resume path and human latency
|
|
85
|
+
// applies. Expired/deleted sessions do not: terminalize them so a legacy
|
|
86
|
+
// parked run cannot retain its conversation mailbox forever.
|
|
87
|
+
const authRequired = events.filter((event) => event.type === "authorization.required").length;
|
|
88
|
+
const authCompleted = events.filter((event) => event.type === "authorization.completed").length;
|
|
89
|
+
if (authRequired > authCompleted) {
|
|
90
|
+
const requiredEvents = events.filter((event) => event.type === "authorization.required");
|
|
91
|
+
const sessions = await Promise.all(requiredEvents.map(async (event) => {
|
|
92
|
+
const challenge = event.data.challenge;
|
|
93
|
+
const sessionId = challenge && typeof challenge === "object" && !Array.isArray(challenge)
|
|
94
|
+
&& typeof challenge.sessionId === "string"
|
|
95
|
+
? String(challenge.sessionId)
|
|
96
|
+
: undefined;
|
|
97
|
+
return sessionId
|
|
98
|
+
? host.connectionAuthorizationSessionStore.getSession(sessionId)
|
|
99
|
+
: undefined;
|
|
100
|
+
}));
|
|
101
|
+
const live = sessions.some((session) => session?.status === "pending" && session.expiresAt > recoveryNow.getTime());
|
|
102
|
+
if (live)
|
|
103
|
+
continue;
|
|
104
|
+
const claimed = await claimConnectionWaitRecovery(state, current, cutoff);
|
|
105
|
+
if (!claimed)
|
|
106
|
+
continue;
|
|
107
|
+
current = claimed;
|
|
108
|
+
for (const session of sessions) {
|
|
109
|
+
if (session?.status === "pending" && session.expiresAt <= recoveryNow.getTime()) {
|
|
110
|
+
await host.connectionAuthorizationSessionStore.updateSession(session.id, { status: "expired" });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const message = "Connection authorization expired before completion. Re-run the request to start a fresh authorization flow.";
|
|
114
|
+
const failed = await failRun({ state }, run.id, {
|
|
115
|
+
reason: "connection.unavailable",
|
|
116
|
+
error: message,
|
|
117
|
+
data: { recovered: true, authorizationExpired: true }
|
|
118
|
+
});
|
|
119
|
+
await enqueueRunFailureNotice(host, current, message);
|
|
120
|
+
await state.appendEvent(run.id, "run.recovered", {
|
|
121
|
+
strategy: "expired-authorization-marked-failed"
|
|
122
|
+
});
|
|
123
|
+
recovered.push(failed);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const claimed = await claimConnectionWaitRecovery(state, current, cutoff);
|
|
127
|
+
if (!claimed)
|
|
128
|
+
continue;
|
|
129
|
+
current = claimed;
|
|
130
|
+
if (state.touchRun)
|
|
131
|
+
await state.touchRun(run.id);
|
|
132
|
+
else
|
|
133
|
+
await state.updateRun(run.id, {});
|
|
134
|
+
const missing = lastMissingConnections(events);
|
|
135
|
+
if (missing.length > 0 && host.missingRequiredConnections(missing).length === 0) {
|
|
136
|
+
try {
|
|
137
|
+
const resumed = await host.resumeRunFromContinuation(current);
|
|
138
|
+
if (resumed) {
|
|
139
|
+
await state.appendEvent(resumed.id, "run.recovered", {
|
|
140
|
+
strategy: "connections-available-resume",
|
|
141
|
+
status: resumed.status
|
|
142
|
+
});
|
|
143
|
+
recovered.push(resumed);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
await state.appendEvent(run.id, "run.recovery_resume_failed", { error: errorMessage(error) });
|
|
149
|
+
host.logger.warn("connection-wait continuation resume failed", { runId: run.id, error: errorMessage(error) });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const message = `Required connection${missing.length === 1 ? "" : "s"} unavailable: ${missing.join(", ") || "unknown"}. Configure the connection and re-send the request.`;
|
|
153
|
+
const failed = await failRun({ state }, run.id, {
|
|
154
|
+
reason: "connection.unavailable",
|
|
155
|
+
error: message,
|
|
156
|
+
data: { recovered: true, missingConnections: missing }
|
|
157
|
+
});
|
|
158
|
+
await enqueueRunFailureNotice(host, current, message);
|
|
159
|
+
await state.appendEvent(run.id, "run.recovered", { strategy: "connection-unavailable-marked-failed" });
|
|
160
|
+
recovered.push(failed);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
host.logger.warn("connection-wait recovery failed for run", { runId: run.id, error: errorMessage(error) });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async function claimConnectionWaitRecovery(state, candidate, cutoff) {
|
|
168
|
+
const claimed = await state.reserveIdempotencyKey("run:connection-recovery", `${candidate.id}:${candidate.updatedAt}`, candidate.id);
|
|
169
|
+
if (!claimed)
|
|
170
|
+
return undefined;
|
|
171
|
+
const current = await state.getRun(candidate.id);
|
|
172
|
+
if (current?.status === "waiting_for_connection"
|
|
173
|
+
&& current.updatedAt === candidate.updatedAt
|
|
174
|
+
&& Date.parse(current.updatedAt) <= cutoff) {
|
|
175
|
+
return current;
|
|
176
|
+
}
|
|
177
|
+
await state.releaseIdempotencyKey?.("run:connection-recovery", `${candidate.id}:${candidate.updatedAt}`);
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
function lastMissingConnections(events) {
|
|
181
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
182
|
+
const event = events[index];
|
|
183
|
+
if (event?.type !== "connection.required")
|
|
184
|
+
continue;
|
|
185
|
+
const list = event.data.missingConnections;
|
|
186
|
+
return Array.isArray(list) ? list.filter((value) => typeof value === "string") : [];
|
|
187
|
+
}
|
|
188
|
+
return [];
|
|
189
|
+
}
|
|
53
190
|
async function recoverOrphanedRun(host, run, maxResumeAttempts) {
|
|
54
191
|
const { state } = host;
|
|
55
192
|
const events = await state.listEvents(run.id);
|
|
@@ -120,10 +257,11 @@ async function recoverOrphanedRun(host, run, maxResumeAttempts) {
|
|
|
120
257
|
}
|
|
121
258
|
// No obligation was durably recorded. Only synthesize a fallback delivery
|
|
122
259
|
// when the model's last recorded iteration was a final answer; if it ended
|
|
123
|
-
// requesting tools
|
|
124
|
-
//
|
|
125
|
-
//
|
|
126
|
-
if
|
|
260
|
+
// requesting tools (crashed mid-loop) or in a recorded execution error
|
|
261
|
+
// (the "response" is a failed call's accounting event), there is no answer
|
|
262
|
+
// to deliver, so fall through to the failed branch instead of pushing a
|
|
263
|
+
// recovery notice as if it were the response.
|
|
264
|
+
if (lastModelOutcome(events).kind === "final") {
|
|
127
265
|
const channel = typeof run.input.channel === "string" ? run.input.channel : "local";
|
|
128
266
|
// The final answer usually still exists in the newest continuation
|
|
129
267
|
// checkpoint (pi checkpoints on the final turn too, and a transcript
|
|
@@ -152,6 +290,20 @@ async function recoverOrphanedRun(host, run, maxResumeAttempts) {
|
|
|
152
290
|
return completed;
|
|
153
291
|
}
|
|
154
292
|
}
|
|
293
|
+
// A run whose last recorded outcome is an execution error did not crash —
|
|
294
|
+
// it failed. Terminalize with the real error and tell the user the truth
|
|
295
|
+
// instead of masking it behind the generic restart notice.
|
|
296
|
+
const outcome = lastModelOutcome(events);
|
|
297
|
+
if (outcome.kind === "failed") {
|
|
298
|
+
const failed = await failRun({ state }, run.id, {
|
|
299
|
+
reason: "run.execution_failed",
|
|
300
|
+
error: outcome.error,
|
|
301
|
+
data: { recovered: true }
|
|
302
|
+
});
|
|
303
|
+
await enqueueRunFailureNotice(host, run, outcome.error);
|
|
304
|
+
await state.appendEvent(run.id, "run.recovered", { strategy: "failed-with-recorded-error" });
|
|
305
|
+
return failed;
|
|
306
|
+
}
|
|
155
307
|
const failed = await failRun({ state }, run.id, {
|
|
156
308
|
reason: "run.orphaned",
|
|
157
309
|
error: "Run orphaned: the runtime stopped before this run made durable progress.",
|
|
@@ -267,7 +419,7 @@ export function crashResumeReport(toolCalls, checkpointCreatedAt, interruptedToo
|
|
|
267
419
|
if (completedAfter.length === 0 && interruptedTools.length === 0)
|
|
268
420
|
return undefined;
|
|
269
421
|
const lines = [
|
|
270
|
-
"[
|
|
422
|
+
"[Assembly Line 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
423
|
];
|
|
272
424
|
for (const call of completedAfter) {
|
|
273
425
|
let output;
|
|
@@ -289,19 +441,37 @@ export function crashResumeReport(toolCalls, checkpointCreatedAt, interruptedToo
|
|
|
289
441
|
return lines.join("\n");
|
|
290
442
|
}
|
|
291
443
|
/**
|
|
292
|
-
*
|
|
293
|
-
* (no pending tool calls)
|
|
294
|
-
*
|
|
444
|
+
* What the run's most recent recorded model activity means for recovery:
|
|
445
|
+
* `final` — a final answer (no pending tool calls) that may be deliverable;
|
|
446
|
+
* `failed` — the run ended in a durable execution error (a
|
|
447
|
+
* `run.execution_error`/`run.recovery_resume_failed` after the last response,
|
|
448
|
+
* or a response whose `finishReason` is "failed" — engines record the failed
|
|
449
|
+
* call's accounting event too); `none` — no usable outcome (crashed mid-tool
|
|
450
|
+
* batch or before any response). A synthetic/legacy response event without
|
|
451
|
+
* `toolCallCount` is treated as final for backward compatibility.
|
|
295
452
|
*/
|
|
296
|
-
function
|
|
453
|
+
function lastModelOutcome(events) {
|
|
297
454
|
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
298
455
|
const event = events[index];
|
|
299
|
-
if (event
|
|
456
|
+
if (!event)
|
|
300
457
|
continue;
|
|
301
|
-
|
|
302
|
-
|
|
458
|
+
if (event.type === "run.execution_error" || event.type === "run.recovery_resume_failed") {
|
|
459
|
+
return {
|
|
460
|
+
kind: "failed",
|
|
461
|
+
error: typeof event.data.error === "string" && event.data.error
|
|
462
|
+
? event.data.error
|
|
463
|
+
: "Run execution failed before a response was produced."
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
if (event.type === "model.response_completed") {
|
|
467
|
+
if (event.data.finishReason === "failed") {
|
|
468
|
+
return { kind: "failed", error: "The model call failed before a response was produced." };
|
|
469
|
+
}
|
|
470
|
+
const toolCallCount = event.data.toolCallCount;
|
|
471
|
+
return typeof toolCallCount !== "number" || toolCallCount === 0 ? { kind: "final" } : { kind: "none" };
|
|
472
|
+
}
|
|
303
473
|
}
|
|
304
|
-
return
|
|
474
|
+
return { kind: "none" };
|
|
305
475
|
}
|
|
306
476
|
/**
|
|
307
477
|
* Read the trailing assistant text from the newest continuation checkpoint.
|
|
@@ -349,19 +519,15 @@ async function recoverSandboxSyncState(host, now) {
|
|
|
349
519
|
const { state } = host;
|
|
350
520
|
const recoveredSyncJobs = await state.recoverExpiredSandboxSyncJobs(now);
|
|
351
521
|
for (const job of recoveredSyncJobs) {
|
|
352
|
-
await
|
|
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
|
-
});
|
|
522
|
+
await reportRecoveredSandboxSyncJob(host, job);
|
|
360
523
|
}
|
|
361
524
|
const dirtySessions = await state.listSandboxSessions?.({ dirty: true }) ?? [];
|
|
362
525
|
for (const session of dirtySessions) {
|
|
363
526
|
if (!session.runId)
|
|
364
527
|
continue;
|
|
528
|
+
if (typeof session.manifest.quarantineReason === "string" && session.state === "blocked_requires_operator") {
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
365
531
|
const jobs = await state.listSandboxSyncJobs(session.runId);
|
|
366
532
|
const hasActiveJob = jobs.some((job) => job.sandboxId === session.sandboxId &&
|
|
367
533
|
(job.id === session.syncJobId || job.status === "pending" || job.status === "running" || job.status === "failed" || job.status === "blocked_requires_operator"));
|
|
@@ -376,7 +542,7 @@ async function recoverSandboxSyncState(host, now) {
|
|
|
376
542
|
maxAttempts: host.sandboxSyncMaxAttempts,
|
|
377
543
|
manifest: {
|
|
378
544
|
...session.manifest,
|
|
379
|
-
|
|
545
|
+
sessionRecordKey: session.sessionKey
|
|
380
546
|
}
|
|
381
547
|
});
|
|
382
548
|
await state.updateSandboxSession(session.sessionKey, {
|
|
@@ -413,32 +579,45 @@ function workerOptions(option) {
|
|
|
413
579
|
}
|
|
414
580
|
/**
|
|
415
581
|
* Start every durability worker with a per-worker env kill-switch:
|
|
416
|
-
* `
|
|
417
|
-
* `
|
|
582
|
+
* `ASSEMBLY_LINE_DELIVERY_WORKER`, `ASSEMBLY_LINE_SANDBOX_SYNC_WORKER`,
|
|
583
|
+
* `ASSEMBLY_LINE_CONVERSATION_TURN_WORKER`, `ASSEMBLY_LINE_BACKGROUND_REVIEW_WORKER`,
|
|
584
|
+
* `ASSEMBLY_LINE_RUN_RECOVERY`.
|
|
418
585
|
*/
|
|
419
586
|
export function startBackgroundWorkersImpl(host, options = {}) {
|
|
420
587
|
const started = [];
|
|
421
588
|
const stops = [];
|
|
422
|
-
if (workerEnabled(options.deliveryWorker, host.env.
|
|
589
|
+
if (workerEnabled(options.deliveryWorker, host.env.ASSEMBLY_LINE_DELIVERY_WORKER)) {
|
|
423
590
|
const worker = host.startDeliveryWorker(workerOptions(options.deliveryWorker));
|
|
424
591
|
if (worker) {
|
|
425
592
|
started.push("delivery");
|
|
426
593
|
stops.push(() => worker.stop());
|
|
427
594
|
}
|
|
428
595
|
}
|
|
429
|
-
if (workerEnabled(options.sandboxSyncWorker, host.env.
|
|
596
|
+
if (workerEnabled(options.sandboxSyncWorker, host.env.ASSEMBLY_LINE_SANDBOX_SYNC_WORKER)) {
|
|
430
597
|
const worker = host.startSandboxSyncWorker(workerOptions(options.sandboxSyncWorker));
|
|
431
598
|
if (worker) {
|
|
432
599
|
started.push("sandbox-sync");
|
|
433
600
|
stops.push(() => worker.stop());
|
|
434
601
|
}
|
|
435
602
|
}
|
|
436
|
-
if (workerEnabled(options.conversationTurnWorker, host.env.
|
|
603
|
+
if (workerEnabled(options.conversationTurnWorker, host.env.ASSEMBLY_LINE_CONVERSATION_TURN_WORKER)) {
|
|
437
604
|
const worker = host.startConversationTurnWorker(workerOptions(options.conversationTurnWorker));
|
|
438
605
|
started.push("conversation-turn");
|
|
439
606
|
stops.push(() => worker.stop());
|
|
440
607
|
}
|
|
441
|
-
if (workerEnabled(options.
|
|
608
|
+
if (workerEnabled(options.backgroundReviewWorker, host.env.ASSEMBLY_LINE_BACKGROUND_REVIEW_WORKER)) {
|
|
609
|
+
const worker = host.startBackgroundReviewWorker(workerOptions(options.backgroundReviewWorker));
|
|
610
|
+
if (worker) {
|
|
611
|
+
started.push("background-review");
|
|
612
|
+
stops.push(() => worker.stop());
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
if (workerEnabled(options.connectionEventWorker, host.env.ASSEMBLY_LINE_CONNECTION_EVENT_WORKER)) {
|
|
616
|
+
const worker = host.startConnectionEventWorker(workerOptions(options.connectionEventWorker));
|
|
617
|
+
started.push("connection-events");
|
|
618
|
+
stops.push(() => worker.stop());
|
|
619
|
+
}
|
|
620
|
+
if (workerEnabled(options.runRecovery, host.env.ASSEMBLY_LINE_RUN_RECOVERY)) {
|
|
442
621
|
const recovery = workerOptions(options.runRecovery);
|
|
443
622
|
const intervalMs = typeof recovery.intervalMs === "number" && recovery.intervalMs > 0
|
|
444
623
|
? Math.floor(recovery.intervalMs)
|