@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.
- package/dist/agent/DextoAgent.cjs +79 -5
- package/dist/agent/DextoAgent.d.ts +24 -2
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +79 -5
- package/dist/agent/agent-options.d.ts +6 -1
- package/dist/agent/agent-options.d.ts.map +1 -1
- package/dist/agent/schemas.d.ts +18 -18
- package/dist/approval/manager.cjs +87 -27
- package/dist/approval/manager.d.ts +10 -1
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +87 -27
- package/dist/approval/schemas.cjs +22 -8
- package/dist/approval/schemas.d.ts +276 -102
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +22 -8
- package/dist/context/manager.cjs +2 -2
- package/dist/context/manager.d.ts +2 -1
- package/dist/context/manager.d.ts.map +1 -1
- package/dist/context/manager.js +2 -2
- package/dist/context/types.d.ts +3 -2
- package/dist/context/types.d.ts.map +1 -1
- package/dist/events/index.d.ts +26 -13
- package/dist/events/index.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/types.d.ts +1 -22
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/llm/executor/provider-options.cjs +223 -28
- package/dist/llm/executor/provider-options.d.ts +3 -37
- package/dist/llm/executor/provider-options.d.ts.map +1 -1
- package/dist/llm/executor/provider-options.js +227 -27
- package/dist/llm/executor/stream-processor.cjs +57 -34
- package/dist/llm/executor/stream-processor.d.ts +12 -4
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +55 -32
- package/dist/llm/executor/turn-executor.cjs +66 -44
- package/dist/llm/executor/turn-executor.d.ts +3 -3
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +56 -34
- package/dist/llm/formatters/vercel.cjs +15 -3
- package/dist/llm/formatters/vercel.d.ts +1 -0
- package/dist/llm/formatters/vercel.d.ts.map +1 -1
- package/dist/llm/formatters/vercel.js +15 -3
- package/dist/llm/index.cjs +8 -0
- package/dist/llm/index.d.ts +2 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +7 -0
- package/dist/llm/providers/local/schemas.d.ts +2 -2
- package/dist/llm/providers/openrouter-model-registry.cjs +66 -11
- package/dist/llm/providers/openrouter-model-registry.d.ts +26 -0
- package/dist/llm/providers/openrouter-model-registry.d.ts.map +1 -1
- package/dist/llm/providers/openrouter-model-registry.js +65 -11
- package/dist/llm/reasoning/anthropic-betas.cjs +31 -0
- package/dist/llm/reasoning/anthropic-betas.d.ts +3 -0
- package/dist/llm/reasoning/anthropic-betas.d.ts.map +1 -0
- package/dist/llm/reasoning/anthropic-betas.js +7 -0
- package/dist/llm/reasoning/anthropic-thinking.cjs +79 -0
- package/dist/llm/reasoning/anthropic-thinking.d.ts +15 -0
- package/dist/llm/reasoning/anthropic-thinking.d.ts.map +1 -0
- package/dist/llm/reasoning/anthropic-thinking.js +52 -0
- package/dist/llm/reasoning/openai-reasoning-effort.cjs +86 -0
- package/dist/llm/reasoning/openai-reasoning-effort.d.ts +5 -0
- package/dist/llm/reasoning/openai-reasoning-effort.d.ts.map +1 -0
- package/dist/llm/reasoning/openai-reasoning-effort.js +61 -0
- package/dist/llm/reasoning/profile.cjs +113 -0
- package/dist/llm/reasoning/profile.d.ts +13 -0
- package/dist/llm/reasoning/profile.d.ts.map +1 -0
- package/dist/llm/reasoning/profile.js +92 -0
- package/dist/llm/reasoning/profiles/anthropic.cjs +61 -0
- package/dist/llm/reasoning/profiles/anthropic.d.ts +8 -0
- package/dist/llm/reasoning/profiles/anthropic.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/anthropic.js +45 -0
- package/dist/llm/reasoning/profiles/bedrock.cjs +54 -0
- package/dist/llm/reasoning/profiles/bedrock.d.ts +3 -0
- package/dist/llm/reasoning/profiles/bedrock.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/bedrock.js +36 -0
- package/dist/llm/reasoning/profiles/google.cjs +45 -0
- package/dist/llm/reasoning/profiles/google.d.ts +9 -0
- package/dist/llm/reasoning/profiles/google.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/google.js +21 -0
- package/dist/llm/reasoning/profiles/openai-compatible.cjs +39 -0
- package/dist/llm/reasoning/profiles/openai-compatible.d.ts +3 -0
- package/dist/llm/reasoning/profiles/openai-compatible.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/openai-compatible.js +16 -0
- package/dist/llm/reasoning/profiles/openai.cjs +41 -0
- package/dist/llm/reasoning/profiles/openai.d.ts +3 -0
- package/dist/llm/reasoning/profiles/openai.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/openai.js +18 -0
- package/dist/llm/reasoning/profiles/openrouter.cjs +83 -0
- package/dist/llm/reasoning/profiles/openrouter.d.ts +10 -0
- package/dist/llm/reasoning/profiles/openrouter.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/openrouter.js +59 -0
- package/dist/llm/reasoning/profiles/shared.cjs +80 -0
- package/dist/llm/reasoning/profiles/shared.d.ts +25 -0
- package/dist/llm/reasoning/profiles/shared.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/shared.js +53 -0
- package/dist/llm/reasoning/profiles/vertex.cjs +46 -0
- package/dist/llm/reasoning/profiles/vertex.d.ts +3 -0
- package/dist/llm/reasoning/profiles/vertex.d.ts.map +1 -0
- package/dist/llm/reasoning/profiles/vertex.js +23 -0
- package/dist/llm/registry/auto-update.cjs +18 -0
- package/dist/llm/registry/auto-update.d.ts.map +1 -1
- package/dist/llm/registry/auto-update.js +18 -0
- package/dist/llm/registry/index.cjs +126 -26
- package/dist/llm/registry/index.d.ts +48 -4
- package/dist/llm/registry/index.d.ts.map +1 -1
- package/dist/llm/registry/index.js +136 -28
- package/dist/llm/registry/models.generated.cjs +5198 -59
- package/dist/llm/registry/models.generated.d.ts +1893 -76
- package/dist/llm/registry/models.generated.d.ts.map +1 -1
- package/dist/llm/registry/models.generated.js +5196 -58
- package/dist/llm/registry/sync.cjs +72 -1
- package/dist/llm/registry/sync.d.ts +21 -1
- package/dist/llm/registry/sync.d.ts.map +1 -1
- package/dist/llm/registry/sync.js +72 -1
- package/dist/llm/resolver.cjs +13 -1
- package/dist/llm/resolver.d.ts.map +1 -1
- package/dist/llm/resolver.js +13 -1
- package/dist/llm/schemas.cjs +75 -14
- package/dist/llm/schemas.d.ts +84 -27
- package/dist/llm/schemas.d.ts.map +1 -1
- package/dist/llm/schemas.js +75 -14
- package/dist/llm/services/factory.cjs +55 -8
- package/dist/llm/services/factory.d.ts +1 -1
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +58 -8
- package/dist/llm/services/vercel.cjs +2 -2
- package/dist/llm/services/vercel.js +2 -2
- package/dist/llm/types.d.ts +9 -0
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/logger/default-logger-factory.d.ts +12 -12
- package/dist/logger/v2/dexto-logger.cjs +35 -0
- package/dist/logger/v2/dexto-logger.d.ts +19 -0
- package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
- package/dist/logger/v2/dexto-logger.js +35 -0
- package/dist/logger/v2/schemas.d.ts +6 -6
- package/dist/logger/v2/test-utils.cjs +2 -0
- package/dist/logger/v2/test-utils.d.ts.map +1 -1
- package/dist/logger/v2/test-utils.js +2 -0
- package/dist/logger/v2/types.d.ts +14 -1
- package/dist/logger/v2/types.d.ts.map +1 -1
- package/dist/mcp/schemas.d.ts +15 -15
- package/dist/memory/schemas.d.ts +4 -4
- package/dist/prompts/index.cjs +9 -0
- package/dist/prompts/index.d.ts +1 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +10 -0
- package/dist/prompts/prompt-manager.cjs +2 -0
- package/dist/prompts/prompt-manager.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.js +2 -0
- package/dist/prompts/providers/config-prompt-provider.cjs +11 -1
- package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.js +11 -1
- package/dist/prompts/schemas.cjs +2 -2
- package/dist/prompts/schemas.d.ts +7 -7
- package/dist/prompts/schemas.js +2 -2
- package/dist/prompts/types.d.ts +6 -2
- package/dist/prompts/types.d.ts.map +1 -1
- package/dist/systemPrompt/in-built-prompts.cjs +5 -5
- package/dist/systemPrompt/in-built-prompts.d.ts +1 -1
- package/dist/systemPrompt/in-built-prompts.d.ts.map +1 -1
- package/dist/systemPrompt/in-built-prompts.js +5 -5
- package/dist/systemPrompt/schemas.d.ts +5 -5
- package/dist/systemPrompt/types.d.ts +11 -0
- package/dist/systemPrompt/types.d.ts.map +1 -1
- package/dist/tools/display-types.d.ts +10 -0
- package/dist/tools/display-types.d.ts.map +1 -1
- package/dist/tools/index.cjs +3 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/presentation.cjs +49 -0
- package/dist/tools/presentation.d.ts +11 -0
- package/dist/tools/presentation.d.ts.map +1 -0
- package/dist/tools/presentation.js +24 -0
- package/dist/tools/tool-manager.cjs +389 -136
- package/dist/tools/tool-manager.d.ts +36 -24
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +389 -136
- package/dist/tools/types.d.ts +134 -55
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/path.cjs +10 -1
- package/dist/utils/path.d.ts +5 -2
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +10 -1
- package/dist/utils/service-initializer.d.ts +1 -0
- package/dist/utils/service-initializer.d.ts.map +1 -1
- 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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/approval/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/approval/manager.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
135
|
-
const
|
|
136
|
-
|
|
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 "${
|
|
194
|
+
`Directory "${resolvedKey}" already approved as 'session', not downgrading to 'once'`
|
|
139
195
|
);
|
|
140
196
|
return;
|
|
141
197
|
}
|
|
142
|
-
|
|
143
|
-
this.logger.debug(
|
|
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
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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("
|
|
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({
|