agent-nuvira 3.4.0 → 3.5.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.
Files changed (169) hide show
  1. package/dist/agent-sdk/src/register.d.ts +23 -7
  2. package/dist/agent-sdk/src/register.d.ts.map +1 -1
  3. package/dist/agent-sdk/src/register.js +159 -5
  4. package/dist/agent-sdk/src/register.js.map +1 -1
  5. package/dist/agent-sdk/src/scaffold.d.ts +1 -1
  6. package/dist/agent-sdk/src/scaffold.js +1 -1
  7. package/dist/cli/agent.d.ts.map +1 -1
  8. package/dist/cli/agent.js +16 -3
  9. package/dist/cli/agent.js.map +1 -1
  10. package/dist/cli/chat.d.ts +85 -0
  11. package/dist/cli/chat.d.ts.map +1 -1
  12. package/dist/cli/chat.js +462 -15
  13. package/dist/cli/chat.js.map +1 -1
  14. package/dist/cli/config.d.ts +10 -0
  15. package/dist/cli/config.d.ts.map +1 -1
  16. package/dist/cli/config.js +39 -0
  17. package/dist/cli/config.js.map +1 -1
  18. package/dist/cli/doctor.d.ts.map +1 -1
  19. package/dist/cli/doctor.js +18 -3
  20. package/dist/cli/doctor.js.map +1 -1
  21. package/dist/cli/mcp.d.ts +50 -0
  22. package/dist/cli/mcp.d.ts.map +1 -1
  23. package/dist/cli/mcp.js +496 -49
  24. package/dist/cli/mcp.js.map +1 -1
  25. package/dist/cli/memory.d.ts.map +1 -1
  26. package/dist/cli/memory.js +3 -2
  27. package/dist/cli/memory.js.map +1 -1
  28. package/dist/cli/plugins.d.ts.map +1 -1
  29. package/dist/cli/plugins.js +26 -9
  30. package/dist/cli/plugins.js.map +1 -1
  31. package/dist/cli/sdk.d.ts.map +1 -1
  32. package/dist/cli/sdk.js +10 -3
  33. package/dist/cli/sdk.js.map +1 -1
  34. package/dist/cli/tool-install-prompt.d.ts.map +1 -1
  35. package/dist/cli/tool-install-prompt.js +23 -1
  36. package/dist/cli/tool-install-prompt.js.map +1 -1
  37. package/dist/cli/tools.d.ts +16 -0
  38. package/dist/cli/tools.d.ts.map +1 -1
  39. package/dist/cli/tools.js +101 -1
  40. package/dist/cli/tools.js.map +1 -1
  41. package/dist/config/manager.d.ts +6 -0
  42. package/dist/config/manager.d.ts.map +1 -1
  43. package/dist/config/manager.js +66 -0
  44. package/dist/config/manager.js.map +1 -1
  45. package/dist/config/types.d.ts +18 -0
  46. package/dist/config/types.d.ts.map +1 -1
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +4 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/learning/exhaustion-report.d.ts +12 -0
  52. package/dist/learning/exhaustion-report.d.ts.map +1 -1
  53. package/dist/learning/exhaustion-report.js +3 -1
  54. package/dist/learning/exhaustion-report.js.map +1 -1
  55. package/dist/learning/model-capability.d.ts +33 -0
  56. package/dist/learning/model-capability.d.ts.map +1 -1
  57. package/dist/learning/model-capability.js +51 -0
  58. package/dist/learning/model-capability.js.map +1 -1
  59. package/dist/learning/model-first-router.d.ts +7 -22
  60. package/dist/learning/model-first-router.d.ts.map +1 -1
  61. package/dist/learning/model-first-router.js +7 -37
  62. package/dist/learning/model-first-router.js.map +1 -1
  63. package/dist/learning/model-selection.d.ts +27 -0
  64. package/dist/learning/model-selection.d.ts.map +1 -1
  65. package/dist/learning/model-selection.js +46 -0
  66. package/dist/learning/model-selection.js.map +1 -1
  67. package/dist/learning/reasoning-trace.d.ts +1 -1
  68. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  69. package/dist/learning/reasoning-trace.js.map +1 -1
  70. package/dist/learning/resilient-call.d.ts +15 -1
  71. package/dist/learning/resilient-call.d.ts.map +1 -1
  72. package/dist/learning/resilient-call.js +38 -22
  73. package/dist/learning/resilient-call.js.map +1 -1
  74. package/dist/learning/working-state.d.ts +7 -0
  75. package/dist/learning/working-state.d.ts.map +1 -1
  76. package/dist/learning/working-state.js +23 -1
  77. package/dist/learning/working-state.js.map +1 -1
  78. package/dist/mcp/catalog.d.ts +206 -26
  79. package/dist/mcp/catalog.d.ts.map +1 -1
  80. package/dist/mcp/catalog.js +664 -52
  81. package/dist/mcp/catalog.js.map +1 -1
  82. package/dist/mcp/client.d.ts +6 -0
  83. package/dist/mcp/client.d.ts.map +1 -1
  84. package/dist/mcp/client.js +35 -5
  85. package/dist/mcp/client.js.map +1 -1
  86. package/dist/mcp/custom-server.d.ts +120 -0
  87. package/dist/mcp/custom-server.d.ts.map +1 -0
  88. package/dist/mcp/custom-server.js +330 -0
  89. package/dist/mcp/custom-server.js.map +1 -0
  90. package/dist/mcp/manager.d.ts +9 -1
  91. package/dist/mcp/manager.d.ts.map +1 -1
  92. package/dist/mcp/manager.js +15 -2
  93. package/dist/mcp/manager.js.map +1 -1
  94. package/dist/mcp/mcp-oauth.d.ts +28 -0
  95. package/dist/mcp/mcp-oauth.d.ts.map +1 -1
  96. package/dist/mcp/mcp-oauth.js +63 -8
  97. package/dist/mcp/mcp-oauth.js.map +1 -1
  98. package/dist/mcp/oauth-authorize.d.ts +51 -0
  99. package/dist/mcp/oauth-authorize.d.ts.map +1 -0
  100. package/dist/mcp/oauth-authorize.js +133 -0
  101. package/dist/mcp/oauth-authorize.js.map +1 -0
  102. package/dist/mcp/oauth-connect.d.ts +53 -0
  103. package/dist/mcp/oauth-connect.d.ts.map +1 -0
  104. package/dist/mcp/oauth-connect.js +103 -0
  105. package/dist/mcp/oauth-connect.js.map +1 -0
  106. package/dist/mcp/pin-verifier.d.ts +44 -0
  107. package/dist/mcp/pin-verifier.d.ts.map +1 -0
  108. package/dist/mcp/pin-verifier.js +102 -0
  109. package/dist/mcp/pin-verifier.js.map +1 -0
  110. package/dist/mcp/prereqs.d.ts +145 -0
  111. package/dist/mcp/prereqs.d.ts.map +1 -0
  112. package/dist/mcp/prereqs.js +245 -0
  113. package/dist/mcp/prereqs.js.map +1 -0
  114. package/dist/mcp/runtime.d.ts +59 -0
  115. package/dist/mcp/runtime.d.ts.map +1 -0
  116. package/dist/mcp/runtime.js +77 -0
  117. package/dist/mcp/runtime.js.map +1 -0
  118. package/dist/mcp/server.d.ts +21 -0
  119. package/dist/mcp/server.d.ts.map +1 -1
  120. package/dist/mcp/server.js +29 -1
  121. package/dist/mcp/server.js.map +1 -1
  122. package/dist/mcp/settings.d.ts +164 -0
  123. package/dist/mcp/settings.d.ts.map +1 -0
  124. package/dist/mcp/settings.js +358 -0
  125. package/dist/mcp/settings.js.map +1 -0
  126. package/dist/mcp/types.d.ts +62 -0
  127. package/dist/mcp/types.d.ts.map +1 -1
  128. package/dist/mcp/types.js.map +1 -1
  129. package/dist/memory/vector-store.d.ts +12 -0
  130. package/dist/memory/vector-store.d.ts.map +1 -1
  131. package/dist/memory/vector-store.js +23 -0
  132. package/dist/memory/vector-store.js.map +1 -1
  133. package/dist/plugins/agent-plugin.d.ts +35 -0
  134. package/dist/plugins/agent-plugin.d.ts.map +1 -1
  135. package/dist/plugins/agent-plugin.js +142 -24
  136. package/dist/plugins/agent-plugin.js.map +1 -1
  137. package/dist/sandbox/manager.d.ts +12 -0
  138. package/dist/sandbox/manager.d.ts.map +1 -1
  139. package/dist/sandbox/manager.js +43 -2
  140. package/dist/sandbox/manager.js.map +1 -1
  141. package/dist/tools/modality/browser.d.ts +39 -3
  142. package/dist/tools/modality/browser.d.ts.map +1 -1
  143. package/dist/tools/modality/browser.js +113 -16
  144. package/dist/tools/modality/browser.js.map +1 -1
  145. package/dist/tools/optional-deps.d.ts +48 -0
  146. package/dist/tools/optional-deps.d.ts.map +1 -0
  147. package/dist/tools/optional-deps.js +42 -0
  148. package/dist/tools/optional-deps.js.map +1 -0
  149. package/dist/tools/registry.d.ts.map +1 -1
  150. package/dist/tools/registry.js +68 -11
  151. package/dist/tools/registry.js.map +1 -1
  152. package/dist/tools/remediation-ladder.d.ts.map +1 -1
  153. package/dist/tools/remediation-ladder.js +9 -1
  154. package/dist/tools/remediation-ladder.js.map +1 -1
  155. package/dist/tools/tool-loop.d.ts.map +1 -1
  156. package/dist/tools/tool-loop.js +57 -5
  157. package/dist/tools/tool-loop.js.map +1 -1
  158. package/dist/web-dashboard/chat-retry.d.ts +11 -1
  159. package/dist/web-dashboard/chat-retry.d.ts.map +1 -1
  160. package/dist/web-dashboard/chat-retry.js +18 -4
  161. package/dist/web-dashboard/chat-retry.js.map +1 -1
  162. package/dist/web-dashboard/server.d.ts.map +1 -1
  163. package/dist/web-dashboard/server.js +349 -2
  164. package/dist/web-dashboard/server.js.map +1 -1
  165. package/package.json +3 -2
  166. package/src/web-dashboard/public/assets/{index-DeD3L0kG.js → index-yky0dw5e.js} +115 -89
  167. package/src/web-dashboard/public/assets/index-yky0dw5e.js.map +1 -0
  168. package/src/web-dashboard/public/index.html +1 -1
  169. package/src/web-dashboard/public/assets/index-DeD3L0kG.js.map +0 -1
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Custom MCP servers — the "configuration, not code" half of MCP.
3
+ *
4
+ * WHY THIS EXISTS. Discovery has always been data-driven: `discoverConfigs()`
5
+ * reads `*.json` from `~/.nuvira/mcp/`, so a hand-written file for a server we
6
+ * have never heard of connects with no code change. What was missing was an
7
+ * AUTHORING path — a user had to hand-write JSON to add anything outside the
8
+ * catalog, and the dashboard could not add it at all. This module is the one
9
+ * validator/writer both surfaces call, so a config accepted in the terminal
10
+ * cannot be refused in the dashboard, and vice versa.
11
+ *
12
+ * It is deliberately SEPARATE from `catalog.ts`: the catalog decides which
13
+ * curated variant this machine can run (probes, pins, prerequisite gates). A
14
+ * custom server has none of that — the user names the command, and the only
15
+ * gate is that the result must be a config `discoverConfigs()` can connect to.
16
+ * A name in the catalog is NOT reserved: configuring `github` by hand is a
17
+ * supported choice, not a conflict (we just say which one is in play).
18
+ *
19
+ * SECRETS. `env` values and auth headers are written to disk, so a config that
20
+ * carries any is chmod 0600 (best-effort — Windows has no mode bits) and is
21
+ * NEVER read back over the API: the dashboard reports env KEY NAMES only.
22
+ */
23
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
24
+ import { join } from 'node:path';
25
+ import { resolveMcpConfigDir } from '../config/paths.js';
26
+ import { logger } from '../utils/logger.js';
27
+ import { getCatalogEntry } from './catalog.js';
28
+ /**
29
+ * What a name may contain.
30
+ *
31
+ * A name becomes BOTH a config filename (`<name>.json`) and a settings key
32
+ * (`mcp.servers.<name>.enabled`), and the settings grammar is dot-separated —
33
+ * so a dot in a name would produce a server that can never be enabled or
34
+ * disabled from either surface, and a `/` or `..` would escape the config dir.
35
+ * Restricting the character set is what makes "any name" safe, so the refusal
36
+ * says exactly that rather than failing later at connect time.
37
+ */
38
+ export const SERVER_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
39
+ export const SERVER_NAME_MAX = 64;
40
+ export const ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
41
+ export const HEADER_NAME_PATTERN = /^[A-Za-z0-9-]+$/;
42
+ /** Bounds that stop a typo from writing an absurd file (`--arg` in a loop). */
43
+ const MAX_ARGS = 64;
44
+ const MAX_ENTRIES = 64;
45
+ const isPlainObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
46
+ /** A string with no control characters — a newline in a command is never intentional. */
47
+ function cleanString(value, field) {
48
+ if (typeof value !== 'string')
49
+ return null;
50
+ const trimmed = value.trim();
51
+ if (!trimmed)
52
+ return null;
53
+ // eslint-disable-next-line no-control-regex
54
+ if (/[\u0000-\u001f\u007f]/.test(trimmed))
55
+ return null;
56
+ return trimmed;
57
+ }
58
+ function stringRecord(value, field, keyPattern, keyLabel) {
59
+ if (value === undefined || value === null)
60
+ return { ok: true, record: {} };
61
+ if (!isPlainObject(value))
62
+ return { ok: false, error: `${field} must be an object of string values` };
63
+ const entries = Object.entries(value);
64
+ if (entries.length > MAX_ENTRIES) {
65
+ return { ok: false, error: `${field} has ${entries.length} entries — the limit is ${MAX_ENTRIES}` };
66
+ }
67
+ const record = {};
68
+ for (const [key, raw] of entries) {
69
+ if (!keyPattern.test(key)) {
70
+ return { ok: false, error: `${field} key '${key}' is not a valid ${keyLabel}` };
71
+ }
72
+ if (typeof raw !== 'string')
73
+ return { ok: false, error: `${field}.${key} must be a string` };
74
+ // eslint-disable-next-line no-control-regex
75
+ if (/[\u0000-\u001f\u007f]/.test(raw))
76
+ return { ok: false, error: `${field}.${key} contains a control character` };
77
+ record[key] = raw;
78
+ }
79
+ return { ok: true, record };
80
+ }
81
+ /**
82
+ * Validate a user-supplied server into the exact shape `discoverConfigs()`
83
+ * consumes. Pure: no I/O, so the CLI can validate before prompting and the
84
+ * dashboard can validate before gating on a role.
85
+ */
86
+ export function validateServerSpec(input) {
87
+ if (!isPlainObject(input))
88
+ return { ok: false, error: 'Expected a config object.' };
89
+ const warnings = [];
90
+ const name = typeof input.name === 'string' ? input.name.trim() : '';
91
+ if (!name)
92
+ return { ok: false, error: 'A server name is required.' };
93
+ if (name.length > SERVER_NAME_MAX) {
94
+ return { ok: false, error: `The name is ${name.length} characters — the limit is ${SERVER_NAME_MAX}.` };
95
+ }
96
+ if (!SERVER_NAME_PATTERN.test(name)) {
97
+ return {
98
+ ok: false,
99
+ error: `'${name}' is not a usable server name. Use letters, digits, '_' and '-' (no dots, spaces, or slashes): ` +
100
+ `the name is the config filename and the 'mcp.servers.<name>' settings key, so '.' or '/' would make ` +
101
+ `the server unmanageable from the CLI and the dashboard.`,
102
+ };
103
+ }
104
+ const transportRaw = input.transport;
105
+ if (transportRaw !== undefined && transportRaw !== 'stdio' && transportRaw !== 'sse') {
106
+ return { ok: false, error: `transport must be 'stdio' or 'sse' (got '${String(transportRaw)}').` };
107
+ }
108
+ const command = cleanString(input.command, 'command');
109
+ const url = cleanString(input.url, 'url');
110
+ if (input.command !== undefined && command === null) {
111
+ return { ok: false, error: 'command must be a non-empty string with no control characters.' };
112
+ }
113
+ if (input.url !== undefined && url === null) {
114
+ return { ok: false, error: 'url must be a non-empty string with no control characters.' };
115
+ }
116
+ // Transport: explicit when given, else inferred — and refused when the two
117
+ // shapes are mixed, because a config with both a command and a url has no
118
+ // single obvious meaning and `discoverConfigs` would have to guess.
119
+ let transport;
120
+ if (transportRaw === 'stdio' || transportRaw === 'sse')
121
+ transport = transportRaw;
122
+ else if (url && !command)
123
+ transport = 'sse';
124
+ else if (command && !url)
125
+ transport = 'stdio';
126
+ else if (command && url) {
127
+ return { ok: false, error: 'Pass either a command (stdio) or a url (sse), not both.' };
128
+ }
129
+ else {
130
+ return { ok: false, error: 'Nothing to run: pass --command <path> (stdio) or --url <url> (sse).' };
131
+ }
132
+ if (transport === 'stdio') {
133
+ if (!command)
134
+ return { ok: false, error: 'stdio needs a command, e.g. --command npx.' };
135
+ if (url)
136
+ return { ok: false, error: 'stdio takes no url — drop it or use --transport sse.' };
137
+ }
138
+ else {
139
+ if (!url)
140
+ return { ok: false, error: 'sse needs a url, e.g. --url https://example.com/mcp.' };
141
+ if (command)
142
+ return { ok: false, error: 'sse takes no command — drop it or use --transport stdio.' };
143
+ let parsed;
144
+ try {
145
+ parsed = new URL(url);
146
+ }
147
+ catch {
148
+ return { ok: false, error: `'${url}' is not a valid URL.` };
149
+ }
150
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
151
+ return { ok: false, error: `The url must be http(s) (got '${parsed.protocol}').` };
152
+ }
153
+ if (parsed.protocol === 'http:') {
154
+ warnings.push('This endpoint is plain http — credentials and tool results travel unencrypted.');
155
+ }
156
+ }
157
+ const argsRaw = input.args;
158
+ let args;
159
+ if (argsRaw !== undefined && argsRaw !== null) {
160
+ if (!Array.isArray(argsRaw))
161
+ return { ok: false, error: 'args must be an array of strings.' };
162
+ if (argsRaw.length > MAX_ARGS) {
163
+ return { ok: false, error: `args has ${argsRaw.length} entries — the limit is ${MAX_ARGS}.` };
164
+ }
165
+ args = [];
166
+ for (const arg of argsRaw) {
167
+ if (typeof arg !== 'string')
168
+ return { ok: false, error: 'Every args entry must be a string.' };
169
+ // eslint-disable-next-line no-control-regex
170
+ if (/[\u0000-\u001f\u007f]/.test(arg))
171
+ return { ok: false, error: 'An args entry contains a control character.' };
172
+ args.push(arg);
173
+ }
174
+ if (transport === 'sse' && args.length > 0) {
175
+ return { ok: false, error: 'sse takes no args — they only apply to a stdio command.' };
176
+ }
177
+ if (args.length === 0)
178
+ args = undefined;
179
+ }
180
+ const envResult = stringRecord(input.env, 'env', ENV_KEY_PATTERN, 'environment variable name');
181
+ if (!envResult.ok)
182
+ return { ok: false, error: envResult.error };
183
+ const headerResult = stringRecord(input.headers, 'headers', HEADER_NAME_PATTERN, 'HTTP header name');
184
+ if (!headerResult.ok)
185
+ return { ok: false, error: headerResult.error };
186
+ if (transport === 'stdio' && Object.keys(headerResult.record).length > 0) {
187
+ return { ok: false, error: 'headers only apply to a remote (sse) server — for stdio, put credentials in --env.' };
188
+ }
189
+ if (input.enabled !== undefined && typeof input.enabled !== 'boolean') {
190
+ return { ok: false, error: 'enabled must be true or false.' };
191
+ }
192
+ // Reported, never silent: a catalog name configured by hand is legitimate,
193
+ // but the user should know which one will be used.
194
+ if (getCatalogEntry(name)) {
195
+ warnings.push(`'${name}' is also a catalog capability — this config is what will be used; ` +
196
+ `\`mcp install\` would write the same file.`);
197
+ }
198
+ const config = {
199
+ name,
200
+ transport,
201
+ enabled: input.enabled ?? true,
202
+ ...(command ? { command } : {}),
203
+ ...(args ? { args } : {}),
204
+ ...(url ? { url } : {}),
205
+ ...(Object.keys(headerResult.record).length > 0 ? { headers: headerResult.record } : {}),
206
+ ...(Object.keys(envResult.record).length > 0 ? { env: envResult.record } : {}),
207
+ };
208
+ return { ok: true, config, warnings };
209
+ }
210
+ /** Does this config carry a credential? Decides the file mode. */
211
+ export function carriesSecret(config) {
212
+ if (config.env && Object.keys(config.env).length > 0)
213
+ return true;
214
+ return Object.entries(config.headers ?? {}).some(([key]) => ['authorization', 'cookie', 'x-api-key', 'api-key', 'x-auth-token'].includes(key.toLowerCase()));
215
+ }
216
+ /**
217
+ * Write one server config, refusing to clobber an existing file unless asked.
218
+ *
219
+ * The refusal matters: `<name>.json` may be a catalog install with a verified
220
+ * pin, and silently replacing it would turn "I typed the wrong name" into a
221
+ * broken server.
222
+ */
223
+ export function writeServerConfig(config, options = {}) {
224
+ const dir = resolveMcpConfigDir(options.configDir);
225
+ const target = join(dir, `${config.name}.json`);
226
+ const exists = existsSync(target);
227
+ if (exists && !options.force) {
228
+ return { ok: false, reason: `'${config.name}' is already configured at ${target} (pass force to replace it).` };
229
+ }
230
+ let next = config;
231
+ const warnings = [...(options.warnings ?? [])];
232
+ let droppedEnvKeys = [];
233
+ if (exists && options.mergeEnv) {
234
+ const previous = readServerConfig(config.name, options.configDir);
235
+ if (previous) {
236
+ // Existing fields survive unless this write sets them: credentials (whose
237
+ // values the page is never shown), plus the fields a page has no control
238
+ // for — `oauth`, `variant`, `runtime`.
239
+ const env = { ...(previous.env ?? {}), ...(config.env ?? {}) };
240
+ const headers = { ...(previous.headers ?? {}), ...(config.headers ?? {}) };
241
+ next = {
242
+ ...previous,
243
+ ...config,
244
+ ...(Object.keys(env).length > 0 ? { env } : {}),
245
+ ...(Object.keys(headers).length > 0 ? { headers } : {}),
246
+ };
247
+ // A transport switch must not leave the OTHER transport's fields behind:
248
+ // `...previous` would happily keep a stdio `command` on a remote server
249
+ // (or a `url` on a local one), and discovery would see a config that means
250
+ // two things at once.
251
+ if (next.transport === 'sse') {
252
+ delete next.command;
253
+ delete next.args;
254
+ }
255
+ else {
256
+ delete next.url;
257
+ delete next.headers;
258
+ }
259
+ warnings.push('Kept the credentials and settings the existing config had — an edit never deletes what it cannot show.');
260
+ }
261
+ }
262
+ else if (exists) {
263
+ // Exact rewrite (CLI `--force`): name what this replaced, so a dropped token
264
+ // or an orphaned OAuth block is a reported fact rather than a server that
265
+ // fails later in a turn.
266
+ const previous = readServerConfig(config.name, options.configDir);
267
+ droppedEnvKeys = Object.keys(previous?.env ?? {}).filter((key) => !(key in (config.env ?? {})));
268
+ if (previous?.oauth && !config.oauth) {
269
+ warnings.push('the replaced config had an OAuth block — authorize again before relying on it.');
270
+ }
271
+ if (previous?.variant && !config.variant) {
272
+ warnings.push(`the replaced config was the '${previous.variant}' variant of a catalog capability.`);
273
+ }
274
+ if (previous?.runtime && !config.runtime) {
275
+ warnings.push('the replaced config had a runtime override; re-apply it or set mcp.servers.<name>.runtime.command.');
276
+ }
277
+ }
278
+ try {
279
+ mkdirSync(dir, { recursive: true });
280
+ writeFileSync(target, JSON.stringify(next, null, 2), 'utf-8');
281
+ // §7.8 hygiene, matching the catalog installer: a file that carries a
282
+ // credential is not world-readable. Best-effort (Windows has no mode bits).
283
+ try {
284
+ chmodSync(target, carriesSecret(next) ? 0o600 : 0o644);
285
+ }
286
+ catch {
287
+ /* best-effort */
288
+ }
289
+ logger.debug(`MCP custom server: wrote '${config.name}' → ${target}`);
290
+ return {
291
+ ok: true,
292
+ path: target,
293
+ ...(exists ? { overwrote: true } : {}),
294
+ ...(warnings.length > 0 ? { warnings } : {}),
295
+ ...(droppedEnvKeys.length > 0 ? { droppedEnvKeys } : {}),
296
+ };
297
+ }
298
+ catch (err) {
299
+ return { ok: false, reason: `write failed: ${err instanceof Error ? err.message : String(err)}` };
300
+ }
301
+ }
302
+ /**
303
+ * Read a stored config by name. Returns null for an absent or malformed file —
304
+ * a broken file is discovery's problem, not an exception for the caller.
305
+ */
306
+ export function readServerConfig(name, configDir) {
307
+ if (!SERVER_NAME_PATTERN.test(name))
308
+ return null;
309
+ const target = join(resolveMcpConfigDir(configDir), `${name}.json`);
310
+ try {
311
+ if (!existsSync(target))
312
+ return null;
313
+ return JSON.parse(readFileSync(target, 'utf-8'));
314
+ }
315
+ catch {
316
+ return null;
317
+ }
318
+ }
319
+ /**
320
+ * Is this name a catalog capability or a custom config? Reporting only — the
321
+ * connect path does not care where a config came from.
322
+ */
323
+ export function serverOrigin(name, configDir) {
324
+ const config = readServerConfig(name, configDir);
325
+ const entry = getCatalogEntry(name);
326
+ if (config?.variant)
327
+ return { origin: 'catalog', variant: config.variant };
328
+ return entry ? { origin: 'catalog', variant: null } : { origin: 'custom', variant: null };
329
+ }
330
+ //# sourceMappingURL=custom-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-server.js","sourceRoot":"","sources":["../../src/mcp/custom-server.ts"],"names":[],"mappings":"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"}
@@ -10,9 +10,17 @@ import { type MCPServerConfig, type MCPConnectionState, type Tool, type CallTool
10
10
  export declare class MCPManager {
11
11
  private clients;
12
12
  private configDir;
13
+ /**
14
+ * Where `buffconfig.json` is read from for `mcp.*` overrides. Undefined =
15
+ * the resolved config dir (honouring `$NUVIRA_CONFIG_DIR`). When a caller
16
+ * passes an explicit MCP dir (tests), settings resolve from its PARENT so a
17
+ * temp dir never picks up the developer's own `mcp.servers` overrides.
18
+ */
19
+ private settingsDir?;
13
20
  constructor(configDir?: string);
14
21
  /**
15
- * Discover MCP server configurations from the config directory.
22
+ * Discover MCP server configurations from the config directory, with the
23
+ * `mcp.servers.*` overrides applied (enable/disable, runtime override, args).
16
24
  * Looks for *.json files in ~/.nuvira/mcp/ and subdirectories.
17
25
  */
18
26
  discoverConfigs(): MCPServerConfig[];
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,IAAI,EAGT,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAIpB,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,CAAC,EAAE,MAAM;IAS9B;;;OAGG;IACH,eAAe,IAAI,eAAe,EAAE;IA6CpC;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAwC/C;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBxC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,aAAa,IAAI,IAAI;IASrB;;OAEG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IAcpD;;;OAGG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,GAAG,IAAI,CAAC;IAcxH;;OAEG;IACH,YAAY,IAAI,kBAAkB,EAAE;IA8BpC;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAK9C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGnC;AAwDD,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAKtC"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,IAAI,EAGT,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAIpB,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,SAAS,CAAS;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,WAAW,CAAC,CAAS;gBAEjB,SAAS,CAAC,EAAE,MAAM;IAU9B;;;;OAIG;IACH,eAAe,IAAI,eAAe,EAAE;IAgDpC;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAwC/C;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBxC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,aAAa,IAAI,IAAI;IASrB;;OAEG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IAcpD;;;OAGG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,GAAG,IAAI,CAAC;IAcxH;;OAEG;IACH,YAAY,IAAI,kBAAkB,EAAE;IA8BpC;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAK9C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGnC;AAwDD,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAKtC"}
@@ -11,19 +11,29 @@ import { resolveMcpConfigDir } from '../config/paths.js';
11
11
  import { logger } from '../utils/logger.js';
12
12
  import { getMCPSchemaCache, MCPSchemaCache } from './mcp-schema-cache.js';
13
13
  import { MCPClient } from './client.js';
14
+ import { applyServerOverrides, loadMcpSettings } from './settings.js';
14
15
  // ─── MCP Manager ────────────────────────────────────────────────────────────
15
16
  export class MCPManager {
16
17
  clients = new Map();
17
18
  configDir;
19
+ /**
20
+ * Where `buffconfig.json` is read from for `mcp.*` overrides. Undefined =
21
+ * the resolved config dir (honouring `$NUVIRA_CONFIG_DIR`). When a caller
22
+ * passes an explicit MCP dir (tests), settings resolve from its PARENT so a
23
+ * temp dir never picks up the developer's own `mcp.servers` overrides.
24
+ */
25
+ settingsDir;
18
26
  constructor(configDir) {
19
27
  // Resolved through `config/paths`, never `join(homedir(), '.nuvira', …)`:
20
28
  // that reach made every test run discover — and spawn — the developer's real
21
29
  // MCP servers. See `resolveMcpConfigDir`.
22
30
  this.configDir = resolveMcpConfigDir(configDir);
31
+ this.settingsDir = configDir ? join(this.configDir, '..') : undefined;
23
32
  }
24
33
  // ─── Server Discovery ─────────────────────────────────────────────────────
25
34
  /**
26
- * Discover MCP server configurations from the config directory.
35
+ * Discover MCP server configurations from the config directory, with the
36
+ * `mcp.servers.*` overrides applied (enable/disable, runtime override, args).
27
37
  * Looks for *.json files in ~/.nuvira/mcp/ and subdirectories.
28
38
  */
29
39
  discoverConfigs() {
@@ -64,7 +74,10 @@ export class MCPManager {
64
74
  catch (err) {
65
75
  logger.debug(`MCP: Failed to scan config directory: ${err}`);
66
76
  }
67
- return configs;
77
+ // Configuration-only overrides (`mcp.enabled`, `mcp.servers.<name>.*`): the
78
+ // single place every caller (connect, connectAll, getAllStates, discovery)
79
+ // passes through, so a config change reaches every surface at once.
80
+ return applyServerOverrides(configs, loadMcpSettings(this.settingsDir));
68
81
  }
69
82
  // ─── Connection Management ────────────────────────────────────────────────
70
83
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,34 @@ export declare class MCPOAuthManager {
66
66
  * Store tokens for a server.
67
67
  */
68
68
  setTokens(serverName: string, tokens: OAuthTokens): void;
69
+ /**
70
+ * Record a server's OAuth configuration WITHOUT touching its tokens.
71
+ *
72
+ * WHY THIS IS NEEDED. `refreshToken()` reads the stored `state.config` to find
73
+ * the token endpoint and client, and that config used to be written ONLY by
74
+ * `startAuthorizationCodeFlow()` — so a server whose config came from the
75
+ * catalog (or from a hand-written JSON file) could never refresh: the manager
76
+ * had no entry, `getTokens()` returned null and `refreshToken()` bailed out
77
+ * with "no config". Seeding the config from the server config makes a refresh
78
+ * possible in a process that never ran the interactive flow, which is exactly
79
+ * the case for a scheduled turn or the gateway.
80
+ *
81
+ * Tokens are deliberately left alone: this is the HOW, not the credential.
82
+ */
83
+ setConfig(serverName: string, config: OAuthConfig): void;
84
+ /** The stored OAuth configuration for a server, when there is one. */
85
+ getConfig(serverName: string): OAuthConfig | null;
86
+ /**
87
+ * Every server this manager knows about, with whether its token is usable.
88
+ * Deliberately reports NO token values — a status surface is for "am I
89
+ * authorized", not for reading credentials out of the store.
90
+ */
91
+ listServers(): Array<{
92
+ server: string;
93
+ authorized: boolean;
94
+ hasRefreshToken: boolean;
95
+ expiresAt: number | null;
96
+ }>;
69
97
  /**
70
98
  * Clear tokens for a server.
71
99
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-oauth.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,qBAAqB;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAsC;;IAQpD;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAiBjD;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAYxD;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWrC;;;OAGG;IACG,0BAA0B,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA8CvD;;OAEG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC;IA4DvB;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAsDnE;;OAEG;IACG,0BAA0B,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC;IA2CvB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,UAAU;CAcnB;AAMD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
1
+ {"version":3,"file":"mcp-oauth.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,qBAAqB;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAsBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAsC;;IAQpD;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAiBjD;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAYxD;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IASxD,sEAAsE;IACtE,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIjD;;;;OAIG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IASjH;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWrC;;;OAGG;IACG,0BAA0B,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA8CvD;;OAEG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC;IA4DvB;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAsDnE;;OAEG;IACG,0BAA0B,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC;IA2CvB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,UAAU;CAenB;AAMD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -11,13 +11,27 @@
11
11
  * Hermes equivalent: mcp_oauth.py + mcp_oauth_manager.py + mcp_dashboard_oauth.py
12
12
  */
13
13
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
14
- import { resolveNuviraHome } from '../config/paths.js';
14
+ import { resolveNuviraDataPath } from '../config/paths.js';
15
15
  import { join } from 'node:path';
16
16
  import { createHash, randomBytes } from 'node:crypto';
17
17
  import { logger } from '../utils/logger.js';
18
18
  // ─── OAuth Manager ────────────────────────────────────────────────────────
19
- const OAUTH_DIR = join(resolveNuviraHome(), 'mcp', 'oauth');
20
- const OAUTH_STATE_FILE = join(OAUTH_DIR, 'oauth-state.json');
19
+ /**
20
+ * Where the token store lives, resolved PER OPERATION.
21
+ *
22
+ * It used to be a module constant built from `homedir()`, which broke the
23
+ * project's own rule for persisted state (`resolveNuviraDataPath`: "a process
24
+ * pointed at an isolated config dir never reads or writes the real ~/.nuvira").
25
+ * Tokens are the most sensitive thing the agent stores, so honouring
26
+ * `NUVIRA_CONFIG_DIR` is not a test convenience — it is what lets an operator
27
+ * isolate a credential store, and what keeps a test run out of the user's home.
28
+ */
29
+ function oauthDir() {
30
+ return resolveNuviraDataPath('mcp', 'oauth');
31
+ }
32
+ function oauthStateFile() {
33
+ return join(oauthDir(), 'oauth-state.json');
34
+ }
21
35
  export class MCPOAuthManager {
22
36
  states = new Map();
23
37
  constructor() {
@@ -57,6 +71,45 @@ export class MCPOAuthManager {
57
71
  this.saveStates();
58
72
  logger.debug(`MCP OAuth: Stored tokens for '${serverName}'`);
59
73
  }
74
+ /**
75
+ * Record a server's OAuth configuration WITHOUT touching its tokens.
76
+ *
77
+ * WHY THIS IS NEEDED. `refreshToken()` reads the stored `state.config` to find
78
+ * the token endpoint and client, and that config used to be written ONLY by
79
+ * `startAuthorizationCodeFlow()` — so a server whose config came from the
80
+ * catalog (or from a hand-written JSON file) could never refresh: the manager
81
+ * had no entry, `getTokens()` returned null and `refreshToken()` bailed out
82
+ * with "no config". Seeding the config from the server config makes a refresh
83
+ * possible in a process that never ran the interactive flow, which is exactly
84
+ * the case for a scheduled turn or the gateway.
85
+ *
86
+ * Tokens are deliberately left alone: this is the HOW, not the credential.
87
+ */
88
+ setConfig(serverName, config) {
89
+ const existing = this.states.get(serverName);
90
+ const next = existing
91
+ ? { ...existing, config: { ...existing.config, ...config } }
92
+ : { serverName, config, createdAt: Date.now() };
93
+ this.states.set(serverName, next);
94
+ this.saveStates();
95
+ }
96
+ /** The stored OAuth configuration for a server, when there is one. */
97
+ getConfig(serverName) {
98
+ return this.states.get(serverName)?.config ?? null;
99
+ }
100
+ /**
101
+ * Every server this manager knows about, with whether its token is usable.
102
+ * Deliberately reports NO token values — a status surface is for "am I
103
+ * authorized", not for reading credentials out of the store.
104
+ */
105
+ listServers() {
106
+ return [...this.states.entries()].map(([server, state]) => ({
107
+ server,
108
+ authorized: Boolean(state.tokens?.accessToken) && (state.tokens?.expiresAt ?? 0) > Date.now(),
109
+ hasRefreshToken: Boolean(state.tokens?.refreshToken),
110
+ expiresAt: state.tokens?.expiresAt ?? null,
111
+ }));
112
+ }
60
113
  /**
61
114
  * Clear tokens for a server.
62
115
  */
@@ -237,8 +290,9 @@ export class MCPOAuthManager {
237
290
  // ─── Persistence ─────────────────────────────────────────────────────
238
291
  loadStates() {
239
292
  try {
240
- if (existsSync(OAUTH_STATE_FILE)) {
241
- const data = readFileSync(OAUTH_STATE_FILE, 'utf-8');
293
+ const stateFile = oauthStateFile();
294
+ if (existsSync(stateFile)) {
295
+ const data = readFileSync(stateFile, 'utf-8');
242
296
  const parsed = JSON.parse(data);
243
297
  for (const [key, value] of Object.entries(parsed)) {
244
298
  this.states.set(key, value);
@@ -251,14 +305,15 @@ export class MCPOAuthManager {
251
305
  }
252
306
  saveStates() {
253
307
  try {
254
- if (!existsSync(OAUTH_DIR)) {
255
- mkdirSync(OAUTH_DIR, { recursive: true });
308
+ const dir = oauthDir();
309
+ if (!existsSync(dir)) {
310
+ mkdirSync(dir, { recursive: true });
256
311
  }
257
312
  const data = {};
258
313
  for (const [key, value] of this.states.entries()) {
259
314
  data[key] = value;
260
315
  }
261
- writeFileSync(OAUTH_STATE_FILE, JSON.stringify(data, null, 2));
316
+ writeFileSync(oauthStateFile(), JSON.stringify(data, null, 2));
262
317
  }
263
318
  catch (err) {
264
319
  logger.warn(`MCP OAuth: Failed to save state: ${err}`);