@dexto/core 1.5.6 → 1.5.8

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 (217) hide show
  1. package/dist/agent/DextoAgent.cjs +189 -30
  2. package/dist/agent/DextoAgent.d.ts +44 -9
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +190 -31
  5. package/dist/agent/schemas.cjs +5 -0
  6. package/dist/agent/schemas.d.ts +456 -66
  7. package/dist/agent/schemas.d.ts.map +1 -1
  8. package/dist/agent/schemas.js +5 -0
  9. package/dist/context/manager.cjs +1 -1
  10. package/dist/context/manager.js +1 -1
  11. package/dist/context/utils.cjs +90 -17
  12. package/dist/context/utils.d.ts.map +1 -1
  13. package/dist/context/utils.js +90 -17
  14. package/dist/errors/types.cjs +2 -1
  15. package/dist/errors/types.d.ts +2 -1
  16. package/dist/errors/types.d.ts.map +1 -1
  17. package/dist/errors/types.js +2 -1
  18. package/dist/events/index.cjs +4 -1
  19. package/dist/events/index.d.ts +37 -2
  20. package/dist/events/index.d.ts.map +1 -1
  21. package/dist/events/index.js +4 -1
  22. package/dist/image/types.d.ts +15 -0
  23. package/dist/image/types.d.ts.map +1 -1
  24. package/dist/index.browser.d.ts +1 -1
  25. package/dist/index.browser.d.ts.map +1 -1
  26. package/dist/llm/curation-config.cjs +82 -0
  27. package/dist/llm/curation-config.d.ts +13 -0
  28. package/dist/llm/curation-config.d.ts.map +1 -0
  29. package/dist/llm/curation-config.js +59 -0
  30. package/dist/llm/curation.cjs +57 -0
  31. package/dist/llm/curation.d.ts +16 -0
  32. package/dist/llm/curation.d.ts.map +1 -0
  33. package/dist/llm/curation.js +34 -0
  34. package/dist/llm/error-codes.cjs +1 -0
  35. package/dist/llm/error-codes.d.ts +1 -0
  36. package/dist/llm/error-codes.d.ts.map +1 -1
  37. package/dist/llm/error-codes.js +1 -0
  38. package/dist/llm/errors.cjs +16 -1
  39. package/dist/llm/errors.d.ts +15 -8
  40. package/dist/llm/errors.d.ts.map +1 -1
  41. package/dist/llm/errors.js +16 -1
  42. package/dist/llm/executor/provider-options.cjs +1 -1
  43. package/dist/llm/executor/provider-options.js +1 -1
  44. package/dist/llm/executor/turn-executor.cjs +35 -2
  45. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  46. package/dist/llm/executor/turn-executor.js +35 -2
  47. package/dist/llm/index.cjs +14 -3
  48. package/dist/llm/index.d.ts +3 -1
  49. package/dist/llm/index.d.ts.map +1 -1
  50. package/dist/llm/index.js +13 -2
  51. package/dist/llm/registry/auto-update.cjs +263 -0
  52. package/dist/llm/registry/auto-update.d.ts +27 -0
  53. package/dist/llm/registry/auto-update.d.ts.map +1 -0
  54. package/dist/llm/registry/auto-update.js +227 -0
  55. package/dist/llm/registry/index.cjs +806 -0
  56. package/dist/llm/{registry.d.ts → registry/index.d.ts} +67 -13
  57. package/dist/llm/registry/index.d.ts.map +1 -0
  58. package/dist/llm/registry/index.js +756 -0
  59. package/dist/llm/registry/models.generated.cjs +4861 -0
  60. package/dist/llm/registry/models.generated.d.ts +431 -0
  61. package/dist/llm/registry/models.generated.d.ts.map +1 -0
  62. package/dist/llm/registry/models.generated.js +4838 -0
  63. package/dist/llm/registry/models.manual.cjs +44 -0
  64. package/dist/llm/registry/models.manual.d.ts +22 -0
  65. package/dist/llm/registry/models.manual.d.ts.map +1 -0
  66. package/dist/llm/registry/models.manual.js +21 -0
  67. package/dist/llm/registry/sync.cjs +354 -0
  68. package/dist/llm/registry/sync.d.ts +41 -0
  69. package/dist/llm/registry/sync.d.ts.map +1 -0
  70. package/dist/llm/registry/sync.js +328 -0
  71. package/dist/llm/resolver.cjs +29 -7
  72. package/dist/llm/resolver.d.ts +1 -1
  73. package/dist/llm/resolver.d.ts.map +1 -1
  74. package/dist/llm/resolver.js +31 -8
  75. package/dist/llm/schemas.cjs +13 -1
  76. package/dist/llm/schemas.d.ts +59 -59
  77. package/dist/llm/schemas.d.ts.map +1 -1
  78. package/dist/llm/schemas.js +14 -1
  79. package/dist/llm/services/factory.cjs +43 -27
  80. package/dist/llm/services/factory.d.ts +20 -1
  81. package/dist/llm/services/factory.d.ts.map +1 -1
  82. package/dist/llm/services/factory.js +44 -28
  83. package/dist/llm/services/test-utils.integration.cjs +5 -1
  84. package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
  85. package/dist/llm/services/test-utils.integration.js +5 -1
  86. package/dist/llm/services/vercel.cjs +4 -1
  87. package/dist/llm/services/vercel.d.ts +1 -0
  88. package/dist/llm/services/vercel.d.ts.map +1 -1
  89. package/dist/llm/services/vercel.js +4 -1
  90. package/dist/llm/types.cjs +5 -2
  91. package/dist/llm/types.d.ts +1 -1
  92. package/dist/llm/types.d.ts.map +1 -1
  93. package/dist/llm/types.js +5 -2
  94. package/dist/llm/validation.cjs +1 -1
  95. package/dist/llm/validation.js +1 -1
  96. package/dist/logger/v2/dexto-logger.cjs +4 -0
  97. package/dist/logger/v2/dexto-logger.d.ts +3 -0
  98. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  99. package/dist/logger/v2/dexto-logger.js +4 -0
  100. package/dist/logger/v2/types.d.ts +2 -0
  101. package/dist/logger/v2/types.d.ts.map +1 -1
  102. package/dist/mcp/error-codes.cjs +1 -0
  103. package/dist/mcp/error-codes.d.ts +1 -0
  104. package/dist/mcp/error-codes.d.ts.map +1 -1
  105. package/dist/mcp/error-codes.js +1 -0
  106. package/dist/mcp/errors.cjs +13 -0
  107. package/dist/mcp/errors.d.ts +7 -0
  108. package/dist/mcp/errors.d.ts.map +1 -1
  109. package/dist/mcp/errors.js +13 -0
  110. package/dist/mcp/manager.cjs +46 -4
  111. package/dist/mcp/manager.d.ts +10 -2
  112. package/dist/mcp/manager.d.ts.map +1 -1
  113. package/dist/mcp/manager.js +46 -4
  114. package/dist/mcp/mcp-client.cjs +89 -5
  115. package/dist/mcp/mcp-client.d.ts +5 -1
  116. package/dist/mcp/mcp-client.d.ts.map +1 -1
  117. package/dist/mcp/mcp-client.js +89 -5
  118. package/dist/mcp/schemas.cjs +6 -1
  119. package/dist/mcp/schemas.d.ts +1 -1
  120. package/dist/mcp/schemas.d.ts.map +1 -1
  121. package/dist/mcp/schemas.js +6 -1
  122. package/dist/mcp/types.d.ts +5 -0
  123. package/dist/mcp/types.d.ts.map +1 -1
  124. package/dist/prompts/index.d.ts +1 -1
  125. package/dist/prompts/index.d.ts.map +1 -1
  126. package/dist/prompts/prompt-manager.cjs +90 -4
  127. package/dist/prompts/prompt-manager.d.ts +16 -6
  128. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  129. package/dist/prompts/prompt-manager.js +90 -4
  130. package/dist/prompts/providers/config-prompt-provider.cjs +104 -10
  131. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  132. package/dist/prompts/providers/config-prompt-provider.js +105 -11
  133. package/dist/prompts/providers/custom-prompt-provider.cjs +1 -0
  134. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  135. package/dist/prompts/providers/custom-prompt-provider.js +1 -0
  136. package/dist/prompts/providers/mcp-prompt-provider.cjs +1 -0
  137. package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
  138. package/dist/prompts/providers/mcp-prompt-provider.js +1 -0
  139. package/dist/prompts/schemas.cjs +28 -2
  140. package/dist/prompts/schemas.d.ts +130 -0
  141. package/dist/prompts/schemas.d.ts.map +1 -1
  142. package/dist/prompts/schemas.js +28 -2
  143. package/dist/prompts/types.d.ts +55 -3
  144. package/dist/prompts/types.d.ts.map +1 -1
  145. package/dist/resources/handlers/filesystem-handler.cjs +25 -0
  146. package/dist/resources/handlers/filesystem-handler.d.ts +1 -0
  147. package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
  148. package/dist/resources/handlers/filesystem-handler.js +25 -0
  149. package/dist/session/chat-session.cjs +1 -1
  150. package/dist/session/chat-session.d.ts +1 -1
  151. package/dist/session/chat-session.d.ts.map +1 -1
  152. package/dist/session/chat-session.js +1 -1
  153. package/dist/session/index.d.ts +1 -1
  154. package/dist/session/index.d.ts.map +1 -1
  155. package/dist/session/message-queue.cjs +29 -5
  156. package/dist/session/message-queue.d.ts +3 -1
  157. package/dist/session/message-queue.d.ts.map +1 -1
  158. package/dist/session/message-queue.js +29 -5
  159. package/dist/session/session-manager.cjs +84 -3
  160. package/dist/session/session-manager.d.ts +12 -0
  161. package/dist/session/session-manager.d.ts.map +1 -1
  162. package/dist/session/session-manager.js +74 -3
  163. package/dist/session/types.d.ts +1 -0
  164. package/dist/session/types.d.ts.map +1 -1
  165. package/dist/systemPrompt/contributors.cjs +42 -0
  166. package/dist/systemPrompt/contributors.d.ts +13 -0
  167. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  168. package/dist/systemPrompt/contributors.js +41 -0
  169. package/dist/tools/errors.cjs +7 -3
  170. package/dist/tools/errors.d.ts +5 -1
  171. package/dist/tools/errors.d.ts.map +1 -1
  172. package/dist/tools/errors.js +7 -3
  173. package/dist/tools/internal-tools/constants.cjs +2 -1
  174. package/dist/tools/internal-tools/constants.d.ts +1 -1
  175. package/dist/tools/internal-tools/constants.d.ts.map +1 -1
  176. package/dist/tools/internal-tools/constants.js +2 -1
  177. package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +140 -0
  178. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +24 -0
  179. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +1 -0
  180. package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +117 -0
  181. package/dist/tools/internal-tools/provider.cjs +15 -0
  182. package/dist/tools/internal-tools/provider.d.ts +15 -1
  183. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  184. package/dist/tools/internal-tools/provider.js +15 -0
  185. package/dist/tools/internal-tools/registry.cjs +6 -0
  186. package/dist/tools/internal-tools/registry.d.ts +35 -1
  187. package/dist/tools/internal-tools/registry.d.ts.map +1 -1
  188. package/dist/tools/internal-tools/registry.js +6 -0
  189. package/dist/tools/schemas.d.ts +1 -1
  190. package/dist/tools/schemas.d.ts.map +1 -1
  191. package/dist/tools/tool-call-metadata.cjs +75 -0
  192. package/dist/tools/tool-call-metadata.d.ts +16 -0
  193. package/dist/tools/tool-call-metadata.d.ts.map +1 -0
  194. package/dist/tools/tool-call-metadata.js +51 -0
  195. package/dist/tools/tool-manager.cjs +481 -103
  196. package/dist/tools/tool-manager.d.ts +131 -9
  197. package/dist/tools/tool-manager.d.ts.map +1 -1
  198. package/dist/tools/tool-manager.js +482 -104
  199. package/dist/utils/api-key-resolver.cjs +5 -2
  200. package/dist/utils/api-key-resolver.d.ts.map +1 -1
  201. package/dist/utils/api-key-resolver.js +5 -2
  202. package/dist/utils/env.cjs +49 -0
  203. package/dist/utils/env.d.ts +4 -0
  204. package/dist/utils/env.d.ts.map +1 -0
  205. package/dist/utils/env.js +24 -0
  206. package/dist/utils/index.cjs +3 -1
  207. package/dist/utils/index.d.ts +1 -0
  208. package/dist/utils/index.d.ts.map +1 -1
  209. package/dist/utils/index.js +1 -0
  210. package/dist/utils/service-initializer.cjs +25 -7
  211. package/dist/utils/service-initializer.d.ts +24 -1
  212. package/dist/utils/service-initializer.d.ts.map +1 -1
  213. package/dist/utils/service-initializer.js +25 -7
  214. package/package.json +6 -2
  215. package/dist/llm/registry.cjs +0 -1631
  216. package/dist/llm/registry.d.ts.map +0 -1
  217. package/dist/llm/registry.js +0 -1586
