codex-multi-auth 1.2.7 → 1.3.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/README.md +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -21
- package/dist/index.js.map +1 -1
- package/dist/lib/accounts.d.ts +47 -0
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +219 -33
- package/dist/lib/accounts.js.map +1 -1
- package/dist/lib/auth/auth.d.ts +16 -0
- package/dist/lib/auth/auth.d.ts.map +1 -1
- package/dist/lib/auth/auth.js +52 -6
- package/dist/lib/auth/auth.js.map +1 -1
- package/dist/lib/auth/server.d.ts +1 -1
- package/dist/lib/auth/server.d.ts.map +1 -1
- package/dist/lib/auth/server.js +10 -8
- package/dist/lib/auth/server.js.map +1 -1
- package/dist/lib/codex-manager/commands/status.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/status.js +13 -5
- package/dist/lib/codex-manager/commands/status.js.map +1 -1
- package/dist/lib/codex-manager/commands/verify.d.ts +59 -0
- package/dist/lib/codex-manager/commands/verify.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/verify.js +332 -0
- package/dist/lib/codex-manager/commands/verify.js.map +1 -0
- package/dist/lib/codex-manager/commands/why-selected.d.ts +57 -0
- package/dist/lib/codex-manager/commands/why-selected.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/why-selected.js +198 -0
- package/dist/lib/codex-manager/commands/why-selected.js.map +1 -0
- package/dist/lib/codex-manager/help.d.ts.map +1 -1
- package/dist/lib/codex-manager/help.js +4 -0
- package/dist/lib/codex-manager/help.js.map +1 -1
- package/dist/lib/codex-manager/settings-hub/backend.d.ts +9 -0
- package/dist/lib/codex-manager/settings-hub/backend.d.ts.map +1 -0
- package/dist/lib/codex-manager/settings-hub/backend.js +79 -0
- package/dist/lib/codex-manager/settings-hub/backend.js.map +1 -0
- package/dist/lib/codex-manager/settings-hub/dashboard.d.ts +24 -0
- package/dist/lib/codex-manager/settings-hub/dashboard.d.ts.map +1 -0
- package/dist/lib/codex-manager/settings-hub/dashboard.js +223 -0
- package/dist/lib/codex-manager/settings-hub/dashboard.js.map +1 -0
- package/dist/lib/codex-manager/settings-hub/experimental.d.ts +18 -0
- package/dist/lib/codex-manager/settings-hub/experimental.d.ts.map +1 -0
- package/dist/lib/codex-manager/settings-hub/experimental.js +78 -0
- package/dist/lib/codex-manager/settings-hub/experimental.js.map +1 -0
- package/dist/lib/codex-manager/settings-hub/index.d.ts +34 -0
- package/dist/lib/codex-manager/settings-hub/index.d.ts.map +1 -0
- package/dist/lib/codex-manager/settings-hub/index.js +81 -0
- package/dist/lib/codex-manager/settings-hub/index.js.map +1 -0
- package/dist/lib/codex-manager/settings-hub/shared.d.ts +40 -0
- package/dist/lib/codex-manager/settings-hub/shared.d.ts.map +1 -0
- package/dist/lib/codex-manager/settings-hub/shared.js +103 -0
- package/dist/lib/codex-manager/settings-hub/shared.js.map +1 -0
- package/dist/lib/codex-manager/settings-hub.d.ts +1 -64
- package/dist/lib/codex-manager/settings-hub.d.ts.map +1 -1
- package/dist/lib/codex-manager/settings-hub.js +4 -515
- package/dist/lib/codex-manager/settings-hub.js.map +1 -1
- package/dist/lib/codex-manager.d.ts.map +1 -1
- package/dist/lib/codex-manager.js +95 -13
- package/dist/lib/codex-manager.js.map +1 -1
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +21 -9
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/health.d.ts.map +1 -1
- package/dist/lib/health.js.map +1 -1
- package/dist/lib/recovery/storage.d.ts.map +1 -1
- package/dist/lib/recovery/storage.js +112 -8
- package/dist/lib/recovery/storage.js.map +1 -1
- package/dist/lib/request/response-handler.d.ts.map +1 -1
- package/dist/lib/request/response-handler.js +67 -23
- package/dist/lib/request/response-handler.js.map +1 -1
- package/dist/lib/rotation.d.ts +53 -1
- package/dist/lib/rotation.d.ts.map +1 -1
- package/dist/lib/rotation.js +135 -23
- package/dist/lib/rotation.js.map +1 -1
- package/dist/lib/routing-mutex.d.ts +107 -0
- package/dist/lib/routing-mutex.d.ts.map +1 -0
- package/dist/lib/routing-mutex.js +104 -0
- package/dist/lib/routing-mutex.js.map +1 -0
- package/dist/lib/runtime/storage-scope.d.ts.map +1 -1
- package/dist/lib/runtime/storage-scope.js +17 -1
- package/dist/lib/runtime/storage-scope.js.map +1 -1
- package/dist/lib/schemas.d.ts +125 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +139 -5
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/storage/account-clear.d.ts.map +1 -1
- package/dist/lib/storage/account-clear.js +7 -1
- package/dist/lib/storage/account-clear.js.map +1 -1
- package/dist/lib/storage/flagged-storage-file.d.ts.map +1 -1
- package/dist/lib/storage/flagged-storage-file.js +17 -1
- package/dist/lib/storage/flagged-storage-file.js.map +1 -1
- package/dist/lib/storage/flagged-storage-io.d.ts.map +1 -1
- package/dist/lib/storage/flagged-storage-io.js +24 -10
- package/dist/lib/storage/flagged-storage-io.js.map +1 -1
- package/dist/lib/storage/import-export.d.ts.map +1 -1
- package/dist/lib/storage/import-export.js +16 -4
- package/dist/lib/storage/import-export.js.map +1 -1
- package/dist/lib/storage/paths.d.ts.map +1 -1
- package/dist/lib/storage/paths.js +62 -7
- package/dist/lib/storage/paths.js.map +1 -1
- package/dist/lib/storage/snapshot-inspectors.d.ts.map +1 -1
- package/dist/lib/storage/snapshot-inspectors.js +23 -16
- package/dist/lib/storage/snapshot-inspectors.js.map +1 -1
- package/dist/lib/storage/storage-parser.d.ts +17 -0
- package/dist/lib/storage/storage-parser.d.ts.map +1 -1
- package/dist/lib/storage/storage-parser.js +30 -1
- package/dist/lib/storage/storage-parser.js.map +1 -1
- package/dist/lib/storage.d.ts +1 -1
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +45 -26
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/ui/copy.d.ts +1 -1
- package/dist/lib/ui/copy.d.ts.map +1 -1
- package/dist/lib/ui/copy.js +2 -1
- package/dist/lib/ui/copy.js.map +1 -1
- package/package.json +5 -5
|
@@ -4,11 +4,18 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
6
6
|
import { createHash } from "node:crypto";
|
|
7
|
-
import { basename, dirname, isAbsolute, join, relative, resolve, win32 } from "node:path";
|
|
7
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep, win32, } from "node:path";
|
|
8
8
|
import { homedir, tmpdir } from "node:os";
|
|
9
9
|
import { getCodexMultiAuthDir } from "../runtime-paths.js";
|
|
10
10
|
import { getStoragePathState } from "./path-state.js";
|
|
11
|
-
const PROJECT_MARKERS = [
|
|
11
|
+
const PROJECT_MARKERS = [
|
|
12
|
+
".git",
|
|
13
|
+
"package.json",
|
|
14
|
+
"Cargo.toml",
|
|
15
|
+
"go.mod",
|
|
16
|
+
"pyproject.toml",
|
|
17
|
+
".codex",
|
|
18
|
+
];
|
|
12
19
|
const PROJECTS_DIR = "projects";
|
|
13
20
|
const PROJECT_KEY_HASH_LENGTH = 12;
|
|
14
21
|
function parseGitDirPointer(pointerContent) {
|
|
@@ -25,7 +32,9 @@ function normalizePathDelimiters(pathValue) {
|
|
|
25
32
|
return pathValue.replace(/\\/g, "/");
|
|
26
33
|
}
|
|
27
34
|
function isWindowsRootedPath(pathValue) {
|
|
28
|
-
return /^[A-Za-z]:[\\/]/.test(pathValue) ||
|
|
35
|
+
return (/^[A-Za-z]:[\\/]/.test(pathValue) ||
|
|
36
|
+
/^\\\\[^\\]/.test(pathValue) ||
|
|
37
|
+
/^\/\/[^/]/.test(pathValue));
|
|
29
38
|
}
|
|
30
39
|
function resolveGitPath(basePath, pointerValue) {
|
|
31
40
|
const trimmedPointer = pointerValue.trim();
|
|
@@ -72,11 +81,15 @@ function normalizePathForIdentityCheck(pathValue) {
|
|
|
72
81
|
return normalizedDelimiters;
|
|
73
82
|
}
|
|
74
83
|
if (isWindowsRootedPath(normalizedDelimiters)) {
|
|
75
|
-
return win32
|
|
84
|
+
return win32
|
|
85
|
+
.normalize(normalizedDelimiters.replace(/\//g, "\\"))
|
|
86
|
+
.toLowerCase();
|
|
76
87
|
}
|
|
77
88
|
const resolvedPath = resolve(normalizedDelimiters);
|
|
78
89
|
const normalizedResolved = normalizePathDelimiters(resolvedPath);
|
|
79
|
-
return process.platform === "win32"
|
|
90
|
+
return process.platform === "win32"
|
|
91
|
+
? normalizedResolved.toLowerCase()
|
|
92
|
+
: normalizedResolved;
|
|
80
93
|
}
|
|
81
94
|
function normalizeCanonicalPathForIdentityCheck(pathValue) {
|
|
82
95
|
const normalized = normalizePathForIdentityCheck(pathValue);
|
|
@@ -175,7 +188,9 @@ function normalizeProjectPath(projectPath) {
|
|
|
175
188
|
*/
|
|
176
189
|
function sanitizeProjectName(projectPath) {
|
|
177
190
|
const name = basename(projectPath);
|
|
178
|
-
const sanitized = name
|
|
191
|
+
const sanitized = name
|
|
192
|
+
.replace(/[^a-zA-Z0-9._-]+/g, "-")
|
|
193
|
+
.replace(/^-+|-+$/g, "");
|
|
179
194
|
return sanitized || "project";
|
|
180
195
|
}
|
|
181
196
|
/**
|
|
@@ -286,7 +301,9 @@ export function findProjectRoot(startDir) {
|
|
|
286
301
|
}
|
|
287
302
|
function normalizePathForComparison(filePath) {
|
|
288
303
|
const resolvedPath = resolve(filePath);
|
|
289
|
-
return process.platform === "win32"
|
|
304
|
+
return process.platform === "win32"
|
|
305
|
+
? resolvedPath.toLowerCase()
|
|
306
|
+
: resolvedPath;
|
|
290
307
|
}
|
|
291
308
|
function isWithinDirectory(baseDir, targetPath) {
|
|
292
309
|
const normalizedBase = normalizePathForComparison(baseDir);
|
|
@@ -294,6 +311,34 @@ function isWithinDirectory(baseDir, targetPath) {
|
|
|
294
311
|
const rel = relative(normalizedBase, normalizedTarget);
|
|
295
312
|
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
296
313
|
}
|
|
314
|
+
/**
|
|
315
|
+
* Detects lookalike-prefix paths such as `~/../home-outside/file.json` where the
|
|
316
|
+
* target string shares a character prefix with `baseDir` but is actually a sibling
|
|
317
|
+
* (not a descendant). A trailing separator after the base prefix must be present
|
|
318
|
+
* to be considered a proper descendant; anything else (e.g. `home-evil/...`) is a
|
|
319
|
+
* lookalike sibling and must be rejected to prevent path-guard bypass.
|
|
320
|
+
*
|
|
321
|
+
* Filesystem roots (POSIX `/`, Windows `C:\`) are stripped of their trailing
|
|
322
|
+
* separator before comparison so that legitimate descendants such as
|
|
323
|
+
* `C:\Users\neil\.codex\...` are not misclassified as siblings. A root has no
|
|
324
|
+
* siblings by construction, so after the strip we return false early when the
|
|
325
|
+
* base is empty (POSIX root) or just a drive letter (Windows root).
|
|
326
|
+
*/
|
|
327
|
+
function isLookalikeSibling(baseDir, targetPath) {
|
|
328
|
+
const normalizedBase = normalizePathForComparison(baseDir);
|
|
329
|
+
const normalizedTarget = normalizePathForComparison(targetPath);
|
|
330
|
+
const baseWithoutTrailingSep = normalizedBase.replace(/[\\/]+$/, "");
|
|
331
|
+
if (baseWithoutTrailingSep === "" ||
|
|
332
|
+
/^[a-z]:$/.test(baseWithoutTrailingSep)) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
if (normalizedTarget.length <= baseWithoutTrailingSep.length)
|
|
336
|
+
return false;
|
|
337
|
+
if (!normalizedTarget.startsWith(baseWithoutTrailingSep))
|
|
338
|
+
return false;
|
|
339
|
+
const boundary = normalizedTarget.charAt(baseWithoutTrailingSep.length);
|
|
340
|
+
return boundary !== sep && boundary !== "/" && boundary !== "\\";
|
|
341
|
+
}
|
|
297
342
|
export function resolvePath(filePath) {
|
|
298
343
|
let resolved;
|
|
299
344
|
if (filePath.startsWith("~")) {
|
|
@@ -305,6 +350,16 @@ export function resolvePath(filePath) {
|
|
|
305
350
|
const home = homedir();
|
|
306
351
|
const projectRoot = getStoragePathState().currentProjectRoot ?? process.cwd();
|
|
307
352
|
const tmp = tmpdir();
|
|
353
|
+
// Reject lookalike-prefix siblings of any approved root, even if the path
|
|
354
|
+
// happens to be within another approved root. A string like
|
|
355
|
+
// `<parent-of-home>/<basename(home)>-outside/file.json` is a sibling of home
|
|
356
|
+
// that must not be treated as within home; without this check, a permissive
|
|
357
|
+
// project-root match could still grant access to a lookalike home path.
|
|
358
|
+
if (isLookalikeSibling(home, resolved) ||
|
|
359
|
+
isLookalikeSibling(projectRoot, resolved) ||
|
|
360
|
+
isLookalikeSibling(tmp, resolved)) {
|
|
361
|
+
throw new Error(`Access denied: path must be within home directory, project directory, or temp directory`);
|
|
362
|
+
}
|
|
308
363
|
if (!isWithinDirectory(home, resolved) &&
|
|
309
364
|
!isWithinDirectory(projectRoot, resolved) &&
|
|
310
365
|
!isWithinDirectory(tmp, resolved)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../lib/storage/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../lib/storage/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-inspectors.d.ts","sourceRoot":"","sources":["../../../lib/storage/snapshot-inspectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"snapshot-inspectors.d.ts","sourceRoot":"","sources":["../../../lib/storage/snapshot-inspectors.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EACX,sBAAsB,EACtB,aAAa,EACb,MAAM,sBAAsB,CAAC;AAE9B,wBAAsB,2BAA2B,CAChD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACL,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,QAAQ,EAAE,cAAc,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACrD,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACtC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,wBAAwB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK;QAC5C,UAAU,EAAE;YAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;SAAE,GAAG,IAAI,CAAC;QAC3C,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACF,GACC,OAAO,CAAC,sBAAsB,CAAC,CAmEjC;AAED,wBAAsB,uBAAuB,CAC5C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,EACpC,IAAI,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,2BAA2B,EAAE,CAC5B,IAAI,EAAE,MAAM,KACR,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACnE,GACC,OAAO,CAAC,sBAAsB,CAAC,CAoCjC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AccountsJournalEntrySchema, AnyAccountStorageSchema, safeParseJson, } from "../schemas.js";
|
|
1
2
|
export async function describeAccountsWalSnapshot(path, deps) {
|
|
2
3
|
const stats = await deps.statSnapshot(path);
|
|
3
4
|
if (!stats.exists) {
|
|
@@ -5,8 +6,8 @@ export async function describeAccountsWalSnapshot(path, deps) {
|
|
|
5
6
|
}
|
|
6
7
|
try {
|
|
7
8
|
const raw = await deps.readFile(path, "utf-8");
|
|
8
|
-
const
|
|
9
|
-
if (!deps.
|
|
9
|
+
const entry = safeParseJson(raw, AccountsJournalEntrySchema, "storage.snapshot-inspectors.accounts-wal");
|
|
10
|
+
if (!entry || deps.computeSha256(entry.content) !== entry.checksum) {
|
|
10
11
|
return {
|
|
11
12
|
kind: "accounts-wal",
|
|
12
13
|
path,
|
|
@@ -16,21 +17,27 @@ export async function describeAccountsWalSnapshot(path, deps) {
|
|
|
16
17
|
mtimeMs: stats.mtimeMs,
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
const validatedInner = safeParseJson(entry.content, AnyAccountStorageSchema, "storage.snapshot-inspectors.accounts-wal.content");
|
|
21
|
+
let innerData;
|
|
22
|
+
if (validatedInner !== null) {
|
|
23
|
+
innerData = validatedInner;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
try {
|
|
27
|
+
innerData = JSON.parse(entry.content);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return {
|
|
31
|
+
kind: "accounts-wal",
|
|
32
|
+
path,
|
|
33
|
+
exists: true,
|
|
34
|
+
valid: false,
|
|
35
|
+
bytes: stats.bytes,
|
|
36
|
+
mtimeMs: stats.mtimeMs,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
32
39
|
}
|
|
33
|
-
const { normalized, storedVersion, schemaErrors } = deps.parseAndNormalizeStorage(
|
|
40
|
+
const { normalized, storedVersion, schemaErrors } = deps.parseAndNormalizeStorage(innerData);
|
|
34
41
|
return {
|
|
35
42
|
kind: "accounts-wal",
|
|
36
43
|
path,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-inspectors.js","sourceRoot":"","sources":["../../../lib/storage/snapshot-inspectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"snapshot-inspectors.js","sourceRoot":"","sources":["../../../lib/storage/snapshot-inspectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,23 @@ export declare function parseAndNormalizeStorage(data: unknown, normalizeAccount
|
|
|
4
4
|
storedVersion: unknown;
|
|
5
5
|
schemaErrors: string[];
|
|
6
6
|
};
|
|
7
|
+
/**
|
|
8
|
+
* Load account storage from disk through the Zod-guarded JSON boundary.
|
|
9
|
+
*
|
|
10
|
+
* Semantics:
|
|
11
|
+
* - `fs.readFile` errors (ENOENT, etc.) still propagate unchanged.
|
|
12
|
+
* - `SyntaxError` from `JSON.parse` is also re-thrown unchanged. Callers in
|
|
13
|
+
* `lib/storage.ts` (`loadAccountsInternal`, `loadAccountsFromJournal`,
|
|
14
|
+
* `diagnoseStorageHealth`, backup recovery) rely on `SyntaxError` to trigger
|
|
15
|
+
* WAL / backup recovery paths. Converting parse failures to `null` would
|
|
16
|
+
* silently skip recovery and is explicitly preserved as a throw contract.
|
|
17
|
+
* - On happy path, Zod is the authoritative normalizer: `AnyAccountStorageSchema`
|
|
18
|
+
* validates the on-disk shape before `parseAndNormalizeStorage` runs.
|
|
19
|
+
* - When JSON parses cleanly but violates `AnyAccountStorageSchema`, we still
|
|
20
|
+
* fall back through the TS-side `normalizeAccountStorage` so legacy
|
|
21
|
+
* unknown-shape files can be surfaced with schema warnings (non-zero
|
|
22
|
+
* `schemaErrors`).
|
|
23
|
+
*/
|
|
7
24
|
export declare function loadAccountsFromPath(path: string, deps: {
|
|
8
25
|
normalizeAccountStorage: (data: unknown) => AccountStorageV3 | null;
|
|
9
26
|
isRecord: (value: unknown) => value is Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-parser.d.ts","sourceRoot":"","sources":["../../../lib/storage/storage-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage-parser.d.ts","sourceRoot":"","sources":["../../../lib/storage/storage-parser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,wBAAgB,wBAAwB,CACvC,IAAI,EAAE,OAAO,EACb,uBAAuB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,GAAG,IAAI,EACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5D;IACF,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB,CAOA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,oBAAoB,CACzC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACL,uBAAuB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,GAAG,IAAI,CAAC;IACpE,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/D,GACC,OAAO,CAAC;IACV,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC,CA8BD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
|
-
import { AnyAccountStorageSchema, getValidationErrors } from "../schemas.js";
|
|
2
|
+
import { AnyAccountStorageSchema, getValidationErrors, safeParseJson, } from "../schemas.js";
|
|
3
3
|
export function parseAndNormalizeStorage(data, normalizeAccountStorage, isRecord) {
|
|
4
4
|
const schemaErrors = getValidationErrors(AnyAccountStorageSchema, data);
|
|
5
5
|
const normalized = normalizeAccountStorage(data);
|
|
@@ -8,8 +8,37 @@ export function parseAndNormalizeStorage(data, normalizeAccountStorage, isRecord
|
|
|
8
8
|
: undefined;
|
|
9
9
|
return { normalized, storedVersion, schemaErrors };
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Load account storage from disk through the Zod-guarded JSON boundary.
|
|
13
|
+
*
|
|
14
|
+
* Semantics:
|
|
15
|
+
* - `fs.readFile` errors (ENOENT, etc.) still propagate unchanged.
|
|
16
|
+
* - `SyntaxError` from `JSON.parse` is also re-thrown unchanged. Callers in
|
|
17
|
+
* `lib/storage.ts` (`loadAccountsInternal`, `loadAccountsFromJournal`,
|
|
18
|
+
* `diagnoseStorageHealth`, backup recovery) rely on `SyntaxError` to trigger
|
|
19
|
+
* WAL / backup recovery paths. Converting parse failures to `null` would
|
|
20
|
+
* silently skip recovery and is explicitly preserved as a throw contract.
|
|
21
|
+
* - On happy path, Zod is the authoritative normalizer: `AnyAccountStorageSchema`
|
|
22
|
+
* validates the on-disk shape before `parseAndNormalizeStorage` runs.
|
|
23
|
+
* - When JSON parses cleanly but violates `AnyAccountStorageSchema`, we still
|
|
24
|
+
* fall back through the TS-side `normalizeAccountStorage` so legacy
|
|
25
|
+
* unknown-shape files can be surfaced with schema warnings (non-zero
|
|
26
|
+
* `schemaErrors`).
|
|
27
|
+
*/
|
|
11
28
|
export async function loadAccountsFromPath(path, deps) {
|
|
12
29
|
const content = await fs.readFile(path, "utf-8");
|
|
30
|
+
// Run the Zod-guarded JSON boundary first. Returns null on either a
|
|
31
|
+
// `SyntaxError` or a schema mismatch; we disambiguate below so the
|
|
32
|
+
// `SyntaxError` contract keeps propagating to callers that rely on it
|
|
33
|
+
// for WAL / backup recovery.
|
|
34
|
+
const validated = safeParseJson(content, AnyAccountStorageSchema, "storage-parser.loadAccountsFromPath");
|
|
35
|
+
if (validated !== null) {
|
|
36
|
+
return parseAndNormalizeStorage(validated, deps.normalizeAccountStorage, deps.isRecord);
|
|
37
|
+
}
|
|
38
|
+
// `validated === null`: either SyntaxError or schema mismatch.
|
|
39
|
+
// A raw JSON.parse distinguishes them: SyntaxError propagates to preserve
|
|
40
|
+
// existing recovery semantics; otherwise fall through to the TS normalizer
|
|
41
|
+
// (legacy unknown-shape path, surfaced via `schemaErrors`).
|
|
13
42
|
const data = JSON.parse(content);
|
|
14
43
|
return parseAndNormalizeStorage(data, deps.normalizeAccountStorage, deps.isRecord);
|
|
15
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-parser.js","sourceRoot":"","sources":["../../../lib/storage/storage-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"storage-parser.js","sourceRoot":"","sources":["../../../lib/storage/storage-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EACN,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,GACb,MAAM,eAAe,CAAC;AAGvB,MAAM,UAAU,wBAAwB,CACvC,IAAa,EACb,uBAAmE,EACnE,QAA8D;IAM9D,MAAM,YAAY,GAAG,mBAAmB,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC;QACnC,CAAC,CAAE,IAA8B,CAAC,OAAO;QACzC,CAAC,CAAC,SAAS,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,IAAY,EACZ,IAGC;IAMD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEjD,oEAAoE;IACpE,mEAAmE;IACnE,sEAAsE;IACtE,6BAA6B;IAC7B,MAAM,SAAS,GAAG,aAAa,CAC9B,OAAO,EACP,uBAAuB,EACvB,qCAAqC,CACrC,CAAC;IACF,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,wBAAwB,CAC9B,SAAS,EACT,IAAI,CAAC,uBAAuB,EAC5B,IAAI,CAAC,QAAQ,CACb,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,0EAA0E;IAC1E,2EAA2E;IAC3E,4DAA4D;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IAC5C,OAAO,wBAAwB,CAC9B,IAAI,EACJ,IAAI,CAAC,uBAAuB,EAC5B,IAAI,CAAC,QAAQ,CACb,CAAC;AACH,CAAC"}
|
package/dist/lib/storage.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type BackupMetadataSection, type BackupSnapshotMetadata } from "./storage/backup-metadata.js";
|
|
2
2
|
import { type StorageHealthSummary } from "./storage/health.js";
|
|
3
3
|
export { StorageError } from "./errors.js";
|
|
4
|
-
export { formatStorageErrorHint, toStorageError } from "./storage/error-hints.js";
|
|
4
|
+
export { formatStorageErrorHint, toStorageError, } from "./storage/error-hints.js";
|
|
5
5
|
export { getAccountIdentityKey, normalizeEmailKey, } from "./storage/identity.js";
|
|
6
6
|
import { type AccountMetadataV1, type AccountMetadataV3, type AccountStorageV1, type AccountStorageV3, type CooldownReason, type RateLimitStateV3 } from "./storage/migrations.js";
|
|
7
7
|
import { type NamedBackupSummary } from "./storage/named-backups.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../lib/storage.ts"],"names":[],"mappings":"AA8BA,OAAO,EACN,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAE3B,MAAM,8BAA8B,CAAC;AAkBtC,OAAO,EAEN,KAAK,oBAAoB,EACzB,MAAM,qBAAqB,CAAC;AAc7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../lib/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/storage.js
CHANGED
|
@@ -31,7 +31,7 @@ import { ensureCodexGitignoreEntry } from "./storage/gitignore.js";
|
|
|
31
31
|
import { exportAccountsToFile, mergeImportedAccounts, readImportFile, } from "./storage/import-export.js";
|
|
32
32
|
import { formatStorageErrorHint } from "./storage/error-hints.js";
|
|
33
33
|
export { StorageError } from "./errors.js";
|
|
34
|
-
export { formatStorageErrorHint, toStorageError } from "./storage/error-hints.js";
|
|
34
|
+
export { formatStorageErrorHint, toStorageError, } from "./storage/error-hints.js";
|
|
35
35
|
export { getAccountIdentityKey, normalizeEmailKey, } from "./storage/identity.js";
|
|
36
36
|
import { toAccountIdentityRef, } from "./storage/identity.js";
|
|
37
37
|
import { getFlaggedAccountsPath as buildFlaggedAccountsPath, getLegacyFlaggedAccountsPath as buildLegacyFlaggedAccountsPath, } from "./storage/file-paths.js";
|
|
@@ -42,6 +42,7 @@ import { getNamedBackupsEntry } from "./storage/named-backups-entry.js";
|
|
|
42
42
|
import { getStoragePathState, setStoragePathState, } from "./storage/path-state.js";
|
|
43
43
|
import { findProjectRoot, getConfigDir, getProjectConfigDir, getProjectGlobalConfigDir, resolvePath, resolveProjectStorageIdentityRoot, } from "./storage/paths.js";
|
|
44
44
|
import { loadNormalizedStorageFromPath, mergeStorageForMigration, } from "./storage/project-migration.js";
|
|
45
|
+
import { AccountsJournalEntrySchema, AnyAccountStorageSchema, safeParseJson, } from "./schemas.js";
|
|
45
46
|
import { clampIndex, isRecord } from "./storage/record-utils.js";
|
|
46
47
|
import { buildRestoreAssessment } from "./storage/restore-assessment.js";
|
|
47
48
|
import { restoreAccountsFromBackupEntry } from "./storage/restore-backup-entry.js";
|
|
@@ -282,8 +283,8 @@ async function describeAccountsWalSnapshot(path) {
|
|
|
282
283
|
}
|
|
283
284
|
try {
|
|
284
285
|
const raw = await fs.readFile(path, "utf-8");
|
|
285
|
-
const
|
|
286
|
-
if (!
|
|
286
|
+
const entry = safeParseJson(raw, AccountsJournalEntrySchema, "storage.describeAccountsWalSnapshot");
|
|
287
|
+
if (!entry || computeSha256(entry.content) !== entry.checksum) {
|
|
287
288
|
return {
|
|
288
289
|
kind: "accounts-wal",
|
|
289
290
|
path,
|
|
@@ -293,21 +294,30 @@ async function describeAccountsWalSnapshot(path) {
|
|
|
293
294
|
mtimeMs: stats.mtimeMs,
|
|
294
295
|
};
|
|
295
296
|
}
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
297
|
+
const innerPayload = safeParseJson(entry.content, AnyAccountStorageSchema, "storage.describeAccountsWalSnapshot.content");
|
|
298
|
+
// Schema-invalid inner payloads still flow through the TS normalizer
|
|
299
|
+
// so schemaErrors stay populated for observability; fail-closed on
|
|
300
|
+
// JSON syntax errors only.
|
|
301
|
+
let innerData;
|
|
302
|
+
if (innerPayload !== null) {
|
|
303
|
+
innerData = innerPayload;
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
try {
|
|
307
|
+
innerData = JSON.parse(entry.content);
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return {
|
|
311
|
+
kind: "accounts-wal",
|
|
312
|
+
path,
|
|
313
|
+
exists: true,
|
|
314
|
+
valid: false,
|
|
315
|
+
bytes: stats.bytes,
|
|
316
|
+
mtimeMs: stats.mtimeMs,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
309
319
|
}
|
|
310
|
-
const { normalized, storedVersion, schemaErrors } = parseAndNormalizeStorage(
|
|
320
|
+
const { normalized, storedVersion, schemaErrors } = parseAndNormalizeStorage(innerData, normalizeAccountStorage, isRecord);
|
|
311
321
|
return {
|
|
312
322
|
kind: "accounts-wal",
|
|
313
323
|
path,
|
|
@@ -983,13 +993,8 @@ async function loadAccountsFromJournal(path, options = {}) {
|
|
|
983
993
|
if (existsSync(resetMarkerPath)) {
|
|
984
994
|
return null;
|
|
985
995
|
}
|
|
986
|
-
const
|
|
987
|
-
if (!
|
|
988
|
-
return null;
|
|
989
|
-
const entry = parsed;
|
|
990
|
-
if (entry.version !== 1)
|
|
991
|
-
return null;
|
|
992
|
-
if (typeof entry.content !== "string" || typeof entry.checksum !== "string")
|
|
996
|
+
const entry = safeParseJson(raw, AccountsJournalEntrySchema, "storage.loadAccountsFromJournal");
|
|
997
|
+
if (!entry)
|
|
993
998
|
return null;
|
|
994
999
|
const computed = computeSha256(entry.content);
|
|
995
1000
|
if (computed !== entry.checksum) {
|
|
@@ -998,7 +1003,19 @@ async function loadAccountsFromJournal(path, options = {}) {
|
|
|
998
1003
|
}
|
|
999
1004
|
return null;
|
|
1000
1005
|
}
|
|
1001
|
-
const
|
|
1006
|
+
const validatedInner = safeParseJson(entry.content, AnyAccountStorageSchema, "storage.loadAccountsFromJournal.content");
|
|
1007
|
+
let data;
|
|
1008
|
+
if (validatedInner !== null) {
|
|
1009
|
+
data = validatedInner;
|
|
1010
|
+
}
|
|
1011
|
+
else {
|
|
1012
|
+
try {
|
|
1013
|
+
data = JSON.parse(entry.content);
|
|
1014
|
+
}
|
|
1015
|
+
catch {
|
|
1016
|
+
return null;
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1002
1019
|
const { normalized } = parseAndNormalizeStorage(data, normalizeAccountStorage, isRecord);
|
|
1003
1020
|
if (!normalized)
|
|
1004
1021
|
return null;
|
|
@@ -1215,7 +1232,9 @@ async function loadAccountsForExport() {
|
|
|
1215
1232
|
return createEmptyStorageWithMetadata(false, "intentional-reset");
|
|
1216
1233
|
}
|
|
1217
1234
|
if (code === "ENOENT") {
|
|
1218
|
-
const migratedLegacyStorage = await migrateLegacyProjectStorageIfNeeded({
|
|
1235
|
+
const migratedLegacyStorage = await migrateLegacyProjectStorageIfNeeded({
|
|
1236
|
+
commit: false,
|
|
1237
|
+
});
|
|
1219
1238
|
if (existsSync(resetMarkerPath)) {
|
|
1220
1239
|
return createEmptyStorageWithMetadata(false, "intentional-reset");
|
|
1221
1240
|
}
|