@paperclipai/adapter-utils 2026.1012.0 → 2026.1012.1-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 (111) hide show
  1. package/dist/acpx-engine/accounting-model.d.ts +5 -0
  2. package/dist/acpx-engine/accounting-model.d.ts.map +1 -0
  3. package/dist/acpx-engine/accounting-model.js +10 -0
  4. package/dist/acpx-engine/accounting-model.js.map +1 -0
  5. package/dist/acpx-engine/accounting-model.test.d.ts +2 -0
  6. package/dist/acpx-engine/accounting-model.test.d.ts.map +1 -0
  7. package/dist/acpx-engine/accounting-model.test.js +18 -0
  8. package/dist/acpx-engine/accounting-model.test.js.map +1 -0
  9. package/dist/acpx-engine/execute.d.ts.map +1 -1
  10. package/dist/acpx-engine/execute.js +83 -10
  11. package/dist/acpx-engine/execute.js.map +1 -1
  12. package/dist/acpx-engine/execute.test.js +192 -15
  13. package/dist/acpx-engine/execute.test.js.map +1 -1
  14. package/dist/acpx-engine/filesystem-protocol.test.d.ts +2 -0
  15. package/dist/acpx-engine/filesystem-protocol.test.d.ts.map +1 -0
  16. package/dist/acpx-engine/filesystem-protocol.test.js +99 -0
  17. package/dist/acpx-engine/filesystem-protocol.test.js.map +1 -0
  18. package/dist/acpx-engine/run-contracts.d.ts +1 -0
  19. package/dist/acpx-engine/run-contracts.d.ts.map +1 -1
  20. package/dist/api-billing-type.d.ts +5 -0
  21. package/dist/api-billing-type.d.ts.map +1 -0
  22. package/dist/api-billing-type.js +16 -0
  23. package/dist/api-billing-type.js.map +1 -0
  24. package/dist/api-billing-type.test.d.ts +2 -0
  25. package/dist/api-billing-type.test.d.ts.map +1 -0
  26. package/dist/api-billing-type.test.js +20 -0
  27. package/dist/api-billing-type.test.js.map +1 -0
  28. package/dist/billing.d.ts +7 -0
  29. package/dist/billing.d.ts.map +1 -1
  30. package/dist/billing.js +25 -2
  31. package/dist/billing.js.map +1 -1
  32. package/dist/billing.test.js +17 -1
  33. package/dist/billing.test.js.map +1 -1
  34. package/dist/chat-file-delivery.d.ts +1 -1
  35. package/dist/chat-file-delivery.d.ts.map +1 -1
  36. package/dist/chat-file-delivery.js +4 -3
  37. package/dist/chat-file-delivery.js.map +1 -1
  38. package/dist/chat-file-delivery.test.js +2 -2
  39. package/dist/chat-file-delivery.test.js.map +1 -1
  40. package/dist/command-managed-runtime.d.ts +6 -0
  41. package/dist/command-managed-runtime.d.ts.map +1 -1
  42. package/dist/command-managed-runtime.js +5 -1
  43. package/dist/command-managed-runtime.js.map +1 -1
  44. package/dist/connection-failure.d.ts +33 -0
  45. package/dist/connection-failure.d.ts.map +1 -0
  46. package/dist/connection-failure.js +43 -0
  47. package/dist/connection-failure.js.map +1 -0
  48. package/dist/connection-failure.test.d.ts +2 -0
  49. package/dist/connection-failure.test.d.ts.map +1 -0
  50. package/dist/connection-failure.test.js +94 -0
  51. package/dist/connection-failure.test.js.map +1 -0
  52. package/dist/directory-merge-lock.test.js +4 -2
  53. package/dist/directory-merge-lock.test.js.map +1 -1
  54. package/dist/execution-target-sandbox.test.js +228 -0
  55. package/dist/execution-target-sandbox.test.js.map +1 -1
  56. package/dist/execution-target.d.ts +12 -0
  57. package/dist/execution-target.d.ts.map +1 -1
  58. package/dist/execution-target.js +49 -13
  59. package/dist/execution-target.js.map +1 -1
  60. package/dist/execution-target.test.js +35 -1
  61. package/dist/execution-target.test.js.map +1 -1
  62. package/dist/github-launcher-environment.test.js +37 -0
  63. package/dist/github-launcher-environment.test.js.map +1 -1
  64. package/dist/index.d.ts +3 -3
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -2
  67. package/dist/index.js.map +1 -1
  68. package/dist/paperclip-runner-permissions.d.ts +15 -4
  69. package/dist/paperclip-runner-permissions.d.ts.map +1 -1
  70. package/dist/paperclip-runner-permissions.js +29 -3
  71. package/dist/paperclip-runner-permissions.js.map +1 -1
  72. package/dist/paperclip-runner-permissions.test.js +34 -1
  73. package/dist/paperclip-runner-permissions.test.js.map +1 -1
  74. package/dist/sandbox-callback-bridge.d.ts.map +1 -1
  75. package/dist/sandbox-callback-bridge.js +1 -0
  76. package/dist/sandbox-callback-bridge.js.map +1 -1
  77. package/dist/sandbox-callback-bridge.test.js +113 -16
  78. package/dist/sandbox-callback-bridge.test.js.map +1 -1
  79. package/dist/sandbox-managed-runtime.d.ts +5 -0
  80. package/dist/sandbox-managed-runtime.d.ts.map +1 -1
  81. package/dist/sandbox-managed-runtime.js +51 -13
  82. package/dist/sandbox-managed-runtime.js.map +1 -1
  83. package/dist/sandbox-managed-runtime.test.js +119 -2
  84. package/dist/sandbox-managed-runtime.test.js.map +1 -1
  85. package/dist/server-utils.d.ts +6 -3
  86. package/dist/server-utils.d.ts.map +1 -1
  87. package/dist/server-utils.js +38 -8
  88. package/dist/server-utils.js.map +1 -1
  89. package/dist/server-utils.test.js +35 -1
  90. package/dist/server-utils.test.js.map +1 -1
  91. package/dist/types.d.ts +76 -1
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/usage-checkpoint.d.ts +11 -0
  94. package/dist/usage-checkpoint.d.ts.map +1 -0
  95. package/dist/usage-checkpoint.js +165 -0
  96. package/dist/usage-checkpoint.js.map +1 -0
  97. package/dist/usage-checkpoint.test.d.ts +2 -0
  98. package/dist/usage-checkpoint.test.d.ts.map +1 -0
  99. package/dist/usage-checkpoint.test.js +131 -0
  100. package/dist/usage-checkpoint.test.js.map +1 -0
  101. package/dist/workspace-restore-diagnostics.d.ts +8 -1
  102. package/dist/workspace-restore-diagnostics.d.ts.map +1 -1
  103. package/dist/workspace-restore-diagnostics.js +35 -8
  104. package/dist/workspace-restore-diagnostics.js.map +1 -1
  105. package/dist/workspace-restore-diagnostics.test.js +31 -1
  106. package/dist/workspace-restore-diagnostics.test.js.map +1 -1
  107. package/node_modules/acpx/dist/live-checkpoint-ClPCSdrW.js +3 -0
  108. package/package.json +31 -3
  109. package/node_modules/@esbuild/linux-x64/README.md +0 -3
  110. package/node_modules/@esbuild/linux-x64/bin/esbuild +0 -0
  111. package/node_modules/@esbuild/linux-x64/package.json +0 -20
@@ -0,0 +1,5 @@
1
+ import type { AcpRuntimeStatus } from "acpx/runtime";
2
+ /** Use provider-selected IDs, including its default. A mid-turn model change
3
+ * cannot be priced as a single-model receipt; never guess from a display name. */
4
+ export declare function acpxAccountingModel(requested: string, before: AcpRuntimeStatus | null, after: AcpRuntimeStatus | null): string | null;
5
+ //# sourceMappingURL=accounting-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting-model.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/accounting-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD;kFACkF;AAClF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKrI"}
@@ -0,0 +1,10 @@
1
+ /** Use provider-selected IDs, including its default. A mid-turn model change
2
+ * cannot be priced as a single-model receipt; never guess from a display name. */
3
+ export function acpxAccountingModel(requested, before, after) {
4
+ const pre = before?.models?.currentModelId?.trim();
5
+ const post = after?.models?.currentModelId?.trim();
6
+ if (pre && post && pre !== post)
7
+ return null;
8
+ return post || pre || requested.trim() || null;
9
+ }
10
+ //# sourceMappingURL=accounting-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting-model.js","sourceRoot":"","sources":["../../src/acpx-engine/accounting-model.ts"],"names":[],"mappings":"AAEA;kFACkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,MAA+B,EAAE,KAA8B;IACpH,MAAM,GAAG,GAAG,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,IAAI,IAAI,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=accounting-model.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting-model.test.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/accounting-model.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { acpxAccountingModel } from "./accounting-model.js";
3
+ const selected = (id) => ({ models: { currentModelId: id, availableModelIds: [id] } });
4
+ describe("ACP accounting model", () => {
5
+ it("retains the runtime's default and effective model instead of the requested label", () => {
6
+ expect(acpxAccountingModel("", selected("gpt-6.1-sol"), selected("gpt-6.1-sol"))).toBe("gpt-6.1-sol");
7
+ expect(acpxAccountingModel("default", null, selected("gpt-6-astra"))).toBe("gpt-6-astra");
8
+ expect(acpxAccountingModel("", selected("gpt-6-astra"), null)).toBe("gpt-6-astra");
9
+ });
10
+ it("uses explicit configuration only when no selected model was reported", () => {
11
+ expect(acpxAccountingModel("gpt-6.1-sol", null, null)).toBe("gpt-6.1-sol");
12
+ expect(acpxAccountingModel("", { models: { availableModelIds: ["gpt-6.1-sol"] } }, null)).toBeNull();
13
+ });
14
+ it("does not price a turn that changed models as one model", () => {
15
+ expect(acpxAccountingModel("gpt-6.1-sol", selected("gpt-6.1-sol"), selected("gpt-6-astra"))).toBeNull();
16
+ });
17
+ });
18
+ //# sourceMappingURL=accounting-model.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting-model.test.js","sourceRoot":"","sources":["../../src/acpx-engine/accounting-model.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/F,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtG,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1F,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3E,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvG,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1G,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/execute.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/acpx-engine/execute.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ import { createEphemeralSessionEnvironmentStore } from "./ephemeral-session-envi
20
20
  import { createAcpRuntime, createAgentRegistry, createRuntimeStore, isAcpRuntimeError, } from "acpx/runtime";
21
21
  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
22
  import { createRunResourceLedger } from "./run-resource-ledger.js";
23
+ import { acpxAccountingModel } from "./accounting-model.js";
23
24
  import { settleAcpRun } from "./settlement-sequence.js";
24
25
  import { runAttempt, } from "./run-coordinator.js";
25
26
  import { runTurn as runTurnSequence, } from "./turn-sequence.js";
@@ -863,7 +864,7 @@ function normalizeRequestedThinkingEffort(config) {
863
864
  asString(config.effort, "")).trim();
864
865
  }
865
866
  function buildCodexStartupConfig(input) {
866
- const hasRuntimeConfig = Boolean(input.requestedModel || input.requestedThinkingEffort || input.fastMode);
867
+ const hasRuntimeConfig = Boolean(input.requestedModel || input.requestedThinkingEffort || input.fastMode || input.identityEnvironmentKeys);
867
868
  if (!hasRuntimeConfig)
868
869
  return { value: null, invalidExistingConfig: false };
869
870
  let existing = {};
@@ -893,6 +894,11 @@ function buildCodexStartupConfig(input) {
893
894
  },
894
895
  }
895
896
  : {}),
897
+ ...(input.identityEnvironmentKeys ? {
898
+ features: { ...parseObject(existing.features), ...(input.fastMode ? { fast_mode: true } : {}), shell_snapshot: false },
899
+ shell_environment_policy: { ...parseObject(existing.shell_environment_policy),
900
+ inherit: "all", ignore_default_excludes: true, include_only: input.identityEnvironmentKeys },
901
+ } : {}),
896
902
  }),
897
903
  invalidExistingConfig,
898
904
  };
@@ -1211,7 +1217,7 @@ async function buildRuntime(input) {
1211
1217
  const stateDir = path.resolve(asString(config.stateDir, "") || defaultStateDir(agent.companyId, agent.id));
1212
1218
  await fs.mkdir(stateDir, { recursive: true });
1213
1219
  const envConfig = parseObject(config.env);
1214
- const env = { ...buildPaperclipEnv(agent), PAPERCLIP_RUN_ID: runId };
1220
+ const env = { ...buildPaperclipEnv(agent, input.ctx.agentIdentity), PAPERCLIP_RUN_ID: runId };
1215
1221
  const wakeTaskId = (typeof context.taskId === "string" && context.taskId.trim()) ||
1216
1222
  (typeof context.issueId === "string" && context.issueId.trim()) ||
1217
1223
  "";
@@ -1300,9 +1306,22 @@ async function buildRuntime(input) {
1300
1306
  if (requestedModel && acpxAgent === "claude" && !env.ANTHROPIC_MODEL) {
1301
1307
  env.ANTHROPIC_MODEL = requestedModel;
1302
1308
  }
1309
+ // Gemini CLI reads GEMINI_MODEL when creating each ACP session. Its ACP
1310
+ // implementation supports set_model, but not set_config_option; configure
1311
+ // the selected model before startup without changing the transport.
1312
+ if (requestedModel && acpxAgent === "gemini") {
1313
+ env.GEMINI_MODEL = requestedModel;
1314
+ }
1303
1315
  if (acpxAgent === "codex") {
1304
1316
  const codexStartupConfig = buildCodexStartupConfig({
1305
1317
  existingConfig: env.CODEX_CONFIG,
1318
+ ...(input.ctx.agentIdentity ? { identityEnvironmentKeys: [...new Set([
1319
+ "PATH", "HOME", "LANG", "TMPDIR", "CODEX_HOME",
1320
+ "PAPERCLIP_AGENT_KEY_ID", "PAPERCLIP_AGENT_PUBLIC_KEY", "PAPERCLIP_AGENT_PRIVATE_KEY",
1321
+ // Preserve Codex's default secret-name exclusions. The short-lived
1322
+ // Paperclip API token is required by the agent skill's Bash/curl calls.
1323
+ ...Object.keys(env).filter(key => key === "PAPERCLIP_API_KEY" || !/key|secret|token/i.test(key)),
1324
+ ])] } : {}),
1306
1325
  requestedModel,
1307
1326
  requestedThinkingEffort,
1308
1327
  fastMode,
@@ -1429,8 +1448,9 @@ async function buildRuntime(input) {
1429
1448
  // (fingerprint, compat, persist, ensureSession, error) bind to THIS single
1430
1449
  // value so a warm/resumable session created with the in-sandbox cwd is reused
1431
1450
  // — not invalidated — on the next run. Remote runner-backed → the in-sandbox
1432
- // workspace dir; local and the runner-less fallback → the HOST cwd,
1433
- // byte-identical to today.
1451
+ // workspace dir; local and the runner-less fallback → the HOST cwd.
1452
+ // Local Gemini resolves tool paths through realpath. Give its ACP filesystem
1453
+ // client the same canonical root so workspace aliases stay within that root.
1434
1454
  //
1435
1455
  // PR 3: the staging transport derives the in-sandbox workspace dir
1436
1456
  // deterministically from the target's `remoteCwd` (it is exactly `remoteCwd`
@@ -1442,11 +1462,14 @@ async function buildRuntime(input) {
1442
1462
  // diverge from the cwd that fed the fingerprint.
1443
1463
  const sessionCwd = useRemoteProcessSession && executionTarget?.kind === "remote"
1444
1464
  ? executionTarget.remoteCwd
1445
- : cwd;
1465
+ : acpxAgent === "gemini" && !executionTargetIsRemote
1466
+ ? await fs.realpath(cwd)
1467
+ : cwd;
1446
1468
  // The 17 fields the session fingerprint hashes. Company, agent, and task
1447
1469
  // identifiers are NOT here; they scope the outer session key only (see
1448
1470
  // `keyIdentity`). The fingerprint builder accepts only this identity.
1449
1471
  const fingerprintIdentity = {
1472
+ ...(input.ctx.agentIdentity ? { agentIdentityKeyId: input.ctx.agentIdentity.keyId } : {}),
1450
1473
  acpxAgent,
1451
1474
  agentCommand: agentCommand ?? acpxAgent,
1452
1475
  cwd: path.resolve(sessionCwd),
@@ -1772,6 +1795,28 @@ async function buildRuntime(input) {
1772
1795
  await emitRunPhaseTiming(input.ctx, "start_transport", nowMs() - startTransportStart, "failed");
1773
1796
  throw err;
1774
1797
  }
1798
+ const currentSkillRoot = acpxAgent === "codex" && runtimeEnv.CODEX_HOME
1799
+ ? path.join(runtimeEnv.CODEX_HOME, "skills")
1800
+ : acpxAgent === "gemini" && !executionTargetIsRemote && typeof skillsIdentity.skillsHome === "string"
1801
+ ? skillsIdentity.skillsHome
1802
+ : null;
1803
+ if (currentSkillRoot && Array.isArray(skillsIdentity.selectedSkills) && skillsIdentity.selectedSkills.length > 0) {
1804
+ // Managed connection homes are disposable. A resumed conversation may
1805
+ // remember a previous home's skill paths; supply the current root on every
1806
+ // turn, after the remote launch environment has rebased CODEX_HOME.
1807
+ skillPromptInstructions = [
1808
+ `Paperclip has materialized selected runtime skills for this ACPX ${acpxAgent === "codex" ? "Codex" : "Gemini"} run.`,
1809
+ `Skill root for this run: ${currentSkillRoot}`,
1810
+ `Selected skills: ${skillsIdentity.selectedSkills.join(", ")}`,
1811
+ "When a task calls for one of these skills, read its SKILL.md from this root and follow it. Resolve referenced scripts and files relative to that skill. Use this run's root even when an earlier turn used a different path.",
1812
+ ...(acpxAgent === "gemini" && skillsIdentity.selectedSkills.includes("paperclip")
1813
+ ? [
1814
+ "Before calling Paperclip APIs or delivering task artifacts, read the selected paperclip skill's SKILL.md and its referenced artifact workflow. A completion comment does not upload an artifact or change task status.",
1815
+ "Gemini's shell tool rejects command substitution. Write JSON request bodies to a workspace file and use curl --data-binary @file, or use the selected skill's helpers, instead of constructing a body with command substitution.",
1816
+ ]
1817
+ : []),
1818
+ ].join("\n");
1819
+ }
1775
1820
  // The relay runs on the host with the sanitized remote launch environment.
1776
1821
  // Its /usr/bin/env node shebang cannot rely on that environment's PATH.
1777
1822
  const overrideCommand = processSessionBridge?.agentCommand
@@ -1837,12 +1882,13 @@ async function buildRuntime(input) {
1837
1882
  }
1838
1883
  function sessionConfigOptions(prepared) {
1839
1884
  const options = [];
1840
- // Claude and Codex runtime config is pre-set via startup env vars; skip
1885
+ // Claude, Codex and Gemini runtime config is pre-set via startup env vars; skip
1841
1886
  // set_config_option to avoid ACP-server picker validation rejecting valid
1842
1887
  // backend model IDs that are not advertised by the local ACP server.
1843
1888
  if (prepared.requestedModel &&
1844
1889
  prepared.acpxAgent !== "claude" &&
1845
- prepared.acpxAgent !== "codex") {
1890
+ prepared.acpxAgent !== "codex" &&
1891
+ prepared.acpxAgent !== "gemini") {
1846
1892
  options.push({ key: "model", value: prepared.requestedModel });
1847
1893
  }
1848
1894
  if (prepared.requestedThinkingEffort && prepared.acpxAgent !== "codex") {
@@ -2907,6 +2953,7 @@ export function createAcpxEngineExecutor(deps = {}) {
2907
2953
  provider: billingIdentity?.provider ?? "acpx",
2908
2954
  ...(billingIdentity?.biller ? { biller: billingIdentity.biller } : {}),
2909
2955
  billingType: billingIdentity?.billingType ?? "unknown",
2956
+ pricingContext: undefined,
2910
2957
  };
2911
2958
  const warmIdleMs = asNumber(ctx.config.warmHandleIdleMs, DEFAULT_ACP_ENGINE_WARM_HANDLE_IDLE_MS);
2912
2959
  // The host run site owns the warm-handle store on this run. It operates over
@@ -3197,6 +3244,7 @@ export function createAcpxEngineExecutor(deps = {}) {
3197
3244
  stageRuntimeSpan: runStageSpan,
3198
3245
  }));
3199
3246
  buildRuntimeSettled = true;
3247
+ billingFields.pricingContext = prepared.fastMode ? { serviceTier: "fast" } : undefined;
3200
3248
  // Capture acquired resources before the cancellation boundary so the
3201
3249
  // normal settlement path also releases a just-completed build.
3202
3250
  releaseStagingLease = prepared.sessionStagingLeaseRelease;
@@ -3684,14 +3732,19 @@ export function createAcpxEngineExecutor(deps = {}) {
3684
3732
  };
3685
3733
  let eventBreakdown = null;
3686
3734
  let eventCostUsd = null;
3735
+ // Receipt persistence is fallible; retain the provider evidence before
3736
+ // calling the sink so the failure result can still return it to the host.
3737
+ let observedUsage = { usageComplete: false };
3687
3738
  let lastRuntimeEventAt = null;
3688
3739
  let observedRuntimeEvents = 0;
3740
+ let turnDispatchAttempted = false;
3689
3741
  // The turn-local state the sequence steps share. `promptBuild` sets the
3690
3742
  // prompt, `preTurnUsage` sets the pre-turn status, `turnStart` sets the
3691
3743
  // active turn, and `turnFinalize` reads all three. `activeTurn` is the run-
3692
3744
  // scoped hoisted local, so the settlement `endSession` step can cancel it.
3693
3745
  let runPrompt = "";
3694
3746
  let preTurnStatus = null;
3747
+ let accountingModel = prepared.requestedModel || null;
3695
3748
  // Phase-timing markers for the prepare_turn and turn phases. The prepare
3696
3749
  // phase covers the prompt build and the pre-turn usage snapshot; the turn
3697
3750
  // phase covers the started turn and the event relay.
@@ -3740,7 +3793,9 @@ export function createAcpxEngineExecutor(deps = {}) {
3740
3793
  ? `Requested ACPX model: ${prepared.requestedModel} (set via ANTHROPIC_MODEL env at startup).`
3741
3794
  : prepared.acpxAgent === "codex"
3742
3795
  ? `Requested ACPX model: ${prepared.requestedModel} (set via CODEX_CONFIG at startup).`
3743
- : `Requested ACPX model: ${prepared.requestedModel}.`,
3796
+ : prepared.acpxAgent === "gemini"
3797
+ ? `Requested ACPX model: ${prepared.requestedModel} (set via GEMINI_MODEL at startup).`
3798
+ : `Requested ACPX model: ${prepared.requestedModel}.`,
3744
3799
  ]
3745
3800
  : []),
3746
3801
  ...(prepared.requestedThinkingEffort ? [`Requested ACPX thinking effort: ${prepared.requestedThinkingEffort}.`] : []),
@@ -3761,6 +3816,7 @@ export function createAcpxEngineExecutor(deps = {}) {
3761
3816
  // Snapshot pre-turn usage so cumulative agent-reported cost can be
3762
3817
  // attributed to this run alone.
3763
3818
  preTurnStatus = await readRuntimeStatus(runtime, sessionHandle);
3819
+ accountingModel = acpxAccountingModel(prepared.requestedModel, preTurnStatus, null);
3764
3820
  // The prepare phase (prompt build + usage snapshot) finished; the turn
3765
3821
  // phase starts next.
3766
3822
  await emitPhase("prepare_turn", preparePhaseStart, "ok");
@@ -3768,6 +3824,9 @@ export function createAcpxEngineExecutor(deps = {}) {
3768
3824
  };
3769
3825
  const stepTurnStart = (signal, startTimeoutMs) => {
3770
3826
  ctx.signal?.throwIfAborted();
3827
+ // After entering startTurn, a thrown error cannot prove the provider
3828
+ // received no work. Only failures before this boundary are free to settle.
3829
+ turnDispatchAttempted = true;
3771
3830
  const turn = runtime.startTurn({
3772
3831
  handle: sessionHandle,
3773
3832
  text: runPrompt,
@@ -3888,6 +3947,10 @@ export function createAcpxEngineExecutor(deps = {}) {
3888
3947
  if (event.type === "status" && event.tag === "usage_update") {
3889
3948
  eventBreakdown = event.breakdown ?? eventBreakdown;
3890
3949
  eventCostUsd = usdCostAmount(event.cost) ?? eventCostUsd;
3950
+ const checkpoint = summarizeAcpxTurnUsage({ preStatus: preTurnStatus, postStatus: null, eventBreakdown, eventCostUsd });
3951
+ observedUsage = { usage: checkpoint.usage ?? undefined, costUsd: checkpoint.costUsd, usageBasis: "per_run", usageComplete: false };
3952
+ await ctx.onUsage?.({ ...billingFields, usage: checkpoint.usage ?? undefined, costUsd: checkpoint.costUsd,
3953
+ model: accountingModel, usageBasis: "per_run", complete: false });
3891
3954
  }
3892
3955
  await emitRuntimeEvent(ctx, event, toolTitles, prepared.coalescePlaceholderToolUpdates);
3893
3956
  }
@@ -3964,12 +4027,19 @@ export function createAcpxEngineExecutor(deps = {}) {
3964
4027
  const turnSucceeded = terminal.status === "completed" && !timedOut && !channelLost;
3965
4028
  // Read usage before the settlement can discard runtime state.
3966
4029
  const postTurnStatus = await readRuntimeStatus(runtime, sessionHandle);
4030
+ accountingModel = acpxAccountingModel(prepared.requestedModel, preTurnStatus, postTurnStatus);
3967
4031
  const turnUsage = summarizeAcpxTurnUsage({
3968
4032
  preStatus: preTurnStatus,
3969
4033
  postStatus: postTurnStatus,
3970
4034
  eventBreakdown,
3971
4035
  eventCostUsd,
3972
4036
  });
4037
+ // An interrupted stream is provisional unless the runtime supplies its
4038
+ // post-terminal receipt. An in-stream usage_update alone cannot close it.
4039
+ const usageComplete = !channelLost && (turnSucceeded || postTurnStatus?.usage != null);
4040
+ observedUsage = { usage: turnUsage.usage ?? undefined, costUsd: turnUsage.costUsd, usageBasis: "per_run", usageComplete };
4041
+ await ctx.onUsage?.({ ...billingFields, usage: turnUsage.usage ?? undefined, costUsd: turnUsage.costUsd,
4042
+ model: accountingModel, usageBasis: "per_run", complete: usageComplete });
3973
4043
  const failedTurn = terminal.status === "failed" || terminal.status === "cancelled" || timedOut;
3974
4044
  // ACPX can defer session/load until runTurn. Forget an unavailable
3975
4045
  // session so the next bounded turn receives the full task conversation.
@@ -4052,9 +4122,10 @@ export function createAcpxEngineExecutor(deps = {}) {
4052
4122
  sessionDisplayId: sessionHandle.agentSessionId ?? sessionHandle.backendSessionId ?? sessionHandle.runtimeSessionName,
4053
4123
  ...billingFields,
4054
4124
  ...referencedProjectStagingFailuresField,
4055
- model: prepared.requestedModel || null,
4125
+ model: accountingModel,
4056
4126
  ...(turnUsage.usage ? { usage: turnUsage.usage, usageBasis: "per_run" } : {}),
4057
4127
  costUsd: turnUsage.costUsd,
4128
+ usageComplete,
4058
4129
  resultJson: {
4059
4130
  status: channelLost ? "failed" : terminal.status,
4060
4131
  ...activityDiagnostics,
@@ -4185,9 +4256,11 @@ export function createAcpxEngineExecutor(deps = {}) {
4185
4256
  errorMessage: message,
4186
4257
  errorCode: timedOut ? "acpx_timeout" : (emitted?.classified.errorCode ?? null),
4187
4258
  errorMeta: emitted?.classified.errorMeta,
4259
+ ...observedUsage,
4260
+ ...(!turnDispatchAttempted ? { executionRecovery: { kind: "bootstrap", providerWorkStarted: false } } : {}),
4188
4261
  ...billingFields,
4189
4262
  ...referencedProjectStagingFailuresField,
4190
- model: prepared.requestedModel || null,
4263
+ model: accountingModel,
4191
4264
  clearSession: clearSession || timedOut,
4192
4265
  resultJson: { phase, ...activityDiagnostics },
4193
4266
  summary: message,