Skip to content

Commit 76e5216

Browse files
authored
Merge pull request #319 from ndycode/audit/nondev-unique-20260323
carry forward remaining unique non-dev PR work
2 parents e5ea183 + a6e42ae commit 76e5216

21 files changed

+1038
-281
lines changed

lib/codex-manager/experimental-sync-target-entry.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ export async function loadExperimentalSyncTargetEntry(params: {
5252
"EBUSY",
5353
"EPERM",
5454
"EAGAIN",
55-
"ENOTEMPTY",
56-
"EACCES",
5755
]),
5856
maxAttempts: 4,
5957
sleep: params.sleep,

lib/codex-manager/settings-write-queue.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export const SETTINGS_WRITE_MAX_ATTEMPTS = 4;
22
export const SETTINGS_WRITE_BASE_DELAY_MS = 50;
3-
export const SETTINGS_WRITE_MAX_DELAY_MS = 1_000;
3+
export const SETTINGS_WRITE_MAX_DELAY_MS = 30_000;
44
export const RETRYABLE_SETTINGS_WRITE_CODES = new Set([
55
"EBUSY",
66
"EPERM",

lib/codex-manager/unified-settings-controller.ts

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -10,54 +10,56 @@ export type SettingsHubActionType =
1010
| "backend"
1111
| "back";
1212

13+
export type UnifiedSettingsControllerDeps = {
14+
cloneDashboardSettings: (
15+
settings: DashboardDisplaySettings,
16+
) => DashboardDisplaySettings;
17+
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
18+
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
19+
loadPluginConfig: () => PluginConfig;
20+
applyUiThemeFromDashboardSettings: (
21+
settings: DashboardDisplaySettings,
22+
) => void;
23+
promptSettingsHub: (
24+
focus: SettingsHubActionType,
25+
) => Promise<{ type: SettingsHubActionType } | null>;
26+
configureDashboardDisplaySettings: (
27+
current: DashboardDisplaySettings,
28+
) => Promise<DashboardDisplaySettings>;
29+
configureStatuslineSettings: (
30+
current: DashboardDisplaySettings,
31+
) => Promise<DashboardDisplaySettings>;
32+
promptBehaviorSettings: (
33+
current: DashboardDisplaySettings,
34+
) => Promise<DashboardDisplaySettings | null>;
35+
promptThemeSettings: (
36+
current: DashboardDisplaySettings,
37+
) => Promise<DashboardDisplaySettings | null>;
38+
dashboardSettingsEqual: (
39+
left: DashboardDisplaySettings,
40+
right: DashboardDisplaySettings,
41+
) => boolean;
42+
persistDashboardSettingsSelection: (
43+
selected: DashboardDisplaySettings,
44+
keys: readonly (keyof DashboardDisplaySettings)[],
45+
scope: string,
46+
) => Promise<DashboardDisplaySettings>;
47+
promptExperimentalSettings: (
48+
config: PluginConfig,
49+
) => Promise<PluginConfig | null>;
50+
backendSettingsEqual: (left: PluginConfig, right: PluginConfig) => boolean;
51+
persistBackendConfigSelection: (
52+
config: PluginConfig,
53+
scope: string,
54+
) => Promise<PluginConfig>;
55+
configureBackendSettings: (config: PluginConfig) => Promise<PluginConfig>;
56+
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
57+
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
58+
};
59+
1360
export async function configureUnifiedSettingsController(
1461
initialSettings: DashboardDisplaySettings | undefined,
15-
deps: {
16-
cloneDashboardSettings: (
17-
settings: DashboardDisplaySettings,
18-
) => DashboardDisplaySettings;
19-
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
20-
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
21-
loadPluginConfig: () => PluginConfig;
22-
applyUiThemeFromDashboardSettings: (
23-
settings: DashboardDisplaySettings,
24-
) => void;
25-
promptSettingsHub: (
26-
focus: SettingsHubActionType,
27-
) => Promise<{ type: SettingsHubActionType } | null>;
28-
configureDashboardDisplaySettings: (
29-
current: DashboardDisplaySettings,
30-
) => Promise<DashboardDisplaySettings>;
31-
configureStatuslineSettings: (
32-
current: DashboardDisplaySettings,
33-
) => Promise<DashboardDisplaySettings>;
34-
promptBehaviorSettings: (
35-
current: DashboardDisplaySettings,
36-
) => Promise<DashboardDisplaySettings | null>;
37-
promptThemeSettings: (
38-
current: DashboardDisplaySettings,
39-
) => Promise<DashboardDisplaySettings | null>;
40-
dashboardSettingsEqual: (
41-
left: DashboardDisplaySettings,
42-
right: DashboardDisplaySettings,
43-
) => boolean;
44-
persistDashboardSettingsSelection: (
45-
selected: DashboardDisplaySettings,
46-
keys: readonly (keyof DashboardDisplaySettings)[],
47-
scope: string,
48-
) => Promise<DashboardDisplaySettings>;
49-
promptExperimentalSettings: (
50-
config: PluginConfig,
51-
) => Promise<PluginConfig | null>;
52-
backendSettingsEqual: (left: PluginConfig, right: PluginConfig) => boolean;
53-
persistBackendConfigSelection: (
54-
config: PluginConfig,
55-
scope: string,
56-
) => Promise<PluginConfig>;
57-
configureBackendSettings: (config: PluginConfig) => Promise<PluginConfig>;
58-
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
59-
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
60-
},
62+
deps: UnifiedSettingsControllerDeps,
6163
): Promise<DashboardDisplaySettings> {
6264
let current = deps.cloneDashboardSettings(
6365
initialSettings ?? (await deps.loadDashboardDisplaySettings()),

lib/codex-manager/unified-settings-entry.ts

Lines changed: 5 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,16 @@
11
import type { DashboardDisplaySettings } from "../dashboard-settings.js";
2-
import type { PluginConfig } from "../types.js";
3-
import type { SettingsHubActionType } from "./unified-settings-controller.js";
2+
import type {
3+
UnifiedSettingsControllerDeps,
4+
} from "./unified-settings-controller.js";
45

56
export async function configureUnifiedSettingsEntry(
67
initialSettings: DashboardDisplaySettings | undefined,
78
deps: {
89
configureUnifiedSettingsController: (
910
initialSettings: DashboardDisplaySettings | undefined,
10-
deps: {
11-
cloneDashboardSettings: (
12-
settings: DashboardDisplaySettings,
13-
) => DashboardDisplaySettings;
14-
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
15-
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
16-
loadPluginConfig: () => PluginConfig;
17-
applyUiThemeFromDashboardSettings: (
18-
settings: DashboardDisplaySettings,
19-
) => void;
20-
promptSettingsHub: (
21-
focus: SettingsHubActionType,
22-
) => Promise<{ type: SettingsHubActionType } | null>;
23-
configureDashboardDisplaySettings: (
24-
current: DashboardDisplaySettings,
25-
) => Promise<DashboardDisplaySettings>;
26-
configureStatuslineSettings: (
27-
current: DashboardDisplaySettings,
28-
) => Promise<DashboardDisplaySettings>;
29-
promptBehaviorSettings: (
30-
current: DashboardDisplaySettings,
31-
) => Promise<DashboardDisplaySettings | null>;
32-
promptThemeSettings: (
33-
current: DashboardDisplaySettings,
34-
) => Promise<DashboardDisplaySettings | null>;
35-
dashboardSettingsEqual: (
36-
left: DashboardDisplaySettings,
37-
right: DashboardDisplaySettings,
38-
) => boolean;
39-
persistDashboardSettingsSelection: (
40-
selected: DashboardDisplaySettings,
41-
keys: readonly (keyof DashboardDisplaySettings)[],
42-
scope: string,
43-
) => Promise<DashboardDisplaySettings>;
44-
promptExperimentalSettings: (
45-
config: PluginConfig,
46-
) => Promise<PluginConfig | null>;
47-
backendSettingsEqual: (
48-
left: PluginConfig,
49-
right: PluginConfig,
50-
) => boolean;
51-
persistBackendConfigSelection: (
52-
config: PluginConfig,
53-
scope: string,
54-
) => Promise<PluginConfig>;
55-
configureBackendSettings: (
56-
config: PluginConfig,
57-
) => Promise<PluginConfig>;
58-
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
59-
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
60-
},
11+
deps: UnifiedSettingsControllerDeps,
6112
) => Promise<DashboardDisplaySettings>;
62-
cloneDashboardSettings: (
63-
settings: DashboardDisplaySettings,
64-
) => DashboardDisplaySettings;
65-
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
66-
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
67-
loadPluginConfig: () => PluginConfig;
68-
applyUiThemeFromDashboardSettings: (
69-
settings: DashboardDisplaySettings,
70-
) => void;
71-
promptSettingsHub: (
72-
focus: SettingsHubActionType,
73-
) => Promise<{ type: SettingsHubActionType } | null>;
74-
configureDashboardDisplaySettings: (
75-
current: DashboardDisplaySettings,
76-
) => Promise<DashboardDisplaySettings>;
77-
configureStatuslineSettings: (
78-
current: DashboardDisplaySettings,
79-
) => Promise<DashboardDisplaySettings>;
80-
promptBehaviorSettings: (
81-
current: DashboardDisplaySettings,
82-
) => Promise<DashboardDisplaySettings | null>;
83-
promptThemeSettings: (
84-
current: DashboardDisplaySettings,
85-
) => Promise<DashboardDisplaySettings | null>;
86-
dashboardSettingsEqual: (
87-
left: DashboardDisplaySettings,
88-
right: DashboardDisplaySettings,
89-
) => boolean;
90-
persistDashboardSettingsSelection: (
91-
selected: DashboardDisplaySettings,
92-
keys: readonly (keyof DashboardDisplaySettings)[],
93-
scope: string,
94-
) => Promise<DashboardDisplaySettings>;
95-
promptExperimentalSettings: (
96-
config: PluginConfig,
97-
) => Promise<PluginConfig | null>;
98-
backendSettingsEqual: (left: PluginConfig, right: PluginConfig) => boolean;
99-
persistBackendConfigSelection: (
100-
config: PluginConfig,
101-
scope: string,
102-
) => Promise<PluginConfig>;
103-
configureBackendSettings: (config: PluginConfig) => Promise<PluginConfig>;
104-
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
105-
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
106-
},
13+
} & UnifiedSettingsControllerDeps,
10714
): Promise<DashboardDisplaySettings> {
10815
return deps.configureUnifiedSettingsController(initialSettings, {
10916
cloneDashboardSettings: deps.cloneDashboardSettings,

lib/storage/account-port.ts

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { AccountStorageV3, FlaggedAccountStorageV1 } from "../storage.js";
1+
import type { AccountStorageV3 } from "../storage.js";
22

33
export async function exportAccountsSnapshot(params: {
44
resolvedPath: string;
@@ -103,35 +103,3 @@ export async function importAccountsSnapshot(params: {
103103
return result;
104104
}
105105

106-
export async function saveFlaggedAccountsEntry(params: {
107-
storage: FlaggedAccountStorageV1;
108-
withStorageLock: <T>(fn: () => Promise<T>) => Promise<T>;
109-
saveUnlocked: (storage: FlaggedAccountStorageV1) => Promise<void>;
110-
}): Promise<void> {
111-
return params.withStorageLock(async () => {
112-
await params.saveUnlocked(params.storage);
113-
});
114-
}
115-
116-
export async function clearFlaggedAccountsEntry(params: {
117-
path: string;
118-
withStorageLock: <T>(fn: () => Promise<T>) => Promise<T>;
119-
markerPath: string;
120-
getBackupPaths: () => Promise<string[]>;
121-
clearFlaggedAccountsOnDisk: (args: {
122-
path: string;
123-
markerPath: string;
124-
backupPaths: string[];
125-
logError: (message: string, details: Record<string, unknown>) => void;
126-
}) => Promise<void>;
127-
logError: (message: string, details: Record<string, unknown>) => void;
128-
}): Promise<void> {
129-
return params.withStorageLock(async () => {
130-
await params.clearFlaggedAccountsOnDisk({
131-
path: params.path,
132-
markerPath: params.markerPath,
133-
backupPaths: await params.getBackupPaths(),
134-
logError: params.logError,
135-
});
136-
});
137-
}

lib/storage/account-save.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,13 @@ export async function saveAccountsToDisk(
3737
await params.ensureGitignore();
3838

3939
if (params.looksLikeSyntheticFixtureStorage(storage)) {
40-
try {
41-
const existing = await params.loadExistingStorage();
42-
if (
43-
existing &&
44-
existing.accounts.length > 0 &&
45-
!params.looksLikeSyntheticFixtureStorage(existing)
46-
) {
47-
throw params.createSyntheticFixtureError();
48-
}
49-
} catch (error) {
50-
if (error instanceof Error && error.message.includes("synthetic")) {
51-
throw error;
52-
}
40+
const existing = await params.loadExistingStorage();
41+
if (
42+
existing &&
43+
existing.accounts.length > 0 &&
44+
!params.looksLikeSyntheticFixtureStorage(existing)
45+
) {
46+
throw params.createSyntheticFixtureError();
5347
}
5448
}
5549

0 commit comments

Comments
 (0)