@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.
Files changed (135) hide show
  1. package/dist/acpx-engine/execute.d.ts +2 -6
  2. package/dist/acpx-engine/execute.d.ts.map +1 -1
  3. package/dist/acpx-engine/execute.js +91 -37
  4. package/dist/acpx-engine/execute.js.map +1 -1
  5. package/dist/acpx-engine/execute.test.js +250 -11
  6. package/dist/acpx-engine/execute.test.js.map +1 -1
  7. package/dist/acpx-engine/spawn-smoke.test.js +16 -7
  8. package/dist/acpx-engine/spawn-smoke.test.js.map +1 -1
  9. package/dist/acpx-engine/startup-cancellation.d.ts +1 -0
  10. package/dist/acpx-engine/startup-cancellation.d.ts.map +1 -1
  11. package/dist/acpx-engine/startup-cancellation.js +7 -2
  12. package/dist/acpx-engine/startup-cancellation.js.map +1 -1
  13. package/dist/acpx-engine/terminal-session-failure.d.ts +12 -0
  14. package/dist/acpx-engine/terminal-session-failure.d.ts.map +1 -0
  15. package/dist/acpx-engine/terminal-session-failure.js +92 -0
  16. package/dist/acpx-engine/terminal-session-failure.js.map +1 -0
  17. package/dist/acpx-engine/terminal-session-failure.test.d.ts +2 -0
  18. package/dist/acpx-engine/terminal-session-failure.test.d.ts.map +1 -0
  19. package/dist/acpx-engine/terminal-session-failure.test.js +119 -0
  20. package/dist/acpx-engine/terminal-session-failure.test.js.map +1 -0
  21. package/dist/acpx-engine/turn-characterization.test.js +4 -3
  22. package/dist/acpx-engine/turn-characterization.test.js.map +1 -1
  23. package/dist/command-managed-runtime.d.ts +2 -0
  24. package/dist/command-managed-runtime.d.ts.map +1 -1
  25. package/dist/command-managed-runtime.js +2 -0
  26. package/dist/command-managed-runtime.js.map +1 -1
  27. package/dist/execution-target-sandbox.test.js +193 -4
  28. package/dist/execution-target-sandbox.test.js.map +1 -1
  29. package/dist/execution-target-stdin-race.test.js +241 -2
  30. package/dist/execution-target-stdin-race.test.js.map +1 -1
  31. package/dist/execution-target.d.ts +6 -0
  32. package/dist/execution-target.d.ts.map +1 -1
  33. package/dist/execution-target.js +158 -35
  34. package/dist/execution-target.js.map +1 -1
  35. package/dist/git-workspace-sync.d.ts +13 -5
  36. package/dist/git-workspace-sync.d.ts.map +1 -1
  37. package/dist/git-workspace-sync.js +172 -96
  38. package/dist/git-workspace-sync.js.map +1 -1
  39. package/dist/git-workspace-sync.test.js +108 -9
  40. package/dist/git-workspace-sync.test.js.map +1 -1
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/paperclip-runner-permissions.d.ts +28 -1
  46. package/dist/paperclip-runner-permissions.d.ts.map +1 -1
  47. package/dist/paperclip-runner-permissions.js +9 -1
  48. package/dist/paperclip-runner-permissions.js.map +1 -1
  49. package/dist/prompt-sections.test.d.ts +2 -0
  50. package/dist/prompt-sections.test.d.ts.map +1 -0
  51. package/dist/prompt-sections.test.js +52 -0
  52. package/dist/prompt-sections.test.js.map +1 -0
  53. package/dist/provider-stopped-boundary.d.ts +7 -0
  54. package/dist/provider-stopped-boundary.d.ts.map +1 -0
  55. package/dist/provider-stopped-boundary.js +22 -0
  56. package/dist/provider-stopped-boundary.js.map +1 -0
  57. package/dist/provider-stopped-boundary.test.d.ts +2 -0
  58. package/dist/provider-stopped-boundary.test.d.ts.map +1 -0
  59. package/dist/provider-stopped-boundary.test.js +76 -0
  60. package/dist/provider-stopped-boundary.test.js.map +1 -0
  61. package/dist/remote-managed-runtime.d.ts +2 -0
  62. package/dist/remote-managed-runtime.d.ts.map +1 -1
  63. package/dist/remote-managed-runtime.js +3 -1
  64. package/dist/remote-managed-runtime.js.map +1 -1
  65. package/dist/remote-managed-runtime.test.js +25 -0
  66. package/dist/remote-managed-runtime.test.js.map +1 -1
  67. package/dist/sandbox-callback-bridge.d.ts.map +1 -1
  68. package/dist/sandbox-callback-bridge.js +22 -7
  69. package/dist/sandbox-callback-bridge.js.map +1 -1
  70. package/dist/sandbox-callback-bridge.test.js +6 -3
  71. package/dist/sandbox-callback-bridge.test.js.map +1 -1
  72. package/dist/sandbox-managed-runtime.d.ts +3 -0
  73. package/dist/sandbox-managed-runtime.d.ts.map +1 -1
  74. package/dist/sandbox-managed-runtime.js +764 -691
  75. package/dist/sandbox-managed-runtime.js.map +1 -1
  76. package/dist/sandbox-managed-runtime.test.js +163 -3
  77. package/dist/sandbox-managed-runtime.test.js.map +1 -1
  78. package/dist/server-utils.d.ts +36 -0
  79. package/dist/server-utils.d.ts.map +1 -1
  80. package/dist/server-utils.js +85 -10
  81. package/dist/server-utils.js.map +1 -1
  82. package/dist/server-utils.test.js +174 -0
  83. package/dist/server-utils.test.js.map +1 -1
  84. package/dist/ssh-fixture.test.js +22 -0
  85. package/dist/ssh-fixture.test.js.map +1 -1
  86. package/dist/ssh.d.ts +2 -0
  87. package/dist/ssh.d.ts.map +1 -1
  88. package/dist/ssh.js +2 -2
  89. package/dist/ssh.js.map +1 -1
  90. package/dist/test-fixtures/prompt-context.d.ts +54 -0
  91. package/dist/test-fixtures/prompt-context.d.ts.map +1 -0
  92. package/dist/test-fixtures/prompt-context.js +55 -0
  93. package/dist/test-fixtures/prompt-context.js.map +1 -0
  94. package/dist/types.d.ts +4 -1
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/workspace-git-stream.d.ts +19 -0
  97. package/dist/workspace-git-stream.d.ts.map +1 -0
  98. package/dist/workspace-git-stream.js +99 -0
  99. package/dist/workspace-git-stream.js.map +1 -0
  100. package/dist/workspace-git-stream.test.d.ts +2 -0
  101. package/dist/workspace-git-stream.test.d.ts.map +1 -0
  102. package/dist/workspace-git-stream.test.js +71 -0
  103. package/dist/workspace-git-stream.test.js.map +1 -0
  104. package/dist/workspace-manifest.d.ts +61 -0
  105. package/dist/workspace-manifest.d.ts.map +1 -0
  106. package/dist/workspace-manifest.js +257 -0
  107. package/dist/workspace-manifest.js.map +1 -0
  108. package/dist/workspace-manifest.test.d.ts +2 -0
  109. package/dist/workspace-manifest.test.d.ts.map +1 -0
  110. package/dist/workspace-manifest.test.js +160 -0
  111. package/dist/workspace-manifest.test.js.map +1 -0
  112. package/dist/workspace-restore-diagnostics.d.ts +6 -0
  113. package/dist/workspace-restore-diagnostics.d.ts.map +1 -0
  114. package/dist/workspace-restore-diagnostics.js +66 -0
  115. package/dist/workspace-restore-diagnostics.js.map +1 -0
  116. package/dist/workspace-restore-diagnostics.test.d.ts +2 -0
  117. package/dist/workspace-restore-diagnostics.test.d.ts.map +1 -0
  118. package/dist/workspace-restore-diagnostics.test.js +67 -0
  119. package/dist/workspace-restore-diagnostics.test.js.map +1 -0
  120. package/dist/workspace-restore-merge.d.ts +45 -6
  121. package/dist/workspace-restore-merge.d.ts.map +1 -1
  122. package/dist/workspace-restore-merge.js +310 -65
  123. package/dist/workspace-restore-merge.js.map +1 -1
  124. package/dist/workspace-restore-merge.test.js +247 -1
  125. package/dist/workspace-restore-merge.test.js.map +1 -1
  126. package/dist/workspace-restore-result.d.ts +6 -0
  127. package/dist/workspace-restore-result.d.ts.map +1 -0
  128. package/dist/workspace-restore-result.js +67 -0
  129. package/dist/workspace-restore-result.js.map +1 -0
  130. package/dist/workspace-restore-result.test.d.ts +2 -0
  131. package/dist/workspace-restore-result.test.d.ts.map +1 -0
  132. package/dist/workspace-restore-result.test.js +49 -0
  133. package/dist/workspace-restore-result.test.js.map +1 -0
  134. package/node_modules/acpx/dist/live-checkpoint-ClPCSdrW.js +4 -3
  135. 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;AAqC1G,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,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;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;AA+BD,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;AAimED;;;;;;;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;AAgjBD,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,yBAA8B,SAS9B,uBAAuB,KAAG,OAAO,CAAC,sBAAsB,CAAC,CAilDvG;AAGD,eAAO,MAAM,OAAO,QAplD2B,uBAAuB,KAAG,OAAO,CAAC,sBAAsB,CAolDtD,CAAC"}
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/execute.ts"],"names":[],"mappings":"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"}
@@ -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, renderPaperclipWakePrompt, renderTemplate, resolvePaperclipInstanceRootForAdapter, selectPaperclipTaskMarkdown, resolveLegacyPaperclipDesiredSkillNames, removeMaintainerOnlySkillSymlinks, rewriteWorkspaceCwdEnvVarsForExecution, shapePaperclipWorkspaceEnvForExecution, stringifyPaperclipWakePayload, } from "@paperclipai/adapter-utils/server-utils";
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 authJson = path.join(sourceHome, "auth.json");
509
- if (await pathExists(authJson))
510
- await ensureSymlink(path.join(targetHome, "auth.json"), authJson);
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 managedCodexHome = resolveManagedCodexHomeDir(input.companyId);
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
- agentHome,
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 = selectPaperclipTaskMarkdown(context, { resumedSession });
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
- }).catch(() => { });
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
- // Raw provider text must never enter the result or the run log.
3744
- ...(deps.classifyTerminalSessionFailure
3745
- ? {
3746
- onTerminalSessionFailure: (failure) => {
3747
- terminalFailureClassification = deps.classifyTerminalSessionFailure(failure, new Date(now()));
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
- await runRuntimeSpan("sandbox.syncBack", async () => {
4331
- const restoreOutcome = await syncBackManagedHome(prepared);
4332
- if (!restoreOutcome.ok) {
4333
- workspaceRestoreFailureField = { workspaceRestoreFailure: restoreOutcome.code };
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