@dexto/core 1.8.12 → 1.9.0

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 (110) hide show
  1. package/dist/approval/manager.cjs +37 -325
  2. package/dist/approval/manager.d.ts +10 -109
  3. package/dist/approval/manager.d.ts.map +1 -1
  4. package/dist/approval/manager.js +37 -316
  5. package/dist/approval/schemas.cjs +8 -51
  6. package/dist/approval/schemas.d.ts +5 -179
  7. package/dist/approval/schemas.d.ts.map +1 -1
  8. package/dist/approval/schemas.js +8 -47
  9. package/dist/approval/types.cjs +0 -6
  10. package/dist/approval/types.d.ts +2 -27
  11. package/dist/approval/types.d.ts.map +1 -1
  12. package/dist/approval/types.js +0 -6
  13. package/dist/context/content-clone.cjs +12 -8
  14. package/dist/context/content-clone.d.ts.map +1 -1
  15. package/dist/context/content-clone.js +12 -8
  16. package/dist/errors/DextoRuntimeError.cjs +3 -1
  17. package/dist/errors/DextoRuntimeError.d.ts +5 -3
  18. package/dist/errors/DextoRuntimeError.d.ts.map +1 -1
  19. package/dist/errors/DextoRuntimeError.js +3 -1
  20. package/dist/errors/index.d.ts +1 -1
  21. package/dist/errors/index.d.ts.map +1 -1
  22. package/dist/errors/types.d.ts +1 -0
  23. package/dist/errors/types.d.ts.map +1 -1
  24. package/dist/events/index.d.ts +2 -2
  25. package/dist/events/index.d.ts.map +1 -1
  26. package/dist/llm/executor/provider-error.cjs +25 -4
  27. package/dist/llm/executor/provider-error.d.ts.map +1 -1
  28. package/dist/llm/executor/provider-error.js +25 -4
  29. package/dist/llm/executor/stream-processor.cjs +61 -0
  30. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  31. package/dist/llm/executor/stream-processor.js +61 -0
  32. package/dist/llm/executor/turn-executor.cjs +93 -26
  33. package/dist/llm/executor/turn-executor.d.ts +2 -0
  34. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  35. package/dist/llm/executor/turn-executor.js +93 -26
  36. package/dist/llm/services/factory.cjs +3 -2
  37. package/dist/llm/services/factory.d.ts.map +1 -1
  38. package/dist/llm/services/factory.js +3 -2
  39. package/dist/llm/services/types.d.ts +8 -0
  40. package/dist/llm/services/types.d.ts.map +1 -1
  41. package/dist/llm/services/vercel.cjs +6 -1
  42. package/dist/llm/services/vercel.d.ts +3 -2
  43. package/dist/llm/services/vercel.d.ts.map +1 -1
  44. package/dist/llm/services/vercel.js +6 -1
  45. package/dist/session/chat-session.cjs +3 -0
  46. package/dist/session/chat-session.d.ts +2 -1
  47. package/dist/session/chat-session.d.ts.map +1 -1
  48. package/dist/session/chat-session.js +3 -0
  49. package/dist/session/message-queue.cjs +48 -75
  50. package/dist/session/message-queue.d.ts +1 -2
  51. package/dist/session/message-queue.d.ts.map +1 -1
  52. package/dist/session/message-queue.js +48 -75
  53. package/dist/session/session-manager.cjs +14 -32
  54. package/dist/session/session-manager.d.ts +5 -2
  55. package/dist/session/session-manager.d.ts.map +1 -1
  56. package/dist/session/session-manager.js +14 -32
  57. package/dist/storage/approvals/types.cjs +2 -9
  58. package/dist/storage/approvals/types.d.ts +4 -16
  59. package/dist/storage/approvals/types.d.ts.map +1 -1
  60. package/dist/storage/approvals/types.js +2 -8
  61. package/dist/storage/database/types.d.ts +5 -0
  62. package/dist/storage/database/types.d.ts.map +1 -1
  63. package/dist/storage/index.cjs +0 -2
  64. package/dist/storage/index.d.ts +2 -2
  65. package/dist/storage/index.d.ts.map +1 -1
  66. package/dist/storage/index.js +1 -2
  67. package/dist/storage/message-queue/types.d.ts +14 -6
  68. package/dist/storage/message-queue/types.d.ts.map +1 -1
  69. package/dist/storage/stores/backend.cjs +68 -32
  70. package/dist/storage/stores/backend.d.ts +17 -8
  71. package/dist/storage/stores/backend.d.ts.map +1 -1
  72. package/dist/storage/stores/backend.js +69 -33
  73. package/dist/storage/stores/in-memory.cjs +26 -11
  74. package/dist/storage/stores/in-memory.d.ts.map +1 -1
  75. package/dist/storage/stores/in-memory.js +27 -12
  76. package/dist/test-utils/in-memory-storage.cjs +11 -0
  77. package/dist/test-utils/in-memory-storage.js +11 -0
  78. package/dist/test-utils/session-state-stores.cjs +25 -9
  79. package/dist/test-utils/session-state-stores.js +26 -10
  80. package/dist/tools/approval/tool-approval-policy.cjs +87 -0
  81. package/dist/tools/approval/tool-approval-policy.d.ts +34 -0
  82. package/dist/tools/approval/tool-approval-policy.d.ts.map +1 -0
  83. package/dist/tools/approval/tool-approval-policy.js +64 -0
  84. package/dist/tools/error-codes.cjs +0 -1
  85. package/dist/tools/error-codes.d.ts +0 -1
  86. package/dist/tools/error-codes.d.ts.map +1 -1
  87. package/dist/tools/error-codes.js +0 -1
  88. package/dist/tools/errors.cjs +0 -15
  89. package/dist/tools/errors.d.ts +0 -9
  90. package/dist/tools/errors.d.ts.map +1 -1
  91. package/dist/tools/errors.js +0 -15
  92. package/dist/tools/index.cjs +2 -0
  93. package/dist/tools/index.d.ts +1 -1
  94. package/dist/tools/index.d.ts.map +1 -1
  95. package/dist/tools/index.js +5 -1
  96. package/dist/tools/tool-manager.cjs +94 -312
  97. package/dist/tools/tool-manager.d.ts +4 -19
  98. package/dist/tools/tool-manager.d.ts.map +1 -1
  99. package/dist/tools/tool-manager.js +95 -316
  100. package/dist/tools/types.d.ts +10 -9
  101. package/dist/tools/types.d.ts.map +1 -1
  102. package/dist/utils/service-initializer.cjs +3 -0
  103. package/dist/utils/service-initializer.d.ts +2 -1
  104. package/dist/utils/service-initializer.d.ts.map +1 -1
  105. package/dist/utils/service-initializer.js +3 -0
  106. package/package.json +2 -2
  107. package/dist/tools/pattern-utils.cjs +0 -33
  108. package/dist/tools/pattern-utils.d.ts +0 -20
  109. package/dist/tools/pattern-utils.d.ts.map +0 -1
  110. package/dist/tools/pattern-utils.js +0 -10
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/tools/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE;;;GAGG;AACH,qBAAa,SAAS;IAClB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;;;IAUhC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAU3E;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;;;IAajF;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAWlE;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAc/E;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;IAU3F;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;IAelE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAUxD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM;;;IAU9C;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAU9E;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAUnD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;IAUpC;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAUzD;;OAEG;IACH,MAAM,CAAC,eAAe,CAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,EACzB,OAAO,EAAE,MAAM,GAChB,iBAAiB,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAcrE;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,iBAAiB;IAW1F;;OAEG;IACH,MAAM,CAAC,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB;CAU7E"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/tools/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE;;;GAGG;AACH,qBAAa,SAAS;IAClB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;;;IAUhC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAU3E;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;;;IAajF;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAc/E;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;IAU3F;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;IAelE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAUxD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM;;;IAU9C;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAU9E;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAUnD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;IAUpC;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAUzD;;OAEG;IACH,MAAM,CAAC,eAAe,CAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,EACzB,OAAO,EAAE,MAAM,GAChB,iBAAiB,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAcrE;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,iBAAiB;IAW1F;;OAEG;IACH,MAAM,CAAC,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB;CAU7E"}
@@ -43,21 +43,6 @@ class ToolError {
43
43
  { toolName, sessionId, userMessage }
44
44
  );
