@botbotgo/agent-harness 0.0.475 → 0.0.476
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/README.md +3 -1234
- package/README.zh.md +3 -1191
- package/dist/acp.js +1 -1
- package/dist/api.js +1 -404
- package/dist/benchmark/checkpoint-resume-cost-benchmark.js +1 -55
- package/dist/benchmark/deepagent-local-model-benchmark.js +2 -35
- package/dist/benchmark/upstream-runtime-ab-benchmark.js +1 -179
- package/dist/cli/chat-interactive.js +25 -244
- package/dist/cli/chat-rendering.js +6 -100
- package/dist/cli/chat-stream.js +23 -512
- package/dist/cli/chat-ui.js +21 -199
- package/dist/cli/chat-workspace.js +2 -210
- package/dist/cli/main.js +21 -428
- package/dist/cli/managed-service-commands.js +9 -63
- package/dist/cli/managed-service.js +2 -137
- package/dist/cli/options-init-chat.js +1 -108
- package/dist/cli/options-runtime.js +1 -158
- package/dist/cli/options-serve.js +1 -282
- package/dist/cli/options.js +2 -19
- package/dist/cli/process-guards.js +1 -139
- package/dist/cli/request-tree.js +7 -296
- package/dist/cli/runtime-commands.js +12 -258
- package/dist/cli/runtime-output.js +16 -155
- package/dist/cli/server-commands.js +16 -270
- package/dist/cli/workspace.js +1 -67
- package/dist/cli.js +1 -7
- package/dist/client/acp.js +1 -1
- package/dist/client/in-process.js +1 -67
- package/dist/client/index.js +1 -2
- package/dist/client/types.js +0 -1
- package/dist/client.js +1 -1
- package/dist/contracts/core.js +1 -1
- package/dist/contracts/runtime-evaluation.js +0 -1
- package/dist/contracts/runtime-memory.js +0 -1
- package/dist/contracts/runtime-observability.js +0 -1
- package/dist/contracts/runtime-requests.js +0 -1
- package/dist/contracts/runtime-scheduling.js +0 -1
- package/dist/contracts/runtime.js +1 -27
- package/dist/contracts/types.js +1 -3
- package/dist/contracts/workspace.js +0 -1
- package/dist/flow/build-flow-graph.js +1 -50
- package/dist/flow/export-mermaid.js +2 -464
- package/dist/flow/export-sequence-mermaid.js +2 -325
- package/dist/flow/flow-graph-normalization.js +1 -214
- package/dist/flow/flow-graph-runtime.js +1 -107
- package/dist/flow/flow-graph-upstream.js +1 -494
- package/dist/flow/index.js +1 -3
- package/dist/flow/types.js +0 -1
- package/dist/index.js +1 -5
- package/dist/init-project.js +1 -1
- package/dist/knowledge/config.js +1 -32
- package/dist/knowledge/contracts.js +0 -1
- package/dist/knowledge/index.js +1 -2
- package/dist/knowledge/module.js +12 -909
- package/dist/knowledge/procedural/config.js +1 -125
- package/dist/knowledge/procedural/index.js +1 -2
- package/dist/knowledge/procedural/manager.js +9 -345
- package/dist/mcp.js +1 -2
- package/dist/package-version.d.ts +1 -1
- package/dist/package-version.js +1 -2
- package/dist/persistence/file-store.js +3 -758
- package/dist/persistence/sqlite-request-context-store.js +5 -54
- package/dist/persistence/sqlite-request-queue-store.js +10 -108
- package/dist/persistence/sqlite-runtime.js +1 -86
- package/dist/persistence/sqlite-store.js +62 -810
- package/dist/persistence/types.js +0 -1
- package/dist/projections/presentation.js +37 -206
- package/dist/projections/request-events.js +2 -502
- package/dist/projections/upstream-events.js +1 -201
- package/dist/protocol/a2a/http-discovery.js +1 -178
- package/dist/protocol/a2a/http-rpc.js +6 -622
- package/dist/protocol/a2a/http.js +1 -138
- package/dist/protocol/a2a/task-state.js +3 -317
- package/dist/protocol/acp/client.js +8 -294
- package/dist/protocol/acp/harness-client.js +1 -218
- package/dist/protocol/acp/http.js +5 -130
- package/dist/protocol/acp/server.js +1 -310
- package/dist/protocol/acp/stdio.js +2 -69
- package/dist/protocol/ag-ui/http.js +3 -378
- package/dist/protocol/mcp/server.js +1 -428
- package/dist/resource/backend/workspace-scoped-backend.js +1 -319
- package/dist/resource/isolation.js +1 -237
- package/dist/resource/mcp/tool-support.js +3 -296
- package/dist/resource/mcp-tool-support.js +1 -2
- package/dist/resource/providers/resource-provider.js +1 -215
- package/dist/resource/resource-impl.js +1 -3
- package/dist/resource/resource-types.js +0 -1
- package/dist/resource/resource.js +1 -1
- package/dist/resource/sources.js +1 -247
- package/dist/resource/tools/function-tool-resolver.js +2 -272
- package/dist/runtime/adapter/compat/deepagent-compat.js +1 -29
- package/dist/runtime/adapter/compat/openai-compatible.js +1 -55
- package/dist/runtime/adapter/direct-builtin-utility.js +2 -90
- package/dist/runtime/adapter/flow/execution-context.js +1 -71
- package/dist/runtime/adapter/flow/invocation-flow.js +8 -425
- package/dist/runtime/adapter/flow/invoke-runtime.js +1 -20
- package/dist/runtime/adapter/flow/stream-runtime.js +11 -1395
- package/dist/runtime/adapter/invocation-result.js +2 -473
- package/dist/runtime/adapter/local-tool-invocation.js +6 -638
- package/dist/runtime/adapter/middleware/context-hygiene.js +1 -83
- package/dist/runtime/adapter/middleware-assembly.js +5 -477
- package/dist/runtime/adapter/model/invocation-request.js +3 -183
- package/dist/runtime/adapter/model/message-assembly.js +1 -28
- package/dist/runtime/adapter/model/model-providers.js +23 -1115
- package/dist/runtime/adapter/model/prompted-json-tool-call-capture.js +1 -40
- package/dist/runtime/adapter/model/prompted-json-tool-policy.js +1 -22
- package/dist/runtime/adapter/resilience.js +1 -104
- package/dist/runtime/adapter/runtime-adapter-support.js +3 -141
- package/dist/runtime/adapter/runtime-shell.js +5 -166
- package/dist/runtime/adapter/stream-event-projection.js +2 -622
- package/dist/runtime/adapter/stream-text-consumption.js +1 -18
- package/dist/runtime/adapter/terminal-status.js +2 -67
- package/dist/runtime/adapter/tool/builtin-middleware-tools.js +6 -627
- package/dist/runtime/adapter/tool/declared-middleware.js +1 -154
- package/dist/runtime/adapter/tool/interrupt-policy.js +1 -34
- package/dist/runtime/adapter/tool/provider-tool.js +1 -25
- package/dist/runtime/adapter/tool/resolved-tool.js +1 -225
- package/dist/runtime/adapter/tool/tool-arguments.js +3 -486
- package/dist/runtime/adapter/tool/tool-hitl.js +1 -346
- package/dist/runtime/adapter/tool/tool-name-mapping.js +1 -128
- package/dist/runtime/adapter/tool/tool-output-artifacts.js +2 -88
- package/dist/runtime/adapter/tool/tool-replay.js +1 -37
- package/dist/runtime/adapter/tool-resolution.js +1 -86
- package/dist/runtime/adapter/upstream-configurable-keys.js +1 -2
- package/dist/runtime/agent-runtime-adapter.js +60 -2338
- package/dist/runtime/agent-runtime-assembly.js +7 -249
- package/dist/runtime/env/runtime-env.js +1 -62
- package/dist/runtime/harness/background-runtime.js +1 -8
- package/dist/runtime/harness/bindings.js +1 -58
- package/dist/runtime/harness/events/event-bus.js +1 -16
- package/dist/runtime/harness/events/event-sink.js +1 -61
- package/dist/runtime/harness/events/events.js +1 -80
- package/dist/runtime/harness/events/listener-runtime.js +1 -13
- package/dist/runtime/harness/events/runtime-event-operations.js +1 -9
- package/dist/runtime/harness/events/streaming.js +1 -100
- package/dist/runtime/harness/events/timeline.js +1 -52
- package/dist/runtime/harness/public-shapes.js +1 -186
- package/dist/runtime/harness/run/artifact-paths.js +1 -15
- package/dist/runtime/harness/run/governance.js +1 -295
- package/dist/runtime/harness/run/helpers.js +1 -71
- package/dist/runtime/harness/run/inspection.js +1 -409
- package/dist/runtime/harness/run/operator-overview.js +1 -80
- package/dist/runtime/harness/run/queue-diagnostics.js +1 -15
- package/dist/runtime/harness/run/recovery.js +1 -162
- package/dist/runtime/harness/run/resources.js +1 -60
- package/dist/runtime/harness/run/resume.js +1 -56
- package/dist/runtime/harness/run/routing.js +1 -48
- package/dist/runtime/harness/run/run-lifecycle.js +1 -66
- package/dist/runtime/harness/run/run-operations.js +1 -217
- package/dist/runtime/harness/run/run-queue.js +1 -43
- package/dist/runtime/harness/run/run-slot-acquisition.js +1 -157
- package/dist/runtime/harness/run/session-records.js +1 -97
- package/dist/runtime/harness/run/start-run.js +1 -120
- package/dist/runtime/harness/run/startup-runtime.js +1 -69
- package/dist/runtime/harness/run/stream-run.js +8 -1418
- package/dist/runtime/harness/run/surface-semantics.js +1 -79
- package/dist/runtime/harness/runtime-defaults.js +1 -39
- package/dist/runtime/harness/system/boundary-analysis.js +1 -234
- package/dist/runtime/harness/system/health-monitor.js +1 -258
- package/dist/runtime/harness/system/inventory.js +1 -129
- package/dist/runtime/harness/system/mem0-ingestion-sync.js +5 -345
- package/dist/runtime/harness/system/policy-engine.js +1 -175
- package/dist/runtime/harness/system/runtime-memory-candidates.js +4 -110
- package/dist/runtime/harness/system/runtime-memory-consolidation.js +1 -51
- package/dist/runtime/harness/system/runtime-memory-manager.js +10 -693
- package/dist/runtime/harness/system/runtime-memory-policy.js +1 -155
- package/dist/runtime/harness/system/runtime-memory-records.js +11 -577
- package/dist/runtime/harness/system/runtime-memory-sync.js +5 -206
- package/dist/runtime/harness/system/session-memory-sync.js +3 -113
- package/dist/runtime/harness/system/skill-requirements.js +1 -112
- package/dist/runtime/harness/system/store.js +9 -365
- package/dist/runtime/harness/tool-gateway/index.js +1 -2
- package/dist/runtime/harness/tool-gateway/policy.js +1 -45
- package/dist/runtime/harness/tool-gateway/validation.js +1 -176
- package/dist/runtime/harness/tool-schema.js +1 -3
- package/dist/runtime/harness.js +3 -1490
- package/dist/runtime/index.js +1 -3
- package/dist/runtime/layout/runtime-layout.js +1 -31
- package/dist/runtime/maintenance/checkpoint-maintenance.js +2 -178
- package/dist/runtime/maintenance/file-checkpoint-saver.js +1 -106
- package/dist/runtime/maintenance/runtime-record-maintenance.js +2 -169
- package/dist/runtime/maintenance/sqlite-checkpoint-saver.js +4 -289
- package/dist/runtime/parsing/output-content.js +10 -550
- package/dist/runtime/parsing/output-parsing.js +1 -4
- package/dist/runtime/parsing/output-recovery.js +3 -213
- package/dist/runtime/parsing/output-tool-args.js +7 -663
- package/dist/runtime/parsing/stream-event-parsing.js +3 -362
- package/dist/runtime/prompts/runtime-prompts.js +4 -73
- package/dist/runtime/scheduling/system-schedule-manager.js +11 -532
- package/dist/runtime/skills/skill-metadata.js +1 -197
- package/dist/runtime/startup-tracing.js +2 -37
- package/dist/runtime/support/compiled-binding.js +1 -290
- package/dist/runtime/support/embedding-models.js +1 -118
- package/dist/runtime/support/harness-support.js +5 -137
- package/dist/runtime/support/llamaindex.js +1 -108
- package/dist/runtime/support/runtime-adapter-options.js +1 -29
- package/dist/runtime/support/runtime-factories.js +1 -51
- package/dist/runtime/support/vector-stores.js +9 -270
- package/dist/scaffold/init-project.js +54 -233
- package/dist/tooling/extensions.js +1 -311
- package/dist/tooling/module-loader.js +1 -55
- package/dist/tools.js +1 -176
- package/dist/utils/agent-display.js +1 -18
- package/dist/utils/bundled-text.js +4 -39
- package/dist/utils/compiled-binding.js +1 -33
- package/dist/utils/fs.js +2 -45
- package/dist/utils/id.js +1 -9
- package/dist/utils/message-content.js +1 -30
- package/dist/utils/object.js +1 -6
- package/dist/workspace/agent-binding-compiler.js +3 -613
- package/dist/workspace/compile.js +1 -472
- package/dist/workspace/framework-contract-validation.js +2 -322
- package/dist/workspace/index.js +1 -1
- package/dist/workspace/object-loader-paths.js +1 -71
- package/dist/workspace/object-loader-readers.js +1 -187
- package/dist/workspace/object-loader.js +1 -754
- package/dist/workspace/resource-compilers.js +1 -374
- package/dist/workspace/support/agent-capabilities.js +1 -37
- package/dist/workspace/support/agent-execution-config.js +1 -44
- package/dist/workspace/support/discovery.js +1 -147
- package/dist/workspace/support/source-collectors.js +1 -30
- package/dist/workspace/support/source-protocols.js +2 -192
- package/dist/workspace/support/workspace-ref-utils.js +1 -362
- package/dist/workspace/tool-hydration.js +1 -280
- package/dist/workspace/validate.js +1 -99
- package/dist/workspace/yaml-object-reader.js +1 -285
- package/package.json +7 -3
|
@@ -1,162 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
async function setRequestState(persistence, sessionId, requestId, state, checkpointRef) {
|
|
3
|
-
await persistence.setRequestState(sessionId, requestId, state, checkpointRef);
|
|
4
|
-
}
|
|
5
|
-
async function failRecovery(context, session, previousState, error, options = {}) {
|
|
6
|
-
await context.setRequestStateAndEmit(session.sessionId, session.latestRequestId, 100, "failed", {
|
|
7
|
-
previousState,
|
|
8
|
-
error,
|
|
9
|
-
});
|
|
10
|
-
if (options.releaseRequestClaim) {
|
|
11
|
-
await context.persistence.releaseRequestClaim(session.latestRequestId);
|
|
12
|
-
}
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
async function resolveRecoveryBinding(context, session) {
|
|
16
|
-
const runMeta = await context.persistence.getRequestMeta(session.sessionId, session.latestRequestId);
|
|
17
|
-
const binding = context.getBinding(runMeta.agentId);
|
|
18
|
-
if (!binding) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
return {
|
|
22
|
-
binding,
|
|
23
|
-
agentId: runMeta.agentId,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
async function executeRecoveredRequest(context, input) {
|
|
27
|
-
const { session, binding, agentId, request, previousState, emitResumeEvent } = input;
|
|
28
|
-
const releaseRequestSlot = await context.acquireRequestSlot(session.sessionId, session.latestRequestId, "running", normalizeRequestPriority(request.priority));
|
|
29
|
-
try {
|
|
30
|
-
if (emitResumeEvent) {
|
|
31
|
-
await context.emit(session.sessionId, session.latestRequestId, emitResumeEvent.sequence, emitResumeEvent.eventType, emitResumeEvent.payload);
|
|
32
|
-
}
|
|
33
|
-
await context.executeQueuedRequest(binding, request.input, session.sessionId, session.latestRequestId, agentId, {
|
|
34
|
-
context: request.invocation?.context,
|
|
35
|
-
state: request.invocation?.inputs,
|
|
36
|
-
files: request.invocation?.attachments,
|
|
37
|
-
previousState,
|
|
38
|
-
stateSequence: 103,
|
|
39
|
-
approvalSequence: 104,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
finally {
|
|
43
|
-
await releaseRequestSlot();
|
|
44
|
-
}
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
async function failResumingRecovery(context, session, checkpointRef, error) {
|
|
48
|
-
await setRequestState(context.persistence, session.sessionId, session.latestRequestId, "failed", checkpointRef);
|
|
49
|
-
await context.persistence.clearRequestRecoveryIntent(session.sessionId, session.latestRequestId);
|
|
50
|
-
await context.emit(session.sessionId, session.latestRequestId, 101, "request.state.changed", {
|
|
51
|
-
previousState: "resuming",
|
|
52
|
-
state: "failed",
|
|
53
|
-
checkpointRef,
|
|
54
|
-
...(error ? { error } : {}),
|
|
55
|
-
});
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
export async function recoverQueuedStartupRun(context, session) {
|
|
59
|
-
if (session.status !== "queued") {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
const resolved = await resolveRecoveryBinding(context, session);
|
|
63
|
-
if (!resolved) {
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
const request = await context.persistence.getRequestInput(session.sessionId, session.latestRequestId);
|
|
67
|
-
if (!request) {
|
|
68
|
-
return failRecovery(context, session, "queued", "missing persisted request input for queued request recovery");
|
|
69
|
-
}
|
|
70
|
-
return executeRecoveredRequest(context, {
|
|
71
|
-
session,
|
|
72
|
-
binding: resolved.binding,
|
|
73
|
-
agentId: resolved.agentId,
|
|
74
|
-
request,
|
|
75
|
-
previousState: "queued",
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
export async function recoverRunningStartupRun(context, session) {
|
|
79
|
-
if (session.status !== "running") {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
const isStale = await context.isStaleRunningRequest(session);
|
|
83
|
-
if (!isStale) {
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
const resolved = await resolveRecoveryBinding(context, session);
|
|
87
|
-
if (!resolved) {
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
if (!context.supportsRunningReplay(resolved.binding)) {
|
|
91
|
-
return failRecovery(context, session, "running", "stale running request cannot be replayed safely", {
|
|
92
|
-
releaseRequestClaim: true,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
const request = await context.persistence.getRequestInput(session.sessionId, session.latestRequestId);
|
|
96
|
-
if (!request) {
|
|
97
|
-
return failRecovery(context, session, "running", "missing persisted request input for stale running request recovery", {
|
|
98
|
-
releaseRequestClaim: true,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
return executeRecoveredRequest(context, {
|
|
102
|
-
session,
|
|
103
|
-
binding: resolved.binding,
|
|
104
|
-
agentId: resolved.agentId,
|
|
105
|
-
request,
|
|
106
|
-
previousState: "running",
|
|
107
|
-
emitResumeEvent: {
|
|
108
|
-
sequence: 100,
|
|
109
|
-
eventType: "request.resumed",
|
|
110
|
-
payload: {
|
|
111
|
-
resumeKind: "startup-running-recovery",
|
|
112
|
-
state: "running",
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
export async function recoverResumingStartupRun(context, session) {
|
|
118
|
-
if (session.status !== "resuming" || !context.recoveryConfig.resumeResumingRequestsOnStartup) {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
const binding = context.getBinding(session.agentId);
|
|
122
|
-
if (!binding) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
const recoveryIntent = await context.persistence.getRequestRecoveryIntent(session.sessionId, session.latestRequestId);
|
|
126
|
-
if (!recoveryIntent || recoveryIntent.kind !== "approval-decision") {
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
if (recoveryIntent.attempts >= context.recoveryConfig.maxRecoveryAttempts) {
|
|
130
|
-
return failResumingRecovery(context, session, recoveryIntent.checkpointRef, "recovery attempts exhausted");
|
|
131
|
-
}
|
|
132
|
-
await context.persistence.saveRequestRecoveryIntent(session.sessionId, session.latestRequestId, {
|
|
133
|
-
...recoveryIntent,
|
|
134
|
-
attempts: recoveryIntent.attempts + 1,
|
|
135
|
-
});
|
|
136
|
-
await context.emit(session.sessionId, session.latestRequestId, 100, "request.resumed", {
|
|
137
|
-
resumeKind: "startup-recovery",
|
|
138
|
-
checkpointRef: recoveryIntent.checkpointRef,
|
|
139
|
-
state: "resuming",
|
|
140
|
-
});
|
|
141
|
-
const history = await context.persistence.listSessionMessages(session.sessionId);
|
|
142
|
-
const priorHistory = history.filter((message) => message.requestId !== session.latestRequestId);
|
|
143
|
-
const requestInput = await context.loadRequestInput(session.sessionId, session.latestRequestId);
|
|
144
|
-
const startedAt = Date.now();
|
|
145
|
-
try {
|
|
146
|
-
const actual = await context.runtimeAdapter.invoke(binding, "", session.sessionId, session.latestRequestId, recoveryIntent.resumePayload, priorHistory);
|
|
147
|
-
context.recordLlmSuccess(startedAt);
|
|
148
|
-
await context.persistence.clearRequestRecoveryIntent(session.sessionId, session.latestRequestId);
|
|
149
|
-
await context.finalizeContinuedRequest(binding, session.sessionId, session.latestRequestId, requestInput, actual, {
|
|
150
|
-
previousState: "resuming",
|
|
151
|
-
stateSequence: 101,
|
|
152
|
-
approvalSequence: 102,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
catch (error) {
|
|
156
|
-
context.recordLlmFailure(startedAt);
|
|
157
|
-
if (recoveryIntent.attempts + 1 >= context.recoveryConfig.maxRecoveryAttempts) {
|
|
158
|
-
await failResumingRecovery(context, session, recoveryIntent.checkpointRef, error instanceof Error ? error.message : String(error));
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return true;
|
|
162
|
-
}
|
|
1
|
+
import{normalizeRequestPriority as p}from"./helpers.js";async function I(t,e,a,r,u){await t.setRequestState(e,a,r,u)}async function l(t,e,a,r,u={}){return await t.setRequestStateAndEmit(e.sessionId,e.latestRequestId,100,"failed",{previousState:a,error:r}),u.releaseRequestClaim&&await t.persistence.releaseRequestClaim(e.latestRequestId),!0}async function c(t,e){const a=await t.persistence.getRequestMeta(e.sessionId,e.latestRequestId),r=t.getBinding(a.agentId);return r?{binding:r,agentId:a.agentId}:null}async function R(t,e){const{session:a,binding:r,agentId:u,request:i,previousState:d,emitResumeEvent:s}=e,n=await t.acquireRequestSlot(a.sessionId,a.latestRequestId,"running",p(i.priority));try{s&&await t.emit(a.sessionId,a.latestRequestId,s.sequence,s.eventType,s.payload),await t.executeQueuedRequest(r,i.input,a.sessionId,a.latestRequestId,u,{context:i.invocation?.context,state:i.invocation?.inputs,files:i.invocation?.attachments,previousState:d,stateSequence:103,approvalSequence:104})}finally{await n()}return!0}async function q(t,e,a,r){return await I(t.persistence,e.sessionId,e.latestRequestId,"failed",a),await t.persistence.clearRequestRecoveryIntent(e.sessionId,e.latestRequestId),await t.emit(e.sessionId,e.latestRequestId,101,"request.state.changed",{previousState:"resuming",state:"failed",checkpointRef:a,...r?{error:r}:{}}),!0}async function o(t,e){if(e.status!=="queued")return!1;const a=await c(t,e);if(!a)return!0;const r=await t.persistence.getRequestInput(e.sessionId,e.latestRequestId);return r?R(t,{session:e,binding:a.binding,agentId:a.agentId,request:r,previousState:"queued"}):l(t,e,"queued","missing persisted request input for queued request recovery")}async function f(t,e){if(e.status!=="running")return!1;if(!await t.isStaleRunningRequest(e))return!0;const r=await c(t,e);if(!r)return!0;if(!t.supportsRunningReplay(r.binding))return l(t,e,"running","stale running request cannot be replayed safely",{releaseRequestClaim:!0});const u=await t.persistence.getRequestInput(e.sessionId,e.latestRequestId);return u?R(t,{session:e,binding:r.binding,agentId:r.agentId,request:u,previousState:"running",emitResumeEvent:{sequence:100,eventType:"request.resumed",payload:{resumeKind:"startup-running-recovery",state:"running"}}}):l(t,e,"running","missing persisted request input for stale running request recovery",{releaseRequestClaim:!0})}async function m(t,e){if(e.status!=="resuming"||!t.recoveryConfig.resumeResumingRequestsOnStartup)return!1;const a=t.getBinding(e.agentId);if(!a)return!0;const r=await t.persistence.getRequestRecoveryIntent(e.sessionId,e.latestRequestId);if(!r||r.kind!=="approval-decision")return!0;if(r.attempts>=t.recoveryConfig.maxRecoveryAttempts)return q(t,e,r.checkpointRef,"recovery attempts exhausted");await t.persistence.saveRequestRecoveryIntent(e.sessionId,e.latestRequestId,{...r,attempts:r.attempts+1}),await t.emit(e.sessionId,e.latestRequestId,100,"request.resumed",{resumeKind:"startup-recovery",checkpointRef:r.checkpointRef,state:"resuming"});const i=(await t.persistence.listSessionMessages(e.sessionId)).filter(n=>n.requestId!==e.latestRequestId),d=await t.loadRequestInput(e.sessionId,e.latestRequestId),s=Date.now();try{const n=await t.runtimeAdapter.invoke(a,"",e.sessionId,e.latestRequestId,r.resumePayload,i);t.recordLlmSuccess(s),await t.persistence.clearRequestRecoveryIntent(e.sessionId,e.latestRequestId),await t.finalizeContinuedRequest(a,e.sessionId,e.latestRequestId,d,n,{previousState:"resuming",stateSequence:101,approvalSequence:102})}catch(n){t.recordLlmFailure(s),r.attempts+1>=t.recoveryConfig.maxRecoveryAttempts&&await q(t,e,r.checkpointRef,n instanceof Error?n.message:String(n))}return!0}export{o as recoverQueuedStartupRun,m as recoverResumingStartupRun,f as recoverRunningStartupRun};
|
|
@@ -1,60 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { resolveCompiledEmbeddingModel, resolveCompiledEmbeddingModelRef } from "../../support/embedding-models.js";
|
|
3
|
-
import { resolveCompiledVectorStore, resolveCompiledVectorStoreRef } from "../../support/vector-stores.js";
|
|
4
|
-
import { resolveRuntimeCheckpointerPath } from "../../layout/runtime-layout.js";
|
|
5
|
-
export function resolveStoreFromConfig(stores, storeConfig, runtimeRoot) {
|
|
6
|
-
const cacheKey = storeConfig ? `${runtimeRoot}:${JSON.stringify(storeConfig)}` : undefined;
|
|
7
|
-
if (!storeConfig || !cacheKey) {
|
|
8
|
-
return undefined;
|
|
9
|
-
}
|
|
10
|
-
const existing = stores.get(cacheKey);
|
|
11
|
-
if (existing) {
|
|
12
|
-
return existing;
|
|
13
|
-
}
|
|
14
|
-
const created = createStoreForConfig(storeConfig, runtimeRoot);
|
|
15
|
-
stores.set(cacheKey, created);
|
|
16
|
-
return created;
|
|
17
|
-
}
|
|
18
|
-
export function resolveStore(stores, defaultStore, defaultRuntimeRoot, getBindingStoreConfig, binding) {
|
|
19
|
-
const storeConfig = getBindingStoreConfig(binding);
|
|
20
|
-
return resolveStoreFromConfig(stores, storeConfig, binding?.harnessRuntime.runtimeRoot ?? defaultRuntimeRoot) ?? defaultStore;
|
|
21
|
-
}
|
|
22
|
-
export async function resolveEmbeddingModel(workspace, embeddingModels, embeddingModelRef, runtimeAdapterOptions) {
|
|
23
|
-
const compiled = resolveCompiledEmbeddingModelRef(workspace, embeddingModelRef);
|
|
24
|
-
const existing = embeddingModels.get(compiled.id);
|
|
25
|
-
if (existing) {
|
|
26
|
-
return existing;
|
|
27
|
-
}
|
|
28
|
-
const resolved = await resolveCompiledEmbeddingModel(compiled, runtimeAdapterOptions.embeddingModelResolver);
|
|
29
|
-
embeddingModels.set(compiled.id, resolved);
|
|
30
|
-
return resolved;
|
|
31
|
-
}
|
|
32
|
-
export async function resolveVectorStore(workspace, vectorStores, vectorStoreRef, runtimeAdapterOptions) {
|
|
33
|
-
const compiled = resolveCompiledVectorStoreRef(workspace, vectorStoreRef);
|
|
34
|
-
const existing = vectorStores.get(compiled.id);
|
|
35
|
-
if (existing) {
|
|
36
|
-
return existing;
|
|
37
|
-
}
|
|
38
|
-
const resolved = await resolveCompiledVectorStore(workspace, compiled, {
|
|
39
|
-
embeddingModelResolver: runtimeAdapterOptions.embeddingModelResolver,
|
|
40
|
-
vectorStoreResolver: runtimeAdapterOptions.vectorStoreResolver,
|
|
41
|
-
});
|
|
42
|
-
vectorStores.set(compiled.id, resolved);
|
|
43
|
-
return resolved;
|
|
44
|
-
}
|
|
45
|
-
export function resolveCheckpointer(checkpointers, binding) {
|
|
46
|
-
const key = `${binding.harnessRuntime.runtimeRoot}:${JSON.stringify(binding.harnessRuntime.checkpointer ?? { kind: "SqliteSaver", path: resolveRuntimeCheckpointerPath(binding.harnessRuntime.runtimeRoot, "checkpoints.sqlite") })}`;
|
|
47
|
-
const existing = checkpointers.get(key);
|
|
48
|
-
if (existing) {
|
|
49
|
-
return existing;
|
|
50
|
-
}
|
|
51
|
-
const resolvedConfig = binding.harnessRuntime.checkpointer ??
|
|
52
|
-
{ kind: "SqliteSaver", path: resolveRuntimeCheckpointerPath(binding.harnessRuntime.runtimeRoot, "checkpoints.sqlite") };
|
|
53
|
-
if (typeof resolvedConfig === "boolean") {
|
|
54
|
-
checkpointers.set(key, resolvedConfig);
|
|
55
|
-
return resolvedConfig;
|
|
56
|
-
}
|
|
57
|
-
const saver = createCheckpointerForConfig(resolvedConfig, binding.harnessRuntime.runtimeRoot);
|
|
58
|
-
checkpointers.set(key, saver);
|
|
59
|
-
return saver;
|
|
60
|
-
}
|
|
1
|
+
import{createCheckpointerForConfig as l,createStoreForConfig as m}from"../../support/runtime-factories.js";import{resolveCompiledEmbeddingModel as u,resolveCompiledEmbeddingModelRef as d}from"../../support/embedding-models.js";import{resolveCompiledVectorStore as f,resolveCompiledVectorStoreRef as a}from"../../support/vector-stores.js";import{resolveRuntimeCheckpointerPath as c}from"../../layout/runtime-layout.js";function v(o,e,i){const r=e?`${i}:${JSON.stringify(e)}`:void 0;if(!e||!r)return;const t=o.get(r);if(t)return t;const n=m(e,i);return o.set(r,n),n}function g(o,e,i,r,t){const n=r(t);return v(o,n,t?.harnessRuntime.runtimeRoot??i)??e}async function x(o,e,i,r){const t=d(o,i),n=e.get(t.id);if(n)return n;const s=await u(t,r.embeddingModelResolver);return e.set(t.id,s),s}async function C(o,e,i,r){const t=a(o,i),n=e.get(t.id);if(n)return n;const s=await f(o,t,{embeddingModelResolver:r.embeddingModelResolver,vectorStoreResolver:r.vectorStoreResolver});return e.set(t.id,s),s}function k(o,e){const i=`${e.harnessRuntime.runtimeRoot}:${JSON.stringify(e.harnessRuntime.checkpointer??{kind:"SqliteSaver",path:c(e.harnessRuntime.runtimeRoot,"checkpoints.sqlite")})}`,r=o.get(i);if(r)return r;const t=e.harnessRuntime.checkpointer??{kind:"SqliteSaver",path:c(e.harnessRuntime.runtimeRoot,"checkpoints.sqlite")};if(typeof t=="boolean")return o.set(i,t),t;const n=l(t,e.harnessRuntime.runtimeRoot);return o.set(i,n),n}export{k as resolveCheckpointer,x as resolveEmbeddingModel,g as resolveStore,v as resolveStoreFromConfig,C as resolveVectorStore};
|
|
@@ -1,56 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
export async function resolveApprovalRecord(persistence, options, session) {
|
|
3
|
-
if (options.approvalId) {
|
|
4
|
-
const approval = await persistence.getApproval(options.approvalId);
|
|
5
|
-
if (!approval) {
|
|
6
|
-
throw new Error(`Unknown approval ${options.approvalId}`);
|
|
7
|
-
}
|
|
8
|
-
return approval;
|
|
9
|
-
}
|
|
10
|
-
const requestId = options.requestId ?? session.latestRequestId;
|
|
11
|
-
const approvals = await persistence.getRequestApprovals(options.sessionId ?? session.sessionId, requestId);
|
|
12
|
-
const approval = approvals
|
|
13
|
-
.filter((candidate) => candidate.status === "pending")
|
|
14
|
-
.sort((left, right) => right.requestedAt.localeCompare(left.requestedAt))[0];
|
|
15
|
-
if (!approval) {
|
|
16
|
-
throw new Error(`No pending approval for request ${requestId}`);
|
|
17
|
-
}
|
|
18
|
-
return approval;
|
|
19
|
-
}
|
|
20
|
-
export function buildResumePayload(binding, approval, options) {
|
|
21
|
-
if (!isDeepAgentBinding(binding)) {
|
|
22
|
-
return options.decision === "edit" && options.editedInput
|
|
23
|
-
? { decision: "edit", editedInput: options.editedInput }
|
|
24
|
-
: (options.decision ?? "approve");
|
|
25
|
-
}
|
|
26
|
-
const decisionType = options.decision ?? "approve";
|
|
27
|
-
if (decisionType === "edit" && options.editedInput) {
|
|
28
|
-
return {
|
|
29
|
-
decisions: [
|
|
30
|
-
{
|
|
31
|
-
type: "edit",
|
|
32
|
-
editedAction: {
|
|
33
|
-
name: approval.toolName,
|
|
34
|
-
args: options.editedInput,
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
if (decisionType === "reject") {
|
|
41
|
-
return {
|
|
42
|
-
decisions: [
|
|
43
|
-
{
|
|
44
|
-
type: "reject",
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
decisions: [
|
|
51
|
-
{
|
|
52
|
-
type: "approve",
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
};
|
|
56
|
-
}
|
|
1
|
+
import{isDeepAgentBinding as n}from"../../support/compiled-binding.js";async function u(a,r,e){if(r.approvalId){const t=await a.getApproval(r.approvalId);if(!t)throw new Error(`Unknown approval ${r.approvalId}`);return t}const d=r.requestId??e.latestRequestId,i=(await a.getRequestApprovals(r.sessionId??e.sessionId,d)).filter(t=>t.status==="pending").sort((t,p)=>p.requestedAt.localeCompare(t.requestedAt))[0];if(!i)throw new Error(`No pending approval for request ${d}`);return i}function c(a,r,e){if(!n(a))return e.decision==="edit"&&e.editedInput?{decision:"edit",editedInput:e.editedInput}:e.decision??"approve";const d=e.decision??"approve";return d==="edit"&&e.editedInput?{decisions:[{type:"edit",editedAction:{name:r.toolName,args:e.editedInput}}]}:d==="reject"?{decisions:[{type:"reject"}]}:{decisions:[{type:"approve"}]}}export{c as buildResumePayload,u as resolveApprovalRecord};
|
|
@@ -1,48 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { extractMessageText } from "../../../utils/message-content.js";
|
|
3
|
-
import { matchRoutingRule } from "../../../workspace/support/workspace-ref-utils.js";
|
|
4
|
-
import { getWorkspaceBinding } from "../bindings.js";
|
|
5
|
-
import { inferRoutingBindings } from "../../support/harness-support.js";
|
|
6
|
-
export function getDefaultHostAgentId(workspace, preferredHostAgentId) {
|
|
7
|
-
const preferredBinding = preferredHostAgentId ? workspace.bindings.get(preferredHostAgentId) : undefined;
|
|
8
|
-
if (preferredBinding) {
|
|
9
|
-
return preferredBinding.agent.id;
|
|
10
|
-
}
|
|
11
|
-
return inferRoutingBindings(workspace).primaryBinding?.agent.id ?? "agent";
|
|
12
|
-
}
|
|
13
|
-
export function getDefaultRuntimeEntryAgentId(workspace, preferredRuntimeEntryAgentId) {
|
|
14
|
-
return getDefaultHostAgentId(workspace, preferredRuntimeEntryAgentId);
|
|
15
|
-
}
|
|
16
|
-
export async function resolveSelectedAgentId(options) {
|
|
17
|
-
const { workspace, input, requestedAgentId, sessionId, preferredHostAgentId, preferredRuntimeEntryAgentId, getSessionSummary, } = options;
|
|
18
|
-
const preferredEntryAgentId = preferredRuntimeEntryAgentId ?? preferredHostAgentId;
|
|
19
|
-
if (!requestedAgentId || requestedAgentId === AUTO_AGENT_ID) {
|
|
20
|
-
if (sessionId) {
|
|
21
|
-
const session = await getSessionSummary(sessionId);
|
|
22
|
-
const sessionBinding = session ? workspace.bindings.get(session.agentId) : undefined;
|
|
23
|
-
if (session?.agentId && sessionBinding) {
|
|
24
|
-
return session.agentId;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return getDefaultRuntimeEntryAgentId(workspace, preferredEntryAgentId);
|
|
28
|
-
}
|
|
29
|
-
return requestedAgentId;
|
|
30
|
-
}
|
|
31
|
-
export function routeAgentId(options) {
|
|
32
|
-
const { workspace, input, routingRules, routingDefaultAgentId, sessionId } = options;
|
|
33
|
-
const rawInput = extractMessageText(input);
|
|
34
|
-
const configuredRule = routingRules.find((rule) => matchRoutingRule(rawInput, rule, { sessionId }));
|
|
35
|
-
if (configuredRule) {
|
|
36
|
-
const configuredBinding = getWorkspaceBinding(workspace, configuredRule.agentId);
|
|
37
|
-
if (configuredBinding) {
|
|
38
|
-
return configuredBinding.agent.id;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
const defaultBinding = routingDefaultAgentId
|
|
42
|
-
? getWorkspaceBinding(workspace, routingDefaultAgentId)
|
|
43
|
-
: undefined;
|
|
44
|
-
if (defaultBinding) {
|
|
45
|
-
return defaultBinding.agent.id;
|
|
46
|
-
}
|
|
47
|
-
return getDefaultRuntimeEntryAgentId(workspace, routingDefaultAgentId);
|
|
48
|
-
}
|
|
1
|
+
import{AUTO_AGENT_ID as p}from"../../../contracts/types.js";import{extractMessageText as m}from"../../../utils/message-content.js";import{matchRoutingRule as I}from"../../../workspace/support/workspace-ref-utils.js";import{getWorkspaceBinding as f}from"../bindings.js";import{inferRoutingBindings as A}from"../../support/harness-support.js";function l(t,n){const r=n?t.bindings.get(n):void 0;return r?r.agent.id:A(t).primaryBinding?.agent.id??"agent"}function a(t,n){return l(t,n)}async function E(t){const{workspace:n,input:r,requestedAgentId:o,sessionId:i,preferredHostAgentId:u,preferredRuntimeEntryAgentId:s,getSessionSummary:d}=t,g=s??u;if(!o||o===p){if(i){const e=await d(i),c=e?n.bindings.get(e.agentId):void 0;if(e?.agentId&&c)return e.agentId}return a(n,g)}return o}function w(t){const{workspace:n,input:r,routingRules:o,routingDefaultAgentId:i,sessionId:u}=t,s=m(r),d=o.find(e=>I(s,e,{sessionId:u}));if(d){const e=f(n,d.agentId);if(e)return e.agent.id}const g=i?f(n,i):void 0;return g?g.agent.id:a(n,i)}export{l as getDefaultHostAgentId,a as getDefaultRuntimeEntryAgentId,E as resolveSelectedAgentId,w as routeAgentId};
|
|
@@ -1,66 +1 @@
|
|
|
1
|
-
|
|
2
|
-
if (!content) {
|
|
3
|
-
return;
|
|
4
|
-
}
|
|
5
|
-
await persistence.appendSessionMessage(sessionId, {
|
|
6
|
-
role: "assistant",
|
|
7
|
-
content,
|
|
8
|
-
requestId,
|
|
9
|
-
createdAt: new Date().toISOString(),
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
export function checkpointRefForState(sessionId, requestId, state) {
|
|
13
|
-
return state === "waiting_for_approval" ? `checkpoints/${sessionId}/${requestId}/cp-1` : null;
|
|
14
|
-
}
|
|
15
|
-
export async function expirePendingApprovals(runtime, sessionId, requestId) {
|
|
16
|
-
const approvals = await runtime.persistence.getRequestApprovals(sessionId, requestId);
|
|
17
|
-
for (const approval of approvals) {
|
|
18
|
-
if (approval.status !== "pending") {
|
|
19
|
-
continue;
|
|
20
|
-
}
|
|
21
|
-
await runtime.persistence.resolveApproval(sessionId, requestId, approval.approvalId, "expired");
|
|
22
|
-
await runtime.emit(sessionId, requestId, 6, "approval.resolved", {
|
|
23
|
-
approvalId: approval.approvalId,
|
|
24
|
-
pendingActionId: approval.pendingActionId,
|
|
25
|
-
decision: "cancel",
|
|
26
|
-
toolName: approval.toolName,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
export async function finalizeCancelledRequest(runtime, sessionId, requestId, previousState, reason) {
|
|
31
|
-
await expirePendingApprovals(runtime, sessionId, requestId);
|
|
32
|
-
await runtime.persistence.releaseRequestClaim(requestId);
|
|
33
|
-
await runtime.persistence.clearRequestCancel(requestId);
|
|
34
|
-
await runtime.persistence.clearRequestInput(sessionId, requestId);
|
|
35
|
-
await runtime.setRequestStateAndEmit(sessionId, requestId, 104, "cancelled", {
|
|
36
|
-
previousState,
|
|
37
|
-
...(reason ? { error: reason } : {}),
|
|
38
|
-
});
|
|
39
|
-
const requestMeta = await runtime.persistence.getRequestMeta(sessionId, requestId);
|
|
40
|
-
return {
|
|
41
|
-
sessionId,
|
|
42
|
-
requestId,
|
|
43
|
-
agentId: requestMeta.agentId,
|
|
44
|
-
state: "cancelled",
|
|
45
|
-
output: reason ? `cancelled: ${reason}` : "cancelled",
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
export async function finalizeContinuedRequest(runtime, binding, sessionId, requestId, input, actual, options) {
|
|
49
|
-
let approval;
|
|
50
|
-
await appendAssistantMessage(runtime.persistence, sessionId, requestId, actual.output);
|
|
51
|
-
const checkpointRef = checkpointRefForState(sessionId, requestId, actual.state);
|
|
52
|
-
await runtime.setRequestStateAndEmit(sessionId, requestId, options.stateSequence, actual.state, {
|
|
53
|
-
previousState: options.previousState,
|
|
54
|
-
checkpointRef,
|
|
55
|
-
});
|
|
56
|
-
if (actual.state === "waiting_for_approval" && options.approvalSequence) {
|
|
57
|
-
approval = (await runtime.requestApprovalAndEmit(sessionId, requestId, input, actual.interruptContent, checkpointRef, options.approvalSequence)).approval;
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
...actual,
|
|
61
|
-
sessionId,
|
|
62
|
-
requestId,
|
|
63
|
-
approvalId: approval?.approvalId ?? actual.approvalId,
|
|
64
|
-
pendingActionId: approval?.pendingActionId ?? actual.pendingActionId,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
1
|
+
async function r(a,t,e,p){p&&await a.appendSessionMessage(t,{role:"assistant",content:p,requestId:e,createdAt:new Date().toISOString()})}function v(a,t,e){return e==="waiting_for_approval"?`checkpoints/${a}/${t}/cp-1`:null}async function g(a,t,e){const p=await a.persistence.getRequestApprovals(t,e);for(const n of p)n.status==="pending"&&(await a.persistence.resolveApproval(t,e,n.approvalId,"expired"),await a.emit(t,e,6,"approval.resolved",{approvalId:n.approvalId,pendingActionId:n.pendingActionId,decision:"cancel",toolName:n.toolName}))}async function f(a,t,e,p,n){await g(a,t,e),await a.persistence.releaseRequestClaim(e),await a.persistence.clearRequestCancel(e),await a.persistence.clearRequestInput(t,e),await a.setRequestStateAndEmit(t,e,104,"cancelled",{previousState:p,...n?{error:n}:{}});const i=await a.persistence.getRequestMeta(t,e);return{sessionId:t,requestId:e,agentId:i.agentId,state:"cancelled",output:n?`cancelled: ${n}`:"cancelled"}}async function s(a,t,e,p,n,i,c){let o;await r(a.persistence,e,p,i.output);const l=v(e,p,i.state);return await a.setRequestStateAndEmit(e,p,c.stateSequence,i.state,{previousState:c.previousState,checkpointRef:l}),i.state==="waiting_for_approval"&&c.approvalSequence&&(o=(await a.requestApprovalAndEmit(e,p,n,i.interruptContent,l,c.approvalSequence)).approval),{...i,sessionId:e,requestId:p,approvalId:o?.approvalId??i.approvalId,pendingActionId:o?.pendingActionId??i.pendingActionId}}export{r as appendAssistantMessage,v as checkpointRefForState,g as expirePendingApprovals,f as finalizeCancelledRequest,s as finalizeContinuedRequest};
|
|
@@ -1,217 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { isTerminalRequestState } from "./helpers.js";
|
|
3
|
-
async function finalizeIfCancellationRequested(input) {
|
|
4
|
-
const cancellation = await input.getRequestCancellation(input.requestId);
|
|
5
|
-
if (!cancellation.requested) {
|
|
6
|
-
return null;
|
|
7
|
-
}
|
|
8
|
-
return input.finalizeCancelledRequest(input.sessionId, input.requestId, input.previousState, cancellation.reason);
|
|
9
|
-
}
|
|
10
|
-
function normalizeContinuationState(previousState) {
|
|
11
|
-
return previousState === "queued" ? "running" : previousState;
|
|
12
|
-
}
|
|
13
|
-
export async function resumeRequest(runtime, options) {
|
|
14
|
-
const approvalById = options.approvalId ? await runtime.getApprovalById(options.approvalId) : null;
|
|
15
|
-
const session = options.sessionId
|
|
16
|
-
? await runtime.getSession(options.sessionId)
|
|
17
|
-
: approvalById
|
|
18
|
-
? await runtime.getSession(approvalById.sessionId)
|
|
19
|
-
: null;
|
|
20
|
-
if (!session) {
|
|
21
|
-
throw new Error("resume requires either sessionId or approvalId");
|
|
22
|
-
}
|
|
23
|
-
const approval = approvalById ?? await runtime.resolveApprovalRecord(options, session);
|
|
24
|
-
const sessionId = approval.sessionId;
|
|
25
|
-
const requestId = approval.requestId;
|
|
26
|
-
const activeAgentId = session.currentAgentId ?? session.entryAgentId;
|
|
27
|
-
const binding = runtime.getBinding(activeAgentId);
|
|
28
|
-
if (!binding) {
|
|
29
|
-
throw new Error(`Unknown agent ${activeAgentId}`);
|
|
30
|
-
}
|
|
31
|
-
const resumePayload = runtime.buildResumePayload(binding, approval, options);
|
|
32
|
-
const cancelledBeforeResume = await finalizeIfCancellationRequested({
|
|
33
|
-
getRequestCancellation: runtime.getRequestCancellation,
|
|
34
|
-
finalizeCancelledRequest: runtime.finalizeCancelledRequest,
|
|
35
|
-
sessionId,
|
|
36
|
-
requestId,
|
|
37
|
-
previousState: session.currentState,
|
|
38
|
-
});
|
|
39
|
-
if (cancelledBeforeResume) {
|
|
40
|
-
return cancelledBeforeResume;
|
|
41
|
-
}
|
|
42
|
-
const checkpointRef = `checkpoints/${sessionId}/${requestId}/cp-1`;
|
|
43
|
-
await runtime.setRequestState(sessionId, requestId, "resuming", checkpointRef);
|
|
44
|
-
const releaseRequestSlot = await runtime.acquireRequestSlot(sessionId, requestId, "resuming", await runtime.resolvePersistedRequestPriority(sessionId, requestId));
|
|
45
|
-
try {
|
|
46
|
-
await runtime.saveRequestRecoveryIntent(sessionId, requestId, {
|
|
47
|
-
kind: "approval-decision",
|
|
48
|
-
savedAt: new Date().toISOString(),
|
|
49
|
-
checkpointRef,
|
|
50
|
-
resumePayload,
|
|
51
|
-
attempts: 0,
|
|
52
|
-
});
|
|
53
|
-
await runtime.emit(sessionId, requestId, 5, "request.resumed", {
|
|
54
|
-
resumeKind: "cross-restart",
|
|
55
|
-
checkpointRef,
|
|
56
|
-
state: "resuming",
|
|
57
|
-
approvalId: approval.approvalId,
|
|
58
|
-
pendingActionId: approval.pendingActionId,
|
|
59
|
-
});
|
|
60
|
-
await runtime.resolveApproval(sessionId, requestId, approval.approvalId, options.decision === "reject" ? "rejected" : options.decision === "edit" ? "edited" : "approved");
|
|
61
|
-
await runtime.emit(sessionId, requestId, 6, "approval.resolved", {
|
|
62
|
-
approvalId: approval.approvalId,
|
|
63
|
-
pendingActionId: approval.pendingActionId,
|
|
64
|
-
decision: options.decision ?? "approve",
|
|
65
|
-
toolName: approval.toolName,
|
|
66
|
-
});
|
|
67
|
-
const history = await runtime.listSessionMessages(sessionId);
|
|
68
|
-
const priorHistory = history.filter((message) => message.requestId !== requestId);
|
|
69
|
-
const requestInput = await runtime.loadRequestInput(sessionId, requestId);
|
|
70
|
-
const startedAt = Date.now();
|
|
71
|
-
try {
|
|
72
|
-
const actual = await runtime.invoke(binding, "", sessionId, requestId, resumePayload, priorHistory);
|
|
73
|
-
runtime.recordLlmSuccess(startedAt);
|
|
74
|
-
const cancelledAfterInvoke = await finalizeIfCancellationRequested({
|
|
75
|
-
getRequestCancellation: runtime.getRequestCancellation,
|
|
76
|
-
finalizeCancelledRequest: runtime.finalizeCancelledRequest,
|
|
77
|
-
sessionId,
|
|
78
|
-
requestId,
|
|
79
|
-
previousState: "resuming",
|
|
80
|
-
});
|
|
81
|
-
if (cancelledAfterInvoke) {
|
|
82
|
-
return cancelledAfterInvoke;
|
|
83
|
-
}
|
|
84
|
-
await runtime.clearRequestRecoveryIntent(sessionId, requestId);
|
|
85
|
-
const finalized = await runtime.finalizeContinuedRequest(binding, sessionId, requestId, requestInput, actual, {
|
|
86
|
-
previousState: "resuming",
|
|
87
|
-
stateSequence: 7,
|
|
88
|
-
approvalSequence: 8,
|
|
89
|
-
});
|
|
90
|
-
return {
|
|
91
|
-
...finalized,
|
|
92
|
-
approvalId: finalized.approvalId ?? approval.approvalId,
|
|
93
|
-
pendingActionId: finalized.pendingActionId ?? approval.pendingActionId,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
runtime.recordLlmFailure(startedAt);
|
|
98
|
-
throw error;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
finally {
|
|
102
|
-
await releaseRequestSlot();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
export async function cancelRequestOperation(runtime, options) {
|
|
106
|
-
const request = await runtime.getRequest(options.requestId);
|
|
107
|
-
if (!request) {
|
|
108
|
-
throw new Error(`Unknown request ${options.requestId}`);
|
|
109
|
-
}
|
|
110
|
-
if (isTerminalRequestState(request.state)) {
|
|
111
|
-
return {
|
|
112
|
-
sessionId: request.sessionId,
|
|
113
|
-
requestId: request.requestId,
|
|
114
|
-
agentId: request.agentId,
|
|
115
|
-
state: request.state,
|
|
116
|
-
output: request.state,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
await runtime.requestRequestCancel(request.requestId, options.reason);
|
|
120
|
-
if (request.state === "queued" || request.state === "waiting_for_approval" || request.state === "claimed") {
|
|
121
|
-
if (request.state === "queued") {
|
|
122
|
-
runtime.dropPendingRequestSlot(request.requestId);
|
|
123
|
-
}
|
|
124
|
-
return runtime.finalizeCancelledRequest(request.sessionId, request.requestId, request.state, options.reason);
|
|
125
|
-
}
|
|
126
|
-
await runtime.setRequestStateAndEmit(request.sessionId, request.requestId, 103, "cancelling", {
|
|
127
|
-
previousState: request.state,
|
|
128
|
-
...(options.reason ? { error: options.reason } : {}),
|
|
129
|
-
});
|
|
130
|
-
return {
|
|
131
|
-
sessionId: request.sessionId,
|
|
132
|
-
requestId: request.requestId,
|
|
133
|
-
agentId: request.agentId,
|
|
134
|
-
state: "cancelling",
|
|
135
|
-
output: options.reason ? `cancelling: ${options.reason}` : "cancelling",
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
export async function executeQueuedRequestOperation(runtime, input) {
|
|
139
|
-
const { binding, message, sessionId, requestId, agentId } = input;
|
|
140
|
-
const options = input.options ?? {};
|
|
141
|
-
const previousState = options.previousState ?? "running";
|
|
142
|
-
const currentRequest = await runtime.persistence.getRequest(requestId);
|
|
143
|
-
if (currentRequest?.state === "cancelled") {
|
|
144
|
-
return {
|
|
145
|
-
sessionId: sessionId,
|
|
146
|
-
requestId: requestId,
|
|
147
|
-
agentId,
|
|
148
|
-
state: "cancelled",
|
|
149
|
-
output: "cancelled",
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
const cancelledBeforeInvoke = await finalizeIfCancellationRequested({
|
|
153
|
-
getRequestCancellation: runtime.getRequestCancellation,
|
|
154
|
-
finalizeCancelledRequest: runtime.finalizeCancelledRequest,
|
|
155
|
-
sessionId,
|
|
156
|
-
requestId,
|
|
157
|
-
previousState,
|
|
158
|
-
});
|
|
159
|
-
if (cancelledBeforeInvoke) {
|
|
160
|
-
return cancelledBeforeInvoke;
|
|
161
|
-
}
|
|
162
|
-
if (previousState === "queued") {
|
|
163
|
-
await runtime.emit(sessionId, requestId, 101, "request.dequeued", {
|
|
164
|
-
queuePosition: 0,
|
|
165
|
-
activeRequestCount: 0,
|
|
166
|
-
maxConcurrentRuns: 0,
|
|
167
|
-
recoveredOnStartup: true,
|
|
168
|
-
});
|
|
169
|
-
await runtime.setRequestStateAndEmit(sessionId, requestId, 102, "running", {
|
|
170
|
-
previousState: "queued",
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
const continuationState = normalizeContinuationState(previousState);
|
|
174
|
-
try {
|
|
175
|
-
const actual = await runtime.invokeWithHistory(binding, message, sessionId, requestId, undefined, options.priorHistory, {
|
|
176
|
-
context: options.context,
|
|
177
|
-
state: options.state,
|
|
178
|
-
files: options.files,
|
|
179
|
-
});
|
|
180
|
-
const cancelledAfterInvoke = await finalizeIfCancellationRequested({
|
|
181
|
-
getRequestCancellation: runtime.getRequestCancellation,
|
|
182
|
-
finalizeCancelledRequest: runtime.finalizeCancelledRequest,
|
|
183
|
-
sessionId,
|
|
184
|
-
requestId,
|
|
185
|
-
previousState: continuationState,
|
|
186
|
-
});
|
|
187
|
-
if (cancelledAfterInvoke) {
|
|
188
|
-
return cancelledAfterInvoke;
|
|
189
|
-
}
|
|
190
|
-
const finalized = await runtime.finalizeContinuedRequest(binding, sessionId, requestId, message, actual, {
|
|
191
|
-
previousState: continuationState,
|
|
192
|
-
stateSequence: options.stateSequence ?? 103,
|
|
193
|
-
approvalSequence: options.approvalSequence ?? 104,
|
|
194
|
-
});
|
|
195
|
-
return {
|
|
196
|
-
...finalized,
|
|
197
|
-
agentId,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
catch (error) {
|
|
201
|
-
await runtime.emitSyntheticFallback(sessionId, requestId, agentId, error);
|
|
202
|
-
await runtime.setRequestStateAndEmit(sessionId, requestId, 104, "failed", {
|
|
203
|
-
previousState: continuationState,
|
|
204
|
-
error: describeRuntimeError(error),
|
|
205
|
-
});
|
|
206
|
-
return {
|
|
207
|
-
sessionId: sessionId,
|
|
208
|
-
requestId: requestId,
|
|
209
|
-
agentId,
|
|
210
|
-
state: "failed",
|
|
211
|
-
output: runtime.renderRuntimeFailure(error),
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
finally {
|
|
215
|
-
await runtime.persistence.clearRequestInput(sessionId, requestId);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
1
|
+
import{describeRuntimeError as C}from"../../support/harness-support.js";import{isTerminalRequestState as y}from"./helpers.js";async function I(e){const s=await e.getRequestCancellation(e.requestId);return s.requested?e.finalizeCancelledRequest(e.sessionId,e.requestId,e.previousState,s.reason):null}function A(e){return e==="queued"?"running":e}async function k(e,s){const t=s.approvalId?await e.getApprovalById(s.approvalId):null,o=s.sessionId?await e.getSession(s.sessionId):t?await e.getSession(t.sessionId):null;if(!o)throw new Error("resume requires either sessionId or approvalId");const n=t??await e.resolveApprovalRecord(s,o),a=n.sessionId,i=n.requestId,r=o.currentAgentId??o.entryAgentId,l=e.getBinding(r);if(!l)throw new Error(`Unknown agent ${r}`);const p=e.buildResumePayload(l,n,s),u=await I({getRequestCancellation:e.getRequestCancellation,finalizeCancelledRequest:e.finalizeCancelledRequest,sessionId:a,requestId:i,previousState:o.currentState});if(u)return u;const c=`checkpoints/${a}/${i}/cp-1`;await e.setRequestState(a,i,"resuming",c);const d=await e.acquireRequestSlot(a,i,"resuming",await e.resolvePersistedRequestPriority(a,i));try{await e.saveRequestRecoveryIntent(a,i,{kind:"approval-decision",savedAt:new Date().toISOString(),checkpointRef:c,resumePayload:p,attempts:0}),await e.emit(a,i,5,"request.resumed",{resumeKind:"cross-restart",checkpointRef:c,state:"resuming",approvalId:n.approvalId,pendingActionId:n.pendingActionId}),await e.resolveApproval(a,i,n.approvalId,s.decision==="reject"?"rejected":s.decision==="edit"?"edited":"approved"),await e.emit(a,i,6,"approval.resolved",{approvalId:n.approvalId,pendingActionId:n.pendingActionId,decision:s.decision??"approve",toolName:n.toolName});const g=(await e.listSessionMessages(a)).filter(q=>q.requestId!==i),S=await e.loadRequestInput(a,i),v=Date.now();try{const q=await e.invoke(l,"",a,i,p,g);e.recordLlmSuccess(v);const w=await I({getRequestCancellation:e.getRequestCancellation,finalizeCancelledRequest:e.finalizeCancelledRequest,sessionId:a,requestId:i,previousState:"resuming"});if(w)return w;await e.clearRequestRecoveryIntent(a,i);const f=await e.finalizeContinuedRequest(l,a,i,S,q,{previousState:"resuming",stateSequence:7,approvalSequence:8});return{...f,approvalId:f.approvalId??n.approvalId,pendingActionId:f.pendingActionId??n.pendingActionId}}catch(q){throw e.recordLlmFailure(v),q}}finally{await d()}}async function x(e,s){const t=await e.getRequest(s.requestId);if(!t)throw new Error(`Unknown request ${s.requestId}`);return y(t.state)?{sessionId:t.sessionId,requestId:t.requestId,agentId:t.agentId,state:t.state,output:t.state}:(await e.requestRequestCancel(t.requestId,s.reason),t.state==="queued"||t.state==="waiting_for_approval"||t.state==="claimed"?(t.state==="queued"&&e.dropPendingRequestSlot(t.requestId),e.finalizeCancelledRequest(t.sessionId,t.requestId,t.state,s.reason)):(await e.setRequestStateAndEmit(t.sessionId,t.requestId,103,"cancelling",{previousState:t.state,...s.reason?{error:s.reason}:{}}),{sessionId:t.sessionId,requestId:t.requestId,agentId:t.agentId,state:"cancelling",output:s.reason?`cancelling: ${s.reason}`:"cancelling"}))}async function E(e,s){const{binding:t,message:o,sessionId:n,requestId:a,agentId:i}=s,r=s.options??{},l=r.previousState??"running";if((await e.persistence.getRequest(a))?.state==="cancelled")return{sessionId:n,requestId:a,agentId:i,state:"cancelled",output:"cancelled"};const u=await I({getRequestCancellation:e.getRequestCancellation,finalizeCancelledRequest:e.finalizeCancelledRequest,sessionId:n,requestId:a,previousState:l});if(u)return u;l==="queued"&&(await e.emit(n,a,101,"request.dequeued",{queuePosition:0,activeRequestCount:0,maxConcurrentRuns:0,recoveredOnStartup:!0}),await e.setRequestStateAndEmit(n,a,102,"running",{previousState:"queued"}));const c=A(l);try{const d=await e.invokeWithHistory(t,o,n,a,void 0,r.priorHistory,{context:r.context,state:r.state,files:r.files}),R=await I({getRequestCancellation:e.getRequestCancellation,finalizeCancelledRequest:e.finalizeCancelledRequest,sessionId:n,requestId:a,previousState:c});return R||{...await e.finalizeContinuedRequest(t,n,a,o,d,{previousState:c,stateSequence:r.stateSequence??103,approvalSequence:r.approvalSequence??104}),agentId:i}}catch(d){return await e.emitSyntheticFallback(n,a,i,d),await e.setRequestStateAndEmit(n,a,104,"failed",{previousState:c,error:C(d)}),{sessionId:n,requestId:a,agentId:i,state:"failed",output:e.renderRuntimeFailure(d)}}finally{await e.persistence.clearRequestInput(n,a)}}export{x as cancelRequestOperation,E as executeQueuedRequestOperation,k as resumeRequest};
|