oc-codex-multi-auth 6.0.0 → 6.1.1

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 (284) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +56 -18
  3. package/assets/readme-hero.svg +10 -10
  4. package/config/README.md +1 -1
  5. package/config/minimal-opencode.json +1 -1
  6. package/config/opencode-legacy.json +1 -1
  7. package/config/opencode-modern.json +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +112 -2525
  11. package/dist/index.js.map +1 -1
  12. package/dist/lib/accounts/persistence.d.ts +34 -0
  13. package/dist/lib/accounts/persistence.d.ts.map +1 -0
  14. package/dist/lib/accounts/persistence.js +153 -0
  15. package/dist/lib/accounts/persistence.js.map +1 -0
  16. package/dist/lib/accounts/recovery.d.ts +59 -0
  17. package/dist/lib/accounts/recovery.d.ts.map +1 -0
  18. package/dist/lib/accounts/recovery.js +229 -0
  19. package/dist/lib/accounts/recovery.js.map +1 -0
  20. package/dist/lib/accounts/rotation.d.ts +40 -0
  21. package/dist/lib/accounts/rotation.d.ts.map +1 -0
  22. package/dist/lib/accounts/rotation.js +204 -0
  23. package/dist/lib/accounts/rotation.js.map +1 -0
  24. package/dist/lib/accounts/state.d.ts +92 -0
  25. package/dist/lib/accounts/state.d.ts.map +1 -0
  26. package/dist/lib/accounts/state.js +366 -0
  27. package/dist/lib/accounts/state.js.map +1 -0
  28. package/dist/lib/accounts.d.ts +48 -91
  29. package/dist/lib/accounts.d.ts.map +1 -1
  30. package/dist/lib/accounts.js +121 -699
  31. package/dist/lib/accounts.js.map +1 -1
  32. package/dist/lib/auth/auth.d.ts +1 -1
  33. package/dist/lib/auth/auth.d.ts.map +1 -1
  34. package/dist/lib/auth/auth.js +5 -2
  35. package/dist/lib/auth/auth.js.map +1 -1
  36. package/dist/lib/auth/login-runner.d.ts +32 -0
  37. package/dist/lib/auth/login-runner.d.ts.map +1 -1
  38. package/dist/lib/auth/login-runner.js +79 -64
  39. package/dist/lib/auth/login-runner.js.map +1 -1
  40. package/dist/lib/auth/server.d.ts.map +1 -1
  41. package/dist/lib/auth/server.js +3 -8
  42. package/dist/lib/auth/server.js.map +1 -1
  43. package/dist/lib/circuit-breaker.d.ts +53 -2
  44. package/dist/lib/circuit-breaker.d.ts.map +1 -1
  45. package/dist/lib/circuit-breaker.js +65 -6
  46. package/dist/lib/circuit-breaker.js.map +1 -1
  47. package/dist/lib/config.d.ts.map +1 -1
  48. package/dist/lib/config.js +77 -32
  49. package/dist/lib/config.js.map +1 -1
  50. package/dist/lib/error-sentinels.d.ts +20 -0
  51. package/dist/lib/error-sentinels.d.ts.map +1 -0
  52. package/dist/lib/error-sentinels.js +28 -0
  53. package/dist/lib/error-sentinels.js.map +1 -0
  54. package/dist/lib/errors.d.ts +100 -1
  55. package/dist/lib/errors.d.ts.map +1 -1
  56. package/dist/lib/errors.js +116 -1
  57. package/dist/lib/errors.js.map +1 -1
  58. package/dist/lib/logger.d.ts +14 -1
  59. package/dist/lib/logger.d.ts.map +1 -1
  60. package/dist/lib/logger.js +65 -5
  61. package/dist/lib/logger.js.map +1 -1
  62. package/dist/lib/oauth-constants.d.ts +18 -0
  63. package/dist/lib/oauth-constants.d.ts.map +1 -0
  64. package/dist/lib/oauth-constants.js +18 -0
  65. package/dist/lib/oauth-constants.js.map +1 -0
  66. package/dist/lib/oauth-success.d.ts +2 -0
  67. package/dist/lib/oauth-success.d.ts.map +1 -0
  68. package/dist/lib/oauth-success.html +711 -711
  69. package/dist/lib/oauth-success.js +714 -0
  70. package/dist/lib/oauth-success.js.map +1 -0
  71. package/dist/lib/prompts/codex.d.ts.map +1 -1
  72. package/dist/lib/prompts/codex.js +12 -3
  73. package/dist/lib/prompts/codex.js.map +1 -1
  74. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -1
  75. package/dist/lib/prompts/opencode-codex.js +3 -2
  76. package/dist/lib/prompts/opencode-codex.js.map +1 -1
  77. package/dist/lib/recovery/hook.d.ts +43 -0
  78. package/dist/lib/recovery/hook.d.ts.map +1 -0
  79. package/dist/lib/recovery/hook.js +325 -0
  80. package/dist/lib/recovery/hook.js.map +1 -0
  81. package/dist/lib/recovery/index.d.ts +1 -0
  82. package/dist/lib/recovery/index.d.ts.map +1 -1
  83. package/dist/lib/recovery/index.js +1 -0
  84. package/dist/lib/recovery/index.js.map +1 -1
  85. package/dist/lib/recovery/storage.d.ts.map +1 -1
  86. package/dist/lib/recovery/storage.js +5 -1
  87. package/dist/lib/recovery/storage.js.map +1 -1
  88. package/dist/lib/recovery.d.ts +15 -30
  89. package/dist/lib/recovery.d.ts.map +1 -1
  90. package/dist/lib/recovery.js +14 -312
  91. package/dist/lib/recovery.js.map +1 -1
  92. package/dist/lib/request/fetch-helpers.d.ts +1 -0
  93. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  94. package/dist/lib/request/fetch-helpers.js +58 -10
  95. package/dist/lib/request/fetch-helpers.js.map +1 -1
  96. package/dist/lib/request/response-handler.d.ts.map +1 -1
  97. package/dist/lib/request/response-handler.js +8 -2
  98. package/dist/lib/request/response-handler.js.map +1 -1
  99. package/dist/lib/runtime.d.ts +101 -0
  100. package/dist/lib/runtime.d.ts.map +1 -0
  101. package/dist/lib/runtime.js +77 -0
  102. package/dist/lib/runtime.js.map +1 -0
  103. package/dist/lib/schemas.d.ts +164 -1
  104. package/dist/lib/schemas.d.ts.map +1 -1
  105. package/dist/lib/schemas.js +251 -0
  106. package/dist/lib/schemas.js.map +1 -1
  107. package/dist/lib/storage/atomic-write.d.ts +31 -0
  108. package/dist/lib/storage/atomic-write.d.ts.map +1 -0
  109. package/dist/lib/storage/atomic-write.js +75 -0
  110. package/dist/lib/storage/atomic-write.js.map +1 -0
  111. package/dist/lib/storage/backup.d.ts +13 -0
  112. package/dist/lib/storage/backup.d.ts.map +1 -0
  113. package/dist/lib/storage/backup.js +59 -0
  114. package/dist/lib/storage/backup.js.map +1 -0
  115. package/dist/lib/storage/errors.d.ts +17 -0
  116. package/dist/lib/storage/errors.d.ts.map +1 -0
  117. package/dist/lib/storage/errors.js +38 -0
  118. package/dist/lib/storage/errors.js.map +1 -0
  119. package/dist/lib/storage/export-import.d.ts +84 -0
  120. package/dist/lib/storage/export-import.d.ts.map +1 -0
  121. package/dist/lib/storage/export-import.js +222 -0
  122. package/dist/lib/storage/export-import.js.map +1 -0
  123. package/dist/lib/storage/flagged.d.ts +29 -0
  124. package/dist/lib/storage/flagged.d.ts.map +1 -0
  125. package/dist/lib/storage/flagged.js +207 -0
  126. package/dist/lib/storage/flagged.js.map +1 -0
  127. package/dist/lib/storage/identity.d.ts +72 -0
  128. package/dist/lib/storage/identity.d.ts.map +1 -0
  129. package/dist/lib/storage/identity.js +230 -0
  130. package/dist/lib/storage/identity.js.map +1 -0
  131. package/dist/lib/storage/keychain.d.ts +146 -0
  132. package/dist/lib/storage/keychain.d.ts.map +1 -0
  133. package/dist/lib/storage/keychain.js +278 -0
  134. package/dist/lib/storage/keychain.js.map +1 -0
  135. package/dist/lib/storage/load-save.d.ts +61 -0
  136. package/dist/lib/storage/load-save.d.ts.map +1 -0
  137. package/dist/lib/storage/load-save.js +606 -0
  138. package/dist/lib/storage/load-save.js.map +1 -0
  139. package/dist/lib/storage/migrations.d.ts +35 -0
  140. package/dist/lib/storage/migrations.d.ts.map +1 -1
  141. package/dist/lib/storage/migrations.js +37 -0
  142. package/dist/lib/storage/migrations.js.map +1 -1
  143. package/dist/lib/storage/normalize.d.ts +22 -0
  144. package/dist/lib/storage/normalize.d.ts.map +1 -0
  145. package/dist/lib/storage/normalize.js +114 -0
  146. package/dist/lib/storage/normalize.js.map +1 -0
  147. package/dist/lib/storage/paths.d.ts.map +1 -1
  148. package/dist/lib/storage/paths.js +2 -1
  149. package/dist/lib/storage/paths.js.map +1 -1
  150. package/dist/lib/storage/state.d.ts +46 -0
  151. package/dist/lib/storage/state.d.ts.map +1 -0
  152. package/dist/lib/storage/state.js +100 -0
  153. package/dist/lib/storage/state.js.map +1 -0
  154. package/dist/lib/storage/worktree-lock.d.ts +79 -0
  155. package/dist/lib/storage/worktree-lock.d.ts.map +1 -0
  156. package/dist/lib/storage/worktree-lock.js +265 -0
  157. package/dist/lib/storage/worktree-lock.js.map +1 -0
  158. package/dist/lib/storage.d.ts +21 -155
  159. package/dist/lib/storage.d.ts.map +1 -1
  160. package/dist/lib/storage.js +24 -1167
  161. package/dist/lib/storage.js.map +1 -1
  162. package/dist/lib/tools/_shared.d.ts +16 -0
  163. package/dist/lib/tools/_shared.d.ts.map +1 -0
  164. package/dist/lib/tools/_shared.js +21 -0
  165. package/dist/lib/tools/_shared.js.map +1 -0
  166. package/dist/lib/tools/codex-dashboard.d.ts +8 -0
  167. package/dist/lib/tools/codex-dashboard.d.ts.map +1 -0
  168. package/dist/lib/tools/codex-dashboard.js +176 -0
  169. package/dist/lib/tools/codex-dashboard.js.map +1 -0
  170. package/dist/lib/tools/codex-diag.d.ts +19 -0
  171. package/dist/lib/tools/codex-diag.d.ts.map +1 -0
  172. package/dist/lib/tools/codex-diag.js +139 -0
  173. package/dist/lib/tools/codex-diag.js.map +1 -0
  174. package/dist/lib/tools/codex-diff.d.ts +44 -0
  175. package/dist/lib/tools/codex-diff.d.ts.map +1 -0
  176. package/dist/lib/tools/codex-diff.js +284 -0
  177. package/dist/lib/tools/codex-diff.js.map +1 -0
  178. package/dist/lib/tools/codex-doctor.d.ts +8 -0
  179. package/dist/lib/tools/codex-doctor.d.ts.map +1 -0
  180. package/dist/lib/tools/codex-doctor.js +284 -0
  181. package/dist/lib/tools/codex-doctor.js.map +1 -0
  182. package/dist/lib/tools/codex-export.d.ts +8 -0
  183. package/dist/lib/tools/codex-export.d.ts.map +1 -0
  184. package/dist/lib/tools/codex-export.js +63 -0
  185. package/dist/lib/tools/codex-export.js.map +1 -0
  186. package/dist/lib/tools/codex-health.d.ts +8 -0
  187. package/dist/lib/tools/codex-health.d.ts.map +1 -0
  188. package/dist/lib/tools/codex-health.js +124 -0
  189. package/dist/lib/tools/codex-health.js.map +1 -0
  190. package/dist/lib/tools/codex-help.d.ts +8 -0
  191. package/dist/lib/tools/codex-help.d.ts.map +1 -0
  192. package/dist/lib/tools/codex-help.js +127 -0
  193. package/dist/lib/tools/codex-help.js.map +1 -0
  194. package/dist/lib/tools/codex-import.d.ts +8 -0
  195. package/dist/lib/tools/codex-import.d.ts.map +1 -0
  196. package/dist/lib/tools/codex-import.js +97 -0
  197. package/dist/lib/tools/codex-import.js.map +1 -0
  198. package/dist/lib/tools/codex-keychain.d.ts +36 -0
  199. package/dist/lib/tools/codex-keychain.d.ts.map +1 -0
  200. package/dist/lib/tools/codex-keychain.js +289 -0
  201. package/dist/lib/tools/codex-keychain.js.map +1 -0
  202. package/dist/lib/tools/codex-label.d.ts +8 -0
  203. package/dist/lib/tools/codex-label.d.ts.map +1 -0
  204. package/dist/lib/tools/codex-label.js +143 -0
  205. package/dist/lib/tools/codex-label.js.map +1 -0
  206. package/dist/lib/tools/codex-limits.d.ts +8 -0
  207. package/dist/lib/tools/codex-limits.d.ts.map +1 -0
  208. package/dist/lib/tools/codex-limits.js +497 -0
  209. package/dist/lib/tools/codex-limits.js.map +1 -0
  210. package/dist/lib/tools/codex-list.d.ts +8 -0
  211. package/dist/lib/tools/codex-list.d.ts.map +1 -0
  212. package/dist/lib/tools/codex-list.js +260 -0
  213. package/dist/lib/tools/codex-list.js.map +1 -0
  214. package/dist/lib/tools/codex-metrics.d.ts +8 -0
  215. package/dist/lib/tools/codex-metrics.d.ts.map +1 -0
  216. package/dist/lib/tools/codex-metrics.js +180 -0
  217. package/dist/lib/tools/codex-metrics.js.map +1 -0
  218. package/dist/lib/tools/codex-next.d.ts +8 -0
  219. package/dist/lib/tools/codex-next.d.ts.map +1 -0
  220. package/dist/lib/tools/codex-next.js +54 -0
  221. package/dist/lib/tools/codex-next.js.map +1 -0
  222. package/dist/lib/tools/codex-note.d.ts +8 -0
  223. package/dist/lib/tools/codex-note.d.ts.map +1 -0
  224. package/dist/lib/tools/codex-note.js +79 -0
  225. package/dist/lib/tools/codex-note.js.map +1 -0
  226. package/dist/lib/tools/codex-refresh.d.ts +8 -0
  227. package/dist/lib/tools/codex-refresh.d.ts.map +1 -0
  228. package/dist/lib/tools/codex-refresh.js +78 -0
  229. package/dist/lib/tools/codex-refresh.js.map +1 -0
  230. package/dist/lib/tools/codex-remove.d.ts +8 -0
  231. package/dist/lib/tools/codex-remove.d.ts.map +1 -0
  232. package/dist/lib/tools/codex-remove.js +184 -0
  233. package/dist/lib/tools/codex-remove.js.map +1 -0
  234. package/dist/lib/tools/codex-setup.d.ts +8 -0
  235. package/dist/lib/tools/codex-setup.d.ts.map +1 -0
  236. package/dist/lib/tools/codex-setup.js +26 -0
  237. package/dist/lib/tools/codex-setup.js.map +1 -0
  238. package/dist/lib/tools/codex-status.d.ts +8 -0
  239. package/dist/lib/tools/codex-status.d.ts.map +1 -0
  240. package/dist/lib/tools/codex-status.js +263 -0
  241. package/dist/lib/tools/codex-status.js.map +1 -0
  242. package/dist/lib/tools/codex-switch.d.ts +8 -0
  243. package/dist/lib/tools/codex-switch.d.ts.map +1 -0
  244. package/dist/lib/tools/codex-switch.js +122 -0
  245. package/dist/lib/tools/codex-switch.js.map +1 -0
  246. package/dist/lib/tools/codex-tag.d.ts +8 -0
  247. package/dist/lib/tools/codex-tag.d.ts.map +1 -0
  248. package/dist/lib/tools/codex-tag.js +101 -0
  249. package/dist/lib/tools/codex-tag.js.map +1 -0
  250. package/dist/lib/tools/index.d.ts +143 -0
  251. package/dist/lib/tools/index.d.ts.map +1 -0
  252. package/dist/lib/tools/index.js +67 -0
  253. package/dist/lib/tools/index.js.map +1 -0
  254. package/dist/lib/ui/format.d.ts.map +1 -1
  255. package/dist/lib/ui/format.js +5 -0
  256. package/dist/lib/ui/format.js.map +1 -1
  257. package/dist/lib/ui/runtime.d.ts +10 -0
  258. package/dist/lib/ui/runtime.d.ts.map +1 -1
  259. package/dist/lib/ui/runtime.js +16 -11
  260. package/dist/lib/ui/runtime.js.map +1 -1
  261. package/dist/lib/ui/select.d.ts.map +1 -1
  262. package/dist/lib/ui/select.js +12 -3
  263. package/dist/lib/ui/select.js.map +1 -1
  264. package/dist/lib/ui/theme.d.ts +19 -0
  265. package/dist/lib/ui/theme.d.ts.map +1 -1
  266. package/dist/lib/ui/theme.js +27 -0
  267. package/dist/lib/ui/theme.js.map +1 -1
  268. package/package.json +24 -16
  269. package/scripts/copy-oauth-success.js +16 -6
  270. package/scripts/install-oc-codex-multi-auth-core.js +462 -381
  271. package/scripts/install-oc-codex-multi-auth.js +15 -15
  272. package/scripts/test-all-models.sh +1 -1
  273. package/dist/lib/audit.d.ts +0 -45
  274. package/dist/lib/audit.d.ts.map +0 -1
  275. package/dist/lib/audit.js +0 -154
  276. package/dist/lib/audit.js.map +0 -1
  277. package/dist/lib/auth-rate-limit.d.ts +0 -20
  278. package/dist/lib/auth-rate-limit.d.ts.map +0 -1
  279. package/dist/lib/auth-rate-limit.js +0 -91
  280. package/dist/lib/auth-rate-limit.js.map +0 -1
  281. package/dist/lib/runtime-contracts.d.ts +0 -16
  282. package/dist/lib/runtime-contracts.d.ts.map +0 -1
  283. package/dist/lib/runtime-contracts.js +0 -24
  284. package/dist/lib/runtime-contracts.js.map +0 -1
