@aexol/spectral 0.9.262 → 0.9.264

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.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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"}
@@ -28,11 +28,28 @@ export function getSpectralGlobalConfigPath(overridePath) {
28
28
  export function getGenericGlobalConfigPath() {
29
29
  return GENERIC_GLOBAL_CONFIG_PATH;
30
30
  }
31
+ /**
32
+ * Walks upward from `cwd` (starting at `cwd` itself) looking for
33
+ * `join(dir, relativeName)`. Returns the nearest existing match, or null if
34
+ * none is found up to the filesystem root.
35
+ */
36
+ function findUpNearest(cwd, relativeName) {
37
+ let current = resolve(cwd);
38
+ while (true) {
39
+ const candidate = join(current, relativeName);
40
+ if (existsSync(candidate))
41
+ return candidate;
42
+ const parent = dirname(current);
43
+ if (parent === current)
44
+ return null;
45
+ current = parent;
46
+ }
47
+ }
31
48
  export function getProjectConfigPath(cwd = process.cwd()) {
32
- return resolve(cwd, PROJECT_CONFIG_NAME);
49
+ return findUpNearest(cwd, PROJECT_CONFIG_NAME) ?? resolve(cwd, PROJECT_CONFIG_NAME);
33
50
  }
34
51
  export function getProjectSpectralConfigPath(cwd = process.cwd()) {
35
- return resolve(cwd, PROJECT_MCP_CONFIG_NAME);
52
+ return findUpNearest(cwd, PROJECT_MCP_CONFIG_NAME) ?? resolve(cwd, PROJECT_MCP_CONFIG_NAME);
36
53
  }
37
54
  export function getConfigDiscoveryPaths(overridePath) {
38
55
  return getConfigSources(overridePath).map((source) => ({
@@ -441,12 +458,14 @@ export function buildStarterProjectConfig() {
441
458
  };
442
459
  }
443
460
  export function previewStarterProjectConfig(cwd = process.cwd()) {
444
- const targetPath = getProjectConfigPath(cwd);
461
+ // Always target cwd directly: the starter config must not overwrite an
462
+ // ancestor project's .mcp.json discovered by the upward walk.
463
+ const targetPath = resolve(cwd, PROJECT_CONFIG_NAME);
445
464
  const nextRaw = { mcpServers: buildStarterProjectConfig().mcpServers };
446
465
  return buildConfigWritePreview(targetPath, nextRaw);
447
466
  }
448
467
  export function writeStarterProjectConfig(cwd = process.cwd()) {
449
- const targetPath = getProjectConfigPath(cwd);
468
+ const targetPath = resolve(cwd, PROJECT_CONFIG_NAME);
450
469
  const raw = { mcpServers: buildStarterProjectConfig().mcpServers };
451
470
  writeRawConfigObject(targetPath, raw);
452
471
  return targetPath;
@@ -1,3 +1,3 @@
1
1
  import type { ExtensionAPI } from "../sdk/coding-agent/index.js";
2
- export default function mcpAdapter(ext: ExtensionAPI): void;
2
+ export default function mcpAdapter(ext: ExtensionAPI, sessionId?: string): () => void;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,8BAA8B,CAAC;AAa3E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,GAAG,EAAE,YAAY,QA0SnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,8BAA8B,CAAC;AAa3E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,cAuUvE"}
package/dist/mcp/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { setLiveMcpStateGetter } from "./state-getter.js";
1
+ import { registerMcpState, setLiveMcpStateGetter, unregisterMcpStateIfCurrent } from "./state-getter.js";
2
2
  import { Type } from "typebox";
3
3
  import { showTools, reconnectServers, authenticateServer, showSetupStatus } from "./commands.js";
4
4
  import { loadMcpConfig } from "./config.js";
@@ -8,9 +8,20 @@ import { loadMetadataCache } from "./metadata-cache.js";
8
8
  import { executeAuth, executeCall, executeConnect, executeDescribe, executeSearch, executeStatus, executeUiMessages } from "./proxy-modes.js";
9
9
  import { getConfigPathFromArgv, truncateAtWord } from "./utils.js";
10
10
  import { initializeOAuth, shutdownOAuth } from "./mcp-auth-flow.js";
11
- export default function mcpAdapter(ext) {
11
+ export default function mcpAdapter(ext, sessionId) {
12
12
  let state = null;
13
- setLiveMcpStateGetter(() => state);
13
+ // One getter closure serves both the back-compat singleton and the
14
+ // session-scoped registry, so `unregisterMcpStateIfCurrent` can compare
15
+ // the registered accessor by identity (ownership-safe teardown).
16
+ const stateGetter = () => state;
17
+ setLiveMcpStateGetter(stateGetter);
18
+ // Session-scoped registration: the singleton getter above is overwritten
19
+ // by every bridge construction, so serve's reload endpoint addresses
20
+ // states through the per-session registry instead.
21
+ const registeredSessionId = typeof sessionId === "string" && sessionId.length > 0 ? sessionId : null;
22
+ if (registeredSessionId) {
23
+ registerMcpState(registeredSessionId, stateGetter);
24
+ }
14
25
  let initPromise = null;
15
26
  let lifecycleGeneration = 0;
16
27
  async function shutdownState(currentState, reason) {
@@ -203,6 +214,13 @@ export default function mcpAdapter(ext) {
203
214
  const currentState = state;
204
215
  state = null;
205
216
  initPromise = null;
217
+ // Drop the registry entry (ownership-safe + idempotent) so a stale
218
+ // state is never re-addressed by a later reload. If a rebuilt bridge
219
+ // re-registered the same session id first, its getter is current and
220
+ // this stale adapter leaves the newer entry in place.
221
+ if (registeredSessionId) {
222
+ unregisterMcpStateIfCurrent(registeredSessionId, stateGetter);
223
+ }
206
224
  try {
207
225
  await Promise.all([
208
226
  shutdownState(currentState, "session_shutdown"),
@@ -281,4 +299,14 @@ export default function mcpAdapter(ext) {
281
299
  await authenticateServer(serverName, state.config, ctx);
282
300
  },
283
301
  });
302
+ // Teardown hook: `AgentSession.dispose()` never emits `session_shutdown`
303
+ // (only `AgentSessionRuntime.dispose()` does), so `AgentBridge.dispose()`
304
+ // invokes this to drop the registry entry on serve teardown. Ownership-
305
+ // safe — a stale adapter cannot remove a rebuilt bridge's registration
306
+ // for the same session id.
307
+ return () => {
308
+ if (registeredSessionId) {
309
+ unregisterMcpStateIfCurrent(registeredSessionId, stateGetter);
310
+ }
311
+ };
284
312
  }
@@ -1,14 +1,59 @@
1
1
  /**
2
- * Tiny shared getter for the live `McpExtensionState`.
2
+ * Shared access to the live `McpExtensionState`.
3
3
  *
4
- * Set by the MCP adapter extension factory (`mcp/index.ts`) on construction
5
- * so `serve.ts` can read the current state snapshot without importing the
6
- * full adapter module. Separated into a standalone file so neither side
7
- * picks up the other's transitive dependencies.
4
+ * Two access levels:
5
+ *
6
+ * 1. A back-compat module-level singleton (`setLiveMcpStateGetter` /
7
+ * `getLiveMcpState`) — the LAST constructed bridge's state. Set by the
8
+ * MCP adapter extension factory (`mcp/index.ts`) on construction so
9
+ * `serve.ts` can read the current state snapshot without importing the
10
+ * full adapter module.
11
+ *
12
+ * 2. A session-scoped registry (`registerMcpState` / `unregisterMcpState` /
13
+ * `getMcpStateForSession` / `listMcpStates`) — maps each serve session
14
+ * id to that session's live state accessor. The `POST /api/mcp-reload`
15
+ * handler resolves states through this registry so a refresh always
16
+ * hits the right session's project config (the singleton above is
17
+ * overwritten by every bridge construction and must not be used for
18
+ * addressing).
19
+ *
20
+ * Separated into a standalone file so neither side picks up the other's
21
+ * transitive dependencies.
8
22
  */
9
23
  import type { McpExtensionState } from "../mcp/state.js";
10
24
  /** Read the live MCP state. Returns null until the adapter is constructed. */
11
25
  export declare function getLiveMcpState(): McpExtensionState | null;
12
26
  /** Set by the MCP adapter factory at construction time. */
13
27
  export declare function setLiveMcpStateGetter(getter: () => McpExtensionState | null): void;
28
+ /**
29
+ * Register (or replace) the live-state accessor for a session. Called by
30
+ * the MCP adapter factory at bridge construction time.
31
+ */
32
+ export declare function registerMcpState(sessionId: string, getter: () => McpExtensionState | null): void;
33
+ /**
34
+ * Remove a session's accessor (idempotent — double-unregister is a no-op).
35
+ * Called by the MCP adapter factory on `session_shutdown`.
36
+ */
37
+ export declare function unregisterMcpState(sessionId: string): void;
38
+ /**
39
+ * Remove a session's accessor ONLY if the registered getter is the one
40
+ * `getter` — ownership-safe unregister. A stale adapter whose bridge was
41
+ * torn down AFTER a rebuilt bridge re-registered the same session id must
42
+ * not delete the newer registration. Idempotent: calling it twice (or with
43
+ * a getter that was never registered) is a no-op.
44
+ */
45
+ export declare function unregisterMcpStateIfCurrent(sessionId: string, getter: () => McpExtensionState | null): void;
46
+ /**
47
+ * Read one session's live MCP state. Returns `null` when the session has
48
+ * no registered accessor or its state is still initializing.
49
+ */
50
+ export declare function getMcpStateForSession(sessionId: string): McpExtensionState | null;
51
+ /**
52
+ * All registered sessions that currently have a non-null live state.
53
+ * Sessions still initializing (or shut down) are excluded.
54
+ */
55
+ export declare function listMcpStates(): Array<{
56
+ sessionId: string;
57
+ state: McpExtensionState;
58
+ }>;
14
59
  //# sourceMappingURL=state-getter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-getter.d.ts","sourceRoot":"","sources":["../../src/mcp/state-getter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAQzD,8EAA8E;AAC9E,wBAAgB,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAE1D;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAElF"}
1
+ {"version":3,"file":"state-getter.d.ts","sourceRoot":"","sources":["../../src/mcp/state-getter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AASzD,8EAA8E;AAC9E,wBAAgB,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAE1D;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAElF;AAaD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,iBAAiB,GAAG,IAAI,GACrC,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,iBAAiB,GAAG,IAAI,GACrC,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAEjF;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAStF"}
@@ -1,14 +1,29 @@
1
1
  /**
2
- * Tiny shared getter for the live `McpExtensionState`.
2
+ * Shared access to the live `McpExtensionState`.
3
3
  *
4
- * Set by the MCP adapter extension factory (`mcp/index.ts`) on construction
5
- * so `serve.ts` can read the current state snapshot without importing the
6
- * full adapter module. Separated into a standalone file so neither side
7
- * picks up the other's transitive dependencies.
4
+ * Two access levels:
5
+ *
6
+ * 1. A back-compat module-level singleton (`setLiveMcpStateGetter` /
7
+ * `getLiveMcpState`) — the LAST constructed bridge's state. Set by the
8
+ * MCP adapter extension factory (`mcp/index.ts`) on construction so
9
+ * `serve.ts` can read the current state snapshot without importing the
10
+ * full adapter module.
11
+ *
12
+ * 2. A session-scoped registry (`registerMcpState` / `unregisterMcpState` /
13
+ * `getMcpStateForSession` / `listMcpStates`) — maps each serve session
14
+ * id to that session's live state accessor. The `POST /api/mcp-reload`
15
+ * handler resolves states through this registry so a refresh always
16
+ * hits the right session's project config (the singleton above is
17
+ * overwritten by every bridge construction and must not be used for
18
+ * addressing).
19
+ *
20
+ * Separated into a standalone file so neither side picks up the other's
21
+ * transitive dependencies.
8
22
  */
9
23
  /**
10
- * Current getter, injected by `mcp/index.ts` at adapter construction time.
11
- * `null` means the adapter hasn't loaded yet or hasn't run `session_start`.
24
+ * Back-compat singleton getter, injected by `mcp/index.ts` at adapter
25
+ * construction time. `null` means the adapter hasn't loaded yet or hasn't
26
+ * run `session_start`.
12
27
  */
13
28
  let _getter = null;
14
29
  /** Read the live MCP state. Returns null until the adapter is constructed. */
@@ -19,3 +34,59 @@ export function getLiveMcpState() {
19
34
  export function setLiveMcpStateGetter(getter) {
20
35
  _getter = getter;
21
36
  }
37
+ // ---------------------------------------------------------------------------
38
+ // Session-scoped registry
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * Live-state accessors per serve session id. Values are getters (not
42
+ * snapshots) because a session's state is `null` while its
43
+ * `session_start` initialization is still in flight.
44
+ */
45
+ const _sessionGetters = new Map();
46
+ /**
47
+ * Register (or replace) the live-state accessor for a session. Called by
48
+ * the MCP adapter factory at bridge construction time.
49
+ */
50
+ export function registerMcpState(sessionId, getter) {
51
+ _sessionGetters.set(sessionId, getter);
52
+ }
53
+ /**
54
+ * Remove a session's accessor (idempotent — double-unregister is a no-op).
55
+ * Called by the MCP adapter factory on `session_shutdown`.
56
+ */
57
+ export function unregisterMcpState(sessionId) {
58
+ _sessionGetters.delete(sessionId);
59
+ }
60
+ /**
61
+ * Remove a session's accessor ONLY if the registered getter is the one
62
+ * `getter` — ownership-safe unregister. A stale adapter whose bridge was
63
+ * torn down AFTER a rebuilt bridge re-registered the same session id must
64
+ * not delete the newer registration. Idempotent: calling it twice (or with
65
+ * a getter that was never registered) is a no-op.
66
+ */
67
+ export function unregisterMcpStateIfCurrent(sessionId, getter) {
68
+ if (_sessionGetters.get(sessionId) === getter) {
69
+ _sessionGetters.delete(sessionId);
70
+ }
71
+ }
72
+ /**
73
+ * Read one session's live MCP state. Returns `null` when the session has
74
+ * no registered accessor or its state is still initializing.
75
+ */
76
+ export function getMcpStateForSession(sessionId) {
77
+ return _sessionGetters.get(sessionId)?.() ?? null;
78
+ }
79
+ /**
80
+ * All registered sessions that currently have a non-null live state.
81
+ * Sessions still initializing (or shut down) are excluded.
82
+ */
83
+ export function listMcpStates() {
84
+ const entries = [];
85
+ for (const [sessionId, getter] of _sessionGetters) {
86
+ const state = getter();
87
+ if (state) {
88
+ entries.push({ sessionId, state });
89
+ }
90
+ }
91
+ return entries;
92
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/relay/routing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/relay/routing.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@
12
12
  import { homedir } from "node:os";
13
13
  import { BadRequestError } from "../server/handlers/errors.js";
14
14
  import { handleStartMcpAuth } from "../server/handlers/mcp-auth.js";
15
- import { handleListMcpStatus } from "../server/handlers/mcp-status.js";
15
+ import { handleListMcpStatusSessioned } from "../server/handlers/mcp-status.js";
16
16
  import { handleReloadMcpConfig } from "../server/handlers/mcp-reload.js";
17
17
  import { handlePathAutocomplete } from "../server/handlers/paths-autocomplete.js";
18
18
  import { handleGetHomeDirectory } from "../server/handlers/paths-home.js";
@@ -469,7 +469,7 @@ export async function dispatchRoute(match, body, deps) {
469
469
  });
470
470
  // Reload MCP config so the aexol-mcp extension picks up the new binding.
471
471
  if (deps.mcpState) {
472
- handleReloadMcpConfig(deps.mcpState).catch((err) => {
472
+ handleReloadMcpConfig().catch((err) => {
473
473
  logger?.error?.(`[dispatcher] MCP reload after bind failed: ${err instanceof Error ? err.message : String(err)}`);
474
474
  });
475
475
  }
@@ -490,7 +490,7 @@ export async function dispatchRoute(match, body, deps) {
490
490
  });
491
491
  // Reload MCP config so the aexol-mcp extension clears the old binding.
492
492
  if (deps.mcpState) {
493
- handleReloadMcpConfig(deps.mcpState).catch((err) => {
493
+ handleReloadMcpConfig().catch((err) => {
494
494
  logger?.error?.(`[dispatcher] MCP reload after unbind failed: ${err instanceof Error ? err.message : String(err)}`);
495
495
  });
496
496
  }
@@ -653,13 +653,23 @@ export async function dispatchRoute(match, body, deps) {
653
653
  handleClearPromptQueue(store, manager, id);
654
654
  return { ok: true };
655
655
  case "list_mcp_status": {
656
- if (!deps.mcpState) {
657
- return [];
658
- }
659
- return handleListMcpStatus(deps.mcpState);
656
+ // Optional `sessionId` query param addresses one session's live MCP
657
+ // state (the singleton `deps.mcpState` is the LAST constructed
658
+ // bridge's and must not be used for addressing). Without one, the
659
+ // handler returns the union of all registered live states.
660
+ const sessionIdParam = match.query?.get("sessionId");
661
+ return handleListMcpStatusSessioned(typeof sessionIdParam === "string" && sessionIdParam.length > 0
662
+ ? sessionIdParam
663
+ : undefined);
660
664
  }
661
665
  case "reload_mcp_config": {
662
- return await handleReloadMcpConfig(deps.mcpState);
666
+ // Optional sessionId from the JSON body addresses one session's live
667
+ // MCP state; omitted → reload every attached session's state.
668
+ const bodyObj = asObject(body);
669
+ const sessionId = typeof bodyObj.sessionId === "string" && bodyObj.sessionId.length > 0
670
+ ? bodyObj.sessionId
671
+ : undefined;
672
+ return await handleReloadMcpConfig(sessionId);
663
673
  }
664
674
  case "start_mcp_auth": {
665
675
  return await handleStartMcpAuth(deps.mcpState, asObject(body));
@@ -188,6 +188,13 @@ export declare class AgentBridge {
188
188
  private sessionManager?;
189
189
  private unsubscribe?;
190
190
  private pending?;
191
+ /**
192
+ * MCP registry teardown hook returned by the bundled MCP adapter factory.
193
+ * `AgentSession.dispose()` never emits `session_shutdown`, so the bridge
194
+ * invokes this on dispose to drop the session's MCP state registry entry
195
+ * (no-op when the adapter registered no session id, e.g. the CLI path).
196
+ */
197
+ private mcpTeardown;
191
198
  private disposed;
192
199
  private opts;
193
200
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
@@ -232,6 +232,13 @@ export class AgentBridge {
232
232
  sessionManager;
233
233
  unsubscribe;
234
234
  pending;
235
+ /**
236
+ * MCP registry teardown hook returned by the bundled MCP adapter factory.
237
+ * `AgentSession.dispose()` never emits `session_shutdown`, so the bridge
238
+ * invokes this on dispose to drop the session's MCP state registry entry
239
+ * (no-op when the adapter registered no session id, e.g. the CLI path).
240
+ */
241
+ mcpTeardown = null;
235
242
  disposed = false;
236
243
  opts;
237
244
  /**
@@ -419,7 +426,7 @@ export class AgentBridge {
419
426
  // filesystem-based discovery via jiti fails because the source files are
420
427
  // embedded in the binary rather than present on disk.
421
428
  extensionFactories.push(async (ext) => {
422
- mcpAdapterFactory(ext);
429
+ this.mcpTeardown = mcpAdapterFactory(ext, this.opts.sessionId);
423
430
  });
424
431
  // ResourceLoader with extensions wired in via factories.
425
432
  // Each factory's signature `(ext: ExtensionAPI) => Promise<void>` matches
@@ -1430,6 +1437,18 @@ export class AgentBridge {
1430
1437
  if (this.disposed)
1431
1438
  return;
1432
1439
  this.disposed = true;
1440
+ // Drop the MCP state registry entry BEFORE session teardown: without
1441
+ // this, every disposed serve session leaks a live-state entry that the
1442
+ // global "Refresh MCP" reload would keep re-bootstrapping. Ownership-
1443
+ // safe (a rebuilt bridge's newer registration is never removed by a
1444
+ // stale bridge's hook) and idempotent.
1445
+ try {
1446
+ this.mcpTeardown?.();
1447
+ }
1448
+ catch {
1449
+ // ignore — registry cleanup must never block dispose
1450
+ }
1451
+ this.mcpTeardown = null;
1433
1452
  this.teardownBindingWatcher();
1434
1453
  // Persist the current in-flight message (if any) before tearing down.
1435
1454
  // Without this, cancelling mid-turn loses the message along with its
@@ -1,8 +1,31 @@
1
- import type { McpExtensionState } from "../../mcp/state.js";
2
1
  import { type McpServerStatus } from "./mcp-status.js";
2
+ /**
3
+ * Handler for `POST /api/mcp-reload`.
4
+ *
5
+ * With `sessionId`: reloads exactly that session's live MCP state. Without
6
+ * one: reloads EVERY attached session's live state (a global "Refresh MCP"
7
+ * must refresh each session's own project config). Live states are resolved
8
+ * through the session-scoped registry in `mcp/state-getter.ts` — a missing
9
+ * state yields an explicit non-success result, never a silent no-op.
10
+ */
3
11
  export interface McpReloadResult {
4
- reloaded: true;
12
+ reloaded: boolean;
5
13
  servers: McpServerStatus[];
14
+ /** Present when nothing was reloaded, explaining why. */
15
+ reason?: "session-not-attached" | "no-live-sessions" | "reload-failed";
16
+ /** Echoed back when a `sessionId` was provided but has no live state. */
17
+ sessionId?: string;
18
+ /** Session ids that were successfully reloaded (only the good ones). */
19
+ sessions?: string[];
20
+ /**
21
+ * Per-session reload failures (present only when at least one state's
22
+ * reload threw). The global loop keeps going past a failing state, so
23
+ * `sessions` and `failed` together describe the partial outcome.
24
+ */
25
+ failed?: Array<{
26
+ sessionId: string;
27
+ error: string;
28
+ }>;
6
29
  }
7
- export declare function handleReloadMcpConfig(state: McpExtensionState | undefined): Promise<McpReloadResult>;
30
+ export declare function handleReloadMcpConfig(sessionId?: string): Promise<McpReloadResult>;
8
31
  //# sourceMappingURL=mcp-reload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-reload.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/mcp-reload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,IAAI,CAAC;IACf,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GACnC,OAAO,CAAC,eAAe,CAAC,CAM1B"}
1
+ {"version":3,"file":"mcp-reload.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/mcp-reload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE5E;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,yDAAyD;IACzD,MAAM,CAAC,EAAE,sBAAsB,GAAG,kBAAkB,GAAG,eAAe,CAAC;IACvE,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,wBAAsB,qBAAqB,CACzC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAmE1B"}
@@ -1,9 +1,73 @@
1
1
  import { reloadMcpConfig } from "../../mcp/init.js";
2
+ import { getMcpStateForSession, listMcpStates } from "../../mcp/state-getter.js";
2
3
  import { handleListMcpStatus } from "./mcp-status.js";
3
- export async function handleReloadMcpConfig(state) {
4
- if (!state) {
5
- return { reloaded: true, servers: [] };
4
+ export async function handleReloadMcpConfig(sessionId) {
5
+ if (sessionId) {
6
+ const state = getMcpStateForSession(sessionId);
7
+ if (!state) {
8
+ return {
9
+ reloaded: false,
10
+ servers: [],
11
+ reason: "session-not-attached",
12
+ sessionId,
13
+ };
14
+ }
15
+ try {
16
+ await reloadMcpConfig(state);
17
+ }
18
+ catch (error) {
19
+ return {
20
+ reloaded: false,
21
+ servers: [],
22
+ reason: "reload-failed",
23
+ sessionId,
24
+ failed: [{ sessionId, error: errorMessage(error) }],
25
+ };
26
+ }
27
+ return {
28
+ reloaded: true,
29
+ servers: handleListMcpStatus(state),
30
+ sessionId,
31
+ sessions: [sessionId],
32
+ };
6
33
  }
7
- await reloadMcpConfig(state);
8
- return { reloaded: true, servers: handleListMcpStatus(state) };
34
+ const entries = listMcpStates();
35
+ if (entries.length === 0) {
36
+ return { reloaded: false, servers: [], reason: "no-live-sessions" };
37
+ }
38
+ // One state's failing reload must not abort the others: each state is
39
+ // reloaded independently, and per-session failures are reported in
40
+ // `failed` alongside the successfully reloaded `sessions`.
41
+ const seen = new Set();
42
+ const servers = [];
43
+ const sessions = [];
44
+ const failed = [];
45
+ for (const { sessionId: sid, state } of entries) {
46
+ try {
47
+ await reloadMcpConfig(state);
48
+ }
49
+ catch (error) {
50
+ failed.push({ sessionId: sid, error: errorMessage(error) });
51
+ continue;
52
+ }
53
+ sessions.push(sid);
54
+ for (const server of handleListMcpStatus(state)) {
55
+ if (!seen.has(server.name)) {
56
+ seen.add(server.name);
57
+ servers.push(server);
58
+ }
59
+ }
60
+ }
61
+ if (sessions.length === 0) {
62
+ return { reloaded: false, servers: [], reason: "reload-failed", failed };
63
+ }
64
+ return {
65
+ reloaded: true,
66
+ servers,
67
+ sessions,
68
+ ...(failed.length > 0 ? { failed } : {}),
69
+ };
70
+ }
71
+ function errorMessage(error) {
72
+ return error instanceof Error ? error.message : String(error);
9
73
  }
@@ -24,4 +24,18 @@ export interface McpServerStatus {
24
24
  failedAt?: number;
25
25
  }
26
26
  export declare function handleListMcpStatus(state: McpExtensionState): McpServerStatus[];
27
+ /**
28
+ * Session-scoped variant of `GET /api/mcp-status`.
29
+ *
30
+ * - With `sessionId`: returns that session's own live state (empty array
31
+ * when the session has no registered state — never another session's).
32
+ * - Without: returns the UNION of all registered live states, deduplicated
33
+ * by server name with the FIRST occurrence winning (same aggregation as
34
+ * the reload handler).
35
+ *
36
+ * Response shape is identical to `handleListMcpStatus` — a plain
37
+ * `McpServerStatus[]` — so landing's `listMachineMcpStatus()` contract is
38
+ * unchanged.
39
+ */
40
+ export declare function handleListMcpStatusSessioned(sessionId?: string): McpServerStatus[];
27
41
  //# sourceMappingURL=mcp-status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/mcp-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAM5D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,YAAY,EAAE,OAAO,CAAC;IACtB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,GACvB,eAAe,EAAE,CAiCnB"}
1
+ {"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/mcp-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAO5D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,YAAY,EAAE,OAAO,CAAC;IACtB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,GACvB,eAAe,EAAE,CAiCnB;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,CAAC,EAAE,MAAM,GACjB,eAAe,EAAE,CAiBnB"}