Skip to content

[codex] add cloud gateway account management - #402

Open
jeremymcs wants to merge 48 commits into
mainfrom
codex/cloud-mcp-gateway-accounts-usage
Open

[codex] add cloud gateway account management#402
jeremymcs wants to merge 48 commits into
mainfrom
codex/cloud-mcp-gateway-accounts-usage

Conversation

@jeremymcs

@jeremymcs jeremymcs commented Jun 2, 2026

Copy link
Copy Markdown
Member

Summary

  • add Cloud MCP Gateway user management with admin and account UIs, Clerk-backed account auth, local hashed user tokens, pairing codes, usage tracking, and quota enforcement
  • let local cloud runtimes advertise external MCP tools, including browser MCP tools, and forward those through the gateway with routing fields
  • add authenticated Streamable HTTP support for gsd-mcp-server --http plus README coverage for cloud/remote setup

Why

Remote MCP clients need a safer hosted gateway surface: operators need users, tokens, runtime visibility, usage accounting, and quotas, while local runtimes need a way to expose browser and other stdio MCP tools without exposing local websocket endpoints.

Validation

  • pnpm install --lockfile-only --ignore-scripts
  • pnpm install --ignore-scripts
  • pnpm --filter @opengsd/contracts build
  • pnpm --filter @opengsd/rpc-client build
  • pnpm --filter @opengsd/mcp-server build
  • pnpm --filter @opengsd/cloud-mcp-gateway test
  • pnpm --filter @opengsd/mcp-server test
  • pnpm --filter @opengsd/daemon build
  • pnpm --filter @opengsd/daemon test

View with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is enabled.


Note

High Risk
Touches authentication, token lifecycle, Clerk integration, and quota enforcement on the public /mcp path—misconfiguration could lock out users or expose endpoints; large surface area across gateway, daemon, and mcp-server.

Overview
This PR turns the Cloud MCP Gateway into an operable hosted product: admin (/admin) and Clerk-backed account (/account) UIs, REST APIs for users/tokens/pairing/runtimes/usage, persisted auth and usage stores, and plan-based quotas that block /mcp tool calls before they hit the local runtime (throttled calls logged as non-billable).

The gateway MCP layer now merges runtime-advertised tools (with runtimeId / projectAlias routing) alongside built-in GSD tools, records per-call metrics, and enforces limits via a new usage limiter. Auth grows into a full user registry (roles, plans, revocable gsd_usr_ tokens, disabled users, optional POST /register).

On the daemon side, cloud runtimes can bridge stdio MCP servers (default gsd-browser mcp, configurable via env) and advertise those tools upstream; LocalToolExecutor delegates unknown tool names to that bridge.

gsd-mcp-server gains --http Streamable HTTP on /mcp with bearer auth defaults that refuse public unauthenticated binds unless loopback or --no-auth.

Reviewed by Cursor Bugbot for commit beb1592. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

🔴 PR Risk Report — CRITICAL

Files changed 32
Systems affected 4
Overall risk 🔴 CRITICAL

Affected Systems

