@dyyz1993/pi-coding-agent 0.74.9 → 0.74.11

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 (45) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cli/args.d.ts +1 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +3 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +9 -0
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +51 -0
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/mcp/mcp-manager.d.ts +1 -0
  11. package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
  12. package/dist/core/mcp/mcp-manager.js +36 -0
  13. package/dist/core/mcp/mcp-manager.js.map +1 -1
  14. package/dist/core/sdk.d.ts +2 -0
  15. package/dist/core/sdk.d.ts.map +1 -1
  16. package/dist/core/sdk.js +1 -0
  17. package/dist/core/sdk.js.map +1 -1
  18. package/dist/core/settings-manager.d.ts +3 -1
  19. package/dist/core/settings-manager.d.ts.map +1 -1
  20. package/dist/core/settings-manager.js +41 -0
  21. package/dist/core/settings-manager.js.map +1 -1
  22. package/dist/main.d.ts.map +1 -1
  23. package/dist/main.js +3 -0
  24. package/dist/main.js.map +1 -1
  25. package/dist/modes/rpc/rpc-client-types.d.ts +4 -1
  26. package/dist/modes/rpc/rpc-client-types.d.ts.map +1 -1
  27. package/dist/modes/rpc/rpc-client-types.js.map +1 -1
  28. package/dist/modes/rpc/rpc-client.d.ts +3 -0
  29. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  30. package/dist/modes/rpc/rpc-client.js +10 -0
  31. package/dist/modes/rpc/rpc-client.js.map +1 -1
  32. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  33. package/dist/modes/rpc/rpc-mode.js +18 -0
  34. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  35. package/dist/modes/rpc/rpc-types.d.ts +21 -0
  36. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  37. package/dist/modes/rpc/rpc-types.js.map +1 -1
  38. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  39. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  40. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  41. package/examples/extensions/sandbox/package-lock.json +2 -2
  42. package/examples/extensions/sandbox/package.json +1 -1
  43. package/examples/extensions/with-deps/package-lock.json +2 -2
  44. package/examples/extensions/with-deps/package.json +1 -1
  45. package/package.json +4 -4
@@ -34,6 +34,7 @@ import { emitSessionShutdownEvent } from "./extensions/runner.js";
34
34
  import { FileSnapshotManager } from "./file-store/file-snapshot-manager.js";
35
35
  import { InternalGit } from "./file-store/internal-git.js";
36
36
  import { McpManager } from "./mcp/mcp-manager.js";
37
+ import { createMcpToolDefinition } from "./mcp/tool-converter.js";
37
38
  import { resolveModelAlias } from "./model-resolver.js";
38
39
  import { expandPromptTemplate } from "./prompt-templates.js";
39
40
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
@@ -119,6 +120,9 @@ export class AgentSession {
119
120
  _modelRegistry;
120
121
  _fileSnapshotManager = null;
121
122
  _mcpManager;
123
+ _mcpToolDefinitions = new Map();
124
+ _mcpServerScopes = new Map();
125
+ _noMcp;
122
126
  _tierModels = {};
123
127
  // Tool registry for extension getTools/setTools
124
128
  _toolRegistry = new Map();
@@ -142,6 +146,7 @@ export class AgentSession {
142
146
  this._allowedToolNames = config.allowedToolNames ? new Set(config.allowedToolNames) : undefined;
143
147
  this._baseToolsOverride = config.baseToolsOverride;
144
148
  this._sessionStartEvent = config.sessionStartEvent ?? { type: "session_start", reason: "startup" };
149
+ this._noMcp = config.noMcp ?? false;
145
150
  // Always subscribe to agent events for internal handling
146
151
  // (session persistence, extensions, auto-compaction, retry logic)
147
152
  this._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);
@@ -172,14 +177,22 @@ export class AgentSession {
172
177
  }
173
178
  }
