@dyyz1993/pi-coding-agent 0.70.2 → 0.70.3

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 (42) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/dist/core/agent-session.d.ts +4 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +43 -0
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/index.d.ts +2 -0
  7. package/dist/core/index.d.ts.map +1 -1
  8. package/dist/core/index.js +1 -0
  9. package/dist/core/index.js.map +1 -1
  10. package/dist/core/mcp/errors.d.ts +16 -0
  11. package/dist/core/mcp/errors.d.ts.map +1 -0
  12. package/dist/core/mcp/errors.js +31 -0
  13. package/dist/core/mcp/errors.js.map +1 -0
  14. package/dist/core/mcp/logger.d.ts +12 -0
  15. package/dist/core/mcp/logger.d.ts.map +1 -0
  16. package/dist/core/mcp/logger.js +31 -0
  17. package/dist/core/mcp/logger.js.map +1 -0
  18. package/dist/core/mcp/mcp-manager.d.ts +42 -0
  19. package/dist/core/mcp/mcp-manager.d.ts.map +1 -0
  20. package/dist/core/mcp/mcp-manager.js +427 -0
  21. package/dist/core/mcp/mcp-manager.js.map +1 -0
  22. package/dist/core/mcp/tool-converter.d.ts +5 -0
  23. package/dist/core/mcp/tool-converter.d.ts.map +1 -0
  24. package/dist/core/mcp/tool-converter.js +39 -0
  25. package/dist/core/mcp/tool-converter.js.map +1 -0
  26. package/dist/core/mcp/types.d.ts +50 -0
  27. package/dist/core/mcp/types.d.ts.map +1 -0
  28. package/dist/core/mcp/types.js +2 -0
  29. package/dist/core/mcp/types.js.map +1 -0
  30. package/dist/core/settings-manager.d.ts +3 -0
  31. package/dist/core/settings-manager.d.ts.map +1 -1
  32. package/dist/core/settings-manager.js.map +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js.map +1 -1
  36. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  37. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  38. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  39. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  40. package/examples/extensions/with-deps/package-lock.json +2 -2
  41. package/examples/extensions/with-deps/package.json +1 -1
  42. package/package.json +5 -4
@@ -8,5 +8,7 @@ export { type BashExecutorOptions, type BashResult, executeBashWithOperations }
8
8
  export type { CompactionResult } from "./compaction/index.js";
9
9
  export { createEventBus, type EventBus, type EventBusController } from "./event-bus.js";
10
10
  export { type AgentEndEvent, type AgentStartEvent, type AgentToolResult, type AgentToolUpdateCallback, type BeforeAgentStartEvent, type BeforeAgentStartEventResult, type BuildSystemPromptOptions, type ContextEvent, defineTool, discoverAndLoadExtensions, type ExecOptions, type ExecResult, type Extension, type ExtensionAPI, type ExtensionCommandContext, type ExtensionContext, type ExtensionError, type ExtensionEvent, type ExtensionFactory, type ExtensionFlag, type ExtensionHandler, ExtensionRunner, type ExtensionShortcut, type ExtensionUIContext, type LoadExtensionsResult, type MessageRenderer, type RegisteredCommand, type SessionBeforeCompactEvent, type SessionBeforeForkEvent, type SessionBeforeSwitchEvent, type SessionBeforeTreeEvent, type SessionCompactEvent, type SessionShutdownEvent, type SessionStartEvent, type SessionTreeEvent, type ToolCallEvent, type ToolCallEventResult, type ToolDefinition, type ToolRenderResultOptions, type ToolResultEvent, type TurnEndEvent, type TurnStartEvent, type WorkingIndicatorOptions, } from "./extensions/index.js";