Risk System
🔴 critical Agent Core
🟠 high AI Providers
🟡 medium CLI
🟡 medium TUI Components
File Breakdown
Risk File Systems
🟡 packages/cloud-mcp-gateway/src/cli.ts CLI
🔴 packages/cloud-mcp-gateway/src/index.ts Agent Core, AI Providers, TUI Components
🟡 packages/mcp-server/src/cli.ts CLI
packages/cloud-mcp-gateway/README.md (unclassified)
packages/cloud-mcp-gateway/package.json (unclassified)
packages/cloud-mcp-gateway/src/account-ui.ts (unclassified)
packages/cloud-mcp-gateway/src/admin-ui.ts (unclassified)
packages/cloud-mcp-gateway/src/auth-store.test.ts (unclassified)
packages/cloud-mcp-gateway/src/auth-store.ts (unclassified)
packages/cloud-mcp-gateway/src/clerk-auth.test.ts (unclassified)
packages/cloud-mcp-gateway/src/clerk-auth.ts (unclassified)
packages/cloud-mcp-gateway/src/mcp.test.ts (unclassified)
packages/cloud-mcp-gateway/src/mcp.ts (unclassified)
packages/cloud-mcp-gateway/src/protocol.ts (unclassified)
packages/cloud-mcp-gateway/src/runtime-registry.test.ts (unclassified)
packages/cloud-mcp-gateway/src/runtime-registry.ts (unclassified)
packages/cloud-mcp-gateway/src/server.test.ts (unclassified)
packages/cloud-mcp-gateway/src/server.ts (unclassified)
packages/cloud-mcp-gateway/src/usage-limits.test.ts (unclassified)
packages/cloud-mcp-gateway/src/usage-limits.ts (unclassified)
packages/cloud-mcp-gateway/src/usage-store.test.ts (unclassified)
packages/cloud-mcp-gateway/src/usage-store.ts (unclassified)
packages/daemon/package.json (unclassified)
packages/daemon/src/cloud-runtime.ts (unclassified)
packages/daemon/src/external-mcp-tools.ts (unclassified)
packages/daemon/src/local-tool-executor.test.ts (unclassified)
packages/daemon/src/local-tool-executor.ts (unclassified)
packages/mcp-server/README.md (unclassified)
packages/mcp-server/package.json (unclassified)
packages/mcp-server/src/http.test.ts (unclassified)
packages/mcp-server/src/http.ts (unclassified)
pnpm-lock.yaml (unclassified)

⚠️ 🔴 Critical risk — the following systems require verification before merge:

  • 🔴 Agent Core: check for race conditions and loop exit paths in the agent loop
  • 🟠 AI Providers: confirm provider API contract and error handling are intact

⛔ This PR should not be merged without executing this follow-up prompt.

Ask your coding agent to verify before submitting:

Review this PR for risks in: Agent Core, AI Providers. Verify:

1. check for race conditions and loop exit paths in the agent loop
2. confirm provider API contract and error handling are intact

Before modifying any code, assess the scope of this fix:

- Identify the root cause, not just the reported symptom.
- Search the codebase for other call sites, similar patterns, or duplicated logic that may share the same bug.
- List affected tests, documentation, and any downstream consumers that depend on the current behavior.
- Flag any changes that extend beyond the immediate file or function.

Report findings first. Then propose a fix scoped to the actual root cause, and wait for confirmation before applying changes outside the originally reported location.

💡 Have a Codex subscription? Get an independent second opinion: codex review --adversarial

@jeremymcs
jeremymcs marked this pull request as ready for review June 2, 2026 15:27
Comment thread packages/mcp-server/src/http.ts Fixed
Comment thread packages/mcp-server/src/http.ts Fixed
@jeremymcs
jeremymcs marked this pull request as draft June 2, 2026 15:31

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is ON. A cloud agent has been kicked off to fix the reported issues.

Reviewed by Cursor Bugbot for commit beb1592. Configure here.

Comment thread packages/mcp-server/src/http.ts Outdated
Comment thread packages/cloud-mcp-gateway/src/usage-limits.ts
@jeremymcs

Copy link
Copy Markdown
Member Author

Accepted — queued for a code change.

@socket-security

socket-security Bot commented Jun 2, 2026

Copy link
Copy Markdown

All alerts resolved. Learn more about Socket for GitHub.

This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored.

View full report

@jeremymcs
jeremymcs force-pushed the codex/cloud-mcp-gateway-accounts-usage branch from 0515360 to 52ebbc7 Compare June 12, 2026 03:28
@jeremymcs

Copy link
Copy Markdown
Member Author

Accepted — queued for a code change.

@jeremymcs

Copy link
Copy Markdown
Member Author

Started an automated PR update.

Merge conflicts were detected while updating this branch from the base branch.

Conflicted files:

  • packages/cloud-mcp-gateway/src/runtime-registry.test.ts
  • packages/mcp-server/package.json

