@dexto/core 1.5.6 → 1.5.7

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 (140) hide show
  1. package/dist/agent/DextoAgent.cjs +94 -26
  2. package/dist/agent/DextoAgent.d.ts +17 -7
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +95 -27
  5. package/dist/agent/schemas.d.ts +417 -66
  6. package/dist/agent/schemas.d.ts.map +1 -1
  7. package/dist/context/utils.cjs +49 -3
  8. package/dist/context/utils.d.ts.map +1 -1
  9. package/dist/context/utils.js +49 -3
  10. package/dist/errors/types.cjs +2 -1
  11. package/dist/errors/types.d.ts +2 -1
  12. package/dist/errors/types.d.ts.map +1 -1
  13. package/dist/errors/types.js +2 -1
  14. package/dist/image/types.d.ts +15 -0
  15. package/dist/image/types.d.ts.map +1 -1
  16. package/dist/llm/error-codes.cjs +1 -0
  17. package/dist/llm/error-codes.d.ts +1 -0
  18. package/dist/llm/error-codes.d.ts.map +1 -1
  19. package/dist/llm/error-codes.js +1 -0
  20. package/dist/llm/errors.cjs +15 -0
  21. package/dist/llm/errors.d.ts +15 -8
  22. package/dist/llm/errors.d.ts.map +1 -1
  23. package/dist/llm/errors.js +15 -0
  24. package/dist/llm/executor/turn-executor.cjs +27 -0
  25. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  26. package/dist/llm/executor/turn-executor.js +27 -0
  27. package/dist/llm/registry.cjs +472 -28
  28. package/dist/llm/registry.d.ts +80 -4
  29. package/dist/llm/registry.d.ts.map +1 -1
  30. package/dist/llm/registry.js +464 -25
  31. package/dist/llm/resolver.cjs +13 -0
  32. package/dist/llm/resolver.d.ts.map +1 -1
  33. package/dist/llm/resolver.js +16 -1
  34. package/dist/llm/schemas.d.ts +59 -59
  35. package/dist/llm/services/factory.cjs +41 -25
  36. package/dist/llm/services/factory.d.ts +20 -1
  37. package/dist/llm/services/factory.d.ts.map +1 -1
  38. package/dist/llm/services/factory.js +42 -26
  39. package/dist/llm/services/test-utils.integration.cjs +5 -1
  40. package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
  41. package/dist/llm/services/test-utils.integration.js +5 -1
  42. package/dist/llm/types.cjs +5 -2
  43. package/dist/llm/types.d.ts +1 -1
  44. package/dist/llm/types.d.ts.map +1 -1
  45. package/dist/llm/types.js +5 -2
  46. package/dist/logger/v2/dexto-logger.cjs +4 -0
  47. package/dist/logger/v2/dexto-logger.d.ts +3 -0
  48. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  49. package/dist/logger/v2/dexto-logger.js +4 -0
  50. package/dist/logger/v2/types.d.ts +2 -0
  51. package/dist/logger/v2/types.d.ts.map +1 -1
  52. package/dist/mcp/error-codes.cjs +1 -0
  53. package/dist/mcp/error-codes.d.ts +1 -0
  54. package/dist/mcp/error-codes.d.ts.map +1 -1
  55. package/dist/mcp/error-codes.js +1 -0
  56. package/dist/mcp/errors.cjs +13 -0
  57. package/dist/mcp/errors.d.ts +7 -0
  58. package/dist/mcp/errors.d.ts.map +1 -1
  59. package/dist/mcp/errors.js +13 -0
  60. package/dist/mcp/manager.cjs +46 -4
  61. package/dist/mcp/manager.d.ts +10 -2
  62. package/dist/mcp/manager.d.ts.map +1 -1
  63. package/dist/mcp/manager.js +46 -4
  64. package/dist/mcp/mcp-client.cjs +89 -5
  65. package/dist/mcp/mcp-client.d.ts +5 -1
  66. package/dist/mcp/mcp-client.d.ts.map +1 -1
  67. package/dist/mcp/mcp-client.js +89 -5
  68. package/dist/mcp/schemas.cjs +6 -1
  69. package/dist/mcp/schemas.d.ts +1 -1
  70. package/dist/mcp/schemas.d.ts.map +1 -1
  71. package/dist/mcp/schemas.js +6 -1
  72. package/dist/mcp/types.d.ts +5 -0
  73. package/dist/mcp/types.d.ts.map +1 -1
  74. package/dist/prompts/index.d.ts +1 -1
  75. package/dist/prompts/index.d.ts.map +1 -1
  76. package/dist/prompts/prompt-manager.cjs +90 -4
  77. package/dist/prompts/prompt-manager.d.ts +16 -6
  78. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  79. package/dist/prompts/prompt-manager.js +90 -4
  80. package/dist/prompts/providers/config-prompt-provider.cjs +104 -10
  81. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  82. package/dist/prompts/providers/config-prompt-provider.js +105 -11
  83. package/dist/prompts/providers/custom-prompt-provider.cjs +1 -0
  84. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  85. package/dist/prompts/providers/custom-prompt-provider.js +1 -0
  86. package/dist/prompts/providers/mcp-prompt-provider.cjs +1 -0
  87. package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
  88. package/dist/prompts/providers/mcp-prompt-provider.js +1 -0
  89. package/dist/prompts/schemas.cjs +28 -2
  90. package/dist/prompts/schemas.d.ts +130 -0
  91. package/dist/prompts/schemas.d.ts.map +1 -1
  92. package/dist/prompts/schemas.js +28 -2
  93. package/dist/prompts/types.d.ts +55 -3
  94. package/dist/prompts/types.d.ts.map +1 -1
  95. package/dist/session/chat-session.d.ts +1 -1
  96. package/dist/session/chat-session.d.ts.map +1 -1
  97. package/dist/session/index.d.ts +1 -1
  98. package/dist/session/index.d.ts.map +1 -1
  99. package/dist/session/session-manager.cjs +47 -3
  100. package/dist/session/session-manager.d.ts +10 -0
  101. package/dist/session/session-manager.d.ts.map +1 -1
  102. package/dist/session/session-manager.js +47 -3
  103. package/dist/systemPrompt/contributors.cjs +42 -0
  104. package/dist/systemPrompt/contributors.d.ts +13 -0
  105. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  106. package/dist/systemPrompt/contributors.js +41 -0
  107. package/dist/tools/errors.cjs +7 -3
  108. package/dist/tools/errors.d.ts +5 -1
  109. package/dist/tools/errors.d.ts.map +1 -1
  110. package/dist/tools/errors.js +7 -3
  111. package/dist/tools/internal-tools/constants.cjs +2 -1
  112. package/dist/tools/internal-tools/constants.d.ts +1 -1
  113. package/dist/tools/internal-tools/constants.d.ts.map +1 -1
  114. package/dist/tools/internal-tools/constants.js +2 -1
  115. package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +140 -0
  116. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +24 -0
  117. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +1 -0
  118. package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +117 -0
  119. package/dist/tools/internal-tools/provider.cjs +15 -0
  120. package/dist/tools/internal-tools/provider.d.ts +12 -0
  121. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  122. package/dist/tools/internal-tools/provider.js +15 -0
  123. package/dist/tools/internal-tools/registry.cjs +6 -0
  124. package/dist/tools/internal-tools/registry.d.ts +34 -0
  125. package/dist/tools/internal-tools/registry.d.ts.map +1 -1
  126. package/dist/tools/internal-tools/registry.js +6 -0
  127. package/dist/tools/schemas.d.ts +1 -1
  128. package/dist/tools/schemas.d.ts.map +1 -1
  129. package/dist/tools/tool-manager.cjs +230 -79
  130. package/dist/tools/tool-manager.d.ts +89 -8
  131. package/dist/tools/tool-manager.d.ts.map +1 -1
  132. package/dist/tools/tool-manager.js +231 -80
  133. package/dist/utils/api-key-resolver.cjs +5 -2
  134. package/dist/utils/api-key-resolver.d.ts.map +1 -1
  135. package/dist/utils/api-key-resolver.js +5 -2
  136. package/dist/utils/service-initializer.cjs +8 -2
  137. package/dist/utils/service-initializer.d.ts +5 -1
  138. package/dist/utils/service-initializer.d.ts.map +1 -1
  139. package/dist/utils/service-initializer.js +8 -2
  140. package/package.json +1 -1
