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.
- package/LICENSE +1 -1
- package/README.md +56 -18
- package/assets/readme-hero.svg +10 -10
- package/config/README.md +1 -1
- package/config/minimal-opencode.json +1 -1
- package/config/opencode-legacy.json +1 -1
- package/config/opencode-modern.json +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -2525
- package/dist/index.js.map +1 -1
- package/dist/lib/accounts/persistence.d.ts +34 -0
- package/dist/lib/accounts/persistence.d.ts.map +1 -0
- package/dist/lib/accounts/persistence.js +153 -0
- package/dist/lib/accounts/persistence.js.map +1 -0
- package/dist/lib/accounts/recovery.d.ts +59 -0
- package/dist/lib/accounts/recovery.d.ts.map +1 -0
- package/dist/lib/accounts/recovery.js +229 -0
- package/dist/lib/accounts/recovery.js.map +1 -0
- package/dist/lib/accounts/rotation.d.ts +40 -0
- package/dist/lib/accounts/rotation.d.ts.map +1 -0
- package/dist/lib/accounts/rotation.js +204 -0
- package/dist/lib/accounts/rotation.js.map +1 -0
- package/dist/lib/accounts/state.d.ts +92 -0
- package/dist/lib/accounts/state.d.ts.map +1 -0
- package/dist/lib/accounts/state.js +366 -0
- package/dist/lib/accounts/state.js.map +1 -0
- package/dist/lib/accounts.d.ts +48 -91
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +121 -699
- package/dist/lib/accounts.js.map +1 -1
- package/dist/lib/auth/auth.d.ts +1 -1
- package/dist/lib/auth/auth.d.ts.map +1 -1
- package/dist/lib/auth/auth.js +5 -2
- package/dist/lib/auth/auth.js.map +1 -1
- package/dist/lib/auth/login-runner.d.ts +32 -0
- package/dist/lib/auth/login-runner.d.ts.map +1 -1
- package/dist/lib/auth/login-runner.js +79 -64
- package/dist/lib/auth/login-runner.js.map +1 -1
- package/dist/lib/auth/server.d.ts.map +1 -1
- package/dist/lib/auth/server.js +3 -8
- package/dist/lib/auth/server.js.map +1 -1
- package/dist/lib/circuit-breaker.d.ts +53 -2
- package/dist/lib/circuit-breaker.d.ts.map +1 -1
- package/dist/lib/circuit-breaker.js +65 -6
- package/dist/lib/circuit-breaker.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +77 -32
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/error-sentinels.d.ts +20 -0
- package/dist/lib/error-sentinels.d.ts.map +1 -0
- package/dist/lib/error-sentinels.js +28 -0
- package/dist/lib/error-sentinels.js.map +1 -0
- package/dist/lib/errors.d.ts +100 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +116 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/logger.d.ts +14 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +65 -5
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/oauth-constants.d.ts +18 -0
- package/dist/lib/oauth-constants.d.ts.map +1 -0
- package/dist/lib/oauth-constants.js +18 -0
- package/dist/lib/oauth-constants.js.map +1 -0
- package/dist/lib/oauth-success.d.ts +2 -0
- package/dist/lib/oauth-success.d.ts.map +1 -0
- package/dist/lib/oauth-success.html +711 -711
- package/dist/lib/oauth-success.js +714 -0
- package/dist/lib/oauth-success.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -1
- package/dist/lib/prompts/codex.js +12 -3
- package/dist/lib/prompts/codex.js.map +1 -1
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -1
- package/dist/lib/prompts/opencode-codex.js +3 -2
- package/dist/lib/prompts/opencode-codex.js.map +1 -1
- package/dist/lib/recovery/hook.d.ts +43 -0
- package/dist/lib/recovery/hook.d.ts.map +1 -0
- package/dist/lib/recovery/hook.js +325 -0
- package/dist/lib/recovery/hook.js.map +1 -0
- package/dist/lib/recovery/index.d.ts +1 -0
- package/dist/lib/recovery/index.d.ts.map +1 -1
- package/dist/lib/recovery/index.js +1 -0
- package/dist/lib/recovery/index.js.map +1 -1
- package/dist/lib/recovery/storage.d.ts.map +1 -1
- package/dist/lib/recovery/storage.js +5 -1
- package/dist/lib/recovery/storage.js.map +1 -1
- package/dist/lib/recovery.d.ts +15 -30
- package/dist/lib/recovery.d.ts.map +1 -1
- package/dist/lib/recovery.js +14 -312
- package/dist/lib/recovery.js.map +1 -1
- package/dist/lib/request/fetch-helpers.d.ts +1 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
- package/dist/lib/request/fetch-helpers.js +58 -10
- package/dist/lib/request/fetch-helpers.js.map +1 -1
- package/dist/lib/request/response-handler.d.ts.map +1 -1
- package/dist/lib/request/response-handler.js +8 -2
- package/dist/lib/request/response-handler.js.map +1 -1
- package/dist/lib/runtime.d.ts +101 -0
- package/dist/lib/runtime.d.ts.map +1 -0
- package/dist/lib/runtime.js +77 -0
- package/dist/lib/runtime.js.map +1 -0
- package/dist/lib/schemas.d.ts +164 -1
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +251 -0
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/storage/atomic-write.d.ts +31 -0
- package/dist/lib/storage/atomic-write.d.ts.map +1 -0
- package/dist/lib/storage/atomic-write.js +75 -0
- package/dist/lib/storage/atomic-write.js.map +1 -0
- package/dist/lib/storage/backup.d.ts +13 -0
- package/dist/lib/storage/backup.d.ts.map +1 -0
- package/dist/lib/storage/backup.js +59 -0
- package/dist/lib/storage/backup.js.map +1 -0
- package/dist/lib/storage/errors.d.ts +17 -0
- package/dist/lib/storage/errors.d.ts.map +1 -0
- package/dist/lib/storage/errors.js +38 -0
- package/dist/lib/storage/errors.js.map +1 -0
- package/dist/lib/storage/export-import.d.ts +84 -0
- package/dist/lib/storage/export-import.d.ts.map +1 -0
- package/dist/lib/storage/export-import.js +222 -0
- package/dist/lib/storage/export-import.js.map +1 -0
- package/dist/lib/storage/flagged.d.ts +29 -0
- package/dist/lib/storage/flagged.d.ts.map +1 -0
- package/dist/lib/storage/flagged.js +207 -0
- package/dist/lib/storage/flagged.js.map +1 -0
- package/dist/lib/storage/identity.d.ts +72 -0
- package/dist/lib/storage/identity.d.ts.map +1 -0
- package/dist/lib/storage/identity.js +230 -0
- package/dist/lib/storage/identity.js.map +1 -0
- package/dist/lib/storage/keychain.d.ts +146 -0
- package/dist/lib/storage/keychain.d.ts.map +1 -0
- package/dist/lib/storage/keychain.js +278 -0
- package/dist/lib/storage/keychain.js.map +1 -0
- package/dist/lib/storage/load-save.d.ts +61 -0
- package/dist/lib/storage/load-save.d.ts.map +1 -0
- package/dist/lib/storage/load-save.js +606 -0
- package/dist/lib/storage/load-save.js.map +1 -0
- package/dist/lib/storage/migrations.d.ts +35 -0
- package/dist/lib/storage/migrations.d.ts.map +1 -1
- package/dist/lib/storage/migrations.js +37 -0
- package/dist/lib/storage/migrations.js.map +1 -1
- package/dist/lib/storage/normalize.d.ts +22 -0
- package/dist/lib/storage/normalize.d.ts.map +1 -0
- package/dist/lib/storage/normalize.js +114 -0
- package/dist/lib/storage/normalize.js.map +1 -0
- package/dist/lib/storage/paths.d.ts.map +1 -1
- package/dist/lib/storage/paths.js +2 -1
- package/dist/lib/storage/paths.js.map +1 -1
- package/dist/lib/storage/state.d.ts +46 -0
- package/dist/lib/storage/state.d.ts.map +1 -0
- package/dist/lib/storage/state.js +100 -0
- package/dist/lib/storage/state.js.map +1 -0
- package/dist/lib/storage/worktree-lock.d.ts +79 -0
- package/dist/lib/storage/worktree-lock.d.ts.map +1 -0
- package/dist/lib/storage/worktree-lock.js +265 -0
- package/dist/lib/storage/worktree-lock.js.map +1 -0
- package/dist/lib/storage.d.ts +21 -155
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +24 -1167
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/tools/_shared.d.ts +16 -0
- package/dist/lib/tools/_shared.d.ts.map +1 -0
- package/dist/lib/tools/_shared.js +21 -0
- package/dist/lib/tools/_shared.js.map +1 -0
- package/dist/lib/tools/codex-dashboard.d.ts +8 -0
- package/dist/lib/tools/codex-dashboard.d.ts.map +1 -0
- package/dist/lib/tools/codex-dashboard.js +176 -0
- package/dist/lib/tools/codex-dashboard.js.map +1 -0
- package/dist/lib/tools/codex-diag.d.ts +19 -0
- package/dist/lib/tools/codex-diag.d.ts.map +1 -0
- package/dist/lib/tools/codex-diag.js +139 -0
- package/dist/lib/tools/codex-diag.js.map +1 -0
- package/dist/lib/tools/codex-diff.d.ts +44 -0
- package/dist/lib/tools/codex-diff.d.ts.map +1 -0
- package/dist/lib/tools/codex-diff.js +284 -0
- package/dist/lib/tools/codex-diff.js.map +1 -0
- package/dist/lib/tools/codex-doctor.d.ts +8 -0
- package/dist/lib/tools/codex-doctor.d.ts.map +1 -0
- package/dist/lib/tools/codex-doctor.js +284 -0
- package/dist/lib/tools/codex-doctor.js.map +1 -0
- package/dist/lib/tools/codex-export.d.ts +8 -0
- package/dist/lib/tools/codex-export.d.ts.map +1 -0
- package/dist/lib/tools/codex-export.js +63 -0
- package/dist/lib/tools/codex-export.js.map +1 -0
- package/dist/lib/tools/codex-health.d.ts +8 -0
- package/dist/lib/tools/codex-health.d.ts.map +1 -0
- package/dist/lib/tools/codex-health.js +124 -0
- package/dist/lib/tools/codex-health.js.map +1 -0
- package/dist/lib/tools/codex-help.d.ts +8 -0
- package/dist/lib/tools/codex-help.d.ts.map +1 -0
- package/dist/lib/tools/codex-help.js +127 -0
- package/dist/lib/tools/codex-help.js.map +1 -0
- package/dist/lib/tools/codex-import.d.ts +8 -0
- package/dist/lib/tools/codex-import.d.ts.map +1 -0
- package/dist/lib/tools/codex-import.js +97 -0
- package/dist/lib/tools/codex-import.js.map +1 -0
- package/dist/lib/tools/codex-keychain.d.ts +36 -0
- package/dist/lib/tools/codex-keychain.d.ts.map +1 -0
- package/dist/lib/tools/codex-keychain.js +289 -0
- package/dist/lib/tools/codex-keychain.js.map +1 -0
- package/dist/lib/tools/codex-label.d.ts +8 -0
- package/dist/lib/tools/codex-label.d.ts.map +1 -0
- package/dist/lib/tools/codex-label.js +143 -0
- package/dist/lib/tools/codex-label.js.map +1 -0
- package/dist/lib/tools/codex-limits.d.ts +8 -0
- package/dist/lib/tools/codex-limits.d.ts.map +1 -0
- package/dist/lib/tools/codex-limits.js +497 -0
- package/dist/lib/tools/codex-limits.js.map +1 -0
- package/dist/lib/tools/codex-list.d.ts +8 -0
- package/dist/lib/tools/codex-list.d.ts.map +1 -0
- package/dist/lib/tools/codex-list.js +260 -0
- package/dist/lib/tools/codex-list.js.map +1 -0
- package/dist/lib/tools/codex-metrics.d.ts +8 -0
- package/dist/lib/tools/codex-metrics.d.ts.map +1 -0
- package/dist/lib/tools/codex-metrics.js +180 -0
- package/dist/lib/tools/codex-metrics.js.map +1 -0
- package/dist/lib/tools/codex-next.d.ts +8 -0
- package/dist/lib/tools/codex-next.d.ts.map +1 -0
- package/dist/lib/tools/codex-next.js +54 -0
- package/dist/lib/tools/codex-next.js.map +1 -0
- package/dist/lib/tools/codex-note.d.ts +8 -0
- package/dist/lib/tools/codex-note.d.ts.map +1 -0
- package/dist/lib/tools/codex-note.js +79 -0
- package/dist/lib/tools/codex-note.js.map +1 -0
- package/dist/lib/tools/codex-refresh.d.ts +8 -0
- package/dist/lib/tools/codex-refresh.d.ts.map +1 -0
- package/dist/lib/tools/codex-refresh.js +78 -0
- package/dist/lib/tools/codex-refresh.js.map +1 -0
- package/dist/lib/tools/codex-remove.d.ts +8 -0
- package/dist/lib/tools/codex-remove.d.ts.map +1 -0
- package/dist/lib/tools/codex-remove.js +184 -0
- package/dist/lib/tools/codex-remove.js.map +1 -0
- package/dist/lib/tools/codex-setup.d.ts +8 -0
- package/dist/lib/tools/codex-setup.d.ts.map +1 -0
- package/dist/lib/tools/codex-setup.js +26 -0
- package/dist/lib/tools/codex-setup.js.map +1 -0
- package/dist/lib/tools/codex-status.d.ts +8 -0
- package/dist/lib/tools/codex-status.d.ts.map +1 -0
- package/dist/lib/tools/codex-status.js +263 -0
- package/dist/lib/tools/codex-status.js.map +1 -0
- package/dist/lib/tools/codex-switch.d.ts +8 -0
- package/dist/lib/tools/codex-switch.d.ts.map +1 -0
- package/dist/lib/tools/codex-switch.js +122 -0
- package/dist/lib/tools/codex-switch.js.map +1 -0
- package/dist/lib/tools/codex-tag.d.ts +8 -0
- package/dist/lib/tools/codex-tag.d.ts.map +1 -0
- package/dist/lib/tools/codex-tag.js +101 -0
- package/dist/lib/tools/codex-tag.js.map +1 -0
- package/dist/lib/tools/index.d.ts +143 -0
- package/dist/lib/tools/index.d.ts.map +1 -0
- package/dist/lib/tools/index.js +67 -0
- package/dist/lib/tools/index.js.map +1 -0
- package/dist/lib/ui/format.d.ts.map +1 -1
- package/dist/lib/ui/format.js +5 -0
- package/dist/lib/ui/format.js.map +1 -1
- package/dist/lib/ui/runtime.d.ts +10 -0
- package/dist/lib/ui/runtime.d.ts.map +1 -1
- package/dist/lib/ui/runtime.js +16 -11
- package/dist/lib/ui/runtime.js.map +1 -1
- package/dist/lib/ui/select.d.ts.map +1 -1
- package/dist/lib/ui/select.js +12 -3
- package/dist/lib/ui/select.js.map +1 -1
- package/dist/lib/ui/theme.d.ts +19 -0
- package/dist/lib/ui/theme.d.ts.map +1 -1
- package/dist/lib/ui/theme.js +27 -0
- package/dist/lib/ui/theme.js.map +1 -1
- package/package.json +24 -16
- package/scripts/copy-oauth-success.js +16 -6
- package/scripts/install-oc-codex-multi-auth-core.js +462 -381
- package/scripts/install-oc-codex-multi-auth.js +15 -15
- package/scripts/test-all-models.sh +1 -1
- package/dist/lib/audit.d.ts +0 -45
- package/dist/lib/audit.d.ts.map +0 -1
- package/dist/lib/audit.js +0 -154
- package/dist/lib/audit.js.map +0 -1
- package/dist/lib/auth-rate-limit.d.ts +0 -20
- package/dist/lib/auth-rate-limit.d.ts.map +0 -1
- package/dist/lib/auth-rate-limit.js +0 -91
- package/dist/lib/auth-rate-limit.js.map +0 -1
- package/dist/lib/runtime-contracts.d.ts +0 -16
- package/dist/lib/runtime-contracts.d.ts.map +0 -1
- package/dist/lib/runtime-contracts.js +0 -24
- 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":"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"}
|