An automatic resolution attempt is running. If it cannot complete safely, this PR will be marked for manual follow-up.

@jeremymcs
jeremymcs force-pushed the codex/cloud-mcp-gateway-accounts-usage branch from 900cec2 to 44cea75 Compare July 2, 2026 04:23
@jeremymcs

Copy link
Copy Markdown
Member Author

Started an automated PR update.

Merge conflicts were detected while updating this branch from the base branch.

Conflicted files:

  • packages/cloud-mcp-gateway/src/auth-store.ts
  • packages/daemon/src/cloud-runtime.ts

An automatic resolution attempt is running. If it cannot complete safely, this PR will be marked for manual follow-up.

@jeremymcs

Copy link
Copy Markdown
Member Author

Re: the latest Cursor Bugbot review (commit beb15921, "2 potential issues") — both flagged issues are already fixed and verified at current HEAD (44cea75f); the corresponding inline review threads are resolved:

  1. HTTP MCP auth timing-unsafe comparisonauthorize in packages/mcp-server/src/http.ts:89 uses a.length === b.length && timingSafeEqual(a, b) (node:crypto), matching the gateway's tokenMatches pattern. No timing leak.
  2. readLimit treats fractional values as unlimitedpackages/cloud-mcp-gateway/src/usage-limits.ts:210-216 now uses an explicit if (parsed === 0) return undefined sentinel and Math.max(1, Math.floor(parsed)), so 0.5 resolves to a limit of 1, not unlimited. Covered by the readLimit treats fractional values as limit of 1, not unlimited test.

Verification at HEAD: pnpm --filter @opengsd/mcp-server test → 208/208 pass; pnpm --filter @opengsd/cloud-mcp-gateway test → 45/45 pass. No code change needed — the Bugbot re-flag is stale relative to the fixes already on this branch.

@jeremymcs
jeremymcs force-pushed the codex/cloud-mcp-gateway-accounts-usage branch from 44cea75 to c260f84 Compare July 7, 2026 21:02
@jeremymcs

Copy link
Copy Markdown
Member Author

Started an automated PR update.

Accepted review feedback is being applied.
Progress and final results will be posted in the related review thread(s).

jeremymcs added a commit that referenced this pull request Jul 7, 2026
jeremymcs added a commit that referenced this pull request Jul 7, 2026
@jeremymcs
jeremymcs force-pushed the codex/cloud-mcp-gateway-accounts-usage branch from c9770ac to 3b88520 Compare July 7, 2026 21:39
@jeremymcs

Copy link
Copy Markdown
Member Author

Started an automated PR update.

Merge conflicts were detected while updating this branch from the base branch.

Conflicted files:

  • packages/daemon/package.json
  • pnpm-lock.yaml

An automatic resolution attempt is running. If it cannot complete safely, this PR will be marked for manual follow-up.

@jeremymcs
jeremymcs marked this pull request as ready for review July 25, 2026 13:38
Copilot AI review requested due to automatic review settings July 25, 2026 13:38
jeremymcs and others added 8 commits July 25, 2026 13:40
…onal sentinel

- Replace `===` bearer token comparison in mcp-server http.ts with
  timingSafeEqual (mirrors the cloud-mcp-gateway tokenMatches helper)
- Fix readLimit in usage-limits.ts: values in (0, 1) no longer silently
  map to unlimited via `Math.floor(x) || undefined`; they now resolve to
  a minimum limit of 1. Only an explicit `0` maps to unlimited.
