@tickernelz/paperclip-pro-adapter-codex-local 2026.925.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/LICENSE +22 -0
- package/dist/cli/format-event.d.ts +2 -0
- package/dist/cli/format-event.d.ts.map +1 -0
- package/dist/cli/format-event.js +218 -0
- package/dist/cli/format-event.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/quota-probe.d.ts +3 -0
- package/dist/cli/quota-probe.d.ts.map +1 -0
- package/dist/cli/quota-probe.js +104 -0
- package/dist/cli/quota-probe.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +155 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +58 -0
- package/dist/index.test.js.map +1 -0
- package/dist/server/acp.d.ts +30 -0
- package/dist/server/acp.d.ts.map +1 -0
- package/dist/server/acp.js +532 -0
- package/dist/server/acp.js.map +1 -0
- package/dist/server/acp.test.d.ts +2 -0
- package/dist/server/acp.test.d.ts.map +1 -0
- package/dist/server/acp.test.js +1087 -0
- package/dist/server/acp.test.js.map +1 -0
- package/dist/server/adapter-auth-promotion.d.ts +102 -0
- package/dist/server/adapter-auth-promotion.d.ts.map +1 -0
- package/dist/server/adapter-auth-promotion.js +210 -0
- package/dist/server/adapter-auth-promotion.js.map +1 -0
- package/dist/server/adapter-auth-promotion.test.d.ts +2 -0
- package/dist/server/adapter-auth-promotion.test.d.ts.map +1 -0
- package/dist/server/adapter-auth-promotion.test.js +658 -0
- package/dist/server/adapter-auth-promotion.test.js.map +1 -0
- package/dist/server/auth-check.d.ts +8 -0
- package/dist/server/auth-check.d.ts.map +1 -0
- package/dist/server/auth-check.js +8 -0
- package/dist/server/auth-check.js.map +1 -0
- package/dist/server/auth-precedence.d.ts +16 -0
- package/dist/server/auth-precedence.d.ts.map +1 -0
- package/dist/server/auth-precedence.js +20 -0
- package/dist/server/auth-precedence.js.map +1 -0
- package/dist/server/auth-precedence.test.d.ts +2 -0
- package/dist/server/auth-precedence.test.d.ts.map +1 -0
- package/dist/server/auth-precedence.test.js +100 -0
- package/dist/server/auth-precedence.test.js.map +1 -0
- package/dist/server/codex-args.d.ts +13 -0
- package/dist/server/codex-args.d.ts.map +1 -0
- package/dist/server/codex-args.js +76 -0
- package/dist/server/codex-args.js.map +1 -0
- package/dist/server/codex-args.test.d.ts +2 -0
- package/dist/server/codex-args.test.d.ts.map +1 -0
- package/dist/server/codex-args.test.js +243 -0
- package/dist/server/codex-args.test.js.map +1 -0
- package/dist/server/codex-auth-cache.d.ts +206 -0
- package/dist/server/codex-auth-cache.d.ts.map +1 -0
- package/dist/server/codex-auth-cache.js +501 -0
- package/dist/server/codex-auth-cache.js.map +1 -0
- package/dist/server/codex-auth-cache.test.d.ts +2 -0
- package/dist/server/codex-auth-cache.test.d.ts.map +1 -0
- package/dist/server/codex-auth-cache.test.js +497 -0
- package/dist/server/codex-auth-cache.test.js.map +1 -0
- package/dist/server/codex-auth-copyback.d.ts +53 -0
- package/dist/server/codex-auth-copyback.d.ts.map +1 -0
- package/dist/server/codex-auth-copyback.js +123 -0
- package/dist/server/codex-auth-copyback.js.map +1 -0
- package/dist/server/codex-auth-copyback.test.d.ts +2 -0
- package/dist/server/codex-auth-copyback.test.d.ts.map +1 -0
- package/dist/server/codex-auth-copyback.test.js +507 -0
- package/dist/server/codex-auth-copyback.test.js.map +1 -0
- package/dist/server/codex-auth-merge-decision.cjs +170 -0
- package/dist/server/codex-auth-merge-decision.d.ts +22 -0
- package/dist/server/codex-auth-merge-decision.d.ts.map +1 -0
- package/dist/server/codex-auth-merge-decision.js +58 -0
- package/dist/server/codex-auth-merge-decision.js.map +1 -0
- package/dist/server/codex-auth-merge-decision.test.d.ts +2 -0
- package/dist/server/codex-auth-merge-decision.test.d.ts.map +1 -0
- package/dist/server/codex-auth-merge-decision.test.js +230 -0
- package/dist/server/codex-auth-merge-decision.test.js.map +1 -0
- package/dist/server/codex-auth-merge-extract.sh +73 -0
- package/dist/server/codex-auth-merge-scripts.d.ts +21 -0
- package/dist/server/codex-auth-merge-scripts.d.ts.map +1 -0
- package/dist/server/codex-auth-merge-scripts.js +40 -0
- package/dist/server/codex-auth-merge-scripts.js.map +1 -0
- package/dist/server/codex-auth-merge.test.d.ts +2 -0
- package/dist/server/codex-auth-merge.test.d.ts.map +1 -0
- package/dist/server/codex-auth-merge.test.js +714 -0
- package/dist/server/codex-auth-merge.test.js.map +1 -0
- package/dist/server/codex-auth-seed-write.d.ts +30 -0
- package/dist/server/codex-auth-seed-write.d.ts.map +1 -0
- package/dist/server/codex-auth-seed-write.js +41 -0
- package/dist/server/codex-auth-seed-write.js.map +1 -0
- package/dist/server/codex-home.d.ts +162 -0
- package/dist/server/codex-home.d.ts.map +1 -0
- package/dist/server/codex-home.js +771 -0
- package/dist/server/codex-home.js.map +1 -0
- package/dist/server/codex-home.test.d.ts +2 -0
- package/dist/server/codex-home.test.d.ts.map +1 -0
- package/dist/server/codex-home.test.js +1183 -0
- package/dist/server/codex-home.test.js.map +1 -0
- package/dist/server/config-schema.d.ts +3 -0
- package/dist/server/config-schema.d.ts.map +1 -0
- package/dist/server/config-schema.js +67 -0
- package/dist/server/config-schema.js.map +1 -0
- package/dist/server/device-login-export.d.ts +56 -0
- package/dist/server/device-login-export.d.ts.map +1 -0
- package/dist/server/device-login-export.js +230 -0
- package/dist/server/device-login-export.js.map +1 -0
- package/dist/server/device-login-export.test.d.ts +2 -0
- package/dist/server/device-login-export.test.d.ts.map +1 -0
- package/dist/server/device-login-export.test.js +245 -0
- package/dist/server/device-login-export.test.js.map +1 -0
- package/dist/server/device-login-parse.d.ts +20 -0
- package/dist/server/device-login-parse.d.ts.map +1 -0
- package/dist/server/device-login-parse.js +155 -0
- package/dist/server/device-login-parse.js.map +1 -0
- package/dist/server/device-login-parse.test.d.ts +2 -0
- package/dist/server/device-login-parse.test.d.ts.map +1 -0
- package/dist/server/device-login-parse.test.js +269 -0
- package/dist/server/device-login-parse.test.js.map +1 -0
- package/dist/server/device-login-runner.d.ts +69 -0
- package/dist/server/device-login-runner.d.ts.map +1 -0
- package/dist/server/device-login-runner.js +109 -0
- package/dist/server/device-login-runner.js.map +1 -0
- package/dist/server/device-login-runner.test.d.ts +2 -0
- package/dist/server/device-login-runner.test.d.ts.map +1 -0
- package/dist/server/device-login-runner.test.js +201 -0
- package/dist/server/device-login-runner.test.js.map +1 -0
- package/dist/server/engine-availability.test.d.ts +2 -0
- package/dist/server/engine-availability.test.d.ts.map +1 -0
- package/dist/server/engine-availability.test.js +41 -0
- package/dist/server/engine-availability.test.js.map +1 -0
- package/dist/server/execute.acp-fallback.test.d.ts +2 -0
- package/dist/server/execute.acp-fallback.test.d.ts.map +1 -0
- package/dist/server/execute.acp-fallback.test.js +123 -0
- package/dist/server/execute.acp-fallback.test.js.map +1 -0
- package/dist/server/execute.auth-precedence.test.d.ts +2 -0
- package/dist/server/execute.auth-precedence.test.d.ts.map +1 -0
- package/dist/server/execute.auth-precedence.test.js +137 -0
- package/dist/server/execute.auth-precedence.test.js.map +1 -0
- package/dist/server/execute.auth.test.d.ts +2 -0
- package/dist/server/execute.auth.test.d.ts.map +1 -0
- package/dist/server/execute.auth.test.js +197 -0
- package/dist/server/execute.auth.test.js.map +1 -0
- package/dist/server/execute.d.ts +40 -0
- package/dist/server/execute.d.ts.map +1 -0
- package/dist/server/execute.js +1290 -0
- package/dist/server/execute.js.map +1 -0
- package/dist/server/execute.remote.test.d.ts +2 -0
- package/dist/server/execute.remote.test.d.ts.map +1 -0
- package/dist/server/execute.remote.test.js +556 -0
- package/dist/server/execute.remote.test.js.map +1 -0
- package/dist/server/execute.stderr-error.test.d.ts +2 -0
- package/dist/server/execute.stderr-error.test.d.ts.map +1 -0
- package/dist/server/execute.stderr-error.test.js +142 -0
- package/dist/server/execute.stderr-error.test.js.map +1 -0
- package/dist/server/execute.test.d.ts +2 -0
- package/dist/server/execute.test.d.ts.map +1 -0
- package/dist/server/execute.test.js +240 -0
- package/dist/server/execute.test.js.map +1 -0
- package/dist/server/index.d.ts +18 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +71 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/output-inactivity-monitor.d.ts +62 -0
- package/dist/server/output-inactivity-monitor.d.ts.map +1 -0
- package/dist/server/output-inactivity-monitor.integration.test.d.ts +2 -0
- package/dist/server/output-inactivity-monitor.integration.test.d.ts.map +1 -0
- package/dist/server/output-inactivity-monitor.integration.test.js +136 -0
- package/dist/server/output-inactivity-monitor.integration.test.js.map +1 -0
- package/dist/server/output-inactivity-monitor.js +112 -0
- package/dist/server/output-inactivity-monitor.js.map +1 -0
- package/dist/server/output-inactivity-monitor.test.d.ts +2 -0
- package/dist/server/output-inactivity-monitor.test.d.ts.map +1 -0
- package/dist/server/output-inactivity-monitor.test.js +284 -0
- package/dist/server/output-inactivity-monitor.test.js.map +1 -0
- package/dist/server/parse.d.ts +51 -0
- package/dist/server/parse.d.ts.map +1 -0
- package/dist/server/parse.js +261 -0
- package/dist/server/parse.js.map +1 -0
- package/dist/server/parse.test.d.ts +2 -0
- package/dist/server/parse.test.d.ts.map +1 -0
- package/dist/server/parse.test.js +186 -0
- package/dist/server/parse.test.js.map +1 -0
- package/dist/server/process-activity-monitor.d.ts +21 -0
- package/dist/server/process-activity-monitor.d.ts.map +1 -0
- package/dist/server/process-activity-monitor.js +103 -0
- package/dist/server/process-activity-monitor.js.map +1 -0
- package/dist/server/process-activity-monitor.test.d.ts +2 -0
- package/dist/server/process-activity-monitor.test.d.ts.map +1 -0
- package/dist/server/process-activity-monitor.test.js +82 -0
- package/dist/server/process-activity-monitor.test.js.map +1 -0
- package/dist/server/quota-spawn-error.test.d.ts +2 -0
- package/dist/server/quota-spawn-error.test.d.ts.map +1 -0
- package/dist/server/quota-spawn-error.test.js +174 -0
- package/dist/server/quota-spawn-error.test.js.map +1 -0
- package/dist/server/quota.d.ts +66 -0
- package/dist/server/quota.d.ts.map +1 -0
- package/dist/server/quota.js +511 -0
- package/dist/server/quota.js.map +1 -0
- package/dist/server/runtime-config.d.ts +11 -0
- package/dist/server/runtime-config.d.ts.map +1 -0
- package/dist/server/runtime-config.js +380 -0
- package/dist/server/runtime-config.js.map +1 -0
- package/dist/server/runtime-config.test.d.ts +2 -0
- package/dist/server/runtime-config.test.d.ts.map +1 -0
- package/dist/server/runtime-config.test.js +367 -0
- package/dist/server/runtime-config.test.js.map +1 -0
- package/dist/server/skills.d.ts +8 -0
- package/dist/server/skills.d.ts.map +1 -0
- package/dist/server/skills.js +26 -0
- package/dist/server/skills.js.map +1 -0
- package/dist/server/test.d.ts +3 -0
- package/dist/server/test.d.ts.map +1 -0
- package/dist/server/test.js +458 -0
- package/dist/server/test.js.map +1 -0
- package/dist/server/test.remote.test.d.ts +2 -0
- package/dist/server/test.remote.test.d.ts.map +1 -0
- package/dist/server/test.remote.test.js +396 -0
- package/dist/server/test.remote.test.js.map +1 -0
- package/dist/ui/build-config.d.ts +5 -0
- package/dist/ui/build-config.d.ts.map +1 -0
- package/dist/ui/build-config.js +229 -0
- package/dist/ui/build-config.js.map +1 -0
- package/dist/ui/build-config.test.d.ts +2 -0
- package/dist/ui/build-config.test.d.ts.map +1 -0
- package/dist/ui/build-config.test.js +272 -0
- package/dist/ui/build-config.test.js.map +1 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +8 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/parse-stdout.d.ts +3 -0
- package/dist/ui/parse-stdout.d.ts.map +1 -0
- package/dist/ui/parse-stdout.js +265 -0
- package/dist/ui/parse-stdout.js.map +1 -0
- package/dist/ui/parse-stdout.test.d.ts +2 -0
- package/dist/ui/parse-stdout.test.d.ts.map +1 -0
- package/dist/ui/parse-stdout.test.js +77 -0
- package/dist/ui/parse-stdout.test.js.map +1 -0
- package/package.json +61 -0
- package/skills/agentmail/SKILL.md +70 -0
- package/skills/paperclip/SKILL.md +712 -0
- package/skills/paperclip/references/api-reference.md +1675 -0
- package/skills/paperclip/references/artifacts.md +158 -0
- package/skills/paperclip/references/cases.md +295 -0
- package/skills/paperclip/references/company-skills.md +266 -0
- package/skills/paperclip/references/issue-workspaces.md +80 -0
- package/skills/paperclip/references/routines.md +231 -0
- package/skills/paperclip/references/workflows.md +141 -0
- package/skills/paperclip/scripts/paperclip-upload-artifact.sh +592 -0
- package/skills/paperclip-board/SKILL.md +619 -0
- package/skills/paperclip-converting-plans-to-tasks/SKILL.md +60 -0
- package/skills/paperclip-create-agent/SKILL.md +179 -0
- package/skills/paperclip-create-agent/references/agent-instruction-templates.md +123 -0
- package/skills/paperclip-create-agent/references/agents/coder.md +64 -0
- package/skills/paperclip-create-agent/references/agents/qa.md +88 -0
- package/skills/paperclip-create-agent/references/agents/securityengineer.md +135 -0
- package/skills/paperclip-create-agent/references/agents/uxdesigner.md +115 -0
- package/skills/paperclip-create-agent/references/api-reference.md +110 -0
- package/skills/paperclip-create-agent/references/baseline-role-guide.md +168 -0
- package/skills/paperclip-create-agent/references/draft-review-checklist.md +95 -0
- package/skills/para-memory-files/SKILL.md +100 -0
- package/skills/para-memory-files/references/schemas.md +35 -0
- package/skills/slack/SKILL.md +65 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
const { ensureAdapterExecutionTargetDirectory, ensureAdapterExecutionTargetCommandResolvable, maybeRunSandboxInstallCommand, runAdapterExecutionTargetProcess, describeAdapterExecutionTarget, resolveAdapterExecutionTargetCwd, prepareAdapterExecutionTargetRuntime, prepareManagedCodexHome, restoreWorkspace, capturedHomeAssetFiles, capturedHomeAssetAuthJson, } = vi.hoisted(() => {
|
|
6
|
+
const restoreWorkspace = vi.fn(async () => { });
|
|
7
|
+
// Records the files staged in the uploaded "home" asset at call time, before
|
|
8
|
+
// the probe's cleanup deletes the temp dir. Lets tests assert the upload is a
|
|
9
|
+
// minimal credentials-only home and not the full managed CODEX_HOME.
|
|
10
|
+
const capturedHomeAssetFiles = { value: null };
|
|
11
|
+
// Records the staged auth.json content, so tests can assert WHICH home's
|
|
12
|
+
// credential the probe uploaded (the effective home a run would use).
|
|
13
|
+
const capturedHomeAssetAuthJson = { value: null };
|
|
14
|
+
return {
|
|
15
|
+
capturedHomeAssetFiles,
|
|
16
|
+
capturedHomeAssetAuthJson,
|
|
17
|
+
ensureAdapterExecutionTargetDirectory: vi.fn(async () => { }),
|
|
18
|
+
ensureAdapterExecutionTargetCommandResolvable: vi.fn(async () => { }),
|
|
19
|
+
maybeRunSandboxInstallCommand: vi.fn(async () => null),
|
|
20
|
+
runAdapterExecutionTargetProcess: vi.fn(async () => ({
|
|
21
|
+
exitCode: 0,
|
|
22
|
+
signal: null,
|
|
23
|
+
timedOut: false,
|
|
24
|
+
stdout: [
|
|
25
|
+
"{\"type\":\"thread.started\",\"thread_id\":\"thread-1\"}",
|
|
26
|
+
"{\"type\":\"item.completed\",\"item\":{\"type\":\"agent_message\",\"text\":\"hello\"}}",
|
|
27
|
+
"{\"type\":\"turn.completed\",\"usage\":{\"input_tokens\":1,\"cached_input_tokens\":0,\"output_tokens\":1}}",
|
|
28
|
+
].join("\n"),
|
|
29
|
+
stderr: "",
|
|
30
|
+
pid: 123,
|
|
31
|
+
startedAt: new Date().toISOString(),
|
|
32
|
+
})),
|
|
33
|
+
describeAdapterExecutionTarget: vi.fn(() => "QA SSH"),
|
|
34
|
+
resolveAdapterExecutionTargetCwd: vi.fn((target, configuredCwd, fallbackCwd) => {
|
|
35
|
+
if (typeof configuredCwd === "string" && configuredCwd.trim().length > 0)
|
|
36
|
+
return configuredCwd;
|
|
37
|
+
if (target && typeof target === "object" && "remoteCwd" in target && typeof target.remoteCwd === "string") {
|
|
38
|
+
return target.remoteCwd;
|
|
39
|
+
}
|
|
40
|
+
return fallbackCwd;
|
|
41
|
+
}),
|
|
42
|
+
prepareAdapterExecutionTargetRuntime: vi.fn(async (input) => {
|
|
43
|
+
const homeAsset = input?.assets?.find((asset) => asset.key === "home");
|
|
44
|
+
if (homeAsset) {
|
|
45
|
+
capturedHomeAssetFiles.value = (await fs.readdir(homeAsset.localDir)).sort();
|
|
46
|
+
capturedHomeAssetAuthJson.value = await fs
|
|
47
|
+
.readFile(`${homeAsset.localDir}/auth.json`, "utf8")
|
|
48
|
+
.catch(() => null);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
target: null,
|
|
52
|
+
workspaceRemoteDir: "/remote/workspace/.paperclip-runtime/runs/test/workspace",
|
|
53
|
+
runtimeRootDir: "/remote/workspace/.paperclip-runtime/runs/test/workspace/.paperclip-runtime/codex",
|
|
54
|
+
assetDirs: {
|
|
55
|
+
home: "/remote/workspace/.paperclip-runtime/runs/test/workspace/.paperclip-runtime/codex/home",
|
|
56
|
+
},
|
|
57
|
+
restoreWorkspace,
|
|
58
|
+
};
|
|
59
|
+
}),
|
|
60
|
+
prepareManagedCodexHome: vi.fn(async () => {
|
|
61
|
+
// Return a real managed home seeded with credentials so the probe's
|
|
62
|
+
// minimal-home copy step (auth.json/config.toml) has something to read.
|
|
63
|
+
const dir = await fs.mkdtemp(`${os.tmpdir()}/paperclip-managed-codex-home-`);
|
|
64
|
+
await fs.writeFile(`${dir}/auth.json`, JSON.stringify({ OPENAI_API_KEY: "sk-managed" }));
|
|
65
|
+
await fs.writeFile(`${dir}/config.toml`, "model = \"gpt-5\"\n");
|
|
66
|
+
return dir;
|
|
67
|
+
}),
|
|
68
|
+
restoreWorkspace,
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
vi.mock("@tickernelz/paperclip-pro-adapter-utils/execution-target", async () => {
|
|
72
|
+
const actual = await vi.importActual("@tickernelz/paperclip-pro-adapter-utils/execution-target");
|
|
73
|
+
return {
|
|
74
|
+
...actual,
|
|
75
|
+
ensureAdapterExecutionTargetDirectory,
|
|
76
|
+
ensureAdapterExecutionTargetCommandResolvable,
|
|
77
|
+
maybeRunSandboxInstallCommand,
|
|
78
|
+
runAdapterExecutionTargetProcess,
|
|
79
|
+
describeAdapterExecutionTarget,
|
|
80
|
+
resolveAdapterExecutionTargetCwd,
|
|
81
|
+
prepareAdapterExecutionTargetRuntime,
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
vi.mock("./codex-home.js", async () => {
|
|
85
|
+
const actual = await vi.importActual("./codex-home.js");
|
|
86
|
+
return {
|
|
87
|
+
...actual,
|
|
88
|
+
prepareManagedCodexHome,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
import { testEnvironment } from "./test.js";
|
|
92
|
+
describe("codex remote environment diagnostics", () => {
|
|
93
|
+
const scratchDirs = [];
|
|
94
|
+
async function makeScratchDir(prefix) {
|
|
95
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
96
|
+
scratchDirs.push(dir);
|
|
97
|
+
return dir;
|
|
98
|
+
}
|
|
99
|
+
beforeEach(async () => {
|
|
100
|
+
// The probe mirrors execute's home preparation, which reads the shared
|
|
101
|
+
// source home and the auth cache from `process.env`. Pin both to empty
|
|
102
|
+
// scratch locations so no test ever reads or writes the real ~/.codex or
|
|
103
|
+
// the real instance tree.
|
|
104
|
+
vi.stubEnv("CODEX_HOME", await makeScratchDir("paperclip-test-shared-codex-"));
|
|
105
|
+
vi.stubEnv("PAPERCLIP_HOME", await makeScratchDir("paperclip-test-instance-"));
|
|
106
|
+
vi.stubEnv("PAPERCLIP_INSTANCE_ID", "default");
|
|
107
|
+
});
|
|
108
|
+
afterEach(async () => {
|
|
109
|
+
vi.clearAllMocks();
|
|
110
|
+
vi.unstubAllEnvs();
|
|
111
|
+
delete process.env.OPENAI_API_KEY;
|
|
112
|
+
capturedHomeAssetFiles.value = null;
|
|
113
|
+
capturedHomeAssetAuthJson.value = null;
|
|
114
|
+
while (scratchDirs.length > 0) {
|
|
115
|
+
const dir = scratchDirs.pop();
|
|
116
|
+
if (dir)
|
|
117
|
+
await fs.rm(dir, { recursive: true, force: true }).catch(() => undefined);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
it("stages managed CODEX_HOME in an isolated runtime dir and keeps the probe cwd on the original remote workspace", async () => {
|
|
121
|
+
const remoteTarget = {
|
|
122
|
+
kind: "remote",
|
|
123
|
+
transport: "ssh",
|
|
124
|
+
remoteCwd: "/remote/workspace",
|
|
125
|
+
spec: {
|
|
126
|
+
host: "127.0.0.1",
|
|
127
|
+
port: 22,
|
|
128
|
+
username: "agent",
|
|
129
|
+
privateKey: "PRIVATE KEY",
|
|
130
|
+
knownHosts: "KNOWN HOSTS",
|
|
131
|
+
remoteCwd: "/remote/workspace",
|
|
132
|
+
remoteWorkspacePath: "/remote/workspace",
|
|
133
|
+
strictHostKeyChecking: false,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
const result = await testEnvironment({
|
|
137
|
+
companyId: "company-1",
|
|
138
|
+
adapterType: "codex_local",
|
|
139
|
+
config: {
|
|
140
|
+
engine: "cli",
|
|
141
|
+
command: "codex",
|
|
142
|
+
},
|
|
143
|
+
executionTarget: remoteTarget,
|
|
144
|
+
environmentName: "QA SSH",
|
|
145
|
+
});
|
|
146
|
+
expect(result.status).toBe("pass");
|
|
147
|
+
expect(result.checks.some((check) => check.code === "codex_hello_probe_passed")).toBe(true);
|
|
148
|
+
expect(prepareManagedCodexHome).toHaveBeenCalledTimes(1);
|
|
149
|
+
expect(prepareAdapterExecutionTargetRuntime).toHaveBeenCalledTimes(1);
|
|
150
|
+
const runtimeCalls = prepareAdapterExecutionTargetRuntime.mock.calls;
|
|
151
|
+
const runtimeInput = runtimeCalls[0]?.[0];
|
|
152
|
+
// The probe must upload only a minimal credentials-only home, never the
|
|
153
|
+
// full managed CODEX_HOME (which can be hundreds of MB of session history).
|
|
154
|
+
const homeAsset = runtimeInput?.assets?.find((asset) => asset.key === "home");
|
|
155
|
+
expect(homeAsset?.localDir).toContain(`${os.tmpdir()}/paperclip-codex-probe-home-`);
|
|
156
|
+
expect(capturedHomeAssetFiles.value).toEqual(["auth.json", "config.toml"]);
|
|
157
|
+
expect(runtimeInput?.workspaceLocalDir).toContain(`${os.tmpdir()}/paperclip-codex-envtest-`);
|
|
158
|
+
expect(runtimeInput?.workspaceLocalDir).not.toBe("/remote/workspace");
|
|
159
|
+
expect(await fs.stat(runtimeInput.workspaceLocalDir).catch(() => null)).toBeNull();
|
|
160
|
+
expect(runtimeInput?.target?.remoteCwd).toBe("/remote/workspace");
|
|
161
|
+
// `workspaceRemoteDir` is the base path passed to the runtime; the
|
|
162
|
+
// helper's per-run subdirectory is appended internally inside
|
|
163
|
+
// `prepareRemoteManagedRuntime`. Pre-building a per-run prefix here
|
|
164
|
+
// would double-nest the run id in the final path.
|
|
165
|
+
expect(runtimeInput?.workspaceRemoteDir).toBe("/remote/workspace");
|
|
166
|
+
expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1);
|
|
167
|
+
const probeCall = runAdapterExecutionTargetProcess.mock.calls[0];
|
|
168
|
+
expect(probeCall?.[1]).toMatchObject({
|
|
169
|
+
kind: "remote",
|
|
170
|
+
remoteCwd: "/remote/workspace",
|
|
171
|
+
});
|
|
172
|
+
expect(probeCall?.[4]).toMatchObject({
|
|
173
|
+
cwd: "/remote/workspace",
|
|
174
|
+
env: expect.objectContaining({
|
|
175
|
+
CODEX_HOME: "/remote/workspace/.paperclip-runtime/runs/test/workspace/.paperclip-runtime/codex/home",
|
|
176
|
+
}),
|
|
177
|
+
});
|
|
178
|
+
expect(restoreWorkspace).toHaveBeenCalledTimes(1);
|
|
179
|
+
});
|
|
180
|
+
it("avoids /tmp CODEX_HOME for remote API-key hello probes", async () => {
|
|
181
|
+
const remoteTarget = {
|
|
182
|
+
kind: "remote",
|
|
183
|
+
transport: "sandbox",
|
|
184
|
+
providerKey: "cloudflare",
|
|
185
|
+
remoteCwd: "/remote/workspace",
|
|
186
|
+
runner: {
|
|
187
|
+
execute: async () => ({
|
|
188
|
+
exitCode: 0,
|
|
189
|
+
signal: null,
|
|
190
|
+
timedOut: false,
|
|
191
|
+
stdout: "",
|
|
192
|
+
stderr: "",
|
|
193
|
+
pid: null,
|
|
194
|
+
startedAt: new Date().toISOString(),
|
|
195
|
+
}),
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
const result = await testEnvironment({
|
|
199
|
+
companyId: "company-1",
|
|
200
|
+
adapterType: "codex_local",
|
|
201
|
+
config: {
|
|
202
|
+
engine: "cli",
|
|
203
|
+
command: "codex",
|
|
204
|
+
env: {
|
|
205
|
+
OPENAI_API_KEY: "sk-test",
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
executionTarget: remoteTarget,
|
|
209
|
+
environmentName: "QA Cloudflare",
|
|
210
|
+
});
|
|
211
|
+
expect(result.status).toBe("pass");
|
|
212
|
+
const probeCall = runAdapterExecutionTargetProcess.mock.calls[0];
|
|
213
|
+
expect(probeCall?.[4].env.CODEX_HOME).toContain("/remote/workspace/.paperclip-runtime/codex/probe-home-codex-envtest-");
|
|
214
|
+
expect(probeCall?.[4].env.CODEX_HOME?.startsWith("/tmp/")).toBe(false);
|
|
215
|
+
expect(probeCall?.[3]).toContain("--skip-git-repo-check");
|
|
216
|
+
});
|
|
217
|
+
it("emits the canonical adapter_auth_missing check when a sandbox hello probe reports missing auth", async () => {
|
|
218
|
+
// The sandbox has no seedable credentials, so the hello probe returns an
|
|
219
|
+
// authentication-required error. The Test must emit the neutral canonical
|
|
220
|
+
// check code. The user interface reads this code to decide login
|
|
221
|
+
// eligibility; it does not parse the message text or the top-level status.
|
|
222
|
+
prepareManagedCodexHome.mockImplementationOnce(async () => {
|
|
223
|
+
const dir = await fs.mkdtemp(`${os.tmpdir()}/paperclip-managed-codex-home-noauth-`);
|
|
224
|
+
await fs.writeFile(`${dir}/config.toml`, "model = \"gpt-5\"\n");
|
|
225
|
+
return dir;
|
|
226
|
+
});
|
|
227
|
+
runAdapterExecutionTargetProcess.mockResolvedValueOnce({
|
|
228
|
+
exitCode: 1,
|
|
229
|
+
signal: null,
|
|
230
|
+
timedOut: false,
|
|
231
|
+
stdout: "",
|
|
232
|
+
stderr: "Not logged in. Please run `codex login` to authenticate.",
|
|
233
|
+
pid: 321,
|
|
234
|
+
startedAt: new Date().toISOString(),
|
|
235
|
+
});
|
|
236
|
+
const remoteTarget = {
|
|
237
|
+
kind: "remote",
|
|
238
|
+
transport: "sandbox",
|
|
239
|
+
providerKey: "daytona",
|
|
240
|
+
remoteCwd: "/remote/workspace",
|
|
241
|
+
runner: {
|
|
242
|
+
execute: async () => ({
|
|
243
|
+
exitCode: 0,
|
|
244
|
+
signal: null,
|
|
245
|
+
timedOut: false,
|
|
246
|
+
stdout: "",
|
|
247
|
+
stderr: "",
|
|
248
|
+
pid: null,
|
|
249
|
+
startedAt: new Date().toISOString(),
|
|
250
|
+
}),
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
const result = await testEnvironment({
|
|
254
|
+
companyId: "company-1",
|
|
255
|
+
adapterType: "codex_local",
|
|
256
|
+
config: { engine: "cli", command: "codex" },
|
|
257
|
+
executionTarget: remoteTarget,
|
|
258
|
+
environmentName: "QA Daytona",
|
|
259
|
+
});
|
|
260
|
+
// A missing-auth probe is a warning, not a failure, so the environment stays
|
|
261
|
+
// testable and the user interface can offer login.
|
|
262
|
+
expect(result.status).toBe("warn");
|
|
263
|
+
expect(result.checks.some((check) => check.code === "adapter_auth_missing")).toBe(true);
|
|
264
|
+
// The descriptive probe check stays, so existing diagnostics keep working.
|
|
265
|
+
expect(result.checks.some((check) => check.code === "codex_hello_probe_auth_required")).toBe(true);
|
|
266
|
+
});
|
|
267
|
+
it("does not override CODEX_HOME when the host has no credentials to seed", async () => {
|
|
268
|
+
// Custom-image flow: the login lives inside the captured snapshot, and the
|
|
269
|
+
// host has no Codex auth.json. The probe must not upload an empty home or
|
|
270
|
+
// set CODEX_HOME, so Codex falls back to the sandbox's baked-in login.
|
|
271
|
+
prepareManagedCodexHome.mockImplementationOnce(async () => {
|
|
272
|
+
const dir = await fs.mkdtemp(`${os.tmpdir()}/paperclip-managed-codex-home-noauth-`);
|
|
273
|
+
// No auth.json — only a config file.
|
|
274
|
+
await fs.writeFile(`${dir}/config.toml`, "model = \"gpt-5\"\n");
|
|
275
|
+
return dir;
|
|
276
|
+
});
|
|
277
|
+
const remoteTarget = {
|
|
278
|
+
kind: "remote",
|
|
279
|
+
transport: "sandbox",
|
|
280
|
+
providerKey: "daytona",
|
|
281
|
+
remoteCwd: "/remote/workspace",
|
|
282
|
+
runner: {
|
|
283
|
+
execute: async () => ({
|
|
284
|
+
exitCode: 0,
|
|
285
|
+
signal: null,
|
|
286
|
+
timedOut: false,
|
|
287
|
+
stdout: "",
|
|
288
|
+
stderr: "",
|
|
289
|
+
pid: null,
|
|
290
|
+
startedAt: new Date().toISOString(),
|
|
291
|
+
}),
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
const result = await testEnvironment({
|
|
295
|
+
companyId: "company-1",
|
|
296
|
+
adapterType: "codex_local",
|
|
297
|
+
config: { engine: "cli", command: "codex" },
|
|
298
|
+
executionTarget: remoteTarget,
|
|
299
|
+
environmentName: "QA Daytona",
|
|
300
|
+
});
|
|
301
|
+
expect(result.status).toBe("pass");
|
|
302
|
+
// No managed-home upload, so the full-runtime staging is skipped entirely.
|
|
303
|
+
expect(prepareAdapterExecutionTargetRuntime).not.toHaveBeenCalled();
|
|
304
|
+
const probeCall = runAdapterExecutionTargetProcess.mock.calls[0];
|
|
305
|
+
expect(probeCall?.[4].env.CODEX_HOME).toBeUndefined();
|
|
306
|
+
});
|
|
307
|
+
const subscriptionAuth = (accountId, marker, lastRefresh) => JSON.stringify({
|
|
308
|
+
tokens: {
|
|
309
|
+
id_token: `synthetic-id-token-${marker}`,
|
|
310
|
+
access_token: `synthetic-access-token-${marker}`,
|
|
311
|
+
refresh_token: `synthetic-refresh-token-${marker}`,
|
|
312
|
+
account_id: accountId,
|
|
313
|
+
},
|
|
314
|
+
last_refresh: lastRefresh,
|
|
315
|
+
});
|
|
316
|
+
function sandboxTarget() {
|
|
317
|
+
return {
|
|
318
|
+
kind: "remote",
|
|
319
|
+
transport: "sandbox",
|
|
320
|
+
providerKey: "daytona",
|
|
321
|
+
remoteCwd: "/remote/workspace",
|
|
322
|
+
runner: {
|
|
323
|
+
execute: async () => ({
|
|
324
|
+
exitCode: 0,
|
|
325
|
+
signal: null,
|
|
326
|
+
timedOut: false,
|
|
327
|
+
stdout: "",
|
|
328
|
+
stderr: "",
|
|
329
|
+
pid: null,
|
|
330
|
+
startedAt: new Date().toISOString(),
|
|
331
|
+
}),
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
it("stages a configured managed per-agent CODEX_HOME instead of the company default home", async () => {
|
|
336
|
+
// Execute honors env.CODEX_HOME, so the probe must exercise that same home
|
|
337
|
+
// — otherwise the Test and real runs authenticate with different
|
|
338
|
+
// credentials and can disagree in both directions.
|
|
339
|
+
const perAgentHome = path.join(process.env.PAPERCLIP_HOME, "instances", "default", "companies", "company-1", "agents", "agent-x", "codex-home");
|
|
340
|
+
const promoted = subscriptionAuth("acct-agent", "promoted", "2026-07-09T02:00:00Z");
|
|
341
|
+
await fs.mkdir(perAgentHome, { recursive: true });
|
|
342
|
+
await fs.writeFile(path.join(perAgentHome, "auth.json"), promoted, "utf8");
|
|
343
|
+
await fs.writeFile(path.join(perAgentHome, "config.toml"), 'model = "gpt-5"\n', "utf8");
|
|
344
|
+
const result = await testEnvironment({
|
|
345
|
+
companyId: "company-1",
|
|
346
|
+
adapterType: "codex_local",
|
|
347
|
+
config: {
|
|
348
|
+
engine: "cli",
|
|
349
|
+
command: "codex",
|
|
350
|
+
env: { CODEX_HOME: perAgentHome },
|
|
351
|
+
},
|
|
352
|
+
executionTarget: sandboxTarget(),
|
|
353
|
+
environmentName: "QA Daytona",
|
|
354
|
+
});
|
|
355
|
+
expect(result.status).toBe("pass");
|
|
356
|
+
// The company default home preparation never ran; the configured managed
|
|
357
|
+
// home was seeded in place and its credential is what got staged.
|
|
358
|
+
expect(prepareManagedCodexHome).not.toHaveBeenCalled();
|
|
359
|
+
expect(capturedHomeAssetAuthJson.value).toBe(promoted);
|
|
360
|
+
// The real seeding pass ran on the per-agent home and kept the promoted
|
|
361
|
+
// regular-file credential (the shared source scratch home is empty).
|
|
362
|
+
const stat = await fs.lstat(path.join(perAgentHome, "auth.json"));
|
|
363
|
+
expect(stat.isSymbolicLink()).toBe(false);
|
|
364
|
+
expect(await fs.readFile(path.join(perAgentHome, "auth.json"), "utf8")).toBe(promoted);
|
|
365
|
+
});
|
|
366
|
+
it("stages an external CODEX_HOME's credentials as-is and never seeds or mutates it", async () => {
|
|
367
|
+
const externalHome = await makeScratchDir("paperclip-test-external-codex-");
|
|
368
|
+
const external = subscriptionAuth("acct-ext", "external", "2026-07-09T01:00:00Z");
|
|
369
|
+
await fs.writeFile(path.join(externalHome, "auth.json"), external, "utf8");
|
|
370
|
+
// Plant a same-identity, strictly-fresher credential in the shared source
|
|
371
|
+
// home: if the probe wrongly ran the managed seeding pass on the external
|
|
372
|
+
// home, the heal would swap its auth.json for a symlink to this file. The
|
|
373
|
+
// regular-file assertion below is therefore proof no seeding happened.
|
|
374
|
+
await fs.writeFile(path.join(process.env.CODEX_HOME, "auth.json"), subscriptionAuth("acct-ext", "shared", "2026-07-09T02:00:00Z"), "utf8");
|
|
375
|
+
const result = await testEnvironment({
|
|
376
|
+
companyId: "company-1",
|
|
377
|
+
adapterType: "codex_local",
|
|
378
|
+
config: {
|
|
379
|
+
engine: "cli",
|
|
380
|
+
command: "codex",
|
|
381
|
+
env: { CODEX_HOME: externalHome },
|
|
382
|
+
},
|
|
383
|
+
executionTarget: sandboxTarget(),
|
|
384
|
+
environmentName: "QA Daytona",
|
|
385
|
+
});
|
|
386
|
+
expect(result.status).toBe("pass");
|
|
387
|
+
expect(prepareManagedCodexHome).not.toHaveBeenCalled();
|
|
388
|
+
// The external home's own credential is what got staged — not the shared
|
|
389
|
+
// source's fresher copy, because an external override manages its own auth.
|
|
390
|
+
expect(capturedHomeAssetAuthJson.value).toBe(external);
|
|
391
|
+
const stat = await fs.lstat(path.join(externalHome, "auth.json"));
|
|
392
|
+
expect(stat.isSymbolicLink()).toBe(false);
|
|
393
|
+
expect(await fs.readFile(path.join(externalHome, "auth.json"), "utf8")).toBe(external);
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
//# sourceMappingURL=test.remote.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.remote.test.js","sourceRoot":"","sources":["../../src/server/test.remote.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type CreateConfigValues } from "@tickernelz/paperclip-pro-adapter-utils";
|
|
2
|
+
export declare function buildCodexLocalConfig(v: CreateConfigValues): Record<string, unknown>;
|
|
3
|
+
/** Build a provider profile accepted by the experimental Rust runner. */
|
|
4
|
+
export declare function buildPaperclipRunnerConfig(v: CreateConfigValues): Record<string, unknown>;
|
|
5
|
+
//# sourceMappingURL=build-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,yCAAyC,CAAC;AAsBjD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuCpF;AAED,yEAAyE;AACzE,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsMzF"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { buildAdapterEnvConfig, isPaperclipRunnerProvider, normalizeLegacyRunnerProvider, resolvePaperclipRunnerModel, resolvePaperclipRunnerIdleTimeoutMs, resolvePaperclipRunnerPermissionMode, } from "@tickernelz/paperclip-pro-adapter-utils";
|
|
2
|
+
import { DEFAULT_CODEX_LOCAL_BYPASS_APPROVALS_AND_SANDBOX } from "../index.js";
|
|
3
|
+
function parseCommaArgs(value) {
|
|
4
|
+
return value
|
|
5
|
+
.split(",")
|
|
6
|
+
.map((item) => item.trim())
|
|
7
|
+
.filter(Boolean);
|
|
8
|
+
}
|
|
9
|
+
function parseJsonObject(text) {
|
|
10
|
+
const trimmed = text.trim();
|
|
11
|
+
if (!trimmed)
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(trimmed);
|
|
15
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
|
|
16
|
+
return null;
|
|
17
|
+
return parsed;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function buildCodexLocalConfig(v) {
|
|
24
|
+
const ac = {};
|
|
25
|
+
if (v.cwd)
|
|
26
|
+
ac.cwd = v.cwd;
|
|
27
|
+
if (v.instructionsFilePath)
|
|
28
|
+
ac.instructionsFilePath = v.instructionsFilePath;
|
|
29
|
+
if (v.model)
|
|
30
|
+
ac.model = v.model;
|
|
31
|
+
if (v.thinkingEffort)
|
|
32
|
+
ac.modelReasoningEffort = v.thinkingEffort;
|
|
33
|
+
if (v.codexEngine === "cli" || v.codexEngine === "acp")
|
|
34
|
+
ac.engine = v.codexEngine;
|
|
35
|
+
if (v.codexEngine === "acp") {
|
|
36
|
+
if (v.codexAcpAgentCommand)
|
|
37
|
+
ac.agentCommand = v.codexAcpAgentCommand;
|
|
38
|
+
ac.mode = v.codexAcpMode ?? "persistent";
|
|
39
|
+
ac.nonInteractivePermissions = v.codexAcpNonInteractivePermissions ?? "deny";
|
|
40
|
+
if (v.codexAcpStateDir)
|
|
41
|
+
ac.stateDir = v.codexAcpStateDir;
|
|
42
|
+
ac.warmHandleIdleMs = v.codexAcpWarmHandleIdleMs ?? 0;
|
|
43
|
+
}
|
|
44
|
+
ac.timeoutSec = 0;
|
|
45
|
+
ac.graceSec = 15;
|
|
46
|
+
const env = buildAdapterEnvConfig(v.envBindings, v.envVars);
|
|
47
|
+
if (Object.keys(env).length > 0)
|
|
48
|
+
ac.env = env;
|
|
49
|
+
ac.search = v.search;
|
|
50
|
+
ac.fastMode = v.fastMode;
|
|
51
|
+
ac.dangerouslyBypassApprovalsAndSandbox =
|
|
52
|
+
typeof v.dangerouslyBypassSandbox === "boolean"
|
|
53
|
+
? v.dangerouslyBypassSandbox
|
|
54
|
+
: DEFAULT_CODEX_LOCAL_BYPASS_APPROVALS_AND_SANDBOX;
|
|
55
|
+
if (v.workspaceStrategyType === "git_worktree") {
|
|
56
|
+
ac.workspaceStrategy = {
|
|
57
|
+
type: "git_worktree",
|
|
58
|
+
...(v.workspaceBaseRef ? { baseRef: v.workspaceBaseRef } : {}),
|
|
59
|
+
...(v.workspaceBranchTemplate ? { branchTemplate: v.workspaceBranchTemplate } : {}),
|
|
60
|
+
...(v.worktreeParentDir ? { worktreeParentDir: v.worktreeParentDir } : {}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const runtimeServices = parseJsonObject(v.runtimeServicesJson ?? "");
|
|
64
|
+
if (runtimeServices && Array.isArray(runtimeServices.services)) {
|
|
65
|
+
ac.workspaceRuntime = runtimeServices;
|
|
66
|
+
}
|
|
67
|
+
if (v.command)
|
|
68
|
+
ac.command = v.command;
|
|
69
|
+
if (v.extraArgs)
|
|
70
|
+
ac.extraArgs = parseCommaArgs(v.extraArgs);
|
|
71
|
+
return ac;
|
|
72
|
+
}
|
|
73
|
+
/** Build a provider profile accepted by the experimental Rust runner. */
|
|
74
|
+
export function buildPaperclipRunnerConfig(v) {
|
|
75
|
+
const config = buildCodexLocalConfig(v);
|
|
76
|
+
const schemaValues = normalizeLegacyRunnerProvider({ ...(v.adapterSchemaValues ?? {}) });
|
|
77
|
+
for (const unsupportedKey of [
|
|
78
|
+
"engine",
|
|
79
|
+
"agentCommand",
|
|
80
|
+
"mode",
|
|
81
|
+
"nonInteractivePermissions",
|
|
82
|
+
"stateDir",
|
|
83
|
+
"warmHandleIdleMs",
|
|
84
|
+
"dangerouslyBypassApprovalsAndSandbox",
|
|
85
|
+
"dangerouslyBypassSandbox",
|
|
86
|
+
"modelReasoningEffort",
|
|
87
|
+
"search",
|
|
88
|
+
"fastMode",
|
|
89
|
+
"command",
|
|
90
|
+
"extraArgs",
|
|
91
|
+
]) {
|
|
92
|
+
delete config[unsupportedKey];
|
|
93
|
+
delete schemaValues[unsupportedKey];
|
|
94
|
+
}
|
|
95
|
+
const providerCandidate = schemaValues.provider;
|
|
96
|
+
const provider = isPaperclipRunnerProvider(providerCandidate)
|
|
97
|
+
? providerCandidate
|
|
98
|
+
: "codex";
|
|
99
|
+
const schemaModel = typeof schemaValues.model === "string"
|
|
100
|
+
? schemaValues.model.trim()
|
|
101
|
+
: "";
|
|
102
|
+
const configuredModel = typeof config.model === "string"
|
|
103
|
+
? config.model.trim()
|
|
104
|
+
: "";
|
|
105
|
+
const managedProfileId = typeof schemaValues.managedProfileId === "string"
|
|
106
|
+
? schemaValues.managedProfileId.trim()
|
|
107
|
+
: "";
|
|
108
|
+
const agentCoreProfileId = typeof schemaValues.agentCoreProfileId === "string"
|
|
109
|
+
? schemaValues.agentCoreProfileId.trim()
|
|
110
|
+
: "";
|
|
111
|
+
const maxSessionListCostUsd = Number(schemaValues.maxSessionListCostUsd ?? 1);
|
|
112
|
+
const maxEstimatedSessionCostUsd = Number(schemaValues.maxEstimatedSessionCostUsd ?? 1);
|
|
113
|
+
const managedAgentsRetentionAcknowledged = schemaValues.managedAgentsRetentionAcknowledged === true;
|
|
114
|
+
const agentCoreRetentionAcknowledged = schemaValues.agentCoreRetentionAcknowledged === true;
|
|
115
|
+
const boundedLimit = (value, fallback, maximum, label) => {
|
|
116
|
+
if (value === undefined || value === null || value === "")
|
|
117
|
+
return fallback;
|
|
118
|
+
if (typeof value !== "number"
|
|
119
|
+
|| !Number.isSafeInteger(value)
|
|
120
|
+
|| value <= 0
|
|
121
|
+
|| value > maximum) {
|
|
122
|
+
throw new Error(`${label} must be an integer between 1 and ${maximum}.`);
|
|
123
|
+
}
|
|
124
|
+
return value;
|
|
125
|
+
};
|
|
126
|
+
const maxIterations = boundedLimit(schemaValues.maxIterations, 8, 8, "AWS AgentCore maxIterations");
|
|
127
|
+
const maxOutputTokens = boundedLimit(schemaValues.maxOutputTokens, 4_096, 4_096, "AWS AgentCore maxOutputTokens");
|
|
128
|
+
const timeoutSeconds = boundedLimit(schemaValues.timeoutSeconds, 300, 300, "AWS AgentCore timeoutSeconds");
|
|
129
|
+
const lifecycleCandidate = v.paperclipRunnerLifecycleMode ?? schemaValues.lifecycleMode;
|
|
130
|
+
const lifecycleMode = lifecycleCandidate === "warm" ? "warm" : "per_turn";
|
|
131
|
+
const configuredIdleTimeoutMs = v.paperclipRunnerIdleTimeoutMs ?? schemaValues.idleTimeoutMs;
|
|
132
|
+
const idleTimeoutMs = resolvePaperclipRunnerIdleTimeoutMs(configuredIdleTimeoutMs);
|
|
133
|
+
const configuredCodexPermissionMode = v.adapterSchemaValues?.codexPermissionMode ?? v.codexPermissionMode;
|
|
134
|
+
if (provider === "codex"
|
|
135
|
+
&& configuredCodexPermissionMode !== undefined
|
|
136
|
+
&& configuredCodexPermissionMode !== "never") {
|
|
137
|
+
throw new Error("Paperclip Runner currently supports Codex only with codexPermissionMode set to never. Select Full auto (never ask) before saving.");
|
|
138
|
+
}
|
|
139
|
+
for (const normalizedKey of [
|
|
140
|
+
"provider",
|
|
141
|
+
"model",
|
|
142
|
+
"acpxAgent",
|
|
143
|
+
"codexPermissionMode",
|
|
144
|
+
"opencodePermissionMode",
|
|
145
|
+
"acpxPermissionMode",
|
|
146
|
+
"managedProfileId",
|
|
147
|
+
"managedAgentsRetentionAcknowledged",
|
|
148
|
+
"maxSessionListCostUsd",
|
|
149
|
+
"anthropicAgentId",
|
|
150
|
+
"agentVersion",
|
|
151
|
+
"anthropicEnvironmentId",
|
|
152
|
+
"agentCoreProfileId",
|
|
153
|
+
"agentCoreRetentionAcknowledged",
|
|
154
|
+
"maxEstimatedSessionCostUsd",
|
|
155
|
+
"maxIterations",
|
|
156
|
+
"maxOutputTokens",
|
|
157
|
+
"timeoutSeconds",
|
|
158
|
+
"awsRegion",
|
|
159
|
+
"awsAccountId",
|
|
160
|
+
"harnessArn",
|
|
161
|
+
"harnessId",
|
|
162
|
+
"harnessVersion",
|
|
163
|
+
"endpointArn",
|
|
164
|
+
"endpointQualifier",
|
|
165
|
+
"agentRuntimeArn",
|
|
166
|
+
"memoryArn",
|
|
167
|
+
"memoryId",
|
|
168
|
+
"invocationRoleArn",
|
|
169
|
+
"contextBucket",
|
|
170
|
+
"contextPrefix",
|
|
171
|
+
"contextKmsKeyArn",
|
|
172
|
+
"qualificationRevision",
|
|
173
|
+
"lifecycleMode",
|
|
174
|
+
"idleTimeoutMs",
|
|
175
|
+
]) {
|
|
176
|
+
delete schemaValues[normalizedKey];
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
...config,
|
|
180
|
+
...schemaValues,
|
|
181
|
+
provider,
|
|
182
|
+
...(provider === "codex"
|
|
183
|
+
? { model: resolvePaperclipRunnerModel("codex", config.model) }
|
|
184
|
+
: {}),
|
|
185
|
+
codexPermissionMode: "never",
|
|
186
|
+
opencodePermissionMode: resolvePaperclipRunnerPermissionMode("opencode", v.adapterSchemaValues?.opencodePermissionMode),
|
|
187
|
+
acpxPermissionMode: resolvePaperclipRunnerPermissionMode("acpx", v.adapterSchemaValues?.acpxPermissionMode),
|
|
188
|
+
...(provider === "opencode"
|
|
189
|
+
? {
|
|
190
|
+
model: schemaModel
|
|
191
|
+
|| configuredModel
|
|
192
|
+
|| "openrouter/deepseek/deepseek-v4-flash-0731",
|
|
193
|
+
}
|
|
194
|
+
: {}),
|
|
195
|
+
...(provider === "acpx"
|
|
196
|
+
? {
|
|
197
|
+
acpxAgent: "claude",
|
|
198
|
+
model: configuredModel || schemaModel || resolvePaperclipRunnerModel("acpx", undefined),
|
|
199
|
+
}
|
|
200
|
+
: {}),
|
|
201
|
+
...(provider === "claude_managed"
|
|
202
|
+
? {
|
|
203
|
+
...(managedProfileId ? { managedProfileId } : {}),
|
|
204
|
+
model: configuredModel || "claude-sonnet-5",
|
|
205
|
+
maxSessionListCostUsd: Number.isFinite(maxSessionListCostUsd) && maxSessionListCostUsd > 0
|
|
206
|
+
? maxSessionListCostUsd
|
|
207
|
+
: 1,
|
|
208
|
+
managedAgentsRetentionAcknowledged: managedAgentsRetentionAcknowledged,
|
|
209
|
+
}
|
|
210
|
+
: {}),
|
|
211
|
+
...(provider === "aws_agentcore"
|
|
212
|
+
? {
|
|
213
|
+
...(agentCoreProfileId ? { agentCoreProfileId } : {}),
|
|
214
|
+
model: configuredModel || "global.anthropic.claude-sonnet-4-6",
|
|
215
|
+
maxEstimatedSessionCostUsd: Number.isFinite(maxEstimatedSessionCostUsd)
|
|
216
|
+
&& maxEstimatedSessionCostUsd > 0
|
|
217
|
+
? maxEstimatedSessionCostUsd
|
|
218
|
+
: 1,
|
|
219
|
+
agentCoreRetentionAcknowledged: agentCoreRetentionAcknowledged,
|
|
220
|
+
maxIterations,
|
|
221
|
+
maxOutputTokens,
|
|
222
|
+
timeoutSeconds,
|
|
223
|
+
}
|
|
224
|
+
: {}),
|
|
225
|
+
lifecycleMode,
|
|
226
|
+
...(lifecycleMode === "warm" ? { idleTimeoutMs } : {}),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=build-config.js.map
|