@paperclipai/adapter-utils 2026.1005.0-canary.4 → 2026.1005.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/README.md +0 -13
- package/dist/acpx-engine/execute.d.ts.map +1 -1
- package/dist/acpx-engine/execute.js +42 -66
- package/dist/acpx-engine/execute.js.map +1 -1
- package/dist/acpx-engine/execute.test.js +4 -162
- package/dist/acpx-engine/execute.test.js.map +1 -1
- package/dist/acpx-engine/session-codec.d.ts.map +1 -1
- package/dist/acpx-engine/session-codec.js +0 -1
- package/dist/acpx-engine/session-codec.js.map +1 -1
- package/dist/acpx-engine/settlement-characterization.test.js +0 -105
- package/dist/acpx-engine/settlement-characterization.test.js.map +1 -1
- package/dist/acpx-engine/terminal-session-failure.d.ts +0 -6
- package/dist/acpx-engine/terminal-session-failure.d.ts.map +1 -1
- package/dist/acpx-engine/terminal-session-failure.js +0 -14
- package/dist/acpx-engine/terminal-session-failure.js.map +1 -1
- package/dist/acpx-engine/terminal-session-failure.test.js +1 -21
- package/dist/acpx-engine/terminal-session-failure.test.js.map +1 -1
- package/dist/command-redaction.d.ts +0 -2
- package/dist/command-redaction.d.ts.map +1 -1
- package/dist/command-redaction.js +10 -20
- package/dist/command-redaction.js.map +1 -1
- package/dist/command-redaction.test.js +1 -20
- package/dist/command-redaction.test.js.map +1 -1
- package/dist/execution-target-sandbox.test.js +6 -48
- package/dist/execution-target-sandbox.test.js.map +1 -1
- package/dist/execution-target-stdin-race.test.js +0 -4
- package/dist/execution-target-stdin-race.test.js.map +1 -1
- package/dist/execution-target.d.ts.map +1 -1
- package/dist/execution-target.js +10 -6
- package/dist/execution-target.js.map +1 -1
- package/dist/git-workspace-sync.d.ts.map +1 -1
- package/dist/git-workspace-sync.js +2 -3
- package/dist/git-workspace-sync.js.map +1 -1
- package/dist/git-workspace-sync.test.js +3 -23
- package/dist/git-workspace-sync.test.js.map +1 -1
- package/dist/github-launcher.d.ts.map +1 -1
- package/dist/github-launcher.js +11 -26
- package/dist/github-launcher.js.map +1 -1
- package/dist/github-launcher.test.js +1 -34
- package/dist/github-launcher.test.js.map +1 -1
- package/dist/prompt-sections.test.js +6 -7
- package/dist/prompt-sections.test.js.map +1 -1
- package/dist/sandbox-callback-bridge.d.ts +0 -2
- package/dist/sandbox-callback-bridge.d.ts.map +1 -1
- package/dist/sandbox-callback-bridge.js +3 -12
- package/dist/sandbox-callback-bridge.js.map +1 -1
- package/dist/sandbox-callback-bridge.test.js +0 -100
- package/dist/sandbox-callback-bridge.test.js.map +1 -1
- package/dist/sandbox-managed-runtime.d.ts.map +1 -1
- package/dist/sandbox-managed-runtime.js +48 -55
- package/dist/sandbox-managed-runtime.js.map +1 -1
- package/dist/sandbox-managed-runtime.test.js +6 -65
- package/dist/sandbox-managed-runtime.test.js.map +1 -1
- package/dist/server-utils.d.ts +1 -6
- package/dist/server-utils.d.ts.map +1 -1
- package/dist/server-utils.js +47 -21
- package/dist/server-utils.js.map +1 -1
- package/dist/server-utils.test.js +48 -46
- package/dist/server-utils.test.js.map +1 -1
- package/dist/session-compaction.d.ts.map +1 -1
- package/dist/session-compaction.js +0 -6
- package/dist/session-compaction.js.map +1 -1
- package/dist/types.d.ts +1 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace-restore-diagnostics.d.ts +1 -21
- package/dist/workspace-restore-diagnostics.d.ts.map +1 -1
- package/dist/workspace-restore-diagnostics.js +8 -106
- package/dist/workspace-restore-diagnostics.js.map +1 -1
- package/dist/workspace-restore-diagnostics.test.js +1 -73
- package/dist/workspace-restore-diagnostics.test.js.map +1 -1
- package/dist/workspace-restore-merge.d.ts +2 -4
- package/dist/workspace-restore-merge.d.ts.map +1 -1
- package/dist/workspace-restore-merge.js +66 -89
- package/dist/workspace-restore-merge.js.map +1 -1
- package/dist/workspace-restore-merge.test.js +5 -8
- package/dist/workspace-restore-merge.test.js.map +1 -1
- package/dist/workspace-restore-result.d.ts.map +1 -1
- package/dist/workspace-restore-result.js +39 -44
- package/dist/workspace-restore-result.js.map +1 -1
- package/dist/workspace-restore-result.test.js +0 -11
- package/dist/workspace-restore-result.test.js.map +1 -1
- package/dist/workspace-restore-teardown.d.ts.map +1 -1
- package/dist/workspace-restore-teardown.js +3 -5
- package/dist/workspace-restore-teardown.js.map +1 -1
- package/dist/workspace-restore-teardown.test.js +0 -24
- package/dist/workspace-restore-teardown.test.js.map +1 -1
- package/package.json +2 -2
- package/dist/acpx-engine/ephemeral-session-environment.d.ts +0 -4
- package/dist/acpx-engine/ephemeral-session-environment.d.ts.map +0 -1
- package/dist/acpx-engine/ephemeral-session-environment.js +0 -29
- package/dist/acpx-engine/ephemeral-session-environment.js.map +0 -1
- package/dist/acpx-engine/ephemeral-session-environment.test.d.ts +0 -2
- package/dist/acpx-engine/ephemeral-session-environment.test.d.ts.map +0 -1
- package/dist/acpx-engine/ephemeral-session-environment.test.js +0 -177
- package/dist/acpx-engine/ephemeral-session-environment.test.js.map +0 -1
- package/dist/directory-merge-lock.test.d.ts +0 -2
- package/dist/directory-merge-lock.test.d.ts.map +0 -1
- package/dist/directory-merge-lock.test.js +0 -166
- package/dist/directory-merge-lock.test.js.map +0 -1
- package/dist/execution-phase.d.ts +0 -10
- package/dist/execution-phase.d.ts.map +0 -1
- package/dist/execution-phase.js +0 -27
- package/dist/execution-phase.js.map +0 -1
- package/dist/execution-phase.test.d.ts +0 -2
- package/dist/execution-phase.test.d.ts.map +0 -1
- package/dist/execution-phase.test.js +0 -26
- package/dist/execution-phase.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -9,19 +9,6 @@ For the adapter-author guide see
|
|
|
9
9
|
[`docs/adapters/creating-an-adapter.md`](../../docs/adapters/creating-an-adapter.md)
|
|
10
10
|
and the in-repo notes at [`packages/adapters/AUTHORING.md`](../adapters/AUTHORING.md).
|
|
11
11
|
|
|
12
|
-
## Sandbox bridge deadlines
|
|
13
|
-
|
|
14
|
-
Command-managed bridge control operations (queue reads, input delivery, setup,
|
|
15
|
-
and cleanup) have a host-enforced deadline of at most 30 seconds per shell
|
|
16
|
-
command. A shorter configured timeout still applies. These operations cannot
|
|
17
|
-
inherit the agent run's hours-long lifetime or wait forever on a provider that
|
|
18
|
-
ignores its timeout. Long-lived agent session commands keep their own limits.
|
|
19
|
-
|
|
20
|
-
A control timeout reports a transport failure. It does not prove that the
|
|
21
|
-
remote command stopped and does not replay an uncertain write. The process
|
|
22
|
-
session closes failed input delivery and uses its existing shutdown path;
|
|
23
|
-
normal execution settlement must still verify termination.
|
|
24
|
-
|
|
25
12
|
## No-remote-git contract
|
|
26
13
|
|
|
27
14
|
The local execution-workspace cwd is the only persistence boundary across
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/execute.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { cancellableSandboxStartup } from "./startup-cancellation.js";
|
|
2
|
-
import { withAdapterExecutionPhase } from "../execution-phase.js";
|
|
3
2
|
import fs from "node:fs/promises";
|
|
4
3
|
import fsSync from "node:fs";
|
|
5
4
|
import os from "node:os";
|
|
@@ -7,16 +6,14 @@ import path from "node:path";
|
|
|
7
6
|
import { execFile } from "node:child_process";
|
|
8
7
|
import { promisify } from "node:util";
|
|
9
8
|
import { createHash, randomUUID } from "node:crypto";
|
|
10
|
-
import { parseFrontmatterMarkdown } from "@paperclipai/shared";
|
|
11
9
|
import { fileURLToPath } from "node:url";
|
|
12
10
|
import { adapterExecutionTargetSessionIdentity, describeAdapterExecutionTarget, adapterExecutionTargetDuplexObservabilityRecorder, adapterExecutionTargetEnablesSandboxDuplexBridge, formatAdapterExecutionTimeoutErrorMessage, formatAdapterExecutionTimeoutStartLogLine, prepareAdapterExecutionTargetRuntime, readAdapterExecutionTarget, resolveAdapterExecutionTargetTimeout, resolveReferencedSourceIgnore, runAdapterExecutionTargetShellCommand, startAdapterExecutionTargetPaperclipBridge, startAdapterExecutionTargetProcessSessionBridge, } from "@paperclipai/adapter-utils/execution-target";
|
|
13
11
|
import { captureLocalProcess, capturedProcessExited, killCapturedLocalProcess } from "./local-process-control.js";
|
|
14
12
|
import { DUPLEX_CHANNEL_LOST_ERROR_CODE } from "../bridge-transport-contract.js";
|
|
15
|
-
import {
|
|
13
|
+
import { formatTerminalSessionFailure, sanitizeTerminalSessionFailure, } from "./terminal-session-failure.js";
|
|
16
14
|
import { classifyWorkspaceRestoreFailure, describeWorkspaceRestoreFailure, } from "../workspace-restore-merge.js";
|
|
17
|
-
import { DEFAULT_PAPERCLIP_AGENT_PROMPT_TEMPLATE, DEFAULT_PAPERCLIP_CONVERSATION_PROMPT_TEMPLATE, applyPaperclipWorkspaceEnv, asNumber, asString, buildInvocationEnvForLogs, buildPaperclipEnv, ensureAbsoluteDirectory, ensurePathInEnv, ensurePaperclipSkillSymlink, isForbiddenConfigEnvKey, isPaperclipExternalChatTurn, isPaperclipRuntimeEnvKey, joinPromptSections, materializePaperclipSkillCopy, parseObject, isPaperclipSkillSourceMissing, readPaperclipRuntimeSkillEntries, readPaperclipIssueWorkModeFromContext, renderTemplate, resolvePaperclipInstanceRootForAdapter,
|
|
15
|
+
import { DEFAULT_PAPERCLIP_AGENT_PROMPT_TEMPLATE, DEFAULT_PAPERCLIP_CONVERSATION_PROMPT_TEMPLATE, applyPaperclipWorkspaceEnv, asNumber, asString, buildInvocationEnvForLogs, buildPaperclipEnv, ensureAbsoluteDirectory, ensurePathInEnv, ensurePaperclipSkillSymlink, isForbiddenConfigEnvKey, isPaperclipExternalChatTurn, isPaperclipRuntimeEnvKey, joinPromptSections, materializePaperclipSkillCopy, parseObject, isPaperclipSkillSourceMissing, readPaperclipRuntimeSkillEntries, readPaperclipIssueWorkModeFromContext, renderTemplate, resolvePaperclipInstanceRootForAdapter, selectPaperclipPromptSections, resolveLegacyPaperclipDesiredSkillNames, removeMaintainerOnlySkillSymlinks, rewriteWorkspaceCwdEnvVarsForExecution, shapePaperclipWorkspaceEnvForExecution, } from "@paperclipai/adapter-utils/server-utils";
|
|
18
16
|
import { shellQuote } from "@paperclipai/adapter-utils/ssh";
|
|
19
|
-
import { createEphemeralSessionEnvironmentStore } from "./ephemeral-session-environment.js";
|
|
20
17
|
import { createAcpRuntime, createAgentRegistry, createRuntimeStore, isAcpRuntimeError, } from "acpx/runtime";
|
|
21
18
|
import { ACPX_DUPLEX_LOSS_CANCEL_DEADLINE_MS, ACPX_HANDSHAKE_TIMEOUT_MS, ACPX_HANDSHAKE_TRANSPORT_POLL_MS, DEFAULT_ACP_ENGINE_AGENT, DEFAULT_ACP_ENGINE_MODE, DEFAULT_ACP_ENGINE_NON_INTERACTIVE_PERMISSIONS, DEFAULT_ACP_ENGINE_PERMISSION_MODE, DEFAULT_ACP_ENGINE_TIMEOUT_SEC, DEFAULT_ACP_ENGINE_WARM_HANDLE_IDLE_MS, } from "./constants.js";
|
|
22
19
|
import { createRunResourceLedger } from "./run-resource-ledger.js";
|
|
@@ -625,25 +622,11 @@ async function prepareClaudeSkillRuntime(input) {
|
|
|
625
622
|
}
|
|
626
623
|
}
|
|
627
624
|
const selectedNames = materializedNames.sort();
|
|
628
|
-
const skillDescriptions = await Promise.all(selectedNames.map(async (name) => {
|
|
629
|
-
const file = path.join(skillsHome, name, "SKILL.md");
|
|
630
|
-
let description = "";
|
|
631
|
-
try {
|
|
632
|
-
const parsed = parseFrontmatterMarkdown(await fs.readFile(file, "utf8"));
|
|
633
|
-
description = asString(parsed.frontmatter.description, "").replace(/\s+/g, " ").trim().slice(0, 512);
|
|
634
|
-
}
|
|
635
|
-
catch {
|
|
636
|
-
// A readable skill without valid routing metadata remains available.
|
|
637
|
-
// Do not substitute its body for a missing description.
|
|
638
|
-
}
|
|
639
|
-
return `- ${name}${description ? `: ${description}` : ""} (file: ${file})`;
|
|
640
|
-
}));
|
|
641
625
|
const promptInstructions = selectedNames.length > 0
|
|
642
626
|
? [
|
|
643
627
|
"Paperclip has materialized selected runtime skills for this ACPX Claude session.",
|
|
644
628
|
`Skill root: ${skillsHome}`,
|
|
645
629
|
`Selected skills: ${selectedNames.join(", ")}`,
|
|
646
|
-
...skillDescriptions,
|
|
647
630
|
"When a task calls for one of these skills, read its SKILL.md from that root and follow it.",
|
|
648
631
|
].join("\n")
|
|
649
632
|
: "";
|
|
@@ -925,7 +908,6 @@ function buildSessionParams(input) {
|
|
|
925
908
|
mode: prepared.mode,
|
|
926
909
|
stateDir: prepared.stateDir,
|
|
927
910
|
configFingerprint: prepared.fingerprint,
|
|
928
|
-
mcpFingerprint: shortHash(prepared.mcpIdentity),
|
|
929
911
|
...(prepared.requestedModel ? { model: prepared.requestedModel } : {}),
|
|
930
912
|
...(prepared.requestedThinkingEffort ? { thinkingEffort: prepared.requestedThinkingEffort } : {}),
|
|
931
913
|
...(prepared.fastMode ? { fastMode: true } : {}),
|
|
@@ -1471,9 +1453,7 @@ async function buildRuntime(input) {
|
|
|
1471
1453
|
defaultMode: paperclipClaudeSettings.defaultMode,
|
|
1472
1454
|
}
|
|
1473
1455
|
: null,
|
|
1474
|
-
|
|
1475
|
-
// on session/load. Keep their conversation identity independent of tools.
|
|
1476
|
-
mcpServers: ["claude", "codex", "grok", "gemini", "kimi"].includes(acpxAgent) ? [] : mcpIdentity,
|
|
1456
|
+
mcpServers: mcpIdentity,
|
|
1477
1457
|
secretManifestHash: shortHash(secretManifest),
|
|
1478
1458
|
// Fold the resolved adapter env (all applied user-configured values —
|
|
1479
1459
|
// plain, secret_ref, and stable PAPERCLIP_* config such as an explicit
|
|
@@ -2173,8 +2153,7 @@ async function buildPrompt(ctx, resumedSession, env) {
|
|
|
2173
2153
|
const renderedBootstrapPrompt = !resumedSession && bootstrapPromptTemplate.trim().length > 0
|
|
2174
2154
|
? renderTemplate(bootstrapPromptTemplate, templateData).trim()
|
|
2175
2155
|
: "";
|
|
2176
|
-
|
|
2177
|
-
const { taskContextNote, wakePrompt } = selectPaperclipPromptSections(context, { resumedSession, includeCommunicationGuidance: false });
|
|
2156
|
+
const { taskContextNote, wakePrompt } = selectPaperclipPromptSections(context, { resumedSession });
|
|
2178
2157
|
const externalChatTurn = isPaperclipExternalChatTurn(context.paperclipWake);
|
|
2179
2158
|
const shouldUseResumeDeltaPrompt = resumedSession && wakePrompt.length > 0;
|
|
2180
2159
|
const promptInstructionsPrefix = shouldUseResumeDeltaPrompt ? "" : instructionsPrefix;
|
|
@@ -2187,7 +2166,6 @@ async function buildPrompt(ctx, resumedSession, env) {
|
|
|
2187
2166
|
const prompt = joinPromptSections([
|
|
2188
2167
|
promptInstructionsPrefix,
|
|
2189
2168
|
renderedBootstrapPrompt,
|
|
2190
|
-
selectInitialCommunicationGuidance(context, { resumedSession }),
|
|
2191
2169
|
wakePrompt,
|
|
2192
2170
|
sessionHandoffNote,
|
|
2193
2171
|
taskContextNote,
|
|
@@ -3094,9 +3072,9 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3094
3072
|
: teardownErr instanceof Error
|
|
3095
3073
|
? teardownErr.message
|
|
3096
3074
|
: String(teardownErr);
|
|
3097
|
-
await
|
|
3075
|
+
await ctx
|
|
3098
3076
|
.onLog("stderr", `[paperclip] ACPX teardown step "${step}" failed: ${reason}\n`)
|
|
3099
|
-
.catch(() => { })
|
|
3077
|
+
.catch(() => { });
|
|
3100
3078
|
};
|
|
3101
3079
|
// Emit one per-phase timing run-log event. It is not an OpenTelemetry
|
|
3102
3080
|
// export and it is not a Telemetry event: it carries the phase name
|
|
@@ -3109,13 +3087,13 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3109
3087
|
const timedPhase = async (phase, run) => {
|
|
3110
3088
|
const start = now();
|
|
3111
3089
|
try {
|
|
3112
|
-
await
|
|
3090
|
+
await run();
|
|
3113
3091
|
}
|
|
3114
3092
|
catch (error) {
|
|
3115
|
-
await
|
|
3093
|
+
await emitPhase(phase, start, "failed");
|
|
3116
3094
|
throw error;
|
|
3117
3095
|
}
|
|
3118
|
-
await
|
|
3096
|
+
await emitPhase(phase, start, "ok");
|
|
3119
3097
|
};
|
|
3120
3098
|
// The turn the run started. It is hoisted to the run scope so the settlement
|
|
3121
3099
|
// `endSession` step can cancel a running turn before it closes the runtime
|
|
@@ -3233,14 +3211,7 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3233
3211
|
// same session still sees it. The borrow clears the entry's idle timer, so
|
|
3234
3212
|
// the reused runtime cannot expire under its own timer while this run uses
|
|
3235
3213
|
// it (today's `clearWarmHandleTimer(cached)` after the reuse decision).
|
|
3236
|
-
|
|
3237
|
-
if (cached && (ctx.context.refreshTools === true
|
|
3238
|
-
|| asString(previousParams.mcpFingerprint, "") !== shortHash(prepared.mcpIdentity)
|
|
3239
|
-
// MCP bearer credentials are run-scoped, even for an unchanged catalog.
|
|
3240
|
-
|| prepared.mcpServers.length > 0)) {
|
|
3241
|
-
await hostStore.discard(prepared.sessionKey);
|
|
3242
|
-
cached = undefined;
|
|
3243
|
-
}
|
|
3214
|
+
const cached = canResume ? hostStore.borrow(prepared.sessionKey) : undefined;
|
|
3244
3215
|
childStderrState = cached?.childStderrState ?? { logPath: null, pendingLiveLine: "" };
|
|
3245
3216
|
processIdentitySink = cached?.processIdentitySink ?? {
|
|
3246
3217
|
current: ctx.onSpawn,
|
|
@@ -3253,9 +3224,27 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3253
3224
|
flushChildStderr(childStderrState);
|
|
3254
3225
|
childStderrState.logPath = prepared.childStderrLogPath;
|
|
3255
3226
|
const persistedRuntimeStore = createRuntimeStore({ stateDir: prepared.stateDir });
|
|
3256
|
-
|
|
3257
|
-
|
|
3258
|
-
|
|
3227
|
+
const runtimeStore = {
|
|
3228
|
+
async load(id) {
|
|
3229
|
+
const record = await persistedRuntimeStore.load(id);
|
|
3230
|
+
if (!record)
|
|
3231
|
+
return undefined;
|
|
3232
|
+
// ACPX resumes from the stored session options rather than the
|
|
3233
|
+
// options passed to ensureSession. Keep conversation state, but
|
|
3234
|
+
// launch the provider with this run's credentials and scratch paths.
|
|
3235
|
+
return {
|
|
3236
|
+
...record,
|
|
3237
|
+
acpx: {
|
|
3238
|
+
...record.acpx,
|
|
3239
|
+
session_options: {
|
|
3240
|
+
...record.acpx?.session_options,
|
|
3241
|
+
env: { ...prepared.env },
|
|
3242
|
+
},
|
|
3243
|
+
},
|
|
3244
|
+
};
|
|
3245
|
+
},
|
|
3246
|
+
save: (record) => persistedRuntimeStore.save(record),
|
|
3247
|
+
};
|
|
3259
3248
|
const runtimeOptions = {
|
|
3260
3249
|
cwd: prepared.cwd,
|
|
3261
3250
|
// Host-only spawn cwd for the relay proxy on the remote process-session
|
|
@@ -3779,9 +3768,8 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3779
3768
|
// Diagnostics are retained even when an adapter has no recovery
|
|
3780
3769
|
// classifier. Redact before bounding so partial secrets cannot leak.
|
|
3781
3770
|
onTerminalSessionFailure: (failure) => {
|
|
3782
|
-
terminalFailureClassification = classifyToolDefinitionFailure(failure)
|
|
3783
|
-
?? deps.classifyTerminalSessionFailure?.(failure, new Date(now())) ?? null;
|
|
3784
3771
|
terminalSessionFailure = sanitizeTerminalSessionFailure(failure, prepared.env, ctx.authToken, parseObject(ctx.config.env));
|
|
3772
|
+
terminalFailureClassification = deps.classifyTerminalSessionFailure?.(failure, new Date(now())) ?? null;
|
|
3785
3773
|
},
|
|
3786
3774
|
});
|
|
3787
3775
|
activeTurn = turn;
|
|
@@ -3839,7 +3827,7 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3839
3827
|
armStopDeadline();
|
|
3840
3828
|
return {
|
|
3841
3829
|
cancel: async (reason) => {
|
|
3842
|
-
await
|
|
3830
|
+
await turn.cancel({ reason });
|
|
3843
3831
|
},
|
|
3844
3832
|
};
|
|
3845
3833
|
};
|
|
@@ -4295,7 +4283,7 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4295
4283
|
: baseSettlement;
|
|
4296
4284
|
// Cancel a running turn before the close (the turn-error path).
|
|
4297
4285
|
if (settlement.cancelTurnReason && activeTurn) {
|
|
4298
|
-
await
|
|
4286
|
+
await activeTurn.cancel({ reason: settlement.cancelTurnReason }).catch(() => { });
|
|
4299
4287
|
}
|
|
4300
4288
|
const existing = warmHandles.get(prepared.sessionKey);
|
|
4301
4289
|
// Re-read the duplex control-channel disposition here, at the
|
|
@@ -4332,26 +4320,26 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4332
4320
|
existing) {
|
|
4333
4321
|
// A matching warm entry closes through the warm store, which also
|
|
4334
4322
|
// clears its idle timer and flushes its child stderr.
|
|
4335
|
-
runtimeStopConfirmed = await
|
|
4323
|
+
runtimeStopConfirmed = await closeWarmHandle({
|
|
4336
4324
|
handles: warmHandles,
|
|
4337
4325
|
key: prepared.sessionKey,
|
|
4338
4326
|
entry: existing,
|
|
4339
4327
|
reason: settlement.reason,
|
|
4340
4328
|
discardPersistentState: settlement.discardPersistentState,
|
|
4341
|
-
})
|
|
4329
|
+
});
|
|
4342
4330
|
return;
|
|
4343
4331
|
}
|
|
4344
4332
|
const onCloseError = settlement.recordCloseError || ctx.signal?.aborted
|
|
4345
4333
|
? (closeErr) => recordTeardownError("runtime-close", closeErr)
|
|
4346
4334
|
: () => { };
|
|
4347
|
-
await
|
|
4335
|
+
await runtime
|
|
4348
4336
|
.close({
|
|
4349
4337
|
handle: settlement.handle,
|
|
4350
4338
|
reason: settlement.reason,
|
|
4351
4339
|
discardPersistentState: settlement.discardPersistentState,
|
|
4352
4340
|
})
|
|
4353
4341
|
.then(() => { runtimeStopConfirmed = true; })
|
|
4354
|
-
.catch(onCloseError)
|
|
4342
|
+
.catch(onCloseError);
|
|
4355
4343
|
if (settlement.dropWarmEntry && warmHandleMatches(existing, runtime, settlement.handle) && existing) {
|
|
4356
4344
|
clearWarmHandleTimer(existing);
|
|
4357
4345
|
warmHandles.delete(prepared.sessionKey);
|
|
@@ -4384,7 +4372,7 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4384
4372
|
const stopped = runtimeStopConfirmed || (!prepared.processSessionBridge && capturedProcessExited(processIdentitySink?.localProcess));
|
|
4385
4373
|
try {
|
|
4386
4374
|
if (stopped)
|
|
4387
|
-
await
|
|
4375
|
+
await ctx.onProviderStopped?.();
|
|
4388
4376
|
}
|
|
4389
4377
|
catch {
|
|
4390
4378
|
// Match ACP's fail-soft teardown policy without describing this as
|
|
@@ -4392,15 +4380,12 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4392
4380
|
await recordTeardownError("instruction-collection", new Error("Instruction collection failed after provider stop. No instruction save is claimed."));
|
|
4393
4381
|
}
|
|
4394
4382
|
finally {
|
|
4395
|
-
await
|
|
4383
|
+
await runRuntimeSpan("sandbox.syncBack", async () => {
|
|
4396
4384
|
const restoreOutcome = await syncBackManagedHome(prepared);
|
|
4397
4385
|
if (!restoreOutcome.ok) {
|
|
4398
|
-
workspaceRestoreFailureField = {
|
|
4399
|
-
workspaceRestoreFailure: restoreOutcome.code,
|
|
4400
|
-
...(restoreOutcome.diagnostic ? { workspaceRestoreDiagnostic: restoreOutcome.diagnostic } : {}),
|
|
4401
|
-
};
|
|
4386
|
+
workspaceRestoreFailureField = { workspaceRestoreFailure: restoreOutcome.code };
|
|
4402
4387
|
}
|
|
4403
|
-
})
|
|
4388
|
+
});
|
|
4404
4389
|
}
|
|
4405
4390
|
}),
|
|
4406
4391
|
// The staging lease releases as the run's final act, AFTER the coordinator
|
|
@@ -4470,15 +4455,6 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4470
4455
|
} },
|
|
4471
4456
|
};
|
|
4472
4457
|
}
|
|
4473
|
-
// Preserve the policy resolved for this execution target. The server
|
|
4474
|
-
// cannot reconstruct sandbox defaults from the stored agent config.
|
|
4475
|
-
capturedResult = {
|
|
4476
|
-
...capturedResult,
|
|
4477
|
-
resultJson: {
|
|
4478
|
-
...capturedResult.resultJson,
|
|
4479
|
-
adapterExecutionTimeout: { ...prepared.timeoutResolution },
|
|
4480
|
-
},
|
|
4481
|
-
};
|
|
4482
4458
|
// The sync-back settlement step runs before this reproduces the result
|
|
4483
4459
|
// (settlement precedes reproduction), so a failed workspace restore is
|
|
4484
4460
|
// already recorded by the time we get here. Merge it into `resultJson`
|