- Add test case covering the fractional readLimit behaviour

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines +145 to +153
try {
await connection.client.close();
} catch {
try {
await connection.transport.close();
} catch {
// Best-effort cleanup only; the caller is already handling the real failure.
}
}
Copilot AI review requested due to automatic review settings July 26, 2026 04:29
…io child

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines 31 to 34
@@ -23,25 +33,91 @@
throw new Error("GSD_CLOUD_USER_TOKEN is required");
}
Comment on lines 35 to +38
const authStorePath = options.authStorePath ?? process.env.GSD_CLOUD_AUTH_STORE_PATH;
const usageStorePath = options.usageStorePath ?? process.env.GSD_CLOUD_USAGE_STORE_PATH;
const adminToken = options.adminToken ?? process.env.GSD_CLOUD_ADMIN_TOKEN;
const allowRegistration = options.allowRegistration ?? parseBoolean(process.env.GSD_CLOUD_ALLOW_REGISTRATION);
Comment thread packages/cloud-mcp-gateway/src/cli.ts Outdated
Comment on lines +5 to +15
const { values } = parseArgs({
options: {
port: { type: "string" },
host: { type: "string" },
"auth-store": { type: "string" },
"usage-store": { type: "string" },
"allow-registration": { type: "boolean" },
help: { type: "boolean", short: "h" },
},
allowPositionals: false,
});
Copilot AI review requested due to automatic review settings July 26, 2026 04:33
…eanly

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file
Comments suppressed due to low confidence (4)

packages/cloud-mcp-gateway/src/server.ts:310

  • This route match is too permissive: it will also accept paths like /admin/api/users/<id>/disabled/anything because it doesn't validate the segment count. Require the exact expected shape so extra segments return 404.
      userId: user.userId,

packages/cloud-mcp-gateway/src/server.ts:321

  • This route match is too permissive: it will also accept paths like /admin/api/users/<id>/pairing-codes/anything because it doesn't validate the segment count. Require the exact expected shape so extra segments return 404.
    if (disabled && isLastActiveAdmin(auth, user)) {

packages/cloud-mcp-gateway/src/server.ts:331

  • This route match is too permissive: it will also accept paths like /admin/api/tokens/<id>/revoke/anything because it doesn't validate the segment count. Require the exact expected shape so extra segments return 404.
      return sendJson(res, 201, auth.createPairingCode(user.userId));

packages/cloud-mcp-gateway/src/server.ts:374

  • This route match is too permissive: it will also accept paths like /account/api/tokens/<id>/revoke/anything because it doesn't validate the segment count. Require the exact expected shape so extra segments return 404.
    return sendJson(res, 201, {

Comment thread packages/cloud-mcp-gateway/src/server.ts Outdated
…n/account routes

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

}
});

boot();
…d Clerk is loaded

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines +53 to +59
const takeValue = (): string => {
if (inlineValue !== undefined) return inlineValue;
const next = argv[i + 1];
if (next === undefined) throw new Error(`missing value for ${flag}`);
i += 1;
return next;
};
…nsuming it

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines +207 to 212
issueUserToken(userId: string, options: { label?: string } = {}): UserTokenIssue {
if (!this.users.has(userId)) throw new Error(`Unknown user: ${userId}`);
const userToken = `${USER_TOKEN_PREFIX}${randomBytes(32).toString("hex")}`;
const record = this.addUserToken(userToken, userId, options);
return { userId, tokenId: record.tokenId, userToken };
}
Comment on lines +425 to +429
// The Clerk scripts load with the defer attribute, so they execute only
// after the document finishes parsing (just before DOMContentLoaded).
// Running boot() synchronously here would see window.Clerk undefined and
// wrongly report "Clerk is not configured", so wait for DOMContentLoaded
// when parsing is still in progress.
…k boot comment

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines +58 to +66
let configId = this.toolRoutes.get(toolName);
if (!configId) {
// Routes are only populated by advertisedTools(); a call can arrive before
// that has run (or after the routes were cleared). Refresh once before
// deciding the tool is not ours so a valid forwarded tool isn't rejected.
await this.advertisedTools().catch(() => undefined);
configId = this.toolRoutes.get(toolName);
}
if (!configId) return { handled: false };
Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file
Comments suppressed due to low confidence (2)

