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
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * MCP settings — the `mcp.*` section of `buffconfig.json`, resolved.
3
+ *
4
+ * Assessment §8.6 found the config-only levers were: a file's presence, its own
5
+ * `enabled` flag, the `mcp` toolset toggle and `tools.loopExposure` — and that
6
+ * `enableMcp` existed only as a programmatic option with no config home. This
7
+ * module is that home, and it is deliberately SMALL: one section, all keys
8
+ * optional, every default reproducing today's behaviour so an existing install
9
+ * that never touches it is byte-identical.
10
+ *
11
+ * ```jsonc
12
+ * "mcp": {
13
+ * "enabled": true, // master switch
14
+ * "autoConnect": true, // connect at turn start (existence-gated)
15
+ * "connectTimeoutMs": 2000, // wall-clock budget; exceeding it proceeds without MCP
16
+ * "maxToolsPerServer": 15, // eager-schema cap per server
17
+ * "maxToolsTotal": 60, // eager-schema cap across all servers
18
+ * "subagent": { "inherit": "conservative" }, // 'conservative' | 'full'
19
+ * "servers": {
20
+ * "context7": { "runtime": { "command": "/opt/node20/bin/node", "args": ["/usr/local/bin/npx"] } },
21
+ * "filesystem": { "args": ["/Users/me/project"], "enabled": false }
22
+ * }
23
+ * }
24
+ * ```
25
+ *
26
+ * WHY IT READS THE FILE DIRECTLY instead of going through `ConfigManager`:
27
+ * the MCP layer is used by tests, the parity harness and (from Phase 2) every
28
+ * chat surface, and it must not drag the config manager's vault/env bootstrap
29
+ * into a discovery call. The keys here are non-secret scalars, and the pure
30
+ * resolver (`resolveMcpSettings`) is exported so a caller that ALREADY holds the
31
+ * config object (the dashboard, the CLI) resolves the exact same values.
32
+ */
33
+ import type { MCPServerConfig } from './types.js';
34
+ /**
35
+ * How much MCP a SUBAGENT inherits from its parent.
36
+ *
37
+ * - `conservative` (DEFAULT) — plan §7.7: the child inherits MCP only when the
38
+ * parent already had it AND the child's allowance covers it. A subagent never
39
+ * silently gains reach.
40
+ * - `full` — explicit opt-in for Claude-style power: the child receives the
41
+ * parent's whole discovered MCP set (still cap-bound, still governed by
42
+ * effectClass/hooks/grants — the override widens REACH, never APPROVAL).
43
+ *
44
+ * Default is deliberately the safe one; turning it on is a decision a user makes
45
+ * once, in config, and can undo the same way.
46
+ */
47
+ export type MCPSubagentInheritance = 'conservative' | 'full';
48
+ /** Per-server overrides, merged over the server's own config file. */
49
+ export interface MCPServerOverride {
50
+ /** Disable a configured server without deleting its file. */
51
+ enabled?: boolean;
52
+ /** Pin which catalog variant this server is (reported by `mcp list`). */
53
+ variant?: string;
54
+ /**
55
+ * Replace the stdio COMMAND — the path to a binary that is installed but NOT
56
+ * on PATH (e.g. `~/.local/bin/github-mcp-server`). Without this, a locally
57
+ * installed server is invisible to the probe and un-installable through the
58
+ * catalog, which is a reach gap rather than a missing capability.
59
+ */
60
+ command?: string;
61
+ /** Per-server runtime override (see `runtime.ts`). */
62
+ runtime?: {
63
+ command: string;
64
+ args?: string[];
65
+ };
66
+ /** Replace the stdio args (e.g. the allowed roots for `filesystem`). */
67
+ args?: string[];
68
+ /** Per-server eager-schema cap, overriding `maxToolsPerServer`. */
69
+ maxTools?: number;
70
+ }
71
+ export interface MCPConfigSection {
72
+ enabled?: boolean;
73
+ autoConnect?: boolean;
74
+ connectTimeoutMs?: number;
75
+ maxToolsPerServer?: number;
76
+ maxToolsTotal?: number;
77
+ subagent?: {
78
+ inherit?: MCPSubagentInheritance | string;
79
+ };
80
+ servers?: Record<string, MCPServerOverride>;
81
+ }
82
+ /**
83
+ * Merge a validated patch into the stored section.
84
+ *
85
+ * WHY THIS EXISTS rather than a plain spread: `runtime` is a nested object, so a
86
+ * patch that sets only `runtime.command` would otherwise DROP a previously
87
+ * configured `runtime.args` (and vice versa). It also has to preserve an
88
+ * explicit `undefined` as a CLEAR — a plain `{...old, ...new}` cannot tell
89
+ * "not mentioned" from "cleared".
90
+ */
91
+ export declare function mergeMcpSetting(existing: MCPConfigSection | null | undefined, patch: MCPConfigSection): MCPConfigSection;
92
+ export interface ResolvedMCPSettings {
93
+ enabled: boolean;
94
+ autoConnect: boolean;
95
+ connectTimeoutMs: number;
96
+ maxToolsPerServer: number;
97
+ maxToolsTotal: number;
98
+ subagentInheritance: MCPSubagentInheritance;
99
+ servers: Record<string, MCPServerOverride>;
100
+ /** Config values that were ignored/coerced, so a caller can report them once. */
101
+ warnings: string[];
102
+ }
103
+ export declare const MCP_SETTING_DEFAULTS: {
104
+ readonly enabled: true;
105
+ readonly autoConnect: true;
106
+ readonly connectTimeoutMs: 2000;
107
+ readonly maxToolsPerServer: 15;
108
+ readonly maxToolsTotal: 60;
109
+ readonly subagentInheritance: MCPSubagentInheritance;
110
+ };
111
+ /**
112
+ * Resolve the raw `mcp` section into settings with defaults + bounds applied.
113
+ * Pure: no I/O, so the dashboard, the CLI and tests all agree on the values.
114
+ */
115
+ export declare function resolveMcpSettings(raw?: MCPConfigSection | null): ResolvedMCPSettings;
116
+ /** Parse outcome for one `mcp.*` setting. */
117
+ export type McpSettingParse = {
118
+ ok: true;
119
+ mcp: MCPConfigSection;
120
+ } | {
121
+ ok: false;
122
+ error: string;
123
+ };
124
+ /** Human list of the keys the parser accepts (shared by every error message). */
125
+ export declare const MCP_SETTING_KEYS: readonly ["mcp.enabled", "mcp.autoConnect", "mcp.connectTimeoutMs", "mcp.maxToolsPerServer", "mcp.maxToolsTotal", "mcp.subagent.inherit", "mcp.servers.<name>.enabled", "mcp.servers.<name>.command", "mcp.servers.<name>.variant", "mcp.servers.<name>.maxTools", "mcp.servers.<name>.args", "mcp.servers.<name>.runtime.command", "mcp.servers.<name>.runtime.args"];
126
+ /**
127
+ * Validate ONE `mcp.*` setting from its dotted path and string value.
128
+ *
129
+ * SHARED BY DESIGN. `nuvira config set mcp.*` and the dashboard's MCP page both
130
+ * call this, so the same key cannot be accepted in one surface and rejected —
131
+ * or coerced differently — in the other, and both write the same
132
+ * `buffconfig.json` section. A setting that "saves" in the dashboard and is
133
+ * ignored by the CLI would be a silent lie on one of the two surfaces.
134
+ *
135
+ * Pure: no writes, no filesystem, no environment. Booleans accept
136
+ * true/false, 1/0, yes/no, on/off; numbers are integers; `args` split on commas;
137
+ * an empty value CLEARS a string/list.
138
+ */
139
+ export declare function parseMcpSetting(key: string, value: string): McpSettingParse;
140
+ /**
141
+ * Read `mcp` from the resolved config dir (`buffconfig.json`). Never throws: an
142
+ * absent or malformed file yields the defaults, because MCP configuration must
143
+ * not be able to break a chat turn.
144
+ */
145
+ export declare function loadMcpSettings(configDir?: string): ResolvedMCPSettings;
146
+ /**
147
+ * Merge the per-server overrides over the discovered configs.
148
+ *
149
+ * This is the "nothing requires code, just configuration" seam: `context7`
150
+ * needing an older Node is fixed with
151
+ * `mcp.servers.context7.runtime.command`, and disabling a server is a boolean in
152
+ * config — no edit to a server file, no CLI flag, no release.
153
+ */
154
+ export declare function applyServerOverrides(configs: MCPServerConfig[], settings: Pick<ResolvedMCPSettings, 'servers' | 'enabled'>): MCPServerConfig[];
155
+ /**
156
+ * The eager-schema cap that applies to one server, per plan §6:
157
+ * `min(perServerOverride ?? maxToolsPerServer, maxToolsTotal − alreadyExposed)`.
158
+ *
159
+ * Caps limit EXPOSURE, not access: an over-cap tool stays callable through
160
+ * `tool_search` results. Consumed by the Phase 3 exposure work; defined here so
161
+ * the number has one home.
162
+ */
163
+ export declare function effectiveToolCap(server: string, settings: Pick<ResolvedMCPSettings, 'servers' | 'maxToolsPerServer' | 'maxToolsTotal'>, alreadyExposed: number): number;
164
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/mcp/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,358 @@
1
+ /**
2
+ * MCP settings — the `mcp.*` section of `buffconfig.json`, resolved.
3
+ *
4
+ * Assessment §8.6 found the config-only levers were: a file's presence, its own
5
+ * `enabled` flag, the `mcp` toolset toggle and `tools.loopExposure` — and that
6
+ * `enableMcp` existed only as a programmatic option with no config home. This
7
+ * module is that home, and it is deliberately SMALL: one section, all keys
8
+ * optional, every default reproducing today's behaviour so an existing install
9
+ * that never touches it is byte-identical.
10
+ *
11
+ * ```jsonc
12
+ * "mcp": {
13
+ * "enabled": true, // master switch
14
+ * "autoConnect": true, // connect at turn start (existence-gated)
15
+ * "connectTimeoutMs": 2000, // wall-clock budget; exceeding it proceeds without MCP
16
+ * "maxToolsPerServer": 15, // eager-schema cap per server
17
+ * "maxToolsTotal": 60, // eager-schema cap across all servers
18
+ * "subagent": { "inherit": "conservative" }, // 'conservative' | 'full'
19
+ * "servers": {
20
+ * "context7": { "runtime": { "command": "/opt/node20/bin/node", "args": ["/usr/local/bin/npx"] } },
21
+ * "filesystem": { "args": ["/Users/me/project"], "enabled": false }
22
+ * }
23
+ * }
24
+ * ```
25
+ *
26
+ * WHY IT READS THE FILE DIRECTLY instead of going through `ConfigManager`:
27
+ * the MCP layer is used by tests, the parity harness and (from Phase 2) every
28
+ * chat surface, and it must not drag the config manager's vault/env bootstrap
29
+ * into a discovery call. The keys here are non-secret scalars, and the pure
30
+ * resolver (`resolveMcpSettings`) is exported so a caller that ALREADY holds the
31
+ * config object (the dashboard, the CLI) resolves the exact same values.
32
+ */
33
+ import { existsSync, readFileSync } from 'node:fs';
34
+ import { join } from 'node:path';
35
+ import { resolveNuviraConfigDir } from '../config/paths.js';
36
+ import { logger } from '../utils/logger.js';
37
+ /**
38
+ * Merge a validated patch into the stored section.
39
+ *
40
+ * WHY THIS EXISTS rather than a plain spread: `runtime` is a nested object, so a
41
+ * patch that sets only `runtime.command` would otherwise DROP a previously
42
+ * configured `runtime.args` (and vice versa). It also has to preserve an
43
+ * explicit `undefined` as a CLEAR — a plain `{...old, ...new}` cannot tell
44
+ * "not mentioned" from "cleared".
45
+ */
46
+ export function mergeMcpSetting(existing, patch) {
47
+ const base = existing ?? {};
48
+ const servers = { ...(base.servers ?? {}) };
49
+ for (const [name, override] of Object.entries(patch.servers ?? {})) {
50
+ const previous = base.servers?.[name] ?? {};
51
+ const next = override;
52
+ const { runtime: patchedRuntime, ...rest } = next;
53
+ let runtime;
54
+ if (!('runtime' in next)) {
55
+ runtime = previous.runtime; // not mentioned — leave it alone
56
+ }
57
+ else if (!patchedRuntime) {
58
+ runtime = undefined; // explicit clear (`runtime.command` set to empty)
59
+ }
60
+ else if (!patchedRuntime.command && previous.runtime?.command) {
61
+ // `runtime.args` on its own must not erase the command it applies to: the
62
+ // parser emits an empty command because it cannot see the stored one.
63
+ runtime = {
64
+ command: previous.runtime.command,
65
+ ...(patchedRuntime.args !== undefined ? { args: patchedRuntime.args } : {}),
66
+ };
67
+ }
68
+ else {
69
+ // Setting the command must not drop args that were configured earlier
70
+ // (and vice versa) — `runtime` is one object, set in two commands.
71
+ runtime = {
72
+ ...patchedRuntime,
73
+ ...(patchedRuntime.args === undefined && previous.runtime?.args
74
+ ? { args: previous.runtime.args }
75
+ : {}),
76
+ };
77
+ }
78
+ const merged = { ...previous, ...rest };
79
+ if (runtime)
80
+ merged.runtime = runtime;
81
+ else
82
+ delete merged.runtime;
83
+ servers[name] = merged;
84
+ }
85
+ return {
86
+ ...base,
87
+ ...patch,
88
+ ...(base.subagent || patch.subagent
89
+ ? { subagent: { ...(base.subagent ?? {}), ...(patch.subagent ?? {}) } }
90
+ : {}),
91
+ ...(Object.keys(servers).length > 0 ? { servers } : {}),
92
+ };
93
+ }
94
+ export const MCP_SETTING_DEFAULTS = {
95
+ enabled: true,
96
+ autoConnect: true,
97
+ connectTimeoutMs: 2000,
98
+ maxToolsPerServer: 15,
99
+ maxToolsTotal: 60,
100
+ subagentInheritance: 'conservative',
101
+ };
102
+ /** Clamp bounds — a typo must not disable the budget or hang a turn for a minute. */
103
+ const CONNECT_TIMEOUT_MIN_MS = 250;
104
+ const CONNECT_TIMEOUT_MAX_MS = 15_000;
105
+ const MAX_TOOLS_PER_SERVER_CEILING = 200;
106
+ const MAX_TOOLS_TOTAL_CEILING = 1000;
107
+ function positiveInt(value, fallback, min, max, key, warnings) {
108
+ if (value === undefined || value === null)
109
+ return fallback;
110
+ const n = typeof value === 'string' ? Number(value.trim()) : Number(value);
111
+ if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0) {
112
+ warnings.push(`mcp.${key} must be a positive integer — using ${fallback}`);
113
+ return fallback;
114
+ }
115
+ if (n < min || n > max) {
116
+ const clamped = Math.min(Math.max(n, min), max);
117
+ warnings.push(`mcp.${key} ${n} is outside ${min}–${max} — using ${clamped}`);
118
+ return clamped;
119
+ }
120
+ return n;
121
+ }
122
+ function booleanSetting(value, fallback, key, warnings) {
123
+ if (value === undefined || value === null)
124
+ return fallback;
125
+ if (typeof value === 'boolean')
126
+ return value;
127
+ if (typeof value === 'string') {
128
+ const lower = value.trim().toLowerCase();
129
+ if (['true', '1', 'yes', 'on'].includes(lower))
130
+ return true;
131
+ if (['false', '0', 'no', 'off'].includes(lower))
132
+ return false;
133
+ }
134
+ warnings.push(`mcp.${key} must be true or false — using ${fallback}`);
135
+ return fallback;
136
+ }
137
+ /**
138
+ * Resolve the raw `mcp` section into settings with defaults + bounds applied.
139
+ * Pure: no I/O, so the dashboard, the CLI and tests all agree on the values.
140
+ */
141
+ export function resolveMcpSettings(raw) {
142
+ const warnings = [];
143
+ const section = raw ?? {};
144
+ const inheritRaw = section.subagent?.inherit;
145
+ let subagentInheritance = MCP_SETTING_DEFAULTS.subagentInheritance;
146
+ if (inheritRaw !== undefined) {
147
+ if (inheritRaw === 'conservative' || inheritRaw === 'full') {
148
+ subagentInheritance = inheritRaw;
149
+ }
150
+ else {
151
+ warnings.push(`mcp.subagent.inherit must be 'conservative' or 'full' (got '${String(inheritRaw)}') — using 'conservative'`);
152
+ }
153
+ }
154
+ return {
155
+ enabled: booleanSetting(section.enabled, MCP_SETTING_DEFAULTS.enabled, 'enabled', warnings),
156
+ autoConnect: booleanSetting(section.autoConnect, MCP_SETTING_DEFAULTS.autoConnect, 'autoConnect', warnings),
157
+ connectTimeoutMs: positiveInt(section.connectTimeoutMs, MCP_SETTING_DEFAULTS.connectTimeoutMs, CONNECT_TIMEOUT_MIN_MS, CONNECT_TIMEOUT_MAX_MS, 'connectTimeoutMs', warnings),
158
+ maxToolsPerServer: positiveInt(section.maxToolsPerServer, MCP_SETTING_DEFAULTS.maxToolsPerServer, 1, MAX_TOOLS_PER_SERVER_CEILING, 'maxToolsPerServer', warnings),
159
+ maxToolsTotal: positiveInt(section.maxToolsTotal, MCP_SETTING_DEFAULTS.maxToolsTotal, 1, MAX_TOOLS_TOTAL_CEILING, 'maxToolsTotal', warnings),
160
+ subagentInheritance,
161
+ servers: { ...(section.servers ?? {}) },
162
+ warnings,
163
+ };
164
+ }
165
+ /** Human list of the keys the parser accepts (shared by every error message). */
166
+ export const MCP_SETTING_KEYS = [
167
+ 'mcp.enabled',
168
+ 'mcp.autoConnect',
169
+ 'mcp.connectTimeoutMs',
170
+ 'mcp.maxToolsPerServer',
171
+ 'mcp.maxToolsTotal',
172
+ 'mcp.subagent.inherit',
173
+ 'mcp.servers.<name>.enabled',
174
+ 'mcp.servers.<name>.command',
175
+ 'mcp.servers.<name>.variant',
176
+ 'mcp.servers.<name>.maxTools',
177
+ 'mcp.servers.<name>.args',
178
+ 'mcp.servers.<name>.runtime.command',
179
+ 'mcp.servers.<name>.runtime.args',
180
+ ];
181
+ /**
182
+ * Validate ONE `mcp.*` setting from its dotted path and string value.
183
+ *
184
+ * SHARED BY DESIGN. `nuvira config set mcp.*` and the dashboard's MCP page both
185
+ * call this, so the same key cannot be accepted in one surface and rejected —
186
+ * or coerced differently — in the other, and both write the same
187
+ * `buffconfig.json` section. A setting that "saves" in the dashboard and is
188
+ * ignored by the CLI would be a silent lie on one of the two surfaces.
189
+ *
190
+ * Pure: no writes, no filesystem, no environment. Booleans accept
191
+ * true/false, 1/0, yes/no, on/off; numbers are integers; `args` split on commas;
192
+ * an empty value CLEARS a string/list.
193
+ */
194
+ export function parseMcpSetting(key, value) {
195
+ const parts = String(key).trim().split('.');
196
+ const raw = String(value ?? '');
197
+ const trimmed = raw.trim();
198
+ const bool = () => {
199
+ const lower = trimmed.toLowerCase();
200
+ if (['true', '1', 'yes', 'on'].includes(lower))
201
+ return true;
202
+ if (['false', '0', 'no', 'off'].includes(lower))
203
+ return false;
204
+ return null;
205
+ };
206
+ const int = (min, max, label) => {
207
+ const n = Number(trimmed);
208
+ if (!Number.isInteger(n) || n < min || n > max) {
209
+ return { error: `${key} must be an integer between ${min} and ${max} (got '${raw}')` };
210
+ }
211
+ return n;
212
+ };
213
+ const list = () => {
214
+ const items = raw.split(',').map((v) => v.trim()).filter(Boolean);
215
+ return items.length > 0 ? items : undefined;
216
+ };
217
+ if (parts[0] !== 'mcp') {
218
+ return { ok: false, error: `Not an MCP setting: ${key}. Expected one of: ${MCP_SETTING_KEYS.join(', ')}` };
219
+ }
220
+ if (parts.length === 2) {
221
+ const field = parts[1];
222
+ if (field === 'enabled' || field === 'autoConnect') {
223
+ const typed = bool();
224
+ if (typed === null)
225
+ return { ok: false, error: `${key} must be true or false (got '${raw}')` };
226
+ return { ok: true, mcp: { [field]: typed } };
227
+ }
228
+ if (field === 'connectTimeoutMs' || field === 'maxToolsPerServer' || field === 'maxToolsTotal') {
229
+ const parsed = int(1, field === 'connectTimeoutMs' ? 60_000 : 10_000, field);
230
+ if (typeof parsed !== 'number')
231
+ return { ok: false, error: parsed.error };
232
+ return { ok: true, mcp: { [field]: parsed } };
233
+ }
234
+ return {
235
+ ok: false,
236
+ error: `Unknown MCP setting '${field}'. Expected one of: ${MCP_SETTING_KEYS.slice(0, 6).join(', ')}`,
237
+ };
238
+ }
239
+ if (parts.length === 3 && parts[1] === 'subagent' && parts[2] === 'inherit') {
240
+ const mode = trimmed.toLowerCase();
241
+ if (mode !== 'conservative' && mode !== 'full') {
242
+ return {
243
+ ok: false,
244
+ error: `mcp.subagent.inherit must be 'conservative' (default) or 'full' (got '${raw}')`,
245
+ };
246
+ }
247
+ return { ok: true, mcp: { subagent: { inherit: mode } } };
248
+ }
249
+ if (parts.length >= 4 && parts[1] === 'servers') {
250
+ const server = parts[2];
251
+ if (!server)
252
+ return { ok: false, error: `mcp.servers needs a server name, e.g. ${MCP_SETTING_KEYS[6]}` };
253
+ const field = parts[3];
254
+ const rest = parts.slice(4).join('.');
255
+ if (parts.length === 4 && field === 'enabled') {
256
+ const typed = bool();
257
+ if (typed === null)
258
+ return { ok: false, error: `${key} must be true or false (got '${raw}')` };
259
+ return { ok: true, mcp: { servers: { [server]: { enabled: typed } } } };
260
+ }
261
+ if (parts.length === 4 && field === 'variant') {
262
+ return { ok: true, mcp: { servers: { [server]: { variant: trimmed || undefined } } } };
263
+ }
264
+ if (parts.length === 4 && field === 'command') {
265
+ // The path to a binary that is installed but not on PATH.
266
+ return { ok: true, mcp: { servers: { [server]: { command: trimmed || undefined } } } };
267
+ }
268
+ if (parts.length === 4 && field === 'maxTools') {
269
+ const parsed = int(1, 10_000, field);
270
+ if (typeof parsed !== 'number')
271
+ return { ok: false, error: parsed.error };
272
+ return { ok: true, mcp: { servers: { [server]: { maxTools: parsed } } } };
273
+ }
274
+ if (parts.length === 4 && field === 'args') {
275
+ return { ok: true, mcp: { servers: { [server]: { args: list() } } } };
276
+ }
277
+ if (parts.length === 5 && field === 'runtime' && rest === 'command') {
278
+ // An empty command CLEARS the whole runtime override (a half-configured
279
+ // override that prefixes nothing is worse than none).
280
+ return {
281
+ ok: true,
282
+ mcp: { servers: { [server]: { runtime: trimmed ? { command: trimmed } : undefined } } },
283
+ };
284
+ }
285
+ if (parts.length === 5 && field === 'runtime' && rest === 'args') {
286
+ return { ok: true, mcp: { servers: { [server]: { runtime: { command: '', args: list() } } } } };
287
+ }
288
+ return {
289
+ ok: false,
290
+ error: `Unknown mcp.servers setting '${parts.slice(3).join('.')}'. Expected: enabled, command, variant, maxTools, args, runtime.command, runtime.args`,
291
+ };
292
+ }
293
+ return { ok: false, error: `Unknown MCP setting '${key}'. Expected one of: ${MCP_SETTING_KEYS.join(', ')}` };
294
+ }
295
+ /**
296
+ * Read `mcp` from the resolved config dir (`buffconfig.json`). Never throws: an
297
+ * absent or malformed file yields the defaults, because MCP configuration must
298
+ * not be able to break a chat turn.
299
+ */
300
+ export function loadMcpSettings(configDir) {
301
+ const dir = configDir ?? resolveNuviraConfigDir();
302
+ const file = join(dir, 'buffconfig.json');
303
+ try {
304
+ if (!existsSync(file))
305
+ return resolveMcpSettings(null);
306
+ const parsed = JSON.parse(readFileSync(file, 'utf-8'));
307
+ return resolveMcpSettings(parsed.mcp ?? null);
308
+ }
309
+ catch (err) {
310
+ logger.debug(`MCP: could not read settings from ${file}: ${err}`);
311
+ return resolveMcpSettings(null);
312
+ }
313
+ }
314
+ /**
315
+ * Merge the per-server overrides over the discovered configs.
316
+ *
317
+ * This is the "nothing requires code, just configuration" seam: `context7`
318
+ * needing an older Node is fixed with
319
+ * `mcp.servers.context7.runtime.command`, and disabling a server is a boolean in
320
+ * config — no edit to a server file, no CLI flag, no release.
321
+ */
322
+ export function applyServerOverrides(configs, settings) {
323
+ if (!settings.enabled)
324
+ return [];
325
+ const out = [];
326
+ for (const config of configs) {
327
+ const override = settings.servers[config.name];
328
+ if (!override) {
329
+ out.push(config);
330
+ continue;
331
+ }
332
+ if (override.enabled === false)
333
+ continue;
334
+ out.push({
335
+ ...config,
336
+ ...(override.enabled !== undefined ? { enabled: override.enabled } : {}),
337
+ ...(override.variant !== undefined ? { variant: override.variant } : {}),
338
+ ...(override.command !== undefined ? { command: override.command } : {}),
339
+ ...(override.runtime !== undefined ? { runtime: override.runtime } : {}),
340
+ ...(override.args !== undefined ? { args: override.args } : {}),
341
+ });
342
+ }
343
+ return out;
344
+ }
345
+ /**
346
+ * The eager-schema cap that applies to one server, per plan §6:
347
+ * `min(perServerOverride ?? maxToolsPerServer, maxToolsTotal − alreadyExposed)`.
348
+ *
349
+ * Caps limit EXPOSURE, not access: an over-cap tool stays callable through
350
+ * `tool_search` results. Consumed by the Phase 3 exposure work; defined here so
351
+ * the number has one home.
352
+ */
353
+ export function effectiveToolCap(server, settings, alreadyExposed) {
354
+ const perServer = settings.servers[server]?.maxTools ?? settings.maxToolsPerServer;
355
+ const remainingTotal = Math.max(settings.maxToolsTotal - alreadyExposed, 0);
356
+ return Math.max(Math.min(perServer, remainingTotal), 0);
357
+ }
358
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/mcp/settings.ts"],"names":[],"mappings":"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"}
@@ -167,6 +167,41 @@ export interface GetPromptRequest {
167
167
  name: string;
168
168
  arguments?: Record<string, string>;
169
169
  }
