@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 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-copyback.test.js","sourceRoot":"","sources":["../../src/server/codex-auth-copyback.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
|
|
3
|
+
// Co-change notice: parseAuth below mirrors hasUsableAuthPayload in
|
|
4
|
+
// packages/adapters/codex-local/src/server/codex-home.ts. If the auth format
|
|
5
|
+
// changes (new shape, renamed field), update both sites together.
|
|
6
|
+
function parseAuth(filePath) {
|
|
7
|
+
let parsed;
|
|
8
|
+
try {
|
|
9
|
+
parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
10
|
+
} catch {
|
|
11
|
+
return { kind: "unusable" };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
15
|
+
return { kind: "unusable" };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (typeof parsed.OPENAI_API_KEY === "string" && parsed.OPENAI_API_KEY.trim().length > 0) {
|
|
19
|
+
return { kind: "apikey" };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const tokens = parsed.tokens;
|
|
23
|
+
if (tokens === null || typeof tokens !== "object" || Array.isArray(tokens)) {
|
|
24
|
+
return { kind: "unusable" };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const accountId = typeof tokens.account_id === "string" ? tokens.account_id.trim() : "";
|
|
28
|
+
const hasTokenMaterial = ["id_token", "access_token", "refresh_token"].some((key) => {
|
|
29
|
+
const value = tokens[key];
|
|
30
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
31
|
+
});
|
|
32
|
+
if (!accountId || !hasTokenMaterial) {
|
|
33
|
+
return { kind: "unusable" };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const lastRefresh = typeof parsed.last_refresh === "string" ? Date.parse(parsed.last_refresh) : NaN;
|
|
37
|
+
return {
|
|
38
|
+
kind: "subscription",
|
|
39
|
+
accountId,
|
|
40
|
+
lastRefresh: Number.isFinite(lastRefresh) ? lastRefresh : null,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// This predicate answers a single, direction-agnostic question: should the
|
|
45
|
+
// caller replace the `destination` auth.json with the `source` auth.json? The
|
|
46
|
+
// caller picks which copy is source and which is destination from its own frame
|
|
47
|
+
// of reference (an inbound restore, an outbound copy-back, …) purely by argument
|
|
48
|
+
// order — there is no `--direction` flag and no hard-coded sandbox/host notion:
|
|
49
|
+
//
|
|
50
|
+
// argv[0] (first positional) = source auth.json path
|
|
51
|
+
// argv[1] (second positional) = destination auth.json path
|
|
52
|
+
//
|
|
53
|
+
// The predicate has two modes, selected by a leading positional flag:
|
|
54
|
+
//
|
|
55
|
+
// default (no flag) — fail closed to the destination; used by the host default
|
|
56
|
+
// store, whose fail-closed behavior must never change. An absent or
|
|
57
|
+
// unusable destination keeps the destination (no seed from empty).
|
|
58
|
+
// --seed-if-dest-absent — the opt-in cache-slot mode; used only by the
|
|
59
|
+
// per-identity cache slot helper. It ADDS one behavior on top of the default:
|
|
60
|
+
// when the destination is unusable (absent or unparseable) AND the source is
|
|
61
|
+
// a usable subscription credential, use the source (fill the empty slot). It
|
|
62
|
+
// never relaxes the different-identity, api-key, or unusable-source guards.
|
|
63
|
+
//
|
|
64
|
+
// A leading positional flag (not an environment variable) keeps the mode
|
|
65
|
+
// explicit per call, so a host-default two-path call can never enter seed mode.
|
|
66
|
+
//
|
|
67
|
+
// Exit contract. Exit 10 = use source; exit 20 = keep destination; exit 22 =
|
|
68
|
+
// keep destination, the source `last_refresh` sat further ahead of the host
|
|
69
|
+
// clock than the plausible skew allowance. The predicate only ever reads the
|
|
70
|
+
// two files and exits with a code — it never prints token bytes.
|
|
71
|
+
const USE_SOURCE = 10;
|
|
72
|
+
const KEEP_DESTINATION = 20;
|
|
73
|
+
const IMPLAUSIBLE_LAST_REFRESH = 22;
|
|
74
|
+
const SEED_IF_DEST_ABSENT_FLAG = "--seed-if-dest-absent";
|
|
75
|
+
|
|
76
|
+
// A `last_refresh` records an event that already happened, so an honest value
|
|
77
|
+
// always sits at or before the host clock. Only clock skew between a sandbox
|
|
78
|
+
// and the host explains a small future value. Five minutes is larger than
|
|
79
|
+
// real skew on a time-synchronised host, and it is short enough that a source
|
|
80
|
+
// which claims a `last_refresh` further ahead than this cannot be trusted.
|
|
81
|
+
const MAX_FUTURE_LAST_REFRESH_SKEW_MS = 5 * 60 * 1000;
|
|
82
|
+
|
|
83
|
+
// `decide` takes already-parsed `{ kind, accountId, lastRefresh }` shapes plus
|
|
84
|
+
// a caller-supplied `nowMs` and the `seedIfDestAbsent` flag, so a test can
|
|
85
|
+
// drive the exact skew bound without spawning a process and racing wall-clock
|
|
86
|
+
// drift. Guard order, first match wins:
|
|
87
|
+
// 1. Seed mode, the destination is unusable, and the source is a usable
|
|
88
|
+
// subscription credential -> USE_SOURCE, unless the source fails the
|
|
89
|
+
// skew bound in step 3 below, in which case the absent slot stays
|
|
90
|
+
// absent (IMPLAUSIBLE_LAST_REFRESH). A poisoned seed would out-live
|
|
91
|
+
// every honest refresh, since nothing could ever compare as "strictly
|
|
92
|
+
// newer" than an unbounded future value, so the bound applies here too.
|
|
93
|
+
// 2. Either side unusable, a kind mismatch, the destination is an api-key
|
|
94
|
+
// credential, or the two sides carry a different account_id ->
|
|
95
|
+
// KEEP_DESTINATION.
|
|
96
|
+
// 3. The source `last_refresh` sits further ahead of `nowMs` than
|
|
97
|
+
// MAX_FUTURE_LAST_REFRESH_SKEW_MS -> IMPLAUSIBLE_LAST_REFRESH. Only the
|
|
98
|
+
// source is bounded, and only against the caller's clock: the source is
|
|
99
|
+
// the sandbox-supplied side, so it must never supply the reference time.
|
|
100
|
+
// 4. The source `last_refresh` is strictly greater than the destination's
|
|
101
|
+
// -> USE_SOURCE.
|
|
102
|
+
// 5. Otherwise (a tie, a null value on either side, or an older source) ->
|
|
103
|
+
// KEEP_DESTINATION.
|
|
104
|
+
function decide(source, destination, nowMs, seedIfDestAbsent) {
|
|
105
|
+
const sourceIsImplausible =
|
|
106
|
+
source.lastRefresh !== null &&
|
|
107
|
+
source.lastRefresh - nowMs > MAX_FUTURE_LAST_REFRESH_SKEW_MS;
|
|
108
|
+
|
|
109
|
+
// Seed mode only: fill an ABSENT (unusable) destination slot from a usable
|
|
110
|
+
// subscription source. A subscription-kind source is guaranteed usable and to
|
|
111
|
+
// carry a real account_id (parseAuth returns "subscription" only then), so this
|
|
112
|
+
// is never a random pick. This branch changes ONLY the destination-unusable
|
|
113
|
+
// case; the api-key and unusable-source guards below still keep the destination.
|
|
114
|
+
if (
|
|
115
|
+
seedIfDestAbsent &&
|
|
116
|
+
destination.kind === "unusable" &&
|
|
117
|
+
source.kind === "subscription"
|
|
118
|
+
) {
|
|
119
|
+
return sourceIsImplausible ? IMPLAUSIBLE_LAST_REFRESH : USE_SOURCE;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Fail closed to the destination unless both sides are the same usable,
|
|
123
|
+
// subscription-kind identity — an unusable side, an api-key credential, a kind
|
|
124
|
+
// mismatch, or a different account_id all keep the destination copy.
|
|
125
|
+
if (
|
|
126
|
+
destination.kind === "unusable" ||
|
|
127
|
+
source.kind === "unusable" ||
|
|
128
|
+
source.kind !== destination.kind ||
|
|
129
|
+
destination.kind === "apikey" ||
|
|
130
|
+
source.accountId !== destination.accountId
|
|
131
|
+
) {
|
|
132
|
+
return KEEP_DESTINATION;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (sourceIsImplausible) {
|
|
136
|
+
return IMPLAUSIBLE_LAST_REFRESH;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Use the source credential only when it is strictly fresher: both sides must
|
|
140
|
+
// carry a parseable last_refresh and the source one must be strictly greater.
|
|
141
|
+
// Ties and null/unparseable freshness keep the destination copy so a spent
|
|
142
|
+
// single-use refresh token is never written over a good one.
|
|
143
|
+
if (
|
|
144
|
+
source.lastRefresh !== null &&
|
|
145
|
+
destination.lastRefresh !== null &&
|
|
146
|
+
source.lastRefresh > destination.lastRefresh
|
|
147
|
+
) {
|
|
148
|
+
return USE_SOURCE;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return KEEP_DESTINATION;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (require.main === module) {
|
|
155
|
+
const rawArgs = process.argv.slice(2);
|
|
156
|
+
const seedIfDestAbsent = rawArgs[0] === SEED_IF_DEST_ABSENT_FLAG;
|
|
157
|
+
const [sourceAuthPath, destinationAuthPath] = seedIfDestAbsent ? rawArgs.slice(1) : rawArgs;
|
|
158
|
+
const sourceAuth = parseAuth(sourceAuthPath);
|
|
159
|
+
const destinationAuth = parseAuth(destinationAuthPath);
|
|
160
|
+
process.exit(decide(sourceAuth, destinationAuth, Date.now(), seedIfDestAbsent));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
module.exports = {
|
|
164
|
+
decide,
|
|
165
|
+
parseAuth,
|
|
166
|
+
USE_SOURCE,
|
|
167
|
+
KEEP_DESTINATION,
|
|
168
|
+
IMPLAUSIBLE_LAST_REFRESH,
|
|
169
|
+
MAX_FUTURE_LAST_REFRESH_SKEW_MS,
|
|
170
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Exit code: install the source credential over the destination. */
|
|
2
|
+
export declare const USE_SOURCE_EXIT = 10;
|
|
3
|
+
/** Exit code: keep the destination credential. */
|
|
4
|
+
export declare const KEEP_DESTINATION_EXIT = 20;
|
|
5
|
+
/** Exit code: keep the destination; the source `last_refresh` was implausibly far in the future. */
|
|
6
|
+
export declare const IMPLAUSIBLE_LAST_REFRESH_EXIT = 22;
|
|
7
|
+
export interface DecideCodexAuthMergeOptions {
|
|
8
|
+
/** Opt in to the cache-slot seed mode: fill an absent destination from a
|
|
9
|
+
* usable subscription source. */
|
|
10
|
+
seedIfDestAbsent?: boolean;
|
|
11
|
+
/** The caller name that prefixes a predicate error, for example
|
|
12
|
+
* `codex auth cache`. */
|
|
13
|
+
errorLabel: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Runs the shared decision predicate and returns its exit code (10, 20, or
|
|
17
|
+
* 22). Any other exit, or a failure to run `node`, is a hard failure: this
|
|
18
|
+
* throws so a broken predicate is never mistaken for a "keep destination"
|
|
19
|
+
* decision.
|
|
20
|
+
*/
|
|
21
|
+
export declare function decideCodexAuthMerge(sourcePath: string, destinationPath: string, options: DecideCodexAuthMergeOptions): Promise<number>;
|
|
22
|
+
//# sourceMappingURL=codex-auth-merge-decision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-merge-decision.d.ts","sourceRoot":"","sources":["../../src/server/codex-auth-merge-decision.ts"],"names":[],"mappings":"AAyBA,qEAAqE;AACrE,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,oGAAoG;AACpG,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,WAAW,2BAA2B;IAC1C;sCACkC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;8BAC0B;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
const execFile = promisify(execFileCallback);
|
|
5
|
+
// The single identity-and-freshness predicate. Every credential writer that must
|
|
6
|
+
// answer "should the caller replace `destination` with `source`?" runs this one
|
|
7
|
+
// predicate: the inbound restore, the outbound copy-back, the per-identity cache
|
|
8
|
+
// slot, and the device-login promotion. The predicate lives in
|
|
9
|
+
// `codex-auth-merge-decision.cjs`. It reads only the two files, and it exits with
|
|
10
|
+
// a code; it never prints token bytes. Argument order sets source and
|
|
11
|
+
// destination (first = source, second = destination), so the caller frames the
|
|
12
|
+
// direction. Exit 10 = use source; exit 20 = keep destination; exit 22 = keep
|
|
13
|
+
// destination, the source `last_refresh` sat further ahead of the host clock
|
|
14
|
+
// than the plausible skew allowance. The leading `--seed-if-dest-absent` flag
|
|
15
|
+
// adds one behavior: fill an absent destination slot from a usable
|
|
16
|
+
// subscription source. This module gives every caller one shared entry point,
|
|
17
|
+
// so the predicate contract can never drift between callers.
|
|
18
|
+
const DECISION_SCRIPT_PATH = fileURLToPath(new URL("./codex-auth-merge-decision.cjs", import.meta.url));
|
|
19
|
+
const SEED_IF_DEST_ABSENT_FLAG = "--seed-if-dest-absent";
|
|
20
|
+
/** Exit code: install the source credential over the destination. */
|
|
21
|
+
export const USE_SOURCE_EXIT = 10;
|
|
22
|
+
/** Exit code: keep the destination credential. */
|
|
23
|
+
export const KEEP_DESTINATION_EXIT = 20;
|
|
24
|
+
/** Exit code: keep the destination; the source `last_refresh` was implausibly far in the future. */
|
|
25
|
+
export const IMPLAUSIBLE_LAST_REFRESH_EXIT = 22;
|
|
26
|
+
const KNOWN_EXIT_CODES = new Set([USE_SOURCE_EXIT, KEEP_DESTINATION_EXIT, IMPLAUSIBLE_LAST_REFRESH_EXIT]);
|
|
27
|
+
/**
|
|
28
|
+
* Runs the shared decision predicate and returns its exit code (10, 20, or
|
|
29
|
+
* 22). Any other exit, or a failure to run `node`, is a hard failure: this
|
|
30
|
+
* throws so a broken predicate is never mistaken for a "keep destination"
|
|
31
|
+
* decision.
|
|
32
|
+
*/
|
|
33
|
+
export async function decideCodexAuthMerge(sourcePath, destinationPath, options) {
|
|
34
|
+
const args = options.seedIfDestAbsent
|
|
35
|
+
? [DECISION_SCRIPT_PATH, SEED_IF_DEST_ABSENT_FLAG, sourcePath, destinationPath]
|
|
36
|
+
: [DECISION_SCRIPT_PATH, sourcePath, destinationPath];
|
|
37
|
+
try {
|
|
38
|
+
await execFile("node", args);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const code = error.code;
|
|
42
|
+
if (typeof code === "number" && KNOWN_EXIT_CODES.has(code)) {
|
|
43
|
+
return code;
|
|
44
|
+
}
|
|
45
|
+
const detail = typeof code === "string"
|
|
46
|
+
? `node could not be executed (${code})`
|
|
47
|
+
: typeof code === "number"
|
|
48
|
+
? `unexpected predicate exit code ${code}`
|
|
49
|
+
: error instanceof Error
|
|
50
|
+
? error.message
|
|
51
|
+
: String(error);
|
|
52
|
+
throw new Error(`${options.errorLabel} decision predicate failed: ${detail}`);
|
|
53
|
+
}
|
|
54
|
+
// `execFile` resolved, so the predicate exited 0. The predicate always exits
|
|
55
|
+
// 10, 20, or 22, so a clean exit 0 is unexpected; fail loud.
|
|
56
|
+
throw new Error(`${options.errorLabel} decision predicate exited 0 (expected 10, 20, or 22)`);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=codex-auth-merge-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-merge-decision.js","sourceRoot":"","sources":["../../src/server/codex-auth-merge-decision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAE7C,iFAAiF;AACjF,gFAAgF;AAChF,iFAAiF;AACjF,+DAA+D;AAC/D,kFAAkF;AAClF,sEAAsE;AACtE,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAC9E,6DAA6D;AAE7D,MAAM,oBAAoB,GAAG,aAAa,CACxC,IAAI,GAAG,CAAC,iCAAiC,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAC5D,CAAC;AACF,MAAM,wBAAwB,GAAG,uBAAuB,CAAC;AAEzD,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,kDAAkD;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,oGAAoG;AACpG,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEhD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,qBAAqB,EAAE,6BAA6B,CAAC,CAAC,CAAC;AAW1G;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,eAAuB,EACvB,OAAoC;IAEpC,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB;QACnC,CAAC,CAAC,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,UAAU,EAAE,eAAe,CAAC;QAC/E,CAAC,CAAC,CAAC,oBAAoB,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;QAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GACV,OAAO,IAAI,KAAK,QAAQ;YACtB,CAAC,CAAC,+BAA+B,IAAI,GAAG;YACxC,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,CAAC,kCAAkC,IAAI,EAAE;gBAC1C,CAAC,CAAC,KAAK,YAAY,KAAK;oBACtB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,6EAA6E;IAC7E,6DAA6D;IAC7D,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,UAAU,uDAAuD,CAC7E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-merge-decision.test.d.ts","sourceRoot":"","sources":["../../src/server/codex-auth-merge-decision.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { promisify } from "node:util";
|
|
8
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
9
|
+
const execFile = promisify(execFileCallback);
|
|
10
|
+
// The exact-boundary cases below drive the predicate's pure `decide` function
|
|
11
|
+
// directly (via `require`, never spawning a process), so the skew bound can be
|
|
12
|
+
// tested to the exact millisecond without racing subprocess-spawn wall-clock
|
|
13
|
+
// drift. Every other case in this file drives the REAL `.cjs` through a
|
|
14
|
+
// spawned `node` process (no stub), matching how the wrapper invokes it in
|
|
15
|
+
// production.
|
|
16
|
+
const decisionModule = createRequire(import.meta.url)(fileURLToPath(new URL("./codex-auth-merge-decision.cjs", import.meta.url)));
|
|
17
|
+
const { decide, IMPLAUSIBLE_LAST_REFRESH, MAX_FUTURE_LAST_REFRESH_SKEW_MS } = decisionModule;
|
|
18
|
+
// This suite pins the opt-in seed mode of the single decision predicate. The
|
|
19
|
+
// default (no-flag) call keeps the fail-closed host-default contract unchanged.
|
|
20
|
+
// The leading positional `--seed-if-dest-absent` flag adds one behaviour: fill
|
|
21
|
+
// an ABSENT destination slot from a usable subscription source. The flag never
|
|
22
|
+
// relaxes the different-identity, api-key, or unusable-source guards, and a
|
|
23
|
+
// default two-path call can never enter seed mode.
|
|
24
|
+
describe("codex-auth-merge-decision predicate seed mode", () => {
|
|
25
|
+
const cleanupDirs = [];
|
|
26
|
+
afterEach(async () => {
|
|
27
|
+
while (cleanupDirs.length > 0) {
|
|
28
|
+
const dir = cleanupDirs.pop();
|
|
29
|
+
if (!dir)
|
|
30
|
+
continue;
|
|
31
|
+
await rm(dir, { recursive: true, force: true }).catch(() => undefined);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
const decisionScriptPath = fileURLToPath(new URL("./codex-auth-merge-decision.cjs", import.meta.url));
|
|
35
|
+
const USE_SOURCE = 10;
|
|
36
|
+
const KEEP_DESTINATION = 20;
|
|
37
|
+
const NEWER = "2026-07-09T02:00:00Z";
|
|
38
|
+
const OLDER = "2026-07-09T01:00:00Z";
|
|
39
|
+
function subscriptionAuth(input) {
|
|
40
|
+
const suffix = input.marker ?? input.accountId;
|
|
41
|
+
return JSON.stringify({
|
|
42
|
+
tokens: {
|
|
43
|
+
id_token: `id-token-${suffix}`,
|
|
44
|
+
access_token: `access-token-${suffix}`,
|
|
45
|
+
refresh_token: `refresh-token-${suffix}`,
|
|
46
|
+
account_id: input.accountId,
|
|
47
|
+
},
|
|
48
|
+
...(input.lastRefresh ? { last_refresh: input.lastRefresh } : {}),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function apiKeyAuth(marker) {
|
|
52
|
+
return JSON.stringify({ OPENAI_API_KEY: `sk-${marker}` });
|
|
53
|
+
}
|
|
54
|
+
const ABSENT = Symbol("absent");
|
|
55
|
+
async function runDecision(input) {
|
|
56
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "paperclip-codex-seed-decision-"));
|
|
57
|
+
cleanupDirs.push(dir);
|
|
58
|
+
const sourcePath = path.join(dir, "source-auth.json");
|
|
59
|
+
const destinationPath = path.join(dir, "destination-auth.json");
|
|
60
|
+
await writeFile(sourcePath, input.sourceAuth, { mode: 0o600 });
|
|
61
|
+
if (input.destinationAuth !== ABSENT) {
|
|
62
|
+
await writeFile(destinationPath, input.destinationAuth, { mode: 0o600 });
|
|
63
|
+
}
|
|
64
|
+
// The flag, when present, is the leading positional argument, parsed before
|
|
65
|
+
// the two path arguments.
|
|
66
|
+
const args = input.seed
|
|
67
|
+
? [decisionScriptPath, "--seed-if-dest-absent", sourcePath, destinationPath]
|
|
68
|
+
: [decisionScriptPath, sourcePath, destinationPath];
|
|
69
|
+
try {
|
|
70
|
+
await execFile("node", args);
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const failure = error;
|
|
75
|
+
if (typeof failure.code === "number")
|
|
76
|
+
return failure.code;
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
it("default mode keeps destination when destination is absent (host-default fail-closed)", async () => {
|
|
81
|
+
const code = await runDecision({
|
|
82
|
+
sourceAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER }),
|
|
83
|
+
destinationAuth: ABSENT,
|
|
84
|
+
});
|
|
85
|
+
expect(code).toBe(KEEP_DESTINATION);
|
|
86
|
+
});
|
|
87
|
+
it("seed mode uses source when destination is absent and source is a usable subscription credential", async () => {
|
|
88
|
+
const code = await runDecision({
|
|
89
|
+
seed: true,
|
|
90
|
+
sourceAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER }),
|
|
91
|
+
destinationAuth: ABSENT,
|
|
92
|
+
});
|
|
93
|
+
expect(code).toBe(USE_SOURCE);
|
|
94
|
+
});
|
|
95
|
+
it("seed mode uses source when destination is unparseable and source is a usable subscription credential", async () => {
|
|
96
|
+
const code = await runDecision({
|
|
97
|
+
seed: true,
|
|
98
|
+
sourceAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER }),
|
|
99
|
+
destinationAuth: "{not valid json",
|
|
100
|
+
});
|
|
101
|
+
expect(code).toBe(USE_SOURCE);
|
|
102
|
+
});
|
|
103
|
+
it("seed mode still keeps destination when source is apikey or unusable", async () => {
|
|
104
|
+
const apikeyCode = await runDecision({
|
|
105
|
+
seed: true,
|
|
106
|
+
sourceAuth: apiKeyAuth("source"),
|
|
107
|
+
destinationAuth: ABSENT,
|
|
108
|
+
});
|
|
109
|
+
expect(apikeyCode).toBe(KEEP_DESTINATION);
|
|
110
|
+
const unusableCode = await runDecision({
|
|
111
|
+
seed: true,
|
|
112
|
+
sourceAuth: "{not valid json",
|
|
113
|
+
destinationAuth: ABSENT,
|
|
114
|
+
});
|
|
115
|
+
expect(unusableCode).toBe(KEEP_DESTINATION);
|
|
116
|
+
});
|
|
117
|
+
it("seed mode still keeps destination when destination holds a different account_id", async () => {
|
|
118
|
+
const code = await runDecision({
|
|
119
|
+
seed: true,
|
|
120
|
+
sourceAuth: subscriptionAuth({ accountId: "acct-x", lastRefresh: NEWER }),
|
|
121
|
+
destinationAuth: subscriptionAuth({ accountId: "acct-y", lastRefresh: OLDER }),
|
|
122
|
+
});
|
|
123
|
+
expect(code).toBe(KEEP_DESTINATION);
|
|
124
|
+
});
|
|
125
|
+
it("seed mode keeps the same-identity strictly-newer contract for a present destination", async () => {
|
|
126
|
+
const newerCode = await runDecision({
|
|
127
|
+
seed: true,
|
|
128
|
+
sourceAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER, marker: "src" }),
|
|
129
|
+
destinationAuth: subscriptionAuth({ accountId: "acct", lastRefresh: OLDER, marker: "dst" }),
|
|
130
|
+
});
|
|
131
|
+
expect(newerCode).toBe(USE_SOURCE);
|
|
132
|
+
const tieCode = await runDecision({
|
|
133
|
+
seed: true,
|
|
134
|
+
sourceAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER, marker: "src" }),
|
|
135
|
+
destinationAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER, marker: "dst" }),
|
|
136
|
+
});
|
|
137
|
+
expect(tieCode).toBe(KEEP_DESTINATION);
|
|
138
|
+
});
|
|
139
|
+
it("the leading positional --seed-if-dest-absent flag is parsed before the two path arguments; a default two-path call never enters seed mode", async () => {
|
|
140
|
+
// Identical inputs; only the leading flag differs. Absent destination:
|
|
141
|
+
// default keeps, seed uses source. This proves a host-default two-path call
|
|
142
|
+
// (no flag) can never seed.
|
|
143
|
+
const defaultCode = await runDecision({
|
|
144
|
+
sourceAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER }),
|
|
145
|
+
destinationAuth: ABSENT,
|
|
146
|
+
});
|
|
147
|
+
const seedCode = await runDecision({
|
|
148
|
+
seed: true,
|
|
149
|
+
sourceAuth: subscriptionAuth({ accountId: "acct", lastRefresh: NEWER }),
|
|
150
|
+
destinationAuth: ABSENT,
|
|
151
|
+
});
|
|
152
|
+
expect(defaultCode).toBe(KEEP_DESTINATION);
|
|
153
|
+
expect(seedCode).toBe(USE_SOURCE);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
// This suite pins the host-clock bound on the source `last_refresh`. A
|
|
157
|
+
// `last_refresh` records an event that already happened, so an honest value
|
|
158
|
+
// never sits far ahead of the host clock; only clock skew explains a small
|
|
159
|
+
// future value. A source that claims a value further ahead than
|
|
160
|
+
// `MAX_FUTURE_LAST_REFRESH_SKEW_MS` cannot be trusted, since a same-account
|
|
161
|
+
// sandbox that controls its own `auth.json` could otherwise pin an unbounded
|
|
162
|
+
// future timestamp that every later honest refresh compares as older than.
|
|
163
|
+
// These cases drive `decide` directly with an explicit `nowMs`, so the bound
|
|
164
|
+
// is proven to the exact millisecond and never depends on the real clock.
|
|
165
|
+
describe("codex-auth-merge-decision predicate: host-clock bound on last_refresh", () => {
|
|
166
|
+
const USE_SOURCE = 10;
|
|
167
|
+
const KEEP_DESTINATION = 20;
|
|
168
|
+
function subscription(accountId, lastRefresh) {
|
|
169
|
+
return { kind: "subscription", accountId, lastRefresh };
|
|
170
|
+
}
|
|
171
|
+
it("keeps the destination when the source last_refresh sits one millisecond beyond the bound", () => {
|
|
172
|
+
const nowMs = Date.now();
|
|
173
|
+
const source = subscription("acct", nowMs + MAX_FUTURE_LAST_REFRESH_SKEW_MS + 1);
|
|
174
|
+
const destination = subscription("acct", nowMs - 60_000);
|
|
175
|
+
expect(decide(source, destination, nowMs, false)).toBe(IMPLAUSIBLE_LAST_REFRESH);
|
|
176
|
+
});
|
|
177
|
+
it("uses the source when the source last_refresh sits exactly at the bound", () => {
|
|
178
|
+
const nowMs = Date.now();
|
|
179
|
+
const source = subscription("acct", nowMs + MAX_FUTURE_LAST_REFRESH_SKEW_MS);
|
|
180
|
+
const destination = subscription("acct", nowMs - 60_000);
|
|
181
|
+
expect(decide(source, destination, nowMs, false)).toBe(USE_SOURCE);
|
|
182
|
+
});
|
|
183
|
+
it("still uses the source for an ordinary same-account, strictly-newer, past timestamp", () => {
|
|
184
|
+
const nowMs = Date.now();
|
|
185
|
+
const source = subscription("acct", nowMs - 60_000);
|
|
186
|
+
const destination = subscription("acct", nowMs - 120_000);
|
|
187
|
+
expect(decide(source, destination, nowMs, false)).toBe(USE_SOURCE);
|
|
188
|
+
});
|
|
189
|
+
it("measures the bound against the host clock and not against a value embedded in either payload", () => {
|
|
190
|
+
// Fixed instants; only the caller-supplied `nowMs` moves between the two
|
|
191
|
+
// assertions, so a passing/failing bound can only be explained by the
|
|
192
|
+
// caller's clock, never by a value embedded in either payload.
|
|
193
|
+
const sourceLastRefresh = 2_000_000_000_000;
|
|
194
|
+
const destinationLastRefresh = 1_000_000_000_000;
|
|
195
|
+
const source = subscription("acct", sourceLastRefresh);
|
|
196
|
+
const destination = subscription("acct", destinationLastRefresh);
|
|
197
|
+
expect(decide(source, destination, sourceLastRefresh - MAX_FUTURE_LAST_REFRESH_SKEW_MS, false)).toBe(USE_SOURCE);
|
|
198
|
+
expect(decide(source, destination, sourceLastRefresh - MAX_FUTURE_LAST_REFRESH_SKEW_MS - 1, false)).toBe(IMPLAUSIBLE_LAST_REFRESH);
|
|
199
|
+
});
|
|
200
|
+
it("keeps the destination for a same-identity source whose kind or account guard would otherwise fire, regardless of the bound", () => {
|
|
201
|
+
// A kind mismatch or a different account_id already keeps the destination
|
|
202
|
+
// before the bound runs, so an implausible source never surfaces as
|
|
203
|
+
// IMPLAUSIBLE_LAST_REFRESH when a different guard already applies.
|
|
204
|
+
const nowMs = Date.now();
|
|
205
|
+
const implausibleLastRefresh = nowMs + MAX_FUTURE_LAST_REFRESH_SKEW_MS + 1;
|
|
206
|
+
const differentAccount = decide(subscription("acct-x", implausibleLastRefresh), subscription("acct-y", nowMs - 60_000), nowMs, false);
|
|
207
|
+
expect(differentAccount).toBe(KEEP_DESTINATION);
|
|
208
|
+
});
|
|
209
|
+
// Seed mode fills an ABSENT destination slot from a usable subscription
|
|
210
|
+
// source. The bound applies there too: an absent destination that got
|
|
211
|
+
// seeded with an implausible future last_refresh would never be
|
|
212
|
+
// refreshable again, since no later honest refresh could ever compare as
|
|
213
|
+
// "strictly newer" than an unbounded future value. The seed-mode source in
|
|
214
|
+
// production is the sandbox's own `auth.json`
|
|
215
|
+
// (see `writeCodexAuthCacheEntry` in codex-auth-cache.ts), so this is the
|
|
216
|
+
// same untrusted input the write-back guard defends against.
|
|
217
|
+
it("seed mode keeps an absent destination slot absent when the source last_refresh is implausibly far in the future", () => {
|
|
218
|
+
const nowMs = Date.now();
|
|
219
|
+
const source = subscription("acct", nowMs + MAX_FUTURE_LAST_REFRESH_SKEW_MS + 1);
|
|
220
|
+
const destination = { kind: "unusable", lastRefresh: null };
|
|
221
|
+
expect(decide(source, destination, nowMs, true)).toBe(IMPLAUSIBLE_LAST_REFRESH);
|
|
222
|
+
});
|
|
223
|
+
it("seed mode still fills an absent destination slot when the source last_refresh sits at or before the bound", () => {
|
|
224
|
+
const nowMs = Date.now();
|
|
225
|
+
const source = subscription("acct", nowMs + MAX_FUTURE_LAST_REFRESH_SKEW_MS);
|
|
226
|
+
const destination = { kind: "unusable", lastRefresh: null };
|
|
227
|
+
expect(decide(source, destination, nowMs, true)).toBe(USE_SOURCE);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=codex-auth-merge-decision.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-merge-decision.test.js","sourceRoot":"","sources":["../../src/server/codex-auth-merge-decision.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
if [ "$#" -ne 2 ]; then
|
|
4
|
+
echo "Usage: codex-auth-merge-extract.sh <asset-dir> <asset-tar>" >&2
|
|
5
|
+
exit 1
|
|
6
|
+
fi
|
|
7
|
+
|
|
8
|
+
asset_dir=$1
|
|
9
|
+
asset_tar=$2
|
|
10
|
+
auth_name=auth.json
|
|
11
|
+
stage_root="$asset_dir.paperclip-extract.$$"
|
|
12
|
+
stage_dir="$stage_root/stage"
|
|
13
|
+
preserve_dir="$stage_root/preserve"
|
|
14
|
+
sandbox_auth="$asset_dir/$auth_name"
|
|
15
|
+
host_auth="$stage_dir/$auth_name"
|
|
16
|
+
preserve_auth="$preserve_dir/$auth_name"
|
|
17
|
+
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) || exit 1
|
|
18
|
+
decision_script="$script_dir/codex-auth-merge-decision.cjs"
|
|
19
|
+
|
|
20
|
+
cleanup() {
|
|
21
|
+
rm -rf "$stage_root" "$asset_tar"
|
|
22
|
+
}
|
|
23
|
+
trap cleanup EXIT HUP INT TERM
|
|
24
|
+
rm -rf "$stage_root" &&
|
|
25
|
+
mkdir -p "$stage_dir" "$preserve_dir" &&
|
|
26
|
+
tar -xf "$asset_tar" -C "$stage_dir" || exit 1
|
|
27
|
+
|
|
28
|
+
keep_sandbox=0
|
|
29
|
+
if [ -f "$sandbox_auth" ]; then
|
|
30
|
+
if command -v node >/dev/null 2>&1; then
|
|
31
|
+
node "$decision_script" "$sandbox_auth" "$host_auth"
|
|
32
|
+
decision_rc=$?
|
|
33
|
+
if [ "$decision_rc" -eq 10 ]; then
|
|
34
|
+
keep_sandbox=1
|
|
35
|
+
else
|
|
36
|
+
keep_sandbox=0
|
|
37
|
+
fi
|
|
38
|
+
else
|
|
39
|
+
echo "[paperclip] node not found in PATH; cannot evaluate auth-merge decision - aborting sandbox restore" >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
if [ "$keep_sandbox" -eq 1 ]; then
|
|
45
|
+
if ! ( umask 077 && rm -f "$preserve_auth" && cat "$sandbox_auth" > "$preserve_auth" ); then
|
|
46
|
+
keep_sandbox=0
|
|
47
|
+
fi
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
rm -rf "$asset_dir" || exit 1
|
|
51
|
+
mkdir -p "$asset_dir" || exit 1
|
|
52
|
+
find "$stage_dir" -mindepth 1 -maxdepth 1 ! -name "$auth_name" -exec mv -f -- {} "$asset_dir/" \; || exit 1
|
|
53
|
+
|
|
54
|
+
source_auth="$host_auth"
|
|
55
|
+
if [ "$keep_sandbox" -eq 1 ] && [ -f "$preserve_auth" ]; then
|
|
56
|
+
source_auth="$preserve_auth"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# When neither the shipped host home nor a preserved prior-lease credential
|
|
60
|
+
# provides auth.json, fall back to the sandbox image's own Codex login so an
|
|
61
|
+
# image signed in to Codex works on hosts with no credentials (managed cloud
|
|
62
|
+
# hosts never have one). Host and preserved credentials always win over the
|
|
63
|
+
# image login, preserving the existing shadowing precedence.
|
|
64
|
+
if [ ! -f "$source_auth" ] && [ -f "${HOME:-/nonexistent}/.codex/$auth_name" ]; then
|
|
65
|
+
source_auth="${HOME:-/nonexistent}/.codex/$auth_name"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
if [ -f "$source_auth" ]; then
|
|
69
|
+
target_auth="$asset_dir/$auth_name"
|
|
70
|
+
target_tmp="$asset_dir/.auth.json.paperclip.$$"
|
|
71
|
+
( umask 077 && rm -f "$target_tmp" && cat "$source_auth" > "$target_tmp" ) || exit 1
|
|
72
|
+
mv -f "$target_tmp" "$target_auth" || exit 1
|
|
73
|
+
fi
|