174
179
  _initMcpServers() {
180
+ if (this._noMcp)
181
+ return;
175
182
  if (this._mcpManager) {
176
183
  this._mcpManager.dispose().catch(() => { });
177
184
  this._mcpManager = undefined;
178
185
  }
186
+ this._mcpServerScopes.clear();
187
+ const globalServers = this.settingsManager.getMcpServers("global");
188
+ const projectServers = this.settingsManager.getMcpServers("project");
179
189
  const settings = this.settingsManager.getMergedSettings();
180
190
  const servers = settings?.mcp?.servers;
181
191
  if (!servers || Object.keys(servers).length === 0)
182
192
  return;
193
+ for (const name of Object.keys(servers)) {
194
+ this._mcpServerScopes.set(name, projectServers[name] ? "project" : "global");
195
+ }
183
196
  this._mcpManager = new McpManager({
184
197
  onConnectionChange: (conn) => {
185
198
  this._emit({
@@ -193,6 +206,21 @@ export class AgentSession {
193
206
  description: t.description,
194
207
  })),
195
208
  });
209
+ if (conn.status === "connected" && this._mcpManager) {
210
+ this._mcpToolDefinitions.clear();
211
+ const allTools = this._mcpManager.getAllTools();
212
+ for (const tool of allTools) {
213
+ this._mcpToolDefinitions.set(tool.fullName, createMcpToolDefinition(tool, this._mcpManager));
214
+ }
215
+ this._refreshToolRegistry();
216
+ }
217
+ else if (conn.status === "error" || conn.status === "disconnected") {
218
+ const staleKeys = [...this._mcpToolDefinitions.keys()].filter((key) => key.startsWith(`mcp__${conn.name}__`));
219
+ for (const key of staleKeys) {
220
+ this._mcpToolDefinitions.delete(key);
221
+ }
222
+ this._refreshToolRegistry();
223
+ }
196
224
  },
197
225
  });
198
226
  this._mcpManager.connectAll(servers).catch(() => { });
@@ -582,8 +610,24 @@ export class AgentSession {
582
610
  fullName: t.fullName,
583
611
  description: t.description,
584
612
  })),
613
+ scope: this._mcpServerScopes.get(c.name) ?? "global",
614
+ disabled: c.config.disabled,
585
615
  }));
586
616
  }
617
+ async toggleMcpServer(name, enabled) {
618
+ if (!this._mcpManager)
619
+ throw new Error("MCP is not initialized");
620
+ const scope = this._mcpServerScopes.get(name);
621
+ if (!scope)
622
+ throw new Error(`MCP server "${name}" not found`);
623
+ await this._mcpManager.setServerEnabled(name, enabled);
624
+ this.settingsManager.setMcpServerDisabled(name, !enabled, scope);
625
+ }
626
+ async restartMcpServer(name) {
627
+ if (!this._mcpManager)
628
+ throw new Error("MCP is not initialized");
629
+ await this._mcpManager.restartServer(name);
630
+ }
587
631
  // =========================================================================
588
632
  // Read-only State Access
589
633
  // =========================================================================
@@ -1901,12 +1945,19 @@ export class AgentSession {
1901
1945
  const allowedToolNames = this._allowedToolNames;
1902
1946
  const isAllowedTool = (name) => !allowedToolNames || allowedToolNames.has(name);
1903
1947
  const registeredTools = this._extensionRunner.getAllRegisteredTools();
1948
+ const mcpTools = [...this._mcpToolDefinitions.values()]
1949
+ .filter((def) => isAllowedTool(def.name))
1950
+ .map((definition) => ({
1951
+ definition,
1952
+ sourceInfo: createSyntheticSourceInfo(`<mcp:${definition.name}>`, { source: "mcp" }),
1953
+ }));
1904
1954
  const allCustomTools = [
1905
1955
  ...registeredTools,
1906
1956
  ...this._customTools.map((definition) => ({
1907
1957
  definition,
1908
1958
  sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" }),
1909
1959
  })),
1960
+ ...mcpTools,
1910
1961
  ].filter((tool) => isAllowedTool(tool.definition.name));
1911
1962
  const definitionRegistry = new Map(Array.from(this._baseToolDefinitions.entries())
1912
1963
  .filter(([name]) => isAllowedTool(name))