@namzu/cli 12.1.0 → 14.0.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 +35 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +119 -60
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts +24 -8
- package/dist/commands/acp.d.ts.map +1 -1
- package/dist/commands/acp.js +221 -80
- package/dist/commands/acp.js.map +1 -1
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +45 -9
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +79 -21
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/prior-messages.d.ts +11 -0
- package/dist/commands/prior-messages.d.ts.map +1 -0
- package/dist/commands/prior-messages.js +280 -0
- package/dist/commands/prior-messages.js.map +1 -0
- package/dist/commands/resume.d.ts.map +1 -1
- package/dist/commands/resume.js +21 -19
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/run-stream.d.ts +5 -3
- package/dist/commands/run-stream.d.ts.map +1 -1
- package/dist/commands/run-stream.js +66 -62
- package/dist/commands/run-stream.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +50 -37
- package/dist/commands/run.js.map +1 -1
- package/dist/config/debug.d.ts +55 -0
- package/dist/config/debug.d.ts.map +1 -0
- package/dist/config/debug.js +126 -0
- package/dist/config/debug.js.map +1 -0
- package/dist/config/load.d.ts +88 -4
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +386 -56
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +87 -5
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +5 -5
- package/dist/config/schema.js.map +1 -1
- package/dist/config/trusted-project-context.d.ts +11 -0
- package/dist/config/trusted-project-context.d.ts.map +1 -0
- package/dist/config/trusted-project-context.js +28 -0
- package/dist/config/trusted-project-context.js.map +1 -0
- package/dist/context/project-path.d.ts +3 -0
- package/dist/context/project-path.d.ts.map +1 -0
- package/dist/context/project-path.js +16 -0
- package/dist/context/project-path.js.map +1 -0
- package/dist/context/project-tracker.d.ts +30 -0
- package/dist/context/project-tracker.d.ts.map +1 -0
- package/dist/context/project-tracker.js +217 -0
- package/dist/context/project-tracker.js.map +1 -0
- package/dist/context/sandbox.d.ts +29 -9
- package/dist/context/sandbox.d.ts.map +1 -1
- package/dist/context/sandbox.js +8 -0
- package/dist/context/sandbox.js.map +1 -1
- package/dist/doctor/checks/credentials.d.ts.map +1 -1
- package/dist/doctor/checks/credentials.js +7 -1
- package/dist/doctor/checks/credentials.js.map +1 -1
- package/dist/exit-codes.d.ts +5 -4
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +5 -4
- package/dist/exit-codes.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/integrations/clipboard/text.d.ts +43 -0
- package/dist/integrations/clipboard/text.d.ts.map +1 -0
- package/dist/integrations/clipboard/text.js +43 -0
- package/dist/integrations/clipboard/text.js.map +1 -0
- package/dist/integrations/mcp/servers.d.ts +9 -0
- package/dist/integrations/mcp/servers.d.ts.map +1 -1
- package/dist/integrations/mcp/servers.js +11 -4
- package/dist/integrations/mcp/servers.js.map +1 -1
- package/dist/integrations/notifications/terminal.d.ts +32 -0
- package/dist/integrations/notifications/terminal.d.ts.map +1 -0
- package/dist/integrations/notifications/terminal.js +46 -0
- package/dist/integrations/notifications/terminal.js.map +1 -0
- package/dist/integrations/plugins/runtime.d.ts +17 -0
- package/dist/integrations/plugins/runtime.d.ts.map +1 -0
- package/dist/integrations/plugins/runtime.js +100 -0
- package/dist/integrations/plugins/runtime.js.map +1 -0
- package/dist/integrations/providers/codex-device-login.d.ts +27 -0
- package/dist/integrations/providers/codex-device-login.d.ts.map +1 -0
- package/dist/integrations/providers/codex-device-login.js +195 -0
- package/dist/integrations/providers/codex-device-login.js.map +1 -0
- package/dist/integrations/providers/codex-oauth.d.ts +10 -0
- package/dist/integrations/providers/codex-oauth.d.ts.map +1 -0
- package/dist/integrations/providers/codex-oauth.js +95 -0
- package/dist/integrations/providers/codex-oauth.js.map +1 -0
- package/dist/integrations/providers/credential-store.d.ts +40 -4
- package/dist/integrations/providers/credential-store.d.ts.map +1 -1
- package/dist/integrations/providers/credential-store.js +236 -18
- package/dist/integrations/providers/credential-store.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +25 -13
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +98 -44
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/harness-credentials.d.ts +36 -0
- package/dist/integrations/providers/harness-credentials.d.ts.map +1 -0
- package/dist/integrations/providers/harness-credentials.js +146 -0
- package/dist/integrations/providers/harness-credentials.js.map +1 -0
- package/dist/integrations/providers/identity.d.ts +8 -15
- package/dist/integrations/providers/identity.d.ts.map +1 -1
- package/dist/integrations/providers/identity.js +8 -15
- package/dist/integrations/providers/identity.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +7 -4
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +6 -3
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/providers/keychain.d.ts +0 -13
- package/dist/integrations/providers/keychain.d.ts.map +1 -1
- package/dist/integrations/providers/keychain.js +0 -76
- package/dist/integrations/providers/keychain.js.map +1 -1
- package/dist/integrations/providers/oauth.d.ts +46 -17
- package/dist/integrations/providers/oauth.d.ts.map +1 -1
- package/dist/integrations/providers/oauth.js +175 -45
- package/dist/integrations/providers/oauth.js.map +1 -1
- package/dist/integrations/providers/register.d.ts.map +1 -1
- package/dist/integrations/providers/register.js +9 -1
- package/dist/integrations/providers/register.js.map +1 -1
- package/dist/integrations/providers/registry.d.ts +8 -1
- package/dist/integrations/providers/registry.d.ts.map +1 -1
- package/dist/integrations/providers/registry.js +29 -0
- package/dist/integrations/providers/registry.js.map +1 -1
- package/dist/integrations/providers/subscription-login.d.ts +2 -0
- package/dist/integrations/providers/subscription-login.d.ts.map +1 -1
- package/dist/integrations/providers/subscription-login.js +117 -14
- package/dist/integrations/providers/subscription-login.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +111 -1
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +400 -7
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/sessions/transcript-export.d.ts +25 -0
- package/dist/integrations/sessions/transcript-export.d.ts.map +1 -0
- package/dist/integrations/sessions/transcript-export.js +441 -0
- package/dist/integrations/sessions/transcript-export.js.map +1 -0
- package/dist/integrations/sessions/turn-evidence.d.ts +138 -0
- package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -0
- package/dist/integrations/sessions/turn-evidence.js +506 -0
- package/dist/integrations/sessions/turn-evidence.js.map +1 -0
- package/dist/integrations/subagents/runtime.d.ts +7 -12
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +19 -10
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/trust/store.d.ts.map +1 -1
- package/dist/integrations/trust/store.js +27 -13
- package/dist/integrations/trust/store.js.map +1 -1
- package/dist/permissions/canonical-project.d.ts +9 -0
- package/dist/permissions/canonical-project.d.ts.map +1 -0
- package/dist/permissions/canonical-project.js +13 -0
- package/dist/permissions/canonical-project.js.map +1 -0
- package/dist/permissions/checks.d.ts +65 -0
- package/dist/permissions/checks.d.ts.map +1 -0
- package/dist/permissions/checks.js +122 -0
- package/dist/permissions/checks.js.map +1 -0
- package/dist/permissions/headless-trust.d.ts +9 -5
- package/dist/permissions/headless-trust.d.ts.map +1 -1
- package/dist/permissions/headless-trust.js +18 -4
- package/dist/permissions/headless-trust.js.map +1 -1
- package/dist/permissions/rules.d.ts +16 -7
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +78 -13
- package/dist/permissions/rules.js.map +1 -1
- package/dist/tui/App.d.ts +5 -2
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +1621 -196
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Composer.d.ts +14 -3
- package/dist/tui/Composer.d.ts.map +1 -1
- package/dist/tui/Composer.js +53 -15
- package/dist/tui/Composer.js.map +1 -1
- package/dist/tui/EditPromptPicker.d.ts +8 -0
- package/dist/tui/EditPromptPicker.d.ts.map +1 -0
- package/dist/tui/EditPromptPicker.js +18 -0
- package/dist/tui/EditPromptPicker.js.map +1 -0
- package/dist/tui/LiveActivity.d.ts.map +1 -1
- package/dist/tui/LiveActivity.js +2 -1
- package/dist/tui/LiveActivity.js.map +1 -1
- package/dist/tui/Markdown.d.ts.map +1 -1
- package/dist/tui/Markdown.js +2 -1
- package/dist/tui/Markdown.js.map +1 -1
- package/dist/tui/PermissionOverlay.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.js +7 -1
- package/dist/tui/PermissionOverlay.js.map +1 -1
- package/dist/tui/Picker.d.ts +8 -6
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +145 -18
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/ResumePicker.d.ts.map +1 -1
- package/dist/tui/ResumePicker.js +1 -1
- package/dist/tui/ResumePicker.js.map +1 -1
- package/dist/tui/Transcript.d.ts +4 -2
- package/dist/tui/Transcript.d.ts.map +1 -1
- package/dist/tui/Transcript.js +31 -5
- package/dist/tui/Transcript.js.map +1 -1
- package/dist/tui/agent.d.ts +123 -19
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +757 -144
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/compact-transcript.d.ts +24 -0
- package/dist/tui/compact-transcript.d.ts.map +1 -0
- package/dist/tui/compact-transcript.js +46 -0
- package/dist/tui/compact-transcript.js.map +1 -0
- package/dist/tui/conversation-history.d.ts +33 -0
- package/dist/tui/conversation-history.d.ts.map +1 -0
- package/dist/tui/conversation-history.js +42 -0
- package/dist/tui/conversation-history.js.map +1 -0
- package/dist/tui/edit-prompts.d.ts +23 -0
- package/dist/tui/edit-prompts.d.ts.map +1 -0
- package/dist/tui/edit-prompts.js +35 -0
- package/dist/tui/edit-prompts.js.map +1 -0
- package/dist/tui/live-window.d.ts +3 -1
- package/dist/tui/live-window.d.ts.map +1 -1
- package/dist/tui/live-window.js +20 -8
- package/dist/tui/live-window.js.map +1 -1
- package/dist/tui/login-prompt.d.ts +5 -0
- package/dist/tui/login-prompt.d.ts.map +1 -1
- package/dist/tui/login-prompt.js +14 -0
- package/dist/tui/login-prompt.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +178 -9
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +340 -16
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/terminal-display.d.ts +12 -0
- package/dist/tui/terminal-display.d.ts.map +1 -0
- package/dist/tui/terminal-display.js +65 -0
- package/dist/tui/terminal-display.js.map +1 -0
- package/dist/tui/types.d.ts +14 -2
- package/dist/tui/types.d.ts.map +1 -1
- package/dist/tui/workspace-diff.d.ts +40 -0
- package/dist/tui/workspace-diff.d.ts.map +1 -0
- package/dist/tui/workspace-diff.js +101 -0
- package/dist/tui/workspace-diff.js.map +1 -0
- package/package.json +8 -8
|
@@ -35,15 +35,16 @@
|
|
|
35
35
|
* ## What is in the file
|
|
36
36
|
*
|
|
37
37
|
* { "version": 1,
|
|
38
|
-
* "subscription": { "accessToken", "refreshToken", "expiresAt", "scopes" }
|
|
38
|
+
* "subscription": { "accessToken", "refreshToken", "expiresAt", "scopes" },
|
|
39
|
+
* "codexSubscription": { "accessToken", "refreshToken", "expiresAt", "accountId" } }
|
|
39
40
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
41
|
+
* Each sibling is owned by Namzu's corresponding login flow and conditionally
|
|
42
|
+
* refreshed in place. Credentials borrowed from Claude or Codex remain in
|
|
43
|
+
* their owners' files/keychain and are never copied here.
|
|
43
44
|
*/
|
|
44
45
|
import { execFileSync } from 'node:child_process';
|
|
45
46
|
import { randomBytes } from 'node:crypto';
|
|
46
|
-
import { closeSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeSync, } from 'node:fs';
|
|
47
|
+
import { closeSync, fsyncSync, linkSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, writeSync, } from 'node:fs';
|
|
47
48
|
import { homedir, platform, tmpdir } from 'node:os';
|
|
48
49
|
import { dirname, join } from 'node:path';
|
|
49
50
|
const FILE_MODE = 0o600;
|
|
@@ -66,6 +67,13 @@ export function credentialsPath(home = homedir()) {
|
|
|
66
67
|
* the operator to try again.
|
|
67
68
|
*/
|
|
68
69
|
export function readStoredSubscriptionCredential(home = homedir()) {
|
|
70
|
+
return readCredentialDocument(home)?.subscription ?? null;
|
|
71
|
+
}
|
|
72
|
+
/** The Namzu-owned ChatGPT/Codex subscription, if one was obtained here. */
|
|
73
|
+
export function readStoredCodexCredential(home = homedir()) {
|
|
74
|
+
return readCredentialDocument(home)?.codexSubscription ?? null;
|
|
75
|
+
}
|
|
76
|
+
function readCredentialDocument(home) {
|
|
69
77
|
let raw;
|
|
70
78
|
try {
|
|
71
79
|
raw = readFileSync(credentialsPath(home), 'utf8');
|
|
@@ -82,10 +90,28 @@ export function readStoredSubscriptionCredential(home = homedir()) {
|
|
|
82
90
|
}
|
|
83
91
|
if (typeof parsed !== 'object' || parsed === null)
|
|
84
92
|
return null;
|
|
85
|
-
const
|
|
86
|
-
|
|
93
|
+
const root = parsed;
|
|
94
|
+
const subscription = parseCredential(root.subscription);
|
|
95
|
+
const codexBase = parseCredential(root.codexSubscription);
|
|
96
|
+
const codexRecord = typeof root.codexSubscription === 'object' && root.codexSubscription !== null
|
|
97
|
+
? root.codexSubscription
|
|
98
|
+
: null;
|
|
99
|
+
const accountId = codexRecord?.accountId;
|
|
100
|
+
const codexSubscription = codexBase && typeof accountId === 'string' && accountId.length > 0
|
|
101
|
+
? { ...codexBase, accountId }
|
|
102
|
+
: undefined;
|
|
103
|
+
if (!subscription && !codexSubscription)
|
|
87
104
|
return null;
|
|
88
|
-
|
|
105
|
+
return {
|
|
106
|
+
version: CREDENTIALS_FILE_VERSION,
|
|
107
|
+
...(subscription ? { subscription } : {}),
|
|
108
|
+
...(codexSubscription ? { codexSubscription } : {}),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function parseCredential(value) {
|
|
112
|
+
if (typeof value !== 'object' || value === null)
|
|
113
|
+
return null;
|
|
114
|
+
const rec = value;
|
|
89
115
|
const accessToken = rec.accessToken;
|
|
90
116
|
if (typeof accessToken !== 'string' || accessToken.length === 0)
|
|
91
117
|
return null;
|
|
@@ -110,16 +136,67 @@ export function readStoredSubscriptionCredential(home = homedir()) {
|
|
|
110
136
|
export function writeStoredSubscriptionCredential(cred, home = homedir()) {
|
|
111
137
|
const path = credentialsPath(home);
|
|
112
138
|
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
139
|
+
return withCredentialStoreLock(path, () => {
|
|
140
|
+
const current = readCredentialDocument(home);
|
|
141
|
+
return writeCredentialDocumentUnlocked({ version: CREDENTIALS_FILE_VERSION, ...current, subscription: cred }, path);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
export function writeStoredCodexCredential(cred, home = homedir()) {
|
|
145
|
+
const path = credentialsPath(home);
|
|
146
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
147
|
+
return withCredentialStoreLock(path, () => {
|
|
148
|
+
const current = readCredentialDocument(home);
|
|
149
|
+
return writeCredentialDocumentUnlocked({
|
|
150
|
+
version: CREDENTIALS_FILE_VERSION,
|
|
151
|
+
...current,
|
|
152
|
+
codexSubscription: cred,
|
|
153
|
+
}, path);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
export function replaceStoredCodexCredential(expected, replacement, home = homedir()) {
|
|
157
|
+
const path = credentialsPath(home);
|
|
158
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
159
|
+
return withCredentialStoreLock(path, () => {
|
|
160
|
+
const current = readStoredCodexCredential(home);
|
|
161
|
+
if (!sameCodexCredential(current, expected))
|
|
162
|
+
return { replaced: false, current };
|
|
163
|
+
const document = readCredentialDocument(home);
|
|
164
|
+
writeCredentialDocumentUnlocked({
|
|
165
|
+
version: CREDENTIALS_FILE_VERSION,
|
|
166
|
+
...document,
|
|
167
|
+
codexSubscription: replacement,
|
|
168
|
+
}, path);
|
|
169
|
+
return { replaced: true, current: replacement };
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Replace exactly the credential a refresh was derived from.
|
|
174
|
+
*
|
|
175
|
+
* Comparison and rename happen under the same store-owned cross-process lock.
|
|
176
|
+
* A changed record is returned to the caller and is never overwritten. This is
|
|
177
|
+
* the durable authority boundary a post-network plain reread cannot provide:
|
|
178
|
+
* without the lock, another writer can still rotate the credential between
|
|
179
|
+
* the comparison and the rename.
|
|
180
|
+
*/
|
|
181
|
+
export function replaceStoredSubscriptionCredential(expected, replacement, home = homedir()) {
|
|
182
|
+
const path = credentialsPath(home);
|
|
183
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
184
|
+
return withCredentialStoreLock(path, () => {
|
|
185
|
+
const current = readStoredSubscriptionCredential(home);
|
|
186
|
+
if (!sameCredential(current, expected))
|
|
187
|
+
return { replaced: false, current };
|
|
188
|
+
const document = readCredentialDocument(home);
|
|
189
|
+
writeCredentialDocumentUnlocked({
|
|
190
|
+
version: CREDENTIALS_FILE_VERSION,
|
|
191
|
+
...document,
|
|
192
|
+
subscription: replacement,
|
|
193
|
+
}, path);
|
|
194
|
+
return { replaced: true, current: replacement };
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function writeCredentialDocumentUnlocked(document, path) {
|
|
113
198
|
const tmp = `${path}.tmp.${process.pid}.${randomBytes(6).toString('hex')}`;
|
|
114
|
-
const body = `${JSON.stringify(
|
|
115
|
-
version: CREDENTIALS_FILE_VERSION,
|
|
116
|
-
subscription: {
|
|
117
|
-
accessToken: cred.accessToken,
|
|
118
|
-
...(cred.refreshToken ? { refreshToken: cred.refreshToken } : {}),
|
|
119
|
-
...(cred.expiresAt ? { expiresAt: cred.expiresAt } : {}),
|
|
120
|
-
...(cred.scopes ? { scopes: cred.scopes } : {}),
|
|
121
|
-
},
|
|
122
|
-
}, null, 2)}\n`;
|
|
199
|
+
const body = `${JSON.stringify(serializeDocument(document), null, 2)}\n`;
|
|
123
200
|
let fd;
|
|
124
201
|
try {
|
|
125
202
|
// `wx` — refuse an existing path rather than truncate one, so a name
|
|
@@ -150,9 +227,150 @@ export function writeStoredSubscriptionCredential(cred, home = homedir()) {
|
|
|
150
227
|
}
|
|
151
228
|
return path;
|
|
152
229
|
}
|
|
230
|
+
function serializeDocument(document) {
|
|
231
|
+
const credential = (value) => ({
|
|
232
|
+
accessToken: value.accessToken,
|
|
233
|
+
...(value.refreshToken ? { refreshToken: value.refreshToken } : {}),
|
|
234
|
+
...(value.expiresAt ? { expiresAt: value.expiresAt } : {}),
|
|
235
|
+
...(value.scopes ? { scopes: value.scopes } : {}),
|
|
236
|
+
});
|
|
237
|
+
return {
|
|
238
|
+
version: CREDENTIALS_FILE_VERSION,
|
|
239
|
+
...(document.subscription ? { subscription: credential(document.subscription) } : {}),
|
|
240
|
+
...(document.codexSubscription
|
|
241
|
+
? {
|
|
242
|
+
codexSubscription: {
|
|
243
|
+
...credential(document.codexSubscription),
|
|
244
|
+
accountId: document.codexSubscription.accountId,
|
|
245
|
+
},
|
|
246
|
+
}
|
|
247
|
+
: {}),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
153
250
|
/** Remove the stored credential. Absence is success. */
|
|
154
251
|
export function clearStoredSubscriptionCredential(home = homedir()) {
|
|
155
|
-
|
|
252
|
+
const path = credentialsPath(home);
|
|
253
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
254
|
+
withCredentialStoreLock(path, () => {
|
|
255
|
+
const current = readCredentialDocument(home);
|
|
256
|
+
if (!current?.codexSubscription) {
|
|
257
|
+
rmSync(path, { force: true });
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
writeCredentialDocumentUnlocked({
|
|
261
|
+
version: CREDENTIALS_FILE_VERSION,
|
|
262
|
+
codexSubscription: current.codexSubscription,
|
|
263
|
+
}, path);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/** Remove only the Namzu-owned Codex subscription; borrowed harness auth is untouched. */
|
|
267
|
+
export function clearStoredCodexCredential(home = homedir()) {
|
|
268
|
+
const path = credentialsPath(home);
|
|
269
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
270
|
+
withCredentialStoreLock(path, () => {
|
|
271
|
+
const current = readCredentialDocument(home);
|
|
272
|
+
if (!current?.subscription) {
|
|
273
|
+
rmSync(path, { force: true });
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
writeCredentialDocumentUnlocked({ version: CREDENTIALS_FILE_VERSION, subscription: current.subscription }, path);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/** Remove every credential Namzu owns in one store mutation. */
|
|
280
|
+
export function clearAllStoredCredentials(home = homedir()) {
|
|
281
|
+
const path = credentialsPath(home);
|
|
282
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
283
|
+
withCredentialStoreLock(path, () => rmSync(path, { force: true }));
|
|
284
|
+
}
|
|
285
|
+
function sameCredential(left, right) {
|
|
286
|
+
if (!left)
|
|
287
|
+
return false;
|
|
288
|
+
if (left.accessToken !== right.accessToken ||
|
|
289
|
+
left.refreshToken !== right.refreshToken ||
|
|
290
|
+
left.expiresAt !== right.expiresAt) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
const leftScopes = left.scopes ?? [];
|
|
294
|
+
const rightScopes = right.scopes ?? [];
|
|
295
|
+
return (leftScopes.length === rightScopes.length &&
|
|
296
|
+
leftScopes.every((scope, index) => scope === rightScopes[index]));
|
|
297
|
+
}
|
|
298
|
+
function sameCodexCredential(left, right) {
|
|
299
|
+
return left?.accountId === right.accountId && sameCredential(left, right);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Run one synchronous store mutation with cross-process exclusion.
|
|
303
|
+
*
|
|
304
|
+
* The lock is held only across local read/rename work, never across a network
|
|
305
|
+
* request. A dead owner can leave a complete lock behind. It is deliberately
|
|
306
|
+
* not stolen automatically: pathname-based stale reclamation cannot prove it
|
|
307
|
+
* is unlinking the inode it inspected, so a delayed reclaimer can delete a new
|
|
308
|
+
* owner's lock and admit two writers. A present lock is a refusal until an
|
|
309
|
+
* operator proves no process owns the store and removes it.
|
|
310
|
+
*/
|
|
311
|
+
function withCredentialStoreLock(path, operation) {
|
|
312
|
+
const lockPath = `${path}.lock`;
|
|
313
|
+
const token = `${process.pid}:${Date.now()}:${randomBytes(12).toString('hex')}`;
|
|
314
|
+
const published = publishLockAtomically(lockPath, token);
|
|
315
|
+
if (!published.acquired) {
|
|
316
|
+
throw new CredentialStoreError(`could not acquire the credential-store lock for ${path}: another owner or an unrecovered process lock is present (${published.error instanceof Error ? published.error.message : String(published.error)}). Refusing concurrent mutation; after proving no Namzu process is using this credential store, remove ${lockPath} and retry.`);
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
return operation();
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
// Do not remove a successor's lock if an external actor replaced the file.
|
|
323
|
+
try {
|
|
324
|
+
if (readFileSync(lockPath, 'utf8') === token)
|
|
325
|
+
rmSync(lockPath, { force: true });
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// The mutation already has its result. A missing/replaced lock is not
|
|
329
|
+
// evidence that the credential itself failed to publish.
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Publish a complete owner record at the canonical name in one filesystem op.
|
|
335
|
+
*
|
|
336
|
+
* Creating the canonical file and then writing its token has a fatal crash
|
|
337
|
+
* window: an empty lock names no owner and can never be reclaimed safely. The
|
|
338
|
+
* candidate is completed and synced first; `linkSync` is the exclusive claim.
|
|
339
|
+
* A pre-link crash can leave candidate debris, but it never blocks the store.
|
|
340
|
+
*/
|
|
341
|
+
function publishLockAtomically(lockPath, token) {
|
|
342
|
+
const candidatePath = `${lockPath}.candidate.${process.pid}.${randomBytes(12).toString('hex')}`;
|
|
343
|
+
let fd;
|
|
344
|
+
try {
|
|
345
|
+
fd = openSync(candidatePath, 'wx', FILE_MODE);
|
|
346
|
+
writeFileSync(fd, token, 'utf8');
|
|
347
|
+
fsyncSync(fd);
|
|
348
|
+
closeSync(fd);
|
|
349
|
+
fd = undefined;
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
if (fd !== undefined)
|
|
353
|
+
closeSync(fd);
|
|
354
|
+
rmSync(candidatePath, { force: true });
|
|
355
|
+
throw new CredentialStoreError(`could not prepare the credential-store lock: ${error instanceof Error ? error.message : String(error)}`);
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
linkSync(candidatePath, lockPath);
|
|
359
|
+
return { acquired: true };
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
return { acquired: false, error };
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
try {
|
|
366
|
+
rmSync(candidatePath, { force: true });
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// Candidate debris is non-canonical and cannot block another owner.
|
|
370
|
+
// Once the hard link succeeds, cleanup must not erase that acquisition
|
|
371
|
+
// result and skip the token-checked canonical release path.
|
|
372
|
+
}
|
|
373
|
+
}
|
|
156
374
|
}
|
|
157
375
|
/**
|
|
158
376
|
* Make `path` readable and writable by its owner and by nobody else, and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Credential discoverer for LLM provider clients.
|
|
3
3
|
*
|
|
4
|
-
* For each entry in `PROVIDER_REGISTRY`, ask four questions
|
|
5
|
-
* 1. Is
|
|
6
|
-
* 2. Is there a subscription credential in namzu's own store
|
|
7
|
-
*
|
|
8
|
-
* 3. Is there an OAuth credential in the login Keychain? (macOS only, and
|
|
9
|
-
* only `anthropic` consumes it.)
|
|
4
|
+
* For each entry in `PROVIDER_REGISTRY`, ask four questions:
|
|
5
|
+
* 1. Is there a usable session owned by an installed Claude or Codex harness?
|
|
6
|
+
* 2. Is there a subscription credential in namzu's own store?
|
|
7
|
+
* 3. Is one of its optional API-key env vars set in `process.env`?
|
|
10
8
|
* 4. Is the probe URL (if any) reachable right now?
|
|
11
9
|
*
|
|
12
10
|
* The header used to say "three" and list two, and the one it omitted was the
|
|
@@ -19,14 +17,12 @@
|
|
|
19
17
|
* hole.** `readAgentKeychainCredential` returns `null` on any other platform
|
|
20
18
|
* before it looks at anything; it reads a credential belonging to a
|
|
21
19
|
* co-installed tool, so it can only ever help someone who has that tool, on
|
|
22
|
-
* that operating system. namzu's own store
|
|
23
|
-
*
|
|
24
|
-
* namzu useful on a machine that has neither.
|
|
20
|
+
* that operating system. namzu's own store works everywhere, which is what
|
|
21
|
+
* makes signing in from inside namzu useful on a machine that has neither.
|
|
25
22
|
*
|
|
26
|
-
* Order
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* ineffective on precisely the machine where they bothered to run it.
|
|
23
|
+
* Order matters when both answer. A current device-harness session wins; a
|
|
24
|
+
* Namzu-owned sign-in is the fallback for a machine that has no usable harness
|
|
25
|
+
* session. API-key/env sources remain optional alternatives after both.
|
|
30
26
|
*
|
|
31
27
|
* The first positive answer per provider wins; subsequent sources are
|
|
32
28
|
* recorded as "also available from" so the picker can show alternatives
|
|
@@ -72,6 +68,16 @@ export type DetectionSource = {
|
|
|
72
68
|
readonly kind: 'keychain';
|
|
73
69
|
readonly service: string;
|
|
74
70
|
}
|
|
71
|
+
/** A read-only Claude Code OAuth envelope owned by the Claude CLI. */
|
|
72
|
+
| {
|
|
73
|
+
readonly kind: 'claude-file';
|
|
74
|
+
readonly path: string;
|
|
75
|
+
}
|
|
76
|
+
/** A read-only ChatGPT/Codex OAuth envelope owned by the Codex CLI. */
|
|
77
|
+
| {
|
|
78
|
+
readonly kind: 'codex-file';
|
|
79
|
+
readonly path: string;
|
|
80
|
+
}
|
|
75
81
|
/**
|
|
76
82
|
* namzu's own credential store — a subscription the operator signed in to
|
|
77
83
|
* from inside namzu. Carries the path because "where did this come from"
|
|
@@ -115,6 +121,12 @@ export interface DetectedProvider {
|
|
|
115
121
|
readonly expiresAt?: number;
|
|
116
122
|
readonly origin?: CredentialOrigin;
|
|
117
123
|
};
|
|
124
|
+
/** Account-routed OAuth metadata for the Codex Responses backend. */
|
|
125
|
+
readonly codex?: {
|
|
126
|
+
readonly accountId: string;
|
|
127
|
+
readonly expiresAt?: number;
|
|
128
|
+
readonly origin: 'codex-file' | 'stored';
|
|
129
|
+
};
|
|
118
130
|
/** Other sources that also satisfy this provider — informational. */
|
|
119
131
|
readonly alternatives: readonly DetectionSource[];
|
|
120
132
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Credential discoverer for LLM provider clients.
|
|
3
3
|
*
|
|
4
|
-
* For each entry in `PROVIDER_REGISTRY`, ask four questions
|
|
5
|
-
* 1. Is
|
|
6
|
-
* 2. Is there a subscription credential in namzu's own store
|
|
7
|
-
*
|
|
8
|
-
* 3. Is there an OAuth credential in the login Keychain? (macOS only, and
|
|
9
|
-
* only `anthropic` consumes it.)
|
|
4
|
+
* For each entry in `PROVIDER_REGISTRY`, ask four questions:
|
|
5
|
+
* 1. Is there a usable session owned by an installed Claude or Codex harness?
|
|
6
|
+
* 2. Is there a subscription credential in namzu's own store?
|
|
7
|
+
* 3. Is one of its optional API-key env vars set in `process.env`?
|
|
10
8
|
* 4. Is the probe URL (if any) reachable right now?
|
|
11
9
|
*
|
|
12
10
|
* The header used to say "three" and list two, and the one it omitted was the
|
|
@@ -19,14 +17,12 @@
|
|
|
19
17
|
* hole.** `readAgentKeychainCredential` returns `null` on any other platform
|
|
20
18
|
* before it looks at anything; it reads a credential belonging to a
|
|
21
19
|
* co-installed tool, so it can only ever help someone who has that tool, on
|
|
22
|
-
* that operating system. namzu's own store
|
|
23
|
-
*
|
|
24
|
-
* namzu useful on a machine that has neither.
|
|
20
|
+
* that operating system. namzu's own store works everywhere, which is what
|
|
21
|
+
* makes signing in from inside namzu useful on a machine that has neither.
|
|
25
22
|
*
|
|
26
|
-
* Order
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* ineffective on precisely the machine where they bothered to run it.
|
|
23
|
+
* Order matters when both answer. A current device-harness session wins; a
|
|
24
|
+
* Namzu-owned sign-in is the fallback for a machine that has no usable harness
|
|
25
|
+
* session. API-key/env sources remain optional alternatives after both.
|
|
30
26
|
*
|
|
31
27
|
* The first positive answer per provider wins; subsequent sources are
|
|
32
28
|
* recorded as "also available from" so the picker can show alternatives
|
|
@@ -61,7 +57,8 @@
|
|
|
61
57
|
* picker can render immediately and refine if discovery completes later.
|
|
62
58
|
*/
|
|
63
59
|
import { EnvCredentialProvider } from '@namzu/sdk';
|
|
64
|
-
import { credentialsPath, readStoredSubscriptionCredential } from './credential-store.js';
|
|
60
|
+
import { credentialsPath, readStoredCodexCredential, readStoredSubscriptionCredential, } from './credential-store.js';
|
|
61
|
+
import { claudeCredentialsPath, codexCredentialsPath, preferFresherCredential, readClaudeFileCredential, readCodexFileCredential, } from './harness-credentials.js';
|
|
65
62
|
import { KEYCHAIN_SERVICE, readAgentKeychainCredential } from './keychain.js';
|
|
66
63
|
import { PROVIDER_REGISTRY } from './registry.js';
|
|
67
64
|
const DEFAULT_PROBE_TIMEOUT_MS = 500;
|
|
@@ -103,14 +100,96 @@ export async function discoverProviders(opts = {}) {
|
|
|
103
100
|
const storedCredential = opts.skipStored
|
|
104
101
|
? null
|
|
105
102
|
: readStoredSubscriptionCredential(...(opts.home === undefined ? [] : [opts.home]));
|
|
103
|
+
const storedCodexCredential = opts.skipStored
|
|
104
|
+
? null
|
|
105
|
+
: readStoredCodexCredential(...(opts.home === undefined ? [] : [opts.home]));
|
|
106
106
|
// macOS-only: the OAuth credential a co-installed tool keeps in the login
|
|
107
107
|
// Keychain.
|
|
108
108
|
const keychainCredential = opts.skipKeychain ? null : readAgentKeychainCredential();
|
|
109
|
+
const claudeFileCredential = readClaudeFileCredential(opts.home);
|
|
110
|
+
const codexFileCredential = readCodexFileCredential(opts.home, env);
|
|
111
|
+
const usableCodexFileCredential = codexFileCredential?.expiresAt === undefined ||
|
|
112
|
+
codexFileCredential.expiresAt - Date.now() > 60_000
|
|
113
|
+
? codexFileCredential
|
|
114
|
+
: null;
|
|
109
115
|
for (const id of Object.keys(PROVIDER_REGISTRY)) {
|
|
110
116
|
const entry = PROVIDER_REGISTRY[id];
|
|
111
117
|
const sources = [];
|
|
112
118
|
let apiKey;
|
|
113
119
|
let oauth;
|
|
120
|
+
let codex;
|
|
121
|
+
if (id === 'anthropic') {
|
|
122
|
+
const borrowed = preferFresherCredential(claudeFileCredential, keychainCredential);
|
|
123
|
+
const usableBorrowed = borrowed?.expiresAt === undefined || borrowed.expiresAt - Date.now() > 60_000
|
|
124
|
+
? borrowed
|
|
125
|
+
: null;
|
|
126
|
+
const borrowedSource = usableBorrowed === claudeFileCredential && usableBorrowed
|
|
127
|
+
? {
|
|
128
|
+
kind: 'claude-file',
|
|
129
|
+
path: claudeCredentialsPath(opts.home),
|
|
130
|
+
}
|
|
131
|
+
: usableBorrowed
|
|
132
|
+
? { kind: 'keychain', service: KEYCHAIN_SERVICE }
|
|
133
|
+
: undefined;
|
|
134
|
+
if (usableBorrowed && borrowedSource) {
|
|
135
|
+
if (apiKey === undefined) {
|
|
136
|
+
apiKey = usableBorrowed.accessToken;
|
|
137
|
+
oauth = {
|
|
138
|
+
refreshToken: usableBorrowed.refreshToken,
|
|
139
|
+
expiresAt: usableBorrowed.expiresAt,
|
|
140
|
+
origin: borrowedSource.kind === 'claude-file' ? 'claude-file' : 'keychain',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
sources.push(borrowedSource);
|
|
144
|
+
}
|
|
145
|
+
const otherBorrowedSource = usableBorrowed && usableBorrowed === claudeFileCredential && keychainCredential
|
|
146
|
+
? { kind: 'keychain', service: KEYCHAIN_SERVICE }
|
|
147
|
+
: usableBorrowed && usableBorrowed === keychainCredential && claudeFileCredential
|
|
148
|
+
? {
|
|
149
|
+
kind: 'claude-file',
|
|
150
|
+
path: claudeCredentialsPath(opts.home),
|
|
151
|
+
}
|
|
152
|
+
: undefined;
|
|
153
|
+
if (otherBorrowedSource)
|
|
154
|
+
sources.push(otherBorrowedSource);
|
|
155
|
+
if (storedCredential) {
|
|
156
|
+
if (apiKey === undefined) {
|
|
157
|
+
apiKey = storedCredential.accessToken;
|
|
158
|
+
oauth = {
|
|
159
|
+
refreshToken: storedCredential.refreshToken,
|
|
160
|
+
expiresAt: storedCredential.expiresAt,
|
|
161
|
+
origin: 'stored',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
sources.push({
|
|
165
|
+
kind: 'stored',
|
|
166
|
+
path: credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (id === 'codex' && (storedCodexCredential || usableCodexFileCredential)) {
|
|
171
|
+
const credential = usableCodexFileCredential ?? storedCodexCredential;
|
|
172
|
+
if (!credential)
|
|
173
|
+
throw new Error('unreachable');
|
|
174
|
+
apiKey = credential.accessToken;
|
|
175
|
+
sources.push({
|
|
176
|
+
kind: usableCodexFileCredential ? 'codex-file' : 'stored',
|
|
177
|
+
path: usableCodexFileCredential
|
|
178
|
+
? codexCredentialsPath(opts.home, env)
|
|
179
|
+
: credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
|
|
180
|
+
});
|
|
181
|
+
codex = {
|
|
182
|
+
accountId: credential.accountId,
|
|
183
|
+
expiresAt: credential.expiresAt,
|
|
184
|
+
origin: usableCodexFileCredential ? 'codex-file' : 'stored',
|
|
185
|
+
};
|
|
186
|
+
if (storedCodexCredential && usableCodexFileCredential) {
|
|
187
|
+
sources.push({
|
|
188
|
+
kind: 'stored',
|
|
189
|
+
path: credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
114
193
|
for (const envName of entry.envVars) {
|
|
115
194
|
// Through the SDK's seam rather than a direct `env[envName]`. The
|
|
116
195
|
// read is identical; what changes is that a host embedding the SDK
|
|
@@ -124,35 +203,6 @@ export async function discoverProviders(opts = {}) {
|
|
|
124
203
|
sources.push({ kind: 'env', envName });
|
|
125
204
|
}
|
|
126
205
|
}
|
|
127
|
-
if (id === 'anthropic' && storedCredential) {
|
|
128
|
-
if (apiKey === undefined)
|
|
129
|
-
apiKey = storedCredential.accessToken;
|
|
130
|
-
sources.push({
|
|
131
|
-
kind: 'stored',
|
|
132
|
-
path: credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
|
|
133
|
-
});
|
|
134
|
-
// Only carry refresh metadata when this token is the one we'll
|
|
135
|
-
// actually use (an env/secrets token has no refresh path).
|
|
136
|
-
if (apiKey === storedCredential.accessToken) {
|
|
137
|
-
oauth = {
|
|
138
|
-
refreshToken: storedCredential.refreshToken,
|
|
139
|
-
expiresAt: storedCredential.expiresAt,
|
|
140
|
-
origin: 'stored',
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
if (id === 'anthropic' && keychainCredential) {
|
|
145
|
-
if (apiKey === undefined)
|
|
146
|
-
apiKey = keychainCredential.accessToken;
|
|
147
|
-
sources.push({ kind: 'keychain', service: KEYCHAIN_SERVICE });
|
|
148
|
-
if (apiKey === keychainCredential.accessToken) {
|
|
149
|
-
oauth = {
|
|
150
|
-
refreshToken: keychainCredential.refreshToken,
|
|
151
|
-
expiresAt: keychainCredential.expiresAt,
|
|
152
|
-
origin: 'keychain',
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
206
|
if (sources.length === 0 && entry.probeUrl && !opts.skipProbes) {
|
|
157
207
|
const reachable = await probe(entry.probeUrl, opts);
|
|
158
208
|
if (reachable) {
|
|
@@ -166,6 +216,7 @@ export async function discoverProviders(opts = {}) {
|
|
|
166
216
|
apiKey,
|
|
167
217
|
baseUrl: entry.defaultBaseUrl,
|
|
168
218
|
...(oauth ? { oauth } : {}),
|
|
219
|
+
...(codex ? { codex } : {}),
|
|
169
220
|
alternatives: sources.slice(1),
|
|
170
221
|
});
|
|
171
222
|
}
|
|
@@ -177,7 +228,10 @@ async function probe(url, opts) {
|
|
|
177
228
|
const controller = new AbortController();
|
|
178
229
|
const timer = setTimeout(() => controller.abort(), opts.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS);
|
|
179
230
|
try {
|
|
180
|
-
const res = await fetchFn(url, {
|
|
231
|
+
const res = await fetchFn(url, {
|
|
232
|
+
method: 'GET',
|
|
233
|
+
signal: controller.signal,
|
|
234
|
+
});
|
|
181
235
|
return res.ok;
|
|
182
236
|
}
|
|
183
237
|
catch {
|