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,260 @@
1
+ /**
2
+ * `codex-list` tool — list all Codex OAuth accounts.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { tool } from "@opencode-ai/plugin/tool";
6
+ import { getStoragePath, loadAccounts } from "../storage.js";
7
+ import { formatCooldown } from "../accounts.js";
8
+ import { buildTableHeader, buildTableRow } from "../table-formatter.js";
9
+ import { formatUiBadge, formatUiHeader, formatUiItem, formatUiKeyValue, formatUiSection, paintUiText, } from "../ui/format.js";
10
+ import { normalizeToolOutputFormat, renderJsonOutput } from "../runtime.js";
11
+ export function createCodexListTool(ctx) {
12
+ const { resolveUiRuntime, resolveActiveIndex, formatCommandAccountLabel, formatRateLimitEntry, buildJsonAccountIdentity, } = ctx;
13
+ return tool({
14
+ description: "List all Codex OAuth accounts and the current active index.",
15
+ args: {
16
+ tag: tool.schema
17
+ .string()
18
+ .optional()
19
+ .describe("Optional tag filter (e.g., work, personal, team-a)."),
20
+ format: tool.schema
21
+ .string()
22
+ .optional()
23
+ .describe('Output format: "text" (default) or "json".'),
24
+ includeSensitive: tool.schema
25
+ .boolean()
26
+ .optional()
27
+ .describe("Include raw account labels, emails, and account IDs in JSON output. Defaults to false."),
28
+ },
29
+ async execute({ tag, format, includeSensitive, } = {}) {
30
+ const ui = resolveUiRuntime();
31
+ const storage = await loadAccounts();
32
+ const storePath = getStoragePath();
33
+ const outputFormat = normalizeToolOutputFormat(format);
34
+ const includeSensitiveOutput = includeSensitive === true;
35
+ const normalizedTag = tag?.trim().toLowerCase() ?? "";
36
+ const commandHints = [
37
+ "opencode auth login",
38
+ "codex-status",
39
+ "codex-dashboard",
40
+ "codex-metrics",
41
+ "codex-doctor",
42
+ "codex-setup",
43
+ "codex-next",
44
+ "codex-label",
45
+ "codex-tag",
46
+ "codex-note",
47
+ "codex-help",
48
+ ];
49
+ if (!storage || storage.accounts.length === 0) {
50
+ if (outputFormat === "json") {
51
+ return renderJsonOutput({
52
+ message: "No Codex accounts configured. Run: opencode auth login",
53
+ storagePath: storePath,
54
+ filterTag: normalizedTag || null,
55
+ totalAccounts: 0,
56
+ totalStoredAccounts: 0,
57
+ activeIndex: null,
58
+ accounts: [],
59
+ commands: commandHints,
60
+ });
61
+ }
62
+ if (ui.v2Enabled) {
63
+ return [
64
+ ...formatUiHeader(ui, "Codex accounts"),
65
+ "",
66
+ formatUiItem(ui, "No accounts configured.", "warning"),
67
+ formatUiItem(ui, "Run: opencode auth login", "accent"),
68
+ formatUiItem(ui, "Setup checklist: codex-setup"),
69
+ formatUiItem(ui, "Command guide: codex-help"),
70
+ formatUiKeyValue(ui, "Storage", storePath, "muted"),
71
+ ].join("\n");
72
+ }
73
+ return [
74
+ "No Codex accounts configured.",
75
+ "",
76
+ "Add accounts:",
77
+ " opencode auth login",
78
+ " codex-setup",
79
+ " codex-help",
80
+ "",
81
+ `Storage: ${storePath}`,
82
+ ].join("\n");
83
+ }
84
+ const now = Date.now();
85
+ const activeIndex = resolveActiveIndex(storage, "codex");
86
+ const filteredEntries = storage.accounts
87
+ .map((account, index) => ({ account, index }))
88
+ .filter(({ account }) => {
89
+ if (!normalizedTag)
90
+ return true;
91
+ const tags = Array.isArray(account.accountTags)
92
+ ? account.accountTags.map((entry) => entry.trim().toLowerCase())
93
+ : [];
94
+ return tags.includes(normalizedTag);
95
+ });
96
+ if (normalizedTag && filteredEntries.length === 0) {
97
+ if (outputFormat === "json") {
98
+ return renderJsonOutput({
99
+ message: `No accounts found for tag: ${normalizedTag}`,
100
+ storagePath: storePath,
101
+ filterTag: normalizedTag,
102
+ totalAccounts: 0,
103
+ totalStoredAccounts: storage.accounts.length,
104
+ activeIndex: activeIndex + 1,
105
+ accounts: [],
106
+ commands: commandHints,
107
+ });
108
+ }
109
+ if (ui.v2Enabled) {
110
+ return [
111
+ ...formatUiHeader(ui, "Codex accounts"),
112
+ "",
113
+ formatUiItem(ui, `No accounts found for tag: ${normalizedTag}`, "warning"),
114
+ formatUiItem(ui, 'Use codex-tag index=2 tags="work,team-a" to add tags.', "accent"),
115
+ ].join("\n");
116
+ }
117
+ return `No accounts found for tag: ${normalizedTag}\n\nUse codex-tag index=2 tags="work,team-a" to add tags.`;
118
+ }
119
+ if (outputFormat === "json") {
120
+ return renderJsonOutput({
121
+ totalAccounts: filteredEntries.length,
122
+ totalStoredAccounts: storage.accounts.length,
123
+ activeIndex: activeIndex + 1,
124
+ filterTag: normalizedTag || null,
125
+ storagePath: storePath,
126
+ accounts: filteredEntries.map(({ account, index }) => {
127
+ const rateLimit = formatRateLimitEntry(account, now);
128
+ const cooldown = formatCooldown(account, now);
129
+ const statuses = [];
130
+ if (index === activeIndex)
131
+ statuses.push("active");
132
+ if (account.enabled === false)
133
+ statuses.push("disabled");
134
+ if (rateLimit)
135
+ statuses.push("rate-limited");
136
+ if (cooldown)
137
+ statuses.push("cooldown");
138
+ if (statuses.length === 0)
139
+ statuses.push("ok");
140
+ return {
141
+ ...buildJsonAccountIdentity(index, {
142
+ includeSensitive: includeSensitiveOutput,
143
+ account,
144
+ }),
145
+ enabled: account.enabled !== false,
146
+ isActive: index === activeIndex,
147
+ rateLimit: rateLimit ?? null,
148
+ cooldown: cooldown ?? null,
149
+ tags: Array.isArray(account.accountTags)
150
+ ? [...account.accountTags]
151
+ : [],
152
+ note: account.accountNote ?? null,
153
+ statuses,
154
+ };
155
+ }),
156
+ commands: commandHints,
157
+ });
158
+ }
159
+ if (ui.v2Enabled) {
160
+ const lines = [
161
+ ...formatUiHeader(ui, "Codex accounts"),
162
+ formatUiKeyValue(ui, "Total", String(filteredEntries.length)),
163
+ normalizedTag
164
+ ? formatUiKeyValue(ui, "Filter tag", normalizedTag, "accent")
165
+ : formatUiKeyValue(ui, "Filter tag", "none", "muted"),
166
+ formatUiKeyValue(ui, "Storage", storePath, "muted"),
167
+ "",
168
+ ...formatUiSection(ui, "Accounts"),
169
+ ];
170
+ filteredEntries.forEach(({ account, index }) => {
171
+ const label = formatCommandAccountLabel(account, index);
172
+ const badges = [];
173
+ if (index === activeIndex)
174
+ badges.push(formatUiBadge(ui, "current", "accent"));
175
+ if (account.enabled === false)
176
+ badges.push(formatUiBadge(ui, "disabled", "danger"));
177
+ const rateLimit = formatRateLimitEntry(account, now);
178
+ if (rateLimit)
179
+ badges.push(formatUiBadge(ui, "rate-limited", "warning"));
180
+ if (typeof account.coolingDownUntil === "number" &&
181
+ account.coolingDownUntil > now) {
182
+ badges.push(formatUiBadge(ui, "cooldown", "warning"));
183
+ }
184
+ if (badges.length === 0) {
185
+ badges.push(formatUiBadge(ui, "ok", "success"));
186
+ }
187
+ lines.push(formatUiItem(ui, `${label} ${badges.join(" ")}`.trim()));
188
+ if (rateLimit) {
189
+ lines.push(` ${paintUiText(ui, `rate limit: ${rateLimit}`, "muted")}`);
190
+ }
191
+ });
192
+ lines.push("");
193
+ lines.push(...formatUiSection(ui, "Commands"));
194
+ lines.push(formatUiItem(ui, "Add account: opencode auth login", "accent"));
195
+ lines.push(formatUiItem(ui, "Switch account: codex-switch index=2"));
196
+ lines.push(formatUiItem(ui, "Detailed status: codex-status"));
197
+ lines.push(formatUiItem(ui, "Live dashboard: codex-dashboard"));
198
+ lines.push(formatUiItem(ui, "Runtime metrics: codex-metrics"));
199
+ lines.push(formatUiItem(ui, 'Set account tags: codex-tag index=2 tags="work,team-a"'));
200
+ lines.push(formatUiItem(ui, 'Set account note: codex-note index=2 note="weekday primary"'));
201
+ lines.push(formatUiItem(ui, "Doctor checks: codex-doctor"));
202
+ lines.push(formatUiItem(ui, "Onboarding checklist: codex-setup"));
203
+ lines.push(formatUiItem(ui, "Guided setup wizard: codex-setup --wizard"));
204
+ lines.push(formatUiItem(ui, "Best next action: codex-next"));
205
+ lines.push(formatUiItem(ui, 'Rename account label: codex-label index=2 label="Work"'));
206
+ lines.push(formatUiItem(ui, "Command guide: codex-help"));
207
+ return lines.join("\n");
208
+ }
209
+ const listTableOptions = {
210
+ columns: [
211
+ { header: "#", width: 3 },
212
+ { header: "Label", width: 42 },
213
+ { header: "Status", width: 20 },
214
+ ],
215
+ };
216
+ const lines = [
217
+ `Codex Accounts (${filteredEntries.length}):`,
218
+ "",
219
+ ...buildTableHeader(listTableOptions),
220
+ ];
221
+ filteredEntries.forEach(({ account, index }) => {
222
+ const label = formatCommandAccountLabel(account, index);
223
+ const statuses = [];
224
+ const rateLimit = formatRateLimitEntry(account, now);
225
+ if (index === activeIndex)
226
+ statuses.push("active");
227
+ if (rateLimit)
228
+ statuses.push("rate-limited");
229
+ if (typeof account.coolingDownUntil === "number" &&
230
+ account.coolingDownUntil > now) {
231
+ statuses.push("cooldown");
232
+ }
233
+ const statusText = statuses.length > 0 ? statuses.join(", ") : "ok";
234
+ lines.push(buildTableRow([String(index + 1), label, statusText], listTableOptions));
235
+ });
236
+ lines.push("");
237
+ lines.push(`Storage: ${storePath}`);
238
+ if (normalizedTag) {
239
+ lines.push(`Filter tag: ${normalizedTag}`);
240
+ }
241
+ lines.push("");
242
+ lines.push("Commands:");
243
+ lines.push(" - Add account: opencode auth login");
244
+ lines.push(" - Switch account: codex-switch");
245
+ lines.push(" - Status details: codex-status");
246
+ lines.push(" - Live dashboard: codex-dashboard");
247
+ lines.push(" - Runtime metrics: codex-metrics");
248
+ lines.push(" - Set account tags: codex-tag");
249
+ lines.push(" - Set account note: codex-note");
250
+ lines.push(" - Doctor checks: codex-doctor");
251
+ lines.push(" - Setup checklist: codex-setup");
252
+ lines.push(" - Guided setup wizard: codex-setup --wizard");
253
+ lines.push(" - Best next action: codex-next");
254
+ lines.push(" - Rename account label: codex-label");
255
+ lines.push(" - Command guide: codex-help");
256
+ return lines.join("\n");
257
+ },
258
+ });
259
+ }
260
+ //# sourceMappingURL=codex-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-list.js","sourceRoot":"","sources":["../../../lib/tools/codex-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codex-metrics` tool — runtime request metrics.
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 createCodexMetricsTool(ctx: ToolContext): ToolDefinition;
8
+ //# sourceMappingURL=codex-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-metrics.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA8SvE"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * `codex-metrics` tool — runtime request metrics.
3
+ * Extracted from `index.ts` per RC-1 Phase 2.
4
+ */
5
+ import { tool } from "@opencode-ai/plugin/tool";
6
+ import { formatWaitTime } from "../accounts.js";
7
+ import { getRefreshQueueMetrics } from "../refresh-queue.js";
8
+ import { formatUiHeader, formatUiKeyValue, } from "../ui/format.js";
9
+ import { normalizeToolOutputFormat, renderJsonOutput } from "../runtime.js";
10
+ export function createCodexMetricsTool(ctx) {
11
+ const { resolveUiRuntime, runtimeMetrics, beginnerSafeModeRef, buildRoutingVisibilitySnapshot, appendRoutingVisibilityText, appendRoutingVisibilityUi, } = ctx;
12
+ return tool({
13
+ description: "Show runtime request metrics for this plugin process.",
14
+ args: {
15
+ format: tool.schema
16
+ .string()
17
+ .optional()
18
+ .describe('Output format: "text" (default) or "json".'),
19
+ },
20
+ execute({ format } = {}) {
21
+ const ui = resolveUiRuntime();
22
+ const outputFormat = normalizeToolOutputFormat(format);
23
+ const now = Date.now();
24
+ const uptimeMs = Math.max(0, now - runtimeMetrics.startedAt);
25
+ const total = runtimeMetrics.totalRequests;
26
+ const successful = runtimeMetrics.successfulRequests;
27
+ const refreshMetrics = getRefreshQueueMetrics();
28
+ const successRate = total > 0 ? ((successful / total) * 100).toFixed(1) : "0.0";
29
+ const avgLatencyMs = successful > 0
30
+ ? Math.round(runtimeMetrics.cumulativeLatencyMs / successful)
31
+ : 0;
32
+ const lastRequest = runtimeMetrics.lastRequestAt !== null
33
+ ? `${formatWaitTime(now - runtimeMetrics.lastRequestAt)} ago`
34
+ : "never";
35
+ const routingVisibility = buildRoutingVisibilitySnapshot();
36
+ const beginnerSafeModeEnabled = beginnerSafeModeRef.current;
37
+ if (outputFormat === "json") {
38
+ return Promise.resolve(renderJsonOutput({
39
+ uptimeMs,
40
+ totalRequests: total,
41
+ successfulResponses: successful,
42
+ failedResponses: runtimeMetrics.failedRequests,
43
+ successRatePercent: Number(successRate),
44
+ averageSuccessfulLatencyMs: avgLatencyMs,
45
+ rateLimitedResponses: runtimeMetrics.rateLimitedResponses,
46
+ serverErrors: runtimeMetrics.serverErrors,
47
+ networkErrors: runtimeMetrics.networkErrors,
48
+ authRefreshFailures: runtimeMetrics.authRefreshFailures,
49
+ accountRotations: runtimeMetrics.accountRotations,
50
+ emptyResponseRetries: runtimeMetrics.emptyResponseRetries,
51
+ retryProfile: runtimeMetrics.retryProfile,
52
+ beginnerSafeMode: beginnerSafeModeEnabled,
53
+ retryBudgetExhaustions: runtimeMetrics.retryBudgetExhaustions,
54
+ retryBudgetUsage: { ...runtimeMetrics.retryBudgetUsage },
55
+ retryBudgetLimits: { ...runtimeMetrics.retryBudgetLimits },
56
+ refreshQueue: { ...refreshMetrics },
57
+ lastRequestAt: runtimeMetrics.lastRequestAt,
58
+ lastRequestAgeMs: runtimeMetrics.lastRequestAt !== null
59
+ ? Math.max(0, now - runtimeMetrics.lastRequestAt)
60
+ : null,
61
+ lastError: runtimeMetrics.lastError,
62
+ lastErrorCategory: runtimeMetrics.lastErrorCategory,
63
+ lastSelectedAccountIndex: runtimeMetrics.lastSelectedAccountIndex === null
64
+ ? null
65
+ : runtimeMetrics.lastSelectedAccountIndex + 1,
66
+ lastQuotaKey: runtimeMetrics.lastQuotaKey,
67
+ lastBudgetExhaustion: runtimeMetrics.lastRetryBudgetExhaustedClass === null
68
+ ? null
69
+ : {
70
+ budgetClass: runtimeMetrics.lastRetryBudgetExhaustedClass,
71
+ reason: runtimeMetrics.lastRetryBudgetReason,
72
+ },
73
+ routingVisibility,
74
+ }));
75
+ }
76
+ const lines = [
77
+ "Codex Plugin Metrics:",
78
+ "",
79
+ `Uptime: ${formatWaitTime(uptimeMs)}`,
80
+ `Total upstream requests: ${total}`,
81
+ `Successful responses: ${successful}`,
82
+ `Failed responses: ${runtimeMetrics.failedRequests}`,
83
+ `Success rate: ${successRate}%`,
84
+ `Average successful latency: ${avgLatencyMs}ms`,
85
+ `Rate-limited responses: ${runtimeMetrics.rateLimitedResponses}`,
86
+ `Server errors (5xx): ${runtimeMetrics.serverErrors}`,
87
+ `Network errors: ${runtimeMetrics.networkErrors}`,
88
+ `Auth refresh failures: ${runtimeMetrics.authRefreshFailures}`,
89
+ `Account rotations: ${runtimeMetrics.accountRotations}`,
90
+ `Empty-response retries: ${runtimeMetrics.emptyResponseRetries}`,
91
+ `Retry profile: ${runtimeMetrics.retryProfile}`,
92
+ `Beginner safe mode: ${beginnerSafeModeEnabled ? "on" : "off"}`,
93
+ `Retry budget exhaustions: ${runtimeMetrics.retryBudgetExhaustions}`,
94
+ `Retry budget usage (auth/network/server/short/global/empty): ` +
95
+ `${runtimeMetrics.retryBudgetUsage.authRefresh}/` +
96
+ `${runtimeMetrics.retryBudgetUsage.network}/` +
97
+ `${runtimeMetrics.retryBudgetUsage.server}/` +
98
+ `${runtimeMetrics.retryBudgetUsage.rateLimitShort}/` +
99
+ `${runtimeMetrics.retryBudgetUsage.rateLimitGlobal}/` +
100
+ `${runtimeMetrics.retryBudgetUsage.emptyResponse}`,
101
+ `Refresh queue (started/success/failed/pending): ` +
102
+ `${refreshMetrics.started}/` +
103
+ `${refreshMetrics.succeeded}/` +
104
+ `${refreshMetrics.failed}/` +
105
+ `${refreshMetrics.pending}`,
106
+ `Last upstream request: ${lastRequest}`,
107
+ ];
108
+ if (runtimeMetrics.lastError) {
109
+ lines.push(`Last error: ${runtimeMetrics.lastError}`);
110
+ }
111
+ if (runtimeMetrics.lastErrorCategory) {
112
+ lines.push(`Last error category: ${runtimeMetrics.lastErrorCategory}`);
113
+ }
114
+ if (runtimeMetrics.lastSelectedAccountIndex !== null) {
115
+ lines.push(`Last selected account: ${runtimeMetrics.lastSelectedAccountIndex + 1}`);
116
+ }
117
+ if (runtimeMetrics.lastQuotaKey) {
118
+ lines.push(`Last quota key: ${runtimeMetrics.lastQuotaKey}`);
119
+ }
120
+ if (runtimeMetrics.lastRetryBudgetExhaustedClass) {
121
+ lines.push(`Last budget exhaustion: ${runtimeMetrics.lastRetryBudgetExhaustedClass}` +
122
+ (runtimeMetrics.lastRetryBudgetReason
123
+ ? ` (${runtimeMetrics.lastRetryBudgetReason})`
124
+ : ""));
125
+ }
126
+ lines.push("");
127
+ appendRoutingVisibilityText(lines, routingVisibility, {
128
+ includeExplainability: true,
129
+ });
130
+ if (ui.v2Enabled) {
131
+ const styled = [
132
+ ...formatUiHeader(ui, "Codex plugin metrics"),
133
+ formatUiKeyValue(ui, "Uptime", formatWaitTime(uptimeMs)),
134
+ formatUiKeyValue(ui, "Total upstream requests", String(total)),
135
+ formatUiKeyValue(ui, "Successful responses", String(successful), "success"),
136
+ formatUiKeyValue(ui, "Failed responses", String(runtimeMetrics.failedRequests), "danger"),
137
+ formatUiKeyValue(ui, "Success rate", `${successRate}%`, "accent"),
138
+ formatUiKeyValue(ui, "Average successful latency", `${avgLatencyMs}ms`),
139
+ formatUiKeyValue(ui, "Rate-limited responses", String(runtimeMetrics.rateLimitedResponses), "warning"),
140
+ formatUiKeyValue(ui, "Server errors (5xx)", String(runtimeMetrics.serverErrors), "danger"),
141
+ formatUiKeyValue(ui, "Network errors", String(runtimeMetrics.networkErrors), "danger"),
142
+ formatUiKeyValue(ui, "Auth refresh failures", String(runtimeMetrics.authRefreshFailures), "warning"),
143
+ formatUiKeyValue(ui, "Account rotations", String(runtimeMetrics.accountRotations), "accent"),
144
+ formatUiKeyValue(ui, "Empty-response retries", String(runtimeMetrics.emptyResponseRetries), "warning"),
145
+ formatUiKeyValue(ui, "Retry profile", runtimeMetrics.retryProfile, "muted"),
146
+ formatUiKeyValue(ui, "Beginner safe mode", beginnerSafeModeEnabled ? "on" : "off", beginnerSafeModeEnabled ? "accent" : "muted"),
147
+ formatUiKeyValue(ui, "Retry budget exhaustions", String(runtimeMetrics.retryBudgetExhaustions), "warning"),
148
+ formatUiKeyValue(ui, "Retry budget usage", `A${runtimeMetrics.retryBudgetUsage.authRefresh} N${runtimeMetrics.retryBudgetUsage.network} S${runtimeMetrics.retryBudgetUsage.server} RS${runtimeMetrics.retryBudgetUsage.rateLimitShort} RG${runtimeMetrics.retryBudgetUsage.rateLimitGlobal} E${runtimeMetrics.retryBudgetUsage.emptyResponse}`, "muted"),
149
+ formatUiKeyValue(ui, "Retry budget limits", `A${runtimeMetrics.retryBudgetLimits.authRefresh} N${runtimeMetrics.retryBudgetLimits.network} S${runtimeMetrics.retryBudgetLimits.server} RS${runtimeMetrics.retryBudgetLimits.rateLimitShort} RG${runtimeMetrics.retryBudgetLimits.rateLimitGlobal} E${runtimeMetrics.retryBudgetLimits.emptyResponse}`, "muted"),
150
+ formatUiKeyValue(ui, "Refresh queue", `started=${refreshMetrics.started} dedup=${refreshMetrics.deduplicated} reuse=${refreshMetrics.rotationReused} success=${refreshMetrics.succeeded} failed=${refreshMetrics.failed} pending=${refreshMetrics.pending}`, "muted"),
151
+ formatUiKeyValue(ui, "Last upstream request", lastRequest, "muted"),
152
+ ];
153
+ if (runtimeMetrics.lastError) {
154
+ styled.push(formatUiKeyValue(ui, "Last error", runtimeMetrics.lastError, "danger"));
155
+ }
156
+ if (runtimeMetrics.lastErrorCategory) {
157
+ styled.push(formatUiKeyValue(ui, "Last error category", runtimeMetrics.lastErrorCategory, "warning"));
158
+ }
159
+ if (runtimeMetrics.lastSelectedAccountIndex !== null) {
160
+ styled.push(formatUiKeyValue(ui, "Last selected account", String(runtimeMetrics.lastSelectedAccountIndex + 1), "accent"));
161
+ }
162
+ if (runtimeMetrics.lastQuotaKey) {
163
+ styled.push(formatUiKeyValue(ui, "Last quota key", runtimeMetrics.lastQuotaKey, "muted"));
164
+ }
165
+ if (runtimeMetrics.lastRetryBudgetExhaustedClass) {
166
+ styled.push(formatUiKeyValue(ui, "Last budget exhaustion", runtimeMetrics.lastRetryBudgetReason
167
+ ? `${runtimeMetrics.lastRetryBudgetExhaustedClass} (${runtimeMetrics.lastRetryBudgetReason})`
168
+ : runtimeMetrics.lastRetryBudgetExhaustedClass, "warning"));
169
+ }
170
+ styled.push("");
171
+ appendRoutingVisibilityUi(ui, styled, routingVisibility, {
172
+ includeExplainability: true,
173
+ });
174
+ return Promise.resolve(styled.join("\n"));
175
+ }
176
+ return Promise.resolve(lines.join("\n"));
177
+ },
178
+ });
179
+ }
180
+ //# sourceMappingURL=codex-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-metrics.js","sourceRoot":"","sources":["../../../lib/tools/codex-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codex-next` tool — single best next action.
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 createCodexNextTool(ctx: ToolContext): ToolDefinition;
8
+ //# sourceMappingURL=codex-next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-next.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-next.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,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAmDpE"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * `codex-next` tool — single best next action.
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 { recommendBeginnerNextAction, } from "../ui/beginner.js";
8
+ import { formatUiHeader, formatUiItem } from "../ui/format.js";
9
+ import { normalizeToolOutputFormat, renderJsonOutput } from "../runtime.js";
10
+ export function createCodexNextTool(ctx) {
11
+ const { resolveUiRuntime, resolveActiveIndex, toBeginnerAccountSnapshots, getBeginnerRuntimeSnapshot, } = ctx;
12
+ return tool({
13
+ description: "Show the single most recommended next action for beginners.",
14
+ args: {
15
+ format: tool.schema
16
+ .string()
17
+ .optional()
18
+ .describe('Output format: "text" (default) or "json".'),
19
+ },
20
+ async execute({ format } = {}) {
21
+ const ui = resolveUiRuntime();
22
+ const outputFormat = normalizeToolOutputFormat(format);
23
+ const storage = await loadAccounts();
24
+ const now = Date.now();
25
+ const activeIndex = storage && storage.accounts.length > 0
26
+ ? resolveActiveIndex(storage, "codex")
27
+ : 0;
28
+ const snapshots = storage
29
+ ? toBeginnerAccountSnapshots(storage, activeIndex, now)
30
+ : [];
31
+ const action = recommendBeginnerNextAction({
32
+ accounts: snapshots,
33
+ now,
34
+ runtime: getBeginnerRuntimeSnapshot(),
35
+ });
36
+ if (outputFormat === "json") {
37
+ return renderJsonOutput({
38
+ recommendedNextAction: action,
39
+ totalAccounts: snapshots.length,
40
+ activeIndex: storage && storage.accounts.length > 0 ? activeIndex + 1 : null,
41
+ });
42
+ }
43
+ if (ui.v2Enabled) {
44
+ return [
45
+ ...formatUiHeader(ui, "Recommended next action"),
46
+ "",
47
+ formatUiItem(ui, action, "accent"),
48
+ ].join("\n");
49
+ }
50
+ return `Recommended next action:\n${action}`;
51
+ },
52
+ });
53
+ }
54
+ //# sourceMappingURL=codex-next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-next.js","sourceRoot":"","sources":["../../../lib/tools/codex-next.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACN,2BAA2B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG5E,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IACnD,MAAM,EACL,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,EAC1B,0BAA0B,GAC1B,GAAG,GAAG,CAAC;IACR,OAAO,IAAI,CAAC;QACX,WAAW,EACV,6DAA6D;QAC9D,IAAI,EAAE;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;iBACjB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4CAA4C,CAAC;SACxD;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,KAA0B,EAAE;YACjD,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAChB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,SAAS,GAAG,OAAO;gBACxB,CAAC,CAAC,0BAA0B,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC;gBACvD,CAAC,CAAC,EAAE,CAAC;YACN,MAAM,MAAM,GAAG,2BAA2B,CAAC;gBAC1C,QAAQ,EAAE,SAAS;gBACnB,GAAG;gBACH,OAAO,EAAE,0BAA0B,EAAE;aACrC,CAAC,CAAC;YACH,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,gBAAgB,CAAC;oBACvB,qBAAqB,EAAE,MAAM;oBAC7B,aAAa,EAAE,SAAS,CAAC,MAAM;oBAC/B,WAAW,EACV,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;iBAChE,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAClB,OAAO;oBACN,GAAG,cAAc,CAAC,EAAE,EAAE,yBAAyB,CAAC;oBAChD,EAAE;oBACF,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC;iBAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YACD,OAAO,6BAA6B,MAAM,EAAE,CAAC;QAC9C,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codex-note` tool — set or clear per-account reminder note.
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 createCodexNoteTool(ctx: ToolContext): ToolDefinition;
8
+ //# sourceMappingURL=codex-note.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-note.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-note.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAIrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAwFpE"}