@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.
Files changed (268) hide show
  1. package/LICENSE +22 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +218 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/quota-probe.d.ts +3 -0
  11. package/dist/cli/quota-probe.d.ts.map +1 -0
  12. package/dist/cli/quota-probe.js +104 -0
  13. package/dist/cli/quota-probe.js.map +1 -0
  14. package/dist/index.d.ts +21 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +155 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/index.test.d.ts +2 -0
  19. package/dist/index.test.d.ts.map +1 -0
  20. package/dist/index.test.js +58 -0
  21. package/dist/index.test.js.map +1 -0
  22. package/dist/server/acp.d.ts +30 -0
  23. package/dist/server/acp.d.ts.map +1 -0
  24. package/dist/server/acp.js +532 -0
  25. package/dist/server/acp.js.map +1 -0
  26. package/dist/server/acp.test.d.ts +2 -0
  27. package/dist/server/acp.test.d.ts.map +1 -0
  28. package/dist/server/acp.test.js +1087 -0
  29. package/dist/server/acp.test.js.map +1 -0
  30. package/dist/server/adapter-auth-promotion.d.ts +102 -0
  31. package/dist/server/adapter-auth-promotion.d.ts.map +1 -0
  32. package/dist/server/adapter-auth-promotion.js +210 -0
  33. package/dist/server/adapter-auth-promotion.js.map +1 -0
  34. package/dist/server/adapter-auth-promotion.test.d.ts +2 -0
  35. package/dist/server/adapter-auth-promotion.test.d.ts.map +1 -0
  36. package/dist/server/adapter-auth-promotion.test.js +658 -0
  37. package/dist/server/adapter-auth-promotion.test.js.map +1 -0
  38. package/dist/server/auth-check.d.ts +8 -0
  39. package/dist/server/auth-check.d.ts.map +1 -0
  40. package/dist/server/auth-check.js +8 -0
  41. package/dist/server/auth-check.js.map +1 -0
  42. package/dist/server/auth-precedence.d.ts +16 -0
  43. package/dist/server/auth-precedence.d.ts.map +1 -0
  44. package/dist/server/auth-precedence.js +20 -0
  45. package/dist/server/auth-precedence.js.map +1 -0
  46. package/dist/server/auth-precedence.test.d.ts +2 -0
  47. package/dist/server/auth-precedence.test.d.ts.map +1 -0
  48. package/dist/server/auth-precedence.test.js +100 -0
  49. package/dist/server/auth-precedence.test.js.map +1 -0
  50. package/dist/server/codex-args.d.ts +13 -0
  51. package/dist/server/codex-args.d.ts.map +1 -0
  52. package/dist/server/codex-args.js +76 -0
  53. package/dist/server/codex-args.js.map +1 -0
  54. package/dist/server/codex-args.test.d.ts +2 -0
  55. package/dist/server/codex-args.test.d.ts.map +1 -0
  56. package/dist/server/codex-args.test.js +243 -0
  57. package/dist/server/codex-args.test.js.map +1 -0
  58. package/dist/server/codex-auth-cache.d.ts +206 -0
  59. package/dist/server/codex-auth-cache.d.ts.map +1 -0
  60. package/dist/server/codex-auth-cache.js +501 -0
  61. package/dist/server/codex-auth-cache.js.map +1 -0
  62. package/dist/server/codex-auth-cache.test.d.ts +2 -0
  63. package/dist/server/codex-auth-cache.test.d.ts.map +1 -0
  64. package/dist/server/codex-auth-cache.test.js +497 -0
  65. package/dist/server/codex-auth-cache.test.js.map +1 -0
  66. package/dist/server/codex-auth-copyback.d.ts +53 -0
  67. package/dist/server/codex-auth-copyback.d.ts.map +1 -0
  68. package/dist/server/codex-auth-copyback.js +123 -0
  69. package/dist/server/codex-auth-copyback.js.map +1 -0
  70. package/dist/server/codex-auth-copyback.test.d.ts +2 -0
  71. package/dist/server/codex-auth-copyback.test.d.ts.map +1 -0
  72. package/dist/server/codex-auth-copyback.test.js +507 -0
  73. package/dist/server/codex-auth-copyback.test.js.map +1 -0
  74. package/dist/server/codex-auth-merge-decision.cjs +170 -0
  75. package/dist/server/codex-auth-merge-decision.d.ts +22 -0
  76. package/dist/server/codex-auth-merge-decision.d.ts.map +1 -0
  77. package/dist/server/codex-auth-merge-decision.js +58 -0
  78. package/dist/server/codex-auth-merge-decision.js.map +1 -0
  79. package/dist/server/codex-auth-merge-decision.test.d.ts +2 -0
  80. package/dist/server/codex-auth-merge-decision.test.d.ts.map +1 -0
  81. package/dist/server/codex-auth-merge-decision.test.js +230 -0
  82. package/dist/server/codex-auth-merge-decision.test.js.map +1 -0
  83. package/dist/server/codex-auth-merge-extract.sh +73 -0
  84. package/dist/server/codex-auth-merge-scripts.d.ts +21 -0
  85. package/dist/server/codex-auth-merge-scripts.d.ts.map +1 -0
  86. package/dist/server/codex-auth-merge-scripts.js +40 -0
  87. package/dist/server/codex-auth-merge-scripts.js.map +1 -0
  88. package/dist/server/codex-auth-merge.test.d.ts +2 -0
  89. package/dist/server/codex-auth-merge.test.d.ts.map +1 -0
  90. package/dist/server/codex-auth-merge.test.js +714 -0
  91. package/dist/server/codex-auth-merge.test.js.map +1 -0
  92. package/dist/server/codex-auth-seed-write.d.ts +30 -0
  93. package/dist/server/codex-auth-seed-write.d.ts.map +1 -0
  94. package/dist/server/codex-auth-seed-write.js +41 -0
  95. package/dist/server/codex-auth-seed-write.js.map +1 -0
  96. package/dist/server/codex-home.d.ts +162 -0
  97. package/dist/server/codex-home.d.ts.map +1 -0
  98. package/dist/server/codex-home.js +771 -0
  99. package/dist/server/codex-home.js.map +1 -0
  100. package/dist/server/codex-home.test.d.ts +2 -0
  101. package/dist/server/codex-home.test.d.ts.map +1 -0
  102. package/dist/server/codex-home.test.js +1183 -0
  103. package/dist/server/codex-home.test.js.map +1 -0
  104. package/dist/server/config-schema.d.ts +3 -0
  105. package/dist/server/config-schema.d.ts.map +1 -0
  106. package/dist/server/config-schema.js +67 -0
  107. package/dist/server/config-schema.js.map +1 -0
  108. package/dist/server/device-login-export.d.ts +56 -0
  109. package/dist/server/device-login-export.d.ts.map +1 -0
  110. package/dist/server/device-login-export.js +230 -0
  111. package/dist/server/device-login-export.js.map +1 -0
  112. package/dist/server/device-login-export.test.d.ts +2 -0
  113. package/dist/server/device-login-export.test.d.ts.map +1 -0
  114. package/dist/server/device-login-export.test.js +245 -0
  115. package/dist/server/device-login-export.test.js.map +1 -0
  116. package/dist/server/device-login-parse.d.ts +20 -0
  117. package/dist/server/device-login-parse.d.ts.map +1 -0
  118. package/dist/server/device-login-parse.js +155 -0
  119. package/dist/server/device-login-parse.js.map +1 -0
  120. package/dist/server/device-login-parse.test.d.ts +2 -0
  121. package/dist/server/device-login-parse.test.d.ts.map +1 -0
  122. package/dist/server/device-login-parse.test.js +269 -0
  123. package/dist/server/device-login-parse.test.js.map +1 -0
  124. package/dist/server/device-login-runner.d.ts +69 -0
  125. package/dist/server/device-login-runner.d.ts.map +1 -0
  126. package/dist/server/device-login-runner.js +109 -0
  127. package/dist/server/device-login-runner.js.map +1 -0
  128. package/dist/server/device-login-runner.test.d.ts +2 -0
  129. package/dist/server/device-login-runner.test.d.ts.map +1 -0
  130. package/dist/server/device-login-runner.test.js +201 -0
  131. package/dist/server/device-login-runner.test.js.map +1 -0
  132. package/dist/server/engine-availability.test.d.ts +2 -0
  133. package/dist/server/engine-availability.test.d.ts.map +1 -0
  134. package/dist/server/engine-availability.test.js +41 -0
  135. package/dist/server/engine-availability.test.js.map +1 -0
  136. package/dist/server/execute.acp-fallback.test.d.ts +2 -0
  137. package/dist/server/execute.acp-fallback.test.d.ts.map +1 -0
  138. package/dist/server/execute.acp-fallback.test.js +123 -0
  139. package/dist/server/execute.acp-fallback.test.js.map +1 -0
  140. package/dist/server/execute.auth-precedence.test.d.ts +2 -0
  141. package/dist/server/execute.auth-precedence.test.d.ts.map +1 -0
  142. package/dist/server/execute.auth-precedence.test.js +137 -0
  143. package/dist/server/execute.auth-precedence.test.js.map +1 -0
  144. package/dist/server/execute.auth.test.d.ts +2 -0
  145. package/dist/server/execute.auth.test.d.ts.map +1 -0
  146. package/dist/server/execute.auth.test.js +197 -0
  147. package/dist/server/execute.auth.test.js.map +1 -0
  148. package/dist/server/execute.d.ts +40 -0
  149. package/dist/server/execute.d.ts.map +1 -0
  150. package/dist/server/execute.js +1290 -0
  151. package/dist/server/execute.js.map +1 -0
  152. package/dist/server/execute.remote.test.d.ts +2 -0
  153. package/dist/server/execute.remote.test.d.ts.map +1 -0
  154. package/dist/server/execute.remote.test.js +556 -0
  155. package/dist/server/execute.remote.test.js.map +1 -0
  156. package/dist/server/execute.stderr-error.test.d.ts +2 -0
  157. package/dist/server/execute.stderr-error.test.d.ts.map +1 -0
  158. package/dist/server/execute.stderr-error.test.js +142 -0
  159. package/dist/server/execute.stderr-error.test.js.map +1 -0
  160. package/dist/server/execute.test.d.ts +2 -0
  161. package/dist/server/execute.test.d.ts.map +1 -0
  162. package/dist/server/execute.test.js +240 -0
  163. package/dist/server/execute.test.js.map +1 -0
  164. package/dist/server/index.d.ts +18 -0
  165. package/dist/server/index.d.ts.map +1 -0
  166. package/dist/server/index.js +71 -0
  167. package/dist/server/index.js.map +1 -0
  168. package/dist/server/output-inactivity-monitor.d.ts +62 -0
  169. package/dist/server/output-inactivity-monitor.d.ts.map +1 -0
  170. package/dist/server/output-inactivity-monitor.integration.test.d.ts +2 -0
  171. package/dist/server/output-inactivity-monitor.integration.test.d.ts.map +1 -0
  172. package/dist/server/output-inactivity-monitor.integration.test.js +136 -0
  173. package/dist/server/output-inactivity-monitor.integration.test.js.map +1 -0
  174. package/dist/server/output-inactivity-monitor.js +112 -0
  175. package/dist/server/output-inactivity-monitor.js.map +1 -0
  176. package/dist/server/output-inactivity-monitor.test.d.ts +2 -0
  177. package/dist/server/output-inactivity-monitor.test.d.ts.map +1 -0
  178. package/dist/server/output-inactivity-monitor.test.js +284 -0
  179. package/dist/server/output-inactivity-monitor.test.js.map +1 -0
  180. package/dist/server/parse.d.ts +51 -0
  181. package/dist/server/parse.d.ts.map +1 -0
  182. package/dist/server/parse.js +261 -0
  183. package/dist/server/parse.js.map +1 -0
  184. package/dist/server/parse.test.d.ts +2 -0
  185. package/dist/server/parse.test.d.ts.map +1 -0
  186. package/dist/server/parse.test.js +186 -0
  187. package/dist/server/parse.test.js.map +1 -0
  188. package/dist/server/process-activity-monitor.d.ts +21 -0
  189. package/dist/server/process-activity-monitor.d.ts.map +1 -0
  190. package/dist/server/process-activity-monitor.js +103 -0
  191. package/dist/server/process-activity-monitor.js.map +1 -0
  192. package/dist/server/process-activity-monitor.test.d.ts +2 -0
  193. package/dist/server/process-activity-monitor.test.d.ts.map +1 -0
  194. package/dist/server/process-activity-monitor.test.js +82 -0
  195. package/dist/server/process-activity-monitor.test.js.map +1 -0
  196. package/dist/server/quota-spawn-error.test.d.ts +2 -0
  197. package/dist/server/quota-spawn-error.test.d.ts.map +1 -0
  198. package/dist/server/quota-spawn-error.test.js +174 -0
  199. package/dist/server/quota-spawn-error.test.js.map +1 -0
  200. package/dist/server/quota.d.ts +66 -0
  201. package/dist/server/quota.d.ts.map +1 -0
  202. package/dist/server/quota.js +511 -0
  203. package/dist/server/quota.js.map +1 -0
  204. package/dist/server/runtime-config.d.ts +11 -0
  205. package/dist/server/runtime-config.d.ts.map +1 -0
  206. package/dist/server/runtime-config.js +380 -0
  207. package/dist/server/runtime-config.js.map +1 -0
  208. package/dist/server/runtime-config.test.d.ts +2 -0
  209. package/dist/server/runtime-config.test.d.ts.map +1 -0
  210. package/dist/server/runtime-config.test.js +367 -0
  211. package/dist/server/runtime-config.test.js.map +1 -0
  212. package/dist/server/skills.d.ts +8 -0
  213. package/dist/server/skills.d.ts.map +1 -0
  214. package/dist/server/skills.js +26 -0
  215. package/dist/server/skills.js.map +1 -0
  216. package/dist/server/test.d.ts +3 -0
  217. package/dist/server/test.d.ts.map +1 -0
  218. package/dist/server/test.js +458 -0
  219. package/dist/server/test.js.map +1 -0
  220. package/dist/server/test.remote.test.d.ts +2 -0
  221. package/dist/server/test.remote.test.d.ts.map +1 -0
  222. package/dist/server/test.remote.test.js +396 -0
  223. package/dist/server/test.remote.test.js.map +1 -0
  224. package/dist/ui/build-config.d.ts +5 -0
  225. package/dist/ui/build-config.d.ts.map +1 -0
  226. package/dist/ui/build-config.js +229 -0
  227. package/dist/ui/build-config.js.map +1 -0
  228. package/dist/ui/build-config.test.d.ts +2 -0
  229. package/dist/ui/build-config.test.d.ts.map +1 -0
  230. package/dist/ui/build-config.test.js +272 -0
  231. package/dist/ui/build-config.test.js.map +1 -0
  232. package/dist/ui/index.d.ts +4 -0
  233. package/dist/ui/index.d.ts.map +1 -0
  234. package/dist/ui/index.js +8 -0
  235. package/dist/ui/index.js.map +1 -0
  236. package/dist/ui/parse-stdout.d.ts +3 -0
  237. package/dist/ui/parse-stdout.d.ts.map +1 -0
  238. package/dist/ui/parse-stdout.js +265 -0
  239. package/dist/ui/parse-stdout.js.map +1 -0
  240. package/dist/ui/parse-stdout.test.d.ts +2 -0
  241. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  242. package/dist/ui/parse-stdout.test.js +77 -0
  243. package/dist/ui/parse-stdout.test.js.map +1 -0
  244. package/package.json +61 -0
  245. package/skills/agentmail/SKILL.md +70 -0
  246. package/skills/paperclip/SKILL.md +712 -0
  247. package/skills/paperclip/references/api-reference.md +1675 -0
  248. package/skills/paperclip/references/artifacts.md +158 -0
  249. package/skills/paperclip/references/cases.md +295 -0
  250. package/skills/paperclip/references/company-skills.md +266 -0
  251. package/skills/paperclip/references/issue-workspaces.md +80 -0
  252. package/skills/paperclip/references/routines.md +231 -0
  253. package/skills/paperclip/references/workflows.md +141 -0
  254. package/skills/paperclip/scripts/paperclip-upload-artifact.sh +592 -0
  255. package/skills/paperclip-board/SKILL.md +619 -0
  256. package/skills/paperclip-converting-plans-to-tasks/SKILL.md +60 -0
  257. package/skills/paperclip-create-agent/SKILL.md +179 -0
  258. package/skills/paperclip-create-agent/references/agent-instruction-templates.md +123 -0
  259. package/skills/paperclip-create-agent/references/agents/coder.md +64 -0
  260. package/skills/paperclip-create-agent/references/agents/qa.md +88 -0
  261. package/skills/paperclip-create-agent/references/agents/securityengineer.md +135 -0
  262. package/skills/paperclip-create-agent/references/agents/uxdesigner.md +115 -0
  263. package/skills/paperclip-create-agent/references/api-reference.md +110 -0
  264. package/skills/paperclip-create-agent/references/baseline-role-guide.md +168 -0
  265. package/skills/paperclip-create-agent/references/draft-review-checklist.md +95 -0
  266. package/skills/para-memory-files/SKILL.md +100 -0
  267. package/skills/para-memory-files/references/schemas.md +35 -0
  268. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=codex-auth-merge-decision.test.d.ts.map
@@ -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