@@ -104,6 +104,10 @@ let _ToolManager = class _ToolManager {
104
104
  toolsCache = {};
105
105
  cacheValid = false;
106
106
  logger;
107
+ // Session-level auto-approve tools for skills
108
+ // When a skill with allowedTools is invoked, those tools are auto-approved (skip confirmation)
109
+ // This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow
110
+ sessionAutoApproveTools = /* @__PURE__ */ new Map();
107
111
  constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, options, logger) {
108
112
  this.mcpManager = mcpManager;
109
113
  this.approvalManager = approvalManager;
@@ -155,6 +159,95 @@ let _ToolManager = class _ToolManager {
155
159
  this.logger.debug("Agent reference configured for custom tools");
156
160
  }
157
161
  }
162
+ /**
163
+ * Set prompt manager for invoke_skill tool (called after construction to avoid circular dependencies)
164
+ * Must be called before initialize() if invoke_skill tool is enabled
165
+ */
166
+ setPromptManager(promptManager) {
167
+ if (this.internalToolsProvider) {
168
+ this.internalToolsProvider.setPromptManager(promptManager);
169
+ this.logger.debug("PromptManager reference configured for invoke_skill tool");
170
+ }
171
+ }
172
+ /**
173
+ * Set task forker for context:fork skill execution (late-binding)
174
+ * Called by agent-spawner custom tool provider after RuntimeService is created.
175
+ * This enables invoke_skill to fork execution to an isolated subagent.
176
+ */
177
+ setTaskForker(taskForker) {
178
+ if (this.internalToolsProvider) {
179
+ this.internalToolsProvider.setTaskForker(taskForker);
180
+ this.logger.debug(
181
+ "TaskForker reference configured for invoke_skill (context:fork support)"
182
+ );
183
+ }
184
+ }
185
+ // ============= SESSION AUTO-APPROVE TOOLS =============
186
+ /**
187
+ * Set session-level auto-approve tools.
188
+ * When set, these tools will skip confirmation prompts for this session.
189
+ * This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
190
+ *
191
+ * @param sessionId The session ID
192
+ * @param autoApproveTools Array of tool names to auto-approve (e.g., ['custom--bash_exec', 'custom--read_file'])
193
+ */
194
+ setSessionAutoApproveTools(sessionId, autoApproveTools) {
195
+ if (autoApproveTools.length === 0) {
196
+ this.clearSessionAutoApproveTools(sessionId);
197
+ return;
198
+ }
199
+ this.sessionAutoApproveTools.set(sessionId, autoApproveTools);
200
+ this.logger.info(
201
+ `Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
202
+ );
203
+ this.logger.debug(`Auto-approve tools: ${autoApproveTools.join(", ")}`);
204
+ }
205
+ /**
206
+ * Clear session-level auto-approve tools.
207
+ * Call this when the session ends or when the skill completes.
208
+ *
209
+ * @param sessionId The session ID to clear auto-approve tools for
210
+ */
211
+ clearSessionAutoApproveTools(sessionId) {
212
+ const hadAutoApprove = this.sessionAutoApproveTools.has(sessionId);
213
+ this.sessionAutoApproveTools.delete(sessionId);
214
+ if (hadAutoApprove) {
215
+ this.logger.info(`Session auto-approve tools cleared for '${sessionId}'`);
216
+ }
217
+ }
218
+ /**
219
+ * Check if a session has auto-approve tools set.
220
+ *
221
+ * @param sessionId The session ID to check
222
+ * @returns true if the session has auto-approve tools
223
+ */
224
+ hasSessionAutoApproveTools(sessionId) {
225
+ return this.sessionAutoApproveTools.has(sessionId);
226
+ }
227
+ /**
228
+ * Get the auto-approve tools for a session.
229
+ *
230
+ * @param sessionId The session ID to check
231
+ * @returns Array of auto-approve tool names, or undefined if none set
232
+ */
233
+ getSessionAutoApproveTools(sessionId) {
234
+ return this.sessionAutoApproveTools.get(sessionId);
235
+ }
236
+ /**
237
+ * Check if a tool should be auto-approved for a session.
238
+ * Returns true if the tool is in the session's auto-approve list.
239
+ *
240
+ * @param sessionId The session ID
241
+ * @param toolName The tool name to check
242
+ * @returns true if the tool should be auto-approved
243
+ */
244
+ isToolAutoApprovedForSession(sessionId, toolName) {
245
+ const autoApproveTools = this.sessionAutoApproveTools.get(sessionId);
246
+ if (!autoApproveTools) {
247
+ return false;
248
+ }
249
+ return autoApproveTools.some((pattern) => this.matchesToolPolicy(toolName, pattern));
250
+ }
158
251
  /**
159
252
  * Invalidate the tools cache when tool sources change
160
253
  */
@@ -180,6 +273,14 @@ let _ToolManager = class _ToolManager {
180
273
  );
181
274
  this.invalidateCache();
182
275
  });
276
+ this.agentEventBus.on("run:complete", (payload) => {
277
+ if (this.hasSessionAutoApproveTools(payload.sessionId)) {
278
+ this.logger.debug(
279
+ `\u{1F513} Run complete, clearing session auto-approve tools for '${payload.sessionId}'`
280
+ );
281
+ this.clearSessionAutoApproveTools(payload.sessionId);
282
+ }
283
+ });
183
284
  }
184
285
  // ==================== Bash Pattern Approval Helpers ====================
185
286
  /**
@@ -731,21 +832,34 @@ let _ToolManager = class _ToolManager {
731
832
  throw import_errors.ToolError.executionDenied(toolName, sessionId);
732
833
  }
733
834
  /**
734
- * Handle tool approval/confirmation flow
735
- * Checks allowed list, manages approval modes (manual, auto-approve, auto-deny),
736
- * and handles remember choice logic
737
- *
738
- * @param toolName The fully qualified tool name
739
- * @param args The arguments for the tool
740
- * @param toolCallId The unique tool call ID for tracking parallel tool calls
741
- * @param sessionId Optional session ID for context
835
+ * Handle tool approval flow. Checks various precedence levels to determine
836
+ * if a tool should be auto-approved, denied, or requires manual approval.
742
837
  */
743
838
  async handleToolApproval(toolName, args, toolCallId, sessionId) {
839
+ const quickResult = await this.tryQuickApprovalResolution(toolName, args, sessionId);
840
+ if (quickResult !== null) {
841
+ return quickResult;
842
+ }
843
+ return this.requestManualApproval(toolName, args, toolCallId, sessionId);
844
+ }
845
+ /**
846
+ * Try to resolve tool approval quickly based on policies and cached permissions.
847
+ * Returns null if manual approval is needed.
848
+ *
849
+ * Precedence order (highest to lowest):
850
+ * 1. Static deny list (security - always blocks)
851
+ * 2. Custom approval override (tool-specific approval flows)
852
+ * 3. Session auto-approve (skill allowed-tools)
853
+ * 4. Static allow list
854
+ * 5. Dynamic "remembered" allowed list
855
+ * 6. Bash command patterns
856
+ * 7. Approval mode (auto-approve/auto-deny)
857
+ */
858
+ async tryQuickApprovalResolution(toolName, args, sessionId) {
744
859
  if (this.isInAlwaysDenyList(toolName)) {
745
860
  this.logger.info(
746
861
  `Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
747
862
  );
748
- this.logger.debug(`\u{1F6AB} Tool execution blocked by policy: ${toolName}`);
749
863
  throw import_errors.ToolError.executionDenied(toolName, sessionId);
750
864
  }