@@ -6,6 +6,7 @@ import {
6
6
  var _DextoAgent_decorators, _init;
7
7
  import { randomUUID } from "crypto";
8
8
  import { setMaxListeners } from "events";
9
+ import { SkillsContributor } from "../systemPrompt/contributors.js";
9
10
  import { expandMessageReferences } from "../resources/index.js";
10
11
  import { expandBlobReferences } from "../context/utils.js";
11
12
  import { PromptManager } from "../prompts/index.js";
@@ -20,6 +21,7 @@ import { validateInputForLLM } from "../llm/validation.js";
20
21
  import { LLMError } from "../llm/errors.js";
21
22
  import { AgentError } from "./errors.js";
22
23
  import { MCPError } from "../mcp/errors.js";
24
+ import { MCPErrorCode } from "../mcp/error-codes.js";
23
25
  import { DextoRuntimeError } from "../errors/DextoRuntimeError.js";
24
26
  import { DextoValidationError } from "../errors/DextoValidationError.js";
25
27
  import { ensureOk } from "../errors/result-bridge.js";
@@ -29,8 +31,8 @@ import {
29
31
  getSupportedProviders,
30
32
  getDefaultModelForProvider,
31
33
  getProviderFromModel,
32
- LLM_REGISTRY
33
- } from "../llm/registry.js";
34
+ getAllModelsForProvider
35
+ } from "../llm/registry/index.js";
34
36
  import { createAgentServices } from "../utils/service-initializer.js";
