@dexto/core 1.6.0 → 1.6.2

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 (188) hide show
  1. package/dist/agent/DextoAgent.cjs +79 -5
  2. package/dist/agent/DextoAgent.d.ts +24 -2
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +79 -5
  5. package/dist/agent/agent-options.d.ts +6 -1
  6. package/dist/agent/agent-options.d.ts.map +1 -1
  7. package/dist/agent/schemas.d.ts +18 -18
  8. package/dist/approval/manager.cjs +87 -27
  9. package/dist/approval/manager.d.ts +10 -1
  10. package/dist/approval/manager.d.ts.map +1 -1
  11. package/dist/approval/manager.js +87 -27
  12. package/dist/approval/schemas.cjs +22 -8
  13. package/dist/approval/schemas.d.ts +276 -102
  14. package/dist/approval/schemas.d.ts.map +1 -1
  15. package/dist/approval/schemas.js +22 -8
  16. package/dist/context/manager.cjs +2 -2
  17. package/dist/context/manager.d.ts +2 -1
  18. package/dist/context/manager.d.ts.map +1 -1
  19. package/dist/context/manager.js +2 -2
  20. package/dist/context/types.d.ts +3 -2
  21. package/dist/context/types.d.ts.map +1 -1
  22. package/dist/events/index.d.ts +26 -13
  23. package/dist/events/index.d.ts.map +1 -1
  24. package/dist/hooks/index.d.ts +1 -1
  25. package/dist/hooks/index.d.ts.map +1 -1
  26. package/dist/hooks/types.d.ts +1 -22
  27. package/dist/hooks/types.d.ts.map +1 -1
  28. package/dist/llm/executor/provider-options.cjs +223 -28
  29. package/dist/llm/executor/provider-options.d.ts +3 -37
  30. package/dist/llm/executor/provider-options.d.ts.map +1 -1
  31. package/dist/llm/executor/provider-options.js +227 -27
  32. package/dist/llm/executor/stream-processor.cjs +57 -34
  33. package/dist/llm/executor/stream-processor.d.ts +12 -4
  34. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  35. package/dist/llm/executor/stream-processor.js +55 -32
  36. package/dist/llm/executor/turn-executor.cjs +66 -44
  37. package/dist/llm/executor/turn-executor.d.ts +3 -3
  38. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  39. package/dist/llm/executor/turn-executor.js +56 -34
  40. package/dist/llm/formatters/vercel.cjs +15 -3
  41. package/dist/llm/formatters/vercel.d.ts +1 -0
  42. package/dist/llm/formatters/vercel.d.ts.map +1 -1
  43. package/dist/llm/formatters/vercel.js +15 -3
  44. package/dist/llm/index.cjs +8 -0
  45. package/dist/llm/index.d.ts +2 -1
  46. package/dist/llm/index.d.ts.map +1 -1
  47. package/dist/llm/index.js +7 -0
  48. package/dist/llm/providers/local/schemas.d.ts +2 -2
  49. package/dist/llm/providers/openrouter-model-registry.cjs +66 -11
  50. package/dist/llm/providers/openrouter-model-registry.d.ts +26 -0
  51. package/dist/llm/providers/openrouter-model-registry.d.ts.map +1 -1
  52. package/dist/llm/providers/openrouter-model-registry.js +65 -11
  53. package/dist/llm/reasoning/anthropic-betas.cjs +31 -0
  54. package/dist/llm/reasoning/anthropic-betas.d.ts +3 -0
  55. package/dist/llm/reasoning/anthropic-betas.d.ts.map +1 -0
  56. package/dist/llm/reasoning/anthropic-betas.js +7 -0
  57. package/dist/llm/reasoning/anthropic-thinking.cjs +79 -0
  58. package/dist/llm/reasoning/anthropic-thinking.d.ts +15 -0
  59. package/dist/llm/reasoning/anthropic-thinking.d.ts.map +1 -0
  60. package/dist/llm/reasoning/anthropic-thinking.js +52 -0
  61. package/dist/llm/reasoning/openai-reasoning-effort.cjs +86 -0
  62. package/dist/llm/reasoning/openai-reasoning-effort.d.ts +5 -0
  63. package/dist/llm/reasoning/openai-reasoning-effort.d.ts.map +1 -0
  64. package/dist/llm/reasoning/openai-reasoning-effort.js +61 -0
  65. package/dist/llm/reasoning/profile.cjs +113 -0
  66. package/dist/llm/reasoning/profile.d.ts +13 -0
  67. package/dist/llm/reasoning/profile.d.ts.map +1 -0
  68. package/dist/llm/reasoning/profile.js +92 -0
  69. package/dist/llm/reasoning/profiles/anthropic.cjs +61 -0
  70. package/dist/llm/reasoning/profiles/anthropic.d.ts +8 -0
  71. package/dist/llm/reasoning/profiles/anthropic.d.ts.map +1 -0
  72. package/dist/llm/reasoning/profiles/anthropic.js +45 -0
  73. package/dist/llm/reasoning/profiles/bedrock.cjs +54 -0
  74. package/dist/llm/reasoning/profiles/bedrock.d.ts +3 -0
  75. package/dist/llm/reasoning/profiles/bedrock.d.ts.map +1 -0
  76. package/dist/llm/reasoning/profiles/bedrock.js +36 -0
  77. package/dist/llm/reasoning/profiles/google.cjs +45 -0
  78. package/dist/llm/reasoning/profiles/google.d.ts +9 -0
  79. package/dist/llm/reasoning/profiles/google.d.ts.map +1 -0
  80. package/dist/llm/reasoning/profiles/google.js +21 -0
  81. package/dist/llm/reasoning/profiles/openai-compatible.cjs +39 -0
  82. package/dist/llm/reasoning/profiles/openai-compatible.d.ts +3 -0
  83. package/dist/llm/reasoning/profiles/openai-compatible.d.ts.map +1 -0
  84. package/dist/llm/reasoning/profiles/openai-compatible.js +16 -0
  85. package/dist/llm/reasoning/profiles/openai.cjs +41 -0
  86. package/dist/llm/reasoning/profiles/openai.d.ts +3 -0
  87. package/dist/llm/reasoning/profiles/openai.d.ts.map +1 -0
  88. package/dist/llm/reasoning/profiles/openai.js +18 -0
  89. package/dist/llm/reasoning/profiles/openrouter.cjs +83 -0
  90. package/dist/llm/reasoning/profiles/openrouter.d.ts +10 -0
  91. package/dist/llm/reasoning/profiles/openrouter.d.ts.map +1 -0
  92. package/dist/llm/reasoning/profiles/openrouter.js +59 -0
  93. package/dist/llm/reasoning/profiles/shared.cjs +80 -0
  94. package/dist/llm/reasoning/profiles/shared.d.ts +25 -0
  95. package/dist/llm/reasoning/profiles/shared.d.ts.map +1 -0
  96. package/dist/llm/reasoning/profiles/shared.js +53 -0
  97. package/dist/llm/reasoning/profiles/vertex.cjs +46 -0
  98. package/dist/llm/reasoning/profiles/vertex.d.ts +3 -0
  99. package/dist/llm/reasoning/profiles/vertex.d.ts.map +1 -0
  100. package/dist/llm/reasoning/profiles/vertex.js +23 -0
  101. package/dist/llm/registry/auto-update.cjs +18 -0
  102. package/dist/llm/registry/auto-update.d.ts.map +1 -1
  103. package/dist/llm/registry/auto-update.js +18 -0
  104. package/dist/llm/registry/index.cjs +126 -26
  105. package/dist/llm/registry/index.d.ts +48 -4
  106. package/dist/llm/registry/index.d.ts.map +1 -1
  107. package/dist/llm/registry/index.js +136 -28
  108. package/dist/llm/registry/models.generated.cjs +5198 -59
  109. package/dist/llm/registry/models.generated.d.ts +1893 -76
  110. package/dist/llm/registry/models.generated.d.ts.map +1 -1
  111. package/dist/llm/registry/models.generated.js +5196 -58
  112. package/dist/llm/registry/sync.cjs +72 -1
  113. package/dist/llm/registry/sync.d.ts +21 -1
  114. package/dist/llm/registry/sync.d.ts.map +1 -1
  115. package/dist/llm/registry/sync.js +72 -1
  116. package/dist/llm/resolver.cjs +13 -1
  117. package/dist/llm/resolver.d.ts.map +1 -1
  118. package/dist/llm/resolver.js +13 -1
  119. package/dist/llm/schemas.cjs +75 -14
  120. package/dist/llm/schemas.d.ts +84 -27
  121. package/dist/llm/schemas.d.ts.map +1 -1
  122. package/dist/llm/schemas.js +75 -14
  123. package/dist/llm/services/factory.cjs +55 -8
  124. package/dist/llm/services/factory.d.ts +1 -1
  125. package/dist/llm/services/factory.d.ts.map +1 -1
  126. package/dist/llm/services/factory.js +58 -8
  127. package/dist/llm/services/vercel.cjs +2 -2
  128. package/dist/llm/services/vercel.js +2 -2
  129. package/dist/llm/types.d.ts +9 -0
  130. package/dist/llm/types.d.ts.map +1 -1
  131. package/dist/logger/default-logger-factory.d.ts +12 -12
  132. package/dist/logger/v2/dexto-logger.cjs +35 -0
  133. package/dist/logger/v2/dexto-logger.d.ts +19 -0
  134. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  135. package/dist/logger/v2/dexto-logger.js +35 -0
  136. package/dist/logger/v2/schemas.d.ts +6 -6
  137. package/dist/logger/v2/test-utils.cjs +2 -0
  138. package/dist/logger/v2/test-utils.d.ts.map +1 -1
  139. package/dist/logger/v2/test-utils.js +2 -0
  140. package/dist/logger/v2/types.d.ts +14 -1
  141. package/dist/logger/v2/types.d.ts.map +1 -1
  142. package/dist/mcp/schemas.d.ts +15 -15
  143. package/dist/memory/schemas.d.ts +4 -4
  144. package/dist/prompts/index.cjs +9 -0
  145. package/dist/prompts/index.d.ts +1 -0
  146. package/dist/prompts/index.d.ts.map +1 -1
  147. package/dist/prompts/index.js +10 -0
  148. package/dist/prompts/prompt-manager.cjs +2 -0
  149. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  150. package/dist/prompts/prompt-manager.js +2 -0
  151. package/dist/prompts/providers/config-prompt-provider.cjs +11 -1
  152. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  153. package/dist/prompts/providers/config-prompt-provider.js +11 -1
  154. package/dist/prompts/schemas.cjs +2 -2
  155. package/dist/prompts/schemas.d.ts +7 -7
  156. package/dist/prompts/schemas.js +2 -2
  157. package/dist/prompts/types.d.ts +6 -2
  158. package/dist/prompts/types.d.ts.map +1 -1
  159. package/dist/systemPrompt/in-built-prompts.cjs +5 -5
  160. package/dist/systemPrompt/in-built-prompts.d.ts +1 -1
  161. package/dist/systemPrompt/in-built-prompts.d.ts.map +1 -1
  162. package/dist/systemPrompt/in-built-prompts.js +5 -5
  163. package/dist/systemPrompt/schemas.d.ts +5 -5
  164. package/dist/systemPrompt/types.d.ts +11 -0
  165. package/dist/systemPrompt/types.d.ts.map +1 -1
  166. package/dist/tools/display-types.d.ts +10 -0
  167. package/dist/tools/display-types.d.ts.map +1 -1
  168. package/dist/tools/index.cjs +3 -1
  169. package/dist/tools/index.d.ts +1 -0
  170. package/dist/tools/index.d.ts.map +1 -1
  171. package/dist/tools/index.js +1 -0
  172. package/dist/tools/presentation.cjs +49 -0
  173. package/dist/tools/presentation.d.ts +11 -0
  174. package/dist/tools/presentation.d.ts.map +1 -0
  175. package/dist/tools/presentation.js +24 -0
  176. package/dist/tools/tool-manager.cjs +389 -136
  177. package/dist/tools/tool-manager.d.ts +36 -24
  178. package/dist/tools/tool-manager.d.ts.map +1 -1
  179. package/dist/tools/tool-manager.js +389 -136
  180. package/dist/tools/types.d.ts +134 -55
  181. package/dist/tools/types.d.ts.map +1 -1
  182. package/dist/utils/path.cjs +10 -1
  183. package/dist/utils/path.d.ts +5 -2
  184. package/dist/utils/path.d.ts.map +1 -1
  185. package/dist/utils/path.js +10 -1
  186. package/dist/utils/service-initializer.d.ts +1 -0
  187. package/dist/utils/service-initializer.d.ts.map +1 -1
  188. package/package.json +7 -5