170
+ /**
171
+ * OAuth 2.0 for a remote MCP server whose credential is a TOKEN, not a static
172
+ * key — the flow Google Workspace, Slack and Figma's official remote servers
173
+ * require (none of them accept a long-lived API key).
174
+ *
175
+ * WHY IT LIVES IN THE SERVER CONFIG. The credential those servers want is a
176
+ * short-lived access token that must be refreshed, so "install the server" and
177
+ * "authorize the server" are two different moments: the config declares HOW to
178
+ * get a token, and the first connect obtains or refreshes one. Tokens themselves
179
+ * are NEVER written here — they live in the OAuth manager's own store
180
+ * (`~/.nuvira/mcp-oauth.json`), which is where refresh and expiry belong.
181
+ */
182
+ export interface MCPOAuthServerConfig {
183
+ /** Token endpoint (required — the code exchange and every refresh go here). */
184
+ tokenEndpoint: string;
185
+ /** Authorization endpoint. Required for the interactive (authorization-code) flow. */
186
+ authorizationEndpoint?: string;
187
+ /**
188
+ * Client credentials. May reference an env var (`${VAR}`), which the catalog
189
+ * installer expands from the resolved environment at install time — so a
190
+ * secret can come from the environment and still land in a 0600 config file.
191
+ */
192
+ clientId?: string;
193
+ clientSecret?: string;
194
+ /** Scopes to request. Also written into the store so a refresh asks for the same set. */
195
+ scopes?: string[];
196
+ /** Use PKCE (S256) — required by Google's installed-app clients. */
197
+ usePKCE?: boolean;
198
+ /**
199
+ * `client_credentials` for a server-to-server token (no user, no browser);
200
+ * default is `authorization_code`, where a user token is obtained once
201
+ * (`nuvira mcp authorize <name>`) and then refreshed forever.
202
+ */
203
+ grant?: 'authorization_code' | 'client_credentials';
204
+ }
170
205
  export interface MCPServerConfig {
171
206
  /** A unique name for this MCP server connection */
172
207
  name: string;
@@ -182,6 +217,33 @@ export interface MCPServerConfig {
182
217
  headers?: Record<string, string>;
183
218
  /** Environment variables for the stdio subprocess */
184
219
  env?: Record<string, string>;
220
+ /**
221
+ * Per-server runtime override: run the stdio `command` through a DIFFERENT
222
+ * interpreter — `runtime.command runtime.args… <command> <args…>`.
223
+ *
224
+ * It exists so one server with a higher Node (or Python) floor cannot raise
225
+ * the product's own floor: `context7-mcp@4.3.0` declares
226
+ * `engines.node ≥ 20.18.1`, while Nuvira ships `≥ 18.18.0`, so that server is
227
+ * started under its own Node instead. Set at install time (`nuvira mcp
228
+ * install context7 --runtime /path/to/node20`) or by configuration
229
+ * (`mcp.servers.<name>.runtime.command`), never by forking the codebase.
230
+ */
231
+ runtime?: {
232
+ command: string;
233
+ args?: string[];
234
+ };
235
+ /**
236
+ * Which catalog variant produced this config (e.g. 'remote', 'npx'), when it
237
+ * came from `nuvira mcp install`. Reported by `nuvira mcp list` / `info`;
238
+ * never required to connect.
239
+ */
240
+ variant?: string;
241
+ /**
242
+ * OAuth 2.0 for a remote server. When present, the connect path resolves a
243
+ * valid access token (reusing or refreshing a stored one) and sends it as
244
+ * `Authorization: Bearer …`; an explicit `headers.Authorization` wins.
245
+ */
246
+ oauth?: MCPOAuthServerConfig;
185
247
  /** Whether this server is enabled */
186
248
  enabled: boolean;
187
249
  }