@dexto/core 1.5.7 → 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 (128) hide show
  1. package/dist/agent/DextoAgent.cjs +96 -5
  2. package/dist/agent/DextoAgent.d.ts +32 -7
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +96 -5
  5. package/dist/agent/schemas.cjs +5 -0
  6. package/dist/agent/schemas.d.ts +60 -21
  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 +69 -42
  12. package/dist/context/utils.d.ts.map +1 -1
  13. package/dist/context/utils.js +69 -42
  14. package/dist/events/index.cjs +4 -1
  15. package/dist/events/index.d.ts +37 -2
  16. package/dist/events/index.d.ts.map +1 -1
  17. package/dist/events/index.js +4 -1
  18. package/dist/index.browser.d.ts +1 -1
  19. package/dist/index.browser.d.ts.map +1 -1
  20. package/dist/llm/curation-config.cjs +82 -0
  21. package/dist/llm/curation-config.d.ts +13 -0
  22. package/dist/llm/curation-config.d.ts.map +1 -0
  23. package/dist/llm/curation-config.js +59 -0
  24. package/dist/llm/curation.cjs +57 -0
  25. package/dist/llm/curation.d.ts +16 -0
  26. package/dist/llm/curation.d.ts.map +1 -0
  27. package/dist/llm/curation.js +34 -0
  28. package/dist/llm/errors.cjs +1 -1
  29. package/dist/llm/errors.d.ts +8 -8
  30. package/dist/llm/errors.js +1 -1
  31. package/dist/llm/executor/provider-options.cjs +1 -1
  32. package/dist/llm/executor/provider-options.js +1 -1
  33. package/dist/llm/executor/turn-executor.cjs +8 -2
  34. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  35. package/dist/llm/executor/turn-executor.js +8 -2
  36. package/dist/llm/index.cjs +14 -3
  37. package/dist/llm/index.d.ts +3 -1
  38. package/dist/llm/index.d.ts.map +1 -1
  39. package/dist/llm/index.js +13 -2
  40. package/dist/llm/registry/auto-update.cjs +263 -0
  41. package/dist/llm/registry/auto-update.d.ts +27 -0
  42. package/dist/llm/registry/auto-update.d.ts.map +1 -0
  43. package/dist/llm/registry/auto-update.js +227 -0
  44. package/dist/llm/registry/index.cjs +806 -0
  45. package/dist/llm/{registry.d.ts → registry/index.d.ts} +19 -41
  46. package/dist/llm/registry/index.d.ts.map +1 -0
  47. package/dist/llm/registry/index.js +756 -0
  48. package/dist/llm/registry/models.generated.cjs +4861 -0
  49. package/dist/llm/registry/models.generated.d.ts +431 -0
  50. package/dist/llm/registry/models.generated.d.ts.map +1 -0
  51. package/dist/llm/registry/models.generated.js +4838 -0
  52. package/dist/llm/registry/models.manual.cjs +44 -0
  53. package/dist/llm/registry/models.manual.d.ts +22 -0
  54. package/dist/llm/registry/models.manual.d.ts.map +1 -0
  55. package/dist/llm/registry/models.manual.js +21 -0
  56. package/dist/llm/registry/sync.cjs +354 -0
  57. package/dist/llm/registry/sync.d.ts +41 -0
  58. package/dist/llm/registry/sync.d.ts.map +1 -0
  59. package/dist/llm/registry/sync.js +328 -0
  60. package/dist/llm/resolver.cjs +27 -18
  61. package/dist/llm/resolver.d.ts +1 -1
  62. package/dist/llm/resolver.d.ts.map +1 -1
  63. package/dist/llm/resolver.js +28 -20
  64. package/dist/llm/schemas.cjs +13 -1
  65. package/dist/llm/schemas.d.ts +23 -23
  66. package/dist/llm/schemas.d.ts.map +1 -1
  67. package/dist/llm/schemas.js +14 -1
  68. package/dist/llm/services/factory.cjs +4 -4
  69. package/dist/llm/services/factory.d.ts.map +1 -1
  70. package/dist/llm/services/factory.js +4 -4
  71. package/dist/llm/services/test-utils.integration.cjs +1 -1
  72. package/dist/llm/services/test-utils.integration.js +1 -1
  73. package/dist/llm/services/vercel.cjs +4 -1
  74. package/dist/llm/services/vercel.d.ts +1 -0
  75. package/dist/llm/services/vercel.d.ts.map +1 -1
  76. package/dist/llm/services/vercel.js +4 -1
  77. package/dist/llm/types.cjs +1 -1
  78. package/dist/llm/types.d.ts +1 -1
  79. package/dist/llm/types.d.ts.map +1 -1
  80. package/dist/llm/types.js +1 -1
  81. package/dist/llm/validation.cjs +1 -1
  82. package/dist/llm/validation.js +1 -1
  83. package/dist/resources/handlers/filesystem-handler.cjs +25 -0
  84. package/dist/resources/handlers/filesystem-handler.d.ts +1 -0
  85. package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
  86. package/dist/resources/handlers/filesystem-handler.js +25 -0
  87. package/dist/session/chat-session.cjs +1 -1
  88. package/dist/session/chat-session.js +1 -1
  89. package/dist/session/message-queue.cjs +29 -5
  90. package/dist/session/message-queue.d.ts +3 -1
  91. package/dist/session/message-queue.d.ts.map +1 -1
  92. package/dist/session/message-queue.js +29 -5
  93. package/dist/session/session-manager.cjs +40 -3
  94. package/dist/session/session-manager.d.ts +3 -1
  95. package/dist/session/session-manager.d.ts.map +1 -1
  96. package/dist/session/session-manager.js +30 -3
  97. package/dist/session/types.d.ts +1 -0
  98. package/dist/session/types.d.ts.map +1 -1
  99. package/dist/tools/internal-tools/provider.d.ts +3 -1
  100. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  101. package/dist/tools/internal-tools/registry.d.ts +1 -1
  102. package/dist/tools/internal-tools/registry.d.ts.map +1 -1
  103. package/dist/tools/tool-call-metadata.cjs +75 -0
  104. package/dist/tools/tool-call-metadata.d.ts +16 -0
  105. package/dist/tools/tool-call-metadata.d.ts.map +1 -0
  106. package/dist/tools/tool-call-metadata.js +51 -0
  107. package/dist/tools/tool-manager.cjs +257 -30
  108. package/dist/tools/tool-manager.d.ts +43 -2
  109. package/dist/tools/tool-manager.d.ts.map +1 -1
  110. package/dist/tools/tool-manager.js +257 -30
  111. package/dist/utils/api-key-resolver.cjs +1 -1
  112. package/dist/utils/api-key-resolver.js +1 -1
  113. package/dist/utils/env.cjs +49 -0
  114. package/dist/utils/env.d.ts +4 -0
  115. package/dist/utils/env.d.ts.map +1 -0
  116. package/dist/utils/env.js +24 -0
  117. package/dist/utils/index.cjs +3 -1
  118. package/dist/utils/index.d.ts +1 -0
  119. package/dist/utils/index.d.ts.map +1 -1
  120. package/dist/utils/index.js +1 -0
  121. package/dist/utils/service-initializer.cjs +17 -5
  122. package/dist/utils/service-initializer.d.ts +23 -4
  123. package/dist/utils/service-initializer.d.ts.map +1 -1
  124. package/dist/utils/service-initializer.js +17 -5
  125. package/package.json +6 -2
  126. package/dist/llm/registry.cjs +0 -2075
  127. package/dist/llm/registry.d.ts.map +0 -1
  128. package/dist/llm/registry.js +0 -2025