11
+ export { McpConnectionError, McpError, McpTimeoutError, McpToolCallError, } from "./mcp/errors.js";
12
+ export type { ConnectionStatus, McpConnection, McpManagerEvents } from "./mcp/types.js";
11
13
  export { createSyntheticSourceInfo } from "./source-info.js";
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACN,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,YAAY,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,mBAAmB,EACnB,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,yBAAyB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,qCAAqC,EAC1C,KAAK,iCAAiC,EACtC,8BAA8B,EAC9B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,UAAU,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC1G,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExF,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,UAAU,EACV,yBAAyB,EACzB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * Core modules shared between all run modes.\n */\n\nexport {\n\tAgentSession,\n\ttype AgentSessionConfig,\n\ttype AgentSessionEvent,\n\ttype AgentSessionEventListener,\n\ttype ModelCycleResult,\n\ttype PromptOptions,\n\ttype SessionStats,\n} from \"./agent-session.js\";\nexport {\n\tAgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\ttype CreateAgentSessionRuntimeResult,\n\tcreateAgentSessionRuntime,\n} from \"./agent-session-runtime.js\";\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.js\";\nexport { type BashExecutorOptions, type BashResult, executeBashWithOperations } from \"./bash-executor.js\";\nexport type { CompactionResult } from \"./compaction/index.js\";\nexport { createEventBus, type EventBus, type EventBusController } from \"./event-bus.js\";\n// Extensions system\nexport {\n\ttype AgentEndEvent,\n\ttype AgentStartEvent,\n\ttype AgentToolResult,\n\ttype AgentToolUpdateCallback,\n\ttype BeforeAgentStartEvent,\n\ttype BeforeAgentStartEventResult,\n\ttype BuildSystemPromptOptions,\n\ttype ContextEvent,\n\tdefineTool,\n\tdiscoverAndLoadExtensions,\n\ttype ExecOptions,\n\ttype ExecResult,\n\ttype Extension,\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n\ttype ExtensionContext,\n\ttype ExtensionError,\n\ttype ExtensionEvent,\n\ttype ExtensionFactory,\n\ttype ExtensionFlag,\n\ttype ExtensionHandler,\n\tExtensionRunner,\n\ttype ExtensionShortcut,\n\ttype ExtensionUIContext,\n\ttype LoadExtensionsResult,\n\ttype MessageRenderer,\n\ttype RegisteredCommand,\n\ttype SessionBeforeCompactEvent,\n\ttype SessionBeforeForkEvent,\n\ttype SessionBeforeSwitchEvent,\n\ttype SessionBeforeTreeEvent,\n\ttype SessionCompactEvent,\n\ttype SessionShutdownEvent,\n\ttype SessionStartEvent,\n\ttype SessionTreeEvent,\n\ttype ToolCallEvent,\n\ttype ToolCallEventResult,\n\ttype ToolDefinition,\n\ttype ToolRenderResultOptions,\n\ttype ToolResultEvent,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\ttype WorkingIndicatorOptions,\n} from \"./extensions/index.js\";\nexport { createSyntheticSourceInfo } from \"./source-info.js\";\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACN,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,YAAY,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,mBAAmB,EACnB,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,yBAAyB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,qCAAqC,EAC1C,KAAK,iCAAiC,EACtC,8BAA8B,EAC9B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,UAAU,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC1G,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExF,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,UAAU,EACV,yBAAyB,EACzB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * Core modules shared between all run modes.\n */\n\nexport {\n\tAgentSession,\n\ttype AgentSessionConfig,\n\ttype AgentSessionEvent,\n\ttype AgentSessionEventListener,\n\ttype ModelCycleResult,\n\ttype PromptOptions,\n\ttype SessionStats,\n} from \"./agent-session.js\";\nexport {\n\tAgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\ttype CreateAgentSessionRuntimeResult,\n\tcreateAgentSessionRuntime,\n} from \"./agent-session-runtime.js\";\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.js\";\nexport { type BashExecutorOptions, type BashResult, executeBashWithOperations } from \"./bash-executor.js\";\nexport type { CompactionResult } from \"./compaction/index.js\";\nexport { createEventBus, type EventBus, type EventBusController } from \"./event-bus.js\";\n// Extensions system\nexport {\n\ttype AgentEndEvent,\n\ttype AgentStartEvent,\n\ttype AgentToolResult,\n\ttype AgentToolUpdateCallback,\n\ttype BeforeAgentStartEvent,\n\ttype BeforeAgentStartEventResult,\n\ttype BuildSystemPromptOptions,\n\ttype ContextEvent,\n\tdefineTool,\n\tdiscoverAndLoadExtensions,\n\ttype ExecOptions,\n\ttype ExecResult,\n\ttype Extension,\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n\ttype ExtensionContext,\n\ttype ExtensionError,\n\ttype ExtensionEvent,\n\ttype ExtensionFactory,\n\ttype ExtensionFlag,\n\ttype ExtensionHandler,\n\tExtensionRunner,\n\ttype ExtensionShortcut,\n\ttype ExtensionUIContext,\n\ttype LoadExtensionsResult,\n\ttype MessageRenderer,\n\ttype RegisteredCommand,\n\ttype SessionBeforeCompactEvent,\n\ttype SessionBeforeForkEvent,\n\ttype SessionBeforeSwitchEvent,\n\ttype SessionBeforeTreeEvent,\n\ttype SessionCompactEvent,\n\ttype SessionShutdownEvent,\n\ttype SessionStartEvent,\n\ttype SessionTreeEvent,\n\ttype ToolCallEvent,\n\ttype ToolCallEventResult,\n\ttype ToolDefinition,\n\ttype ToolRenderResultOptions,\n\ttype ToolResultEvent,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\ttype WorkingIndicatorOptions,\n} from \"./extensions/index.js\";\nexport {\n\tMcpConnectionError,\n\tMcpError,\n\tMcpTimeoutError,\n\tMcpToolCallError,\n} from \"./mcp/errors.js\";\nexport type { ConnectionStatus, McpConnection, McpManagerEvents } from \"./mcp/types.js\";\nexport { createSyntheticSourceInfo } from \"./source-info.js\";\n"]}
@@ -8,5 +8,6 @@ export { executeBashWithOperations } from "./bash-executor.js";
8
8
  export { createEventBus } from "./event-bus.js";
9
9
  // Extensions system
10
10
  export { defineTool, discoverAndLoadExtensions, ExtensionRunner, } from "./extensions/index.js";
