@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,367 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { prepareCodexRuntimeConfig } from "./runtime-config.js";
|
|
6
|
+
const cleanupPaths = new Set();
|
|
7
|
+
afterEach(async () => {
|
|
8
|
+
await Promise.all([...cleanupPaths].map(async (filepath) => {
|
|
9
|
+
await fs.rm(filepath, { recursive: true, force: true });
|
|
10
|
+
cleanupPaths.delete(filepath);
|
|
11
|
+
}));
|
|
12
|
+
});
|
|
13
|
+
async function makeCodexHome(configToml) {
|
|
14
|
+
const home = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-codex-home-"));
|
|
15
|
+
cleanupPaths.add(home);
|
|
16
|
+
if (configToml !== undefined) {
|
|
17
|
+
await fs.writeFile(path.join(home, "config.toml"), configToml, "utf8");
|
|
18
|
+
}
|
|
19
|
+
return home;
|
|
20
|
+
}
|
|
21
|
+
async function readConfigToml(home) {
|
|
22
|
+
return fs.readFile(path.join(home, "config.toml"), "utf8");
|
|
23
|
+
}
|
|
24
|
+
const BIFROST_PROVIDERS = {
|
|
25
|
+
providers: {
|
|
26
|
+
bifrost: {
|
|
27
|
+
name: "bifrost",
|
|
28
|
+
base_url: "http://gateway.example.svc.cluster.local:8080/v1",
|
|
29
|
+
env_key: "OPENAI_API_KEY",
|
|
30
|
+
wire_api: "responses",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
model_provider: "bifrost",
|
|
34
|
+
};
|
|
35
|
+
describe("prepareCodexRuntimeConfig", () => {
|
|
36
|
+
it("is a no-op when PAPERCLIP_CODEX_PROVIDERS is unset", async () => {
|
|
37
|
+
const home = await makeCodexHome("model = \"gpt-5.1-codex\"\n");
|
|
38
|
+
const prepared = await prepareCodexRuntimeConfig({ env: { FOO: "bar" }, codexHome: home });
|
|
39
|
+
expect(prepared.notes).toEqual([]);
|
|
40
|
+
expect(await readConfigToml(home)).toBe("model = \"gpt-5.1-codex\"\n");
|
|
41
|
+
await prepared.cleanup();
|
|
42
|
+
});
|
|
43
|
+
it("is a no-op when the home has no config.toml and the env is unset", async () => {
|
|
44
|
+
const home = await makeCodexHome();
|
|
45
|
+
const prepared = await prepareCodexRuntimeConfig({ env: {}, codexHome: home });
|
|
46
|
+
expect(prepared.notes).toEqual([]);
|
|
47
|
+
await expect(fs.access(path.join(home, "config.toml"))).rejects.toThrow();
|
|
48
|
+
await prepared.cleanup();
|
|
49
|
+
});
|
|
50
|
+
it("merges providers + model_provider into a fresh config.toml and cleans it up", async () => {
|
|
51
|
+
const home = await makeCodexHome();
|
|
52
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
53
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
54
|
+
codexHome: home,
|
|
55
|
+
});
|
|
56
|
+
const content = await readConfigToml(home);
|
|
57
|
+
expect(content).toContain('model_provider = "bifrost"');
|
|
58
|
+
expect(content).toContain("[model_providers.bifrost]");
|
|
59
|
+
expect(content).toContain('base_url = "http://gateway.example.svc.cluster.local:8080/v1"');
|
|
60
|
+
expect(content).toContain('env_key = "OPENAI_API_KEY"');
|
|
61
|
+
expect(content).toContain('wire_api = "responses"');
|
|
62
|
+
expect(prepared.notes.some((n) => n.includes("bifrost"))).toBe(true);
|
|
63
|
+
await prepared.cleanup();
|
|
64
|
+
await expect(fs.access(path.join(home, "config.toml"))).rejects.toThrow();
|
|
65
|
+
});
|
|
66
|
+
it("preserves existing config.toml content, keeps model_provider in the root region, and restores on cleanup", async () => {
|
|
67
|
+
const original = [
|
|
68
|
+
'model = "gpt-5.1-codex"',
|
|
69
|
+
"",
|
|
70
|
+
"[profiles.dev]",
|
|
71
|
+
'model = "gpt-5.1-codex-mini"',
|
|
72
|
+
"",
|
|
73
|
+
].join("\n");
|
|
74
|
+
const home = await makeCodexHome(original);
|
|
75
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
76
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
77
|
+
codexHome: home,
|
|
78
|
+
});
|
|
79
|
+
const content = await readConfigToml(home);
|
|
80
|
+
// Existing content survives.
|
|
81
|
+
expect(content).toContain('model = "gpt-5.1-codex"');
|
|
82
|
+
expect(content).toContain("[profiles.dev]");
|
|
83
|
+
// model_provider must precede the first table header (TOML root region),
|
|
84
|
+
// and the provider tables must come after the user's tables.
|
|
85
|
+
expect(content.indexOf('model_provider = "bifrost"')).toBeLessThan(content.indexOf("[profiles.dev]"));
|
|
86
|
+
expect(content.indexOf("[model_providers.bifrost]")).toBeGreaterThan(content.indexOf("[profiles.dev]"));
|
|
87
|
+
await prepared.cleanup();
|
|
88
|
+
expect(await readConfigToml(home)).toBe(original);
|
|
89
|
+
});
|
|
90
|
+
it("wins over a pre-existing same-name [model_providers.*] section and root model_provider key", async () => {
|
|
91
|
+
const original = [
|
|
92
|
+
'model_provider = "stale"',
|
|
93
|
+
"",
|
|
94
|
+
"[model_providers.bifrost]",
|
|
95
|
+
'base_url = "http://old.example/v1"',
|
|
96
|
+
'env_key = "OLD_KEY"',
|
|
97
|
+
"",
|
|
98
|
+
"[model_providers.bifrost.http_headers]",
|
|
99
|
+
'"X-Old" = "1"',
|
|
100
|
+
"",
|
|
101
|
+
"[model_providers.other]",
|
|
102
|
+
'base_url = "http://other.example/v1"',
|
|
103
|
+
"",
|
|
104
|
+
].join("\n");
|
|
105
|
+
const home = await makeCodexHome(original);
|
|
106
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
107
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
108
|
+
codexHome: home,
|
|
109
|
+
});
|
|
110
|
+
const content = await readConfigToml(home);
|
|
111
|
+
expect(content).not.toContain('model_provider = "stale"');
|
|
112
|
+
expect(content).not.toContain("http://old.example/v1");
|
|
113
|
+
expect(content).not.toContain("X-Old");
|
|
114
|
+
// Unrelated provider sections survive.
|
|
115
|
+
expect(content).toContain("[model_providers.other]");
|
|
116
|
+
expect(content).toContain("http://other.example/v1");
|
|
117
|
+
// Exactly one bifrost section: ours.
|
|
118
|
+
expect(content.split("[model_providers.bifrost]").length).toBe(2);
|
|
119
|
+
expect(content).toContain('base_url = "http://gateway.example.svc.cluster.local:8080/v1"');
|
|
120
|
+
await prepared.cleanup();
|
|
121
|
+
expect(await readConfigToml(home)).toBe(original);
|
|
122
|
+
});
|
|
123
|
+
it("emits plain-object fields as inline tables and arrays as TOML arrays", async () => {
|
|
124
|
+
const home = await makeCodexHome();
|
|
125
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
126
|
+
env: {
|
|
127
|
+
PAPERCLIP_CODEX_PROVIDERS: JSON.stringify({
|
|
128
|
+
providers: {
|
|
129
|
+
gw: {
|
|
130
|
+
base_url: "http://gw.example/v1",
|
|
131
|
+
query_params: { "api-version": "2026-01-01" },
|
|
132
|
+
http_headers: { "X Team": "agents" },
|
|
133
|
+
request_max_retries: 4,
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
}),
|
|
137
|
+
},
|
|
138
|
+
codexHome: home,
|
|
139
|
+
});
|
|
140
|
+
const content = await readConfigToml(home);
|
|
141
|
+
expect(content).toContain("[model_providers.gw]");
|
|
142
|
+
// Bare keys (incl. hyphens) stay bare; keys with other characters get quoted.
|
|
143
|
+
expect(content).toContain('query_params = { api-version = "2026-01-01" }');
|
|
144
|
+
expect(content).toContain('http_headers = { "X Team" = "agents" }');
|
|
145
|
+
expect(content).toContain("request_max_retries = 4");
|
|
146
|
+
// No model_provider was requested, so none is emitted.
|
|
147
|
+
expect(content).not.toContain("model_provider =");
|
|
148
|
+
await prepared.cleanup();
|
|
149
|
+
});
|
|
150
|
+
it("expands {env:VAR} placeholders from the run env and process.env, leaving unresolvable ones intact", async () => {
|
|
151
|
+
const home = await makeCodexHome();
|
|
152
|
+
process.env.PAPERCLIP_CODEX_TEST_PROCESS_KEY = "from-process-env";
|
|
153
|
+
try {
|
|
154
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
155
|
+
env: {
|
|
156
|
+
PAPERCLIP_CODEX_PROVIDERS: JSON.stringify({
|
|
157
|
+
providers: {
|
|
158
|
+
gw: {
|
|
159
|
+
base_url: "http://gw.example/v1",
|
|
160
|
+
http_headers: {
|
|
161
|
+
"X-Run": "{env:PAPERCLIP_CODEX_TEST_RUN_KEY}",
|
|
162
|
+
"X-Process": "{env:PAPERCLIP_CODEX_TEST_PROCESS_KEY}",
|
|
163
|
+
"X-Missing": "{env:DEFINITELY_UNSET_VAR_XYZ}",
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
model_provider: "gw",
|
|
168
|
+
}),
|
|
169
|
+
PAPERCLIP_CODEX_TEST_RUN_KEY: "from-run-env",
|
|
170
|
+
},
|
|
171
|
+
codexHome: home,
|
|
172
|
+
});
|
|
173
|
+
const content = await readConfigToml(home);
|
|
174
|
+
expect(content).toContain('X-Run = "from-run-env"');
|
|
175
|
+
expect(content).toContain('X-Process = "from-process-env"');
|
|
176
|
+
expect(content).toContain('X-Missing = "{env:DEFINITELY_UNSET_VAR_XYZ}"');
|
|
177
|
+
await prepared.cleanup();
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
delete process.env.PAPERCLIP_CODEX_TEST_PROCESS_KEY;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
it("reads PAPERCLIP_CODEX_PROVIDERS from process.env when absent from the run env", async () => {
|
|
184
|
+
const home = await makeCodexHome();
|
|
185
|
+
process.env.PAPERCLIP_CODEX_PROVIDERS = JSON.stringify(BIFROST_PROVIDERS);
|
|
186
|
+
try {
|
|
187
|
+
const prepared = await prepareCodexRuntimeConfig({ env: {}, codexHome: home });
|
|
188
|
+
const content = await readConfigToml(home);
|
|
189
|
+
expect(content).toContain("[model_providers.bifrost]");
|
|
190
|
+
await prepared.cleanup();
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
delete process.env.PAPERCLIP_CODEX_PROVIDERS;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
it("surfaces a note for malformed PAPERCLIP_CODEX_PROVIDERS without touching config.toml", async () => {
|
|
197
|
+
const home = await makeCodexHome("model = \"gpt-5.1-codex\"\n");
|
|
198
|
+
const cases = [
|
|
199
|
+
["not json", "contains invalid JSON"],
|
|
200
|
+
[JSON.stringify(["providers"]), "is not a JSON object"],
|
|
201
|
+
[JSON.stringify({ no_providers: true }), 'has no "providers" object'],
|
|
202
|
+
[JSON.stringify({ providers: {} }), "contains no usable entries"],
|
|
203
|
+
[JSON.stringify({ providers: { gw: "nope" } }), "skipped provider(s) with empty names or non-object values: gw"],
|
|
204
|
+
];
|
|
205
|
+
for (const [raw, noteFragment] of cases) {
|
|
206
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
207
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: raw },
|
|
208
|
+
codexHome: home,
|
|
209
|
+
});
|
|
210
|
+
expect(prepared.notes).toHaveLength(1);
|
|
211
|
+
expect(prepared.notes[0]).toContain(noteFragment);
|
|
212
|
+
expect(prepared.notes[0]).toContain("custom providers ignored");
|
|
213
|
+
expect(await readConfigToml(home)).toBe("model = \"gpt-5.1-codex\"\n");
|
|
214
|
+
await prepared.cleanup();
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
it("stays silent when PAPERCLIP_CODEX_PROVIDERS is unset or empty", async () => {
|
|
218
|
+
const home = await makeCodexHome("model = \"gpt-5.1-codex\"\n");
|
|
219
|
+
const envs = [
|
|
220
|
+
{},
|
|
221
|
+
{ PAPERCLIP_CODEX_PROVIDERS: "" },
|
|
222
|
+
{ PAPERCLIP_CODEX_PROVIDERS: " " },
|
|
223
|
+
];
|
|
224
|
+
for (const env of envs) {
|
|
225
|
+
const prepared = await prepareCodexRuntimeConfig({ env, codexHome: home });
|
|
226
|
+
expect(prepared.notes).toEqual([]);
|
|
227
|
+
expect(await readConfigToml(home)).toBe("model = \"gpt-5.1-codex\"\n");
|
|
228
|
+
await prepared.cleanup();
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
it("surfaces skipped non-object provider entries while merging the usable ones", async () => {
|
|
232
|
+
const home = await makeCodexHome();
|
|
233
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
234
|
+
env: {
|
|
235
|
+
PAPERCLIP_CODEX_PROVIDERS: JSON.stringify({
|
|
236
|
+
providers: {
|
|
237
|
+
bad: "http://gateway.example/v1",
|
|
238
|
+
good: { base_url: "http://gateway.example/v1", env_key: "OPENAI_API_KEY" },
|
|
239
|
+
},
|
|
240
|
+
model_provider: "good",
|
|
241
|
+
}),
|
|
242
|
+
},
|
|
243
|
+
codexHome: home,
|
|
244
|
+
});
|
|
245
|
+
const content = await readConfigToml(home);
|
|
246
|
+
expect(content).toContain("[model_providers.good]");
|
|
247
|
+
expect(content).not.toContain("[model_providers.bad]");
|
|
248
|
+
expect(prepared.notes.some((n) => n.includes("skipped provider(s) with empty names or non-object values: bad"))).toBe(true);
|
|
249
|
+
expect(prepared.notes.some((n) => n.includes("Merged 1 custom Codex model provider(s)"))).toBe(true);
|
|
250
|
+
await prepared.cleanup();
|
|
251
|
+
});
|
|
252
|
+
it("escapes DEL (U+007F) in emitted TOML strings", async () => {
|
|
253
|
+
const del = String.fromCharCode(0x7f);
|
|
254
|
+
const home = await makeCodexHome();
|
|
255
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
256
|
+
env: {
|
|
257
|
+
PAPERCLIP_CODEX_PROVIDERS: JSON.stringify({
|
|
258
|
+
providers: { gw: { base_url: "http://gw.example/v1", name: `del${del}name` } },
|
|
259
|
+
}),
|
|
260
|
+
},
|
|
261
|
+
codexHome: home,
|
|
262
|
+
});
|
|
263
|
+
const content = await readConfigToml(home);
|
|
264
|
+
expect(content).not.toContain(del);
|
|
265
|
+
expect(content).toContain("u007fname");
|
|
266
|
+
await prepared.cleanup();
|
|
267
|
+
});
|
|
268
|
+
it("restores user provider sections from the pre-run backup after an interrupted run", async () => {
|
|
269
|
+
const userConfig = [
|
|
270
|
+
'model = "gpt-5.1-codex"',
|
|
271
|
+
"",
|
|
272
|
+
"[model_providers.bifrost]",
|
|
273
|
+
'base_url = "http://user.example/v1"',
|
|
274
|
+
"",
|
|
275
|
+
].join("\n");
|
|
276
|
+
const home = await makeCodexHome(userConfig);
|
|
277
|
+
// Simulate a crash: the merge excises the user's same-name provider
|
|
278
|
+
// section (the managed definition must win), and cleanup() never runs.
|
|
279
|
+
await prepareCodexRuntimeConfig({
|
|
280
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
281
|
+
codexHome: home,
|
|
282
|
+
});
|
|
283
|
+
expect(await readConfigToml(home)).toContain('env_key = "OPENAI_API_KEY"');
|
|
284
|
+
const prepared = await prepareCodexRuntimeConfig({ env: {}, codexHome: home });
|
|
285
|
+
expect(prepared.notes.some((n) => n.includes("backup"))).toBe(true);
|
|
286
|
+
expect(await readConfigToml(home)).toBe(userConfig);
|
|
287
|
+
await expect(fs.access(path.join(home, "config.toml.paperclip-backup"))).rejects.toThrow();
|
|
288
|
+
await prepared.cleanup();
|
|
289
|
+
});
|
|
290
|
+
it("removes the pre-run backup on cleanup", async () => {
|
|
291
|
+
const home = await makeCodexHome('approval_policy = "never"\n');
|
|
292
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
293
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
294
|
+
codexHome: home,
|
|
295
|
+
});
|
|
296
|
+
const backupPath = path.join(home, "config.toml.paperclip-backup");
|
|
297
|
+
expect(await fs.readFile(backupPath, "utf8")).toBe('approval_policy = "never"\n');
|
|
298
|
+
await prepared.cleanup();
|
|
299
|
+
expect(await readConfigToml(home)).toBe('approval_policy = "never"\n');
|
|
300
|
+
await expect(fs.access(backupPath)).rejects.toThrow();
|
|
301
|
+
});
|
|
302
|
+
it("skips the merge and surfaces a note when CODEX_HOME is explicitly configured", async () => {
|
|
303
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
304
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
305
|
+
codexHome: null,
|
|
306
|
+
});
|
|
307
|
+
expect(prepared.notes).toHaveLength(1);
|
|
308
|
+
expect(prepared.notes[0]).toContain("CODEX_HOME");
|
|
309
|
+
await prepared.cleanup();
|
|
310
|
+
});
|
|
311
|
+
it("self-heals stale managed blocks when the env is no longer set", async () => {
|
|
312
|
+
const home = await makeCodexHome();
|
|
313
|
+
const crashed = await prepareCodexRuntimeConfig({
|
|
314
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
315
|
+
codexHome: home,
|
|
316
|
+
});
|
|
317
|
+
// Simulate a crash: cleanup never runs, the managed blocks persist.
|
|
318
|
+
void crashed;
|
|
319
|
+
expect(await readConfigToml(home)).toContain("[model_providers.bifrost]");
|
|
320
|
+
const prepared = await prepareCodexRuntimeConfig({ env: {}, codexHome: home });
|
|
321
|
+
expect(prepared.notes.some((n) => n.includes("stale"))).toBe(true);
|
|
322
|
+
const content = await readConfigToml(home);
|
|
323
|
+
expect(content).not.toContain("model_provider");
|
|
324
|
+
expect(content).not.toContain("bifrost");
|
|
325
|
+
await prepared.cleanup();
|
|
326
|
+
});
|
|
327
|
+
it("re-running with changed providers replaces the previous managed blocks", async () => {
|
|
328
|
+
const home = await makeCodexHome("approval_policy = \"never\"\n");
|
|
329
|
+
const first = await prepareCodexRuntimeConfig({
|
|
330
|
+
env: { PAPERCLIP_CODEX_PROVIDERS: JSON.stringify(BIFROST_PROVIDERS) },
|
|
331
|
+
codexHome: home,
|
|
332
|
+
});
|
|
333
|
+
void first; // simulate crash: no cleanup
|
|
334
|
+
const second = await prepareCodexRuntimeConfig({
|
|
335
|
+
env: {
|
|
336
|
+
PAPERCLIP_CODEX_PROVIDERS: JSON.stringify({
|
|
337
|
+
providers: { gw2: { base_url: "http://gw2.example/v1", env_key: "OPENAI_API_KEY" } },
|
|
338
|
+
model_provider: "gw2",
|
|
339
|
+
}),
|
|
340
|
+
},
|
|
341
|
+
codexHome: home,
|
|
342
|
+
});
|
|
343
|
+
const content = await readConfigToml(home);
|
|
344
|
+
expect(content).toContain('approval_policy = "never"');
|
|
345
|
+
expect(content).toContain("[model_providers.gw2]");
|
|
346
|
+
expect(content).toContain('model_provider = "gw2"');
|
|
347
|
+
expect(content).not.toContain("bifrost");
|
|
348
|
+
expect(content.split("model_provider =").length).toBe(2);
|
|
349
|
+
await second.cleanup();
|
|
350
|
+
});
|
|
351
|
+
it("rejects the block when model_provider names a filtered or missing provider", async () => {
|
|
352
|
+
const home = await makeCodexHome("model = \"gpt-5.1-codex\"\n");
|
|
353
|
+
const prepared = await prepareCodexRuntimeConfig({
|
|
354
|
+
env: {
|
|
355
|
+
PAPERCLIP_CODEX_PROVIDERS: JSON.stringify({
|
|
356
|
+
providers: { good: { base_url: "https://gateway.example/v1" }, bad: "not-an-object" },
|
|
357
|
+
model_provider: "bad",
|
|
358
|
+
}),
|
|
359
|
+
},
|
|
360
|
+
codexHome: home,
|
|
361
|
+
});
|
|
362
|
+
expect(prepared.notes).toContain('PAPERCLIP_CODEX_PROVIDERS: model_provider "bad" does not match any usable provider entry; custom providers ignored.');
|
|
363
|
+
const content = await readConfigToml(home);
|
|
364
|
+
expect(content).toBe("model = \"gpt-5.1-codex\"\n");
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
//# sourceMappingURL=runtime-config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-config.test.js","sourceRoot":"","sources":["../../src/server/runtime-config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdapterSkillContext, AdapterSkillSnapshot } from "@tickernelz/paperclip-pro-adapter-utils";
|
|
2
|
+
export declare function listCodexSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot>;
|
|
3
|
+
export declare function syncCodexSkills(ctx: AdapterSkillContext, _desiredSkills: string[]): Promise<AdapterSkillSnapshot>;
|
|
4
|
+
export declare function resolveCodexDesiredSkillNames(config: Record<string, unknown>, availableEntries: Array<{
|
|
5
|
+
key: string;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
}>): string[];
|
|
8
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yCAAyC,CAAC;AA0BjD,wBAAsB,eAAe,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE7F;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,mBAAmB,EACxB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,YAG7D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { buildRuntimeMountedSkillSnapshot, readPaperclipRuntimeSkillEntries, resolveLegacyPaperclipDesiredSkillNames, resolvePaperclipDesiredSkillNames, } from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
|
|
4
|
+
const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
async function buildCodexSkillSnapshot(config, adapterType) {
|
|
6
|
+
const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);
|
|
7
|
+
const desiredSkills = adapterType === "paperclip_runner"
|
|
8
|
+
? resolvePaperclipDesiredSkillNames(config, availableEntries)
|
|
9
|
+
: resolveLegacyPaperclipDesiredSkillNames(config, availableEntries);
|
|
10
|
+
return buildRuntimeMountedSkillSnapshot({
|
|
11
|
+
adapterType,
|
|
12
|
+
availableEntries,
|
|
13
|
+
desiredSkills,
|
|
14
|
+
configuredDetail: "Will be linked into the effective CODEX_HOME/skills/ directory on the next run.",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export async function listCodexSkills(ctx) {
|
|
18
|
+
return buildCodexSkillSnapshot(ctx.config, ctx.adapterType);
|
|
19
|
+
}
|
|
20
|
+
export async function syncCodexSkills(ctx, _desiredSkills) {
|
|
21
|
+
return buildCodexSkillSnapshot(ctx.config, ctx.adapterType);
|
|
22
|
+
}
|
|
23
|
+
export function resolveCodexDesiredSkillNames(config, availableEntries) {
|
|
24
|
+
return resolveLegacyPaperclipDesiredSkillNames(config, availableEntries);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,OAAO,EACL,gCAAgC,EAChC,gCAAgC,EAChC,uCAAuC,EACvC,iCAAiC,GAClC,MAAM,sDAAsD,CAAC;AAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjE,KAAK,UAAU,uBAAuB,CACpC,MAA+B,EAC/B,WAAmB;IAEnB,MAAM,gBAAgB,GAAG,MAAM,gCAAgC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,WAAW,KAAK,kBAAkB;QACtD,CAAC,CAAC,iCAAiC,CAAC,MAAM,EAAE,gBAAgB,CAAC;QAC7D,CAAC,CAAC,uCAAuC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACtE,OAAO,gCAAgC,CAAC;QACtC,WAAW;QACX,gBAAgB;QAChB,aAAa;QACb,gBAAgB,EAAE,iFAAiF;KACpG,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAwB;IAC5D,OAAO,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAwB,EACxB,cAAwB;IAExB,OAAO,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,MAA+B,EAC/B,gBAA4D;IAE5D,OAAO,uCAAuC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AdapterEnvironmentTestContext, AdapterEnvironmentTestResult } from "@tickernelz/paperclip-pro-adapter-utils";
|
|
2
|
+
export declare function testEnvironment(ctx: AdapterEnvironmentTestContext): Promise<AdapterEnvironmentTestResult>;
|
|
3
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,yCAAyC,CAAC;AAiPjD,wBAAsB,eAAe,CACnC,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAiSvC"}
|