wave-agent-sdk 0.0.7 → 0.0.10
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.d.ts +105 -24
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +438 -53
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/managers/aiManager.d.ts +18 -7
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +254 -142
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +11 -9
- package/dist/managers/hookManager.d.ts +6 -6
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +81 -39
- package/dist/managers/liveConfigManager.d.ts +95 -0
- package/dist/managers/liveConfigManager.d.ts.map +1 -0
- package/dist/managers/liveConfigManager.js +442 -0
- package/dist/managers/lspManager.d.ts +43 -0
- package/dist/managers/lspManager.d.ts.map +1 -0
- package/dist/managers/lspManager.js +326 -0
- package/dist/managers/messageManager.d.ts +41 -24
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +184 -73
- package/dist/managers/permissionManager.d.ts +66 -0
- package/dist/managers/permissionManager.d.ts.map +1 -0
- package/dist/managers/permissionManager.js +208 -0
- package/dist/managers/skillManager.d.ts +1 -0
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +2 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +4 -2
- package/dist/managers/subagentManager.d.ts +42 -6
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +213 -62
- package/dist/managers/toolManager.d.ts +38 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +66 -2
- package/dist/services/aiService.d.ts +15 -5
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +446 -77
- package/dist/services/configurationService.d.ts +116 -0
- package/dist/services/configurationService.d.ts.map +1 -0
- package/dist/services/configurationService.js +585 -0
- package/dist/services/fileWatcher.d.ts +69 -0
- package/dist/services/fileWatcher.d.ts.map +1 -0
- package/dist/services/fileWatcher.js +212 -0
- package/dist/services/hook.d.ts +5 -40
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +47 -109
- package/dist/services/jsonlHandler.d.ts +71 -0
- package/dist/services/jsonlHandler.d.ts.map +1 -0
- package/dist/services/jsonlHandler.js +236 -0
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +33 -11
- package/dist/services/session.d.ts +116 -52
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +415 -143
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +77 -17
- package/dist/tools/deleteFileTool.d.ts.map +1 -1
- package/dist/tools/deleteFileTool.js +27 -1
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +33 -8
- package/dist/tools/lspTool.d.ts +6 -0
- package/dist/tools/lspTool.d.ts.map +1 -0
- package/dist/tools/lspTool.js +589 -0
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +30 -10
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +113 -3
- package/dist/tools/skillTool.js +2 -2
- package/dist/tools/todoWriteTool.d.ts.map +1 -1
- package/dist/tools/todoWriteTool.js +23 -0
- package/dist/tools/types.d.ts +11 -8
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +30 -15
- package/dist/types/commands.d.ts +4 -1
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/config.d.ts +4 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +69 -0
- package/dist/types/configuration.d.ts.map +1 -0
- package/dist/types/configuration.js +8 -0
- package/dist/types/core.d.ts +45 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/environment.d.ts +83 -0
- package/dist/types/environment.d.ts.map +1 -0
- package/dist/types/environment.js +21 -0
- package/dist/types/fileSearch.d.ts +5 -0
- package/dist/types/fileSearch.d.ts.map +1 -0
- package/dist/types/fileSearch.js +1 -0
- package/dist/types/hooks.d.ts +18 -3
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +8 -8
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +7 -0
- package/dist/types/lsp.d.ts +90 -0
- package/dist/types/lsp.d.ts.map +1 -0
- package/dist/types/lsp.js +4 -0
- package/dist/types/messaging.d.ts +19 -12
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/permissions.d.ts +35 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +12 -0
- package/dist/types/session.d.ts +15 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +7 -0
- package/dist/types/skills.d.ts +1 -0
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/types/tools.d.ts +35 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +4 -0
- package/dist/utils/abortUtils.d.ts +34 -0
- package/dist/utils/abortUtils.d.ts.map +1 -0
- package/dist/utils/abortUtils.js +92 -0
- package/dist/utils/bashHistory.d.ts +4 -0
- package/dist/utils/bashHistory.d.ts.map +1 -1
- package/dist/utils/bashHistory.js +48 -30
- package/dist/utils/builtinSubagents.d.ts +7 -0
- package/dist/utils/builtinSubagents.d.ts.map +1 -0
- package/dist/utils/builtinSubagents.js +65 -0
- package/dist/utils/cacheControlUtils.d.ts +96 -0
- package/dist/utils/cacheControlUtils.d.ts.map +1 -0
- package/dist/utils/cacheControlUtils.js +324 -0
- package/dist/utils/commandPathResolver.d.ts +52 -0
- package/dist/utils/commandPathResolver.d.ts.map +1 -0
- package/dist/utils/commandPathResolver.js +145 -0
- package/dist/utils/configPaths.d.ts +85 -0
- package/dist/utils/configPaths.d.ts.map +1 -0
- package/dist/utils/configPaths.js +121 -0
- package/dist/utils/constants.d.ts +1 -13
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +2 -14
- package/dist/utils/convertMessagesForAPI.d.ts +2 -1
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
- package/dist/utils/convertMessagesForAPI.js +39 -18
- package/dist/utils/customCommands.d.ts.map +1 -1
- package/dist/utils/customCommands.js +66 -21
- package/dist/utils/fileSearch.d.ts +14 -0
- package/dist/utils/fileSearch.d.ts.map +1 -0
- package/dist/utils/fileSearch.js +88 -0
- package/dist/utils/fileUtils.d.ts +27 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +145 -0
- package/dist/utils/globalLogger.d.ts +88 -0
- package/dist/utils/globalLogger.d.ts.map +1 -0
- package/dist/utils/globalLogger.js +120 -0
- package/dist/utils/largeOutputHandler.d.ts +15 -0
- package/dist/utils/largeOutputHandler.d.ts.map +1 -0
- package/dist/utils/largeOutputHandler.js +40 -0
- package/dist/utils/markdownParser.d.ts.map +1 -1
- package/dist/utils/markdownParser.js +1 -17
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/mcpUtils.js +25 -3
- package/dist/utils/messageOperations.d.ts +20 -18
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +30 -38
- package/dist/utils/pathEncoder.d.ts +108 -0
- package/dist/utils/pathEncoder.d.ts.map +1 -0
- package/dist/utils/pathEncoder.js +279 -0
- package/dist/utils/subagentParser.d.ts +2 -2
- package/dist/utils/subagentParser.d.ts.map +1 -1
- package/dist/utils/subagentParser.js +12 -8
- package/dist/utils/tokenCalculation.d.ts +26 -0
- package/dist/utils/tokenCalculation.d.ts.map +1 -0
- package/dist/utils/tokenCalculation.js +36 -0
- package/dist/utils/tokenEstimator.d.ts +39 -0
- package/dist/utils/tokenEstimator.d.ts.map +1 -0
- package/dist/utils/tokenEstimator.js +55 -0
- package/package.json +6 -6
- package/src/agent.ts +586 -78
- package/src/index.ts +4 -0
- package/src/managers/aiManager.ts +341 -192
- package/src/managers/backgroundBashManager.ts +11 -9
- package/src/managers/hookManager.ts +102 -54
- package/src/managers/liveConfigManager.ts +634 -0
- package/src/managers/lspManager.ts +434 -0
- package/src/managers/messageManager.ts +258 -121
- package/src/managers/permissionManager.ts +276 -0
- package/src/managers/skillManager.ts +3 -1
- package/src/managers/slashCommandManager.ts +5 -3
- package/src/managers/subagentManager.ts +295 -76
- package/src/managers/toolManager.ts +95 -3
- package/src/services/aiService.ts +656 -84
- package/src/services/configurationService.ts +762 -0
- package/src/services/fileWatcher.ts +300 -0
- package/src/services/hook.ts +54 -144
- package/src/services/jsonlHandler.ts +303 -0
- package/src/services/memory.ts +34 -11
- package/src/services/session.ts +522 -173
- package/src/tools/bashTool.ts +94 -20
- package/src/tools/deleteFileTool.ts +38 -1
- package/src/tools/editTool.ts +44 -9
- package/src/tools/lspTool.ts +760 -0
- package/src/tools/multiEditTool.ts +41 -11
- package/src/tools/readTool.ts +127 -3
- package/src/tools/skillTool.ts +2 -2
- package/src/tools/todoWriteTool.ts +33 -1
- package/src/tools/types.ts +15 -9
- package/src/tools/writeTool.ts +43 -16
- package/src/types/commands.ts +6 -1
- package/src/types/config.ts +5 -0
- package/src/types/configuration.ts +73 -0
- package/src/types/core.ts +55 -0
- package/src/types/environment.ts +104 -0
- package/src/types/fileSearch.ts +4 -0
- package/src/types/hooks.ts +32 -16
- package/src/types/index.ts +7 -0
- package/src/types/lsp.ts +96 -0
- package/src/types/messaging.ts +21 -14
- package/src/types/permissions.ts +48 -0
- package/src/types/session.ts +20 -0
- package/src/types/skills.ts +1 -0
- package/src/types/tools.ts +38 -0
- package/src/utils/abortUtils.ts +118 -0
- package/src/utils/bashHistory.ts +55 -31
- package/src/utils/builtinSubagents.ts +71 -0
- package/src/utils/cacheControlUtils.ts +475 -0
- package/src/utils/commandPathResolver.ts +189 -0
- package/src/utils/configPaths.ts +163 -0
- package/src/utils/constants.ts +2 -17
- package/src/utils/convertMessagesForAPI.ts +44 -18
- package/src/utils/customCommands.ts +90 -22
- package/src/utils/fileSearch.ts +107 -0
- package/src/utils/fileUtils.ts +160 -0
- package/src/utils/globalLogger.ts +128 -0
- package/src/utils/largeOutputHandler.ts +55 -0
- package/src/utils/markdownParser.ts +1 -19
- package/src/utils/mcpUtils.ts +34 -3
- package/src/utils/messageOperations.ts +47 -53
- package/src/utils/pathEncoder.ts +394 -0
- package/src/utils/subagentParser.ts +13 -9
- package/src/utils/tokenCalculation.ts +43 -0
- package/src/utils/tokenEstimator.ts +68 -0
- package/dist/utils/configResolver.d.ts +0 -38
- package/dist/utils/configResolver.d.ts.map +0 -1
- package/dist/utils/configResolver.js +0 -106
- package/src/utils/configResolver.ts +0 -142
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Manager for handling tool permission checks
|
|
3
|
+
*
|
|
4
|
+
* This manager provides utilities for checking permissions before tool execution.
|
|
5
|
+
* It implements the permission logic for different modes (default vs bypass) and
|
|
6
|
+
* handles custom callback integration.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
PermissionDecision,
|
|
11
|
+
ToolPermissionContext,
|
|
12
|
+
PermissionCallback,
|
|
13
|
+
PermissionMode,
|
|
14
|
+
} from "../types/permissions.js";
|
|
15
|
+
import { RESTRICTED_TOOLS } from "../types/permissions.js";
|
|
16
|
+
import type { Logger } from "../types/index.js";
|
|
17
|
+
|
|
18
|
+
export interface PermissionManagerOptions {
|
|
19
|
+
/** Logger for debugging permission decisions */
|
|
20
|
+
logger?: Logger;
|
|
21
|
+
/** Configured default permission mode from settings */
|
|
22
|
+
configuredDefaultMode?: PermissionMode;
|
|
23
|
+
/** Allowed rules from settings */
|
|
24
|
+
allowedRules?: string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class PermissionManager {
|
|
28
|
+
private logger?: Logger;
|
|
29
|
+
private configuredDefaultMode?: PermissionMode;
|
|
30
|
+
private allowedRules: string[] = [];
|
|
31
|
+
private onConfiguredDefaultModeChange?: (mode: PermissionMode) => void;
|
|
32
|
+
|
|
33
|
+
constructor(options: PermissionManagerOptions = {}) {
|
|
34
|
+
this.logger = options.logger;
|
|
35
|
+
this.configuredDefaultMode = options.configuredDefaultMode;
|
|
36
|
+
this.allowedRules = options.allowedRules || [];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Set a callback to be notified when the effective permission mode changes due to configuration updates
|
|
41
|
+
*/
|
|
42
|
+
public setOnConfiguredDefaultModeChange(
|
|
43
|
+
callback: (mode: PermissionMode) => void,
|
|
44
|
+
): void {
|
|
45
|
+
this.onConfiguredDefaultModeChange = callback;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Update the configured default mode (e.g., when configuration reloads)
|
|
50
|
+
*/
|
|
51
|
+
updateConfiguredDefaultMode(defaultMode?: PermissionMode): void {
|
|
52
|
+
const oldEffectiveMode = this.getCurrentEffectiveMode();
|
|
53
|
+
|
|
54
|
+
this.logger?.debug("Updating configured default permission mode", {
|
|
55
|
+
previous: this.configuredDefaultMode,
|
|
56
|
+
new: defaultMode,
|
|
57
|
+
});
|
|
58
|
+
this.configuredDefaultMode = defaultMode;
|
|
59
|
+
|
|
60
|
+
const newEffectiveMode = this.getCurrentEffectiveMode();
|
|
61
|
+
if (
|
|
62
|
+
oldEffectiveMode !== newEffectiveMode &&
|
|
63
|
+
this.onConfiguredDefaultModeChange
|
|
64
|
+
) {
|
|
65
|
+
this.logger?.debug(
|
|
66
|
+
"Effective permission mode changed due to configuration update",
|
|
67
|
+
{
|
|
68
|
+
oldMode: oldEffectiveMode,
|
|
69
|
+
newMode: newEffectiveMode,
|
|
70
|
+
},
|
|
71
|
+
);
|
|
72
|
+
this.onConfiguredDefaultModeChange(newEffectiveMode);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Get all currently allowed rules
|
|
78
|
+
*/
|
|
79
|
+
public getAllowedRules(): string[] {
|
|
80
|
+
return [...this.allowedRules];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Update the allowed rules (e.g., when configuration reloads)
|
|
85
|
+
*/
|
|
86
|
+
updateAllowedRules(rules: string[]): void {
|
|
87
|
+
this.logger?.debug("Updating allowed permission rules", {
|
|
88
|
+
count: rules.length,
|
|
89
|
+
});
|
|
90
|
+
this.allowedRules = rules;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Get the current effective permission mode for tool execution context
|
|
95
|
+
*/
|
|
96
|
+
getCurrentEffectiveMode(cliPermissionMode?: PermissionMode): PermissionMode {
|
|
97
|
+
return this.resolveEffectivePermissionMode(cliPermissionMode);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Resolve the effective permission mode based on CLI override and configured default
|
|
102
|
+
*/
|
|
103
|
+
resolveEffectivePermissionMode(
|
|
104
|
+
cliPermissionMode?: PermissionMode,
|
|
105
|
+
): PermissionMode {
|
|
106
|
+
// CLI override takes highest precedence
|
|
107
|
+
if (cliPermissionMode !== undefined) {
|
|
108
|
+
this.logger?.debug("Using CLI permission mode override", {
|
|
109
|
+
cliMode: cliPermissionMode,
|
|
110
|
+
configuredDefault: this.configuredDefaultMode,
|
|
111
|
+
});
|
|
112
|
+
return cliPermissionMode;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Use configured default mode if available
|
|
116
|
+
if (this.configuredDefaultMode !== undefined) {
|
|
117
|
+
this.logger?.debug("Using configured default permission mode", {
|
|
118
|
+
configuredDefault: this.configuredDefaultMode,
|
|
119
|
+
});
|
|
120
|
+
return this.configuredDefaultMode;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Fall back to system default
|
|
124
|
+
this.logger?.debug("Using system default permission mode");
|
|
125
|
+
return "default";
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Check if a tool execution requires permission and handle the authorization flow
|
|
130
|
+
* Called by individual tools after validation/diff, before real operation
|
|
131
|
+
*/
|
|
132
|
+
async checkPermission(
|
|
133
|
+
context: ToolPermissionContext,
|
|
134
|
+
): Promise<PermissionDecision> {
|
|
135
|
+
this.logger?.debug("Checking permission for tool", {
|
|
136
|
+
toolName: context.toolName,
|
|
137
|
+
permissionMode: context.permissionMode,
|
|
138
|
+
hasCallback: !!context.canUseToolCallback,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// 1. If bypassPermissions mode, always allow
|
|
142
|
+
if (context.permissionMode === "bypassPermissions") {
|
|
143
|
+
this.logger?.debug("Permission bypassed for tool", {
|
|
144
|
+
toolName: context.toolName,
|
|
145
|
+
});
|
|
146
|
+
return { behavior: "allow" };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// 1.1 If acceptEdits mode, allow Edit, MultiEdit, Delete, Write
|
|
150
|
+
if (context.permissionMode === "acceptEdits") {
|
|
151
|
+
const autoAcceptedTools = ["Edit", "MultiEdit", "Delete", "Write"];
|
|
152
|
+
if (autoAcceptedTools.includes(context.toolName)) {
|
|
153
|
+
this.logger?.debug(
|
|
154
|
+
"Permission automatically accepted for tool in acceptEdits mode",
|
|
155
|
+
{
|
|
156
|
+
toolName: context.toolName,
|
|
157
|
+
},
|
|
158
|
+
);
|
|
159
|
+
return { behavior: "allow" };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// 1.2 Check if tool call matches any allowed rule
|
|
164
|
+
if (this.isAllowedByRule(context)) {
|
|
165
|
+
this.logger?.debug("Permission allowed by persistent rule", {
|
|
166
|
+
toolName: context.toolName,
|
|
167
|
+
});
|
|
168
|
+
return { behavior: "allow" };
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// 2. If not a restricted tool, always allow
|
|
172
|
+
if (!this.isRestrictedTool(context.toolName)) {
|
|
173
|
+
this.logger?.debug("Tool is not restricted, allowing", {
|
|
174
|
+
toolName: context.toolName,
|
|
175
|
+
});
|
|
176
|
+
return { behavior: "allow" };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// 3. If custom callback provided, call it and return result
|
|
180
|
+
if (context.canUseToolCallback) {
|
|
181
|
+
try {
|
|
182
|
+
this.logger?.debug("Calling custom permission callback for tool", {
|
|
183
|
+
toolName: context.toolName,
|
|
184
|
+
});
|
|
185
|
+
const decision = await context.canUseToolCallback(context);
|
|
186
|
+
this.logger?.debug("Custom callback returned decision", {
|
|
187
|
+
toolName: context.toolName,
|
|
188
|
+
decision,
|
|
189
|
+
});
|
|
190
|
+
return decision;
|
|
191
|
+
} catch (error) {
|
|
192
|
+
const errorMessage =
|
|
193
|
+
error instanceof Error ? error.message : String(error);
|
|
194
|
+
this.logger?.error("Error in permission callback", {
|
|
195
|
+
toolName: context.toolName,
|
|
196
|
+
error: errorMessage,
|
|
197
|
+
});
|
|
198
|
+
return {
|
|
199
|
+
behavior: "deny",
|
|
200
|
+
message: "Error in permission callback",
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// 4. For default mode on restricted tools without callback, integrate with CLI confirmation
|
|
206
|
+
// Note: CLI confirmation integration will be implemented in Phase 2
|
|
207
|
+
this.logger?.warn(
|
|
208
|
+
"No permission callback provided for restricted tool in default mode",
|
|
209
|
+
{
|
|
210
|
+
toolName: context.toolName,
|
|
211
|
+
},
|
|
212
|
+
);
|
|
213
|
+
return {
|
|
214
|
+
behavior: "deny",
|
|
215
|
+
message: `Tool '${context.toolName}' requires permission approval. No permission callback configured.`,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Determine if a tool requires permission checks based on its name
|
|
221
|
+
*/
|
|
222
|
+
isRestrictedTool(toolName: string): boolean {
|
|
223
|
+
const isRestricted = (RESTRICTED_TOOLS as readonly string[]).includes(
|
|
224
|
+
toolName,
|
|
225
|
+
);
|
|
226
|
+
this.logger?.debug("Checking if tool is restricted", {
|
|
227
|
+
toolName,
|
|
228
|
+
isRestricted,
|
|
229
|
+
});
|
|
230
|
+
return isRestricted;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Helper method to create a permission context for CLI integration
|
|
235
|
+
*/
|
|
236
|
+
createContext(
|
|
237
|
+
toolName: string,
|
|
238
|
+
permissionMode: PermissionMode,
|
|
239
|
+
callback?: PermissionCallback,
|
|
240
|
+
toolInput?: Record<string, unknown>,
|
|
241
|
+
): ToolPermissionContext {
|
|
242
|
+
const context: ToolPermissionContext = {
|
|
243
|
+
toolName,
|
|
244
|
+
permissionMode,
|
|
245
|
+
canUseToolCallback: callback,
|
|
246
|
+
toolInput,
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
this.logger?.debug("Created permission context", {
|
|
250
|
+
toolName,
|
|
251
|
+
permissionMode,
|
|
252
|
+
hasCallback: !!callback,
|
|
253
|
+
hasToolInput: !!toolInput,
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
return context;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Check if a tool call is allowed by persistent rules
|
|
261
|
+
*/
|
|
262
|
+
private isAllowedByRule(context: ToolPermissionContext): boolean {
|
|
263
|
+
if (context.toolName === "Bash" && context.toolInput?.command) {
|
|
264
|
+
const action = `Bash(${context.toolInput.command})`;
|
|
265
|
+
return this.allowedRules.some((rule) => {
|
|
266
|
+
if (rule.endsWith(":*)")) {
|
|
267
|
+
const prefix = rule.slice(0, -3);
|
|
268
|
+
return action.startsWith(prefix);
|
|
269
|
+
}
|
|
270
|
+
return action === rule;
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// Add other tools if needed in the future
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -20,6 +20,7 @@ export class SkillManager {
|
|
|
20
20
|
private personalSkillsPath: string;
|
|
21
21
|
private scanTimeout: number;
|
|
22
22
|
private logger?: Logger;
|
|
23
|
+
private workdir: string;
|
|
23
24
|
|
|
24
25
|
private skillMetadata = new Map<string, SkillMetadata>();
|
|
25
26
|
private skillContent = new Map<string, Skill>();
|
|
@@ -30,6 +31,7 @@ export class SkillManager {
|
|
|
30
31
|
options.personalSkillsPath || join(homedir(), ".wave", "skills");
|
|
31
32
|
this.scanTimeout = options.scanTimeout || 5000;
|
|
32
33
|
this.logger = options.logger;
|
|
34
|
+
this.workdir = options.workdir || process.cwd();
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
/**
|
|
@@ -123,7 +125,7 @@ export class SkillManager {
|
|
|
123
125
|
);
|
|
124
126
|
|
|
125
127
|
const projectCollection = await this.discoverSkillCollection(
|
|
126
|
-
|
|
128
|
+
this.workdir,
|
|
127
129
|
"project",
|
|
128
130
|
);
|
|
129
131
|
|
|
@@ -52,9 +52,12 @@ export class SlashCommandManager {
|
|
|
52
52
|
this.registerCommand({
|
|
53
53
|
id: "clear",
|
|
54
54
|
name: "clear",
|
|
55
|
-
description: "Clear the chat session",
|
|
55
|
+
description: "Clear the chat session and terminal",
|
|
56
56
|
handler: () => {
|
|
57
|
+
// Clear chat messages
|
|
57
58
|
this.messageManager.clearMessages();
|
|
59
|
+
// Clear terminal screen
|
|
60
|
+
process.stdout.write("\x1Bc");
|
|
58
61
|
},
|
|
59
62
|
});
|
|
60
63
|
}
|
|
@@ -215,7 +218,7 @@ export class SlashCommandManager {
|
|
|
215
218
|
private async executeCustomCommandInMainAgent(
|
|
216
219
|
commandName: string,
|
|
217
220
|
content: string,
|
|
218
|
-
config?: { model?: string
|
|
221
|
+
config?: { model?: string },
|
|
219
222
|
args?: string,
|
|
220
223
|
): Promise<void> {
|
|
221
224
|
try {
|
|
@@ -269,7 +272,6 @@ export class SlashCommandManager {
|
|
|
269
272
|
// Execute the AI conversation with custom configuration
|
|
270
273
|
await this.aiManager.sendAIMessage({
|
|
271
274
|
model: config?.model,
|
|
272
|
-
allowedTools: config?.allowedTools,
|
|
273
275
|
});
|
|
274
276
|
} catch (error) {
|
|
275
277
|
this.logger?.error(
|