35
37
  import { AgentConfigSchema, createAgentConfigSchema } from "./schemas.js";
36
38
  import {
@@ -78,6 +80,25 @@ class DextoAgent {
78
80
  agentId: this.config.agentId,
79
81
  component: DextoLogComponent.AGENT
80
82
  });
83
+ const serviceOverrides = {};
84
+ if (options?.sessionLoggerFactory) {
85
+ serviceOverrides.sessionLoggerFactory = options.sessionLoggerFactory;
86
+ }
87
+ if (options && "mcpAuthProviderFactory" in options) {
88
+ serviceOverrides.mcpAuthProviderFactory = options.mcpAuthProviderFactory ?? null;
89
+ }
90
+ if (options?.toolManager) {
91
+ serviceOverrides.toolManager = options.toolManager;
92
+ }
93
+ if (options?.toolManagerFactory) {
94
+ serviceOverrides.toolManagerFactory = options.toolManagerFactory;
95
+ }
96
+ if (Object.keys(serviceOverrides).length > 0) {
97
+ this.serviceOverrides = serviceOverrides;
98
+ }
99
+ if (options?.mcpAuthProviderFactory) {
100
+ this.mcpAuthProviderFactory = options.mcpAuthProviderFactory;
101
+ }
81
102
  this.agentEventBus = new AgentEventBus();