packages/cloud-mcp-gateway/src/usage-limits.ts:89

  • When minute limits are not enabled, check() still returns usage.minute incremented to 1. This makes the returned quota status internally inconsistent (minute usage is reported despite no minute window being tracked/enforced).
      usage: {
        ...status.usage,
        minute: minute + 1,
        day: status.usage.day + (billable ? 1 : 0),
        month: status.usage.month + (billable ? 1 : 0),

packages/cloud-mcp-gateway/src/usage-limits.ts:103

  • check() unconditionally sets resetAt.minute, even when callsPerMinute is unlimited/undefined. This can mislead callers/UI into thinking a minute window exists. Make resetAt.minute conditional on minute limits being enabled.
        // noteAccepted() just recorded this call, so the minute window is now
        // non-empty even if it was empty pre-acceptance; surface its reset time
        // (oldest call in the window + WINDOW_MS) instead of the stale undefined.
        minute: (calls[0] ?? now) + WINDOW_MS,
      },

Comment on lines +74 to +76
if (!status.allowed) return status;
this.noteAccepted(user.userId, now);
if (billable) this.reserveBillable(user.userId, now);
Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file
Comments suppressed due to low confidence (1)

packages/cloud-mcp-gateway/src/mcp.ts:93

  • knownTool detection calls params.registry.listTools(params.userId) (and then .some(...)) before quota enforcement. This means a minute-throttled (or otherwise rejected) request can still trigger a full runtime tool-list scan/allocation on the hot /mcp path, which under spammy tool calls can become an avoidable CPU cost and partially defeats the stated intent of “throttle before dispatching.” Consider restructuring so the expensive runtime-tool lookup is avoided when quota rejects, e.g. by adding an O(1) registry.hasTool(userId, toolName) index, or by splitting UsageLimiter into a minute-only precheck followed by a billable day/month reservation once tool existence is confirmed.
    // A tool is "known" when it is a gateway built-in or a runtime-advertised
    // tool. Built-ins short-circuit before the runtime tool-name lookup
    // (listTools + per-call scan) to keep the hot path cheap.
    const knownTool = BUILTIN_TOOL_NAMES.has(toolName)
      || params.registry.listTools(params.userId).some((tool) => tool.name === toolName);

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment thread packages/cloud-mcp-gateway/src/server.ts
Comment on lines +432 to +436
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", boot);
} else {
boot();
}
…nput

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines +70 to +83
await new Promise<void>((resolve, reject) => {
// A listen error (e.g. EADDRINUSE) fires the server's 'error' event, not the
// listen callback, so tie it into the promise to fail startup fast instead of
// awaiting forever.
const onError = (err: Error) => reject(err);
server.once('error', onError);
server.listen(options.port, options.host, () => {
server.removeListener('error', onError);
resolve();
});
});
const displayHost = options.host === '0.0.0.0' ? 'localhost' : options.host;
return {
url: `http://${formatUrlHost(displayHost)}:${options.port}/mcp`,
Comment on lines 354 to 357
snapshot(): AuthStoreSnapshot {
// Return shallow copies so a caller can't mutate live in-memory auth records
// (and thus what gets persisted) by editing the returned snapshot.
return {
…s in snapshot

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
@socket-security

socket-security Bot commented Jul 26, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​@​clerk/​backend@​3.4.148010095100100

View full report

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines +344 to +356
function normalizeInputSchema(value: unknown): RuntimeToolInputSchema {
if (isInputSchema(value)) {
return {
...value,
type: "object",
...(value.properties ? { properties: normalizeProperties(value.properties) } : {}),
...(Array.isArray(value.required)
? { required: value.required.filter((item): item is string => typeof item === "string") }
: {}),
};
}
return { type: "object", properties: {} };
}
…perties/required

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment on lines +97 to +99
async close(): Promise<void> {
await Promise.all(Array.from(this.connections.keys()).map((id) => this.closeConnection(id)));
}
Comment thread packages/daemon/src/external-mcp-tools.ts
…s on shutdown

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants