@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.
- package/dist/acpx-engine/accounting-model.d.ts +5 -0
- package/dist/acpx-engine/accounting-model.d.ts.map +1 -0
- package/dist/acpx-engine/accounting-model.js +10 -0
- package/dist/acpx-engine/accounting-model.js.map +1 -0
- package/dist/acpx-engine/accounting-model.test.d.ts +2 -0
- package/dist/acpx-engine/accounting-model.test.d.ts.map +1 -0
- package/dist/acpx-engine/accounting-model.test.js +18 -0
- package/dist/acpx-engine/accounting-model.test.js.map +1 -0
- package/dist/acpx-engine/execute.d.ts.map +1 -1
- package/dist/acpx-engine/execute.js +83 -10
- package/dist/acpx-engine/execute.js.map +1 -1
- package/dist/acpx-engine/execute.test.js +192 -15
- package/dist/acpx-engine/execute.test.js.map +1 -1
- package/dist/acpx-engine/filesystem-protocol.test.d.ts +2 -0
- package/dist/acpx-engine/filesystem-protocol.test.d.ts.map +1 -0
- package/dist/acpx-engine/filesystem-protocol.test.js +99 -0
- package/dist/acpx-engine/filesystem-protocol.test.js.map +1 -0
- package/dist/acpx-engine/run-contracts.d.ts +1 -0
- package/dist/acpx-engine/run-contracts.d.ts.map +1 -1
- package/dist/api-billing-type.d.ts +5 -0
- package/dist/api-billing-type.d.ts.map +1 -0
- package/dist/api-billing-type.js +16 -0
- package/dist/api-billing-type.js.map +1 -0
- package/dist/api-billing-type.test.d.ts +2 -0
- package/dist/api-billing-type.test.d.ts.map +1 -0
- package/dist/api-billing-type.test.js +20 -0
- package/dist/api-billing-type.test.js.map +1 -0
- package/dist/billing.d.ts +7 -0
- package/dist/billing.d.ts.map +1 -1
- package/dist/billing.js +25 -2
- package/dist/billing.js.map +1 -1
- package/dist/billing.test.js +17 -1
- package/dist/billing.test.js.map +1 -1
- package/dist/chat-file-delivery.d.ts +1 -1
- package/dist/chat-file-delivery.d.ts.map +1 -1
- package/dist/chat-file-delivery.js +4 -3
- package/dist/chat-file-delivery.js.map +1 -1
- package/dist/chat-file-delivery.test.js +2 -2
- package/dist/chat-file-delivery.test.js.map +1 -1
- package/dist/command-managed-runtime.d.ts +6 -0
- package/dist/command-managed-runtime.d.ts.map +1 -1
- package/dist/command-managed-runtime.js +5 -1
- package/dist/command-managed-runtime.js.map +1 -1
- package/dist/connection-failure.d.ts +33 -0
- package/dist/connection-failure.d.ts.map +1 -0
- package/dist/connection-failure.js +43 -0
- package/dist/connection-failure.js.map +1 -0
- package/dist/connection-failure.test.d.ts +2 -0
- package/dist/connection-failure.test.d.ts.map +1 -0
- package/dist/connection-failure.test.js +94 -0
- package/dist/connection-failure.test.js.map +1 -0
- package/dist/directory-merge-lock.test.js +4 -2
- package/dist/directory-merge-lock.test.js.map +1 -1
- package/dist/execution-target-sandbox.test.js +228 -0
- package/dist/execution-target-sandbox.test.js.map +1 -1
- package/dist/execution-target.d.ts +12 -0
- package/dist/execution-target.d.ts.map +1 -1
- package/dist/execution-target.js +49 -13
- package/dist/execution-target.js.map +1 -1
- package/dist/execution-target.test.js +35 -1
- package/dist/execution-target.test.js.map +1 -1
- package/dist/github-launcher-environment.test.js +37 -0
- package/dist/github-launcher-environment.test.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/paperclip-runner-permissions.d.ts +15 -4
- package/dist/paperclip-runner-permissions.d.ts.map +1 -1
- package/dist/paperclip-runner-permissions.js +29 -3
- package/dist/paperclip-runner-permissions.js.map +1 -1
- package/dist/paperclip-runner-permissions.test.js +34 -1
- package/dist/paperclip-runner-permissions.test.js.map +1 -1
- package/dist/sandbox-callback-bridge.d.ts.map +1 -1
- package/dist/sandbox-callback-bridge.js +1 -0
- package/dist/sandbox-callback-bridge.js.map +1 -1
- package/dist/sandbox-callback-bridge.test.js +113 -16
- package/dist/sandbox-callback-bridge.test.js.map +1 -1
- package/dist/sandbox-managed-runtime.d.ts +5 -0
- package/dist/sandbox-managed-runtime.d.ts.map +1 -1
- package/dist/sandbox-managed-runtime.js +51 -13
- package/dist/sandbox-managed-runtime.js.map +1 -1
- package/dist/sandbox-managed-runtime.test.js +119 -2
- package/dist/sandbox-managed-runtime.test.js.map +1 -1
- package/dist/server-utils.d.ts +6 -3
- package/dist/server-utils.d.ts.map +1 -1
- package/dist/server-utils.js +38 -8
- package/dist/server-utils.js.map +1 -1
- package/dist/server-utils.test.js +35 -1
- package/dist/server-utils.test.js.map +1 -1
- package/dist/types.d.ts +76 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/usage-checkpoint.d.ts +11 -0
- package/dist/usage-checkpoint.d.ts.map +1 -0
- package/dist/usage-checkpoint.js +165 -0
- package/dist/usage-checkpoint.js.map +1 -0
- package/dist/usage-checkpoint.test.d.ts +2 -0
- package/dist/usage-checkpoint.test.d.ts.map +1 -0
- package/dist/usage-checkpoint.test.js +131 -0
- package/dist/usage-checkpoint.test.js.map +1 -0
- package/dist/workspace-restore-diagnostics.d.ts +8 -1
- package/dist/workspace-restore-diagnostics.d.ts.map +1 -1
- package/dist/workspace-restore-diagnostics.js +35 -8
- package/dist/workspace-restore-diagnostics.js.map +1 -1
- package/dist/workspace-restore-diagnostics.test.js +31 -1
- package/dist/workspace-restore-diagnostics.test.js.map +1 -1
- package/node_modules/acpx/dist/live-checkpoint-ClPCSdrW.js +3 -0
- package/package.json +31 -3
- package/node_modules/@esbuild/linux-x64/README.md +0 -3
- package/node_modules/@esbuild/linux-x64/bin/esbuild +0 -0
- 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 @@
|
|
|
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":"AAWA,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,EAIL,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;AAuC1G,OAAO,EAML,KAAK,UAAU,EAGf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAGrB,KAAK,wBAAwB,EAE9B,MAAM,cAAc,CAAC;AAYtB,OAAO,KAAK,EAGV,iBAAiB,EACjB,6BAA6B,EAE7B,0BAA0B,EAC1B,kBAAkB,EAKnB,MAAM,oBAAoB,CAAC;
|
|
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
|
-
//
|
|
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
|
-
:
|
|
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
|
|
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
|
-
:
|
|
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:
|
|
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:
|
|
4263
|
+
model: accountingModel,
|
|
4191
4264
|
clearSession: clearSession || timedOut,
|
|
4192
4265
|
resultJson: { phase, ...activityDiagnostics },
|
|
4193
4266
|
summary: message,
|