751
865
  const customApprovalResult = await this.checkCustomApprovalOverride(
@@ -756,25 +870,29 @@ let _ToolManager = class _ToolManager {
756
870
  if (customApprovalResult.handled) {
757
871
  return { requireApproval: true, approvalStatus: "approved" };
758
872
  }
873
+ if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
874
+ this.logger.info(
875
+ `Tool '${toolName}' is in session's auto-approve list \u2013 skipping confirmation (session: ${sessionId})`
876
+ );
877
+ return { requireApproval: false };
878
+ }
759
879
  if (this.isInAlwaysAllowList(toolName)) {
760
880
  this.logger.info(
761
881
  `Tool '${toolName}' is in static allow list \u2013 skipping confirmation (session: ${sessionId ?? "global"})`
762
882
  );
763
883
  return { requireApproval: false };
764
884
  }
765
- const isAllowed = await this.allowedToolsProvider.isToolAllowed(toolName, sessionId);
766
- if (isAllowed) {
885
+ if (await this.allowedToolsProvider.isToolAllowed(toolName, sessionId)) {
767
886
  this.logger.info(
768
887
  `Tool '${toolName}' already allowed for session '${sessionId ?? "global"}' \u2013 skipping confirmation.`
769
888
  );
770
889
  return { requireApproval: false };
771
890
  }
772
- let bashPatternResult;
773
891
  if (this.isBashTool(toolName)) {
774
892
  const command = args.command;
775
893
  if (command) {
776
- bashPatternResult = this.checkBashPatternApproval(command);
777
- if (bashPatternResult.approved) {
894
+ const bashResult = this.checkBashPatternApproval(command);
895
+ if (bashResult.approved) {
778
896
  this.logger.info(
779
897
  `Bash command '${command}' matched approved pattern \u2013 skipping confirmation.`
780
898
  );
@@ -790,79 +908,37 @@ let _ToolManager = class _ToolManager {
790
908
  this.logger.debug(`\u{1F6AB} Auto-denying tool execution: ${toolName}`);
791
909
  throw import_errors.ToolError.executionDenied(toolName, sessionId);
792
910
  }
911
+ return null;
912
+ }
913
+ /**
914
+ * Request manual approval from the user for a tool execution.
915
+ * Generates preview, sends approval request, and handles the response.
916
+ */
917
+ async requestManualApproval(toolName, args, toolCallId, sessionId) {
793
918
  this.logger.info(
794
919
  `Tool confirmation requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
795
920
  );
796
921
  try {
797
- let displayPreview;
798
- const actualToolName = toolName.replace(/^internal--/, "").replace(/^custom--/, "");
799
- const internalTool = this.internalToolsProvider?.getTool(actualToolName);
800
- if (internalTool?.generatePreview) {
801
- try {
802
- const context = { sessionId, toolCallId };
803
- const preview = await internalTool.generatePreview(args, context);
804
- displayPreview = preview ?? void 0;
805
- this.logger.debug(`Generated preview for ${toolName}`);
806
- } catch (previewError) {
807
- if (previewError instanceof import_errors2.DextoRuntimeError && previewError.code === import_error_codes.ToolErrorCode.VALIDATION_FAILED) {
808
- this.logger.debug(
809
- `Validation failed for ${toolName}: ${previewError.message}`
810
- );
811
- throw previewError;
812
- }
813
- this.logger.debug(
814
- `Preview generation failed for ${toolName}: ${previewError instanceof Error ? previewError.message : String(previewError)}`
815
- );
816
- }
817
- }
818
- const requestData = {
922
+ const displayPreview = await this.generateToolPreview(
819
923
  toolName,
924
+ args,
820
925
  toolCallId,
821
- args
822
- };
823
- if (sessionId !== void 0) {
824
- requestData.sessionId = sessionId;
825
- }
826
- if (displayPreview !== void 0) {
827
- requestData.displayPreview = displayPreview;
828
- }
829
- if (bashPatternResult?.suggestedPatterns && bashPatternResult.suggestedPatterns.length > 0) {
830
- requestData.suggestedPatterns = bashPatternResult.suggestedPatterns;
831
- }
832
- const response = await this.approvalManager.requestToolConfirmation(requestData);
926
+ sessionId
927
+ );
928
+ const suggestedPatterns = this.getBashSuggestedPatterns(toolName, args);
929
+ const response = await this.approvalManager.requestToolConfirmation({
930
+ toolName,
931
+ toolCallId,
932
+ args,
933
+ ...sessionId !== void 0 && { sessionId },
934
+ ...displayPreview !== void 0 && { displayPreview },
935
+ ...suggestedPatterns !== void 0 && { suggestedPatterns }
936
+ });
833
937
  if (response.status === import_types3.ApprovalStatus.APPROVED && response.data) {
834
- const rememberChoice = "rememberChoice" in response.data ? response.data.rememberChoice : false;
835
- const rememberPattern = "rememberPattern" in response.data ? response.data.rememberPattern : void 0;
836
- if (rememberChoice) {
837
- const allowSessionId = sessionId ?? response.sessionId;
838
- await this.allowedToolsProvider.allowTool(toolName, allowSessionId);
839
- this.logger.info(
840
- `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
841
- );
842
- this.autoApprovePendingToolRequests(toolName, allowSessionId);
843
- } else if (rememberPattern && typeof rememberPattern === "string" && this.isBashTool(toolName)) {
844
- this.approvalManager.addBashPattern(rememberPattern);
845
- this.logger.info(
846
- `Bash pattern '${rememberPattern}' added for session approval`
847
- );
848
- this.autoApprovePendingBashRequests(rememberPattern, sessionId);
849
- }
938
+ await this.handleRememberChoice(toolName, response, sessionId);
850
939
  }
851
- const approved = response.status === import_types3.ApprovalStatus.APPROVED;
852
- if (!approved) {
853
- if (response.status === import_types3.ApprovalStatus.CANCELLED && response.reason === "timeout") {
854
- this.logger.info(
855
- `Tool confirmation timed out for ${toolName}, sessionId: ${sessionId ?? "global"}`
856
- );
857
- this.logger.debug(`\u23F1\uFE0F Tool execution timed out: ${toolName}`);
858
- const timeoutMs = response.timeoutMs ?? 0;
859
- throw import_errors.ToolError.executionTimeout(toolName, timeoutMs, sessionId);
860
- }
861
- this.logger.info(
862
- `Tool confirmation denied for ${toolName}, sessionId: ${sessionId ?? "global"}, reason: ${response.reason ?? "unknown"}`
863
- );
864
- this.logger.debug(`\u{1F6AB} Tool execution denied: ${toolName}`);
865
- throw import_errors.ToolError.executionDenied(toolName, sessionId);
940
+ if (response.status !== import_types3.ApprovalStatus.APPROVED) {
941
+ this.handleApprovalDenied(toolName, response, sessionId);
866
942
  }
867
943
  this.logger.info(
868
944
  `Tool confirmation approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
@@ -875,6 +951,81 @@ let _ToolManager = class _ToolManager {
875
951
  throw error;
876
952
  }
877
953
  }
954
+ /**
955
+ * Generate a preview for the tool approval UI if the tool supports it.
956
+ */
957
+ async generateToolPreview(toolName, args, toolCallId, sessionId) {
958
+ const actualToolName = toolName.replace(/^internal--/, "").replace(/^custom--/, "");
959
+ const internalTool = this.internalToolsProvider?.getTool(actualToolName);
960
+ if (!internalTool?.generatePreview) {
961
+ return void 0;
962
+ }
963
+ try {
964
+ const context = { sessionId, toolCallId };
965
+ const preview = await internalTool.generatePreview(args, context);
966
+ this.logger.debug(`Generated preview for ${toolName}`);
967
+ return preview ?? void 0;
968
+ } catch (previewError) {
969
+ if (previewError instanceof import_errors2.DextoRuntimeError && previewError.code === import_error_codes.ToolErrorCode.VALIDATION_FAILED) {
970
+ this.logger.debug(`Validation failed for ${toolName}: ${previewError.message}`);
971
+ throw previewError;
972
+ }
973
+ this.logger.debug(
974
+ `Preview generation failed for ${toolName}: ${previewError instanceof Error ? previewError.message : String(previewError)}`
975
+ );
976
+ return void 0;
977
+ }
978
+ }
979
+ /**
980
+ * Get suggested bash patterns for the approval UI.
981
+ */
982
+ getBashSuggestedPatterns(toolName, args) {
983
+ if (!this.isBashTool(toolName)) {
984
+ return void 0;
985
+ }
986
+ const command = args.command;
987
+ if (!command) {
988
+ return void 0;
989
+ }
990
+ const result = this.checkBashPatternApproval(command);
991
+ return result.suggestedPatterns?.length ? result.suggestedPatterns : void 0;
992
+ }
993
+ /**
994
+ * Handle "remember choice" or "remember pattern" when user approves a tool.
995
+ */
996
+ async handleRememberChoice(toolName, response, sessionId) {
997
+ const data = response.data;
998
+ if (!data) return;
999
+ const rememberChoice = data.rememberChoice;
1000
+ const rememberPattern = data.rememberPattern;
1001
+ if (rememberChoice) {
1002
+ const allowSessionId = sessionId ?? response.sessionId;
1003
+ await this.allowedToolsProvider.allowTool(toolName, allowSessionId);
1004
+ this.logger.info(
1005
+ `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
1006
+ );
1007
+ this.autoApprovePendingToolRequests(toolName, allowSessionId);
1008
+ } else if (rememberPattern && this.isBashTool(toolName)) {
1009
+ this.approvalManager.addBashPattern(rememberPattern);
1010
+ this.logger.info(`Bash pattern '${rememberPattern}' added for session approval`);
1011
+ this.autoApprovePendingBashRequests(rememberPattern, sessionId);
1012
+ }
1013
+ }
1014
+ /**
1015
+ * Handle approval denied/timeout - throws appropriate error.
1016
+ */
1017
+ handleApprovalDenied(toolName, response, sessionId) {
1018
+ if (response.status === import_types3.ApprovalStatus.CANCELLED && response.reason === import_types3.DenialReason.TIMEOUT) {
1019
+ this.logger.info(
1020
+ `Tool confirmation timed out for ${toolName}, sessionId: ${sessionId ?? "global"}`
1021
+ );
1022
+ throw import_errors.ToolError.executionTimeout(toolName, response.timeoutMs ?? 0, sessionId);
1023
+ }
1024
+ this.logger.info(
1025
+ `Tool confirmation denied for ${toolName}, sessionId: ${sessionId ?? "global"}, reason: ${response.reason ?? "unknown"}`
1026
+ );
1027
+ throw import_errors.ToolError.executionDenied(toolName, sessionId, response.message);
1028
+ }
878
1029
  /**
879
1030
  * Refresh tool discovery (call when MCP servers change)
880
1031
  * Refreshes both MCPManager's cache (server capabilities) and ToolManager's cache (combined tools)
@@ -7,6 +7,7 @@ import type { AgentEventBus } from '../events/index.js';
7
7
  import type { ApprovalManager } from '../approval/manager.js';
8
8
  import type { IAllowedToolsProvider } from './confirmation/allowed-tools-provider/types.js';
9
9
  import type { PluginManager } from '../plugins/manager.js';
10
+ import type { PromptManager } from '../prompts/prompt-manager.js';
10
11
  import type { SessionManager } from '../session/index.js';
11
12
  import type { AgentStateManager } from '../agent/state-manager.js';
12
13
  /**
@@ -60,6 +61,7 @@ export declare class ToolManager {
60
61
  private toolsCache;
61
62
  private cacheValid;
62
63
  private logger;
64
+ private sessionAutoApproveTools;
63
65
  constructor(mcpManager: MCPManager, approvalManager: ApprovalManager, allowedToolsProvider: IAllowedToolsProvider, approvalMode: 'manual' | 'auto-approve' | 'auto-deny', agentEventBus: AgentEventBus, toolPolicies: ToolPolicies, options: InternalToolsOptions, logger: IDextoLogger);
64
66
  /**
65
67
  * Initialize the ToolManager and its components
@@ -74,6 +76,56 @@ export declare class ToolManager {
74
76
  * Must be called before initialize() if custom tools are configured
75
77
  */
76
78
  setAgent(agent: any): void;
79
+ /**
80
+ * Set prompt manager for invoke_skill tool (called after construction to avoid circular dependencies)
81
+ * Must be called before initialize() if invoke_skill tool is enabled
82
+ */
83
+ setPromptManager(promptManager: PromptManager): void;
84
+ /**
85
+ * Set task forker for context:fork skill execution (late-binding)
86
+ * Called by agent-spawner custom tool provider after RuntimeService is created.
87
+ * This enables invoke_skill to fork execution to an isolated subagent.
88
+ */
89
+ setTaskForker(taskForker: import('./internal-tools/registry.js').TaskForker): void;
90
+ /**
91
+ * Set session-level auto-approve tools.
92
+ * When set, these tools will skip confirmation prompts for this session.
93
+ * This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
94
+ *
95
+ * @param sessionId The session ID
96
+ * @param autoApproveTools Array of tool names to auto-approve (e.g., ['custom--bash_exec', 'custom--read_file'])
97
+ */
98
+ setSessionAutoApproveTools(sessionId: string, autoApproveTools: string[]): void;
99
+ /**
100
+ * Clear session-level auto-approve tools.
101
+ * Call this when the session ends or when the skill completes.
102
+ *
103
+ * @param sessionId The session ID to clear auto-approve tools for
104
+ */
105
+ clearSessionAutoApproveTools(sessionId: string): void;
106
+ /**
107
+ * Check if a session has auto-approve tools set.
108
+ *
109
+ * @param sessionId The session ID to check
110
+ * @returns true if the session has auto-approve tools
111
+ */
112
+ hasSessionAutoApproveTools(sessionId: string): boolean;
113
+ /**
114
+ * Get the auto-approve tools for a session.
115
+ *
116
+ * @param sessionId The session ID to check
117
+ * @returns Array of auto-approve tool names, or undefined if none set
118
+ */
119
+ getSessionAutoApproveTools(sessionId: string): string[] | undefined;
120
+ /**
121
+ * Check if a tool should be auto-approved for a session.
122
+ * Returns true if the tool is in the session's auto-approve list.
123
+ *
124
+ * @param sessionId The session ID
125
+ * @param toolName The tool name to check
126
+ * @returns true if the tool should be auto-approved
127
+ */
128
+ private isToolAutoApprovedForSession;
77
129
  /**
78
130
  * Invalidate the tools cache when tool sources change
79
131
  */
@@ -208,16 +260,45 @@ export declare class ToolManager {
208
260
  */
209
261
  private checkCustomApprovalOverride;
210
262
  /**
211
- * Handle tool approval/confirmation flow
212
- * Checks allowed list, manages approval modes (manual, auto-approve, auto-deny),
213
- * and handles remember choice logic
214
- *
215
- * @param toolName The fully qualified tool name
216
- * @param args The arguments for the tool
217
- * @param toolCallId The unique tool call ID for tracking parallel tool calls
218
- * @param sessionId Optional session ID for context
263
+ * Handle tool approval flow. Checks various precedence levels to determine
264
+ * if a tool should be auto-approved, denied, or requires manual approval.
219
265
  */
220
266
  private handleToolApproval;
267
+ /**
268
+ * Try to resolve tool approval quickly based on policies and cached permissions.
269
+ * Returns null if manual approval is needed.
270
+ *
271
+ * Precedence order (highest to lowest):
272
+ * 1. Static deny list (security - always blocks)
273
+ * 2. Custom approval override (tool-specific approval flows)
274
+ * 3. Session auto-approve (skill allowed-tools)
275
+ * 4. Static allow list
276
+ * 5. Dynamic "remembered" allowed list
277
+ * 6. Bash command patterns
278
+ * 7. Approval mode (auto-approve/auto-deny)
279
+ */
280
+ private tryQuickApprovalResolution;
281
+ /**
282
+ * Request manual approval from the user for a tool execution.
283
+ * Generates preview, sends approval request, and handles the response.
284
+ */
285
+ private requestManualApproval;
286
+ /**
287
+ * Generate a preview for the tool approval UI if the tool supports it.
288
+ */
289
+ private generateToolPreview;
290
+ /**
291
+ * Get suggested bash patterns for the approval UI.
292
+ */
293
+ private getBashSuggestedPatterns;
294
+ /**
295
+ * Handle "remember choice" or "remember pattern" when user approves a tool.
296
+ */
297
+ private handleRememberChoice;
298
+ /**
299
+ * Handle approval denied/timeout - throws appropriate error.
300
+ */
301
+ private handleApprovalDenied;
221
302
  /**
222
303
  * Refresh tool discovery (call when MCP servers change)
223
304
  * Refreshes both MCPManager's cache (server capabilities) and ToolManager's cache (combined tools)
@@ -1 +1 @@
1
- {"version":3,"file":"tool-manager.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-manager.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manager.ts"],"names":[],"mappings":"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"}