@@ -0,0 +1,284 @@
1
+ /**
2
+ * `codex-diff` tool — redacted structural diff of two config snapshots.
3
+ *
4
+ * Given two JSON file paths (typically account storage files, exported
5
+ * account backups, or `opencode.json` configs) the tool:
6
+ *
7
+ * - reads both files and parses them as JSON
8
+ * - walks the JSON tree and emits a sorted list of `added | removed |
9
+ * changed` entries keyed by dot-separated JSON paths
10
+ * - redacts every emitted value through `maskString` (tokens, JWTs,
11
+ * emails) and strips the user's home directory from both input paths
12
+ * and any string values
13
+ *
14
+ * The output is safe to paste into bug reports or CI logs: tokens,
15
+ * refresh tokens, and `~/…` usernames never survive verbatim.
16
+ *
17
+ * Intended use cases:
18
+ *
19
+ * - "did my local storage drift from a known-good backup?"
20
+ * - "what is different between worktree A and worktree B config?"
21
+ * - "compare a per-project account file against the global file"
22
+ *
23
+ * See docs/audits/08-feature-recommendations.md and
24
+ * docs/audits/13-phased-roadmap.md §4 (Phase 4 F3).
25
+ */
26
+ import { promises as fs } from "node:fs";
27
+ import { homedir } from "node:os";
28
+ import { tool } from "@opencode-ai/plugin/tool";
29
+ import { maskString } from "../logger.js";
30
+ /**
31
+ * Replace occurrences of the user's home directory with the placeholder
32
+ * `<HOME>` so shared diff output never leaks the reporter's username.
33
+ * Mirrors the logic in `codex-diag.ts` intentionally — the two tools
34
+ * ship the same guarantee.
35
+ */
36
+ function redactHomePaths(input) {
37
+ const home = homedir();
38
+ if (!home)
39
+ return input;
40
+ const needles = new Set();
41
+ needles.add(home);
42
+ needles.add(home.replace(/\\/g, "/"));
43
+ needles.add(home.replace(/\\/g, "\\\\"));
44
+ let output = input;
45
+ for (const needle of needles) {
46
+ if (!needle)
47
+ continue;
48
+ while (output.includes(needle)) {
49
+ output = output.replace(needle, "<HOME>");
50
+ }
51
+ }
52
+ return output;
53
+ }
54
+ /** Redact a filesystem path for display in the diff output. */
55
+ function redactPath(p) {
56
+ return redactHomePaths(p);
57
+ }
58
+ /**
59
+ * Convert a leaf JSON value into a redacted string representation.
60
+ *
61
+ * Non-string primitives are round-tripped through `JSON.stringify` so
62
+ * numbers, booleans, and `null` keep their JSON form (`42`, `true`,
63
+ * `null`). Any final string is passed through `maskString` so JWT- and
64
+ * token-shaped substrings get masked, and then through `redactHomePaths`
65
+ * as defence in depth against home directories embedded in values.
66
+ */
67
+ function redactValue(value) {
68
+ if (value === undefined)
69
+ return "undefined";
70
+ const rendered = typeof value === "string" ? value : JSON.stringify(value);
71
+ return redactHomePaths(maskString(rendered));
72
+ }
73
+ /**
74
+ * Collect every leaf `(path, value)` pair for a JSON-like value.
75
+ *
76
+ * Objects become dotted paths (`a.b.c`), arrays become indexed paths
77
+ * (`a[0].b`). The root of an object or array produces no entry of its
78
+ * own — only leaves are emitted. An explicit `null` IS a leaf value.
79
+ */
80
+ function collectLeafPaths(value, prefix, out) {
81
+ if (Array.isArray(value)) {
82
+ if (value.length === 0) {
83
+ out.set(prefix === "" ? "[]" : `${prefix}[]`, "[]");
84
+ return;
85
+ }
86
+ value.forEach((item, index) => {
87
+ const next = `${prefix}[${index}]`;
88
+ collectLeafPaths(item, next, out);
89
+ });
90
+ return;
91
+ }
92
+ if (value !== null && typeof value === "object") {
93
+ const keys = Object.keys(value);
94
+ if (keys.length === 0) {
95
+ out.set(prefix === "" ? "{}" : `${prefix}.{}`, "{}");
96
+ return;
97
+ }
98
+ for (const key of keys) {
99
+ const child = value[key];
100
+ const next = prefix === "" ? key : `${prefix}.${key}`;
101
+ collectLeafPaths(child, next, out);
102
+ }
103
+ return;
104
+ }
105
+ // Primitive leaf (string, number, boolean, null, undefined).
106
+ out.set(prefix, value);
107
+ }
108
+ function leafValuesEqual(a, b) {
109
+ // Structural equality for leaves. Most leaves are primitives; the
110
+ // `"[]"`/`"{}"` sentinels emitted for empty containers are strings
111
+ // which `Object.is` compares byte-for-byte.
112
+ return Object.is(a, b);
113
+ }
114
+ /**
115
+ * Compute a structural diff between two parsed JSON values.
116
+ *
117
+ * Entries are sorted alphabetically by `path` so the output is stable
118
+ * regardless of object key order in the source files.
119
+ */
120
+ export function computeCodexDiff(left, right) {
121
+ const leftPaths = new Map();
122
+ const rightPaths = new Map();
123
+ collectLeafPaths(left, "", leftPaths);
124
+ collectLeafPaths(right, "", rightPaths);
125
+ const allKeys = new Set();
126
+ for (const key of leftPaths.keys())
127
+ allKeys.add(key);
128
+ for (const key of rightPaths.keys())
129
+ allKeys.add(key);
130
+ const entries = [];
131
+ for (const key of allKeys) {
132
+ const hasLeft = leftPaths.has(key);
133
+ const hasRight = rightPaths.has(key);
134
+ const leftVal = leftPaths.get(key);
135
+ const rightVal = rightPaths.get(key);
136
+ if (hasLeft && hasRight) {
137
+ if (leafValuesEqual(leftVal, rightVal))
138
+ continue;
139
+ entries.push({
140
+ path: key,
141
+ kind: "changed",
142
+ leftValue: redactValue(leftVal),
143
+ rightValue: redactValue(rightVal),
144
+ });
145
+ }
146
+ else if (hasRight) {
147
+ entries.push({
148
+ path: key,
149
+ kind: "added",
150
+ rightValue: redactValue(rightVal),
151
+ });
152
+ }
153
+ else {
154
+ entries.push({
155
+ path: key,
156
+ kind: "removed",
157
+ leftValue: redactValue(leftVal),
158
+ });
159
+ }
160
+ }
161
+ entries.sort((a, b) => a.path.localeCompare(b.path));
162
+ return entries;
163
+ }
164
+ /**
165
+ * Extract a sub-tree of the parsed snapshot based on the `section`
166
+ * parameter. `both` (default) diffs the entire document; `accounts`
167
+ * diffs only the `accounts` array; `config` diffs every top-level key
168
+ * except `accounts`.
169
+ */
170
+ function extractSection(value, section) {
171
+ if (section === "both")
172
+ return value;
173
+ if (value === null || typeof value !== "object")
174
+ return value;
175
+ const record = value;
176
+ if (section === "accounts") {
177
+ // Preserve the key so paths remain readable (`accounts[0].foo`).
178
+ return { accounts: record.accounts ?? [] };
179
+ }
180
+ // section === "config": everything except `accounts`.
181
+ const { accounts: _accounts, ...rest } = record;
182
+ void _accounts;
183
+ return rest;
184
+ }
185
+ async function readJsonFile(path) {
186
+ let raw;
187
+ try {
188
+ raw = await fs.readFile(path, "utf8");
189
+ }
190
+ catch (error) {
191
+ return {
192
+ ok: false,
193
+ error: "cannot-read",
194
+ message: error instanceof Error ? error.message : String(error),
195
+ };
196
+ }
197
+ try {
198
+ return { ok: true, value: JSON.parse(raw) };
199
+ }
200
+ catch (error) {
201
+ return {
202
+ ok: false,
203
+ error: "invalid-json",
204
+ message: error instanceof Error ? error.message : String(error),
205
+ };
206
+ }
207
+ }
208
+ export function createCodexDiffTool(_ctx) {
209
+ // The tool is intentionally closure-free — it depends on nothing
210
+ // from `ToolContext`. We still take `ctx` so the factory signature
211
+ // matches every other `codex-*` tool and future additions (e.g.
212
+ // routing-snapshot embedding) don't break callers.
213
+ void _ctx;
214
+ return tool({
215
+ description: "Compare two JSON config/account snapshots and emit a redacted structural diff. Tokens, emails, and home paths are masked; output is safe to share.",
216
+ args: {
217
+ left: tool.schema
218
+ .string()
219
+ .describe("Path to the left-hand JSON file (baseline)."),
220
+ right: tool.schema
221
+ .string()
222
+ .describe("Path to the right-hand JSON file (comparison target)."),
223
+ section: tool.schema
224
+ .string()
225
+ .optional()
226
+ .describe("Which part of the document to diff: 'accounts' (accounts array only), 'config' (everything except accounts), or 'both' (default, whole document)."),
227
+ },
228
+ async execute({ left, right, section }) {
229
+ const normalized = (section ?? "both").trim().toLowerCase();
230
+ const effectiveSection = normalized === "accounts" ||
231
+ normalized === "config" ||
232
+ normalized === "both"
233
+ ? normalized
234
+ : "both";
235
+ const [leftResult, rightResult] = await Promise.all([
236
+ readJsonFile(left),
237
+ readJsonFile(right),
238
+ ]);
239
+ const generatedAt = new Date().toISOString();
240
+ if (!leftResult.ok) {
241
+ const errorPayload = {
242
+ error: leftResult.error,
243
+ side: "left",
244
+ path: redactPath(left),
245
+ message: redactHomePaths(maskString(leftResult.message)),
246
+ redactionApplied: true,
247
+ generatedAt,
248
+ };
249
+ return redactHomePaths(maskString(JSON.stringify(errorPayload, null, 2)));
250
+ }
251
+ if (!rightResult.ok) {
252
+ const errorPayload = {
253
+ error: rightResult.error,
254
+ side: "right",
255
+ path: redactPath(right),
256
+ message: redactHomePaths(maskString(rightResult.message)),
257
+ redactionApplied: true,
258
+ generatedAt,
259
+ };
260
+ return redactHomePaths(maskString(JSON.stringify(errorPayload, null, 2)));
261
+ }
262
+ const leftSection = extractSection(leftResult.value, effectiveSection);
263
+ const rightSection = extractSection(rightResult.value, effectiveSection);
264
+ const entries = computeCodexDiff(leftSection, rightSection);
265
+ const summary = entries.reduce((acc, entry) => {
266
+ acc[entry.kind] += 1;
267
+ return acc;
268
+ }, { added: 0, removed: 0, changed: 0 });
269
+ const result = {
270
+ leftPath: redactPath(left),
271
+ rightPath: redactPath(right),
272
+ section: effectiveSection,
273
+ entries,
274
+ summary,
275
+ redactionApplied: true,
276
+ generatedAt,
277
+ };
278
+ // Defence in depth: mask any stray token-shaped substring and
279
+ // scrub home paths one more time across the rendered JSON.
280
+ return redactHomePaths(maskString(JSON.stringify(result, null, 2)));
281
+ },
282
+ });
283
+ }
284
+ //# sourceMappingURL=codex-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-diff.js","sourceRoot":"","sources":["../../../lib/tools/codex-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codex-doctor` tool — beginner-friendly diagnostics with optional auto-fix.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { type ToolDefinition } from "@opencode-ai/plugin/tool";
6
+ import type { ToolContext } from "./index.js";
7
+ export declare function createCodexDoctorTool(ctx: ToolContext): ToolDefinition;
8
+ //# sourceMappingURL=codex-doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-doctor.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA0BrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAoXtE"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * `codex-doctor` tool — beginner-friendly diagnostics with optional auto-fix.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { tool } from "@opencode-ai/plugin/tool";
6
+ import { getStoragePath, loadAccounts, saveAccounts, } from "../storage.js";
7
+ import { AccountManager } from "../accounts.js";
8
+ import { queuedRefresh } from "../refresh-queue.js";
9
+ import { MODEL_FAMILIES } from "../prompts/codex.js";
10
+ import { buildBeginnerDoctorFindings, formatPromptCacheSnapshot, recommendBeginnerNextAction, summarizeBeginnerAccounts, } from "../ui/beginner.js";
11
+ import { formatUiHeader, formatUiItem, formatUiKeyValue, formatUiSection, } from "../ui/format.js";
12
+ import { normalizeToolOutputFormat, renderJsonOutput, } from "../runtime.js";
13
+ export function createCodexDoctorTool(ctx) {
14
+ const { resolveUiRuntime, resolveActiveIndex, toBeginnerAccountSnapshots, getBeginnerRuntimeSnapshot, buildRoutingVisibilitySnapshot, appendRoutingVisibilityText, appendRoutingVisibilityUi, formatDoctorSeverity, formatDoctorSeverityText, runtimeMetrics, cachedAccountManagerRef, accountManagerPromiseRef, } = ctx;
15
+ return tool({
16
+ description: "Run beginner-friendly diagnostics with clear fixes.",
17
+ args: {
18
+ deep: tool.schema
19
+ .boolean()
20
+ .optional()
21
+ .describe("Include technical snapshot details (default: false)."),
22
+ fix: tool.schema
23
+ .boolean()
24
+ .optional()
25
+ .describe("Apply safe automated fixes (refresh tokens and switch to healthiest eligible account)."),
26
+ format: tool.schema
27
+ .string()
28
+ .optional()
29
+ .describe('Output format: "text" (default) or "json".'),
30
+ },
31
+ async execute({ deep, fix, format, } = {}) {
32
+ const ui = resolveUiRuntime();
33
+ const outputFormat = normalizeToolOutputFormat(format);
34
+ const storage = await loadAccounts();
35
+ const now = Date.now();
36
+ const activeIndex = storage && storage.accounts.length > 0
37
+ ? resolveActiveIndex(storage, "codex")
38
+ : 0;
39
+ const snapshots = storage
40
+ ? toBeginnerAccountSnapshots(storage, activeIndex, now)
41
+ : [];
42
+ const runtime = getBeginnerRuntimeSnapshot();
43
+ const summary = summarizeBeginnerAccounts(snapshots, now);
44
+ const findings = buildBeginnerDoctorFindings({
45
+ accounts: snapshots,
46
+ now,
47
+ runtime,
48
+ });
49
+ const nextAction = recommendBeginnerNextAction({
50
+ accounts: snapshots,
51
+ now,
52
+ runtime,
53
+ });
54
+ let routingVisibility = null;
55
+ const appliedFixes = [];
56
+ const fixErrors = [];
57
+ if (fix && storage && storage.accounts.length > 0) {
58
+ let changedByRefresh = false;
59
+ let refreshedCount = 0;
60
+ for (const account of storage.accounts) {
61
+ try {
62
+ const refreshResult = await queuedRefresh(account.refreshToken);
63
+ if (refreshResult.type === "success") {
64
+ account.refreshToken = refreshResult.refresh;
65
+ account.accessToken = refreshResult.access;
66
+ account.expiresAt = refreshResult.expires;
67
+ changedByRefresh = true;
68
+ refreshedCount += 1;
69
+ }
70
+ }
71
+ catch (error) {
72
+ fixErrors.push(error instanceof Error ? error.message : String(error));
73
+ }
74
+ }
75
+ if (changedByRefresh) {
76
+ try {
77
+ await saveAccounts(storage);
78
+ appliedFixes.push(`Refreshed ${refreshedCount} account token(s).`);
79
+ }
80
+ catch (error) {
81
+ fixErrors.push(`Failed to persist refresh updates: ${error instanceof Error ? error.message : String(error)}`);
82
+ }
83
+ }
84
+ try {
85
+ const managerForFix = await AccountManager.loadFromDisk();
86
+ const explainability = managerForFix.getSelectionExplainability("codex", undefined, Date.now());
87
+ const eligible = explainability
88
+ .filter((entry) => entry.eligible)
89
+ .sort((a, b) => {
90
+ if (b.healthScore !== a.healthScore)
91
+ return b.healthScore - a.healthScore;
92
+ return b.tokensAvailable - a.tokensAvailable;
93
+ });
94
+ const best = eligible[0];
95
+ if (best) {
96
+ const currentActive = resolveActiveIndex(storage, "codex");
97
+ if (best.index !== currentActive) {
98
+ storage.activeIndex = best.index;
99
+ storage.activeIndexByFamily =
100
+ storage.activeIndexByFamily ?? {};
101
+ for (const family of MODEL_FAMILIES) {
102
+ storage.activeIndexByFamily[family] = best.index;
103
+ }
104
+ await saveAccounts(storage);
105
+ appliedFixes.push(`Switched active account to ${best.index + 1} (best eligible).`);
106
+ }
107
+ }
108
+ else {
109
+ appliedFixes.push("No eligible account available for auto-switch.");
110
+ }
111
+ }
112
+ catch (error) {
113
+ fixErrors.push(`Auto-switch evaluation failed: ${error instanceof Error ? error.message : String(error)}`);
114
+ }
115
+ if (cachedAccountManagerRef.current) {
116
+ const reloadedManager = await AccountManager.loadFromDisk();
117
+ cachedAccountManagerRef.current = reloadedManager;
118
+ accountManagerPromiseRef.current =
119
+ Promise.resolve(reloadedManager);
120
+ }
121
+ }
122
+ if (deep) {
123
+ const managerForRouting = cachedAccountManagerRef.current ??
124
+ (await AccountManager.loadFromDisk());
125
+ const routingFamily = runtimeMetrics.lastSelectionSnapshot?.family ?? "codex";
126
+ const routingModel = runtimeMetrics.lastSelectionSnapshot?.effectiveModel ??
127
+ runtimeMetrics.lastSelectionSnapshot?.model ??
128
+ null;
129
+ const routingExplainability = managerForRouting.getSelectionExplainability(routingFamily, routingModel ?? undefined, Date.now());
130
+ const routingActiveIndex = storage && storage.accounts.length > 0
131
+ ? resolveActiveIndex(storage, routingFamily)
132
+ : null;
133
+ routingVisibility = buildRoutingVisibilitySnapshot({
134
+ modelFamily: routingFamily,
135
+ effectiveModel: routingModel,
136
+ quotaKey: routingModel
137
+ ? `${routingFamily}:${routingModel}`
138
+ : routingFamily,
139
+ selectedAccountIndex: routingActiveIndex,
140
+ selectionExplainability: routingExplainability,
141
+ });
142
+ }
143
+ if (outputFormat === "json") {
144
+ return renderJsonOutput({
145
+ summary: {
146
+ totalAccounts: summary.total,
147
+ healthyAccounts: summary.healthy,
148
+ blockedAccounts: summary.blocked,
149
+ failureRatePercent: runtime.totalRequests > 0
150
+ ? Math.round((runtime.failedRequests / runtime.totalRequests) * 100)
151
+ : 0,
152
+ },
153
+ findings: findings.map((finding) => ({
154
+ severity: finding.severity,
155
+ summary: finding.summary,
156
+ action: finding.action,
157
+ })),
158
+ recommendedNextAction: nextAction,
159
+ autoFix: fix
160
+ ? {
161
+ appliedFixes,
162
+ errors: fixErrors,
163
+ }
164
+ : null,
165
+ technicalSnapshot: deep
166
+ ? {
167
+ storagePath: getStoragePath(),
168
+ runtimeFailures: {
169
+ failedRequests: runtime.failedRequests,
170
+ rateLimitedResponses: runtime.rateLimitedResponses,
171
+ authRefreshFailures: runtime.authRefreshFailures,
172
+ serverErrors: runtime.serverErrors,
173
+ networkErrors: runtime.networkErrors,
174
+ },
175
+ promptCache: {
176
+ enabledRequests: runtime.promptCacheEnabledRequests,
177
+ missingRequests: runtime.promptCacheMissingRequests,
178
+ lastPromptCacheKey: runtime.lastPromptCacheKey,
179
+ summary: formatPromptCacheSnapshot(runtime),
180
+ },
181
+ routingVisibility,
182
+ }
183
+ : null,
184
+ });
185
+ }
186
+ if (ui.v2Enabled) {
187
+ const lines = [
188
+ ...formatUiHeader(ui, "Codex doctor"),
189
+ formatUiKeyValue(ui, "Accounts", String(summary.total)),
190
+ formatUiKeyValue(ui, "Healthy", String(summary.healthy), summary.healthy > 0 ? "success" : "warning"),
191
+ formatUiKeyValue(ui, "Blocked", String(summary.blocked), summary.blocked > 0 ? "warning" : "muted"),
192
+ formatUiKeyValue(ui, "Failure rate", runtime.totalRequests > 0
193
+ ? `${Math.round((runtime.failedRequests / runtime.totalRequests) * 100)}%`
194
+ : "0%"),
195
+ "",
196
+ ...formatUiSection(ui, "Findings"),
197
+ ];
198
+ for (const finding of findings) {
199
+ const tone = finding.severity === "ok"
200
+ ? "success"
201
+ : finding.severity === "warning"
202
+ ? "warning"
203
+ : "danger";
204
+ lines.push(formatUiItem(ui, `${formatDoctorSeverity(ui, finding.severity)} ${finding.summary}`, tone));
205
+ lines.push(` ${formatUiKeyValue(ui, "fix", finding.action, "muted")}`);
206
+ }
207
+ lines.push("");
208
+ lines.push(...formatUiSection(ui, "Recommended next step"));
209
+ lines.push(formatUiItem(ui, nextAction, "accent"));
210
+ if (fix) {
211
+ lines.push("");
212
+ lines.push(...formatUiSection(ui, "Auto-fix"));
213
+ if (appliedFixes.length === 0) {
214
+ lines.push(formatUiItem(ui, "No safe fixes were applied.", "muted"));
215
+ }
216
+ else {
217
+ for (const entry of appliedFixes) {
218
+ lines.push(formatUiItem(ui, entry, "success"));
219
+ }
220
+ }
221
+ for (const error of fixErrors) {
222
+ lines.push(formatUiItem(ui, error, "warning"));
223
+ }
224
+ }
225
+ if (deep) {
226
+ lines.push("");
227
+ lines.push(...formatUiSection(ui, "Technical snapshot"));
228
+ lines.push(formatUiKeyValue(ui, "Storage", getStoragePath(), "muted"));
229
+ lines.push(formatUiKeyValue(ui, "Runtime failures", `failed=${runtime.failedRequests}, rateLimited=${runtime.rateLimitedResponses}, authRefreshFailed=${runtime.authRefreshFailures}, server=${runtime.serverErrors}, network=${runtime.networkErrors}`, "muted"));
230
+ lines.push(formatUiKeyValue(ui, "Prompt cache", formatPromptCacheSnapshot(runtime), "muted"));
231
+ if (routingVisibility) {
232
+ lines.push("");
233
+ appendRoutingVisibilityUi(ui, lines, routingVisibility, {
234
+ includeExplainability: true,
235
+ });
236
+ }
237
+ }
238
+ return lines.join("\n");
239
+ }
240
+ const lines = [
241
+ "Codex Doctor:",
242
+ `Accounts: ${summary.total} (healthy=${summary.healthy}, blocked=${summary.blocked})`,
243
+ `Failure rate: ${runtime.totalRequests > 0 ? Math.round((runtime.failedRequests / runtime.totalRequests) * 100) : 0}%`,
244
+ "",
245
+ "Findings:",
246
+ ];
247
+ for (const finding of findings) {
248
+ lines.push(` ${formatDoctorSeverityText(finding.severity)} ${finding.summary}`);
249
+ lines.push(` fix: ${finding.action}`);
250
+ }
251
+ lines.push("");
252
+ lines.push(`Recommended next step: ${nextAction}`);
253
+ if (fix) {
254
+ lines.push("");
255
+ lines.push("Auto-fix:");
256
+ if (appliedFixes.length === 0) {
257
+ lines.push(" - No safe fixes were applied.");
258
+ }
259
+ else {
260
+ for (const entry of appliedFixes) {
261
+ lines.push(` - ${entry}`);
262
+ }
263
+ }
264
+ for (const error of fixErrors) {
265
+ lines.push(` - warning: ${error}`);
266
+ }
267
+ }
268
+ if (deep) {
269
+ lines.push("");
270
+ lines.push("Technical snapshot:");
271
+ lines.push(` Storage: ${getStoragePath()}`);
272
+ lines.push(` Runtime failures: failed=${runtime.failedRequests}, rateLimited=${runtime.rateLimitedResponses}, authRefreshFailed=${runtime.authRefreshFailures}, server=${runtime.serverErrors}, network=${runtime.networkErrors}`);
273
+ lines.push(` Prompt cache: ${formatPromptCacheSnapshot(runtime)}`);
274
+ if (routingVisibility) {
275
+ appendRoutingVisibilityText(lines, routingVisibility, {
276
+ includeExplainability: true,
277
+ });
278
+ }
279
+ }
280
+ return lines.join("\n");
281
+ },
282
+ });
283
+ }
284
+ //# sourceMappingURL=codex-doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-doctor.js","sourceRoot":"","sources":["../../../lib/tools/codex-doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codex-export` tool — export accounts to JSON file.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { type ToolDefinition } from "@opencode-ai/plugin/tool";
6
+ import type { ToolContext } from "./index.js";
7
+ export declare function createCodexExportTool(ctx: ToolContext): ToolDefinition;
8
+ //# sourceMappingURL=codex-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-export.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAOrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA2EtE"}