11
+ export { McpConnectionError, McpError, McpTimeoutError, McpToolCallError, } from "./mcp/errors.js";
11
12
  export { createSyntheticSourceInfo } from "./source-info.js";
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACN,YAAY,GAOZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,mBAAmB,EAGnB,yBAAyB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAKN,8BAA8B,EAC9B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAA6C,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE1G,OAAO,EAAE,cAAc,EAA0C,MAAM,gBAAgB,CAAC;AACxF,oBAAoB;AACpB,OAAO,EASN,UAAU,EACV,yBAAyB,EAYzB,eAAe,GAsBf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * Core modules shared between all run modes.\n */\n\nexport {\n\tAgentSession,\n\ttype AgentSessionConfig,\n\ttype AgentSessionEvent,\n\ttype AgentSessionEventListener,\n\ttype ModelCycleResult,\n\ttype PromptOptions,\n\ttype SessionStats,\n} from \"./agent-session.js\";\nexport {\n\tAgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\ttype CreateAgentSessionRuntimeResult,\n\tcreateAgentSessionRuntime,\n} from \"./agent-session-runtime.js\";\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.js\";\nexport { type BashExecutorOptions, type BashResult, executeBashWithOperations } from \"./bash-executor.js\";\nexport type { CompactionResult } from \"./compaction/index.js\";\nexport { createEventBus, type EventBus, type EventBusController } from \"./event-bus.js\";\n// Extensions system\nexport {\n\ttype AgentEndEvent,\n\ttype AgentStartEvent,\n\ttype AgentToolResult,\n\ttype AgentToolUpdateCallback,\n\ttype BeforeAgentStartEvent,\n\ttype BeforeAgentStartEventResult,\n\ttype BuildSystemPromptOptions,\n\ttype ContextEvent,\n\tdefineTool,\n\tdiscoverAndLoadExtensions,\n\ttype ExecOptions,\n\ttype ExecResult,\n\ttype Extension,\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n\ttype ExtensionContext,\n\ttype ExtensionError,\n\ttype ExtensionEvent,\n\ttype ExtensionFactory,\n\ttype ExtensionFlag,\n\ttype ExtensionHandler,\n\tExtensionRunner,\n\ttype ExtensionShortcut,\n\ttype ExtensionUIContext,\n\ttype LoadExtensionsResult,\n\ttype MessageRenderer,\n\ttype RegisteredCommand,\n\ttype SessionBeforeCompactEvent,\n\ttype SessionBeforeForkEvent,\n\ttype SessionBeforeSwitchEvent,\n\ttype SessionBeforeTreeEvent,\n\ttype SessionCompactEvent,\n\ttype SessionShutdownEvent,\n\ttype SessionStartEvent,\n\ttype SessionTreeEvent,\n\ttype ToolCallEvent,\n\ttype ToolCallEventResult,\n\ttype ToolDefinition,\n\ttype ToolRenderResultOptions,\n\ttype ToolResultEvent,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\ttype WorkingIndicatorOptions,\n} from \"./extensions/index.js\";\nexport { createSyntheticSourceInfo } from \"./source-info.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACN,YAAY,GAOZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,mBAAmB,EAGnB,yBAAyB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAKN,8BAA8B,EAC9B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAA6C,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE1G,OAAO,EAAE,cAAc,EAA0C,MAAM,gBAAgB,CAAC;AACxF,oBAAoB;AACpB,OAAO,EASN,UAAU,EACV,yBAAyB,EAYzB,eAAe,GAsBf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * Core modules shared between all run modes.\n */\n\nexport {\n\tAgentSession,\n\ttype AgentSessionConfig,\n\ttype AgentSessionEvent,\n\ttype AgentSessionEventListener,\n\ttype ModelCycleResult,\n\ttype PromptOptions,\n\ttype SessionStats,\n} from \"./agent-session.js\";\nexport {\n\tAgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\ttype CreateAgentSessionRuntimeResult,\n\tcreateAgentSessionRuntime,\n} from \"./agent-session-runtime.js\";\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.js\";\nexport { type BashExecutorOptions, type BashResult, executeBashWithOperations } from \"./bash-executor.js\";\nexport type { CompactionResult } from \"./compaction/index.js\";\nexport { createEventBus, type EventBus, type EventBusController } from \"./event-bus.js\";\n// Extensions system\nexport {\n\ttype AgentEndEvent,\n\ttype AgentStartEvent,\n\ttype AgentToolResult,\n\ttype AgentToolUpdateCallback,\n\ttype BeforeAgentStartEvent,\n\ttype BeforeAgentStartEventResult,\n\ttype BuildSystemPromptOptions,\n\ttype ContextEvent,\n\tdefineTool,\n\tdiscoverAndLoadExtensions,\n\ttype ExecOptions,\n\ttype ExecResult,\n\ttype Extension,\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n\ttype ExtensionContext,\n\ttype ExtensionError,\n\ttype ExtensionEvent,\n\ttype ExtensionFactory,\n\ttype ExtensionFlag,\n\ttype ExtensionHandler,\n\tExtensionRunner,\n\ttype ExtensionShortcut,\n\ttype ExtensionUIContext,\n\ttype LoadExtensionsResult,\n\ttype MessageRenderer,\n\ttype RegisteredCommand,\n\ttype SessionBeforeCompactEvent,\n\ttype SessionBeforeForkEvent,\n\ttype SessionBeforeSwitchEvent,\n\ttype SessionBeforeTreeEvent,\n\ttype SessionCompactEvent,\n\ttype SessionShutdownEvent,\n\ttype SessionStartEvent,\n\ttype SessionTreeEvent,\n\ttype ToolCallEvent,\n\ttype ToolCallEventResult,\n\ttype ToolDefinition,\n\ttype ToolRenderResultOptions,\n\ttype ToolResultEvent,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\ttype WorkingIndicatorOptions,\n} from \"./extensions/index.js\";\nexport {\n\tMcpConnectionError,\n\tMcpError,\n\tMcpTimeoutError,\n\tMcpToolCallError,\n} from \"./mcp/errors.js\";\nexport type { ConnectionStatus, McpConnection, McpManagerEvents } from \"./mcp/types.js\";\nexport { createSyntheticSourceInfo } from \"./source-info.js\";\n"]}
@@ -0,0 +1,16 @@
1
+ export declare class McpError extends Error {
2
+ readonly code: string;
3
+ readonly serverName?: string | undefined;
4
+ readonly toolName?: string | undefined;
5
+ constructor(code: string, message: string, serverName?: string | undefined, toolName?: string | undefined);
6
+ }
7
+ export declare class McpConnectionError extends McpError {
8
+ constructor(serverName: string, message: string);
9
+ }
10
+ export declare class McpToolCallError extends McpError {
11
+ constructor(serverName: string, toolName: string, message: string);
12
+ }
13
+ export declare class McpTimeoutError extends McpError {
14
+ constructor(operation: string, serverName: string, timeoutMs: number);
15
+ }
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAEjB,IAAI,EAAE,MAAM;aAEZ,UAAU,CAAC;aACX,QAAQ,CAAC;IAJ1B,YACiB,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,oBAAQ,EACnB,QAAQ,CAAC,oBAAQ,EAIjC;CACD;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC/C,YAAY,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAG9C;CACD;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAC7C,YAAY,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAGhE;CACD;AAED,qBAAa,eAAgB,SAAQ,QAAQ;IAC5C,YAAY,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAGnE;CACD","sourcesContent":["export class McpError extends Error {\n\tconstructor(\n\t\tpublic readonly code: string,\n\t\tmessage: string,\n\t\tpublic readonly serverName?: string,\n\t\tpublic readonly toolName?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"McpError\";\n\t}\n}\n\nexport class McpConnectionError extends McpError {\n\tconstructor(serverName: string, message: string) {\n\t\tsuper(\"CONNECTION_ERROR\", message, serverName);\n\t\tthis.name = \"McpConnectionError\";\n\t}\n}\n\nexport class McpToolCallError extends McpError {\n\tconstructor(serverName: string, toolName: string, message: string) {\n\t\tsuper(\"TOOL_CALL_ERROR\", message, serverName, toolName);\n\t\tthis.name = \"McpToolCallError\";\n\t}\n}\n\nexport class McpTimeoutError extends McpError {\n\tconstructor(operation: string, serverName: string, timeoutMs: number) {\n\t\tsuper(\"TIMEOUT\", `${operation} timed out after ${timeoutMs}ms`, serverName);\n\t\tthis.name = \"McpTimeoutError\";\n\t}\n}\n"]}
@@ -0,0 +1,31 @@
1
+ export class McpError extends Error {
2
+ code;
3
+ serverName;
4
+ toolName;
5
+ constructor(code, message, serverName, toolName) {
6
+ super(message);
7
+ this.code = code;
8
+ this.serverName = serverName;
9
+ this.toolName = toolName;
10
+ this.name = "McpError";
11
+ }
12
+ }
13
+ export class McpConnectionError extends McpError {
14
+ constructor(serverName, message) {
15
+ super("CONNECTION_ERROR", message, serverName);
16
+ this.name = "McpConnectionError";
17
+ }
18
+ }
19
+ export class McpToolCallError extends McpError {
20
+ constructor(serverName, toolName, message) {
21
+ super("TOOL_CALL_ERROR", message, serverName, toolName);
22
+ this.name = "McpToolCallError";
23
+ }
24
+ }
25
+ export class McpTimeoutError extends McpError {
26
+ constructor(operation, serverName, timeoutMs) {
27
+ super("TIMEOUT", `${operation} timed out after ${timeoutMs}ms`, serverName);
28
+ this.name = "McpTimeoutError";
29
+ }
30
+ }
31
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/mcp/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEjB,IAAI;IAEJ,UAAU;IACV,QAAQ;IAJzB,YACiB,IAAY,EAC5B,OAAe,EACC,UAAmB,EACnB,QAAiB,EAChC;QACD,KAAK,CAAC,OAAO,CAAC,CAAC;oBALC,IAAI;0BAEJ,UAAU;wBACV,QAAQ;QAGxB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAAA,CACvB;CACD;AAED,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC/C,YAAY,UAAkB,EAAE,OAAe,EAAE;QAChD,KAAK,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IAAA,CACjC;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,QAAQ;IAC7C,YAAY,UAAkB,EAAE,QAAgB,EAAE,OAAe,EAAE;QAClE,KAAK,CAAC,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAAA,CAC/B;CACD;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC5C,YAAY,SAAiB,EAAE,UAAkB,EAAE,SAAiB,EAAE;QACrE,KAAK,CAAC,SAAS,EAAE,GAAG,SAAS,oBAAoB,SAAS,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAAA,CAC9B;CACD","sourcesContent":["export class McpError extends Error {\n\tconstructor(\n\t\tpublic readonly code: string,\n\t\tmessage: string,\n\t\tpublic readonly serverName?: string,\n\t\tpublic readonly toolName?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"McpError\";\n\t}\n}\n\nexport class McpConnectionError extends McpError {\n\tconstructor(serverName: string, message: string) {\n\t\tsuper(\"CONNECTION_ERROR\", message, serverName);\n\t\tthis.name = \"McpConnectionError\";\n\t}\n}\n\nexport class McpToolCallError extends McpError {\n\tconstructor(serverName: string, toolName: string, message: string) {\n\t\tsuper(\"TOOL_CALL_ERROR\", message, serverName, toolName);\n\t\tthis.name = \"McpToolCallError\";\n\t}\n}\n\nexport class McpTimeoutError extends McpError {\n\tconstructor(operation: string, serverName: string, timeoutMs: number) {\n\t\tsuper(\"TIMEOUT\", `${operation} timed out after ${timeoutMs}ms`, serverName);\n\t\tthis.name = \"McpTimeoutError\";\n\t}\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export type LogLevel = "debug" | "info" | "warn" | "error";
2
+ export declare class McpLogger {
3
+ private minLevel;
4
+ private readonly levels;
5
+ constructor(minLevel?: LogLevel);
6
+ debug(server: string, msg: string, ...args: unknown[]): void;
7
+ info(server: string, msg: string, ...args: unknown[]): void;
8
+ warn(server: string, msg: string, ...args: unknown[]): void;
9
+ error(server: string, msg: string, ...args: unknown[]): void;
10
+ private log;
11
+ }
12
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,qBAAa,SAAS;IAQT,OAAO,CAAC,QAAQ;IAP5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAKrB;IAEF,YAAoB,QAAQ,GAAE,QAAiB,EAAI;IAEnD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAEpD;IACD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAEnD;IACD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAEnD;IACD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAEpD;IAED,OAAO,CAAC,GAAG;CAKX","sourcesContent":["export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport class McpLogger {\n\tprivate readonly levels: Record<LogLevel, number> = {\n\t\tdebug: 0,\n\t\tinfo: 1,\n\t\twarn: 2,\n\t\terror: 3,\n\t};\n\n\tconstructor(private minLevel: LogLevel = \"info\") {}\n\n\tdebug(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"debug\", server, msg, ...args);\n\t}\n\tinfo(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"info\", server, msg, ...args);\n\t}\n\twarn(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"warn\", server, msg, ...args);\n\t}\n\terror(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"error\", server, msg, ...args);\n\t}\n\n\tprivate log(level: LogLevel, server: string, msg: string, ...args: unknown[]) {\n\t\tif (this.levels[level] < this.levels[this.minLevel]) return;\n\t\tconst fn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n\t\tfn(`[mcp:${level}] [${server}] ${msg}`, ...args);\n\t}\n}\n"]}
@@ -0,0 +1,31 @@
1
+ export class McpLogger {
2
+ minLevel;
3
+ levels = {
4
+ debug: 0,
5
+ info: 1,
6
+ warn: 2,
7
+ error: 3,
8
+ };
9
+ constructor(minLevel = "info") {
10
+ this.minLevel = minLevel;
11
+ }
12
+ debug(server, msg, ...args) {
13
+ this.log("debug", server, msg, ...args);
14
+ }
15
+ info(server, msg, ...args) {
16
+ this.log("info", server, msg, ...args);
17
+ }
18
+ warn(server, msg, ...args) {
19
+ this.log("warn", server, msg, ...args);
20
+ }
21
+ error(server, msg, ...args) {
22
+ this.log("error", server, msg, ...args);
23
+ }
24
+ log(level, server, msg, ...args) {
25
+ if (this.levels[level] < this.levels[this.minLevel])
26
+ return;
27
+ const fn = level === "error" ? console.error : level === "warn" ? console.warn : console.log;
28
+ fn(`[mcp:${level}] [${server}] ${msg}`, ...args);
29
+ }
30
+ }
31
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/core/mcp/logger.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,SAAS;IAQD,QAAQ;IAPX,MAAM,GAA6B;QACnD,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;KACR,CAAC;IAEF,YAAoB,QAAQ,GAAa,MAAM,EAAE;wBAA7B,QAAQ;IAAsB,CAAC;IAEnD,KAAK,CAAC,MAAc,EAAE,GAAW,EAAE,GAAG,IAAe,EAAE;QACtD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAAA,CACxC;IACD,IAAI,CAAC,MAAc,EAAE,GAAW,EAAE,GAAG,IAAe,EAAE;QACrD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAAA,CACvC;IACD,IAAI,CAAC,MAAc,EAAE,GAAW,EAAE,GAAG,IAAe,EAAE;QACrD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAAA,CACvC;IACD,KAAK,CAAC,MAAc,EAAE,GAAW,EAAE,GAAG,IAAe,EAAE;QACtD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAAA,CACxC;IAEO,GAAG,CAAC,KAAe,EAAE,MAAc,EAAE,GAAW,EAAE,GAAG,IAAe,EAAE;QAC7E,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC5D,MAAM,EAAE,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QAC7F,EAAE,CAAC,QAAQ,KAAK,MAAM,MAAM,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAAA,CACjD;CACD","sourcesContent":["export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport class McpLogger {\n\tprivate readonly levels: Record<LogLevel, number> = {\n\t\tdebug: 0,\n\t\tinfo: 1,\n\t\twarn: 2,\n\t\terror: 3,\n\t};\n\n\tconstructor(private minLevel: LogLevel = \"info\") {}\n\n\tdebug(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"debug\", server, msg, ...args);\n\t}\n\tinfo(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"info\", server, msg, ...args);\n\t}\n\twarn(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"warn\", server, msg, ...args);\n\t}\n\terror(server: string, msg: string, ...args: unknown[]) {\n\t\tthis.log(\"error\", server, msg, ...args);\n\t}\n\n\tprivate log(level: LogLevel, server: string, msg: string, ...args: unknown[]) {\n\t\tif (this.levels[level] < this.levels[this.minLevel]) return;\n\t\tconst fn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n\t\tfn(`[mcp:${level}] [${server}] ${msg}`, ...args);\n\t}\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import type { DiscoveredTool, McpConnection, McpManagerEvents, McpManagerOptions, McpServerConfig } from "./types.js";
2
+ export declare class McpManager {
3
+ private connections;
4
+ private toolMap;
5
+ private readonly logger;
6
+ private readonly events;
7
+ private readonly connectTimeoutMs;
8
+ private readonly callTimeoutMs;
9
+ private readonly maxReconnectAttempts;
10
+ private readonly callSemaphore;
11
+ private reconnectTimers;
12
+ private baseReconnectDelay;
13
+ private maxReconnectDelay;
14
+ private cleanupHandler;
15
+ constructor(optionsOrEvents?: McpManagerEvents | (McpManagerOptions & {
16
+ onConnectionChange?: McpManagerEvents["onConnectionChange"];
17
+ }));
18
+ private registerCleanup;
19
+ dispose(): Promise<void>;
20
+ private notifyChange;
21
+ connectAll(servers: Record<string, McpServerConfig>): Promise<void>;
22
+ connectServer(name: string, config: McpServerConfig): Promise<void>;
23
+ private doConnectWithTimeout;
24
+ private doConnectServer;
25
+ private scheduleReconnect;
26
+ private reconnectServer;
27
+ addServer(name: string, config: McpServerConfig): Promise<void>;
28
+ removeServer(name: string): Promise<void>;
29
+ setServerEnabled(name: string, enabled: boolean): Promise<void>;
30
+ refreshTools(serverName?: string): Promise<DiscoveredTool[]>;
31
+ getConnections(): McpConnection[];
32
+ getConnection(name: string): McpConnection | undefined;
33
+ getToolsByServer(serverName: string): DiscoveredTool[];
34
+ callTool(fullName: string, args: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
35
+ private acquireCallSlot;
36
+ private releaseCallSlot;
37
+ getAllTools(): DiscoveredTool[];
38
+ disconnectAll(): Promise<void>;
39
+ private createTransport;
40
+ private isStdioConfig;
41
+ }
42
+ //# sourceMappingURL=mcp-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-manager.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/mcp-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAEf,MAAM,YAAY,CAAC;AAYpB,qBAAa,UAAU;IACtB,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,OAAO,CAA+D;IAC9E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IAEtD,OAAO,CAAC,eAAe,CAAoD;IAC3E,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,cAAc,CAA2B;IAEjD,YACC,eAAe,CAAC,EACb,gBAAgB,GAChB,CAAC,iBAAiB,GAAG;QAAE,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAA;KAAE,CAAC,EAuBxF;IAED,OAAO,CAAC,eAAe;IASvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAUvB;IAED,OAAO,CAAC,YAAY;IAId,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE;IAEK,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxE;YAEa,oBAAoB;YAmBpB,eAAe;IAuD7B,OAAO,CAAC,iBAAiB;YAoBX,eAAe;IAyBvB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;IAEK,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9C;IAEK,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBpE;IAEK,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA2DjE;IAED,cAAc,IAAI,aAAa,EAAE,CAEhC;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAErD;IAED,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CAErD;IAEK,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,SAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAoChH;IAED,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,eAAe;IAOvB,WAAW,IAAI,cAAc,EAAE,CAM9B;IAEK,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAYnC;YAEa,eAAe;IAsC7B,OAAO,CAAC,aAAa;CAGrB","sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { McpConnectionError, McpError, McpTimeoutError, McpToolCallError } from \"./errors.js\";\nimport { McpLogger } from \"./logger.js\";\nimport type {\n\tDiscoveredTool,\n\tMcpConnection,\n\tMcpManagerEvents,\n\tMcpManagerOptions,\n\tMcpServerConfig,\n\tMcpStdioServerConfig,\n} from \"./types.js\";\n\ninterface ManagedConnection extends McpConnection {\n\tclient?: Client;\n}\n\ninterface Semaphore {\n\tcurrent: number;\n\tmax: number;\n\tqueue: Array<() => void>;\n}\n\nexport class McpManager {\n\tprivate connections = new Map<string, ManagedConnection>();\n\tprivate toolMap = new Map<string, { serverName: string; toolName: string }>();\n\tprivate readonly logger: McpLogger;\n\tprivate readonly events: McpManagerEvents;\n\tprivate readonly connectTimeoutMs: number;\n\tprivate readonly callTimeoutMs: number;\n\tprivate readonly maxReconnectAttempts: number;\n\tprivate readonly callSemaphore: Semaphore | undefined;\n\n\tprivate reconnectTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\tprivate baseReconnectDelay = 1000;\n\tprivate maxReconnectDelay = 30000;\n\n\tprivate cleanupHandler: (() => void) | undefined;\n\n\tconstructor(\n\t\toptionsOrEvents?:\n\t\t\t| McpManagerEvents\n\t\t\t| (McpManagerOptions & { onConnectionChange?: McpManagerEvents[\"onConnectionChange\"] }),\n\t) {\n\t\tconst hasOptions =\n\t\t\toptionsOrEvents &&\n\t\t\t(\"logLevel\" in optionsOrEvents ||\n\t\t\t\t\"connectTimeoutMs\" in optionsOrEvents ||\n\t\t\t\t\"callTimeoutMs\" in optionsOrEvents ||\n\t\t\t\t\"maxReconnectAttempts\" in optionsOrEvents ||\n\t\t\t\t\"maxConcurrentCalls\" in optionsOrEvents);\n\t\tconst opts = hasOptions ? (optionsOrEvents as McpManagerOptions) : undefined;\n\t\tconst eventsCallback = (optionsOrEvents as Record<string, unknown>)?.onConnectionChange as\n\t\t\t| McpManagerEvents[\"onConnectionChange\"]\n\t\t\t| undefined;\n\n\t\tthis.events = eventsCallback ? { onConnectionChange: eventsCallback } : {};\n\t\tthis.logger = new McpLogger(opts?.logLevel ?? \"info\");\n\t\tthis.connectTimeoutMs = opts?.connectTimeoutMs ?? 30_000;\n\t\tthis.callTimeoutMs = opts?.callTimeoutMs ?? 60_000;\n\t\tthis.maxReconnectAttempts = opts?.maxReconnectAttempts ?? 3;\n\t\tif (opts?.maxConcurrentCalls) {\n\t\t\tthis.callSemaphore = { current: 0, max: opts.maxConcurrentCalls, queue: [] };\n\t\t}\n\t\tthis.registerCleanup();\n\t}\n\n\tprivate registerCleanup() {\n\t\tthis.cleanupHandler = () => {\n\t\t\tthis.disconnectAll().catch(() => {});\n\t\t};\n\t\tprocess.on(\"beforeExit\", this.cleanupHandler);\n\t\tprocess.on(\"SIGTERM\", this.cleanupHandler);\n\t\tprocess.on(\"SIGINT\", this.cleanupHandler);\n\t}\n\n\tdispose(): Promise<void> {\n\t\tif (this.cleanupHandler) {\n\t\t\tprocess.off(\"beforeExit\", this.cleanupHandler);\n\t\t\tprocess.off(\"SIGTERM\", this.cleanupHandler);\n\t\t\tprocess.off(\"SIGINT\", this.cleanupHandler);\n\t\t\tthis.cleanupHandler = undefined;\n\t\t}\n\t\tfor (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n\t\tthis.reconnectTimers.clear();\n\t\treturn this.disconnectAll();\n\t}\n\n\tprivate notifyChange(conn: McpConnection) {\n\t\tthis.events.onConnectionChange?.(conn);\n\t}\n\n\tasync connectAll(servers: Record<string, McpServerConfig>): Promise<void> {\n\t\tconst entries = Object.entries(servers).filter(([_, c]) => !c.disabled);\n\t\tif (entries.length === 0) return;\n\n\t\tconst results = await Promise.allSettled(entries.map(([name, config]) => this.connectServer(name, config)));\n\n\t\tconst succeeded = results.filter((r) => r.status === \"fulfilled\").length;\n\t\tconst failed = results.filter((r) => r.status === \"rejected\").length;\n\t\tthis.logger.info(\"*\", `${succeeded} server(s) connected${failed > 0 ? `, ${failed} failed` : \"\"}`);\n\t}\n\n\tasync connectServer(name: string, config: McpServerConfig): Promise<void> {\n\t\tconst existing = this.connections.get(name);\n\t\tif (existing?.client) {\n\t\t\ttry {\n\t\t\t\tawait existing.client.close();\n\t\t\t} catch {}\n\t\t}\n\n\t\tconst entry: ManagedConnection = { name, config, status: \"connecting\", tools: [] };\n\t\tthis.connections.set(name, entry);\n\t\tthis.notifyChange(entry);\n\n\t\ttry {\n\t\t\tawait this.doConnectWithTimeout(name, config);\n\t\t} catch (e) {\n\t\t\tentry.status = \"error\";\n\t\t\tentry.error = e instanceof Error ? e.message : String(e);\n\t\t\tthis.logger.error(name, `Connection failed: ${entry.error}`);\n\t\t\tthis.notifyChange(entry);\n\t\t\tthrow e instanceof McpError ? e : new McpConnectionError(name, entry.error);\n\t\t}\n\t}\n\n\tprivate async doConnectWithTimeout(\n\t\tname: string,\n\t\tconfig: McpServerConfig,\n\t\ttimeoutMs = this.connectTimeoutMs,\n\t): Promise<void> {\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\t\ttry {\n\t\t\tawait this.doConnectServer(name, config, controller.signal);\n\t\t} catch (e) {\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\tthrow new McpTimeoutError(\"connect\", name, timeoutMs);\n\t\t\t}\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\tprivate async doConnectServer(name: string, config: McpServerConfig, signal?: AbortSignal): Promise<void> {\n\t\tconst entry = this.connections.get(name);\n\t\tif (!entry) return;\n\n\t\tconst transport = await this.createTransport(config);\n\t\tconst client = new Client({ name: \"pi-mcp\", version: \"1.0.0\" }, { capabilities: {} });\n\n\t\tawait client.connect(transport, { signal });\n\t\tconst { tools } = await client.listTools();\n\n\t\tentry.client = client;\n\t\tentry.status = \"connected\";\n\t\tentry.error = undefined;\n\n\t\tfor (const oldKey of [...this.toolMap.keys()]) {\n\t\t\tif (this.toolMap.get(oldKey)?.serverName === name) {\n\t\t\t\tthis.toolMap.delete(oldKey);\n\t\t\t}\n\t\t}\n\n\t\tentry.tools = (tools ?? []).map((tool) => {\n\t\t\tconst fullName = `mcp__${name}__${tool.name}`;\n\t\t\tthis.toolMap.set(fullName, { serverName: name, toolName: tool.name });\n\t\t\treturn {\n\t\t\t\tserverName: name,\n\t\t\t\toriginalName: tool.name,\n\t\t\t\tfullName,\n\t\t\t\tdescription: tool.description ?? \"\",\n\t\t\t\tinputSchema: (tool.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n\t\t\t};\n\t\t});\n\n\t\tthis.logger.info(name, `${entry.tools.length} tool(s) discovered`);\n\t\tthis.notifyChange(entry);\n\n\t\tclient.onclose = () => {\n\t\t\tconst conn = this.connections.get(name);\n\t\t\tif (!conn || conn.status === \"disconnected\") return;\n\t\t\tconn.status = \"error\";\n\t\t\tconn.error = \"Connection closed unexpectedly\";\n\t\t\tthis.logger.warn(name, \"Connection closed unexpectedly\");\n\t\t\tthis.notifyChange(conn);\n\t\t\tthis.scheduleReconnect(name, 0);\n\t\t};\n\n\t\tclient.onerror = (err: Error) => {\n\t\t\tconst conn = this.connections.get(name);\n\t\t\tif (!conn) return;\n\t\t\tconn.status = \"error\";\n\t\t\tconn.error = err.message;\n\t\t\tthis.logger.error(name, `Client error: ${err.message}`);\n\t\t\tthis.notifyChange(conn);\n\t\t};\n\t}\n\n\tprivate scheduleReconnect(name: string, attempt: number) {\n\t\tif (attempt >= this.maxReconnectAttempts) {\n\t\t\tthis.logger.warn(name, `Max reconnect attempts (${this.maxReconnectAttempts}) reached`);\n\t\t\treturn;\n\t\t}\n\t\tconst existing = this.reconnectTimers.get(name);\n\t\tif (existing) {\n\t\t\tclearTimeout(existing);\n\t\t}\n\n\t\tconst delay = Math.min(this.baseReconnectDelay * 2 ** attempt, this.maxReconnectDelay);\n\t\tthis.logger.info(name, `Reconnecting in ${delay}ms (attempt ${attempt + 1}/${this.maxReconnectAttempts})`);\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.reconnectTimers.delete(name);\n\t\t\tthis.reconnectServer(name, attempt + 1);\n\t\t}, delay);\n\t\tthis.reconnectTimers.set(name, timer);\n\t}\n\n\tprivate async reconnectServer(name: string, attempt: number): Promise<void> {\n\t\tconst conn = this.connections.get(name);\n\t\tif (!conn || conn.config.disabled) return;\n\n\t\tconn.status = \"connecting\";\n\t\tconn.error = undefined;\n\t\tthis.notifyChange(conn);\n\n\t\ttry {\n\t\t\tif (conn.client) {\n\t\t\t\ttry {\n\t\t\t\t\tawait conn.client.close();\n\t\t\t\t} catch {}\n\t\t\t\tconn.client = undefined;\n\t\t\t}\n\t\t\tawait this.doConnectServer(name, conn.config);\n\t\t\tthis.logger.info(name, \"Reconnected successfully\");\n\t\t} catch (e) {\n\t\t\tconn.status = \"error\";\n\t\t\tconn.error = e instanceof Error ? e.message : String(e);\n\t\t\tthis.notifyChange(conn);\n\t\t\tthis.scheduleReconnect(name, attempt);\n\t\t}\n\t}\n\n\tasync addServer(name: string, config: McpServerConfig): Promise<void> {\n\t\tawait this.connectServer(name, config);\n\t}\n\n\tasync removeServer(name: string): Promise<void> {\n\t\tconst timer = this.reconnectTimers.get(name);\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\tthis.reconnectTimers.delete(name);\n\t\t}\n\n\t\tconst conn = this.connections.get(name);\n\t\tif (conn?.client) {\n\t\t\ttry {\n\t\t\t\tawait conn.client.close();\n\t\t\t} catch {}\n\t\t}\n\n\t\tfor (const oldKey of [...this.toolMap.keys()]) {\n\t\t\tif (this.toolMap.get(oldKey)?.serverName === name) {\n\t\t\t\tthis.toolMap.delete(oldKey);\n\t\t\t}\n\t\t}\n\n\t\tthis.connections.delete(name);\n\t}\n\n\tasync setServerEnabled(name: string, enabled: boolean): Promise<void> {\n\t\tconst conn = this.connections.get(name);\n\t\tif (!conn) return;\n\n\t\tconn.config = { ...conn.config, disabled: !enabled } as McpServerConfig;\n\n\t\tif (!enabled) {\n\t\t\tconst timer = this.reconnectTimers.get(name);\n\t\t\tif (timer) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tthis.reconnectTimers.delete(name);\n\t\t\t}\n\t\t\tif (conn.client) {\n\t\t\t\ttry {\n\t\t\t\t\tawait conn.client.close();\n\t\t\t\t} catch {}\n\t\t\t\tconn.client = undefined;\n\t\t\t}\n\t\t\tconn.status = \"disconnected\";\n\t\t\tthis.notifyChange(conn);\n\t\t} else {\n\t\t\tawait this.connectServer(name, conn.config);\n\t\t}\n\t}\n\n\tasync refreshTools(serverName?: string): Promise<DiscoveredTool[]> {\n\t\tif (serverName) {\n\t\t\tconst conn = this.connections.get(serverName);\n\t\t\tif (!conn?.client) return [];\n\t\t\ttry {\n\t\t\t\tconst { tools } = await conn.client.listTools();\n\t\t\t\tfor (const oldKey of [...this.toolMap.keys()]) {\n\t\t\t\t\tif (this.toolMap.get(oldKey)?.serverName === serverName) {\n\t\t\t\t\t\tthis.toolMap.delete(oldKey);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconn.tools = (tools ?? []).map((tool) => {\n\t\t\t\t\tconst fullName = `mcp__${serverName}__${tool.name}`;\n\t\t\t\t\tthis.toolMap.set(fullName, { serverName, toolName: tool.name });\n\t\t\t\t\treturn {\n\t\t\t\t\t\tserverName,\n\t\t\t\t\t\toriginalName: tool.name,\n\t\t\t\t\t\tfullName,\n\t\t\t\t\t\tdescription: tool.description ?? \"\",\n\t\t\t\t\t\tinputSchema: (tool.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tthis.logger.info(serverName, `Refreshed: ${conn.tools.length} tool(s)`);\n\t\t\t\tthis.notifyChange(conn);\n\t\t\t} catch (e) {\n\t\t\t\tthis.logger.error(serverName, `Refresh failed: ${e instanceof Error ? e.message : String(e)}`);\n\t\t\t}\n\t\t\treturn conn.tools;\n\t\t}\n\n\t\tconst allTools: DiscoveredTool[] = [];\n\t\tfor (const [name, conn] of this.connections) {\n\t\t\tif (conn.client && conn.status === \"connected\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst { tools } = await conn.client.listTools();\n\t\t\t\t\tfor (const oldKey of [...this.toolMap.keys()]) {\n\t\t\t\t\t\tif (this.toolMap.get(oldKey)?.serverName === name) {\n\t\t\t\t\t\t\tthis.toolMap.delete(oldKey);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconn.tools = (tools ?? []).map((tool) => {\n\t\t\t\t\t\tconst fullName = `mcp__${name}__${tool.name}`;\n\t\t\t\t\t\tthis.toolMap.set(fullName, { serverName: name, toolName: tool.name });\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tserverName: name,\n\t\t\t\t\t\t\toriginalName: tool.name,\n\t\t\t\t\t\t\tfullName,\n\t\t\t\t\t\t\tdescription: tool.description ?? \"\",\n\t\t\t\t\t\t\tinputSchema: (tool.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t\tallTools.push(...conn.tools);\n\t\t\t\t\tthis.notifyChange(conn);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthis.logger.error(name, `Refresh failed: ${e instanceof Error ? e.message : String(e)}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn allTools;\n\t}\n\n\tgetConnections(): McpConnection[] {\n\t\treturn [...this.connections.values()];\n\t}\n\n\tgetConnection(name: string): McpConnection | undefined {\n\t\treturn this.connections.get(name);\n\t}\n\n\tgetToolsByServer(serverName: string): DiscoveredTool[] {\n\t\treturn this.connections.get(serverName)?.tools ?? [];\n\t}\n\n\tasync callTool(fullName: string, args: Record<string, unknown>, timeoutMs = this.callTimeoutMs): Promise<unknown> {\n\t\tconst slotPromise = this.acquireCallSlot();\n\t\tif (slotPromise) await slotPromise;\n\t\ttry {\n\t\t\tconst mapping = this.toolMap.get(fullName);\n\t\t\tif (!mapping) throw new McpToolCallError(\"\", fullName, `Unknown MCP tool: ${fullName}`);\n\n\t\t\tconst connection = this.connections.get(mapping.serverName);\n\t\t\tif (!connection?.client)\n\t\t\t\tthrow new McpToolCallError(\n\t\t\t\t\tmapping.serverName,\n\t\t\t\t\tmapping.toolName,\n\t\t\t\t\t`MCP server \"${mapping.serverName}\" not connected`,\n\t\t\t\t);\n\n\t\t\tconst controller = new AbortController();\n\t\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\t\t\ttry {\n\t\t\t\treturn await connection.client.callTool({ name: mapping.toolName, arguments: args }, undefined, {\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\tthrow new McpTimeoutError(`callTool(${fullName})`, mapping.serverName, timeoutMs);\n\t\t\t\t}\n\t\t\t\tthrow new McpToolCallError(\n\t\t\t\t\tmapping.serverName,\n\t\t\t\t\tmapping.toolName,\n\t\t\t\t\te instanceof Error ? e.message : String(e),\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.releaseCallSlot();\n\t\t}\n\t}\n\n\tprivate acquireCallSlot(): Promise<void> | undefined {\n\t\tif (!this.callSemaphore) return undefined;\n\t\tif (this.callSemaphore.current < this.callSemaphore.max) {\n\t\t\tthis.callSemaphore.current++;\n\t\t\treturn undefined;\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.callSemaphore!.queue.push(() => {\n\t\t\t\tthis.callSemaphore!.current++;\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate releaseCallSlot(): void {\n\t\tif (!this.callSemaphore) return;\n\t\tthis.callSemaphore.current--;\n\t\tconst next = this.callSemaphore.queue.shift();\n\t\tif (next) next();\n\t}\n\n\tgetAllTools(): DiscoveredTool[] {\n\t\tconst tools: DiscoveredTool[] = [];\n\t\tfor (const connection of this.connections.values()) {\n\t\t\tif (connection.status === \"connected\") tools.push(...connection.tools);\n\t\t}\n\t\treturn tools;\n\t}\n\n\tasync disconnectAll(): Promise<void> {\n\t\tfor (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n\t\tthis.reconnectTimers.clear();\n\n\t\tfor (const connection of this.connections.values()) {\n\t\t\ttry {\n\t\t\t\tif (connection.client) await connection.client.close();\n\t\t\t\tconnection.status = \"disconnected\";\n\t\t\t} catch {}\n\t\t}\n\t\tthis.connections.clear();\n\t\tthis.toolMap.clear();\n\t}\n\n\tprivate async createTransport(config: McpServerConfig) {\n\t\tif (this.isStdioConfig(config)) {\n\t\t\treturn new StdioClientTransport({\n\t\t\t\tcommand: config.command,\n\t\t\t\targs: config.args,\n\t\t\t\tenv: config.env\n\t\t\t\t\t? (Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries({ ...process.env, ...config.env }).filter(([, v]) => v !== undefined),\n\t\t\t\t\t\t) as Record<string, string>)\n\t\t\t\t\t: undefined,\n\t\t\t\tstderr: \"pipe\",\n\t\t\t});\n\t\t}\n\t\tif (config.type === \"sse\") {\n\t\t\tconst { SSEClientTransport } = await import(\"@modelcontextprotocol/sdk/client/sse.js\");\n\t\t\treturn new SSEClientTransport(\n\t\t\t\tnew URL(config.url),\n\t\t\t\tconfig.headers\n\t\t\t\t\t? {\n\t\t\t\t\t\t\trequestInit: { headers: config.headers },\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t}\n\t\tif (config.type === \"streamable-http\") {\n\t\t\tconst { StreamableHTTPClientTransport } = await import(\"@modelcontextprotocol/sdk/client/streamableHttp.js\");\n\t\t\treturn new StreamableHTTPClientTransport(\n\t\t\t\tnew URL(config.url),\n\t\t\t\tconfig.headers\n\t\t\t\t\t? {\n\t\t\t\t\t\t\trequestInit: { headers: config.headers },\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t}\n\t\tthrow new Error(`Unknown MCP transport type: ${(config as { type: string }).type}`);\n\t}\n\n\tprivate isStdioConfig(config: McpServerConfig): config is McpStdioServerConfig {\n\t\treturn \"command\" in config;\n\t}\n}\n"]}