@@ -76,7 +76,7 @@ export declare class ApprovalManager {
76
76
  * Check if a pattern key is covered by any approved pattern for a tool.
77
77
  *
78
78
  * Note: This expects a pattern key (e.g. "git push *"), not raw arguments.
79
- * Tools are responsible for generating the key via Tool.getApprovalPatternKey().
79
+ * Tools are responsible for generating the key via `tool.approval.patternKey()`.
80
80
  */
81
81
  matchesPattern(toolName: string, patternKey: string): boolean;
82
82
  /**
@@ -91,6 +91,15 @@ export declare class ApprovalManager {
91
91
  * Get all tool patterns (for debugging/display).
92
92
  */
93
93
  getAllToolPatterns(): ReadonlyMap<string, Set<string>>;
94
+ /**
95
+ * Resolve a directory path for use as an approval key.
96
+ *
97
+ * We store BOTH the resolved path and (when available) its realpath, so approvals
98
+ * continue to work even when other subsystems canonicalize paths via realpath
99
+ * (e.g. macOS /tmp -> /private/tmp or custom symlinked directories).
100
+ */
101
+ private getDirectoryApprovalKeys;
102
+ private getFileApprovalKeys;
94
103
  /**
95
104
  * Initialize the working directory as a session-approved directory.
96
105
  * This should be called once during setup to ensure the working directory
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/approval/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/approval/manager.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,35 @@
1
1
  import "../chunk-PTJYTZNU.js";
2
2
  import path from "node:path";
3
+ import { realpathSync } from "node:fs";
3
4
  import { ApprovalType, ApprovalStatus, DenialReason } from "./types.js";
4
5
  import { createApprovalRequest } from "./factory.js";
5
6
  import { DextoLogComponent } from "../logger/v2/types.js";
6
7
  import { ApprovalError } from "./errors.js";
7
8
  import { patternCovers } from "../tools/pattern-utils.js";
9
+ function tryRealpathSync(targetPath) {
10
+ try {
11
+ return realpathSync(targetPath);
12
+ } catch {
13
+ return null;
14
+ }
15
+ }
16
+ function tryRealpathSyncWithExistingParent(resolvedPath) {
17
+ const direct = tryRealpathSync(resolvedPath);
18
+ if (direct) return direct;
19
+ let currentDir = path.dirname(resolvedPath);
20
+ while (true) {
21
+ const realDir = tryRealpathSync(currentDir);
22
+ if (realDir) {
23
+ const suffix = path.relative(currentDir, resolvedPath);
24
+ return path.join(realDir, suffix);
25
+ }
26
+ const parent = path.dirname(currentDir);
27
+ if (parent === currentDir) {
28
+ return null;
29
+ }
30
+ currentDir = parent;
31
+ }
32
+ }
8
33
  class ApprovalManager {
9
34
  handler;
10
35
  config;
@@ -50,7 +75,7 @@ class ApprovalManager {
50
75
  * Check if a pattern key is covered by any approved pattern for a tool.
51
76
  *
52
77
  * Note: This expects a pattern key (e.g. "git push *"), not raw arguments.
53
- * Tools are responsible for generating the key via Tool.getApprovalPatternKey().
78
+ * Tools are responsible for generating the key via `tool.approval.patternKey()`.
54
79
  */
55
80
  matchesPattern(toolName, patternKey) {
56
81
  const patterns = this.toolPatterns.get(toolName);
@@ -101,6 +126,29 @@ class ApprovalManager {
101
126
  return this.toolPatterns;
102
127
  }
103
128
  // ==================== Directory Access Methods ====================
129
+ /**
130
+ * Resolve a directory path for use as an approval key.
131
+ *
132
+ * We store BOTH the resolved path and (when available) its realpath, so approvals
133
+ * continue to work even when other subsystems canonicalize paths via realpath
134
+ * (e.g. macOS /tmp -> /private/tmp or custom symlinked directories).
135
+ */
136
+ getDirectoryApprovalKeys(directory) {
137
+ const resolved = path.resolve(directory);
138
+ const real = tryRealpathSyncWithExistingParent(resolved);
139
+ if (real && real !== resolved) {
140
+ return [resolved, real];
141
+ }
142
+ return [resolved];
143
+ }
144
+ getFileApprovalKeys(filePath) {
145
+ const resolved = path.resolve(filePath);
146
+ const real = tryRealpathSyncWithExistingParent(resolved);
147
+ if (real && real !== resolved) {
148
+ return [resolved, real];
149
+ }
150
+ return [resolved];
151
+ }
104
152
  /**
105
153
  * Initialize the working directory as a session-approved directory.
106
154
  * This should be called once during setup to ensure the working directory
@@ -109,9 +157,7 @@ class ApprovalManager {
109
157
  * @param workingDir The working directory path
110
158
  */
111
159
  initializeWorkingDirectory(workingDir) {
112
- const normalized = path.resolve(workingDir);
113
- this.approvedDirectories.set(normalized, "session");
114
- this.logger.debug(`Initialized working directory as session-approved: "${normalized}"`);
160
+ this.addApprovedDirectory(workingDir, "session");
115
161
  }
116
162
  /**
117
163
  * Add a directory to the approved list for this session.
@@ -131,16 +177,28 @@ class ApprovalManager {
131
177
  * ```
132
178
  */
133
179
  addApprovedDirectory(directory, type = "session") {
134
- const normalized = path.resolve(directory);
135
- const existing = this.approvedDirectories.get(normalized);
136
- if (existing === "session") {
180
+ const keys = this.getDirectoryApprovalKeys(directory);
181
+ const existingTypes = keys.map((key) => this.approvedDirectories.get(key)).filter((value) => value !== void 0);
182
+ const hasSessionApproval = existingTypes.includes("session");
183
+ const effectiveType = type === "session" || hasSessionApproval ? "session" : "once";
184
+ for (const key of keys) {
185
+ const existing = this.approvedDirectories.get(key);
186
+ if (existing === "session") {
187
+ continue;
188
+ }
189
+ this.approvedDirectories.set(key, effectiveType);
190
+ }
191
+ const resolvedKey = keys[0];
192
+ if (effectiveType === "session" && type === "once" && hasSessionApproval) {
137
193
  this.logger.debug(
138
- `Directory "${normalized}" already approved as 'session', not downgrading to '${type}'`
194
+ `Directory "${resolvedKey}" already approved as 'session', not downgrading to 'once'`
139
195
  );
140
196
  return;
141
197
  }
142
- this.approvedDirectories.set(normalized, type);
143
- this.logger.debug(`Added approved directory: "${normalized}" (type: ${type})`);
198
+ const realKey = keys.length > 1 ? keys[1] : null;
199
+ this.logger.debug(
200
+ `Added approved directory: "${resolvedKey}" (type: ${effectiveType})${realKey ? `, realpath: "${realKey}"` : ""}`
201
+ );
144
202
  }
145
203
  /**
146
204
  * Check if a file path is within any session-approved directory.
@@ -151,15 +209,16 @@ class ApprovalManager {
151
209
  * @returns true if the path is within a session-approved directory
152
210
  */
153
211
  isDirectorySessionApproved(filePath) {
154
- const normalized = path.resolve(filePath);
155
- for (const [approvedDir, type] of this.approvedDirectories) {
156
- if (type !== "session") continue;
157
- const relative = path.relative(approvedDir, normalized);
158
- if (!relative.startsWith("..") && !path.isAbsolute(relative)) {
159
- this.logger.debug(
160
- `Path "${normalized}" is within session-approved directory "${approvedDir}"`
161
- );
162
- return true;
212
+ for (const normalized of this.getFileApprovalKeys(filePath)) {
213
+ for (const [approvedDir, type] of this.approvedDirectories) {
214
+ if (type !== "session") continue;
215
+ const relative = path.relative(approvedDir, normalized);
216
+ if (!relative.startsWith("..") && !path.isAbsolute(relative)) {
217
+ this.logger.debug(
218
+ `Path "${normalized}" is within session-approved directory "${approvedDir}"`
219
+ );
220
+ return true;
221
+ }
163
222
  }
164
223
  }
165
224
  return false;
@@ -173,14 +232,15 @@ class ApprovalManager {
173
232
  * @returns true if the path is within any approved directory
174
233
  */
175
234
  isDirectoryApproved(filePath) {
176
- const normalized = path.resolve(filePath);
177
- for (const [approvedDir] of this.approvedDirectories) {
178
- const relative = path.relative(approvedDir, normalized);
179
- if (!relative.startsWith("..") && !path.isAbsolute(relative)) {
180
- this.logger.debug(
181
- `Path "${normalized}" is within approved directory "${approvedDir}"`
182
- );
183
- return true;
235
+ for (const normalized of this.getFileApprovalKeys(filePath)) {
236
+ for (const [approvedDir] of this.approvedDirectories) {
237
+ const relative = path.relative(approvedDir, normalized);
238
+ if (!relative.startsWith("..") && !path.isAbsolute(relative)) {
239
+ this.logger.debug(
240
+ `Path "${normalized}" is within approved directory "${approvedDir}"`
241
+ );
242
+ return true;
243
+ }
184
244
  }
185
245
  }
186
246
  return false;
@@ -58,15 +58,32 @@ const DenialReasonSchema = import_zod.z.nativeEnum(import_types.DenialReason);
58
58
  const ToolDisplayDataSchema = import_zod.z.custom((val) => (0, import_display_types.isValidDisplayData)(val), {
59
59
  message: "Invalid ToolDisplayData"
60
60
  });
61
+ const ToolPresentationSnapshotV1Schema = import_zod.z.custom(
62
+ (val) => typeof val === "object" && val !== null && val.version === 1,
63
+ {
64
+ message: "Invalid ToolPresentationSnapshotV1"
65
+ }
66
+ );
67
+ const DirectoryAccessMetadataSchema = import_zod.z.object({
68
+ path: import_zod.z.string().describe("Full path being accessed"),
69
+ parentDir: import_zod.z.string().describe("Parent directory (what gets approved for session)"),
70
+ operation: import_zod.z.enum(["read", "write", "edit"]).describe("Type of file operation"),
71
+ toolName: import_zod.z.string().describe("Name of the tool requesting access")
72
+ }).strict().describe("Directory access metadata");
61
73
  const ToolApprovalMetadataSchema = import_zod.z.object({
62
74
  toolName: import_zod.z.string().describe("Name of the tool to confirm"),
63
- toolDisplayName: import_zod.z.string().optional().describe("Optional user-facing name for the tool (UI convenience)"),
75
+ presentationSnapshot: ToolPresentationSnapshotV1Schema.optional().describe(
76
+ "Optional UI-agnostic presentation snapshot for the tool call. Clients MUST ignore unknown fields."
77
+ ),
64
78
  toolCallId: import_zod.z.string().describe("Unique tool call ID for tracking parallel tool calls"),
65
79
  args: import_zod.z.record(import_zod.z.unknown()).describe("Arguments for the tool"),
66
80
  description: import_zod.z.string().optional().describe("Description of the tool"),
67
81
  displayPreview: ToolDisplayDataSchema.optional().describe(
68
82
  "Preview display data for approval UI (e.g., diff preview)"
69
83
  ),
84
+ directoryAccess: DirectoryAccessMetadataSchema.optional().describe(
85
+ "Optional directory access metadata when the tool targets a path outside config-allowed roots"
86
+ ),
70
87
  suggestedPatterns: import_zod.z.array(import_zod.z.string()).optional().describe(
71
88
  'Suggested patterns for session approval. Tools may provide patterns to allow approving a broader subset of future calls (e.g., ["git push *", "git *"]).'
72
89
  )
@@ -78,17 +95,11 @@ const CommandConfirmationMetadataSchema = import_zod.z.object({
78
95
  }).strict().describe("Command confirmation metadata");
79
96
  const ElicitationMetadataSchema = import_zod.z.object({
80
97
  schema: JsonSchema7Schema.describe("JSON Schema for the form"),
81
- prompt: import_zod.z.string().describe("Prompt to show the user"),
98
+ prompt: import_zod.z.string().describe("High-level prompt/context for the form (clients may show it)"),
82
99
  serverName: import_zod.z.string().describe("MCP server requesting input"),
83
100
  context: import_zod.z.record(import_zod.z.unknown()).optional().describe("Additional context")
84
101
  }).strict().describe("Elicitation metadata");
85
102
  const CustomApprovalMetadataSchema = import_zod.z.record(import_zod.z.unknown()).describe("Custom metadata");
86
- const DirectoryAccessMetadataSchema = import_zod.z.object({
87
- path: import_zod.z.string().describe("Full path being accessed"),
88
- parentDir: import_zod.z.string().describe("Parent directory (what gets approved for session)"),
89
- operation: import_zod.z.enum(["read", "write", "edit"]).describe("Type of file operation"),
90
- toolName: import_zod.z.string().describe("Name of the tool requesting access")
91
- }).strict().describe("Directory access metadata");
92
103
  const BaseApprovalRequestSchema = import_zod.z.object({
93
104
  approvalId: import_zod.z.string().uuid().describe("Unique approval identifier"),
94
105
  type: ApprovalTypeSchema.describe("Type of approval"),
@@ -127,6 +138,9 @@ const ToolApprovalResponseDataSchema = import_zod.z.object({
127
138
  rememberChoice: import_zod.z.boolean().optional().describe("Remember this tool for the session (approves ALL uses of this tool)"),
128
139
  rememberPattern: import_zod.z.string().optional().describe(
129
140
  'Remember an approval pattern (e.g., "git *"). Only applicable when the tool provides pattern-based approval support.'
141
+ ),
142
+ rememberDirectory: import_zod.z.boolean().optional().describe(
143
+ "Remember this directory for the session (allows future access without prompting again)"
130
144
  )
131
145
  }).strict().describe("Tool approval response data");
132
146
  const CommandConfirmationResponseDataSchema = import_zod.z.object({