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