@paperclipai/adapter-utils 2026.1001.0 → 2026.1002.0-beta.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/dist/acpx-engine/execute.d.ts +2 -6
- package/dist/acpx-engine/execute.d.ts.map +1 -1
- package/dist/acpx-engine/execute.js +91 -37
- package/dist/acpx-engine/execute.js.map +1 -1
- package/dist/acpx-engine/execute.test.js +250 -11
- package/dist/acpx-engine/execute.test.js.map +1 -1
- package/dist/acpx-engine/spawn-smoke.test.js +16 -7
- package/dist/acpx-engine/spawn-smoke.test.js.map +1 -1
- package/dist/acpx-engine/startup-cancellation.d.ts +1 -0
- package/dist/acpx-engine/startup-cancellation.d.ts.map +1 -1
- package/dist/acpx-engine/startup-cancellation.js +7 -2
- package/dist/acpx-engine/startup-cancellation.js.map +1 -1
- package/dist/acpx-engine/terminal-session-failure.d.ts +12 -0
- package/dist/acpx-engine/terminal-session-failure.d.ts.map +1 -0
- package/dist/acpx-engine/terminal-session-failure.js +92 -0
- package/dist/acpx-engine/terminal-session-failure.js.map +1 -0
- package/dist/acpx-engine/terminal-session-failure.test.d.ts +2 -0
- package/dist/acpx-engine/terminal-session-failure.test.d.ts.map +1 -0
- package/dist/acpx-engine/terminal-session-failure.test.js +119 -0
- package/dist/acpx-engine/terminal-session-failure.test.js.map +1 -0
- package/dist/acpx-engine/turn-characterization.test.js +4 -3
- package/dist/acpx-engine/turn-characterization.test.js.map +1 -1
- package/dist/command-managed-runtime.d.ts +2 -0
- package/dist/command-managed-runtime.d.ts.map +1 -1
- package/dist/command-managed-runtime.js +2 -0
- package/dist/command-managed-runtime.js.map +1 -1
- package/dist/execution-target-sandbox.test.js +193 -4
- package/dist/execution-target-sandbox.test.js.map +1 -1
- package/dist/execution-target-stdin-race.test.js +241 -2
- package/dist/execution-target-stdin-race.test.js.map +1 -1
- package/dist/execution-target.d.ts +6 -0
- package/dist/execution-target.d.ts.map +1 -1
- package/dist/execution-target.js +158 -35
- package/dist/execution-target.js.map +1 -1
- package/dist/git-workspace-sync.d.ts +13 -5
- package/dist/git-workspace-sync.d.ts.map +1 -1
- package/dist/git-workspace-sync.js +172 -96
- package/dist/git-workspace-sync.js.map +1 -1
- package/dist/git-workspace-sync.test.js +108 -9
- package/dist/git-workspace-sync.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/paperclip-runner-permissions.d.ts +28 -1
- package/dist/paperclip-runner-permissions.d.ts.map +1 -1
- package/dist/paperclip-runner-permissions.js +9 -1
- package/dist/paperclip-runner-permissions.js.map +1 -1
- package/dist/prompt-sections.test.d.ts +2 -0
- package/dist/prompt-sections.test.d.ts.map +1 -0
- package/dist/prompt-sections.test.js +52 -0
- package/dist/prompt-sections.test.js.map +1 -0
- package/dist/provider-stopped-boundary.d.ts +7 -0
- package/dist/provider-stopped-boundary.d.ts.map +1 -0
- package/dist/provider-stopped-boundary.js +22 -0
- package/dist/provider-stopped-boundary.js.map +1 -0
- package/dist/provider-stopped-boundary.test.d.ts +2 -0
- package/dist/provider-stopped-boundary.test.d.ts.map +1 -0
- package/dist/provider-stopped-boundary.test.js +76 -0
- package/dist/provider-stopped-boundary.test.js.map +1 -0
- package/dist/remote-managed-runtime.d.ts +2 -0
- package/dist/remote-managed-runtime.d.ts.map +1 -1
- package/dist/remote-managed-runtime.js +3 -1
- package/dist/remote-managed-runtime.js.map +1 -1
- package/dist/remote-managed-runtime.test.js +25 -0
- package/dist/remote-managed-runtime.test.js.map +1 -1
- package/dist/sandbox-callback-bridge.d.ts.map +1 -1
- package/dist/sandbox-callback-bridge.js +22 -7
- package/dist/sandbox-callback-bridge.js.map +1 -1
- package/dist/sandbox-callback-bridge.test.js +6 -3
- package/dist/sandbox-callback-bridge.test.js.map +1 -1
- package/dist/sandbox-managed-runtime.d.ts +3 -0
- package/dist/sandbox-managed-runtime.d.ts.map +1 -1
- package/dist/sandbox-managed-runtime.js +764 -691
- package/dist/sandbox-managed-runtime.js.map +1 -1
- package/dist/sandbox-managed-runtime.test.js +163 -3
- package/dist/sandbox-managed-runtime.test.js.map +1 -1
- package/dist/server-utils.d.ts +36 -0
- package/dist/server-utils.d.ts.map +1 -1
- package/dist/server-utils.js +85 -10
- package/dist/server-utils.js.map +1 -1
- package/dist/server-utils.test.js +174 -0
- package/dist/server-utils.test.js.map +1 -1
- package/dist/ssh-fixture.test.js +22 -0
- package/dist/ssh-fixture.test.js.map +1 -1
- package/dist/ssh.d.ts +2 -0
- package/dist/ssh.d.ts.map +1 -1
- package/dist/ssh.js +2 -2
- package/dist/ssh.js.map +1 -1
- package/dist/test-fixtures/prompt-context.d.ts +54 -0
- package/dist/test-fixtures/prompt-context.d.ts.map +1 -0
- package/dist/test-fixtures/prompt-context.js +55 -0
- package/dist/test-fixtures/prompt-context.js.map +1 -0
- package/dist/types.d.ts +4 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace-git-stream.d.ts +19 -0
- package/dist/workspace-git-stream.d.ts.map +1 -0
- package/dist/workspace-git-stream.js +99 -0
- package/dist/workspace-git-stream.js.map +1 -0
- package/dist/workspace-git-stream.test.d.ts +2 -0
- package/dist/workspace-git-stream.test.d.ts.map +1 -0
- package/dist/workspace-git-stream.test.js +71 -0
- package/dist/workspace-git-stream.test.js.map +1 -0
- package/dist/workspace-manifest.d.ts +61 -0
- package/dist/workspace-manifest.d.ts.map +1 -0
- package/dist/workspace-manifest.js +257 -0
- package/dist/workspace-manifest.js.map +1 -0
- package/dist/workspace-manifest.test.d.ts +2 -0
- package/dist/workspace-manifest.test.d.ts.map +1 -0
- package/dist/workspace-manifest.test.js +160 -0
- package/dist/workspace-manifest.test.js.map +1 -0
- package/dist/workspace-restore-diagnostics.d.ts +6 -0
- package/dist/workspace-restore-diagnostics.d.ts.map +1 -0
- package/dist/workspace-restore-diagnostics.js +66 -0
- package/dist/workspace-restore-diagnostics.js.map +1 -0
- package/dist/workspace-restore-diagnostics.test.d.ts +2 -0
- package/dist/workspace-restore-diagnostics.test.d.ts.map +1 -0
- package/dist/workspace-restore-diagnostics.test.js +67 -0
- package/dist/workspace-restore-diagnostics.test.js.map +1 -0
- package/dist/workspace-restore-merge.d.ts +45 -6
- package/dist/workspace-restore-merge.d.ts.map +1 -1
- package/dist/workspace-restore-merge.js +310 -65
- package/dist/workspace-restore-merge.js.map +1 -1
- package/dist/workspace-restore-merge.test.js +247 -1
- package/dist/workspace-restore-merge.test.js.map +1 -1
- package/dist/workspace-restore-result.d.ts +6 -0
- package/dist/workspace-restore-result.d.ts.map +1 -0
- package/dist/workspace-restore-result.js +67 -0
- package/dist/workspace-restore-result.js.map +1 -0
- package/dist/workspace-restore-result.test.d.ts +2 -0
- package/dist/workspace-restore-result.test.d.ts.map +1 -0
- package/dist/workspace-restore-result.test.js +49 -0
- package/dist/workspace-restore-result.test.js.map +1 -0
- package/node_modules/acpx/dist/live-checkpoint-ClPCSdrW.js +4 -3
- package/package.json +2 -2
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { AdapterBillingType, AdapterExecutionContext, AdapterExecutionResult, UsageSummary } from "@paperclipai/adapter-utils";
|
|
2
2
|
import { type AdapterExecutionTarget, type AdapterManagedRuntimeAsset, type PreparedAdapterExecutionTargetRuntime, type ReferencedSourceIgnoreResolution } from "@paperclipai/adapter-utils/execution-target";
|
|
3
|
+
import { type AcpxTerminalSessionFailure } from "./terminal-session-failure.js";
|
|
4
|
+
export type { AcpxTerminalSessionFailure } from "./terminal-session-failure.js";
|
|
3
5
|
import type { WorkspaceRestoreOutcome } from "../workspace-restore-merge.js";
|
|
4
6
|
import { type AcpRuntime, type AcpRuntimeOptions, type AcpRuntimeStatus, type AcpRuntimeUsageBreakdown } from "acpx/runtime";
|
|
5
7
|
import type { LaunchEnvironment, LaunchEnvironmentContribution, SessionFingerprintIdentity, SessionKeyIdentity } from "./run-contracts.js";
|
|
@@ -158,11 +160,6 @@ export interface AcpxRemoteManagedHomeResult {
|
|
|
158
160
|
*/
|
|
159
161
|
disposeStaged?: () => Promise<void>;
|
|
160
162
|
}
|
|
161
|
-
export interface AcpxTerminalSessionFailure {
|
|
162
|
-
category: string;
|
|
163
|
-
title?: string;
|
|
164
|
-
details?: string;
|
|
165
|
-
}
|
|
166
163
|
export type AcpxTerminalFailureClassification = Pick<AdapterExecutionResult, "errorCode" | "errorFamily" | "retryNotBefore">;
|
|
167
164
|
export interface AcpxEngineExecutorOptions {
|
|
168
165
|
createRuntime?: AcpxRuntimeFactory;
|
|
@@ -321,5 +318,4 @@ export declare function summarizeAcpxTurnUsage(input: {
|
|
|
321
318
|
};
|
|
322
319
|
export declare function createAcpxEngineExecutor(deps?: AcpxEngineExecutorOptions): (ctx: AdapterExecutionContext) => Promise<AdapterExecutionResult>;
|
|
323
320
|
export declare const execute: (ctx: AdapterExecutionContext) => Promise<AdapterExecutionResult>;
|
|
324
|
-
export {};
|
|
325
321
|
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/execute.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAcL,KAAK,sBAAsB,EAI3B,KAAK,0BAA0B,EAC/B,KAAK,qCAAqC,EAC1C,KAAK,gCAAgC,EAEtC,MAAM,6CAA6C,CAAC;AAIrD,OAAO,KAAK,EAA+B,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/execute.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAcL,KAAK,sBAAsB,EAI3B,KAAK,0BAA0B,EAC/B,KAAK,qCAAqC,EAC1C,KAAK,gCAAgC,EAEtC,MAAM,6CAA6C,CAAC;AAIrD,OAAO,EAGL,KAAK,0BAA0B,EAEhC,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAA+B,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAmC1G,OAAO,EAML,KAAK,UAAU,EAGf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAGrB,KAAK,wBAAwB,EAG9B,MAAM,cAAc,CAAC;AAYtB,OAAO,KAAK,EAGV,iBAAiB,EACjB,6BAA6B,EAE7B,0BAA0B,EAC1B,kBAAkB,EAKnB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAEL,KAAK,wBAAwB,EAG7B,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAaL,KAAK,kBAAkB,EAGxB,MAAM,qBAAqB,CAAC;AAiC7B,KAAK,0BAA0B,GAAG,iBAAiB,GAAG;IACpD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAKjE,uBAAuB,CAAC,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAC;CAChE,CAAC;AAEF,KAAK,kBAAkB,GAAG,CAAC,OAAO,EAAE,0BAA0B,KAAK,UAAU,CAAC;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,qCAAqC,CAAC;IACrD;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;;;;OAQG;IACH,QAAQ,EAAE,CAAC,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1D;;;;;;;OAOG;IACH,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAQD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,yEAAyE;IACzE,eAAe,EAAE,sBAAsB,CAAC;IACxC,uDAAuD;IACvD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACxC,iBAAiB,EAAE,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;IAChE;;;;;;;;;;;OAWG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,KAAK,EAAE,CAAC,MAAM,EAAE,0BAA0B,EAAE,KAAK,OAAO,CAAC,qCAAqC,CAAC,CAAC;CACjG;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,qCAAqC,CAAC;IACrD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAClD;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,sBAAsB,EACtB,WAAW,GAAG,aAAa,GAAG,gBAAgB,CAC/C,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,6FAA6F;IAC7F,8BAA8B,CAAC,EAAE,CAC/B,OAAO,EAAE,0BAA0B,EACnC,GAAG,EAAE,IAAI,KACN,iCAAiC,GAAG,IAAI,CAAC;IAC9C;;;;;;OAMG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACtD;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,CACvB,GAAG,EAAE,uBAAuB,KACzB,yBAAyB,GAAG,IAAI,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IAClF;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CACzB,KAAK,EAAE,4BAA4B,KAChC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,IAAI,CAAC;CACzE;AAwGD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,0BAA0B,GAAG,MAAM,CAEpF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAoFD;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,MAAM,CAAC,UAAU,EAC/B,SAAS,EAAE,MAAM,EACjB,sBAAsB,EAAE,OAAO,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,aAAa,EAAE,SAAS,6BAA6B,EAAE,EACvD,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;CACpC,GACA,iBAAiB,CAQnB;AAwBD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,gCAAgC,CACpD,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,gCAAgC,GACjD,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAmCD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc/F;AAqCD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,CAI1F;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAOlF;AAED,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,MAAM,CAO1G;AAonED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,MAAM,CAOT;AAuID;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAChD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GAAG;IACF,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAyDA;AAijBD,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,yBAA8B,SAS9B,uBAAuB,KAAG,OAAO,CAAC,sBAAsB,CAAC,CAknDvG;AAGD,eAAO,MAAM,OAAO,QArnD2B,uBAAuB,KAAG,OAAO,CAAC,sBAAsB,CAqnDtD,CAAC"}
|
|
@@ -10,8 +10,9 @@ import { fileURLToPath } from "node:url";
|
|
|
10
10
|
import { adapterExecutionTargetSessionIdentity, describeAdapterExecutionTarget, adapterExecutionTargetDuplexObservabilityRecorder, adapterExecutionTargetEnablesSandboxDuplexBridge, formatAdapterExecutionTimeoutErrorMessage, formatAdapterExecutionTimeoutStartLogLine, prepareAdapterExecutionTargetRuntime, readAdapterExecutionTarget, resolveAdapterExecutionTargetTimeout, resolveReferencedSourceIgnore, runAdapterExecutionTargetShellCommand, startAdapterExecutionTargetPaperclipBridge, startAdapterExecutionTargetProcessSessionBridge, } from "@paperclipai/adapter-utils/execution-target";
|
|
11
11
|
import { captureLocalProcess, capturedProcessExited, killCapturedLocalProcess } from "./local-process-control.js";
|
|
12
12
|
import { DUPLEX_CHANNEL_LOST_ERROR_CODE } from "../bridge-transport-contract.js";
|
|
13
|
+
import { formatTerminalSessionFailure, sanitizeTerminalSessionFailure, } from "./terminal-session-failure.js";
|
|
13
14
|
import { classifyWorkspaceRestoreFailure, describeWorkspaceRestoreFailure, } from "../workspace-restore-merge.js";
|
|
14
|
-
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,
|
|
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";
|
|
15
16
|
import { shellQuote } from "@paperclipai/adapter-utils/ssh";
|
|
16
17
|
import { createAcpRuntime, createAgentRegistry, createRuntimeStore, isAcpRuntimeError, } from "acpx/runtime";
|
|
17
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";
|
|
@@ -326,6 +327,9 @@ function defaultStateDir(companyId, agentId) {
|
|
|
326
327
|
function resolveManagedCodexHomeDir(companyId) {
|
|
327
328
|
return path.join(defaultPaperclipInstanceDir(), "companies", companyId, "codex-home");
|
|
328
329
|
}
|
|
330
|
+
function resolveManagedCodexApiKeyHomeDir(companyId, agentId) {
|
|
331
|
+
return path.join(defaultStateDir(companyId, agentId), "codex-home");
|
|
332
|
+
}
|
|
329
333
|
// Mirrors `resolveManagedGrokHomeDir` in
|
|
330
334
|
// `packages/adapters/grok-local/src/server/grok-home.ts` — this package
|
|
331
335
|
// cannot import that adapter package (it would invert the dependency
|
|
@@ -501,13 +505,28 @@ async function ensureCopiedFile(target, source) {
|
|
|
501
505
|
await fs.copyFile(source, target);
|
|
502
506
|
}
|
|
503
507
|
async function prepareManagedCodexHome(input) {
|
|
504
|
-
const { sourceHome, targetHome, onLog } = input;
|
|
508
|
+
const { sourceHome, targetHome, apiKey, onLog } = input;
|
|
505
509
|
if (path.resolve(sourceHome) === path.resolve(targetHome))
|
|
506
510
|
return targetHome;
|
|
507
511
|
await fs.mkdir(targetHome, { recursive: true });
|
|
508
|
-
const
|
|
509
|
-
if (
|
|
510
|
-
|
|
512
|
+
const targetAuth = path.join(targetHome, "auth.json");
|
|
513
|
+
if (apiKey) {
|
|
514
|
+
// Codex reads auth.json ahead of the process environment. Never leave a
|
|
515
|
+
// shared ChatGPT-login symlink in an API-key agent's managed home, and never
|
|
516
|
+
// write through that symlink into the operator's own Codex credentials.
|
|
517
|
+
// Atomic replacement also keeps concurrent turns from seeing a missing or
|
|
518
|
+
// partially written credential file.
|
|
519
|
+
await writeFileAtomically({
|
|
520
|
+
target: targetAuth,
|
|
521
|
+
contents: JSON.stringify({ OPENAI_API_KEY: apiKey }),
|
|
522
|
+
mode: 0o600,
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
const sourceAuth = path.join(sourceHome, "auth.json");
|
|
527
|
+
if (await pathExists(sourceAuth))
|
|
528
|
+
await ensureSymlink(targetAuth, sourceAuth);
|
|
529
|
+
}
|
|
511
530
|
for (const name of ["config.json", "config.toml", "instructions.md"]) {
|
|
512
531
|
const source = path.join(sourceHome, name);
|
|
513
532
|
if (await pathExists(source))
|
|
@@ -696,12 +715,19 @@ async function prepareCodexSkillRuntime(input) {
|
|
|
696
715
|
const sourceCodexHome = typeof process.env.CODEX_HOME === "string" && process.env.CODEX_HOME.trim().length > 0
|
|
697
716
|
? path.resolve(process.env.CODEX_HOME.trim())
|
|
698
717
|
: path.join(os.homedir(), ".codex");
|
|
699
|
-
const
|
|
718
|
+
const apiKey = input.env.OPENAI_API_KEY?.trim() || input.env.CODEX_API_KEY?.trim()
|
|
719
|
+
|| process.env.OPENAI_API_KEY?.trim() || process.env.CODEX_API_KEY?.trim();
|
|
720
|
+
// Keep API-key auth separate from the company home used by subscription
|
|
721
|
+
// agents, so one agent cannot switch another agent's login on its next turn.
|
|
722
|
+
const managedCodexHome = apiKey
|
|
723
|
+
? resolveManagedCodexApiKeyHomeDir(input.companyId, input.agentId)
|
|
724
|
+
: resolveManagedCodexHomeDir(input.companyId);
|
|
700
725
|
const effectiveCodexHome = configuredCodexHome ??
|
|
701
726
|
await prepareManagedCodexHome({
|
|
702
727
|
companyId: input.companyId,
|
|
703
728
|
sourceHome: sourceCodexHome,
|
|
704
729
|
targetHome: managedCodexHome,
|
|
730
|
+
apiKey,
|
|
705
731
|
onLog: input.onLog,
|
|
706
732
|
});
|
|
707
733
|
const { allSkills, selectedSkills, desiredSkillNames } = await resolveSelectedRuntimeSkills(input.config, input.moduleDir);
|
|
@@ -1180,7 +1206,6 @@ async function buildRuntime(input) {
|
|
|
1180
1206
|
const linkedIssueIds = Array.isArray(context.issueIds)
|
|
1181
1207
|
? context.issueIds.filter((value) => typeof value === "string" && value.trim().length > 0)
|
|
1182
1208
|
: [];
|
|
1183
|
-
const wakePayloadJson = stringifyPaperclipWakePayload(context.paperclipWake);
|
|
1184
1209
|
const issueWorkMode = readPaperclipIssueWorkModeFromContext(context);
|
|
1185
1210
|
if (wakeTaskId)
|
|
1186
1211
|
env.PAPERCLIP_TASK_ID = wakeTaskId;
|
|
@@ -1196,8 +1221,6 @@ async function buildRuntime(input) {
|
|
|
1196
1221
|
env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;
|
|
1197
1222
|
if (linkedIssueIds.length > 0)
|
|
1198
1223
|
env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(",");
|
|
1199
|
-
if (wakePayloadJson)
|
|
1200
|
-
env.PAPERCLIP_WAKE_PAYLOAD_JSON = wakePayloadJson;
|
|
1201
1224
|
applyPaperclipWorkspaceEnv(env, {
|
|
1202
1225
|
workspaceCwd: shapedWorkspaceEnv.workspaceCwd,
|
|
1203
1226
|
workspaceSource,
|
|
@@ -1296,7 +1319,11 @@ async function buildRuntime(input) {
|
|
|
1296
1319
|
paperclipClaudeSettings = await writePaperclipClaudeSettings({
|
|
1297
1320
|
cwd,
|
|
1298
1321
|
stateDir,
|
|
1299
|
-
|
|
1322
|
+
// A run's writable AGENT_HOME moves, but the existing permission root
|
|
1323
|
+
// must not invalidate its resumable conversation. Run copies are covered
|
|
1324
|
+
// by the company root already granted in these settings; the process env
|
|
1325
|
+
// still receives this run's actual AGENT_HOME.
|
|
1326
|
+
agentHome: asString(workspaceContext.agentHomeForPermissions, agentHome),
|
|
1300
1327
|
companyId: agent.companyId,
|
|
1301
1328
|
});
|
|
1302
1329
|
skillCommandNotes.push(`Wrote Paperclip-managed Claude settings to ${paperclipClaudeSettings.filePath} (defaultMode=${paperclipClaudeSettings.defaultMode}${paperclipClaudeSettings.overrodeDontAsk ? "; overrode user dontAsk" : ""}, +${paperclipClaudeSettings.additionalDirectories.length} read root(s), +${paperclipClaudeSettings.allow.length} allow rule(s)).`);
|
|
@@ -1307,6 +1334,7 @@ async function buildRuntime(input) {
|
|
|
1307
1334
|
// threaded onEvent/now seam.
|
|
1308
1335
|
const preparedSkills = await measureStartupStep(input.ctx, nowMs, "codex-home.seed", () => prepareCodexSkillRuntime({
|
|
1309
1336
|
companyId: agent.companyId,
|
|
1337
|
+
agentId: agent.id,
|
|
1310
1338
|
config,
|
|
1311
1339
|
env,
|
|
1312
1340
|
moduleDir: input.engine.moduleDir,
|
|
@@ -2125,15 +2153,8 @@ async function buildPrompt(ctx, resumedSession, env) {
|
|
|
2125
2153
|
const renderedBootstrapPrompt = !resumedSession && bootstrapPromptTemplate.trim().length > 0
|
|
2126
2154
|
? renderTemplate(bootstrapPromptTemplate, templateData).trim()
|
|
2127
2155
|
: "";
|
|
2128
|
-
const taskContextNote =
|
|
2156
|
+
const { taskContextNote, wakePrompt } = selectPaperclipPromptSections(context, { resumedSession });
|
|
2129
2157
|
const externalChatTurn = isPaperclipExternalChatTurn(context.paperclipWake);
|
|
2130
|
-
const wakePrompt = renderPaperclipWakePrompt(context.paperclipWake, {
|
|
2131
|
-
resumedSession,
|
|
2132
|
-
conversationMode: context.conversationMode === true,
|
|
2133
|
-
// The task-context markdown is the authoritative brief on this lane; keep
|
|
2134
|
-
// the wake prompt's description copy out so the prompt carries it once.
|
|
2135
|
-
suppressIssueDescription: taskContextNote.length > 0,
|
|
2136
|
-
});
|
|
2137
2158
|
const shouldUseResumeDeltaPrompt = resumedSession && wakePrompt.length > 0;
|
|
2138
2159
|
const promptInstructionsPrefix = shouldUseResumeDeltaPrompt ? "" : instructionsPrefix;
|
|
2139
2160
|
const renderedPrompt = shouldUseResumeDeltaPrompt || (externalChatTurn && !hasCustomPromptTemplate)
|
|
@@ -2637,12 +2658,13 @@ async function closeWarmHandle(input) {
|
|
|
2637
2658
|
input.handles.delete(input.key);
|
|
2638
2659
|
}
|
|
2639
2660
|
clearWarmHandleTimer(input.entry);
|
|
2640
|
-
await input.entry.runtime.close({
|
|
2661
|
+
const stopped = await input.entry.runtime.close({
|
|
2641
2662
|
handle: input.entry.handle,
|
|
2642
2663
|
reason: input.reason,
|
|
2643
2664
|
discardPersistentState: input.discardPersistentState ?? false,
|
|
2644
|
-
}).
|
|
2665
|
+
}).then(() => true, () => false);
|
|
2645
2666
|
flushChildStderr(input.entry.childStderrState);
|
|
2667
|
+
return stopped;
|
|
2646
2668
|
}
|
|
2647
2669
|
function warmHandleMatches(entry, runtime, handle) {
|
|
2648
2670
|
return entry !== undefined && entry.runtime === runtime && entry.handle === handle;
|
|
@@ -3078,6 +3100,7 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3078
3100
|
// (the cancel-before-close order). The turn wrapper assigns it in `turnStart`.
|
|
3079
3101
|
let activeTurn = null;
|
|
3080
3102
|
let terminalFailureClassification = null;
|
|
3103
|
+
let terminalSessionFailure = null;
|
|
3081
3104
|
// How the settlement `endSession` step must release the runtime for the path
|
|
3082
3105
|
// this run took. Each exit path that acquired the runtime records it before it
|
|
3083
3106
|
// returns; a build or create-runtime failure never registers the runtime, so
|
|
@@ -3650,6 +3673,8 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3650
3673
|
};
|
|
3651
3674
|
let eventBreakdown = null;
|
|
3652
3675
|
let eventCostUsd = null;
|
|
3676
|
+
let lastRuntimeEventAt = null;
|
|
3677
|
+
let observedRuntimeEvents = 0;
|
|
3653
3678
|
// The turn-local state the sequence steps share. `promptBuild` sets the
|
|
3654
3679
|
// prompt, `preTurnUsage` sets the pre-turn status, `turnStart` sets the
|
|
3655
3680
|
// active turn, and `turnFinalize` reads all three. `activeTurn` is the run-
|
|
@@ -3740,14 +3765,12 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3740
3765
|
timeoutMs: startTimeoutMs,
|
|
3741
3766
|
signal,
|
|
3742
3767
|
// The callback belongs to this turn, including when a runtime is reused.
|
|
3743
|
-
//
|
|
3744
|
-
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
|
|
3748
|
-
|
|
3749
|
-
}
|
|
3750
|
-
: {}),
|
|
3768
|
+
// Diagnostics are retained even when an adapter has no recovery
|
|
3769
|
+
// classifier. Redact before bounding so partial secrets cannot leak.
|
|
3770
|
+
onTerminalSessionFailure: (failure) => {
|
|
3771
|
+
terminalSessionFailure = sanitizeTerminalSessionFailure(failure, prepared.env, ctx.authToken, parseObject(ctx.config.env));
|
|
3772
|
+
terminalFailureClassification = deps.classifyTerminalSessionFailure?.(failure, new Date(now())) ?? null;
|
|
3773
|
+
},
|
|
3751
3774
|
});
|
|
3752
3775
|
activeTurn = turn;
|
|
3753
3776
|
// A latched sandbox duplex-channel loss otherwise has no way to reach
|
|
@@ -3823,6 +3846,8 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3823
3846
|
const toolTitles = new Map();
|
|
3824
3847
|
const drainEvents = (async () => {
|
|
3825
3848
|
for await (const event of turn.events) {
|
|
3849
|
+
lastRuntimeEventAt = now();
|
|
3850
|
+
observedRuntimeEvents += 1;
|
|
3826
3851
|
// ACPX currently flattens client-side filesystem/terminal receipts
|
|
3827
3852
|
// into status text. They cannot establish complete action outcomes.
|
|
3828
3853
|
if (event.type === "status" && /^(fs|terminal)\//.test(event.text))
|
|
@@ -3881,6 +3906,16 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3881
3906
|
return await Promise.race([turn.result, lossDeadline.then(() => LOSS_DEADLINE_TERMINAL)]);
|
|
3882
3907
|
};
|
|
3883
3908
|
const stepTurnFinalize = async (input) => {
|
|
3909
|
+
// Capture runtime activity before usage reads, error logs, or cleanup
|
|
3910
|
+
// make an otherwise silent turn look active at its execution deadline.
|
|
3911
|
+
const lastEventAgeMs = lastRuntimeEventAt === null ? undefined : now() - lastRuntimeEventAt;
|
|
3912
|
+
const activityDiagnostics = {
|
|
3913
|
+
acpObservedEventCount: observedRuntimeEvents,
|
|
3914
|
+
...(lastEventAgeMs !== undefined && Number.isSafeInteger(lastEventAgeMs) && lastEventAgeMs >= 0
|
|
3915
|
+
? { acpLastEventAgeMs: lastEventAgeMs } : {}),
|
|
3916
|
+
acpPendingToolCount: [...interruptionTools.values()].filter((tool) => tool.status !== "completed" && tool.status !== "failed" && tool.status !== "cancelled").length,
|
|
3917
|
+
acpToolInventoryComplete: !incompleteToolInventory,
|
|
3918
|
+
};
|
|
3884
3919
|
if (input.kind === "terminal") {
|
|
3885
3920
|
const terminal = input.terminal;
|
|
3886
3921
|
const timedOut = input.timedOut;
|
|
@@ -3964,11 +3999,14 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
3964
3999
|
cancelTurnReason: null,
|
|
3965
4000
|
skipRemoteClose: channelLost,
|
|
3966
4001
|
};
|
|
4002
|
+
const failureDiagnostic = !timedOut && !channelLost && terminal.status === "failed"
|
|
4003
|
+
? terminalSessionFailure
|
|
4004
|
+
: null;
|
|
3967
4005
|
const errorMessage = timedOut
|
|
3968
4006
|
? formatAdapterExecutionTimeoutErrorMessage(prepared.timeoutResolution)
|
|
3969
4007
|
: channelLost
|
|
3970
4008
|
? channelLostMessage
|
|
3971
|
-
: resultErrorMessage(terminal);
|
|
4009
|
+
: formatTerminalSessionFailure(resultErrorMessage(terminal), failureDiagnostic);
|
|
3972
4010
|
const terminalStopReason = terminal.status === "failed" ? terminal.error.message : terminal.stopReason;
|
|
3973
4011
|
const classifiedFailure = !timedOut && !channelLost && terminal.status === "failed"
|
|
3974
4012
|
? terminalFailureClassification
|
|
@@ -4007,6 +4045,8 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4007
4045
|
costUsd: turnUsage.costUsd,
|
|
4008
4046
|
resultJson: {
|
|
4009
4047
|
status: channelLost ? "failed" : terminal.status,
|
|
4048
|
+
...activityDiagnostics,
|
|
4049
|
+
...(failureDiagnostic ? { terminalSessionFailure: failureDiagnostic } : {}),
|
|
4010
4050
|
...(classifiedFailure?.errorFamily ? { errorFamily: classifiedFailure.errorFamily } : {}),
|
|
4011
4051
|
...(classifiedFailure?.retryNotBefore
|
|
4012
4052
|
? {
|
|
@@ -4137,7 +4177,7 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4137
4177
|
...referencedProjectStagingFailuresField,
|
|
4138
4178
|
model: prepared.requestedModel || null,
|
|
4139
4179
|
clearSession: clearSession || timedOut,
|
|
4140
|
-
resultJson: { phase },
|
|
4180
|
+
resultJson: { phase, ...activityDiagnostics },
|
|
4141
4181
|
summary: message,
|
|
4142
4182
|
};
|
|
4143
4183
|
// Return a typed failed completion so the coordinator settles for a cause
|
|
@@ -4280,7 +4320,7 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4280
4320
|
existing) {
|
|
4281
4321
|
// A matching warm entry closes through the warm store, which also
|
|
4282
4322
|
// clears its idle timer and flushes its child stderr.
|
|
4283
|
-
await closeWarmHandle({
|
|
4323
|
+
runtimeStopConfirmed = await closeWarmHandle({
|
|
4284
4324
|
handles: warmHandles,
|
|
4285
4325
|
key: prepared.sessionKey,
|
|
4286
4326
|
entry: existing,
|
|
@@ -4327,12 +4367,26 @@ export function createAcpxEngineExecutor(deps = {}) {
|
|
|
4327
4367
|
// runs, so the host mints a `traceparent` for the provider spans, and the
|
|
4328
4368
|
// per-task restore spans parent to `sandbox.syncBack`.
|
|
4329
4369
|
syncBack: () => timedPhase("sync_back", async () => {
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4370
|
+
// A transport error or terminal narrative cannot authorize collecting
|
|
4371
|
+
// mutable provider files. Require the owned close or local OS handle.
|
|
4372
|
+
const stopped = runtimeStopConfirmed || (!prepared.processSessionBridge && capturedProcessExited(processIdentitySink?.localProcess));
|
|
4373
|
+
try {
|
|
4374
|
+
if (stopped)
|
|
4375
|
+
await ctx.onProviderStopped?.();
|
|
4376
|
+
}
|
|
4377
|
+
catch {
|
|
4378
|
+
// Match ACP's fail-soft teardown policy without describing this as
|
|
4379
|
+
// a workspace restore failure or exposing paths from a raw error.
|
|
4380
|
+
await recordTeardownError("instruction-collection", new Error("Instruction collection failed after provider stop. No instruction save is claimed."));
|
|
4381
|
+
}
|
|
4382
|
+
finally {
|
|
4383
|
+
await runRuntimeSpan("sandbox.syncBack", async () => {
|
|
4384
|
+
const restoreOutcome = await syncBackManagedHome(prepared);
|
|
4385
|
+
if (!restoreOutcome.ok) {
|
|
4386
|
+
workspaceRestoreFailureField = { workspaceRestoreFailure: restoreOutcome.code };
|
|
4387
|
+
}
|
|
4388
|
+
});
|
|
4389
|
+
}
|
|
4336
4390
|
}),
|
|
4337
4391
|
// The staging lease releases as the run's final act, AFTER the coordinator
|
|
4338
4392
|
// reproduces the result, in the run root `finally` below. This step stays a
|