45
45
  }
46
- /**
47
- * Directory access denied by user
48
- * Used when a file tool tries to access a path outside allowed directories
49
- * and the user denies the directory access approval
50
- */
51
- static directoryAccessDenied(directory, sessionId) {
52
- return new DextoRuntimeError(
53
- ToolErrorCode.DIRECTORY_ACCESS_DENIED,
54
- ErrorScope.TOOLS,
55
- ErrorType.FORBIDDEN,
56
- `Access to directory '${directory}' was denied`,
57
- { directory, sessionId },
58
- "Request access to the directory or work within the allowed working directory"
59
- );
60
- }
61
46
  /**
62
47
  * Tool execution timeout
63
48
  */
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  var tools_exports = {};
21
21
  __export(tools_exports, {
22
22
  SessionToolPreferencesSchema: () => import_session_tool_preferences_store.SessionToolPreferencesSchema,
23
+ SessionToolPreferencesStore: () => import_session_tool_preferences_store.SessionToolPreferencesStore,
23
24
  ToolError: () => import_errors.ToolError,
24
25
  ToolErrorCode: () => import_error_codes.ToolErrorCode,
25
26
  ToolManager: () => import_tool_manager.ToolManager,
@@ -38,6 +39,7 @@ var import_tool_manager = require("./tool-manager.js");
38
39
  // Annotate the CommonJS export names for ESM import in node:
39
40
  0 && (module.exports = {
40
41
  SessionToolPreferencesSchema,
42
+ SessionToolPreferencesStore,
41
43
  ToolError,
42
44
  ToolErrorCode,
43
45
  ToolManager,
@@ -6,7 +6,7 @@
6
6
  */
7
7
  export * from './types.js';
8
8
  export { defineTool } from './define-tool.js';
9
- export { SessionToolPreferencesSchema } from './session-tool-preferences-store.js';
9
+ export { SessionToolPreferencesSchema, SessionToolPreferencesStore, } from './session-tool-preferences-store.js';
10
10
  export type { SessionToolPreferences } from './session-tool-preferences-store.js';
11
11
  export * from './display-types.js';
12
12
  export * from './schemas.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AACnF,YAAY,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAGlF,cAAc,oBAAoB,CAAC;AAGnC,cAAc,cAAc,CAAC;AAG7B,cAAc,mBAAmB,CAAC;AAClC,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGrF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,KAAK,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAClF,YAAY,EACR,kBAAkB,EAClB,oBAAoB,EACpB,+BAA+B,EAC/B,0BAA0B,EAC1B,gCAAgC,EAChC,gBAAgB,EAChB,oBAAoB,GACvB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACH,4BAA4B,EAC5B,2BAA2B,GAC9B,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAGlF,cAAc,oBAAoB,CAAC;AAGnC,cAAc,cAAc,CAAC;AAG7B,cAAc,mBAAmB,CAAC;AAClC,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGrF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,KAAK,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAClF,YAAY,EACR,kBAAkB,EAClB,oBAAoB,EACpB,+BAA+B,EAC/B,0BAA0B,EAC1B,gCAAgC,EAChC,gBAAgB,EAChB,oBAAoB,GACvB,MAAM,mBAAmB,CAAC"}
@@ -1,7 +1,10 @@
1
1
  import "../chunk-C6A6W6XS.js";
2
2
  export * from "./types.js";
3
3
  import { defineTool } from "./define-tool.js";
4
- import { SessionToolPreferencesSchema } from "./session-tool-preferences-store.js";
4
+ import {
5
+ SessionToolPreferencesSchema,
6
+ SessionToolPreferencesStore
7
+ } from "./session-tool-preferences-store.js";
5
8
  export * from "./display-types.js";
6
9
  export * from "./schemas.js";
7
10
  export * from "./presentation.js";
@@ -10,6 +13,7 @@ import { ToolErrorCode } from "./error-codes.js";
10
13
  import { ToolManager } from "./tool-manager.js";
11
14
  export {
12
15
  SessionToolPreferencesSchema,
16
+ SessionToolPreferencesStore,
13
17
  ToolError,
14
18
  ToolErrorCode,
15
19
  ToolManager,
@@ -74,6 +74,7 @@ var import_schema = require("../utils/schema.js");
74
74
  var import_types3 = require("../approval/types.js");
75
75
  var import_schemas = require("../approval/schemas.js");
76
76
  var import_session_tool_policy = require("./approval/session-tool-policy.js");
77
+ var import_tool_approval_policy = require("./approval/tool-approval-policy.js");
77
78
  var import_tool_presentation = require("./presentation/tool-presentation.js");
78
79
  var import_decorators = require("../telemetry/decorators.js");
79
80
  var import_types4 = require("../storage/tool-executions/types.js");
@@ -103,6 +104,20 @@ let _ToolManager = class _ToolManager {
103
104
  this.logger,
104
105
  (pattern) => this.normalizeToolPolicyPattern(pattern)
105
106
  );
107
+ this.toolApprovalPolicy = new import_tool_approval_policy.ToolApprovalPolicy({
108
+ getApprovalMode: () => this.approvalMode,
109
+ getLocalTool: (toolName) => this.agentTools.get(toolName),
110
+ isApprovalKeySessionApproved: ({ approvalKey, sessionId }) => this.approvalManager.isApprovalKeySessionApproved(approvalKey, sessionId),
111
+ isToolExplicitlyAllowed: async ({ toolName, sessionId }) => {
112
+ if (sessionId !== void 0 && this.isToolAutoApprovedForSession(sessionId, toolName)) {
113
+ return true;
114
+ }
115
+ if (this.isInAlwaysAllowList(toolName)) {
116
+ return true;
117
+ }
118
+ return await this.allowedToolsProvider.isToolAllowed(toolName, sessionId);
119
+ }
120
+ });
106
121
  this.toolPresentation = new import_tool_presentation.ToolPresentation(
107
122
  (toolName) => this.agentTools.get(toolName),
108
123
  (toolName, args) => this.validateLocalToolArgs(toolName, args),
@@ -144,6 +159,7 @@ let _ToolManager = class _ToolManager {
144
159
  cacheValid = false;
145
160
  logger;
146
161
  sessionToolPolicy;
162
+ toolApprovalPolicy;
147
163
  toolPresentation;
148
164
  cleanupHandlers = /* @__PURE__ */ new Set();
149
165
  cleanupStarted = false;
@@ -463,58 +479,7 @@ let _ToolManager = class _ToolManager {
463
479
  }
464
480
  });
465
481
  }
466
- // ==================== Pattern Approval Helpers ====================
467
- getToolApprovalPatternKeyFn(toolName) {
468
- const tool = this.agentTools.get(toolName);
469
- return tool?.approval?.patternKey;
470
- }
471
- getToolSuggestApprovalPatternsFn(toolName) {
472
- const tool = this.agentTools.get(toolName);
473
- return tool?.approval?.suggestPatterns;
474
- }
475
- getToolApprovalOverrideFn(toolName) {
476
- const tool = this.agentTools.get(toolName);
477
- return tool?.approval?.override;
478
- }
479
- getToolApprovalOnGrantedFn(toolName) {
480
- const tool = this.agentTools.get(toolName);
481
- return tool?.approval?.onGranted;
482
- }
483
- getToolPatternKey(toolName, args) {
484
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
485
- return null;
486
- }
487
- const getPatternKey = this.getToolApprovalPatternKeyFn(toolName);
488
- if (!getPatternKey) {
489
- return null;
490
- }
491
- try {
492
- return getPatternKey(args);
493
- } catch (error) {
494
- this.logger.debug(
495
- `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
496
- );
497
- return null;
498
- }
499
- }
500
- getToolSuggestedPatterns(toolName, args) {
501
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
502
- return void 0;
503
- }
504
- const suggestPatterns = this.getToolSuggestApprovalPatternsFn(toolName);
505
- if (!suggestPatterns) {
506
- return void 0;
507
- }
508
- try {
509
- const patterns = suggestPatterns(args);
510
- return patterns.length > 0 ? patterns : void 0;
511
- } catch (error) {
512
- this.logger.debug(
513
- `Pattern suggestion failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
514
- );
515
- return void 0;
516
- }
517
- }
482
+ // ==================== Approval Helpers ====================
518
483
  /**
519
484
  * Auto-approve pending tool approval requests for the same tool.
520
485
  * Called after a user selects "remember choice" for a tool.
@@ -535,7 +500,7 @@ let _ToolManager = class _ToolManager {
535
500
  if (request.metadata.toolName !== toolName) {
536
501
  return false;
537
502
  }
538
- return request.metadata.directoryAccess === void 0;
503
+ return true;
539
504
  },
540
505
  { rememberChoice: false }
541
506
  // Don't propagate remember choice to auto-approved requests
@@ -546,18 +511,7 @@ let _ToolManager = class _ToolManager {
546
511
  );
547
512
  }
548
513
  }
549
- /**
550
- * Auto-approve pending tool approval requests that are now covered by a remembered pattern.
551
- * Called after a user selects "remember pattern" for a tool.
552
- */
553
- autoApprovePendingPatternRequests(toolName, sessionId) {
554
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
555
- return;
556
- }
557
- const getPatternKey = this.getToolApprovalPatternKeyFn(toolName);
558
- if (!getPatternKey) {
559
- return;
560
- }
514
+ autoApprovePendingApprovalKeyRequests(approvalKey, sessionId) {
561
515
  const count = this.approvalManager.autoApprovePendingRequests(
562
516
  (request) => {
563
517
  if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
@@ -566,64 +520,16 @@ let _ToolManager = class _ToolManager {
566
520
  if (request.sessionId !== sessionId) {
567
521
  return false;
568
522
  }
569
- if (request.metadata.toolName !== toolName) {
570
- return false;
571
- }
572
- if (request.metadata.directoryAccess !== void 0) {
573
- return false;
574
- }
575
- let patternKey;
576
- try {
577
- patternKey = getPatternKey(request.metadata.args);
578
- } catch (error) {
579
- this.logger.debug(
580
- `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
581
- );
582
- return false;
583
- }
584
- if (!patternKey) return false;
585
- return this.approvalManager.matchesPattern(toolName, patternKey, sessionId);
523
+ return request.metadata.approvalKey === approvalKey;
586
524
  },
587
- { rememberPattern: void 0 }
588
- // Don't propagate pattern choice to auto-approved requests
525
+ { rememberChoice: false }
589
526
  );
590
527
  if (count > 0) {
591
528
  this.logger.info(
592
- `Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember pattern"`
593
- );
594
- }
595
- }
596
- /**
597
- * Auto-approve pending tool approval requests that are now covered by a remembered directory.
598
- * Called after a user selects "remember directory" for a directory-access prompt.
599
- */
600
- autoApprovePendingDirectoryRequests(toolName, sessionId) {
601
- const count = this.approvalManager.autoApprovePendingRequests(
602
- (request) => {
603
- if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
604
- return false;
605
- }
606
- if (request.sessionId !== sessionId) {
607
- return false;
608
- }
609
- if (request.metadata.toolName !== toolName) {
610
- return false;
611
- }
612
- const directoryAccess = request.metadata.directoryAccess;
613
- if (!directoryAccess) {
614
- return false;
529
+ "Auto-approved parallel request(s) after approval key was remembered",
530
+ {
531
+ count
615
532
  }
616
- return this.approvalManager.isDirectorySessionApproved(
617
- directoryAccess.parentDir,
618
- sessionId
619
- );
620
- },
621
- { rememberDirectory: false }
622
- );
623
- if (count > 0) {
624
- this.logger.info(
625
- 'Auto-approved parallel request(s) after user selected "remember directory"',
626
- { count, toolName }
627
533
  );
628
534
  }
629
535
  }
@@ -924,89 +830,57 @@ let _ToolManager = class _ToolManager {
924
830
  ...callDescription !== void 0 ? { callDescription } : {},
925
831
  ...eventMeta !== void 0 ? { meta: eventMeta } : {}
926
832
  };
927
- const overrideRequest = await this.getToolApprovalOverrideRequest(
928
- input.toolName,
929
- validatedArgs,
930
- input.toolCallId,
931
- sessionId,
932
- input.runContext
933
- );
934
- if (overrideRequest) {
935
- if (!overrideRequest.directoryAccess) {
936
- return {
937
- kind: "approval-required",
938
- call,
939
- onGrantedRequestDetails: overrideRequest.onGrantedRequestDetails,
940
- requestDetails: overrideRequest.requestDetails
941
- };
942
- }
943
- const quickResult2 = await this.classifyQuickApprovalRequirement(
944
- input.toolName,
945
- validatedArgs,
833
+ const approvalGate = await this.toolApprovalPolicy.resolve({
834
+ args: validatedArgs,
835
+ getContext: () => this.buildToolExecutionContext({
946
836
  sessionId,
947
- overrideRequest.directoryAccess
948
- );
949
- if (quickResult2 === "ready") {
950
- return { kind: "ready", call };
951
- }
952
- const displayPreview2 = await this.toolPresentation.preview({
953
- toolName: input.toolName,
954
- args: validatedArgs,
955
837
  toolCallId: input.toolCallId,
956
- ...sessionId !== void 0 ? { sessionId } : {},
957
- ...input.runContext !== void 0 ? { runContext: input.runContext } : {}
958
- });
959
- const suggestedPatterns2 = this.getToolSuggestedPatterns(input.toolName, validatedArgs);
960
- return {
961
- kind: "approval-required",
962
- call,
963
- onGrantedRequestDetails: overrideRequest.onGrantedRequestDetails,
964
- requestDetails: {
965
- ...overrideRequest.requestDetails,
966
- metadata: {
967
- ...overrideRequest.requestDetails.metadata,
968
- presentationSnapshot,
969
- ...callDescription !== void 0 ? { description: callDescription } : {},
970
- ...displayPreview2 !== void 0 ? { displayPreview: displayPreview2 } : {},
971
- ...suggestedPatterns2 !== void 0 ? { suggestedPatterns: suggestedPatterns2 } : {}
972
- }
973
- }
974
- };
975
- }
976
- const quickResult = await this.classifyQuickApprovalRequirement(
977
- input.toolName,
978
- validatedArgs,
979
- sessionId
980
- );
981
- if (quickResult === "ready") {
838
+ runContext: input.runContext
839
+ }),
840
+ ...sessionId !== void 0 ? { sessionId } : {},
841
+ source,
842
+ toolName: input.toolName
843
+ });
844
+ if (approvalGate.kind === "ready") {
982
845
  return { kind: "ready", call };
983
846
  }
984
- const displayPreview = await this.toolPresentation.preview({
985
- toolName: input.toolName,
847
+ return await this.prepareApprovalRequiredToolCall({
848
+ approvalGate,
986
849
  args: validatedArgs,
987
- toolCallId: input.toolCallId,
850
+ call,
851
+ ...callDescription !== void 0 ? { callDescription } : {},
852
+ ...input.runContext !== void 0 ? { runContext: input.runContext } : {},
988
853
  ...sessionId !== void 0 ? { sessionId } : {},
989
- ...input.runContext !== void 0 ? { runContext: input.runContext } : {}
854
+ toolCallId: input.toolCallId,
855
+ toolName: input.toolName
856
+ });
857
+ }
858
+ async prepareApprovalRequiredToolCall(input) {
859
+ const displayPreview = await this.toolPresentation.preview({
860
+ args: input.args,
861
+ ...input.runContext !== void 0 ? { runContext: input.runContext } : {},
862
+ ...input.sessionId !== void 0 ? { sessionId: input.sessionId } : {},
863
+ toolCallId: input.toolCallId,
864
+ toolName: input.toolName
990
865
  });
991
- const suggestedPatterns = this.getToolSuggestedPatterns(input.toolName, validatedArgs);
992
866
  const hostRuntime = input.runContext?.hostRuntime;
993
867
  const requestDetails = {
994
868
  type: import_types3.ApprovalType.TOOL_APPROVAL,
995
- ...sessionId !== void 0 ? { sessionId } : {},
869
+ ...input.sessionId !== void 0 ? { sessionId: input.sessionId } : {},
996
870
  ...hostRuntime !== void 0 ? { hostRuntime } : {},
997
871
  metadata: {
998
872
  toolName: input.toolName,
999
- presentationSnapshot,
873
+ ...input.approvalGate.approvalKey !== void 0 ? { approvalKey: input.approvalGate.approvalKey } : {},
874
+ presentationSnapshot: input.call.presentationSnapshot,
1000
875
  toolCallId: input.toolCallId,
1001
- args: validatedArgs,
1002
- ...callDescription !== void 0 ? { description: callDescription } : {},
1003
- ...displayPreview !== void 0 ? { displayPreview } : {},
1004
- ...suggestedPatterns !== void 0 ? { suggestedPatterns } : {}
876
+ args: input.args,
877
+ ...input.callDescription !== void 0 ? { description: input.callDescription } : {},
878
+ ...displayPreview !== void 0 ? { displayPreview } : {}
1005
879
  }
1006
880
  };
1007
881
  return {
1008
882
  kind: "approval-required",
1009
- call,
883
+ call: input.call,
1010
884
  onGrantedRequestDetails: requestDetails,
1011
885
  requestDetails
1012
886
  };
@@ -1020,7 +894,7 @@ let _ToolManager = class _ToolManager {
1020
894
  this.assertRecordedApprovalMatchesPreparedCall(prepared, request);
1021
895
  return { prepared, request };
1022
896
  }
1023
- async applyApprovalDecision(recorded, decision, runContext) {
897
+ async applyApprovalDecision(recorded, decision) {
1024
898
  if (decision.approvalId !== recorded.request.approvalId) {
1025
899
  throw import_errors.ToolError.executionFailed(
1026
900
  recorded.prepared.call.toolName,
@@ -1043,7 +917,7 @@ let _ToolManager = class _ToolManager {
1043
917
  response: record.response
1044
918
  };
1045
919
  }
1046
- await this.applyApprovalGrantedEffects(recorded.prepared, record.response, runContext);
920
+ await this.applyApprovalGrantedEffects(recorded.prepared, record.response);
1047
921
  return {
1048
922
  kind: "ready",
1049
923
  call: {
@@ -1082,28 +956,6 @@ let _ToolManager = class _ToolManager {
1082
956
  assertOnGrantedRequestMatchesPreparedCall(prepared) {
1083
957
  const approvalDetails = prepared.requestDetails;
1084
958
  const grantedDetails = prepared.onGrantedRequestDetails;
1085
- const directoryAccess = approvalDetails.type === import_types3.ApprovalType.TOOL_APPROVAL && "directoryAccess" in approvalDetails.metadata ? import_schemas.DirectoryAccessMetadataSchema.parse(approvalDetails.metadata.directoryAccess) : void 0;
1086
- if (directoryAccess !== void 0) {
1087
- const expected = {
1088
- type: import_types3.ApprovalType.DIRECTORY_ACCESS,
1089
- sessionId: approvalDetails.sessionId,
1090
- hostRuntime: approvalDetails.hostRuntime,
1091
- metadata: directoryAccess
1092
- };
1093
- const actual = {
1094
- type: grantedDetails.type,
1095
- sessionId: grantedDetails.sessionId,
1096
- hostRuntime: grantedDetails.hostRuntime,
1097
- metadata: grantedDetails.metadata
1098
- };
1099
- if (!(0, import_node_util.isDeepStrictEqual)(actual, expected)) {
1100
- throw import_errors.ToolError.executionFailed(
1101
- prepared.call.toolName,
1102
- "Approval granted-effects request does not match the prepared tool call"
1103
- );
1104
- }
1105
- return;
1106
- }
1107
959
  if (!(0, import_node_util.isDeepStrictEqual)(grantedDetails, approvalDetails)) {
1108
960
  throw import_errors.ToolError.executionFailed(
1109
961
  prepared.call.toolName,
@@ -1111,26 +963,30 @@ let _ToolManager = class _ToolManager {
1111
963
  );
1112
964
  }
1113
965
  }
1114
- async applyApprovalGrantedEffects(prepared, response, runContext) {
1115
- const requestDetails = prepared.onGrantedRequestDetails;
966
+ async applyApprovalGrantedEffects(prepared, response) {
1116
967
  const approvalRequestDetails = prepared.requestDetails;
1117
968
  const sessionId = approvalRequestDetails.sessionId;
1118
- const onGranted = this.getToolApprovalOnGrantedFn(prepared.call.toolName);
1119
- if (onGranted) {
1120
- const context = this.buildToolExecutionContext({
1121
- sessionId,
1122
- toolCallId: prepared.call.toolCallId,
1123
- runContext
1124
- });
1125
- await Promise.resolve(onGranted(response, context, requestDetails));
1126
- }
1127
- if (approvalRequestDetails.type === import_types3.ApprovalType.TOOL_APPROVAL && response.data) {
969
+ if (approvalRequestDetails.type === import_types3.ApprovalType.TOOL_APPROVAL) {
970
+ const toolMetadata = import_schemas.ToolApprovalMetadataSchema.parse(approvalRequestDetails.metadata);
971
+ const approvalKey = toolMetadata.approvalKey;
972
+ const data = response.data ? import_schemas.ToolApprovalResponseDataSchema.parse(response.data) : void 0;
973
+ if (approvalKey !== void 0) {
974
+ await this.approvalManager.addApprovedKey(
975
+ approvalKey,
976
+ data?.rememberChoice ? "session" : "once",
977
+ sessionId
978
+ );
979
+ }
980
+ if (!data) {
981
+ return;
982
+ }
1128
983
  await this.handleRememberChoice(
1129
984
  prepared.call.toolName,
1130
985
  {
1131
- data: import_schemas.ToolApprovalResponseDataSchema.parse(response.data),
986
+ data,
1132
987
  ...response.sessionId !== void 0 ? { sessionId: response.sessionId } : {}
1133
988
  },
989
+ approvalKey,
1134
990
  sessionId
1135
991
  );
1136
992
  }
@@ -1186,72 +1042,6 @@ let _ToolManager = class _ToolManager {
1186
1042
  }
1187
1043
  };
1188
1044
  }
1189
- async getToolApprovalOverrideRequest(toolName, args, toolCallId, sessionId, runContext) {
1190
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
1191
- return null;
1192
- }
1193
- const getApprovalOverride = this.getToolApprovalOverrideFn(toolName);
1194
- if (!getApprovalOverride) {
1195
- return null;
1196
- }
1197
- const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
1198
- const approvalRequest = await getApprovalOverride(args, context);
1199
- if (!approvalRequest) {
1200
- return null;
1201
- }
1202
- const requestDetails = {
1203
- ...approvalRequest,
1204
- ...sessionId && !approvalRequest.sessionId ? { sessionId } : {},
1205
- ...runContext?.hostRuntime !== void 0 && approvalRequest.hostRuntime === void 0 ? { hostRuntime: runContext.hostRuntime } : {}
1206
- };
1207
- if (requestDetails.type !== import_types3.ApprovalType.DIRECTORY_ACCESS) {
1208
- return { requestDetails, onGrantedRequestDetails: requestDetails };
1209
- }
1210
- const parseResult = import_schemas.DirectoryAccessMetadataSchema.safeParse(requestDetails.metadata);
1211
- if (!parseResult.success) {
1212
- throw import_errors.ToolError.configInvalid(
1213
- `Tool '${toolName}' returned invalid directory access metadata`
1214
- );
1215
- }
1216
- const directoryAccess = parseResult.data;
1217
- return {
1218
- directoryAccess,
1219
- onGrantedRequestDetails: requestDetails,
1220
- requestDetails: {
1221
- type: import_types3.ApprovalType.TOOL_APPROVAL,
1222
- ...requestDetails.sessionId !== void 0 ? { sessionId: requestDetails.sessionId } : {},
1223
- ...requestDetails.hostRuntime !== void 0 ? { hostRuntime: requestDetails.hostRuntime } : {},
1224
- metadata: {
1225
- toolName,
1226
- toolCallId,
1227
- args,
1228
- directoryAccess
1229
- }
1230
- }
1231
- };
1232
- }
1233
- async classifyQuickApprovalRequirement(toolName, args, sessionId, directoryAccess) {
1234
- if (directoryAccess) {
1235
- return this.approvalMode === "auto-approve" ? "ready" : "approval-required";
1236
- }
1237
- if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
1238
- return "ready";
1239
- }
1240
- if (this.isInAlwaysAllowList(toolName)) {
1241
- return "ready";
1242
- }
1243
- if (await this.allowedToolsProvider.isToolAllowed(toolName, sessionId)) {
1244
- return "ready";
1245
- }
1246
- const patternKey = this.getToolPatternKey(toolName, args);
1247
- if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey, sessionId)) {
1248
- return "ready";
1249
- }
1250
- if (this.approvalMode === "auto-approve") {
1251
- return "ready";
1252
- }
1253
- return "approval-required";
1254
- }
1255
1045
  async executeTool(toolName, args, toolCallId, invocation) {
1256
1046
  const { sessionId, runContext, hostRuntime } = this.resolveToolExecutionInvocation(invocation);
1257
1047
  this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
@@ -1284,17 +1074,14 @@ let _ToolManager = class _ToolManager {
1284
1074
  this.resolveDirectApprovalIdentity(invocation, toolCallId)
1285
1075
  );
1286
1076
  const response = await this.requestApprovalDecision(recorded);
1287
- applied = await this.applyApprovalDecision(
1288
- recorded,
1289
- {
1290
- approvalId: response.approvalId,
1291
- status: response.status,
1292
- ...response.reason !== void 0 ? { reason: response.reason } : {},
1293
- ...response.message !== void 0 ? { message: response.message } : {},
1294
- ...response.data !== void 0 ? { data: response.data } : {}
1295
- },
1296
- runContext
1297
- );
1077
+ applied = await this.applyApprovalDecision(recorded, {
1078
+ approvalId: response.approvalId,
1079
+ status: response.status,
1080
+ ...response.reason !== void 0 ? { reason: response.reason } : {},
1081
+ ...response.message !== void 0 ? { message: response.message } : {},
1082
+ ...response.timeoutMs !== void 0 ? { timeoutMs: response.timeoutMs } : {},
1083
+ ...response.data !== void 0 ? { data: response.data } : {}
1084
+ });
1298
1085
  } catch (error) {
1299
1086
  await this.recordDirectToolExecutionFailure(prepared.call, invocation, error);
1300
1087
  throw error;
@@ -1800,26 +1587,21 @@ let _ToolManager = class _ToolManager {
1800
1587
  /**
1801
1588
  * Handle "remember" actions when user approves a tool.
1802
1589
  */
1803
- async handleRememberChoice(toolName, response, sessionId) {
1590
+ async handleRememberChoice(toolName, response, approvalKey, sessionId) {
1804
1591
  const data = response.data;
1805
1592
  if (!data) return;
1806
1593
  const rememberChoice = data.rememberChoice;
1807
- const rememberPattern = data.rememberPattern;
1808
- const rememberDirectory = data.rememberDirectory;
1809
1594
  if (rememberChoice) {
1810
1595
  const allowSessionId = sessionId ?? response.sessionId;
1811
- await this.allowedToolsProvider.allowTool(toolName, allowSessionId);
1812
- this.logger.info(
1813
- `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
1814
- );
1815
- this.autoApprovePendingToolRequests(toolName, allowSessionId);
1816
- } else if (rememberPattern && this.getToolApprovalPatternKeyFn(toolName)) {
1817
- await this.approvalManager.addPattern(toolName, rememberPattern, sessionId);
1818
- this.logger.info(`Pattern '${rememberPattern}' added for tool '${toolName}' approval`);
1819
- this.autoApprovePendingPatternRequests(toolName, sessionId);
1820
- } else if (rememberDirectory) {
1821
- const allowSessionId = sessionId ?? response.sessionId;
1822
- this.autoApprovePendingDirectoryRequests(toolName, allowSessionId);
1596
+ if (approvalKey !== void 0) {
1597
+ this.autoApprovePendingApprovalKeyRequests(approvalKey, allowSessionId);
1598
+ } else {
1599
+ await this.allowedToolsProvider.allowTool(toolName, allowSessionId);
1600
+ this.logger.info(
1601
+ `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
1602
+ );
1603
+ this.autoApprovePendingToolRequests(toolName, allowSessionId);
1604
+ }
1823
1605
  }
1824
1606
  }
1825
1607
  /**