82
103
  this.logger.info("DextoAgent created.");
83
104
  }
@@ -110,8 +131,11 @@ class DextoAgent {
110
131
  // Approval handler for manual tool confirmation and elicitation
111
132
  // Set via setApprovalHandler() before start() if needed
112
133
  approvalHandler;
134
+ mcpAuthProviderFactory = null;
113
135
  // Active stream controllers per session - allows cancel() to abort iterators
114
136
  activeStreamControllers = /* @__PURE__ */ new Map();
137
+ // Host overrides for service initialization (e.g. session logger factory)
138
+ serviceOverrides;
115
139
  // Logger instance for this agent (dependency injection)
116
140
  logger;
117
141
  /**
@@ -131,8 +155,12 @@ class DextoAgent {
131
155
  this.config,
132
156
  this.configPath,
133
157
  this.logger,
134
- this.agentEventBus
158
+ this.agentEventBus,
159
+ this.serviceOverrides
135
160
  );
161
+ if (this.mcpAuthProviderFactory) {
162
+ services.mcpManager.setAuthProviderFactory(this.mcpAuthProviderFactory);
163
+ }
136
164
  for (const service of requiredServices) {
137
165
  if (!services[service]) {
138
166
  throw AgentError.initializationFailed(
@@ -170,9 +198,6 @@ Either:
170
198
  memoryManager: services.memoryManager,
171
199
  services
172
200
  });
173
- services.toolManager.setAgent(this);
174
- await services.toolManager.initialize();
175
- this.searchService = services.searchService;
176
201
  const promptManager = new PromptManager(
177
202
  this.mcpManager,
178
203
  this.resourceManager,
@@ -183,6 +208,21 @@ Either:
183
208
  );
184
209
  await promptManager.initialize();
185
210
  Object.assign(this, { promptManager });
211
+ services.toolManager.setAgent(this);
212
+ services.toolManager.setPromptManager(promptManager);
213
+ if (this.config.internalTools?.includes("invoke_skill")) {
214
+ const skillsContributor = new SkillsContributor(
215
+ "skills",
216
+ 50,
217
+ // Priority after memories (40) but before most other content
218
+ promptManager,
219
+ this.logger
220
+ );
221
+ services.systemPromptManager.addContributor(skillsContributor);
222
+ this.logger.debug("Added SkillsContributor to system prompt");
223
+ }
224
+ await services.toolManager.initialize();
225
+ this.searchService = services.searchService;
186
226
  this._isStarted = true;
187
227
  this._isStopped = false;
188
228
  this.logger.info("DextoAgent started successfully.");
@@ -258,6 +298,7 @@ Either:
258
298
  } else {
259
299
  this.logger.info("DextoAgent stopped successfully.");
260
300
  }
301
+ this.agentEventBus.emit("agent:stopped");
261
302
  } catch (error) {
262
303
  this.logger.error("Failed to stop DextoAgent", {
263
304
  error: error instanceof Error ? error.message : String(error)
@@ -941,6 +982,7 @@ Either:
941
982
  */
942
983
  async endSession(sessionId) {
943
984
  this.ensureStarted();
985
+ this.toolManager.clearSessionAutoApproveTools(sessionId);
944
986
  return this.sessionManager.endSession(sessionId);
945
987
  }
946
988
  /**
@@ -950,6 +992,7 @@ Either:
950
992
  */
951
993
  async deleteSession(sessionId) {
952
994
  this.ensureStarted();
995
+ this.toolManager.clearSessionAutoApproveTools(sessionId);
953
996
  return this.sessionManager.deleteSession(sessionId);
954
997
  }
955
998
  /**
@@ -1178,7 +1221,7 @@ Either:
1178
1221
  return null;
1179
1222
  }
1180
1223
  const contributorContext = { mcpManager: this.mcpManager };
1181
- const tools = await llmService.getAllTools();
1224
+ const tools = await llmService.getEnabledTools();
1182
1225
  const beforeEstimate = await contextManager.getContextTokenEstimate(
1183
1226
  contributorContext,
1184
1227
  tools
@@ -1253,7 +1296,7 @@ Either:
1253
1296
  const contextManager = session.getContextManager();
1254
1297
  const contributorContext = { mcpManager: this.mcpManager };
1255
1298
  const llmService = session.getLLMService();
1256
- const tools = await llmService.getAllTools();
1299
+ const tools = await llmService.getEnabledTools();
1257
1300
  const tokenEstimate = await contextManager.getContextTokenEstimate(
1258
1301
  contributorContext,
1259
1302
  tools
@@ -1274,7 +1317,7 @@ Either:
1274
1317
  (msg) => msg.metadata?.isSummary === true || msg.metadata?.isSessionSummary === true
1275
1318
  );
1276
1319
  const llmConfig = runtimeConfig.llm;
1277
- const { getModelDisplayName } = await import("../llm/registry.js");
1320
+ const { getModelDisplayName } = await import("../llm/registry/index.js");
1278
1321
  const modelDisplayName = getModelDisplayName(llmConfig.model, llmConfig.provider);
1279
1322
  const estimatedTokens = tokenEstimate.estimated;
1280
1323
  const autoCompactBuffer = thresholdPercent > 0 && thresholdPercent < 1 ? Math.floor(maxContextTokens * (1 - thresholdPercent) / thresholdPercent) : 0;
@@ -1306,11 +1349,17 @@ Either:
1306
1349
  // ============= LLM MANAGEMENT =============
1307
1350
  /**
1308
1351
  * Gets the current LLM configuration with all defaults applied.
1352
+ * @param sessionId Optional session ID to get config for specific session
1309
1353
  * @returns Current LLM configuration
1310
1354
  */
1311
- getCurrentLLMConfig() {
1355
+ getCurrentLLMConfig(sessionId) {
1312
1356
  this.ensureStarted();
1313
- return structuredClone(this.stateManager.getLLMConfig());
1357
+ if (sessionId !== void 0 && (!sessionId || typeof sessionId !== "string")) {
1358
+ throw AgentError.apiValidationError(
1359
+ "sessionId must be a non-empty string when provided"
1360
+ );
1361
+ }
1362
+ return structuredClone(this.stateManager.getLLMConfig(sessionId));
1314
1363
  }
1315
1364
  /**
1316
1365
  * Switches the LLM service while preserving conversation history.
@@ -1433,20 +1482,16 @@ Either:
1433
1482
  */
1434
1483
  getSupportedModels() {
1435
1484
  const result = {};
1436
- const providers = getSupportedProviders();
1437
- for (const provider of providers) {
1438
- const defaultModel = getDefaultModelForProvider(provider);
1439
- const providerInfo = LLM_REGISTRY[provider];
1440
- result[provider] = providerInfo.models.map((model) => ({
1441
- ...model,
1442
- isDefault: model.name === defaultModel
1443
- }));
1485
+ for (const provider of this.getSupportedProviders()) {
1486
+ result[provider] = this.getSupportedModelsForProvider(provider);
1444
1487
  }
1445
1488
  return result;
1446
1489
  }
1447
1490
  /**
1448
1491
  * Gets supported models for a specific provider.
1449
1492
  * Returns model information including metadata for the specified provider only.
1493
+ * For gateway providers like 'dexto-nova' with supportsAllRegistryModels, returns
1494
+ * all models from all accessible providers with their original provider info.
1450
1495
  *
1451
1496
  * @param provider The provider to get models for
1452
1497
  * @returns Array of model information for the specified provider
@@ -1464,12 +1509,15 @@ Either:
1464
1509
  * ```
1465
1510
  */
1466
1511
  getSupportedModelsForProvider(provider) {
1467
- const defaultModel = getDefaultModelForProvider(provider);
1468
- const providerInfo = LLM_REGISTRY[provider];
1469
- return providerInfo.models.map((model) => ({
1470
- ...model,
1471
- isDefault: model.name === defaultModel
1472
- }));
1512
+ const models = getAllModelsForProvider(provider);
1513
+ return models.map((model) => {
1514
+ const originalProvider = "originalProvider" in model ? model.originalProvider : provider;
1515
+ const defaultModel = getDefaultModelForProvider(originalProvider ?? provider);
1516
+ return {
1517
+ ...model,
1518
+ isDefault: model.name === defaultModel
1519
+ };
1520
+ });
1473
1521
  }
1474
1522
  /**
1475
1523
  * Infers the provider from a model name.
@@ -1651,6 +1699,13 @@ Either:
1651
1699
  throw error;
1652
1700
  }
1653
1701
  }
1702
+ getMcpAuthProvider(name) {
1703
+ if (!name || typeof name !== "string") {
1704
+ throw AgentError.apiValidationError("name is required and must be a non-empty string");
1705
+ }
1706
+ this.ensureStarted();
1707
+ return this.mcpManager.getAuthProvider(name);
1708
+ }
1654
1709
  /**
1655
1710
  * Executes a tool from any source (MCP servers, custom tools, or internal tools).
1656
1711
  * This is the unified interface for tool execution that can handle all tool types.
@@ -1694,6 +1749,90 @@ Either:
1694
1749
  this.ensureStarted();
1695
1750
  return await this.toolManager.getAllTools();
1696
1751
  }
1752
+ /**
1753
+ * Gets tools enabled for LLM context (applies session overrides + global preferences).
1754
+ */
1755
+ async getEnabledTools(sessionId) {
1756
+ this.ensureStarted();
1757
+ if (sessionId !== void 0 && (!sessionId || typeof sessionId !== "string")) {
1758
+ throw AgentError.apiValidationError("sessionId must be a non-empty string");
1759
+ }
1760
+ return this.toolManager.filterToolsForSession(
1761
+ await this.toolManager.getAllTools(),
1762
+ sessionId
1763
+ );
1764
+ }
1765
+ /**
1766
+ * Get global disabled tools (agent preferences).
1767
+ */
1768
+ getGlobalDisabledTools() {
1769
+ this.ensureStarted();
1770
+ return this.toolManager.getGlobalDisabledTools();
1771
+ }
1772
+ /**
1773
+ * Set global disabled tools (agent preferences).
1774
+ */
1775
+ setGlobalDisabledTools(toolNames) {
1776
+ this.ensureStarted();
1777
+ if (!Array.isArray(toolNames) || toolNames.some((name) => !name || typeof name !== "string")) {
1778
+ throw AgentError.apiValidationError("toolNames must be an array of non-empty strings");
1779
+ }
1780
+ this.toolManager.setGlobalDisabledTools(toolNames);
1781
+ }
1782
+ /**
1783
+ * Set session-level disabled tools (session override).
1784
+ */
1785
+ setSessionDisabledTools(sessionId, toolNames) {
1786
+ this.ensureStarted();
1787
+ if (!sessionId || typeof sessionId !== "string") {
1788
+ throw AgentError.apiValidationError(
1789
+ "sessionId is required and must be a non-empty string"
1790
+ );
1791
+ }
1792
+ if (!Array.isArray(toolNames) || toolNames.some((name) => !name || typeof name !== "string")) {
1793
+ throw AgentError.apiValidationError("toolNames must be an array of non-empty strings");
1794
+ }
1795
+ this.toolManager.setSessionDisabledTools(sessionId, toolNames);
1796
+ }
1797
+ /**
1798
+ * Clear session-level disabled tools (session override).
1799
+ */
1800
+ clearSessionDisabledTools(sessionId) {
1801
+ this.ensureStarted();
1802
+ if (!sessionId || typeof sessionId !== "string") {
1803
+ throw AgentError.apiValidationError(
1804
+ "sessionId is required and must be a non-empty string"
1805
+ );
1806
+ }
1807
+ this.toolManager.clearSessionDisabledTools(sessionId);
1808
+ }
1809
+ /**
1810
+ * Get session-level auto-approve tools.
1811
+ */
1812
+ getSessionAutoApproveTools(sessionId) {
1813
+ this.ensureStarted();
1814
+ if (!sessionId || typeof sessionId !== "string") {
1815
+ throw AgentError.apiValidationError(
1816
+ "sessionId is required and must be a non-empty string"
1817
+ );
1818
+ }
1819
+ return this.toolManager.getSessionUserAutoApproveTools(sessionId) ?? [];
1820
+ }
1821
+ /**
1822
+ * Set session-level auto-approve tools (user selection).
1823
+ */
1824
+ setSessionAutoApproveTools(sessionId, toolNames) {
1825
+ this.ensureStarted();
1826
+ if (!sessionId || typeof sessionId !== "string") {
1827
+ throw AgentError.apiValidationError(
1828
+ "sessionId is required and must be a non-empty string"
1829
+ );
1830
+ }
1831
+ if (!Array.isArray(toolNames) || toolNames.some((name) => !name || typeof name !== "string")) {
1832
+ throw AgentError.apiValidationError("toolNames must be an array of non-empty strings");
1833
+ }
1834
+ this.toolManager.setSessionUserAutoApproveTools(sessionId, toolNames);
1835
+ }
1697
1836
  /**
1698
1837
  * Gets all connected MCP clients.
1699
1838
  * Used by the API layer to inspect client status.
@@ -1710,7 +1849,10 @@ Either:
1710
1849
  */
1711
1850
  getMcpFailedConnections() {
1712
1851
  this.ensureStarted();
1713
- return this.mcpManager.getFailedConnections();
1852
+ const failures = this.mcpManager.getFailedConnections();
1853
+ return Object.fromEntries(
1854
+ Object.entries(failures).map(([name, error]) => [name, error.message])
1855
+ );
1714
1856
  }
1715
1857
  /**
1716
1858
  * Gets the connection status of a single MCP server.
@@ -1734,7 +1876,12 @@ Either:
1734
1876
  } else if (connectedClients.has(name)) {
1735
1877
  status = "connected";
1736
1878
  } else {
1737
- status = "error";
1879
+ const errorCode = this.mcpManager.getFailedConnectionErrorCode(name);
1880
+ if (errorCode === MCPErrorCode.AUTH_REQUIRED) {
1881
+ status = "auth-required";
1882
+ } else {
1883
+ status = "error";
1884
+ }
1738
1885
  }
1739
1886
  const result = {
1740
1887
  name,
@@ -1743,7 +1890,7 @@ Either:
1743
1890
  status
1744
1891
  };
1745
1892
  if (failedConnections[name]) {
1746
- result.error = failedConnections[name];
1893
+ result.error = failedConnections[name].message;
1747
1894
  }
1748
1895
  return result;
1749
1896
  }
@@ -1770,7 +1917,12 @@ Either:
1770
1917
  } else if (connectedClients.has(name)) {
1771
1918
  status = "connected";
1772
1919
  } else {
1773
- status = "error";
1920
+ const errorCode = this.mcpManager.getFailedConnectionErrorCode(name);
1921
+ if (errorCode === MCPErrorCode.AUTH_REQUIRED) {
1922
+ status = "auth-required";
1923
+ } else {
1924
+ status = "error";
1925
+ }
1774
1926
  }
1775
1927
  const server = {
1776
1928
  name,
@@ -1779,7 +1931,7 @@ Either:
1779
1931
  status
1780
1932
  };
1781
1933
  if (failedConnections[name]) {
1782
- server.error = failedConnections[name];
1934
+ server.error = failedConnections[name].message;
1783
1935
  }
1784
1936
  servers.push(server);
1785
1937
  }
@@ -1928,10 +2080,11 @@ Either:
1928
2080
  * - Prompt key resolution (resolving aliases)
1929
2081
  * - Argument normalization (including special _context field)
1930
2082
  * - Prompt execution and flattening
2083
+ * - Returning per-prompt overrides (allowedTools, model) for the invoker to apply
1931
2084
  *
1932
2085
  * @param name The prompt name or alias
1933
2086
  * @param options Optional configuration for prompt resolution
1934
- * @returns Promise resolving to the resolved text and resource URIs
2087
+ * @returns Promise resolving to the resolved text, resource URIs, and optional overrides
1935
2088
  */
1936
2089
  async resolvePrompt(name, options = {}) {
1937
2090
  this.ensureStarted();
@@ -2067,6 +2220,12 @@ Either:
2067
2220
  }
2068
2221
  this.logger.debug("Approval handler registered");
2069
2222
  }
2223
+ setMcpAuthProviderFactory(factory) {
2224
+ this.mcpAuthProviderFactory = factory;
2225
+ if (this._isStarted && this.services) {
2226
+ this.services.mcpManager.setAuthProviderFactory(factory);
2227
+ }
2228
+ }
2070
2229
  /**
2071
2230
  * Clear the current approval handler.
2072
2231
  *
@@ -191,6 +191,11 @@ function createAgentConfigSchema(options = {}) {
191
191
  memories: import_schemas3.MemoriesConfigSchema.describe(
192
192
  "Memory configuration for system prompt inclusion (optional feature)"
193
193
  ).optional(),
194
+ agentFile: import_zod.z.object({
195
+ discoverInCwd: import_zod.z.boolean().default(true).describe(
196
+ "Whether to discover AGENTS.md/CLAUDE.md/GEMINI.md in the current working directory and include it in the system prompt"
197
+ )
198
+ }).strict().default({}).describe("Agent instruction file discovery configuration"),
194
199
  image: import_zod.z.string().describe(
195
200
  'Image package that provides required providers (e.g., "@dexto/image-local"). Optional - platform can load images via CLI flag, environment variable, or static imports.'
196
201
  ).optional(),