@@ -11,11 +11,13 @@ import { DextoRuntimeError } from "../errors/index.js";
11
11
  import { DextoLogComponent } from "../logger/v2/types.js";
12
12
  import { ApprovalStatus, ApprovalType, DenialReason } from "../approval/types.js";
13
13
  import { InstrumentClass } from "../telemetry/decorators.js";
14
+ import { extractToolCallMeta, wrapToolParametersSchema } from "./tool-call-metadata.js";
14
15
  import {
15
16
  generateBashPatternKey,
16
17
  generateBashPatternSuggestions,
17
18
  isDangerousCommand
18
19
  } from "./bash-pattern-utils.js";
20
+ import { isBackgroundTasksEnabled } from "../utils/env.js";
19
21
  _ToolManager_decorators = [InstrumentClass({
20
22
  prefix: "tool",
21
23
  excludeMethods: [
@@ -49,6 +51,10 @@ let _ToolManager = class _ToolManager {
49
51
  // When a skill with allowedTools is invoked, those tools are auto-approved (skip confirmation)
50
52
  // This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow
51
53
  sessionAutoApproveTools = /* @__PURE__ */ new Map();
54
+ // Session-level auto-approve tools set by users (UI)
55
+ sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
56
+ sessionDisabledTools = /* @__PURE__ */ new Map();
57
+ globalDisabledTools = [];
52
58
  constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, options, logger) {
53
59
  this.mcpManager = mcpManager;
54
60
  this.approvalManager = approvalManager;
@@ -143,6 +149,30 @@ let _ToolManager = class _ToolManager {
143
149
  );
144
150
  this.logger.debug(`Auto-approve tools: ${autoApproveTools.join(", ")}`);
145
151
  }
152
+ /**
153
+ * Set session-level auto-approve tools chosen by the user.
154
+ */
155
+ setSessionUserAutoApproveTools(sessionId, autoApproveTools) {
156
+ if (autoApproveTools.length === 0) {
157
+ this.clearSessionUserAutoApproveTools(sessionId);
158
+ return;
159
+ }
160
+ this.sessionUserAutoApproveTools.set(sessionId, autoApproveTools);
161
+ this.logger.info(
162
+ `Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
163
+ );
164
+ this.logger.debug(`User auto-approve tools: ${autoApproveTools.join(", ")}`);
165
+ }
166
+ /**
167
+ * Clear session-level auto-approve tools chosen by the user.
168
+ */
169
+ clearSessionUserAutoApproveTools(sessionId) {
170
+ const hadAutoApprove = this.sessionUserAutoApproveTools.has(sessionId);
171
+ this.sessionUserAutoApproveTools.delete(sessionId);
172
+ if (hadAutoApprove) {
173
+ this.logger.info(`Session user auto-approve tools cleared for '${sessionId}'`);
174
+ }
175
+ }
146
176
  /**
147
177
  * Clear session-level auto-approve tools.
148
178
  * Call this when the session ends or when the skill completes.
@@ -156,6 +186,76 @@ let _ToolManager = class _ToolManager {
156
186
  this.logger.info(`Session auto-approve tools cleared for '${sessionId}'`);
157
187
  }
158
188
  }
189
+ hasSessionUserAutoApproveTools(sessionId) {
190
+ return this.sessionUserAutoApproveTools.has(sessionId);
191
+ }
192
+ // ============= ENABLED/DISABLED TOOLS =============
193
+ /**
194
+ * Set global disabled tools (agent-level preferences).
195
+ */
196
+ setGlobalDisabledTools(toolNames) {
197
+ this.globalDisabledTools = [...toolNames];
198
+ this.logger.info("Global disabled tools updated", {
199
+ count: toolNames.length
200
+ });
201
+ this.agentEventBus.emit("tools:enabled-updated", {
202
+ scope: "global",
203
+ disabledTools: [...this.globalDisabledTools]
204
+ });
205
+ }
206
+ getGlobalDisabledTools() {
207
+ return [...this.globalDisabledTools];
208
+ }
209
+ /**
210
+ * Set session-level disabled tools (overrides global list).
211
+ */
212
+ setSessionDisabledTools(sessionId, toolNames) {
213
+ if (toolNames.length === 0) {
214
+ this.clearSessionDisabledTools(sessionId);
215
+ return;
216
+ }
217
+ this.sessionDisabledTools.set(sessionId, [...toolNames]);
218
+ this.logger.info("Session disabled tools updated", {
219
+ sessionId,
220
+ count: toolNames.length
221
+ });
222
+ this.agentEventBus.emit("tools:enabled-updated", {
223
+ scope: "session",
224
+ sessionId,
225
+ disabledTools: [...toolNames]
226
+ });
227
+ }
228
+ /**
229
+ * Clear session-level disabled tools.
230
+ */
231
+ clearSessionDisabledTools(sessionId) {
232
+ const hadOverrides = this.sessionDisabledTools.has(sessionId);
233
+ this.sessionDisabledTools.delete(sessionId);
234
+ if (hadOverrides) {
235
+ this.logger.info("Session disabled tools cleared", { sessionId });
236
+ }
237
+ }
238
+ /**
239
+ * Get disabled tools for a session (session override wins).
240
+ */
241
+ getDisabledTools(sessionId) {
242
+ if (sessionId && this.sessionDisabledTools.has(sessionId)) {
243
+ return this.sessionDisabledTools.get(sessionId) ?? [];
244
+ }
245
+ return this.globalDisabledTools;
246
+ }
247
+ /**
248
+ * Filter a tool set based on disabled tools for a session.
249
+ */
250
+ filterToolsForSession(toolSet, sessionId) {
251
+ const disabled = new Set(this.getDisabledTools(sessionId));
252
+ if (disabled.size === 0) {
253
+ return toolSet;
254
+ }
255
+ return Object.fromEntries(
256
+ Object.entries(toolSet).filter(([toolName]) => !disabled.has(toolName))
257
+ );
258
+ }
159
259
  /**
160
260
  * Check if a session has auto-approve tools set.
161
261
  *
@@ -166,7 +266,7 @@ let _ToolManager = class _ToolManager {
166
266
  return this.sessionAutoApproveTools.has(sessionId);
167
267
  }
168
268
  /**
169
- * Get the auto-approve tools for a session.
269
+ * Get the auto-approve tools for a session (skill-provided list).
170
270
  *
171
271
  * @param sessionId The session ID to check
172
272
  * @returns Array of auto-approve tool names, or undefined if none set
@@ -174,6 +274,21 @@ let _ToolManager = class _ToolManager {
174
274
  getSessionAutoApproveTools(sessionId) {
175
275
  return this.sessionAutoApproveTools.get(sessionId);
176
276
  }
277
+ /**
278
+ * Get the user auto-approve tools for a session.
279
+ */
280
+ getSessionUserAutoApproveTools(sessionId) {
281
+ return this.sessionUserAutoApproveTools.get(sessionId);
282
+ }
283
+ /**
284
+ * Combined auto-approve list for a session.
285
+ */
286
+ getCombinedSessionAutoApproveTools(sessionId) {
287
+ return [
288
+ ...this.sessionAutoApproveTools.get(sessionId) ?? [],
289
+ ...this.sessionUserAutoApproveTools.get(sessionId) ?? []
290
+ ];
291
+ }
177
292
  /**
178
293
  * Check if a tool should be auto-approved for a session.
179
294
  * Returns true if the tool is in the session's auto-approve list.
@@ -183,8 +298,8 @@ let _ToolManager = class _ToolManager {
183
298
  * @returns true if the tool should be auto-approved
184
299
  */
185
300
  isToolAutoApprovedForSession(sessionId, toolName) {
186
- const autoApproveTools = this.sessionAutoApproveTools.get(sessionId);
187
- if (!autoApproveTools) {
301
+ const autoApproveTools = this.getCombinedSessionAutoApproveTools(sessionId);
302
+ if (autoApproveTools.length === 0) {
188
303
  return false;
189
304
  }
190
305
  return autoApproveTools.some((pattern) => this.matchesToolPolicy(toolName, pattern));
@@ -381,7 +496,8 @@ let _ToolManager = class _ToolManager {
381
496
  allTools[qualifiedName] = {
382
497
  ...toolDef,
383
498
  name: qualifiedName,
384
- description: `${toolDef.description || "No description provided"} (internal tool)`
499
+ description: `${toolDef.description || "No description provided"} (internal tool)`,
500
+ parameters: wrapToolParametersSchema(toolDef.parameters)
385
501
  };
386
502
  }
387
503
  for (const [toolName, toolDef] of Object.entries(customTools)) {
@@ -389,7 +505,8 @@ let _ToolManager = class _ToolManager {
389
505
  allTools[qualifiedName] = {
390
506
  ...toolDef,
391
507
  name: qualifiedName,
392
- description: `${toolDef.description || "No description provided"} (custom tool)`
508
+ description: `${toolDef.description || "No description provided"} (custom tool)`,
509
+ parameters: wrapToolParametersSchema(toolDef.parameters)
393
510
  };
394
511
  }
395
512
  for (const [toolName, toolDef] of Object.entries(mcpTools)) {
@@ -397,7 +514,8 @@ let _ToolManager = class _ToolManager {
397
514
  allTools[qualifiedName] = {
398
515
  ...toolDef,
399
516
  name: qualifiedName,
400
- description: `${toolDef.description || "No description provided"} (via MCP servers)`
517
+ description: `${toolDef.description || "No description provided"} (via MCP servers)`,
518
+ parameters: wrapToolParametersSchema(toolDef.parameters)
401
519
  };
402
520
  }
403
521
  const totalTools = Object.keys(allTools).length;
@@ -433,21 +551,25 @@ let _ToolManager = class _ToolManager {
433
551
  * @param abortSignal Optional abort signal for cancellation support
434
552
  */
435
553
  async executeTool(toolName, args, toolCallId, sessionId, abortSignal) {
554
+ const { toolArgs: rawToolArgs, meta } = extractToolCallMeta(args);
555
+ let toolArgs = rawToolArgs;
556
+ const backgroundTasksEnabled = isBackgroundTasksEnabled();
436
557
  this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
437
- this.logger.debug(`Tool args: ${JSON.stringify(args, null, 2)}`);
558
+ this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
438
559
  if (sessionId) {
439
560
  this.agentEventBus.emit("llm:tool-call", {
440
561
  toolName,
441
- args,
562
+ args: toolArgs,
442
563
  callId: toolCallId,
443
564
  sessionId
444
565
  });
445
566
  }
446
567
  const { requireApproval, approvalStatus } = await this.handleToolApproval(
447
568
  toolName,
448
- args,
569
+ toolArgs,
449
570
  toolCallId,
450
- sessionId
571
+ sessionId,
572
+ meta.callDescription
451
573
  );
452
574
  this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
453
575
  this.logger.info(
@@ -464,7 +586,7 @@ let _ToolManager = class _ToolManager {
464
586
  if (this.pluginManager && this.sessionManager && this.stateManager) {
465
587
  const beforePayload = {
466
588
  toolName,
467
- args,
589
+ args: toolArgs,
468
590
  ...sessionId !== void 0 && { sessionId }
469
591
  };
470
592
  const modifiedPayload = await this.pluginManager.executePlugins(
@@ -478,10 +600,21 @@ let _ToolManager = class _ToolManager {
478
600
  ...sessionId !== void 0 && { sessionId }
479
601
  }
480
602
  );
481
- args = modifiedPayload.args;
603
+ toolArgs = modifiedPayload.args;
482
604
  }
483
605
  try {
484
606
  let result;
607
+ const registerBackgroundTask = (promise, description) => {
608
+ const fallbackId = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
609
+ return {
610
+ result: {
611
+ taskId: toolCallId ?? fallbackId,
612
+ status: "running",
613
+ description
614
+ },
615
+ promise
616
+ };
617
+ };
485
618
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
486
619
  this.logger.debug(`\u{1F527} Detected MCP tool: '${toolName}'`);
487
620
  const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
@@ -489,7 +622,34 @@ let _ToolManager = class _ToolManager {
489
622
  throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
490
623
  }
491
624
  this.logger.debug(`\u{1F3AF} MCP routing: '${toolName}' -> '${actualToolName}'`);
492
- result = await this.mcpManager.executeTool(actualToolName, args, sessionId);
625
+ const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
626
+ if (meta.runInBackground === true && !backgroundTasksEnabled) {
627
+ this.logger.debug(
628
+ "Background tool execution disabled; running synchronously instead.",
629
+ { toolName }
630
+ );
631
+ }
632
+ if (runInBackground) {
633
+ const backgroundSessionId = sessionId;
634
+ const { result: backgroundResult, promise } = registerBackgroundTask(
635
+ this.mcpManager.executeTool(actualToolName, toolArgs, backgroundSessionId),
636
+ `MCP tool ${actualToolName}`
637
+ );
638
+ this.agentEventBus.emit("tool:background", {
639
+ toolName,
640
+ toolCallId: backgroundResult.taskId,
641
+ sessionId: backgroundSessionId,
642
+ description: backgroundResult.description,
643
+ promise,
644
+ ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
645
+ ...meta.notifyOnComplete !== void 0 && {
646
+ notifyOnComplete: meta.notifyOnComplete
647
+ }
648
+ });
649
+ result = backgroundResult;
650
+ } else {
651
+ result = await this.mcpManager.executeTool(actualToolName, toolArgs, sessionId);
652
+ }
493
653
  } else if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
494
654
  this.logger.debug(`\u{1F527} Detected internal tool: '${toolName}'`);
495
655
  const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
@@ -500,13 +660,46 @@ let _ToolManager = class _ToolManager {
500
660
  throw ToolError.internalToolsNotInitialized(toolName);
501
661
  }
502
662
  this.logger.debug(`\u{1F3AF} Internal routing: '${toolName}' -> '${actualToolName}'`);
503
- result = await this.internalToolsProvider.executeTool(
504
- actualToolName,
505
- args,
506
- sessionId,
507
- abortSignal,
508
- toolCallId
509
- );
663
+ const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
664
+ if (meta.runInBackground === true && !backgroundTasksEnabled) {
665
+ this.logger.debug(
666
+ "Background tool execution disabled; running synchronously instead.",
667
+ { toolName }
668
+ );
669
+ }
670
+ if (runInBackground) {
671
+ const backgroundSessionId = sessionId;
672
+ const { result: backgroundResult, promise } = registerBackgroundTask(
673
+ this.internalToolsProvider.executeTool(
674
+ actualToolName,
675
+ toolArgs,
676
+ backgroundSessionId,
677
+ abortSignal,
678
+ toolCallId
679
+ ),
680
+ `Internal tool ${actualToolName}`
681
+ );
682
+ this.agentEventBus.emit("tool:background", {
683
+ toolName,
684
+ toolCallId: backgroundResult.taskId,
685
+ sessionId: backgroundSessionId,
686
+ description: backgroundResult.description,
687
+ promise,
688
+ ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
689
+ ...meta.notifyOnComplete !== void 0 && {
690
+ notifyOnComplete: meta.notifyOnComplete
691
+ }
692
+ });
693
+ result = backgroundResult;
694
+ } else {
695
+ result = await this.internalToolsProvider.executeTool(
696
+ actualToolName,
697
+ toolArgs,
698
+ sessionId,
699
+ abortSignal,
700
+ toolCallId
701
+ );
702
+ }
510
703
  } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
511
704
  this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
512
705
  const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
@@ -517,13 +710,46 @@ let _ToolManager = class _ToolManager {
517
710
  throw ToolError.internalToolsNotInitialized(toolName);
518
711
  }
519
712
  this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
520
- result = await this.internalToolsProvider.executeTool(
521
- actualToolName,
522
- args,
523
- sessionId,
524
- abortSignal,
525
- toolCallId
526
- );
713
+ const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
714
+ if (meta.runInBackground === true && !backgroundTasksEnabled) {
715
+ this.logger.debug(
716
+ "Background tool execution disabled; running synchronously instead.",
717
+ { toolName }
718
+ );
719
+ }
720
+ if (runInBackground) {
721
+ const backgroundSessionId = sessionId;
722
+ const { result: backgroundResult, promise } = registerBackgroundTask(
723
+ this.internalToolsProvider.executeTool(
724
+ actualToolName,
725
+ toolArgs,
726
+ backgroundSessionId,
727
+ abortSignal,
728
+ toolCallId
729
+ ),
730
+ `Custom tool ${actualToolName}`
731
+ );
732
+ this.agentEventBus.emit("tool:background", {
733
+ toolName,
734
+ toolCallId: backgroundResult.taskId,
735
+ sessionId: backgroundSessionId,
736
+ description: backgroundResult.description,
737
+ promise,
738
+ ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
739
+ ...meta.notifyOnComplete !== void 0 && {
740
+ notifyOnComplete: meta.notifyOnComplete
741
+ }
742
+ });
743
+ result = backgroundResult;
744
+ } else {
745
+ result = await this.internalToolsProvider.executeTool(
746
+ actualToolName,
747
+ toolArgs,
748
+ sessionId,
749
+ abortSignal,
750
+ toolCallId
751
+ );
752
+ }
527
753
  } else {
528
754
  this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
529
755
  const stats = await this.getToolStats();
@@ -776,12 +1002,12 @@ let _ToolManager = class _ToolManager {
776
1002
  * Handle tool approval flow. Checks various precedence levels to determine
777
1003
  * if a tool should be auto-approved, denied, or requires manual approval.
778
1004
  */
779
- async handleToolApproval(toolName, args, toolCallId, sessionId) {
1005
+ async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
780
1006
  const quickResult = await this.tryQuickApprovalResolution(toolName, args, sessionId);
781
1007
  if (quickResult !== null) {
782
1008
  return quickResult;
783
1009
  }
784
- return this.requestManualApproval(toolName, args, toolCallId, sessionId);
1010
+ return this.requestManualApproval(toolName, args, toolCallId, sessionId, callDescription);
785
1011
  }
786
1012
  /**
787
1013
  * Try to resolve tool approval quickly based on policies and cached permissions.
@@ -855,7 +1081,7 @@ let _ToolManager = class _ToolManager {
855
1081
  * Request manual approval from the user for a tool execution.
856
1082
  * Generates preview, sends approval request, and handles the response.
857
1083
  */
858
- async requestManualApproval(toolName, args, toolCallId, sessionId) {
1084
+ async requestManualApproval(toolName, args, toolCallId, sessionId, callDescription) {
859
1085
  this.logger.info(
860
1086
  `Tool confirmation requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
861
1087
  );
@@ -871,6 +1097,7 @@ let _ToolManager = class _ToolManager {
871
1097
  toolName,
872
1098
  toolCallId,
873
1099
  args,
1100
+ ...callDescription !== void 0 && { description: callDescription },
874
1101
  ...sessionId !== void 0 && { sessionId },
875
1102
  ...displayPreview !== void 0 && { displayPreview },
876
1103
  ...suggestedPatterns !== void 0 && { suggestedPatterns }
@@ -52,7 +52,7 @@ const PROVIDER_API_KEY_MAP = {
52
52
  ollama: [],
53
53
  // Ollama server (no authentication required)
54
54
  // Dexto gateway - requires key from `dexto login`
55
- dexto: ["DEXTO_API_KEY"]
55
+ "dexto-nova": ["DEXTO_API_KEY"]
56
56
  // perplexity: ['PERPLEXITY_API_KEY'],
57
57
  // together: ['TOGETHER_API_KEY'],
58
58
  // fireworks: ['FIREWORKS_API_KEY'],
@@ -28,7 +28,7 @@ const PROVIDER_API_KEY_MAP = {
28
28
  ollama: [],
29
29
  // Ollama server (no authentication required)
30
30
  // Dexto gateway - requires key from `dexto login`
31
- dexto: ["DEXTO_API_KEY"]
31
+ "dexto-nova": ["DEXTO_API_KEY"]
32
32
  // perplexity: ['PERPLEXITY_API_KEY'],
33
33
  // together: ['TOGETHER_API_KEY'],
34
34
  // fireworks: ['FIREWORKS_API_KEY'],
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var env_exports = {};
20
+ __export(env_exports, {
21
+ isBackgroundTasksEnabled: () => isBackgroundTasksEnabled,
22
+ isTruthyEnv: () => isTruthyEnv,
23
+ readBooleanEnv: () => readBooleanEnv
24
+ });
25
+ module.exports = __toCommonJS(env_exports);
26
+ const TRUE_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on"]);
27
+ const FALSE_VALUES = /* @__PURE__ */ new Set(["0", "false", "no", "off"]);
28
+ function isTruthyEnv(name) {
29
+ const value = process.env[name];
30
+ if (!value) return false;
31
+ return TRUE_VALUES.has(value.trim().toLowerCase());
32
+ }
33
+ function readBooleanEnv(name, defaultValue) {
34
+ const value = process.env[name];
35
+ if (value === void 0) return defaultValue;
36
+ const normalized = value.trim().toLowerCase();
37
+ if (TRUE_VALUES.has(normalized)) return true;
38
+ if (FALSE_VALUES.has(normalized)) return false;
39
+ return defaultValue;
40
+ }
41
+ function isBackgroundTasksEnabled() {
42
+ return readBooleanEnv("DEXTO_BACKGROUND_TASKS_ENABLED", false);
43
+ }
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ isBackgroundTasksEnabled,
47
+ isTruthyEnv,
48
+ readBooleanEnv
49
+ });
@@ -0,0 +1,4 @@
1
+ export declare function isTruthyEnv(name: string): boolean;
2
+ export declare function readBooleanEnv(name: string, defaultValue: boolean): boolean;
3
+ export declare function isBackgroundTasksEnabled(): boolean;
4
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIjD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAO3E;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD"}
@@ -0,0 +1,24 @@
1
+ import "../chunk-PTJYTZNU.js";
2
+ const TRUE_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on"]);
3
+ const FALSE_VALUES = /* @__PURE__ */ new Set(["0", "false", "no", "off"]);
4
+ function isTruthyEnv(name) {
5
+ const value = process.env[name];
6
+ if (!value) return false;
7
+ return TRUE_VALUES.has(value.trim().toLowerCase());
8
+ }
9
+ function readBooleanEnv(name, defaultValue) {
10
+ const value = process.env[name];
11
+ if (value === void 0) return defaultValue;
12
+ const normalized = value.trim().toLowerCase();
13
+ if (TRUE_VALUES.has(normalized)) return true;
14
+ if (FALSE_VALUES.has(normalized)) return false;
15
+ return defaultValue;
16
+ }
17
+ function isBackgroundTasksEnabled() {
18
+ return readBooleanEnv("DEXTO_BACKGROUND_TASKS_ENABLED", false);
19
+ }
20
+ export {
21
+ isBackgroundTasksEnabled,
22
+ isTruthyEnv,
23
+ readBooleanEnv
24
+ };
@@ -28,6 +28,7 @@ __reExport(utils_exports, require("./safe-stringify.js"), module.exports);
28
28
  __reExport(utils_exports, require("./api-key-resolver.js"), module.exports);
29
29
  __reExport(utils_exports, require("./defer.js"), module.exports);
30
30
  __reExport(utils_exports, require("./async-context.js"), module.exports);
31
+ __reExport(utils_exports, require("./env.js"), module.exports);
31
32
  // Annotate the CommonJS export names for ESM import in node:
32
33
  0 && (module.exports = {
33
34
  ...require("./path.js"),
@@ -42,5 +43,6 @@ __reExport(utils_exports, require("./async-context.js"), module.exports);
42
43
  ...require("./safe-stringify.js"),
43
44
  ...require("./api-key-resolver.js"),
44
45
  ...require("./defer.js"),
45
- ...require("./async-context.js")
46
+ ...require("./async-context.js"),
47
+ ...require("./env.js")
46
48
  });
@@ -11,4 +11,5 @@ export * from './safe-stringify.js';
11
11
  export * from './api-key-resolver.js';
12
12
  export * from './defer.js';
13
13
  export * from './async-context.js';
14
+ export * from './env.js';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAKA,cAAc,WAAW,CAAC;AAC1B,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAKA,cAAc,WAAW,CAAC;AAC1B,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC"}
@@ -11,3 +11,4 @@ export * from "./safe-stringify.js";
11
11
  export * from "./api-key-resolver.js";
12
12
  export * from "./defer.js";
13
13
  export * from "./async-context.js";
14
+ export * from "./env.js";
@@ -116,7 +116,22 @@ async function createAgentServices(config, configPath, logger, agentEventBus, ov
116
116
  },
117
117
  logger
118
118
  );
119
- const toolManager = new import_tool_manager.ToolManager(
119
+ const internalToolsServices = {
120
+ searchService,
121
+ resourceManager
122
+ };
123
+ const toolManager = overrides?.toolManager ?? overrides?.toolManagerFactory?.({
124
+ mcpManager,
125
+ approvalManager,
126
+ allowedToolsProvider,
127
+ approvalMode: config.toolConfirmation.mode,
128
+ agentEventBus,
129
+ toolPolicies: config.toolConfirmation.toolPolicies,
130
+ internalToolsConfig: config.internalTools,
131
+ customToolsConfig: config.customTools,
132
+ internalToolsServices,
133
+ logger
134
+ }) ?? new import_tool_manager.ToolManager(
120
135
  mcpManager,
121
136
  approvalManager,
122
137
  allowedToolsProvider,
@@ -124,10 +139,7 @@ async function createAgentServices(config, configPath, logger, agentEventBus, ov
124
139
  agentEventBus,
125
140
  config.toolConfirmation.toolPolicies,
126
141
  {
127
- internalToolsServices: {
128
- searchService,
129
- resourceManager
130
- },
142
+ internalToolsServices,
131
143
  internalToolsConfig: config.internalTools,
132
144
  customToolsConfig: config.customTools
133
145
  },
@@ -1,5 +1,8 @@
1
1
  import { MCPManager } from '../mcp/manager.js';
2
2
  import { ToolManager } from '../tools/tool-manager.js';
3
+ import type { InternalToolsServices } from '../tools/internal-tools/registry.js';
4
+ import type { InternalToolsConfig, CustomToolsConfig, ToolPolicies } from '../tools/schemas.js';
5
+ import type { IAllowedToolsProvider } from '../tools/confirmation/allowed-tools-provider/types.js';
3
6
  import { SystemPromptManager } from '../systemPrompt/manager.js';
4
7
  import { AgentStateManager } from '../agent/state-manager.js';
5
8
  import { SessionManager } from '../session/index.js';
@@ -29,6 +32,25 @@ export type AgentServices = {
29
32
  memoryManager: MemoryManager;
30
33
  pluginManager: PluginManager;
31
34
  };
35
+ export type ToolManagerFactoryOptions = {
36
+ mcpManager: MCPManager;
37
+ approvalManager: ApprovalManager;
38
+ allowedToolsProvider: IAllowedToolsProvider;
39
+ approvalMode: 'manual' | 'auto-approve' | 'auto-deny';
40
+ agentEventBus: AgentEventBus;
41
+ toolPolicies: ToolPolicies;
42
+ internalToolsConfig: InternalToolsConfig;
43
+ customToolsConfig: CustomToolsConfig;
44
+ internalToolsServices: InternalToolsServices & Record<string, unknown>;
45
+ logger: IDextoLogger;
46
+ };
47
+ export type ToolManagerFactory = (options: ToolManagerFactoryOptions) => ToolManager;
48
+ export type InitializeServicesOptions = {
49
+ sessionLoggerFactory?: import('../session/session-manager.js').SessionLoggerFactory;
50
+ mcpAuthProviderFactory?: import('../mcp/types.js').McpAuthProviderFactory | null;
51
+ toolManager?: ToolManager;
52
+ toolManagerFactory?: ToolManagerFactory;
53
+ };
32
54
  /**
33
55
  * Initializes all agent services from a validated configuration.
34
56
  * @param config The validated agent configuration object
@@ -38,8 +60,5 @@ export type AgentServices = {
38
60
  * @param overrides Optional service overrides for customization (e.g., sessionLoggerFactory)
39
61
  * @returns All the initialized services required for a Dexto agent
40
62
  */
41
- export declare function createAgentServices(config: ValidatedAgentConfig, configPath: string | undefined, logger: IDextoLogger, agentEventBus: AgentEventBus, overrides?: {
42
- sessionLoggerFactory?: import('../session/session-manager.js').SessionLoggerFactory;
43
- mcpAuthProviderFactory?: import('../mcp/types.js').McpAuthProviderFactory | null;
44
- }): Promise<AgentServices>;
63
+ export declare function createAgentServices(config: ValidatedAgentConfig, configPath: string | undefined, logger: IDextoLogger, agentEventBus: AgentEventBus, overrides?: InitializeServicesOptions): Promise<AgentServices>;
45
64
  //# sourceMappingURL=service-initializer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-initializer.d.ts","sourceRoot":"","sources":["../../src/utils/service-initializer.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAwB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,iBAAiB,CAAC;IAChC,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;CAChC,CAAC;AAGF;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,aAAa,EAC5B,SAAS,CAAC,EAAE;IACR,oBAAoB,CAAC,EAAE,OAAO,+BAA+B,EAAE,oBAAoB,CAAC;IACpF,sBAAsB,CAAC,EAAE,OAAO,iBAAiB,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACpF,GACF,OAAO,CAAC,aAAa,CAAC,CAsMxB"}
1
+ {"version":3,"file":"service-initializer.d.ts","sourceRoot":"","sources":["../../src/utils/service-initializer.ts"],"names":[],"mappings":"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"}