@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.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/agent-harness.d.ts +108 -0
- package/dist/agent-harness.d.ts.map +1 -0
- package/dist/agent-harness.js +2 -0
- package/dist/agent-harness.js.map +1 -0
- package/dist/attachments-legacy.d.ts +17 -0
- package/dist/attachments-legacy.d.ts.map +1 -0
- package/dist/attachments-legacy.js +273 -0
- package/dist/attachments-legacy.js.map +1 -0
- package/dist/attachments.d.ts +49 -0
- package/dist/attachments.d.ts.map +1 -0
- package/dist/attachments.js +832 -0
- package/dist/attachments.js.map +1 -0
- package/dist/builtin-tool-executors.d.ts +96 -0
- package/dist/builtin-tool-executors.d.ts.map +1 -0
- package/dist/builtin-tool-executors.js +501 -0
- package/dist/builtin-tool-executors.js.map +1 -0
- package/dist/builtin-tools.d.ts +30 -0
- package/dist/builtin-tools.d.ts.map +1 -0
- package/dist/builtin-tools.js +690 -0
- package/dist/builtin-tools.js.map +1 -0
- package/dist/capability-catalog.d.ts +27 -0
- package/dist/capability-catalog.d.ts.map +1 -0
- package/dist/capability-catalog.js +193 -0
- package/dist/capability-catalog.js.map +1 -0
- package/dist/channel-http-util.d.ts +34 -0
- package/dist/channel-http-util.d.ts.map +1 -0
- package/dist/channel-http-util.js +93 -0
- package/dist/channel-http-util.js.map +1 -0
- package/dist/channel-ingress.d.ts +56 -0
- package/dist/channel-ingress.d.ts.map +1 -0
- package/dist/channel-ingress.js +273 -0
- package/dist/channel-ingress.js.map +1 -0
- package/dist/channel.d.ts +146 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +2 -0
- package/dist/channel.js.map +1 -0
- package/dist/checkpoints.d.ts +34 -0
- package/dist/checkpoints.d.ts.map +1 -0
- package/dist/checkpoints.js +86 -0
- package/dist/checkpoints.js.map +1 -0
- package/dist/code-mode.d.ts +20 -0
- package/dist/code-mode.d.ts.map +1 -0
- package/dist/code-mode.js +658 -0
- package/dist/code-mode.js.map +1 -0
- package/dist/computer-relay-protocol.d.ts +36 -0
- package/dist/computer-relay-protocol.d.ts.map +1 -0
- package/dist/computer-relay-protocol.js +127 -0
- package/dist/computer-relay-protocol.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +193 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/connection-auth-util.d.ts +56 -0
- package/dist/connection-auth-util.d.ts.map +1 -0
- package/dist/connection-auth-util.js +154 -0
- package/dist/connection-auth-util.js.map +1 -0
- package/dist/connection-clients.d.ts +50 -0
- package/dist/connection-clients.d.ts.map +1 -0
- package/dist/connection-clients.js +402 -0
- package/dist/connection-clients.js.map +1 -0
- package/dist/connection-stores.d.ts +108 -0
- package/dist/connection-stores.d.ts.map +1 -0
- package/dist/connection-stores.js +127 -0
- package/dist/connection-stores.js.map +1 -0
- package/dist/connection-util.d.ts +27 -0
- package/dist/connection-util.d.ts.map +1 -0
- package/dist/connection-util.js +118 -0
- package/dist/connection-util.js.map +1 -0
- package/dist/connections.d.ts +152 -0
- package/dist/connections.d.ts.map +1 -0
- package/dist/connections.js +838 -0
- package/dist/connections.js.map +1 -0
- package/dist/content-capture.d.ts +32 -0
- package/dist/content-capture.d.ts.map +1 -0
- package/dist/content-capture.js +77 -0
- package/dist/content-capture.js.map +1 -0
- package/dist/context-policy-util.d.ts +45 -0
- package/dist/context-policy-util.d.ts.map +1 -0
- package/dist/context-policy-util.js +120 -0
- package/dist/context-policy-util.js.map +1 -0
- package/dist/conversation-context.d.ts +55 -0
- package/dist/conversation-context.d.ts.map +1 -0
- package/dist/conversation-context.js +179 -0
- package/dist/conversation-context.js.map +1 -0
- package/dist/conversation-transcript.d.ts +49 -0
- package/dist/conversation-transcript.d.ts.map +1 -0
- package/dist/conversation-transcript.js +77 -0
- package/dist/conversation-transcript.js.map +1 -0
- package/dist/conversation-turn-dispatch.d.ts +46 -0
- package/dist/conversation-turn-dispatch.d.ts.map +1 -0
- package/dist/conversation-turn-dispatch.js +201 -0
- package/dist/conversation-turn-dispatch.js.map +1 -0
- package/dist/delivery-queue.d.ts +89 -0
- package/dist/delivery-queue.d.ts.map +1 -0
- package/dist/delivery-queue.js +244 -0
- package/dist/delivery-queue.js.map +1 -0
- package/dist/delivery-send.d.ts +44 -0
- package/dist/delivery-send.d.ts.map +1 -0
- package/dist/delivery-send.js +494 -0
- package/dist/delivery-send.js.map +1 -0
- package/dist/env-config.d.ts +6 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +27 -0
- package/dist/env-config.js.map +1 -0
- package/dist/eval-run-options.d.ts +37 -0
- package/dist/eval-run-options.d.ts.map +1 -0
- package/dist/eval-run-options.js +106 -0
- package/dist/eval-run-options.js.map +1 -0
- package/dist/harness-continuation.d.ts +54 -0
- package/dist/harness-continuation.d.ts.map +1 -0
- package/dist/harness-continuation.js +58 -0
- package/dist/harness-continuation.js.map +1 -0
- package/dist/harness-loop.d.ts +110 -0
- package/dist/harness-loop.d.ts.map +1 -0
- package/dist/harness-loop.js +575 -0
- package/dist/harness-loop.js.map +1 -0
- package/dist/hook-dispatch.d.ts +19 -0
- package/dist/hook-dispatch.d.ts.map +1 -0
- package/dist/hook-dispatch.js +37 -0
- package/dist/hook-dispatch.js.map +1 -0
- package/dist/http.d.ts +26 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +114 -0
- package/dist/http.js.map +1 -0
- package/dist/in-memory-conversation-turn-store.d.ts +29 -0
- package/dist/in-memory-conversation-turn-store.d.ts.map +1 -0
- package/dist/in-memory-conversation-turn-store.js +166 -0
- package/dist/in-memory-conversation-turn-store.js.map +1 -0
- package/dist/in-memory-run-store.d.ts +39 -0
- package/dist/in-memory-run-store.d.ts.map +1 -0
- package/dist/in-memory-run-store.js +332 -0
- package/dist/in-memory-run-store.js.map +1 -0
- package/dist/in-memory-sandbox-session-store.d.ts +33 -0
- package/dist/in-memory-sandbox-session-store.d.ts.map +1 -0
- package/dist/in-memory-sandbox-session-store.js +186 -0
- package/dist/in-memory-sandbox-session-store.js.map +1 -0
- package/dist/in-memory-small-stores.d.ts +117 -0
- package/dist/in-memory-small-stores.d.ts.map +1 -0
- package/dist/in-memory-small-stores.js +340 -0
- package/dist/in-memory-small-stores.js.map +1 -0
- package/dist/in-memory-usage-store.d.ts +15 -0
- package/dist/in-memory-usage-store.d.ts.map +1 -0
- package/dist/in-memory-usage-store.js +49 -0
- package/dist/in-memory-usage-store.js.map +1 -0
- package/dist/index.d.ts +467 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2046 -0
- package/dist/index.js.map +1 -0
- package/dist/json-util.d.ts +19 -0
- package/dist/json-util.d.ts.map +1 -0
- package/dist/json-util.js +59 -0
- package/dist/json-util.js.map +1 -0
- package/dist/local-sandbox.d.ts +16 -0
- package/dist/local-sandbox.d.ts.map +1 -0
- package/dist/local-sandbox.js +327 -0
- package/dist/local-sandbox.js.map +1 -0
- package/dist/logging.d.ts +16 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +41 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp-client.d.ts +27 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +169 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/model-harnesses.d.ts +4 -0
- package/dist/model-harnesses.d.ts.map +1 -0
- package/dist/model-harnesses.js +6 -0
- package/dist/model-harnesses.js.map +1 -0
- package/dist/model-media.d.ts +36 -0
- package/dist/model-media.d.ts.map +1 -0
- package/dist/model-media.js +234 -0
- package/dist/model-media.js.map +1 -0
- package/dist/operator-controls.d.ts +31 -0
- package/dist/operator-controls.d.ts.map +1 -0
- package/dist/operator-controls.js +71 -0
- package/dist/operator-controls.js.map +1 -0
- package/dist/pi-agent-harness.d.ts +40 -0
- package/dist/pi-agent-harness.d.ts.map +1 -0
- package/dist/pi-agent-harness.js +222 -0
- package/dist/pi-agent-harness.js.map +1 -0
- package/dist/pi-harness.d.ts +42 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +142 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/relay-mcp-client.d.ts +17 -0
- package/dist/relay-mcp-client.d.ts.map +1 -0
- package/dist/relay-mcp-client.js +119 -0
- package/dist/relay-mcp-client.js.map +1 -0
- package/dist/replay-resume.d.ts +107 -0
- package/dist/replay-resume.d.ts.map +1 -0
- package/dist/replay-resume.js +495 -0
- package/dist/replay-resume.js.map +1 -0
- package/dist/resource-projection-util.d.ts +58 -0
- package/dist/resource-projection-util.d.ts.map +1 -0
- package/dist/resource-projection-util.js +298 -0
- package/dist/resource-projection-util.js.map +1 -0
- package/dist/resource-projection.d.ts +45 -0
- package/dist/resource-projection.d.ts.map +1 -0
- package/dist/resource-projection.js +481 -0
- package/dist/resource-projection.js.map +1 -0
- package/dist/run-heartbeat.d.ts +34 -0
- package/dist/run-heartbeat.d.ts.map +1 -0
- package/dist/run-heartbeat.js +62 -0
- package/dist/run-heartbeat.js.map +1 -0
- package/dist/run-outcome.d.ts +47 -0
- package/dist/run-outcome.d.ts.map +1 -0
- package/dist/run-outcome.js +92 -0
- package/dist/run-outcome.js.map +1 -0
- package/dist/run-recovery.d.ts +117 -0
- package/dist/run-recovery.d.ts.map +1 -0
- package/dist/run-recovery.js +466 -0
- package/dist/run-recovery.js.map +1 -0
- package/dist/run-resolver.d.ts +35 -0
- package/dist/run-resolver.d.ts.map +1 -0
- package/dist/run-resolver.js +84 -0
- package/dist/run-resolver.js.map +1 -0
- package/dist/run-stream.d.ts +37 -0
- package/dist/run-stream.d.ts.map +1 -0
- package/dist/run-stream.js +78 -0
- package/dist/run-stream.js.map +1 -0
- package/dist/runs-query.d.ts +29 -0
- package/dist/runs-query.d.ts.map +1 -0
- package/dist/runs-query.js +142 -0
- package/dist/runs-query.js.map +1 -0
- package/dist/runtime-bundle.d.ts +3 -0
- package/dist/runtime-bundle.d.ts.map +1 -0
- package/dist/runtime-bundle.js +18 -0
- package/dist/runtime-bundle.js.map +1 -0
- package/dist/runtime-types.d.ts +397 -0
- package/dist/runtime-types.d.ts.map +1 -0
- package/dist/runtime-types.js +2 -0
- package/dist/runtime-types.js.map +1 -0
- package/dist/runtime-util.d.ts +45 -0
- package/dist/runtime-util.d.ts.map +1 -0
- package/dist/runtime-util.js +116 -0
- package/dist/runtime-util.js.map +1 -0
- package/dist/sandbox-cli-client.d.ts +20 -0
- package/dist/sandbox-cli-client.d.ts.map +1 -0
- package/dist/sandbox-cli-client.js +97 -0
- package/dist/sandbox-cli-client.js.map +1 -0
- package/dist/sandbox-fs.d.ts +56 -0
- package/dist/sandbox-fs.d.ts.map +1 -0
- package/dist/sandbox-fs.js +276 -0
- package/dist/sandbox-fs.js.map +1 -0
- package/dist/sandbox-session-key.d.ts +8 -0
- package/dist/sandbox-session-key.d.ts.map +1 -0
- package/dist/sandbox-session-key.js +32 -0
- package/dist/sandbox-session-key.js.map +1 -0
- package/dist/sandbox-snapshot-policy.d.ts +27 -0
- package/dist/sandbox-snapshot-policy.d.ts.map +1 -0
- package/dist/sandbox-snapshot-policy.js +94 -0
- package/dist/sandbox-snapshot-policy.js.map +1 -0
- package/dist/sandbox-sync-worker.d.ts +63 -0
- package/dist/sandbox-sync-worker.d.ts.map +1 -0
- package/dist/sandbox-sync-worker.js +448 -0
- package/dist/sandbox-sync-worker.js.map +1 -0
- package/dist/schedule-execution.d.ts +59 -0
- package/dist/schedule-execution.d.ts.map +1 -0
- package/dist/schedule-execution.js +951 -0
- package/dist/schedule-execution.js.map +1 -0
- package/dist/scheduler.d.ts +19 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +38 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/security.d.ts +20 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +145 -0
- package/dist/security.js.map +1 -0
- package/dist/self-improvement.d.ts +245 -0
- package/dist/self-improvement.d.ts.map +1 -0
- package/dist/self-improvement.js +554 -0
- package/dist/self-improvement.js.map +1 -0
- package/dist/source-loader.d.ts +19 -0
- package/dist/source-loader.d.ts.map +1 -0
- package/dist/source-loader.js +160 -0
- package/dist/source-loader.js.map +1 -0
- package/dist/state-store-helpers.d.ts +28 -0
- package/dist/state-store-helpers.d.ts.map +1 -0
- package/dist/state-store-helpers.js +164 -0
- package/dist/state-store-helpers.js.map +1 -0
- package/dist/state-stores.d.ts +25 -0
- package/dist/state-stores.d.ts.map +1 -0
- package/dist/state-stores.js +157 -0
- package/dist/state-stores.js.map +1 -0
- package/dist/state.d.ts +736 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +46 -0
- package/dist/state.js.map +1 -0
- package/dist/storage.d.ts +188 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +752 -0
- package/dist/storage.js.map +1 -0
- package/dist/subagent-execution.d.ts +80 -0
- package/dist/subagent-execution.d.ts.map +1 -0
- package/dist/subagent-execution.js +135 -0
- package/dist/subagent-execution.js.map +1 -0
- package/dist/telemetry.d.ts +49 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +60 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tool-apis.d.ts +22 -0
- package/dist/tool-apis.d.ts.map +1 -0
- package/dist/tool-apis.js +344 -0
- package/dist/tool-apis.js.map +1 -0
- package/dist/tool-execution.d.ts +143 -0
- package/dist/tool-execution.d.ts.map +1 -0
- package/dist/tool-execution.js +573 -0
- package/dist/tool-execution.js.map +1 -0
- package/dist/trusted-attachments.d.ts +20 -0
- package/dist/trusted-attachments.d.ts.map +1 -0
- package/dist/trusted-attachments.js +276 -0
- package/dist/trusted-attachments.js.map +1 -0
- package/dist/usage-accounting.d.ts +37 -0
- package/dist/usage-accounting.d.ts.map +1 -0
- package/dist/usage-accounting.js +181 -0
- package/dist/usage-accounting.js.map +1 -0
- package/dist/usage-budget.d.ts +29 -0
- package/dist/usage-budget.d.ts.map +1 -0
- package/dist/usage-budget.js +145 -0
- package/dist/usage-budget.js.map +1 -0
- package/dist/usage-reconciliation.d.ts +76 -0
- package/dist/usage-reconciliation.d.ts.map +1 -0
- package/dist/usage-reconciliation.js +463 -0
- package/dist/usage-reconciliation.js.map +1 -0
- package/dist/usage-records.d.ts +24 -0
- package/dist/usage-records.d.ts.map +1 -0
- package/dist/usage-records.js +445 -0
- package/dist/usage-records.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|