@namzu/cli 32.0.0 → 33.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/CHANGELOG.md +44 -0
- package/dist/browser/commands.js +11 -7
- package/dist/browser/commands.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +4 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +62 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +33 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp-oauth-login.d.ts +19 -0
- package/dist/commands/mcp-oauth-login.d.ts.map +1 -0
- package/dist/commands/mcp-oauth-login.js +213 -0
- package/dist/commands/mcp-oauth-login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +288 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +60 -5
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/worktree.d.ts +6 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +85 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/config/user-config.d.ts +2 -0
- package/dist/config/user-config.d.ts.map +1 -1
- package/dist/config/user-config.js +76 -6
- package/dist/config/user-config.js.map +1 -1
- package/dist/doctor/checks/credentials.d.ts.map +1 -1
- package/dist/doctor/checks/credentials.js +2 -0
- package/dist/doctor/checks/credentials.js.map +1 -1
- package/dist/integrations/mcp/oauth-store.d.ts +40 -0
- package/dist/integrations/mcp/oauth-store.d.ts.map +1 -0
- package/dist/integrations/mcp/oauth-store.js +549 -0
- package/dist/integrations/mcp/oauth-store.js.map +1 -0
- package/dist/integrations/mcp/servers.d.ts.map +1 -1
- package/dist/integrations/mcp/servers.js +155 -2
- package/dist/integrations/mcp/servers.js.map +1 -1
- package/dist/integrations/mcp/user-config.d.ts +25 -0
- package/dist/integrations/mcp/user-config.d.ts.map +1 -0
- package/dist/integrations/mcp/user-config.js +92 -0
- package/dist/integrations/mcp/user-config.js.map +1 -0
- package/dist/integrations/providers/credential-store.d.ts +8 -0
- package/dist/integrations/providers/credential-store.d.ts.map +1 -1
- package/dist/integrations/providers/credential-store.js +111 -22
- package/dist/integrations/providers/credential-store.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +11 -5
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +26 -12
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +1 -1
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +1 -1
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +23 -5
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +164 -24
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +4 -2
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +62 -8
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/subagents/worktree-driver.d.ts +17 -0
- package/dist/integrations/subagents/worktree-driver.d.ts.map +1 -0
- package/dist/integrations/subagents/worktree-driver.js +72 -0
- package/dist/integrations/subagents/worktree-driver.js.map +1 -0
- package/dist/integrations/worktrees/managed.d.ts +49 -0
- package/dist/integrations/worktrees/managed.d.ts.map +1 -0
- package/dist/integrations/worktrees/managed.js +231 -0
- package/dist/integrations/worktrees/managed.js.map +1 -0
- package/dist/schedule/fire/fire.d.ts.map +1 -1
- package/dist/schedule/fire/fire.js +5 -0
- package/dist/schedule/fire/fire.js.map +1 -1
- package/dist/skills/audit.d.ts +31 -0
- package/dist/skills/audit.d.ts.map +1 -0
- package/dist/skills/audit.js +75 -0
- package/dist/skills/audit.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +245 -46
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +18 -3
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/ResumePicker.d.ts +2 -1
- package/dist/tui/ResumePicker.d.ts.map +1 -1
- package/dist/tui/ResumePicker.js +3 -3
- package/dist/tui/ResumePicker.js.map +1 -1
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +14 -5
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/browser-notices.d.ts.map +1 -1
- package/dist/tui/browser-notices.js +6 -1
- package/dist/tui/browser-notices.js.map +1 -1
- package/dist/tui/credential-entry.d.ts +4 -29
- package/dist/tui/credential-entry.d.ts.map +1 -1
- package/dist/tui/credential-entry.js +7 -29
- package/dist/tui/credential-entry.js.map +1 -1
- package/dist/tui/login-prompt.d.ts +3 -1
- package/dist/tui/login-prompt.d.ts.map +1 -1
- package/dist/tui/login-prompt.js +11 -0
- package/dist/tui/login-prompt.js.map +1 -1
- package/dist/tui/provider-list.d.ts.map +1 -1
- package/dist/tui/provider-list.js +3 -1
- package/dist/tui/provider-list.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +10 -1
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +16 -3
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/turn-interruption.d.ts.map +1 -1
- package/dist/tui/turn-interruption.js +4 -0
- package/dist/tui/turn-interruption.js.map +1 -1
- package/package.json +6 -5
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
* and a headless run has nobody to read anything, so it refuses. This module
|
|
32
32
|
* reports; the callers decide.
|
|
33
33
|
*/
|
|
34
|
-
import {
|
|
34
|
+
import { UnauthorizedError, auth, extractWWWAuthenticateParams, withOAuth, } from '@modelcontextprotocol/client';
|
|
35
|
+
import { MCPClient, MCPHttpStatusError, mcpToolset, requireApproval, } from '@namzu/sdk';
|
|
36
|
+
import { McpOAuthLoginRequiredError, McpOAuthStoreError, createMcpOAuthProvider, hasMcpOAuthTokens, isSecureMcpOAuthUrl, mcpOAuthPath, } from './oauth-store.js';
|
|
35
37
|
/**
|
|
36
38
|
* How long a single server gets to connect, hand shake and list its tools.
|
|
37
39
|
*
|
|
@@ -137,6 +139,148 @@ export function transportFor(spec, defaultCwd, env = process.env) {
|
|
|
137
139
|
}
|
|
138
140
|
return 'it declares neither a command nor a url';
|
|
139
141
|
}
|
|
142
|
+
/** One refresh per credential file; unrelated MCP requests remain concurrent. */
|
|
143
|
+
const mcpOAuthRefreshes = new Map();
|
|
144
|
+
function mcpOAuthUnauthorized() {
|
|
145
|
+
return new MCPHttpStatusError('MCP OAuth', 401, 'authorization required; run `namzu mcp login <server>`', '');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* A running agent may reuse a saved OAuth grant, including its refresh token,
|
|
149
|
+
* but only an explicit `mcp login` may begin browser authorization. The store
|
|
150
|
+
* binds the grant to this complete URL (path and query included), and the
|
|
151
|
+
* fetch guard keeps it there even if a transport changes its request target.
|
|
152
|
+
*/
|
|
153
|
+
function withSavedMcpOAuth(transport) {
|
|
154
|
+
if (transport.type !== 'streamable-http')
|
|
155
|
+
return transport;
|
|
156
|
+
// A configured Authorization header is the operator's chosen credential.
|
|
157
|
+
// The official middleware would replace it with the saved bearer token.
|
|
158
|
+
if (Object.keys(transport.headers ?? {}).some((key) => key.toLowerCase() === 'authorization')) {
|
|
159
|
+
return transport;
|
|
160
|
+
}
|
|
161
|
+
let endpoint;
|
|
162
|
+
try {
|
|
163
|
+
endpoint = new URL(transport.url);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return transport;
|
|
167
|
+
}
|
|
168
|
+
// The OAuth store accepts HTTPS and loopback HTTP. Preserve ordinary MCP
|
|
169
|
+
// behavior for other URLs instead of turning their lack of OAuth into an
|
|
170
|
+
// unrelated startup error.
|
|
171
|
+
if (!isSecureMcpOAuthUrl(endpoint))
|
|
172
|
+
return transport;
|
|
173
|
+
if (!hasMcpOAuthTokens(transport.url))
|
|
174
|
+
return transport;
|
|
175
|
+
const provider = createMcpOAuthProvider({ endpoint: transport.url });
|
|
176
|
+
const rawFetch = fetch;
|
|
177
|
+
const oauthNetworkFetch = (input, init) => {
|
|
178
|
+
const target = new URL(String(input));
|
|
179
|
+
if (!isSecureMcpOAuthUrl(target)) {
|
|
180
|
+
throw new McpOAuthStoreError('MCP OAuth network requests require HTTPS or loopback HTTP.');
|
|
181
|
+
}
|
|
182
|
+
// OAuth discovery and token requests may carry a client secret or refresh
|
|
183
|
+
// token. A 307/308 must never replay their POST body to a redirect target.
|
|
184
|
+
return rawFetch(input, { ...init, redirect: 'manual' });
|
|
185
|
+
};
|
|
186
|
+
const credentialKey = mcpOAuthPath(transport.url);
|
|
187
|
+
const authenticatedFetch = withOAuth(provider, transport.url)(async (input, init) => {
|
|
188
|
+
if (input.toString() !== transport.url) {
|
|
189
|
+
throw new Error('MCP OAuth refused a request to a different endpoint');
|
|
190
|
+
}
|
|
191
|
+
// The bearer token is attached by `withOAuth` before this call. Never
|
|
192
|
+
// auto-follow a redirect with it, including to another path on the
|
|
193
|
+
// same origin, even if an SDK transport changes its own redirect mode.
|
|
194
|
+
const response = await rawFetch(input, { ...init, redirect: 'manual' });
|
|
195
|
+
if (response.status !== 401)
|
|
196
|
+
return response;
|
|
197
|
+
// Intercept the challenge before `withOAuth` can start an independent
|
|
198
|
+
// refresh for every simultaneous request. Its token attachment remains
|
|
199
|
+
// authoritative; the official `auth()` performs the refresh once.
|
|
200
|
+
const attemptedAuthorization = new Headers(init?.headers).get('authorization');
|
|
201
|
+
const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams(response);
|
|
202
|
+
void response.body?.cancel().catch(() => undefined);
|
|
203
|
+
let refresh = mcpOAuthRefreshes.get(credentialKey);
|
|
204
|
+
if (!refresh) {
|
|
205
|
+
refresh = (async () => {
|
|
206
|
+
const current = await provider.tokens();
|
|
207
|
+
if (!current)
|
|
208
|
+
throw new McpOAuthLoginRequiredError();
|
|
209
|
+
// Another connection or process may have renewed this grant while
|
|
210
|
+
// the old request was in flight. Its new access token is enough.
|
|
211
|
+
if (attemptedAuthorization !== `Bearer ${current.access_token}`)
|
|
212
|
+
return;
|
|
213
|
+
const result = await auth(provider, {
|
|
214
|
+
serverUrl: transport.url,
|
|
215
|
+
resourceMetadataUrl,
|
|
216
|
+
scope,
|
|
217
|
+
fetchFn: oauthNetworkFetch,
|
|
218
|
+
});
|
|
219
|
+
if (result !== 'AUTHORIZED')
|
|
220
|
+
throw new McpOAuthLoginRequiredError();
|
|
221
|
+
})();
|
|
222
|
+
mcpOAuthRefreshes.set(credentialKey, refresh);
|
|
223
|
+
const ownedRefresh = refresh;
|
|
224
|
+
void ownedRefresh.then(() => {
|
|
225
|
+
if (mcpOAuthRefreshes.get(credentialKey) === ownedRefresh) {
|
|
226
|
+
mcpOAuthRefreshes.delete(credentialKey);
|
|
227
|
+
}
|
|
228
|
+
}, () => {
|
|
229
|
+
if (mcpOAuthRefreshes.get(credentialKey) === ownedRefresh) {
|
|
230
|
+
mcpOAuthRefreshes.delete(credentialKey);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
await refresh;
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// A second process may have won a rotating-token refresh while
|
|
239
|
+
// this one failed. The store's issuer/endpoint binding still holds;
|
|
240
|
+
// one retry with its new token is safe and avoids a false failure.
|
|
241
|
+
const latest = await provider.tokens();
|
|
242
|
+
if (!latest || attemptedAuthorization === `Bearer ${latest.access_token}`) {
|
|
243
|
+
throw mcpOAuthUnauthorized();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const current = await provider.tokens();
|
|
247
|
+
if (!current)
|
|
248
|
+
throw mcpOAuthUnauthorized();
|
|
249
|
+
const headers = new Headers(init?.headers);
|
|
250
|
+
headers.set('Authorization', `Bearer ${current.access_token}`);
|
|
251
|
+
const retried = await rawFetch(input, { ...init, headers, redirect: 'manual' });
|
|
252
|
+
if (retried.status === 401) {
|
|
253
|
+
void retried.body?.cancel().catch(() => undefined);
|
|
254
|
+
throw mcpOAuthUnauthorized();
|
|
255
|
+
}
|
|
256
|
+
return retried;
|
|
257
|
+
});
|
|
258
|
+
const oauthFetch = async (input, init) => {
|
|
259
|
+
// `withOAuth` authenticates any URL handed to it. Our Streamable HTTP
|
|
260
|
+
// transport sends the configured URL exactly; reject any other target
|
|
261
|
+
// before the bearer token can reach it.
|
|
262
|
+
if (input !== transport.url) {
|
|
263
|
+
throw new Error('MCP OAuth refused a request to a different endpoint');
|
|
264
|
+
}
|
|
265
|
+
try {
|
|
266
|
+
if (!(await provider.tokens()))
|
|
267
|
+
throw new McpOAuthLoginRequiredError();
|
|
268
|
+
return await authenticatedFetch(input, init);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
if (error instanceof UnauthorizedError ||
|
|
272
|
+
error instanceof McpOAuthLoginRequiredError ||
|
|
273
|
+
error instanceof McpOAuthStoreError) {
|
|
274
|
+
// The official middleware throws after a 401 or failed refresh.
|
|
275
|
+
// The SDK's era probe recognizes its own HTTP status error and
|
|
276
|
+
// refuses 401 instead of offering a legacy initialize handshake.
|
|
277
|
+
throw mcpOAuthUnauthorized();
|
|
278
|
+
}
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
return { ...transport, fetch: oauthFetch };
|
|
283
|
+
}
|
|
140
284
|
async function withDeadline(work, ms, what) {
|
|
141
285
|
let timer;
|
|
142
286
|
try {
|
|
@@ -255,9 +399,18 @@ export async function connectMcpServers(config, options) {
|
|
|
255
399
|
startupFailed.push({ name, reason: toolsetOptions });
|
|
256
400
|
continue;
|
|
257
401
|
}
|
|
402
|
+
let connectedTransport;
|
|
403
|
+
try {
|
|
404
|
+
connectedTransport =
|
|
405
|
+
transport.type === 'streamable-http' ? withSavedMcpOAuth(transport) : transport;
|
|
406
|
+
}
|
|
407
|
+
catch (error) {
|
|
408
|
+
startupFailed.push({ name, reason: reasonOf(error) });
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
258
411
|
const client = new MCPClient({
|
|
259
412
|
serverName: name,
|
|
260
|
-
transport,
|
|
413
|
+
transport: connectedTransport,
|
|
261
414
|
...(eraProbeTimeoutMs !== undefined ? { eraProbeTimeoutMs } : {}),
|
|
262
415
|
});
|
|
263
416
|
const discovery = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"servers.js","sourceRoot":"","sources":["../../../src/integrations/mcp/servers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"servers.js","sourceRoot":"","sources":["../../../src/integrations/mcp/servers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type UserConfigWriteOptions } from '../../config/user-config.js';
|
|
2
|
+
import type { McpServerSpec } from './servers.js';
|
|
3
|
+
export interface UserMcpServer {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly spec: unknown;
|
|
6
|
+
}
|
|
7
|
+
/** Read only the user's own entries, not project/profile/managed overrides. */
|
|
8
|
+
export declare function readUserMcpServers(opts?: UserConfigWriteOptions): readonly UserMcpServer[];
|
|
9
|
+
export declare function isUserMcpName(name: string): boolean;
|
|
10
|
+
/** Never replace an entry silently: the existing server may carry permissions. */
|
|
11
|
+
export declare function addUserMcpServer(name: string, spec: McpServerSpec, opts?: UserConfigWriteOptions): string;
|
|
12
|
+
export declare function removeUserMcpServer(name: string, opts?: UserConfigWriteOptions): boolean;
|
|
13
|
+
export interface UserMcpServerSummary {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly transport: 'stdio' | 'http' | 'invalid';
|
|
16
|
+
readonly command?: string;
|
|
17
|
+
readonly endpoint?: string;
|
|
18
|
+
readonly argumentCount?: number;
|
|
19
|
+
readonly envNames?: readonly string[];
|
|
20
|
+
readonly headerNames?: readonly string[];
|
|
21
|
+
readonly inheritEnv?: readonly string[];
|
|
22
|
+
}
|
|
23
|
+
/** Display metadata only. Headers, environment values, and argv can contain secrets. */
|
|
24
|
+
export declare function summarizeUserMcpServer(entry: UserMcpServer): UserMcpServerSummary;
|
|
25
|
+
//# sourceMappingURL=user-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-config.d.ts","sourceRoot":"","sources":["../../../src/integrations/mcp/user-config.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,sBAAsB,EAI3B,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAIjD,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CACtB;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,SAAS,aAAa,EAAE,CAmB9F;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,sBAA2B,GAC/B,MAAM,CAUR;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAE5F;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,CAoCjF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { isMap, parseDocument } from 'yaml';
|
|
3
|
+
import { deleteUserConfigValue, setUserConfigValue, userConfigPath, } from '../../config/user-config.js';
|
|
4
|
+
const MCP_NAME = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/;
|
|
5
|
+
/** Read only the user's own entries, not project/profile/managed overrides. */
|
|
6
|
+
export function readUserMcpServers(opts = {}) {
|
|
7
|
+
const file = userConfigPath(opts);
|
|
8
|
+
if (!existsSync(file))
|
|
9
|
+
return [];
|
|
10
|
+
const doc = parseDocument(readFileSync(file, 'utf8'));
|
|
11
|
+
if (doc.errors.length > 0) {
|
|
12
|
+
throw new Error(`${file} is not valid YAML (${doc.errors[0]?.message ?? 'parse error'}); fix it first`);
|
|
13
|
+
}
|
|
14
|
+
if (doc.contents !== null && !isMap(doc.contents)) {
|
|
15
|
+
throw new Error(`${file} is not a mapping of settings; fix it first`);
|
|
16
|
+
}
|
|
17
|
+
const node = doc.get('mcpServers', true);
|
|
18
|
+
if (node === undefined)
|
|
19
|
+
return [];
|
|
20
|
+
if (!isMap(node))
|
|
21
|
+
throw new Error(`${file}: mcpServers is not a mapping; fix it first`);
|
|
22
|
+
return Object.entries(node.toJSON()).map(([name, spec]) => ({
|
|
23
|
+
name,
|
|
24
|
+
spec,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export function isUserMcpName(name) {
|
|
28
|
+
return MCP_NAME.test(name);
|
|
29
|
+
}
|
|
30
|
+
/** Never replace an entry silently: the existing server may carry permissions. */
|
|
31
|
+
export function addUserMcpServer(name, spec, opts = {}) {
|
|
32
|
+
if (!isUserMcpName(name)) {
|
|
33
|
+
throw new Error('server name must start with a letter and contain only letters, digits, _ or - (up to 64 characters)');
|
|
34
|
+
}
|
|
35
|
+
if (readUserMcpServers(opts).some((entry) => entry.name === name)) {
|
|
36
|
+
throw new Error(`server "${name}" already exists in ${userConfigPath(opts)}`);
|
|
37
|
+
}
|
|
38
|
+
return setUserConfigValue(['mcpServers', name], spec, opts);
|
|
39
|
+
}
|
|
40
|
+
export function removeUserMcpServer(name, opts = {}) {
|
|
41
|
+
return deleteUserConfigValue(['mcpServers', name], opts);
|
|
42
|
+
}
|
|
43
|
+
/** Display metadata only. Headers, environment values, and argv can contain secrets. */
|
|
44
|
+
export function summarizeUserMcpServer(entry) {
|
|
45
|
+
const spec = entry.spec;
|
|
46
|
+
if (typeof spec !== 'object' || spec === null || Array.isArray(spec)) {
|
|
47
|
+
return { name: entry.name, transport: 'invalid' };
|
|
48
|
+
}
|
|
49
|
+
const value = spec;
|
|
50
|
+
const command = typeof value.command === 'string' ? value.command : undefined;
|
|
51
|
+
const url = typeof value.url === 'string' ? value.url : undefined;
|
|
52
|
+
if (command && !url) {
|
|
53
|
+
return {
|
|
54
|
+
name: entry.name,
|
|
55
|
+
transport: 'stdio',
|
|
56
|
+
command,
|
|
57
|
+
argumentCount: Array.isArray(value.args) ? value.args.length : 0,
|
|
58
|
+
envNames: mappingKeys(value.env),
|
|
59
|
+
inheritEnv: stringList(value.inheritEnv),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (url && !command) {
|
|
63
|
+
let endpoint;
|
|
64
|
+
try {
|
|
65
|
+
const parsed = new URL(url);
|
|
66
|
+
// Tokenized MCP endpoints can carry credentials in path segments. Show
|
|
67
|
+
// only the origin in both human and structured summaries.
|
|
68
|
+
endpoint = parsed.origin;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
endpoint = '(invalid URL)';
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
name: entry.name,
|
|
75
|
+
transport: 'http',
|
|
76
|
+
endpoint,
|
|
77
|
+
headerNames: mappingKeys(value.headers),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { name: entry.name, transport: 'invalid' };
|
|
81
|
+
}
|
|
82
|
+
function mappingKeys(value) {
|
|
83
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
84
|
+
? Object.keys(value)
|
|
85
|
+
: [];
|
|
86
|
+
}
|
|
87
|
+
function stringList(value) {
|
|
88
|
+
return Array.isArray(value)
|
|
89
|
+
? value.filter((item) => typeof item === 'string')
|
|
90
|
+
: [];
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=user-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-config.js","sourceRoot":"","sources":["../../../src/integrations/mcp/user-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,6 +66,14 @@ export type ConditionalCodexCredentialWrite = {
|
|
|
66
66
|
readonly current: StoredCodexCredential | null;
|
|
67
67
|
};
|
|
68
68
|
export declare function credentialsPath(home?: string): string;
|
|
69
|
+
/** Kept separate from subscriptions so older credentials.json writers cannot erase it. */
|
|
70
|
+
export declare function googleApiKeyPath(home?: string): string;
|
|
71
|
+
/** Return only a Namzu-owned, private Gemini API key. Never read a symlink. */
|
|
72
|
+
export declare function readStoredGeminiApiKey(home?: string): string | null;
|
|
73
|
+
/** Atomically publish a verified-private key after a usable Google session opens. */
|
|
74
|
+
export declare function writeStoredGeminiApiKey(apiKey: string, home?: string): string;
|
|
75
|
+
/** Remove Namzu's Gemini key without changing environment or Gemini CLI credentials. */
|
|
76
|
+
export declare function clearStoredGeminiApiKey(home?: string): void;
|
|
69
77
|
/**
|
|
70
78
|
* The stored subscription credential, or `null` when there is none.
|
|
71
79
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
*/
|
|
45
45
|
import { execFileSync } from 'node:child_process';
|
|
46
46
|
import { randomBytes } from 'node:crypto';
|
|
47
|
-
import { closeSync, fsyncSync, linkSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, writeSync, } from 'node:fs';
|
|
47
|
+
import { closeSync, fsyncSync, linkSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync, writeSync, } from 'node:fs';
|
|
48
48
|
import { platform, tmpdir } from 'node:os';
|
|
49
|
-
import { dirname, join } from 'node:path';
|
|
49
|
+
import { basename, dirname, join } from 'node:path';
|
|
50
50
|
import { namzuHomePath } from '../state/home.js';
|
|
51
51
|
const FILE_MODE = 0o600;
|
|
52
52
|
const DIR_MODE = 0o700;
|
|
@@ -58,6 +58,45 @@ export class CredentialStoreError extends Error {
|
|
|
58
58
|
export function credentialsPath(home) {
|
|
59
59
|
return join(namzuHomePath(home), 'credentials.json');
|
|
60
60
|
}
|
|
61
|
+
/** Kept separate from subscriptions so older credentials.json writers cannot erase it. */
|
|
62
|
+
export function googleApiKeyPath(home) {
|
|
63
|
+
return join(namzuHomePath(home), 'gemini-api-key.json');
|
|
64
|
+
}
|
|
65
|
+
/** Return only a Namzu-owned, private Gemini API key. Never read a symlink. */
|
|
66
|
+
export function readStoredGeminiApiKey(home) {
|
|
67
|
+
const path = googleApiKeyPath(home);
|
|
68
|
+
try {
|
|
69
|
+
protectCredentialParentOnWindows(path);
|
|
70
|
+
const entry = lstatSync(path);
|
|
71
|
+
if (!entry.isFile() || entry.isSymbolicLink())
|
|
72
|
+
return null;
|
|
73
|
+
restrictToOwner(path);
|
|
74
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
75
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
76
|
+
return null;
|
|
77
|
+
const record = parsed;
|
|
78
|
+
return record.version === 1 && typeof record.apiKey === 'string' && record.apiKey.trim()
|
|
79
|
+
? record.apiKey
|
|
80
|
+
: null;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Atomically publish a verified-private key after a usable Google session opens. */
|
|
87
|
+
export function writeStoredGeminiApiKey(apiKey, home) {
|
|
88
|
+
if (!apiKey.trim())
|
|
89
|
+
throw new CredentialStoreError('Cannot store an empty Gemini API key.');
|
|
90
|
+
const path = googleApiKeyPath(home);
|
|
91
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
92
|
+
return withCredentialStoreLock(path, () => writeCredentialBodyUnlocked(`${JSON.stringify({ version: 1, apiKey })}\n`, path));
|
|
93
|
+
}
|
|
94
|
+
/** Remove Namzu's Gemini key without changing environment or Gemini CLI credentials. */
|
|
95
|
+
export function clearStoredGeminiApiKey(home) {
|
|
96
|
+
const path = googleApiKeyPath(home);
|
|
97
|
+
mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
|
|
98
|
+
withCredentialStoreLock(path, () => rmSync(path, { force: true }));
|
|
99
|
+
}
|
|
61
100
|
/**
|
|
62
101
|
* The stored subscription credential, or `null` when there is none.
|
|
63
102
|
*
|
|
@@ -196,37 +235,56 @@ export function replaceStoredSubscriptionCredential(expected, replacement, home)
|
|
|
196
235
|
});
|
|
197
236
|
}
|
|
198
237
|
function writeCredentialDocumentUnlocked(document, path) {
|
|
199
|
-
const tmp = `${path}.tmp.${process.pid}.${randomBytes(6).toString('hex')}`;
|
|
200
238
|
const body = `${JSON.stringify(serializeDocument(document), null, 2)}\n`;
|
|
239
|
+
return writeCredentialBodyUnlocked(body, path);
|
|
240
|
+
}
|
|
241
|
+
function writeCredentialBodyUnlocked(body, path) {
|
|
242
|
+
const tmp = `${path}.tmp.${process.pid}.${randomBytes(6).toString('hex')}`;
|
|
201
243
|
let fd;
|
|
244
|
+
let placing = false;
|
|
202
245
|
try {
|
|
203
246
|
// `wx` — refuse an existing path rather than truncate one, so a name
|
|
204
247
|
// collision can never hand us a file somebody else already opened.
|
|
205
248
|
fd = openSync(tmp, 'wx', FILE_MODE);
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
catch (err) {
|
|
209
|
-
if (fd !== undefined)
|
|
210
|
-
closeSync(fd);
|
|
211
|
-
rmSync(tmp, { force: true });
|
|
212
|
-
throw new CredentialStoreError(`could not write ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
213
|
-
}
|
|
214
|
-
closeSync(fd);
|
|
215
|
-
try {
|
|
249
|
+
// On Windows, `0600` does not govern the ACL. Prove the still-empty
|
|
250
|
+
// file is private before putting a credential into it.
|
|
216
251
|
restrictToOwner(tmp);
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
252
|
+
const bytes = Buffer.from(body, 'utf8');
|
|
253
|
+
for (let offset = 0; offset < bytes.length;) {
|
|
254
|
+
const written = writeSync(fd, bytes, offset, bytes.length - offset);
|
|
255
|
+
if (written <= 0 || written > bytes.length - offset) {
|
|
256
|
+
throw new Error('credential write did not make progress');
|
|
257
|
+
}
|
|
258
|
+
offset += written;
|
|
259
|
+
}
|
|
260
|
+
fsyncSync(fd);
|
|
261
|
+
closeSync(fd);
|
|
262
|
+
fd = undefined;
|
|
263
|
+
// Re-check after the write, before the name becomes discoverable.
|
|
264
|
+
restrictToOwner(tmp);
|
|
265
|
+
placing = true;
|
|
223
266
|
renameSync(tmp, path);
|
|
267
|
+
return path;
|
|
224
268
|
}
|
|
225
269
|
catch (err) {
|
|
226
|
-
|
|
227
|
-
|
|
270
|
+
if (fd !== undefined) {
|
|
271
|
+
try {
|
|
272
|
+
closeSync(fd);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// A failed close may already have closed the descriptor. Remove the
|
|
276
|
+
// temporary name in either case and report if that also fails.
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
let cleanupError;
|
|
280
|
+
try {
|
|
281
|
+
rmSync(tmp, { force: true });
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
cleanupError = error;
|
|
285
|
+
}
|
|
286
|
+
throw new CredentialStoreError(`could not ${placing ? 'place' : 'write'} ${path}: ${err instanceof Error ? err.message : String(err)}${cleanupError ? `; temporary file ${tmp} could not be removed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}` : ''}`);
|
|
228
287
|
}
|
|
229
|
-
return path;
|
|
230
288
|
}
|
|
231
289
|
function serializeDocument(document) {
|
|
232
290
|
const credential = (value) => ({
|
|
@@ -310,6 +368,7 @@ function sameCodexCredential(left, right) {
|
|
|
310
368
|
* operator proves no process owns the store and removes it.
|
|
311
369
|
*/
|
|
312
370
|
function withCredentialStoreLock(path, operation) {
|
|
371
|
+
protectCredentialParentOnWindows(path);
|
|
313
372
|
const lockPath = `${path}.lock`;
|
|
314
373
|
const token = `${process.pid}:${Date.now()}:${randomBytes(12).toString('hex')}`;
|
|
315
374
|
const published = publishLockAtomically(lockPath, token);
|
|
@@ -317,6 +376,7 @@ function withCredentialStoreLock(path, operation) {
|
|
|
317
376
|
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.`);
|
|
318
377
|
}
|
|
319
378
|
try {
|
|
379
|
+
removeCredentialTempsUnlocked(path);
|
|
320
380
|
return operation();
|
|
321
381
|
}
|
|
322
382
|
finally {
|
|
@@ -331,6 +391,35 @@ function withCredentialStoreLock(path, operation) {
|
|
|
331
391
|
}
|
|
332
392
|
}
|
|
333
393
|
}
|
|
394
|
+
/** Protect the directory before opening any child of it on Windows. */
|
|
395
|
+
function protectCredentialParentOnWindows(path) {
|
|
396
|
+
if (platform() !== 'win32')
|
|
397
|
+
return;
|
|
398
|
+
// Windows grants access when a handle is opened. Tightening an empty temp
|
|
399
|
+
// later cannot revoke another account's already-open handle. The parent
|
|
400
|
+
// must be private before even the lock candidate or credential file opens.
|
|
401
|
+
const parent = dirname(path);
|
|
402
|
+
const entry = lstatSync(parent);
|
|
403
|
+
if (entry.isSymbolicLink() || !entry.isDirectory()) {
|
|
404
|
+
throw new CredentialStoreError(`credential directory must be a real directory: ${parent}`);
|
|
405
|
+
}
|
|
406
|
+
restrictToOwner(parent);
|
|
407
|
+
}
|
|
408
|
+
/** Only a store-lock owner may remove crash leftovers, never an active writer. */
|
|
409
|
+
function removeCredentialTempsUnlocked(path) {
|
|
410
|
+
const prefix = `${basename(path)}.tmp.`;
|
|
411
|
+
try {
|
|
412
|
+
for (const entry of readdirSync(dirname(path))) {
|
|
413
|
+
if (!entry.startsWith(prefix) || !/^\d+\.[0-9a-f]{12}$/u.test(entry.slice(prefix.length))) {
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
rmSync(join(dirname(path), entry), { force: true });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
throw new CredentialStoreError(`could not remove temporary credential files for ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
334
423
|
/**
|
|
335
424
|
* Publish a complete owner record at the canonical name in one filesystem op.
|
|
336
425
|
*
|