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,263 @@
1
+ /**
2
+ * `codex-status` tool — detailed per-account status and rate limits.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { tool } from "@opencode-ai/plugin/tool";
6
+ import { loadAccounts } from "../storage.js";
7
+ import { AccountManager, formatCooldown, formatWaitTime } from "../accounts.js";
8
+ import { MODEL_FAMILIES } from "../prompts/codex.js";
9
+ import { recommendBeginnerNextAction } from "../ui/beginner.js";
10
+ import { buildTableHeader, buildTableRow, } from "../table-formatter.js";
11
+ import { formatUiBadge, formatUiHeader, formatUiItem, formatUiKeyValue, formatUiSection, } from "../ui/format.js";
12
+ import { normalizeToolOutputFormat, renderJsonOutput } from "../runtime.js";
13
+ export function createCodexStatusTool(ctx) {
14
+ const { resolveUiRuntime, resolveActiveIndex, formatCommandAccountLabel, formatRateLimitEntry, getRateLimitResetTimeForFamily, buildJsonAccountIdentity, buildRoutingVisibilitySnapshot, appendRoutingVisibilityText, appendRoutingVisibilityUi, toBeginnerAccountSnapshots, getBeginnerRuntimeSnapshot, runtimeMetrics, cachedAccountManagerRef, } = ctx;
15
+ return tool({
16
+ description: "Show detailed status of Codex accounts and rate limits.",
17
+ args: {
18
+ format: tool.schema
19
+ .string()
20
+ .optional()
21
+ .describe('Output format: "text" (default) or "json".'),
22
+ includeSensitive: tool.schema
23
+ .boolean()
24
+ .optional()
25
+ .describe("Include raw account labels, emails, and account IDs in JSON output. Defaults to false."),
26
+ },
27
+ async execute({ format, includeSensitive, } = {}) {
28
+ const ui = resolveUiRuntime();
29
+ const outputFormat = normalizeToolOutputFormat(format);
30
+ const includeSensitiveOutput = includeSensitive === true;
31
+ const storage = await loadAccounts();
32
+ if (!storage || storage.accounts.length === 0) {
33
+ if (outputFormat === "json") {
34
+ return renderJsonOutput({
35
+ message: "No Codex accounts configured. Run: opencode auth login",
36
+ totalAccounts: 0,
37
+ accounts: [],
38
+ activeIndexByFamily: {},
39
+ rateLimitsByModelFamily: [],
40
+ routingVisibility: buildRoutingVisibilitySnapshot(),
41
+ recommendedNextAction: "Run opencode auth login",
42
+ });
43
+ }
44
+ if (ui.v2Enabled) {
45
+ return [
46
+ ...formatUiHeader(ui, "Account status"),
47
+ "",
48
+ formatUiItem(ui, "No accounts configured.", "warning"),
49
+ formatUiItem(ui, "Run: opencode auth login", "accent"),
50
+ ].join("\n");
51
+ }
52
+ return "No Codex accounts configured. Run: opencode auth login";
53
+ }
54
+ const now = Date.now();
55
+ const activeIndex = resolveActiveIndex(storage, "codex");
56
+ const explainabilityFamily = runtimeMetrics.lastSelectionSnapshot?.family ?? "codex";
57
+ const explainabilityModel = runtimeMetrics.lastSelectionSnapshot?.effectiveModel ??
58
+ runtimeMetrics.lastSelectionSnapshot?.model ??
59
+ undefined;
60
+ const managerForExplainability = cachedAccountManagerRef.current ?? (await AccountManager.loadFromDisk());
61
+ const explainability = managerForExplainability.getSelectionExplainability(explainabilityFamily, explainabilityModel, now);
62
+ const selectionQuotaKey = explainabilityModel
63
+ ? `${explainabilityFamily}:${explainabilityModel}`
64
+ : explainabilityFamily;
65
+ const routingVisibility = buildRoutingVisibilitySnapshot({
66
+ modelFamily: explainabilityFamily,
67
+ effectiveModel: explainabilityModel ?? null,
68
+ quotaKey: selectionQuotaKey,
69
+ selectedAccountIndex: activeIndex,
70
+ selectionExplainability: explainability,
71
+ });
72
+ const explainabilityByIndex = new Map(explainability.map((entry) => [entry.index, entry]));
73
+ const recommendedNextAction = recommendBeginnerNextAction({
74
+ accounts: toBeginnerAccountSnapshots(storage, activeIndex, now),
75
+ now,
76
+ runtime: getBeginnerRuntimeSnapshot(),
77
+ });
78
+ if (outputFormat === "json") {
79
+ return renderJsonOutput({
80
+ totalAccounts: storage.accounts.length,
81
+ selectionView: {
82
+ modelFamily: explainabilityFamily,
83
+ effectiveModel: explainabilityModel ?? null,
84
+ label: explainabilityModel
85
+ ? `${explainabilityFamily}:${explainabilityModel}`
86
+ : explainabilityFamily,
87
+ },
88
+ accounts: storage.accounts.map((account, index) => ({
89
+ ...buildJsonAccountIdentity(index, {
90
+ includeSensitive: includeSensitiveOutput,
91
+ account,
92
+ }),
93
+ enabled: account.enabled !== false,
94
+ isActive: index === activeIndex,
95
+ rateLimit: formatRateLimitEntry(account, now) ?? null,
96
+ cooldown: formatCooldown(account, now) ?? null,
97
+ lastUsedAgeMs: typeof account.lastUsed === "number" && account.lastUsed > 0
98
+ ? Math.max(0, now - account.lastUsed)
99
+ : null,
100
+ })),
101
+ activeIndexByFamily: Object.fromEntries(MODEL_FAMILIES.map((family) => [
102
+ family,
103
+ typeof storage.activeIndexByFamily?.[family] === "number"
104
+ ? (storage.activeIndexByFamily?.[family] ?? 0) + 1
105
+ : null,
106
+ ])),
107
+ rateLimitsByModelFamily: storage.accounts.map((account, index) => ({
108
+ ...buildJsonAccountIdentity(index, {
109
+ includeSensitive: includeSensitiveOutput,
110
+ account,
111
+ }),
112
+ families: Object.fromEntries(MODEL_FAMILIES.map((family) => {
113
+ const resetAt = getRateLimitResetTimeForFamily(account, now, family);
114
+ return [
115
+ family,
116
+ typeof resetAt === "number"
117
+ ? {
118
+ resetAtMs: resetAt,
119
+ wait: formatWaitTime(resetAt - now),
120
+ }
121
+ : null,
122
+ ];
123
+ })),
124
+ })),
125
+ routingVisibility,
126
+ recommendedNextAction,
127
+ });
128
+ }
129
+ if (ui.v2Enabled) {
130
+ const lines = [
131
+ ...formatUiHeader(ui, "Account status"),
132
+ formatUiKeyValue(ui, "Total", String(storage.accounts.length)),
133
+ formatUiKeyValue(ui, "Selection view", explainabilityModel
134
+ ? `${explainabilityFamily}:${explainabilityModel}`
135
+ : explainabilityFamily, "muted"),
136
+ "",
137
+ ...formatUiSection(ui, "Accounts"),
138
+ ];
139
+ storage.accounts.forEach((account, index) => {
140
+ const label = formatCommandAccountLabel(account, index);
141
+ const badges = [];
142
+ if (index === activeIndex)
143
+ badges.push(formatUiBadge(ui, "active", "accent"));
144
+ if (account.enabled === false)
145
+ badges.push(formatUiBadge(ui, "disabled", "danger"));
146
+ const rateLimit = formatRateLimitEntry(account, now) ?? "none";
147
+ const cooldown = formatCooldown(account, now) ?? "none";
148
+ if (rateLimit !== "none")
149
+ badges.push(formatUiBadge(ui, "rate-limited", "warning"));
150
+ if (cooldown !== "none")
151
+ badges.push(formatUiBadge(ui, "cooldown", "warning"));
152
+ if (badges.length === 0)
153
+ badges.push(formatUiBadge(ui, "ok", "success"));
154
+ lines.push(formatUiItem(ui, `${label} ${badges.join(" ")}`.trim()));
155
+ lines.push(` ${formatUiKeyValue(ui, "rate limit", rateLimit, rateLimit === "none" ? "muted" : "warning")}`);
156
+ lines.push(` ${formatUiKeyValue(ui, "cooldown", cooldown, cooldown === "none" ? "muted" : "warning")}`);
157
+ });
158
+ lines.push("");
159
+ lines.push(...formatUiSection(ui, "Active index by model family"));
160
+ for (const family of MODEL_FAMILIES) {
161
+ const idx = storage.activeIndexByFamily?.[family];
162
+ const familyIndexLabel = typeof idx === "number" && Number.isFinite(idx)
163
+ ? String(idx + 1)
164
+ : "-";
165
+ lines.push(formatUiItem(ui, `${family}: ${familyIndexLabel}`));
166
+ }
167
+ lines.push("");
168
+ lines.push(...formatUiSection(ui, "Rate limits by model family (per account)"));
169
+ storage.accounts.forEach((account, index) => {
170
+ const statuses = MODEL_FAMILIES.map((family) => {
171
+ const resetAt = getRateLimitResetTimeForFamily(account, now, family);
172
+ if (typeof resetAt !== "number")
173
+ return `${family}=ok`;
174
+ return `${family}=${formatWaitTime(resetAt - now)}`;
175
+ });
176
+ lines.push(formatUiItem(ui, `Account ${index + 1}: ${statuses.join(" | ")}`));
177
+ });
178
+ lines.push("");
179
+ appendRoutingVisibilityUi(ui, lines, routingVisibility);
180
+ lines.push("");
181
+ lines.push(...formatUiSection(ui, "Selection explainability"));
182
+ for (const entry of explainability) {
183
+ const state = entry.eligible ? "eligible" : "blocked";
184
+ const reasons = entry.reasons.join(", ");
185
+ lines.push(formatUiItem(ui, `Account ${entry.index + 1}: ${state} | health=${Math.round(entry.healthScore)} | tokens=${entry.tokensAvailable.toFixed(1)} | ${reasons}`));
186
+ }
187
+ lines.push("");
188
+ lines.push(...formatUiSection(ui, "Recommended next step"));
189
+ lines.push(formatUiItem(ui, recommendedNextAction, "accent"));
190
+ return lines.join("\n");
191
+ }
192
+ const statusTableOptions = {
193
+ columns: [
194
+ { header: "#", width: 3 },
195
+ { header: "Label", width: 42 },
196
+ { header: "Active", width: 6 },
197
+ { header: "Rate Limit", width: 16 },
198
+ { header: "Cooldown", width: 16 },
199
+ { header: "Last Used", width: 16 },
200
+ ],
201
+ };
202
+ const lines = [
203
+ `Account Status (${storage.accounts.length} total):`,
204
+ "",
205
+ ...buildTableHeader(statusTableOptions),
206
+ ];
207
+ storage.accounts.forEach((account, index) => {
208
+ const label = formatCommandAccountLabel(account, index);
209
+ const active = index === activeIndex ? "Yes" : "No";
210
+ const rateLimit = formatRateLimitEntry(account, now) ?? "None";
211
+ const cooldown = formatCooldown(account, now) ?? "No";
212
+ const lastUsed = typeof account.lastUsed === "number" && account.lastUsed > 0
213
+ ? `${formatWaitTime(now - account.lastUsed)} ago`
214
+ : "-";
215
+ lines.push(buildTableRow([
216
+ String(index + 1),
217
+ label,
218
+ active,
219
+ rateLimit,
220
+ cooldown,
221
+ lastUsed,
222
+ ], statusTableOptions));
223
+ });
224
+ lines.push("");
225
+ lines.push("Active index by model family:");
226
+ for (const family of MODEL_FAMILIES) {
227
+ const idx = storage.activeIndexByFamily?.[family];
228
+ const familyIndexLabel = typeof idx === "number" && Number.isFinite(idx)
229
+ ? String(idx + 1)
230
+ : "-";
231
+ lines.push(` ${family}: ${familyIndexLabel}`);
232
+ }
233
+ lines.push("");
234
+ lines.push("Rate limits by model family (per account):");
235
+ storage.accounts.forEach((account, index) => {
236
+ const statuses = MODEL_FAMILIES.map((family) => {
237
+ const resetAt = getRateLimitResetTimeForFamily(account, now, family);
238
+ if (typeof resetAt !== "number")
239
+ return `${family}=ok`;
240
+ return `${family}=${formatWaitTime(resetAt - now)}`;
241
+ });
242
+ lines.push(` Account ${index + 1}: ${statuses.join(" | ")}`);
243
+ });
244
+ lines.push("");
245
+ appendRoutingVisibilityText(lines, routingVisibility);
246
+ lines.push("");
247
+ lines.push(`Selection explainability (${explainabilityModel
248
+ ? `${explainabilityFamily}:${explainabilityModel}`
249
+ : explainabilityFamily}):`);
250
+ for (const [index] of storage.accounts.entries()) {
251
+ const details = explainabilityByIndex.get(index);
252
+ if (!details)
253
+ continue;
254
+ const state = details.eligible ? "eligible" : "blocked";
255
+ lines.push(` Account ${index + 1}: ${state} | health=${Math.round(details.healthScore)} | tokens=${details.tokensAvailable.toFixed(1)} | ${details.reasons.join(", ")}`);
256
+ }
257
+ lines.push("");
258
+ lines.push(`Recommended next step: ${recommendedNextAction}`);
259
+ return lines.join("\n");
260
+ },
261
+ });
262
+ }
263
+ //# sourceMappingURL=codex-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-status.js","sourceRoot":"","sources":["../../../lib/tools/codex-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codex-switch` tool — switch active Codex account by index or picker.
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 createCodexSwitchTool(ctx: ToolContext): ToolDefinition;
8
+ //# sourceMappingURL=codex-switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-switch.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-switch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAUrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAyJtE"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * `codex-switch` tool — switch active Codex account by index or picker.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { tool } from "@opencode-ai/plugin/tool";
6
+ import { loadAccounts, saveAccounts } from "../storage.js";
7
+ import { AccountManager } from "../accounts.js";
8
+ import { logWarn } from "../logger.js";
9
+ import { MODEL_FAMILIES } from "../prompts/codex.js";
10
+ import { formatUiHeader, formatUiItem, formatUiKeyValue, } from "../ui/format.js";
11
+ export function createCodexSwitchTool(ctx) {
12
+ const { resolveUiRuntime, promptAccountIndexSelection, supportsInteractiveMenus, formatCommandAccountLabel, getStatusMarker, cachedAccountManagerRef, accountManagerPromiseRef, } = ctx;
13
+ return tool({
14
+ description: "Switch active Codex account by index (1-based) or interactive picker when index is omitted.",
15
+ args: {
16
+ index: tool.schema
17
+ .number()
18
+ .optional()
19
+ .describe("Account number to switch to (1-based, e.g., 1 for first account)"),
20
+ },
21
+ async execute({ index } = {}) {
22
+ const ui = resolveUiRuntime();
23
+ const storage = await loadAccounts();
24
+ if (!storage || storage.accounts.length === 0) {
25
+ if (ui.v2Enabled) {
26
+ return [
27
+ ...formatUiHeader(ui, "Switch account"),
28
+ "",
29
+ formatUiItem(ui, "No accounts configured.", "warning"),
30
+ formatUiItem(ui, "Run: opencode auth login", "accent"),
31
+ ].join("\n");
32
+ }
33
+ return "No Codex accounts configured. Run: opencode auth login";
34
+ }
35
+ let resolvedIndex = index;
36
+ if (resolvedIndex === undefined) {
37
+ const selectedIndex = await promptAccountIndexSelection(ui, storage, "Switch account");
38
+ if (selectedIndex === null) {
39
+ if (supportsInteractiveMenus()) {
40
+ if (ui.v2Enabled) {
41
+ return [
42
+ ...formatUiHeader(ui, "Switch account"),
43
+ "",
44
+ formatUiItem(ui, "No account selected.", "warning"),
45
+ formatUiItem(ui, "Run again and pick an account, or pass codex-switch index=2.", "muted"),
46
+ ].join("\n");
47
+ }
48
+ return "No account selected.";
49
+ }
50
+ if (ui.v2Enabled) {
51
+ return [
52
+ ...formatUiHeader(ui, "Switch account"),
53
+ "",
54
+ formatUiItem(ui, "Missing account number.", "warning"),
55
+ formatUiItem(ui, "Use: codex-switch index=2", "accent"),
56
+ ].join("\n");
57
+ }
58
+ return "Missing account number. Use: codex-switch index=2";
59
+ }
60
+ resolvedIndex = selectedIndex + 1;
61
+ }
62
+ const targetIndex = Math.floor((resolvedIndex ?? 0) - 1);
63
+ if (!Number.isFinite(targetIndex) ||
64
+ targetIndex < 0 ||
65
+ targetIndex >= storage.accounts.length) {
66
+ if (ui.v2Enabled) {
67
+ return [
68
+ ...formatUiHeader(ui, "Switch account"),
69
+ "",
70
+ formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
71
+ formatUiKeyValue(ui, "Valid range", `1-${storage.accounts.length}`, "muted"),
72
+ ].join("\n");
73
+ }
74
+ return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${storage.accounts.length}`;
75
+ }
76
+ const now = Date.now();
77
+ const account = storage.accounts[targetIndex];
78
+ if (account) {
79
+ account.lastUsed = now;
80
+ account.lastSwitchReason = "rotation";
81
+ }
82
+ storage.activeIndex = targetIndex;
83
+ storage.activeIndexByFamily = storage.activeIndexByFamily ?? {};
84
+ for (const family of MODEL_FAMILIES) {
85
+ storage.activeIndexByFamily[family] = targetIndex;
86
+ }
87
+ try {
88
+ await saveAccounts(storage);
89
+ }
90
+ catch (saveError) {
91
+ logWarn("Failed to save account switch", {
92
+ error: String(saveError),
93
+ });
94
+ const label = formatCommandAccountLabel(account, targetIndex);
95
+ if (ui.v2Enabled) {
96
+ return [
97
+ ...formatUiHeader(ui, "Switch account"),
98
+ "",
99
+ formatUiItem(ui, `Switched to ${label}`, "warning"),
100
+ formatUiItem(ui, "Failed to persist change. It may be lost on restart.", "danger"),
101
+ ].join("\n");
102
+ }
103
+ return `Switched to ${label} but failed to persist. Changes may be lost on restart.`;
104
+ }
105
+ if (cachedAccountManagerRef.current) {
106
+ const reloadedManager = await AccountManager.loadFromDisk();
107
+ cachedAccountManagerRef.current = reloadedManager;
108
+ accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
109
+ }
110
+ const label = formatCommandAccountLabel(account, targetIndex);
111
+ if (ui.v2Enabled) {
112
+ return [
113
+ ...formatUiHeader(ui, "Switch account"),
114
+ "",
115
+ formatUiItem(ui, `${getStatusMarker(ui, "ok")} Switched to ${label}`, "success"),
116
+ ].join("\n");
117
+ }
118
+ return `Switched to account: ${label}`;
119
+ },
120
+ });
121
+ }
122
+ //# sourceMappingURL=codex-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-switch.js","sourceRoot":"","sources":["../../../lib/tools/codex-switch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codex-tag` tool — set or clear account tags.
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 createCodexTagTool(ctx: ToolContext): ToolDefinition;
8
+ //# sourceMappingURL=codex-tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-tag.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-tag.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AASrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA2HnE"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * `codex-tag` tool — set or clear account tags.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { tool } from "@opencode-ai/plugin/tool";
6
+ import { loadAccounts, saveAccounts } from "../storage.js";
7
+ import { AccountManager } from "../accounts.js";
8
+ import { logWarn } from "../logger.js";
9
+ import { formatUiHeader, formatUiItem, formatUiKeyValue, } from "../ui/format.js";
10
+ export function createCodexTagTool(ctx) {
11
+ const { resolveUiRuntime, promptAccountIndexSelection, supportsInteractiveMenus, formatCommandAccountLabel, getStatusMarker, normalizeAccountTags, cachedAccountManagerRef, accountManagerPromiseRef, } = ctx;
12
+ return tool({
13
+ description: "Set or clear account tags for filtering and grouping.",
14
+ args: {
15
+ index: tool.schema
16
+ .number()
17
+ .optional()
18
+ .describe("Account number to update (1-based, e.g., 1 for first account)"),
19
+ tags: tool.schema
20
+ .string()
21
+ .describe("Comma-separated tags (e.g., work,team-a). Empty string clears tags."),
22
+ },
23
+ async execute({ index, tags }) {
24
+ const ui = resolveUiRuntime();
25
+ const storage = await loadAccounts();
26
+ if (!storage || storage.accounts.length === 0) {
27
+ if (ui.v2Enabled) {
28
+ return [
29
+ ...formatUiHeader(ui, "Set account tags"),
30
+ "",
31
+ formatUiItem(ui, "No accounts configured.", "warning"),
32
+ formatUiItem(ui, "Run: opencode auth login", "accent"),
33
+ ].join("\n");
34
+ }
35
+ return "No Codex accounts configured. Run: opencode auth login";
36
+ }
37
+ let resolvedIndex = index;
38
+ if (resolvedIndex === undefined) {
39
+ const selectedIndex = await promptAccountIndexSelection(ui, storage, "Set account tags");
40
+ if (selectedIndex === null) {
41
+ if (supportsInteractiveMenus()) {
42
+ return ui.v2Enabled
43
+ ? [
44
+ ...formatUiHeader(ui, "Set account tags"),
45
+ "",
46
+ formatUiItem(ui, "No account selected.", "warning"),
47
+ ].join("\n")
48
+ : "No account selected.";
49
+ }
50
+ return 'Missing account number. Use: codex-tag index=2 tags="work,team-a"';
51
+ }
52
+ resolvedIndex = selectedIndex + 1;
53
+ }
54
+ const targetIndex = Math.floor((resolvedIndex ?? 0) - 1);
55
+ if (!Number.isFinite(targetIndex) ||
56
+ targetIndex < 0 ||
57
+ targetIndex >= storage.accounts.length) {
58
+ return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${storage.accounts.length}`;
59
+ }
60
+ const account = storage.accounts[targetIndex];
61
+ if (!account)
62
+ return `Account ${resolvedIndex} not found.`;
63
+ const normalizedTags = normalizeAccountTags(tags ?? "");
64
+ const previousTags = Array.isArray(account.accountTags)
65
+ ? [...account.accountTags]
66
+ : [];
67
+ if (normalizedTags.length === 0) {
68
+ delete account.accountTags;
69
+ }
70
+ else {
71
+ account.accountTags = normalizedTags;
72
+ }
73
+ try {
74
+ await saveAccounts(storage);
75
+ }
76
+ catch (error) {
77
+ logWarn("Failed to save account tag update", { error: String(error) });
78
+ return "Tag update failed to persist. Changes may be lost on restart.";
79
+ }
80
+ if (cachedAccountManagerRef.current) {
81
+ const reloadedManager = await AccountManager.loadFromDisk();
82
+ cachedAccountManagerRef.current = reloadedManager;
83
+ accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
84
+ }
85
+ const accountLabel = formatCommandAccountLabel(account, targetIndex);
86
+ const previousText = previousTags.length > 0 ? previousTags.join(", ") : "none";
87
+ const nextText = normalizedTags.length > 0 ? normalizedTags.join(", ") : "none";
88
+ if (ui.v2Enabled) {
89
+ return [
90
+ ...formatUiHeader(ui, "Set account tags"),
91
+ "",
92
+ formatUiItem(ui, `${getStatusMarker(ui, "ok")} Updated tags for ${accountLabel}`, "success"),
93
+ formatUiKeyValue(ui, "Previous tags", previousText, "muted"),
94
+ formatUiKeyValue(ui, "Current tags", nextText, normalizedTags.length > 0 ? "accent" : "muted"),
95
+ ].join("\n");
96
+ }
97
+ return `Updated tags for ${accountLabel}\nPrevious tags: ${previousText}\nCurrent tags: ${nextText}`;
98
+ },
99
+ });
100
+ }
101
+ //# sourceMappingURL=codex-tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-tag.js","sourceRoot":"","sources":["../../../lib/tools/codex-tag.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IAClD,MAAM,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,GACxB,GAAG,GAAG,CAAC;IACR,OAAO,IAAI,CAAC;QACX,WAAW,EAAE,uDAAuD;QACpE,IAAI,EAAE;YACL,KAAK,EAAE,IAAI,CAAC,MAAM;iBAChB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,+DAA+D,CAC/D;YACF,IAAI,EAAE,IAAI,CAAC,MAAM;iBACf,MAAM,EAAE;iBACR,QAAQ,CACR,qEAAqE,CACrE;SACF;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAoC;YAC9D,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/C,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAClB,OAAO;wBACN,GAAG,cAAc,CAAC,EAAE,EAAE,kBAAkB,CAAC;wBACzC,EAAE;wBACF,YAAY,CAAC,EAAE,EAAE,yBAAyB,EAAE,SAAS,CAAC;wBACtD,YAAY,CAAC,EAAE,EAAE,0BAA0B,EAAE,QAAQ,CAAC;qBACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,wDAAwD,CAAC;YACjE,CAAC;YAED,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,aAAa,GAAG,MAAM,2BAA2B,CACtD,EAAE,EACF,OAAO,EACP,kBAAkB,CAClB,CAAC;gBACF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBAC5B,IAAI,wBAAwB,EAAE,EAAE,CAAC;wBAChC,OAAO,EAAE,CAAC,SAAS;4BAClB,CAAC,CAAC;gCACA,GAAG,cAAc,CAAC,EAAE,EAAE,kBAAkB,CAAC;gCACzC,EAAE;gCACF,YAAY,CAAC,EAAE,EAAE,sBAAsB,EAAE,SAAS,CAAC;6BACnD,CAAC,IAAI,CAAC,IAAI,CAAC;4BACb,CAAC,CAAC,sBAAsB,CAAC;oBAC3B,CAAC;oBACD,OAAO,mEAAmE,CAAC;gBAC5E,CAAC;gBACD,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,IACC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC7B,WAAW,GAAG,CAAC;gBACf,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EACrC,CAAC;gBACF,OAAO,2BAA2B,aAAa,sBAAsB,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChG,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO;gBAAE,OAAO,WAAW,aAAa,aAAa,CAAC;YAC3D,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;gBACtD,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;gBAC1B,CAAC,CAAC,EAAE,CAAC;YACN,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC,WAAW,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,WAAW,GAAG,cAAc,CAAC;YACtC,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvE,OAAO,+DAA+D,CAAC;YACxE,CAAC;YAED,IAAI,uBAAuB,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;gBAC5D,uBAAuB,CAAC,OAAO,GAAG,eAAe,CAAC;gBAClD,wBAAwB,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACrE,MAAM,YAAY,GACjB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5D,MAAM,QAAQ,GACb,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAChE,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAClB,OAAO;oBACN,GAAG,cAAc,CAAC,EAAE,EAAE,kBAAkB,CAAC;oBACzC,EAAE;oBACF,YAAY,CACX,EAAE,EACF,GAAG,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,qBAAqB,YAAY,EAAE,EAC/D,SAAS,CACT;oBACD,gBAAgB,CAAC,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC;oBAC5D,gBAAgB,CACf,EAAE,EACF,cAAc,EACd,QAAQ,EACR,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAC9C;iBACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YACD,OAAO,oBAAoB,YAAY,oBAAoB,YAAY,mBAAmB,QAAQ,EAAE,CAAC;QACtG,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}